diff --git a/src/librssguard/core/messagesmodel.cpp b/src/librssguard/core/messagesmodel.cpp index 15f24f30d..b31734e2f 100644 --- a/src/librssguard/core/messagesmodel.cpp +++ b/src/librssguard/core/messagesmodel.cpp @@ -172,8 +172,8 @@ bool MessagesModel::setMessageImportantById(int id, RootItem::Importance importa return false; } -void MessagesModel::highlightMessages(MessagesModel::MessageHighlighter highlight) { - m_messageHighlighter = highlight; +void MessagesModel::highlightMessages(MessagesModel::MessageHighlighter highlighter) { + m_messageHighlighter = highlighter; emit layoutAboutToBeChanged(); emit layoutChanged(); } diff --git a/src/librssguard/core/messagesmodel.h b/src/librssguard/core/messagesmodel.h index 05a9a7c7c..8524d75a9 100644 --- a/src/librssguard/core/messagesmodel.h +++ b/src/librssguard/core/messagesmodel.h @@ -21,7 +21,7 @@ class MessagesModel : public QSqlQueryModel, public MessagesModelSqlLayer { public: - // Enum which describes basic filtering schemes + // Enum which describes basic highlighting schemes // for messages. enum class MessageHighlighter { NoHighlighting = 100, @@ -70,7 +70,7 @@ class MessagesModel : public QSqlQueryModel, public MessagesModelSqlLayer { bool setBatchMessagesRestored(const QModelIndexList& messages); // Highlights messages. - void highlightMessages(MessageHighlighter highlight); + void highlightMessages(MessageHighlighter highlighter); // Loads messages of given feeds. void loadMessages(RootItem* item); diff --git a/src/librssguard/core/messagesproxymodel.cpp b/src/librssguard/core/messagesproxymodel.cpp index a540dcd79..6188c59af 100644 --- a/src/librssguard/core/messagesproxymodel.cpp +++ b/src/librssguard/core/messagesproxymodel.cpp @@ -11,7 +11,7 @@ #include MessagesProxyModel::MessagesProxyModel(MessagesModel* source_model, QObject* parent) - : QSortFilterProxyModel(parent), m_sourceModel(source_model), m_showUnreadOnly(false) { + : QSortFilterProxyModel(parent), m_sourceModel(source_model), m_filter(MessageListFilter::NoFiltering) { setObjectName(QSL("MessagesProxyModel")); setSortRole(Qt::ItemDataRole::EditRole); @@ -100,6 +100,81 @@ bool MessagesProxyModel::lessThan(const QModelIndex& left, const QModelIndex& ri return false; } +bool MessagesProxyModel::filterAcceptsMessage(Message currentMessage) const { + switch (m_filter) { + case MessageListFilter::NoFiltering: + return true; + + case MessageListFilter::ShowUnread: + return !currentMessage.m_isRead; + + case MessageListFilter::ShowImportant: + return currentMessage.m_isImportant; + + case MessageListFilter::ShowToday: + { + const QDateTime currentDateTime = QDateTime::currentDateTime(); + const QDate currentDate = currentDateTime.date(); + + return + currentDate.startOfDay() <= currentMessage.m_created && + currentMessage.m_created <= currentDate.endOfDay(); + } + + case MessageListFilter::ShowYesterday: + { + const QDateTime currentDateTime = QDateTime::currentDateTime(); + const QDate currentDate = currentDateTime.date(); + + return + currentDate.addDays(-1).startOfDay() <= currentMessage.m_created && + currentMessage.m_created <= currentDate.addDays(-1).endOfDay(); + } + + case MessageListFilter::ShowLast24Hours: + { + const QDateTime currentDateTime = QDateTime::currentDateTime(); + const QDate currentDate = currentDateTime.date(); + + return + currentDateTime.addSecs(-24 * 60 * 60) <= currentMessage.m_created && + currentMessage.m_created <= currentDateTime; + } + + case MessageListFilter::ShowLast48Hours: + { + const QDateTime currentDateTime = QDateTime::currentDateTime(); + const QDate currentDate = currentDateTime.date(); + + return + currentDateTime.addSecs(-48 * 60 * 60) <= currentMessage.m_created && + currentMessage.m_created <= currentDateTime; + } + + case MessageListFilter::ShowThisWeek: + { + const QDateTime currentDateTime = QDateTime::currentDateTime(); + const QDate currentDate = currentDateTime.date(); + + return + currentDate.year() == currentMessage.m_created.date().year() && + currentDate.weekNumber() == currentMessage.m_created.date().weekNumber(); + } + + case MessageListFilter::ShowLastWeek: + { + const QDateTime currentDateTime = QDateTime::currentDateTime(); + const QDate currentDate = currentDateTime.date(); + + return + currentDate.addDays(-7).year() == currentMessage.m_created.date().year() && + currentDate.addDays(-7).weekNumber() == currentMessage.m_created.date().weekNumber(); + } + } + + return false; +} + bool MessagesProxyModel::filterAcceptsRow(int source_row, const QModelIndex& source_parent) const { // We want to show only regexped messages when "all" should be visible // and we want to show only regexped AND unread messages when unread should be visible. @@ -110,16 +185,11 @@ bool MessagesProxyModel::filterAcceptsRow(int source_row, const QModelIndex& sou return QSortFilterProxyModel::filterAcceptsRow(source_row, source_parent) && (m_sourceModel->cache()->containsData(source_row) || - (!m_showUnreadOnly || !m_sourceModel->messageAt(source_row).m_isRead)); + filterAcceptsMessage(m_sourceModel->messageAt(source_row))); } -bool MessagesProxyModel::showUnreadOnly() const { - return m_showUnreadOnly; -} - -void MessagesProxyModel::setShowUnreadOnly(bool show_unread_only) { - m_showUnreadOnly = show_unread_only; - qApp->settings()->setValue(GROUP(Messages), Messages::ShowOnlyUnreadMessages, show_unread_only); +void MessagesProxyModel::setFilter(MessageListFilter filter) { + m_filter = filter; } QModelIndexList MessagesProxyModel::mapListFromSource(const QModelIndexList& indexes, bool deep) const { diff --git a/src/librssguard/core/messagesproxymodel.h b/src/librssguard/core/messagesproxymodel.h index 4920285c4..443c81c5e 100644 --- a/src/librssguard/core/messagesproxymodel.h +++ b/src/librssguard/core/messagesproxymodel.h @@ -6,11 +6,27 @@ #include class MessagesModel; +class Message; class MessagesProxyModel : public QSortFilterProxyModel { Q_OBJECT public: + + // Enum which describes basic filtering schemes + // for messages. + enum class MessageListFilter { + NoFiltering = 100, + ShowUnread = 101, + ShowImportant = 102, + ShowToday = 103, + ShowYesterday = 104, + ShowLast24Hours = 105, + ShowLast48Hours = 106, + ShowThisWeek = 107, + ShowLastWeek = 108 + }; + explicit MessagesProxyModel(MessagesModel* source_model, QObject* parent = nullptr); virtual ~MessagesProxyModel(); @@ -27,19 +43,21 @@ class MessagesProxyModel : public QSortFilterProxyModel { // Performs sort of items. void sort(int column, Qt::SortOrder order = Qt::AscendingOrder); - bool showUnreadOnly() const; - void setShowUnreadOnly(bool show_unread_only); + void setFilter(MessageListFilter filter); private: QModelIndex getNextImportantItemIndex(int default_row, int max_row) const; QModelIndex getNextUnreadItemIndex(int default_row, int max_row) const; bool lessThan(const QModelIndex& left, const QModelIndex& right) const; + bool filterAcceptsMessage(Message currentMessage) const; bool filterAcceptsRow(int source_row, const QModelIndex& source_parent) const; // Source model pointer. MessagesModel* m_sourceModel; - bool m_showUnreadOnly; + MessageListFilter m_filter; }; +Q_DECLARE_METATYPE(MessagesProxyModel::MessageListFilter) + #endif // MESSAGESPROXYMODEL_H diff --git a/src/librssguard/definitions/definitions.h b/src/librssguard/definitions/definitions.h index 61505e7e1..0593142cc 100644 --- a/src/librssguard/definitions/definitions.h +++ b/src/librssguard/definitions/definitions.h @@ -80,6 +80,7 @@ #define FLAG_ICON_SUBFOLDER "flags" #define SEARCH_BOX_ACTION_NAME "search" #define HIGHLIGHTER_ACTION_NAME "highlighter" +#define FILTER_ACTION_NAME "filter" #define SPACER_ACTION_NAME "spacer" #define SEPARATOR_ACTION_NAME "separator" #define FILTER_WIDTH 125 diff --git a/src/librssguard/gui/dialogs/formmain.cpp b/src/librssguard/gui/dialogs/formmain.cpp index 00a1285ec..f7994ec3a 100644 --- a/src/librssguard/gui/dialogs/formmain.cpp +++ b/src/librssguard/gui/dialogs/formmain.cpp @@ -197,7 +197,6 @@ QList FormMain::allActions() const { actions << m_ui->m_actionSortFeedsAlphabetically; actions << m_ui->m_actionShowTreeBranches; actions << m_ui->m_actionAutoExpandItemsWhenSelected; - actions << m_ui->m_actionShowOnlyUnreadMessages; actions << m_ui->m_actionMarkSelectedMessagesAsRead; actions << m_ui->m_actionMarkSelectedMessagesAsUnread; actions << m_ui->m_actionSwitchImportanceOfSelectedMessages; @@ -599,7 +598,6 @@ void FormMain::setupIcons() { m_ui->m_actionSelectNextUnreadMessage->setIcon(icon_theme_factory->fromTheme(QSL("mail-mark-unread"))); m_ui->m_actionSortFeedsAlphabetically->setIcon(icon_theme_factory->fromTheme(QSL("format-text-bold"))); m_ui->m_actionShowOnlyUnreadItems->setIcon(icon_theme_factory->fromTheme(QSL("mail-mark-unread"))); - m_ui->m_actionShowOnlyUnreadMessages->setIcon(icon_theme_factory->fromTheme(QSL("mail-mark-unread"))); m_ui->m_actionExpandCollapseItem->setIcon(icon_theme_factory->fromTheme(QSL("format-indent-more"))); m_ui->m_actionExpandCollapseItemRecursively->setIcon(icon_theme_factory->fromTheme(QSL("format-indent-more"))); m_ui->m_actionRestoreSelectedMessages->setIcon(icon_theme_factory->fromTheme(QSL("view-refresh"))); @@ -683,8 +681,6 @@ void FormMain::loadSize() { SETTING(Feeds::ShowTreeBranches)).toBool()); m_ui->m_actionAutoExpandItemsWhenSelected->setChecked(settings->value(GROUP(Feeds), SETTING(Feeds::AutoExpandOnSelection)).toBool()); - m_ui->m_actionShowOnlyUnreadMessages->setChecked(settings->value(GROUP(Messages), - SETTING(Messages::ShowOnlyUnreadMessages)).toBool()); m_ui->m_actionAlternateColorsInLists->setChecked(settings->value(GROUP(GUI), SETTING(GUI::AlternateRowColorsInLists)).toBool()); } @@ -876,8 +872,6 @@ void FormMain::createConnections() { tabWidget()->feedMessageViewer(), &FeedMessageViewer::toggleItemsAutoExpandingOnSelection); connect(m_ui->m_actionAlternateColorsInLists, &QAction::toggled, tabWidget()->feedMessageViewer(), &FeedMessageViewer::alternateRowColorsInLists); - connect(m_ui->m_actionShowOnlyUnreadMessages, &QAction::toggled, - tabWidget()->feedMessageViewer(), &FeedMessageViewer::toggleShowOnlyUnreadMessages); connect(m_ui->m_actionRestoreSelectedMessages, &QAction::triggered, tabWidget()->feedMessageViewer()->messagesView(), &MessagesView::restoreSelectedMessages); connect(m_ui->m_actionRestoreAllRecycleBins, &QAction::triggered, diff --git a/src/librssguard/gui/dialogs/formmain.ui b/src/librssguard/gui/dialogs/formmain.ui index 1165fe081..1e20196cf 100644 --- a/src/librssguard/gui/dialogs/formmain.ui +++ b/src/librssguard/gui/dialogs/formmain.ui @@ -155,7 +155,6 @@ - @@ -792,14 +791,6 @@ &Copy URL of selected item - - - true - - - Show &unread articles only - - Article &filters diff --git a/src/librssguard/gui/feedmessageviewer.cpp b/src/librssguard/gui/feedmessageviewer.cpp index bca88e781..944ec2e54 100644 --- a/src/librssguard/gui/feedmessageviewer.cpp +++ b/src/librssguard/gui/feedmessageviewer.cpp @@ -183,15 +183,8 @@ void FeedMessageViewer::switchFeedComponentVisibility() { } } -void FeedMessageViewer::toggleShowOnlyUnreadMessages() { - const QAction* origin = qobject_cast(sender()); - - if (origin == nullptr) { - m_messagesView->switchShowUnreadOnly(true, false); - } - else { - m_messagesView->switchShowUnreadOnly(true, origin->isChecked()); - } +void FeedMessageViewer::changeMessageFilter(MessagesProxyModel::MessageListFilter filter) { + m_messagesView->changeFilter(filter); } void FeedMessageViewer::toggleShowOnlyUnreadFeeds() { @@ -244,7 +237,8 @@ void FeedMessageViewer::createConnections() { // Filtering & searching. connect(m_toolBarMessages, &MessagesToolBar::messageSearchPatternChanged, m_messagesView, &MessagesView::searchMessages); connect(m_toolBarFeeds, &FeedsToolBar::feedsFilterPatternChanged, m_feedsView, &FeedsView::filterItems); - connect(m_toolBarMessages, &MessagesToolBar::messageFilterChanged, m_messagesView, &MessagesView::filterMessages); + connect(m_toolBarMessages, &MessagesToolBar::messageHighlighterChanged, m_messagesView, &MessagesView::highlightMessages); + connect(m_toolBarMessages, &MessagesToolBar::messageFilterChanged, this, &FeedMessageViewer::changeMessageFilter); connect(m_feedSplitter, &QSplitter::splitterMoved, this, &FeedMessageViewer::onFeedSplitterResized); connect(m_messageSplitter, &QSplitter::splitterMoved, this, &FeedMessageViewer::onMessageSplitterResized); diff --git a/src/librssguard/gui/feedmessageviewer.h b/src/librssguard/gui/feedmessageviewer.h index d81698c60..dde6bb8fc 100644 --- a/src/librssguard/gui/feedmessageviewer.h +++ b/src/librssguard/gui/feedmessageviewer.h @@ -6,6 +6,7 @@ #include "gui/tabcontent.h" #include "core/messagesmodel.h" +#include "core/messagesproxymodel.h" class WebBrowser; class MessagePreviewer; @@ -57,7 +58,7 @@ class RSSGUARD_DLLSPEC FeedMessageViewer : public TabContent { // toolbar. void switchFeedComponentVisibility(); - void toggleShowOnlyUnreadMessages(); + void changeMessageFilter(MessagesProxyModel::MessageListFilter filter); void toggleShowOnlyUnreadFeeds(); void toggleShowFeedTreeBranches(); void toggleItemsAutoExpandingOnSelection(); diff --git a/src/librssguard/gui/messagesview.cpp b/src/librssguard/gui/messagesview.cpp index 2c236ccbb..d2de1de01 100644 --- a/src/librssguard/gui/messagesview.cpp +++ b/src/librssguard/gui/messagesview.cpp @@ -499,11 +499,8 @@ void MessagesView::loadItem(RootItem* item) { emit currentMessageRemoved(); } -void MessagesView::switchShowUnreadOnly(bool set_new_value, bool show_unread_only) { - if (set_new_value) { - m_proxyModel->setShowUnreadOnly(show_unread_only); - } - +void MessagesView::changeFilter(MessagesProxyModel::MessageListFilter filter) { + m_proxyModel->setFilter(filter); reloadSelections(); } @@ -784,8 +781,8 @@ void MessagesView::searchMessages(const QString& pattern) { } } -void MessagesView::filterMessages(MessagesModel::MessageHighlighter filter) { - m_sourceModel->highlightMessages(filter); +void MessagesView::highlightMessages(MessagesModel::MessageHighlighter highlighter) { + m_sourceModel->highlightMessages(highlighter); } void MessagesView::openSelectedMessagesWithExternalTool() { diff --git a/src/librssguard/gui/messagesview.h b/src/librssguard/gui/messagesview.h index 3a8111947..26dcdbcaa 100644 --- a/src/librssguard/gui/messagesview.h +++ b/src/librssguard/gui/messagesview.h @@ -6,6 +6,7 @@ #include "gui/reusable/basetreeview.h" #include "core/messagesmodel.h" +#include "core/messagesproxymodel.h" #include "services/abstract/rootitem.h" #include @@ -62,9 +63,8 @@ class MessagesView : public BaseTreeView { // Searchs the visible message according to given pattern. void searchMessages(const QString& pattern); - void filterMessages(MessagesModel::MessageHighlighter filter); - - void switchShowUnreadOnly(bool set_new_value = false, bool show_unread_only = false); + void highlightMessages(MessagesModel::MessageHighlighter highlighter); + void changeFilter(MessagesProxyModel::MessageListFilter filter); private slots: void openSelectedMessagesWithExternalTool(); diff --git a/src/librssguard/gui/toolbars/messagestoolbar.cpp b/src/librssguard/gui/toolbars/messagestoolbar.cpp index 14aca0296..fddde5348 100644 --- a/src/librssguard/gui/toolbars/messagestoolbar.cpp +++ b/src/librssguard/gui/toolbars/messagestoolbar.cpp @@ -25,6 +25,7 @@ QList MessagesToolBar::availableActions() const { available_actions.append(m_actionSearchMessages); available_actions.append(m_actionMessageHighlighter); + available_actions.append(m_actionMessageFilter); return available_actions; } @@ -66,9 +67,15 @@ QList MessagesToolBar::convertActions(const QStringList& actions) { // Add search box. spec_actions.append(m_actionSearchMessages); } - else if (action_name == QSL(HIGHLIGHTER_ACTION_NAME)) { - // Add filter button. + else if (action_name.startsWith(QSL(HIGHLIGHTER_ACTION_NAME))) { + // Add highlighter button. spec_actions.append(m_actionMessageHighlighter); + activateAction(action_name, m_actionMessageHighlighter); + } + else if (action_name.startsWith(QSL(FILTER_ACTION_NAME))) { + // Add filter button. + spec_actions.append(m_actionMessageFilter); + activateAction(action_name, m_actionMessageFilter); } else if (action_name == QSL(SPACER_ACTION_NAME)) { // Add new spacer. @@ -99,9 +106,17 @@ void MessagesToolBar::loadSpecificActions(const QList& actions, bool i } void MessagesToolBar::handleMessageHighlighterChange(QAction* action) { - m_btnMessageHighlighter->setIcon(action->icon()); - m_btnMessageHighlighter->setToolTip(action->text()); - emit messageFilterChanged(action->data().value()); + m_btnMessageHighlighter->setDefaultAction(action); + saveToolButtonSelection(HIGHLIGHTER_ACTION_NAME, action); + + emit messageHighlighterChanged(action->data().value()); +} + +void MessagesToolBar::handleMessageFilterChange(QAction* action) { + m_btnMessageFilter->setDefaultAction(action); + saveToolButtonSelection(FILTER_ACTION_NAME, action); + + emit messageFilterChanged(action->data().value()); } void MessagesToolBar::initializeSearchBox() { @@ -125,26 +140,133 @@ void MessagesToolBar::initializeSearchBox() { }); } +void MessagesToolBar::addActionToMenu(QMenu* menu, const QIcon& icon, const QString& title, const QVariant& value, const QString& name) { + QAction* action = menu->addAction(icon, title); + + action->setData(value); + action->setObjectName(name); +} + void MessagesToolBar::initializeHighlighter() { m_menuMessageHighlighter = new QMenu(tr("Menu for highlighting articles"), this); - m_menuMessageHighlighter->addAction(qApp->icons()->fromTheme(QSL("mail-mark-read")), - tr("No extra highlighting"))->setData(QVariant::fromValue(MessagesModel::MessageHighlighter::NoHighlighting)); - m_menuMessageHighlighter->addAction(qApp->icons()->fromTheme(QSL("mail-mark-unread")), - tr("Highlight unread articles"))->setData(QVariant::fromValue(MessagesModel::MessageHighlighter::HighlightUnread)); - m_menuMessageHighlighter->addAction(qApp->icons()->fromTheme(QSL("mail-mark-important")), - tr("Highlight important articles"))->setData(QVariant::fromValue(MessagesModel::MessageHighlighter::HighlightImportant)); + addActionToMenu(m_menuMessageHighlighter, + qApp->icons()->fromTheme(QSL("mail-mark-read")), + tr("No extra highlighting"), + QVariant::fromValue(MessagesModel::MessageHighlighter::NoHighlighting), + "no_highlighting"); + addActionToMenu(m_menuMessageHighlighter, + qApp->icons()->fromTheme(QSL("mail-mark-unread")), + tr("Highlight unread articles"), + QVariant::fromValue(MessagesModel::MessageHighlighter::HighlightUnread), + "highlight_unread"); + addActionToMenu(m_menuMessageHighlighter, + qApp->icons()->fromTheme(QSL("mail-mark-important")), + tr("Highlight important articles"), + QVariant::fromValue(MessagesModel::MessageHighlighter::HighlightImportant), + "highlight_important"); + + m_menuMessageFilter = new QMenu(tr("Menu for filtering articles"), this); + addActionToMenu(m_menuMessageFilter, + qApp->icons()->fromTheme(QSL("mail-mark-read")), + tr("No extra filtering"), + QVariant::fromValue(MessagesProxyModel::MessageListFilter::NoFiltering), + "no_filtering"); + addActionToMenu(m_menuMessageFilter, + qApp->icons()->fromTheme(QSL("mail-mark-unread")), + tr("Show unread articles"), + QVariant::fromValue(MessagesProxyModel::MessageListFilter::ShowUnread), + "show_unread"); + addActionToMenu(m_menuMessageFilter, + qApp->icons()->fromTheme(QSL("mail-mark-important")), + tr("Show important articles"), + QVariant::fromValue(MessagesProxyModel::MessageListFilter::ShowImportant), + "show_important"); + addActionToMenu(m_menuMessageFilter, + qApp->icons()->fromTheme(QSL("mail-mark-read")), + tr("Show today's articles"), + QVariant::fromValue(MessagesProxyModel::MessageListFilter::ShowToday), + "show_today"); + addActionToMenu(m_menuMessageFilter, + qApp->icons()->fromTheme(QSL("mail-mark-read")), + tr("Show yesterday's articles"), + QVariant::fromValue(MessagesProxyModel::MessageListFilter::ShowYesterday), + "show_yesterday"); + addActionToMenu(m_menuMessageFilter, + qApp->icons()->fromTheme(QSL("mail-mark-read")), + tr("Show articles in last 24 hours"), + QVariant::fromValue(MessagesProxyModel::MessageListFilter::ShowLast24Hours), + "show_last24hours"); + addActionToMenu(m_menuMessageFilter, + qApp->icons()->fromTheme(QSL("mail-mark-read")), + tr("Show articles in last 48 hours"), + QVariant::fromValue(MessagesProxyModel::MessageListFilter::ShowLast48Hours), + "show_last48hours"); + addActionToMenu(m_menuMessageFilter, + qApp->icons()->fromTheme(QSL("mail-mark-read")), + tr("Show this week's articles"), + QVariant::fromValue(MessagesProxyModel::MessageListFilter::ShowThisWeek), + "show_this_week"); + addActionToMenu(m_menuMessageFilter, + qApp->icons()->fromTheme(QSL("mail-mark-read")), + tr("Show last week's articles"), + QVariant::fromValue(MessagesProxyModel::MessageListFilter::ShowLastWeek), + "show_last_week"); + m_btnMessageHighlighter = new QToolButton(this); m_btnMessageHighlighter->setToolTip(tr("Display all articles")); m_btnMessageHighlighter->setMenu(m_menuMessageHighlighter); m_btnMessageHighlighter->setPopupMode(QToolButton::ToolButtonPopupMode::MenuButtonPopup); m_btnMessageHighlighter->setIcon(qApp->icons()->fromTheme(QSL("mail-mark-read"))); + m_btnMessageHighlighter->setDefaultAction(m_menuMessageHighlighter->actions().front()); + m_btnMessageFilter = new QToolButton(this); + m_btnMessageFilter->setToolTip(tr("Display all articles")); + m_btnMessageFilter->setMenu(m_menuMessageFilter); + m_btnMessageFilter->setPopupMode(QToolButton::ToolButtonPopupMode::MenuButtonPopup); + m_btnMessageFilter->setIcon(qApp->icons()->fromTheme(QSL("mail-mark-read"))); + m_btnMessageFilter->setDefaultAction(m_menuMessageFilter->actions().front()); m_actionMessageHighlighter = new QWidgetAction(this); m_actionMessageHighlighter->setDefaultWidget(m_btnMessageHighlighter); m_actionMessageHighlighter->setIcon(m_btnMessageHighlighter->icon()); m_actionMessageHighlighter->setProperty("type", HIGHLIGHTER_ACTION_NAME); m_actionMessageHighlighter->setProperty("name", tr("Article highlighter")); + m_actionMessageFilter = new QWidgetAction(this); + m_actionMessageFilter->setDefaultWidget(m_btnMessageFilter); + m_actionMessageFilter->setIcon(m_btnMessageFilter->icon()); + m_actionMessageFilter->setProperty("type", FILTER_ACTION_NAME); + m_actionMessageFilter->setProperty("name", tr("Article filter")); connect(m_menuMessageHighlighter, &QMenu::triggered, this, &MessagesToolBar::handleMessageHighlighterChange); + connect(m_menuMessageFilter, &QMenu::triggered, this, &MessagesToolBar::handleMessageFilterChange); +} + +void MessagesToolBar::saveToolButtonSelection(const QString& button_name, const QAction* action) const { + QStringList action_names = savedActions(); + + for (QString& action_name : action_names) { + if (action_name.startsWith(button_name)) { + action_name = button_name + (action->objectName().isEmpty() ? "" : "[" + action->objectName().toStdString() + "]").c_str(); + } + } + + qApp->settings()->setValue(GROUP(GUI), GUI::MessagesToolbarDefaultButtons, action_names.join(QSL(","))); +} + +void MessagesToolBar::activateAction(const QString& action_name, QWidgetAction* widget_action) { + const int start = action_name.indexOf('['); + const int end = action_name.indexOf(']'); + + if (start != -1 && end != -1 && end == action_name.length() - 1) { + const QString menu_action_name = action_name.chopped(1).right(end - start - 1); + auto toolButton = qobject_cast(widget_action->defaultWidget()); + + for (QAction* action : toolButton->menu()->actions()) { + if (action->objectName() == menu_action_name) { + toolButton->setDefaultAction(action); + toolButton->menu()->triggered(action); + break; + } + } + } } QStringList MessagesToolBar::defaultActions() const { diff --git a/src/librssguard/gui/toolbars/messagestoolbar.h b/src/librssguard/gui/toolbars/messagestoolbar.h index 997437474..22f872ace 100644 --- a/src/librssguard/gui/toolbars/messagestoolbar.h +++ b/src/librssguard/gui/toolbars/messagestoolbar.h @@ -6,6 +6,7 @@ #include "gui/toolbars/basetoolbar.h" #include "core/messagesmodel.h" +#include "core/messagesproxymodel.h" class BaseLineEdit; class QWidgetAction; @@ -29,20 +30,28 @@ class MessagesToolBar : public BaseToolBar { signals: void messageSearchPatternChanged(const QString& pattern); - void messageFilterChanged(MessagesModel::MessageHighlighter filter); + void messageHighlighterChanged(MessagesModel::MessageHighlighter highlighter); + void messageFilterChanged(MessagesProxyModel::MessageListFilter filter); private slots: void onSearchPatternChanged(const QString& search_pattern); void handleMessageHighlighterChange(QAction* action); + void handleMessageFilterChange(QAction* action); private: void initializeSearchBox(); + void addActionToMenu(QMenu* menu, const QIcon& icon, const QString& title, const QVariant& value, const QString& name); void initializeHighlighter(); + void activateAction(const QString& action_name, QWidgetAction* widget_action); + void saveToolButtonSelection(const QString& button_name, const QAction* action) const; private: QWidgetAction* m_actionMessageHighlighter; + QWidgetAction* m_actionMessageFilter; QToolButton* m_btnMessageHighlighter; + QToolButton* m_btnMessageFilter; QMenu* m_menuMessageHighlighter; + QMenu* m_menuMessageFilter; QWidgetAction* m_actionSearchMessages; BaseLineEdit* m_txtSearchMessages; QTimer* m_tmrSearchPattern; diff --git a/src/librssguard/gui/toolbars/toolbareditor.cpp b/src/librssguard/gui/toolbars/toolbareditor.cpp index e3a313085..2bec250c4 100644 --- a/src/librssguard/gui/toolbars/toolbareditor.cpp +++ b/src/librssguard/gui/toolbars/toolbareditor.cpp @@ -6,6 +6,7 @@ #include "gui/toolbars/basetoolbar.h" #include +#include ToolBarEditor::ToolBarEditor(QWidget* parent) : QWidget(parent), m_ui(new Ui::ToolBarEditor), m_toolBar(nullptr) { @@ -86,6 +87,18 @@ void ToolBarEditor::loadEditor(const QList& activated_actions, const Q action_item->setData(Qt::ItemDataRole::UserRole, action->objectName()); action_item->setToolTip(action->toolTip()); } + + if (auto widgetAction = qobject_cast(action); widgetAction) { + if (auto toolButton = qobject_cast(widgetAction->defaultWidget()); toolButton) { + if (const QAction* action = toolButton->defaultAction(); action) { + const QString objectName = action->objectName(); + const QString name = action_item->data(Qt::ItemDataRole::UserRole).toString() + + (objectName.isEmpty() ? "" : "[" + objectName.toStdString() + "]").c_str(); + + action_item->setData(Qt::ItemDataRole::UserRole, name); + } + } + } } for (QAction* action : available_actions) { diff --git a/src/librssguard/miscellaneous/settings.cpp b/src/librssguard/miscellaneous/settings.cpp index 1c22ee068..935535088 100644 --- a/src/librssguard/miscellaneous/settings.cpp +++ b/src/librssguard/miscellaneous/settings.cpp @@ -281,7 +281,7 @@ DVALUE(bool) GUI::HideTabBarIfOnlyOneTabDef = false; DKEY GUI::MessagesToolbarDefaultButtons = "messages_toolbar"; DVALUE(char*) GUI::MessagesToolbarDefaultButtonsDef = - "m_actionMarkSelectedMessagesAsRead,m_actionMarkSelectedMessagesAsUnread,m_actionSwitchImportanceOfSelectedMessages,separator,highlighter,spacer,search"; + "m_actionMarkSelectedMessagesAsRead,m_actionMarkSelectedMessagesAsUnread,m_actionSwitchImportanceOfSelectedMessages,separator,highlighter,filter,spacer,search"; DKEY GUI::DefaultSortColumnFeeds = "default_sort_column_feeds"; DVALUE(int) GUI::DefaultSortColumnFeedsDef = FDS_MODEL_TITLE_INDEX;