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);
|
||||
setRecursiveFilteringEnabled(true);
|
||||
setFilterKeyColumn(FDS_MODEL_TITLE_INDEX);
|
||||
setFilterRole(LOWER_TITLE_ROLE);
|
||||
setFilterRole(Qt::ItemDataRole::EditRole);
|
||||
setDynamicSortFilter(true);
|
||||
setSourceModel(m_sourceModel);
|
||||
|
||||
|
@ -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,
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
};
|
||||
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user