better feed list filtering
This commit is contained in:
parent
ac8629c751
commit
9ef2ae6341
@ -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);
|
||||||
|
|
||||||
|
@ -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,
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user