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);
setRecursiveFilteringEnabled(true);
setFilterKeyColumn(FDS_MODEL_TITLE_INDEX);
setFilterRole(LOWER_TITLE_ROLE);
setFilterRole(Qt::ItemDataRole::EditRole);
setDynamicSortFilter(true);
setSourceModel(m_sourceModel);

View File

@ -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,

View File

@ -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();
}
}

View File

@ -6,6 +6,7 @@
#include "gui/reusable/basetreeview.h"
#include "core/feedsmodel.h"
#include "gui/toolbars/feedstoolbar.h"
#include <QStyledItemDelegate>
@ -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);

View File

@ -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;
}

View File

@ -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<QAction*> 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;
};

View File

@ -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);