better feed list filtering

This commit is contained in:
Martin Rotter 2023-02-10 14:18:59 +01:00
parent ac8629c751
commit 9ef2ae6341
7 changed files with 55 additions and 18 deletions

View File

@ -24,7 +24,7 @@ FeedsProxyModel::FeedsProxyModel(FeedsModel* source_model, QObject* parent)
setSortCaseSensitivity(Qt::CaseSensitivity::CaseInsensitive); setSortCaseSensitivity(Qt::CaseSensitivity::CaseInsensitive);
setRecursiveFilteringEnabled(true); setRecursiveFilteringEnabled(true);
setFilterKeyColumn(FDS_MODEL_TITLE_INDEX); setFilterKeyColumn(FDS_MODEL_TITLE_INDEX);
setFilterRole(LOWER_TITLE_ROLE); setFilterRole(Qt::ItemDataRole::EditRole);
setDynamicSortFilter(true); setDynamicSortFilter(true);
setSourceModel(m_sourceModel); setSourceModel(m_sourceModel);

View File

@ -231,7 +231,7 @@ void FeedMessageViewer::displayMessage(const Message& message, RootItem* root) {
void FeedMessageViewer::createConnections() { void FeedMessageViewer::createConnections() {
// Filtering & searching. // Filtering & searching.
connect(m_toolBarMessages, &MessagesToolBar::searchCriteriaChanged, m_messagesView, &MessagesView::searchMessages); 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, connect(m_toolBarMessages,
&MessagesToolBar::messageHighlighterChanged, &MessagesToolBar::messageHighlighterChanged,
m_messagesView, m_messagesView,

View File

@ -530,16 +530,41 @@ void FeedsView::focusInEvent(QFocusEvent* event) {
} }
} }
void FeedsView::filterItems(const QString& pattern) { void FeedsView::filterItems(SearchLineEdit::SearchMode mode,
if (!pattern.isEmpty()) { Qt::CaseSensitivity sensitivity,
int custom_criteria,
const QString& phrase) {
if (!phrase.isEmpty()) {
m_dontSaveExpandState = true; m_dontSaveExpandState = true;
expandAll(); expandAll();
m_dontSaveExpandState = false; 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(); loadAllExpandStates();
} }
} }

View File

@ -6,6 +6,7 @@
#include "gui/reusable/basetreeview.h" #include "gui/reusable/basetreeview.h"
#include "core/feedsmodel.h" #include "core/feedsmodel.h"
#include "gui/toolbars/feedstoolbar.h"
#include <QStyledItemDelegate> #include <QStyledItemDelegate>
@ -80,7 +81,10 @@ class RSSGUARD_DLLSPEC FeedsView : public BaseTreeView {
// Switches visibility of the widget. // Switches visibility of the widget.
void switchVisibility(); 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 toggleFeedSortingMode(bool sort_alphabetically);
void invalidateReadFeedsFilter(bool set_new_value = false, bool show_unread_only = false); void invalidateReadFeedsFilter(bool set_new_value = false, bool show_unread_only = false);

View File

@ -2,7 +2,6 @@
#include "gui/toolbars/feedstoolbar.h" #include "gui/toolbars/feedstoolbar.h"
#include "gui/reusable/baselineedit.h"
#include "miscellaneous/application.h" #include "miscellaneous/application.h"
#include "miscellaneous/iconfactory.h" #include "miscellaneous/iconfactory.h"
#include "miscellaneous/settings.h" #include "miscellaneous/settings.h"
@ -115,10 +114,13 @@ QStringList FeedsToolBar::savedActions() const {
} }
void FeedsToolBar::initializeSearchBox() { 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->setSizePolicy(QSizePolicy::Policy::Expanding,
m_txtSearchMessages->sizePolicy().verticalPolicy()); m_txtSearchMessages->sizePolicy().verticalPolicy());
m_txtSearchMessages->setPlaceholderText(tr("Search feeds (regex only)")); m_txtSearchMessages->setPlaceholderText(tr("Search feeds"));
// Setup wrapping action for search box. // Setup wrapping action for search box.
m_actionSearchMessages = new QWidgetAction(this); m_actionSearchMessages = new QWidgetAction(this);
@ -128,9 +130,9 @@ void FeedsToolBar::initializeSearchBox() {
m_actionSearchMessages->setProperty("type", SEARCH_BOX_ACTION_NAME); m_actionSearchMessages->setProperty("type", SEARCH_BOX_ACTION_NAME);
m_actionSearchMessages->setProperty("name", tr("Feeds search box")); 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; return m_txtSearchMessages;
} }

View File

@ -5,13 +5,16 @@
#include "gui/toolbars/basetoolbar.h" #include "gui/toolbars/basetoolbar.h"
class BaseLineEdit; #include "gui/reusable/searchlineedit.h"
class QWidgetAction; class QWidgetAction;
class FeedsToolBar : public BaseToolBar { class FeedsToolBar : public BaseToolBar {
Q_OBJECT Q_OBJECT
public: public:
enum class SearchFields { SearchTitleOnly = 1, SearchAll = 2 };
explicit FeedsToolBar(const QString& title, QWidget* parent = nullptr); explicit FeedsToolBar(const QString& title, QWidget* parent = nullptr);
virtual QList<QAction*> availableActions() const; virtual QList<QAction*> availableActions() const;
@ -22,16 +25,19 @@ class FeedsToolBar : public BaseToolBar {
virtual QStringList defaultActions() const; virtual QStringList defaultActions() const;
virtual QStringList savedActions() const; virtual QStringList savedActions() const;
BaseLineEdit *searchBox() const; SearchLineEdit* searchBox() const;
signals: signals:
void feedsFilterPatternChanged(const QString& pattern); void searchCriteriaChanged(SearchLineEdit::SearchMode mode,
Qt::CaseSensitivity sensitivity,
int custom_criteria,
const QString& phrase);
private: private:
void initializeSearchBox(); void initializeSearchBox();
private: private:
BaseLineEdit* m_txtSearchMessages; SearchLineEdit* m_txtSearchMessages;
QWidgetAction* m_actionSearchMessages; QWidgetAction* m_actionSearchMessages;
}; };

View File

@ -156,7 +156,7 @@ void MessagesToolBar::initializeSearchBox() {
this); this);
m_txtSearchMessages->setSizePolicy(QSizePolicy::Policy::Expanding, m_txtSearchMessages->setSizePolicy(QSizePolicy::Policy::Expanding,
m_txtSearchMessages->sizePolicy().verticalPolicy()); m_txtSearchMessages->sizePolicy().verticalPolicy());
m_txtSearchMessages->setPlaceholderText(tr("Search articles (regex only)")); m_txtSearchMessages->setPlaceholderText(tr("Search articles"));
// Setup wrapping action for search box. // Setup wrapping action for search box.
m_actionSearchMessages = new QWidgetAction(this); m_actionSearchMessages = new QWidgetAction(this);