From eaf901fd9fae83dd53872e6b760dd89adb103b08 Mon Sep 17 00:00:00 2001 From: Martin Rotter Date: Wed, 21 Jun 2023 12:22:48 +0200 Subject: [PATCH] make highlighting ALSO work actually properly --- src/librssguard/core/messagesmodel.cpp | 51 +++++++------ src/librssguard/core/messagesmodel.h | 2 +- .../gui/toolbars/messagestoolbar.cpp | 72 ++++++++++++++----- 3 files changed, 79 insertions(+), 46 deletions(-) diff --git a/src/librssguard/core/messagesmodel.cpp b/src/librssguard/core/messagesmodel.cpp index 6cac4f017..a93bd7282 100644 --- a/src/librssguard/core/messagesmodel.cpp +++ b/src/librssguard/core/messagesmodel.cpp @@ -7,6 +7,7 @@ #include "database/databasefactory.h" #include "database/databasequeries.h" #include "definitions/definitions.h" +#include "definitions/globals.h" #include "gui/messagesview.h" #include "miscellaneous/application.h" #include "miscellaneous/iconfactory.h" @@ -468,37 +469,33 @@ QVariant MessagesModel::data(const QModelIndex& idx, int role) const { } case Qt::ItemDataRole::ForegroundRole: - case HIGHLIGHTED_FOREGROUND_TITLE_ROLE: - switch (m_messageHighlighter) { - case MessageHighlighter::HighlightImportant: { - QModelIndex idx_important = index(idx.row(), MSG_DB_IMPORTANT_INDEX); - QVariant dta = m_cache->containsData(idx_important.row()) ? m_cache->data(idx_important) - : QSqlQueryModel::data(idx_important); + case HIGHLIGHTED_FOREGROUND_TITLE_ROLE: { + if (Globals::hasFlag(m_messageHighlighter, MessageHighlighter::HighlightImportant)) { + QModelIndex idx_important = index(idx.row(), MSG_DB_IMPORTANT_INDEX); + QVariant dta = m_cache->containsData(idx_important.row()) ? m_cache->data(idx_important) + : QSqlQueryModel::data(idx_important); - return dta.toInt() == 1 - ? qApp->skins()->currentSkin().colorForModel(role == Qt::ItemDataRole::ForegroundRole - ? SkinEnums::PaletteColors::FgInteresting - : SkinEnums::PaletteColors::FgSelectedInteresting) - : QVariant(); + if (dta.toInt() == 1) { + return qApp->skins()->currentSkin().colorForModel(role == Qt::ItemDataRole::ForegroundRole + ? SkinEnums::PaletteColors::FgInteresting + : SkinEnums::PaletteColors::FgSelectedInteresting); } - - case MessageHighlighter::HighlightUnread: { - QModelIndex idx_read = index(idx.row(), MSG_DB_READ_INDEX); - QVariant dta = - m_cache->containsData(idx_read.row()) ? m_cache->data(idx_read) : QSqlQueryModel::data(idx_read); - - return dta.toInt() == 0 - ? qApp->skins()->currentSkin().colorForModel(role == Qt::ItemDataRole::ForegroundRole - ? SkinEnums::PaletteColors::FgInteresting - : SkinEnums::PaletteColors::FgSelectedInteresting) - : QVariant(); - } - - case MessageHighlighter::NoHighlighting: - default: - return QVariant(); } + if (Globals::hasFlag(m_messageHighlighter, MessageHighlighter::HighlightUnread)) { + QModelIndex idx_read = index(idx.row(), MSG_DB_READ_INDEX); + QVariant dta = m_cache->containsData(idx_read.row()) ? m_cache->data(idx_read) : QSqlQueryModel::data(idx_read); + + if (dta.toInt() == 0) { + return qApp->skins()->currentSkin().colorForModel(role == Qt::ItemDataRole::ForegroundRole + ? SkinEnums::PaletteColors::FgInteresting + : SkinEnums::PaletteColors::FgSelectedInteresting); + } + } + + return QVariant(); + } + case Qt::ItemDataRole::SizeHintRole: { if (!m_multilineListItems || m_view == nullptr || m_view->isColumnHidden(idx.column()) || idx.column() != MSG_DB_TITLE_INDEX) { diff --git a/src/librssguard/core/messagesmodel.h b/src/librssguard/core/messagesmodel.h index da60dd372..f29588063 100644 --- a/src/librssguard/core/messagesmodel.h +++ b/src/librssguard/core/messagesmodel.h @@ -22,7 +22,7 @@ class MessagesModel : public QSqlQueryModel, public MessagesModelSqlLayer { public: // Enum which describes basic highlighting schemes // for messages. - enum class MessageHighlighter { NoHighlighting = 100, HighlightUnread = 101, HighlightImportant = 102 }; + enum class MessageHighlighter { NoHighlighting = 1, HighlightUnread = 2, HighlightImportant = 4 }; enum class MessageUnreadIcon { Dot = 1, Envelope = 2, FeedIcon = 3 }; diff --git a/src/librssguard/gui/toolbars/messagestoolbar.cpp b/src/librssguard/gui/toolbars/messagestoolbar.cpp index 2ee35099f..280145ec3 100644 --- a/src/librssguard/gui/toolbars/messagestoolbar.cpp +++ b/src/librssguard/gui/toolbars/messagestoolbar.cpp @@ -105,43 +105,79 @@ void MessagesToolBar::loadSpecificActions(const QList& actions, bool i } } -void MessagesToolBar::handleMessageHighlighterChange(QAction* action) { - m_btnMessageHighlighter->setDefaultAction(action); - saveToolButtonSelection(HIGHLIGHTER_ACTION_NAME, {action}); - - emit messageHighlighterChanged(action->data().value()); -} - inline MessagesProxyModel::MessageListFilter operator|(MessagesProxyModel::MessageListFilter a, MessagesProxyModel::MessageListFilter b) { return static_cast(static_cast(a) | static_cast(b)); } +inline MessagesModel::MessageHighlighter operator|(MessagesModel::MessageHighlighter a, + MessagesModel::MessageHighlighter b) { + return static_cast(static_cast(a) | static_cast(b)); +} + +void MessagesToolBar::handleMessageHighlighterChange(QAction* action) { + MessagesModel::MessageHighlighter task = action->data().value(); + + m_btnMessageHighlighter->setDefaultAction(action); + + std::list checked_tasks_std; + + if (task == MessagesModel::MessageHighlighter::NoHighlighting) { + checked_tasks_std.push_back(m_menuMessageHighlighter->actions().first()); + + // Uncheck everything. + m_menuMessageHighlighter->blockSignals(true); + + for (QAction* tsk : m_menuMessageHighlighter->actions()) { + tsk->setChecked(false); + } + + m_menuMessageHighlighter->blockSignals(false); + } + else { + task = MessagesModel::MessageHighlighter(0); + checked_tasks_std = boolinq::from(m_menuMessageHighlighter->actions()) + .where([](QAction* act) { + return act->isChecked(); + }) + .toStdList(); + + for (QAction* tsk : checked_tasks_std) { + task = task | tsk->data().value(); + } + } + + saveToolButtonSelection(HIGHLIGHTER_ACTION_NAME, FROM_STD_LIST(QList, checked_tasks_std)); + emit messageHighlighterChanged(task); +} + void MessagesToolBar::handleMessageFilterChange(QAction* action) { MessagesProxyModel::MessageListFilter task = action->data().value(); m_btnMessageFilter->setDefaultAction(action); - auto checked_tasks_std = boolinq::from(m_menuMessageFilter->actions()) - .where([](QAction* act) { - return act->isChecked(); - }) - .toStdList(); + std::list checked_tasks_std; if (task == MessagesProxyModel::MessageListFilter::NoFiltering) { + checked_tasks_std.push_back(m_menuMessageFilter->actions().first()); + // Uncheck everything. m_menuMessageFilter->blockSignals(true); - for (QAction* tsk : checked_tasks_std) { + for (QAction* tsk : m_menuMessageFilter->actions()) { tsk->setChecked(false); } m_menuMessageFilter->blockSignals(false); - - checked_tasks_std.clear(); - checked_tasks_std.push_back(m_menuMessageFilter->actions().first()); } else { + task = MessagesProxyModel::MessageListFilter(0); + checked_tasks_std = boolinq::from(m_menuMessageFilter->actions()) + .where([](QAction* act) { + return act->isChecked(); + }) + .toStdList(); + for (QAction* tsk : checked_tasks_std) { task = task | tsk->data().value(); } @@ -263,14 +299,14 @@ void MessagesToolBar::initializeHighlighter() { 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->setPopupMode(QToolButton::ToolButtonPopupMode::InstantPopup); m_btnMessageHighlighter->setIcon(qApp->icons()->fromTheme(QSL("mail-mark-read"))); m_btnMessageHighlighter->setDefaultAction(m_menuMessageHighlighter->actions().constFirst()); 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->setPopupMode(QToolButton::ToolButtonPopupMode::InstantPopup); m_btnMessageFilter->setIcon(qApp->icons()->fromTheme(QSL("mail-mark-read"))); m_btnMessageFilter->setDefaultAction(m_menuMessageFilter->actions().constFirst());