make highlighting ALSO work actually properly

This commit is contained in:
Martin Rotter 2023-06-21 12:22:48 +02:00
parent d38ea35cd3
commit eaf901fd9f
3 changed files with 79 additions and 46 deletions

View file

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

View file

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

View file

@ -105,43 +105,79 @@ void MessagesToolBar::loadSpecificActions(const QList<QAction*>& actions, bool i
}
}
void MessagesToolBar::handleMessageHighlighterChange(QAction* action) {
m_btnMessageHighlighter->setDefaultAction(action);
saveToolButtonSelection(HIGHLIGHTER_ACTION_NAME, {action});
emit messageHighlighterChanged(action->data().value<MessagesModel::MessageHighlighter>());
}
inline MessagesProxyModel::MessageListFilter operator|(MessagesProxyModel::MessageListFilter a,
MessagesProxyModel::MessageListFilter b) {
return static_cast<MessagesProxyModel::MessageListFilter>(static_cast<int>(a) | static_cast<int>(b));
}
inline MessagesModel::MessageHighlighter operator|(MessagesModel::MessageHighlighter a,
MessagesModel::MessageHighlighter b) {
return static_cast<MessagesModel::MessageHighlighter>(static_cast<int>(a) | static_cast<int>(b));
}
void MessagesToolBar::handleMessageHighlighterChange(QAction* action) {
MessagesModel::MessageHighlighter task = action->data().value<MessagesModel::MessageHighlighter>();
m_btnMessageHighlighter->setDefaultAction(action);
std::list<QAction*> 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<MessagesModel::MessageHighlighter>();
}
}
saveToolButtonSelection(HIGHLIGHTER_ACTION_NAME, FROM_STD_LIST(QList<QAction*>, checked_tasks_std));
emit messageHighlighterChanged(task);
}
void MessagesToolBar::handleMessageFilterChange(QAction* action) {
MessagesProxyModel::MessageListFilter task = action->data().value<MessagesProxyModel::MessageListFilter>();
m_btnMessageFilter->setDefaultAction(action);
auto checked_tasks_std = boolinq::from(m_menuMessageFilter->actions())
.where([](QAction* act) {
return act->isChecked();
})
.toStdList();
std::list<QAction*> 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<MessagesProxyModel::MessageListFilter>();
}
@ -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());