diff --git a/src/librssguard/core/feedsproxymodel.cpp b/src/librssguard/core/feedsproxymodel.cpp index 6499cfe76..57719f123 100644 --- a/src/librssguard/core/feedsproxymodel.cpp +++ b/src/librssguard/core/feedsproxymodel.cpp @@ -24,7 +24,7 @@ FeedsProxyModel::FeedsProxyModel(FeedsModel* source_model, QObject* parent) setSortCaseSensitivity(Qt::CaseSensitivity::CaseInsensitive); setRecursiveFilteringEnabled(true); setFilterKeyColumn(FDS_MODEL_TITLE_INDEX); - setFilterRole(LOWER_TITLE_ROLE); + setFilterRole(Qt::ItemDataRole::EditRole); setDynamicSortFilter(true); setSourceModel(m_sourceModel); diff --git a/src/librssguard/gui/feedmessageviewer.cpp b/src/librssguard/gui/feedmessageviewer.cpp index 434313e44..b7e9c9525 100644 --- a/src/librssguard/gui/feedmessageviewer.cpp +++ b/src/librssguard/gui/feedmessageviewer.cpp @@ -231,7 +231,7 @@ void FeedMessageViewer::displayMessage(const Message& message, RootItem* root) { void FeedMessageViewer::createConnections() { // Filtering & searching. connect(m_toolBarMessages, &MessagesToolBar::searchCriteriaChanged, m_messagesView, &MessagesView::searchMessages); - connect(m_toolBarFeeds, &FeedsToolBar::feedsFilterPatternChanged, m_feedsView, &FeedsView::filterItems); + connect(m_toolBarFeeds, &FeedsToolBar::searchCriteriaChanged, m_feedsView, &FeedsView::filterItems); connect(m_toolBarMessages, &MessagesToolBar::messageHighlighterChanged, m_messagesView, diff --git a/src/librssguard/gui/feedsview.cpp b/src/librssguard/gui/feedsview.cpp index 2653d1765..c93dff8ce 100644 --- a/src/librssguard/gui/feedsview.cpp +++ b/src/librssguard/gui/feedsview.cpp @@ -530,16 +530,41 @@ void FeedsView::focusInEvent(QFocusEvent* event) { } } -void FeedsView::filterItems(const QString& pattern) { - if (!pattern.isEmpty()) { +void FeedsView::filterItems(SearchLineEdit::SearchMode mode, + Qt::CaseSensitivity sensitivity, + int custom_criteria, + const QString& phrase) { + if (!phrase.isEmpty()) { m_dontSaveExpandState = true; expandAll(); m_dontSaveExpandState = false; } - m_proxyModel->setFilterRegularExpression(pattern.toLower()); + qDebugNN << LOGSEC_GUI << "Running search of feeds with pattern" << QUOTE_W_SPACE_DOT(phrase); - if (pattern.isEmpty()) { + switch (mode) { + case SearchLineEdit::SearchMode::Wildcard: + m_proxyModel->setFilterWildcard(phrase); + break; + + case SearchLineEdit::SearchMode::RegularExpression: + m_proxyModel->setFilterRegularExpression(phrase); + break; + + case SearchLineEdit::SearchMode::FixedString: + default: + m_proxyModel->setFilterFixedString(phrase); + break; + } + + m_proxyModel->setFilterCaseSensitivity(sensitivity); + + FeedsToolBar::SearchFields where_search = FeedsToolBar::SearchFields(custom_criteria); + + m_proxyModel->setFilterKeyColumn(where_search == FeedsToolBar::SearchFields::SearchTitleOnly ? FDS_MODEL_TITLE_INDEX + : -1); + + if (phrase.isEmpty()) { loadAllExpandStates(); } } diff --git a/src/librssguard/gui/feedsview.h b/src/librssguard/gui/feedsview.h index 4b827ceec..02ebfd87c 100644 --- a/src/librssguard/gui/feedsview.h +++ b/src/librssguard/gui/feedsview.h @@ -6,6 +6,7 @@ #include "gui/reusable/basetreeview.h" #include "core/feedsmodel.h" +#include "gui/toolbars/feedstoolbar.h" #include @@ -80,7 +81,10 @@ class RSSGUARD_DLLSPEC FeedsView : public BaseTreeView { // Switches visibility of the widget. void switchVisibility(); - void filterItems(const QString& pattern); + void filterItems(SearchLineEdit::SearchMode mode, + Qt::CaseSensitivity sensitivity, + int custom_criteria, + const QString& phrase); void toggleFeedSortingMode(bool sort_alphabetically); void invalidateReadFeedsFilter(bool set_new_value = false, bool show_unread_only = false); diff --git a/src/librssguard/gui/toolbars/feedstoolbar.cpp b/src/librssguard/gui/toolbars/feedstoolbar.cpp index 573bf437b..4593d4aaf 100644 --- a/src/librssguard/gui/toolbars/feedstoolbar.cpp +++ b/src/librssguard/gui/toolbars/feedstoolbar.cpp @@ -2,7 +2,6 @@ #include "gui/toolbars/feedstoolbar.h" -#include "gui/reusable/baselineedit.h" #include "miscellaneous/application.h" #include "miscellaneous/iconfactory.h" #include "miscellaneous/settings.h" @@ -115,10 +114,13 @@ QStringList FeedsToolBar::savedActions() const { } void FeedsToolBar::initializeSearchBox() { - m_txtSearchMessages = new BaseLineEdit(this); + m_txtSearchMessages = + new SearchLineEdit({SearchLineEdit::CustomSearchChoice(tr("Everywhere"), int(SearchFields::SearchAll)), + SearchLineEdit::CustomSearchChoice(tr("Titles only"), int(SearchFields::SearchTitleOnly))}, + this); m_txtSearchMessages->setSizePolicy(QSizePolicy::Policy::Expanding, m_txtSearchMessages->sizePolicy().verticalPolicy()); - m_txtSearchMessages->setPlaceholderText(tr("Search feeds (regex only)")); + m_txtSearchMessages->setPlaceholderText(tr("Search feeds")); // Setup wrapping action for search box. m_actionSearchMessages = new QWidgetAction(this); @@ -128,9 +130,9 @@ void FeedsToolBar::initializeSearchBox() { m_actionSearchMessages->setProperty("type", SEARCH_BOX_ACTION_NAME); m_actionSearchMessages->setProperty("name", tr("Feeds search box")); - connect(m_txtSearchMessages, &BaseLineEdit::textChanged, this, &FeedsToolBar::feedsFilterPatternChanged); + connect(m_txtSearchMessages, &SearchLineEdit::searchCriteriaChanged, this, &FeedsToolBar::searchCriteriaChanged); } -BaseLineEdit* FeedsToolBar::searchBox() const { +SearchLineEdit* FeedsToolBar::searchBox() const { return m_txtSearchMessages; } diff --git a/src/librssguard/gui/toolbars/feedstoolbar.h b/src/librssguard/gui/toolbars/feedstoolbar.h index 274c94442..127e41c9a 100644 --- a/src/librssguard/gui/toolbars/feedstoolbar.h +++ b/src/librssguard/gui/toolbars/feedstoolbar.h @@ -5,13 +5,16 @@ #include "gui/toolbars/basetoolbar.h" -class BaseLineEdit; +#include "gui/reusable/searchlineedit.h" + class QWidgetAction; class FeedsToolBar : public BaseToolBar { - Q_OBJECT + Q_OBJECT public: + enum class SearchFields { SearchTitleOnly = 1, SearchAll = 2 }; + explicit FeedsToolBar(const QString& title, QWidget* parent = nullptr); virtual QList availableActions() const; @@ -22,16 +25,19 @@ class FeedsToolBar : public BaseToolBar { virtual QStringList defaultActions() const; virtual QStringList savedActions() const; - BaseLineEdit *searchBox() const; + SearchLineEdit* searchBox() const; signals: - void feedsFilterPatternChanged(const QString& pattern); + void searchCriteriaChanged(SearchLineEdit::SearchMode mode, + Qt::CaseSensitivity sensitivity, + int custom_criteria, + const QString& phrase); private: void initializeSearchBox(); private: - BaseLineEdit* m_txtSearchMessages; + SearchLineEdit* m_txtSearchMessages; QWidgetAction* m_actionSearchMessages; }; diff --git a/src/librssguard/gui/toolbars/messagestoolbar.cpp b/src/librssguard/gui/toolbars/messagestoolbar.cpp index 274fa73f3..0d4d6a878 100644 --- a/src/librssguard/gui/toolbars/messagestoolbar.cpp +++ b/src/librssguard/gui/toolbars/messagestoolbar.cpp @@ -156,7 +156,7 @@ void MessagesToolBar::initializeSearchBox() { this); m_txtSearchMessages->setSizePolicy(QSizePolicy::Policy::Expanding, m_txtSearchMessages->sizePolicy().verticalPolicy()); - m_txtSearchMessages->setPlaceholderText(tr("Search articles (regex only)")); + m_txtSearchMessages->setPlaceholderText(tr("Search articles")); // Setup wrapping action for search box. m_actionSearchMessages = new QWidgetAction(this);