fix warning

This commit is contained in:
Martin Rotter 2022-04-09 10:11:40 +02:00
parent 62bda35fc8
commit a38d3fb9af
2 changed files with 147 additions and 142 deletions

View File

@ -22,10 +22,10 @@
#include <cmath> #include <cmath>
MessagesModel::MessagesModel(QObject* parent) MessagesModel::MessagesModel(QObject* parent)
: QSqlQueryModel(parent), m_view(nullptr), m_cache(new MessagesModelCache(this)), m_messageHighlighter(MessageHighlighter::NoHighlighting), : QSqlQueryModel(parent), m_view(nullptr), m_cache(new MessagesModelCache(this)),
m_customDateFormat(QString()), m_customTimeFormat(QString()), m_newerArticlesRelativeTime(-1), m_messageHighlighter(MessageHighlighter::NoHighlighting), m_customDateFormat(QString()),
m_selectedItem(nullptr), m_displayFeedIcons(false), m_customTimeFormat(QString()), m_newerArticlesRelativeTime(-1), m_selectedItem(nullptr), m_displayFeedIcons(false),
m_multilineListItems(qApp->settings()->value(GROUP(Messages), SETTING(Messages::MultilineArticleList)).toBool()) { m_multilineListItems(qApp->settings()->value(GROUP(Messages), SETTING(Messages::MultilineArticleList)).toBool()) {
setupFonts(); setupFonts();
setupIcons(); setupIcons();
setupHeaderData(); setupHeaderData();
@ -107,8 +107,7 @@ void MessagesModel::repopulate() {
fetchMore(); fetchMore();
} }
qDebugNN << LOGSEC_MESSAGEMODEL qDebugNN << LOGSEC_MESSAGEMODEL << "Repopulated model, SQL statement is now:\n"
<< "Repopulated model, SQL statement is now:\n"
<< QUOTE_W_SPACE_DOT(selectStatement()); << QUOTE_W_SPACE_DOT(selectStatement());
} }
@ -121,7 +120,9 @@ bool MessagesModel::setData(const QModelIndex& index, const QVariant& value, int
void MessagesModel::setupFonts() { void MessagesModel::setupFonts() {
QFont fon; QFont fon;
fon.fromString(qApp->settings()->value(GROUP(Messages), Messages::ListFont, Application::font("MessagesView").toString()).toString()); fon.fromString(qApp->settings()
->value(GROUP(Messages), Messages::ListFont, Application::font("MessagesView").toString())
.toString());
m_normalFont = fon; m_normalFont = fon;
m_boldFont = m_normalFont; m_boldFont = m_normalFont;
@ -141,13 +142,11 @@ void MessagesModel::loadMessages(RootItem* item) {
else { else {
if (!item->getParentServiceRoot()->loadMessagesForItem(item, this)) { if (!item->getParentServiceRoot()->loadMessagesForItem(item, this)) {
setFilter(QSL(DEFAULT_SQL_MESSAGES_FILTER)); setFilter(QSL(DEFAULT_SQL_MESSAGES_FILTER));
qCriticalNN << LOGSEC_MESSAGEMODEL qCriticalNN << LOGSEC_MESSAGEMODEL << "Loading of messages from item '" << item->title() << "' failed.";
<< "Loading of messages from item '" qApp->showGuiMessage(Notification::Event::GeneralEvent,
<< item->title() << "' failed."; {tr("Loading of articles from item '%1' failed").arg(item->title()),
qApp->showGuiMessage(Notification::Event::GeneralEvent, { tr("Loading of articles failed, maybe messages could not be downloaded."),
tr("Loading of articles from item '%1' failed").arg(item->title()), QSystemTrayIcon::MessageIcon::Critical});
tr("Loading of articles failed, maybe messages could not be downloaded."),
QSystemTrayIcon::MessageIcon::Critical });
} }
} }
@ -205,8 +204,8 @@ void MessagesModel::updateDateFormat() {
m_customTimeFormat = QString(); m_customTimeFormat = QString();
} }
m_newerArticlesRelativeTime = qApp->settings()->value(GROUP(Messages), m_newerArticlesRelativeTime =
SETTING(Messages::RelativeTimeForNewerArticles)).toInt(); qApp->settings()->value(GROUP(Messages), SETTING(Messages::RelativeTimeForNewerArticles)).toInt();
} }
void MessagesModel::updateFeedIconsDisplay() { void MessagesModel::updateFeedIconsDisplay() {
@ -261,25 +260,14 @@ void MessagesModel::setupHeaderData() {
/*: Tooltip for indication of presence of enclosures.*/ tr("Has enclosures"); /*: Tooltip for indication of presence of enclosures.*/ tr("Has enclosures");
m_tooltipData m_tooltipData << tr("ID of the article.") << tr("Is article read?") << tr("Is article important?")
<< tr("ID of the article.") << tr("Is article deleted?") << tr("Is article permanently deleted from recycle bin?")
<< tr("Is article read?") << tr("ID of feed which this article belongs to.") << tr("Title of the article.")
<< tr("Is article important?") << tr("Url of the article.") << tr("Author of the article.") << tr("Creation date of the article.")
<< tr("Is article deleted?") << tr("Contents of the article.") << tr("List of attachments.") << tr("Score of the article.")
<< tr("Is article permanently deleted from recycle bin?") << tr("Account ID of the article.") << tr("Custom ID of the article.")
<< tr("ID of feed which this article belongs to.") << tr("Custom hash of the article.") << tr("Custom ID of feed of the article.")
<< tr("Title of the article.") << tr("Indication of enclosures presence within the article.");
<< tr("Url of the article.")
<< tr("Author of the article.")
<< tr("Creation date of the article.")
<< tr("Contents of the article.")
<< tr("List of attachments.")
<< tr("Score of the article.")
<< tr("Account ID of the article.")
<< tr("Custom ID of the article.")
<< tr("Custom hash of the article.")
<< tr("Custom ID of feed of the article.")
<< tr("Indication of enclosures presence within the article.");
} }
Qt::ItemFlags MessagesModel::flags(const QModelIndex& index) const { Qt::ItemFlags MessagesModel::flags(const QModelIndex& index) const {
@ -288,7 +276,8 @@ Qt::ItemFlags MessagesModel::flags(const QModelIndex& index) const {
} }
QList<Message> MessagesModel::messagesAt(const QList<int>& row_indices) const { QList<Message> MessagesModel::messagesAt(const QList<int>& row_indices) const {
QList<Message> msgs; msgs.reserve(row_indices.size()); QList<Message> msgs;
msgs.reserve(row_indices.size());
for (int idx : row_indices) { for (int idx : row_indices) {
msgs << messageAt(idx); msgs << messageAt(idx);
@ -309,8 +298,8 @@ QVariant MessagesModel::data(const QModelIndex& idx, int role) const {
int index_column = idx.column(); int index_column = idx.column();
if (index_column == MSG_DB_DCREATED_INDEX) { if (index_column == MSG_DB_DCREATED_INDEX) {
QDateTime dt = TextFactory::parseDateTime(QSqlQueryModel::data(idx, QDateTime dt = TextFactory::parseDateTime(QSqlQueryModel::data(idx, Qt::ItemDataRole::EditRole).value<qint64>())
Qt::ItemDataRole::EditRole).value<qint64>()).toLocalTime(); .toLocalTime();
if (dt.date() == QDate::currentDate() && !m_customTimeFormat.isEmpty()) { if (dt.date() == QDate::currentDate() && !m_customTimeFormat.isEmpty()) {
return dt.toString(m_customTimeFormat); return dt.toString(m_customTimeFormat);
@ -369,10 +358,8 @@ QVariant MessagesModel::data(const QModelIndex& idx, int role) const {
return author_name.isEmpty() ? QSL("-") : author_name; return author_name.isEmpty() ? QSL("-") : author_name;
} }
else if (index_column != MSG_DB_IMPORTANT_INDEX && else if (index_column != MSG_DB_IMPORTANT_INDEX && index_column != MSG_DB_READ_INDEX &&
index_column != MSG_DB_READ_INDEX && index_column != MSG_DB_HAS_ENCLOSURES && index_column != MSG_DB_SCORE_INDEX) {
index_column != MSG_DB_HAS_ENCLOSURES &&
index_column != MSG_DB_SCORE_INDEX) {
return QSqlQueryModel::data(idx, role); return QSqlQueryModel::data(idx, role);
} }
else { else {
@ -382,13 +369,11 @@ QVariant MessagesModel::data(const QModelIndex& idx, int role) const {
case LOWER_TITLE_ROLE: case LOWER_TITLE_ROLE:
return m_cache->containsData(idx.row()) return m_cache->containsData(idx.row())
? m_cache->data(idx).toString().toLower() ? m_cache->data(idx).toString().toLower()
: QSqlQueryModel::data(idx, Qt::ItemDataRole::EditRole).toString().toLower(); : QSqlQueryModel::data(idx, Qt::ItemDataRole::EditRole).toString().toLower();
case Qt::ItemDataRole::EditRole: case Qt::ItemDataRole::EditRole:
return m_cache->containsData(idx.row()) return m_cache->containsData(idx.row()) ? m_cache->data(idx) : QSqlQueryModel::data(idx, role);
? m_cache->data(idx)
: QSqlQueryModel::data(idx, role);
case Qt::ItemDataRole::ToolTipRole: { case Qt::ItemDataRole::ToolTipRole: {
if (!qApp->settings()->value(GROUP(Feeds), SETTING(Feeds::EnableTooltipsFeedsMessages)).toBool()) { if (!qApp->settings()->value(GROUP(Feeds), SETTING(Feeds::EnableTooltipsFeedsMessages)).toBool()) {
@ -399,14 +384,14 @@ QVariant MessagesModel::data(const QModelIndex& idx, int role) const {
return data(idx, Qt::ItemDataRole::EditRole); return data(idx, Qt::ItemDataRole::EditRole);
} }
else if (idx.column() == MSG_DB_URL_INDEX) { else if (idx.column() == MSG_DB_URL_INDEX) {
return TextFactory::shorten(data(idx, Qt::ItemDataRole::DisplayRole).toString(), return TextFactory::shorten(data(idx, Qt::ItemDataRole::DisplayRole).toString(), TEXT_TOOLTIP_LIMIT);
TEXT_TOOLTIP_LIMIT);
} }
else if (idx.column() == MSG_DB_DCREATED_INDEX) { else if (idx.column() == MSG_DB_DCREATED_INDEX) {
return qApp->localization()->loadedLocale().toString( return qApp->localization()
QDateTime::fromMSecsSinceEpoch(data(idx, ->loadedLocale()
Qt::ItemDataRole::EditRole).value<qint64>()).toLocalTime(), .toString(QDateTime::fromMSecsSinceEpoch(data(idx, Qt::ItemDataRole::EditRole).value<qint64>())
QLocale::FormatType::LongFormat); .toLocalTime(),
QLocale::FormatType::LongFormat);
} }
else { else {
return data(idx, Qt::ItemDataRole::DisplayRole); return data(idx, Qt::ItemDataRole::DisplayRole);
@ -446,24 +431,26 @@ QVariant MessagesModel::data(const QModelIndex& idx, int role) const {
switch (m_messageHighlighter) { switch (m_messageHighlighter) {
case MessageHighlighter::HighlightImportant: { case MessageHighlighter::HighlightImportant: {
QModelIndex idx_important = index(idx.row(), MSG_DB_IMPORTANT_INDEX); 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); QVariant dta = m_cache->containsData(idx_important.row()) ? m_cache->data(idx_important)
: QSqlQueryModel::data(idx_important);
return dta.toInt() == 1 return dta.toInt() == 1
? qApp->skins()->currentSkin().colorForModel(role == Qt::ItemDataRole::ForegroundRole ? qApp->skins()->currentSkin().colorForModel(role == Qt::ItemDataRole::ForegroundRole
? SkinEnums::PaletteColors::FgInteresting ? SkinEnums::PaletteColors::FgInteresting
: SkinEnums::PaletteColors::FgSelectedInteresting) : SkinEnums::PaletteColors::FgSelectedInteresting)
: QVariant(); : QVariant();
} }
case MessageHighlighter::HighlightUnread: { case MessageHighlighter::HighlightUnread: {
QModelIndex idx_read = index(idx.row(), MSG_DB_READ_INDEX); 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); QVariant dta =
m_cache->containsData(idx_read.row()) ? m_cache->data(idx_read) : QSqlQueryModel::data(idx_read);
return dta.toInt() == 0 return dta.toInt() == 0
? qApp->skins()->currentSkin().colorForModel(role == Qt::ItemDataRole::ForegroundRole ? qApp->skins()->currentSkin().colorForModel(role == Qt::ItemDataRole::ForegroundRole
? SkinEnums::PaletteColors::FgInteresting ? SkinEnums::PaletteColors::FgInteresting
: SkinEnums::PaletteColors::FgSelectedInteresting) : SkinEnums::PaletteColors::FgSelectedInteresting)
: QVariant(); : QVariant();
} }
case MessageHighlighter::NoHighlighting: case MessageHighlighter::NoHighlighting:
@ -472,9 +459,7 @@ QVariant MessagesModel::data(const QModelIndex& idx, int role) const {
} }
case Qt::ItemDataRole::SizeHintRole: { case Qt::ItemDataRole::SizeHintRole: {
if (!m_multilineListItems || if (!m_multilineListItems || m_view == nullptr || m_view->isColumnHidden(idx.column()) ||
m_view == nullptr ||
m_view->isColumnHidden(idx.column()) ||
idx.column() != MSG_DB_TITLE_INDEX) { idx.column() != MSG_DB_TITLE_INDEX) {
return {}; return {};
} }
@ -487,11 +472,11 @@ QVariant MessagesModel::data(const QModelIndex& idx, int role) const {
} }
QFontMetrics fm(data(idx, Qt::ItemDataRole::FontRole).value<QFont>()); QFontMetrics fm(data(idx, Qt::ItemDataRole::FontRole).value<QFont>());
auto rct = fm.boundingRect(QRect(QPoint(0, 0), QPoint(wd - 5, 100000)), auto rct =
Qt::TextFlag::TextWordWrap | fm.boundingRect(QRect(QPoint(0, 0), QPoint(wd - 5, 100000)),
Qt::AlignmentFlag::AlignLeft | Qt::TextFlag::TextWordWrap | Qt::AlignmentFlag::AlignLeft | Qt::AlignmentFlag::AlignVCenter,
Qt::AlignmentFlag::AlignVCenter, str)
str).size(); .size();
return rct; return rct;
} }
@ -503,9 +488,8 @@ QVariant MessagesModel::data(const QModelIndex& idx, int role) const {
if (index_column == MSG_DB_READ_INDEX) { if (index_column == MSG_DB_READ_INDEX) {
if (m_displayFeedIcons && m_selectedItem != nullptr) { if (m_displayFeedIcons && m_selectedItem != nullptr) {
QModelIndex idx_feedid = index(idx.row(), MSG_DB_FEED_CUSTOM_ID_INDEX); QModelIndex idx_feedid = index(idx.row(), MSG_DB_FEED_CUSTOM_ID_INDEX);
QVariant dta = m_cache->containsData(idx_feedid.row()) QVariant dta =
? m_cache->data(idx_feedid) m_cache->containsData(idx_feedid.row()) ? m_cache->data(idx_feedid) : QSqlQueryModel::data(idx_feedid);
: QSqlQueryModel::data(idx_feedid);
QString feed_custom_id = dta.toString(); QString feed_custom_id = dta.toString();
auto acc = m_selectedItem->getParentServiceRoot()->feedIconForMessage(feed_custom_id); auto acc = m_selectedItem->getParentServiceRoot()->feedIconForMessage(feed_custom_id);
@ -518,14 +502,16 @@ QVariant MessagesModel::data(const QModelIndex& idx, int role) const {
} }
else { else {
QModelIndex idx_read = index(idx.row(), MSG_DB_READ_INDEX); 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); QVariant dta =
m_cache->containsData(idx_read.row()) ? m_cache->data(idx_read) : QSqlQueryModel::data(idx_read);
return dta.toInt() == 1 ? m_readIcon : m_unreadIcon; return dta.toInt() == 1 ? m_readIcon : m_unreadIcon;
} }
} }
else if (index_column == MSG_DB_IMPORTANT_INDEX) { else if (index_column == MSG_DB_IMPORTANT_INDEX) {
QModelIndex idx_important = index(idx.row(), MSG_DB_IMPORTANT_INDEX); 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); QVariant dta = m_cache->containsData(idx_important.row()) ? m_cache->data(idx_important)
: QSqlQueryModel::data(idx_important);
return dta.toInt() == 1 ? m_favoriteIcon : QVariant(); return dta.toInt() == 1 ? m_favoriteIcon : QVariant();
} }
@ -560,7 +546,9 @@ bool MessagesModel::setMessageRead(int row_index, RootItem::ReadStatus read) {
Message message = messageAt(row_index); Message message = messageAt(row_index);
if (!m_selectedItem->getParentServiceRoot()->onBeforeSetMessagesRead(m_selectedItem, QList<Message>() << message, read)) { if (!m_selectedItem->getParentServiceRoot()->onBeforeSetMessagesRead(m_selectedItem,
QList<Message>() << message,
read)) {
// Cannot change read status of the item. Abort. // Cannot change read status of the item. Abort.
return false; return false;
} }
@ -575,7 +563,9 @@ bool MessagesModel::setMessageRead(int row_index, RootItem::ReadStatus read) {
} }
if (DatabaseQueries::markMessagesReadUnread(m_db, QStringList() << QString::number(message.m_id), read)) { if (DatabaseQueries::markMessagesReadUnread(m_db, QStringList() << QString::number(message.m_id), read)) {
return m_selectedItem->getParentServiceRoot()->onAfterSetMessagesRead(m_selectedItem, QList<Message>() << message, read); return m_selectedItem->getParentServiceRoot()->onAfterSetMessagesRead(m_selectedItem,
QList<Message>() << message,
read);
} }
else { else {
return false; return false;
@ -602,15 +592,15 @@ bool MessagesModel::setMessageReadById(int id, RootItem::ReadStatus read) {
bool MessagesModel::switchMessageImportance(int row_index) { bool MessagesModel::switchMessageImportance(int row_index) {
const QModelIndex target_index = index(row_index, MSG_DB_IMPORTANT_INDEX); const QModelIndex target_index = index(row_index, MSG_DB_IMPORTANT_INDEX);
const RootItem::Importance current_importance = (RootItem::Importance) data(target_index, Qt::EditRole).toInt(); const RootItem::Importance current_importance = (RootItem::Importance)data(target_index, Qt::EditRole).toInt();
const RootItem::Importance next_importance = current_importance == RootItem::Importance::Important const RootItem::Importance next_importance = current_importance == RootItem::Importance::Important
? RootItem::Importance::NotImportant ? RootItem::Importance::NotImportant
: RootItem::Importance::Important; : RootItem::Importance::Important;
const Message message = messageAt(row_index); const Message message = messageAt(row_index);
const QPair<Message, RootItem::Importance> pair(message, next_importance); const QPair<Message, RootItem::Importance> pair(message, next_importance);
if (!m_selectedItem->getParentServiceRoot()->onBeforeSwitchMessageImportance(m_selectedItem, if (!m_selectedItem->getParentServiceRoot()
QList<QPair<Message, RootItem::Importance>>() << pair)) { ->onBeforeSwitchMessageImportance(m_selectedItem, QList<QPair<Message, RootItem::Importance>>() << pair)) {
return false; return false;
} }
@ -625,10 +615,12 @@ bool MessagesModel::switchMessageImportance(int row_index) {
// Commit changes. // Commit changes.
if (DatabaseQueries::markMessageImportant(m_db, message.m_id, next_importance)) { if (DatabaseQueries::markMessageImportant(m_db, message.m_id, next_importance)) {
emit dataChanged(index(row_index, 0), index(row_index, MSG_DB_FEED_CUSTOM_ID_INDEX), QVector<int>() << Qt::FontRole); emit dataChanged(index(row_index, 0),
index(row_index, MSG_DB_FEED_CUSTOM_ID_INDEX),
QVector<int>() << Qt::FontRole);
return m_selectedItem->getParentServiceRoot()->onAfterSwitchMessageImportance(m_selectedItem, return m_selectedItem->getParentServiceRoot()
QList<QPair<Message, RootItem::Importance>>() << pair); ->onAfterSwitchMessageImportance(m_selectedItem, QList<QPair<Message, RootItem::Importance>>() << pair);
} }
else { else {
return false; return false;
@ -636,8 +628,10 @@ bool MessagesModel::switchMessageImportance(int row_index) {
} }
bool MessagesModel::switchBatchMessageImportance(const QModelIndexList& messages) { bool MessagesModel::switchBatchMessageImportance(const QModelIndexList& messages) {
QStringList message_ids; message_ids.reserve(messages.size()); QStringList message_ids;
QList<QPair<Message, RootItem::Importance>> message_states; message_states.reserve(messages.size()); message_ids.reserve(messages.size());
QList<QPair<Message, RootItem::Importance>> message_states;
message_states.reserve(messages.size());
// Obtain IDs of all desired messages. // Obtain IDs of all desired messages.
for (const QModelIndex& message : messages) { for (const QModelIndex& message : messages) {
@ -645,15 +639,16 @@ bool MessagesModel::switchBatchMessageImportance(const QModelIndexList& messages
RootItem::Importance message_importance = messageImportance((message.row())); RootItem::Importance message_importance = messageImportance((message.row()));
message_states.append(QPair<Message, RootItem::Importance>(msg, message_importance == RootItem::Importance::Important message_states.append(QPair<Message, RootItem::Importance>(msg,
? RootItem::Importance::NotImportant message_importance == RootItem::Importance::Important
: RootItem::Importance::Important)); ? RootItem::Importance::NotImportant
: RootItem::Importance::Important));
message_ids.append(QString::number(msg.m_id)); message_ids.append(QString::number(msg.m_id));
QModelIndex idx_msg_imp = index(message.row(), MSG_DB_IMPORTANT_INDEX); QModelIndex idx_msg_imp = index(message.row(), MSG_DB_IMPORTANT_INDEX);
setData(idx_msg_imp, message_importance == RootItem::Importance::Important setData(idx_msg_imp,
? int(RootItem::Importance::NotImportant) message_importance == RootItem::Importance::Important ? int(RootItem::Importance::NotImportant)
: int(RootItem::Importance::Important)); : int(RootItem::Importance::Important));
} }
reloadWholeLayout(); reloadWholeLayout();
@ -671,8 +666,10 @@ bool MessagesModel::switchBatchMessageImportance(const QModelIndexList& messages
} }
bool MessagesModel::setBatchMessagesDeleted(const QModelIndexList& messages) { bool MessagesModel::setBatchMessagesDeleted(const QModelIndexList& messages) {
QStringList message_ids; message_ids.reserve(messages.size()); QStringList message_ids;
QList<Message> msgs; msgs.reserve(messages.size()); message_ids.reserve(messages.size());
QList<Message> msgs;
msgs.reserve(messages.size());
// Obtain IDs of all desired messages. // Obtain IDs of all desired messages.
for (const QModelIndex& message : messages) { for (const QModelIndex& message : messages) {
@ -713,8 +710,10 @@ bool MessagesModel::setBatchMessagesDeleted(const QModelIndexList& messages) {
} }
bool MessagesModel::setBatchMessagesRead(const QModelIndexList& messages, RootItem::ReadStatus read) { bool MessagesModel::setBatchMessagesRead(const QModelIndexList& messages, RootItem::ReadStatus read) {
QStringList message_ids; message_ids.reserve(messages.size()); QStringList message_ids;
QList<Message> msgs; msgs.reserve(messages.size()); message_ids.reserve(messages.size());
QList<Message> msgs;
msgs.reserve(messages.size());
// Obtain IDs of all desired messages. // Obtain IDs of all desired messages.
for (const QModelIndex& message : messages) { for (const QModelIndex& message : messages) {
@ -740,8 +739,10 @@ bool MessagesModel::setBatchMessagesRead(const QModelIndexList& messages, RootIt
} }
bool MessagesModel::setBatchMessagesRestored(const QModelIndexList& messages) { bool MessagesModel::setBatchMessagesRestored(const QModelIndexList& messages) {
QStringList message_ids; message_ids.reserve(messages.size()); QStringList message_ids;
QList<Message> msgs; msgs.reserve(messages.size()); message_ids.reserve(messages.size());
QList<Message> msgs;
msgs.reserve(messages.size());
// Obtain IDs of all desired messages. // Obtain IDs of all desired messages.
for (const QModelIndex& message : messages) { for (const QModelIndex& message : messages) {
@ -775,9 +776,7 @@ QVariant MessagesModel::headerData(int section, Qt::Orientation orientation, int
// Display textual headers for all columns except "read" and // Display textual headers for all columns except "read" and
// "important" and "has enclosures" columns. // "important" and "has enclosures" columns.
if (section != MSG_DB_READ_INDEX && if (section != MSG_DB_READ_INDEX && section != MSG_DB_IMPORTANT_INDEX && section != MSG_DB_SCORE_INDEX &&
section != MSG_DB_IMPORTANT_INDEX &&
section != MSG_DB_SCORE_INDEX &&
section != MSG_DB_HAS_ENCLOSURES) { section != MSG_DB_HAS_ENCLOSURES) {
return m_headerData.at(section); return m_headerData.at(section);
} }

View File

@ -28,24 +28,27 @@
void MessagePreviewer::createConnections() { void MessagePreviewer::createConnections() {
installEventFilter(this); installEventFilter(this);
connect(m_actionMarkRead = m_toolBar->addAction(qApp->icons()->fromTheme(QSL("mail-mark-read")), tr("Mark article read")), connect(m_actionMarkRead =
m_toolBar->addAction(qApp->icons()->fromTheme(QSL("mail-mark-read")), tr("Mark article read")),
&QAction::triggered, &QAction::triggered,
this, this,
&MessagePreviewer::markMessageAsRead); &MessagePreviewer::markMessageAsRead);
connect(m_actionMarkUnread = m_toolBar->addAction(qApp->icons()->fromTheme(QSL("mail-mark-unread")), tr("Mark article unread")), connect(m_actionMarkUnread =
m_toolBar->addAction(qApp->icons()->fromTheme(QSL("mail-mark-unread")), tr("Mark article unread")),
&QAction::triggered, &QAction::triggered,
this, this,
&MessagePreviewer::markMessageAsUnread); &MessagePreviewer::markMessageAsUnread);
connect(m_actionSwitchImportance = m_toolBar->addAction(qApp->icons()->fromTheme(QSL("mail-mark-important")), tr("Switch article importance")), connect(m_actionSwitchImportance =
m_toolBar->addAction(qApp->icons()->fromTheme(QSL("mail-mark-important")), tr("Switch article importance")),
&QAction::triggered, &QAction::triggered,
this, this,
&MessagePreviewer::switchMessageImportance); &MessagePreviewer::switchMessageImportance);
} }
MessagePreviewer::MessagePreviewer(QWidget* parent) MessagePreviewer::MessagePreviewer(QWidget* parent)
: QWidget(parent), m_mainLayout(new QGridLayout(this)), m_viewerLayout(new QStackedLayout(this)), : QWidget(parent), m_mainLayout(new QGridLayout(this)), m_viewerLayout(new QStackedLayout()),
m_toolBar(new QToolBar(this)), m_msgBrowser(new WebBrowser(nullptr, this)), m_separator(nullptr), m_toolBar(new QToolBar(this)), m_msgBrowser(new WebBrowser(nullptr, this)), m_separator(nullptr),
m_btnLabels(QList<QPair<LabelButton*, QAction*>>()) { m_btnLabels(QList<QPair<LabelButton*, QAction*>>()) {
m_toolBar->setOrientation(Qt::Orientation::Vertical); m_toolBar->setOrientation(Qt::Orientation::Vertical);
@ -126,10 +129,11 @@ void MessagePreviewer::loadMessage(const Message& message, RootItem* root) {
if (!same_message) { if (!same_message) {
const QString msg_feed_id = message.m_feedId; const QString msg_feed_id = message.m_feedId;
const auto* feed = root->getParentServiceRoot()->getItemFromSubTree( const auto* feed = root->getParentServiceRoot()
[msg_feed_id](const RootItem* it) { ->getItemFromSubTree([msg_feed_id](const RootItem* it) {
return it->kind() == RootItem::Kind::Feed && it->customId() == msg_feed_id; return it->kind() == RootItem::Kind::Feed && it->customId() == msg_feed_id;
})->toFeed(); })
->toFeed();
if (feed != nullptr && feed->openArticlesDirectly() && !m_message.m_url.isEmpty()) { if (feed != nullptr && feed->openArticlesDirectly() && !m_message.m_url.isEmpty()) {
ensureDefaultBrowserVisible(); ensureDefaultBrowserVisible();
@ -159,7 +163,7 @@ void MessagePreviewer::loadMessage(const Message& message, RootItem* root) {
else { else {
ensureDefaultBrowserVisible(); ensureDefaultBrowserVisible();
m_msgBrowser->loadMessages({ message }, m_root); m_msgBrowser->loadMessages({message}, m_root);
} }
} }
} }
@ -191,16 +195,14 @@ void MessagePreviewer::markMessageAsUnread() {
void MessagePreviewer::markMessageAsReadUnread(RootItem::ReadStatus read) { void MessagePreviewer::markMessageAsReadUnread(RootItem::ReadStatus read) {
if (!m_root.isNull()) { if (!m_root.isNull()) {
if (m_root->getParentServiceRoot()->onBeforeSetMessagesRead(m_root.data(), if (m_root->getParentServiceRoot()->onBeforeSetMessagesRead(m_root.data(), QList<Message>() << m_message, read)) {
QList<Message>() << m_message, DatabaseQueries::markMessagesReadUnread(qApp->database()
read)) { ->driver()
DatabaseQueries::markMessagesReadUnread(qApp->database()->driver()->connection(objectName(), ->connection(objectName(),
DatabaseDriver::DesiredStorageType::FromSettings), DatabaseDriver::DesiredStorageType::FromSettings),
QStringList() << QString::number(m_message.m_id), QStringList() << QString::number(m_message.m_id),
read); read);
m_root->getParentServiceRoot()->onAfterSetMessagesRead(m_root.data(), m_root->getParentServiceRoot()->onAfterSetMessagesRead(m_root.data(), QList<Message>() << m_message, read);
QList<Message>() << m_message,
read);
m_message.m_isRead = read == RootItem::ReadStatus::Read; m_message.m_isRead = read == RootItem::ReadStatus::Read;
emit markMessageRead(m_message.m_id, read); emit markMessageRead(m_message.m_id, read);
@ -211,24 +213,27 @@ void MessagePreviewer::markMessageAsReadUnread(RootItem::ReadStatus read) {
void MessagePreviewer::switchMessageImportance(bool checked) { void MessagePreviewer::switchMessageImportance(bool checked) {
if (!m_root.isNull()) { if (!m_root.isNull()) {
if (m_root->getParentServiceRoot()->onBeforeSwitchMessageImportance(m_root.data(), if (m_root->getParentServiceRoot()
QList<ImportanceChange>() ->onBeforeSwitchMessageImportance(m_root.data(),
<< ImportanceChange(m_message, QList<ImportanceChange>()
m_message. << ImportanceChange(m_message,
m_isImportant m_message.m_isImportant
? RootItem::Importance::NotImportant ? RootItem::Importance::NotImportant
: RootItem::Importance::Important))) { : RootItem::Importance::Important))) {
DatabaseQueries::switchMessagesImportance(qApp->database()->driver()->connection(objectName(), DatabaseDriver::DesiredStorageType::FromSettings), DatabaseQueries::switchMessagesImportance(qApp->database()
->driver()
->connection(objectName(),
DatabaseDriver::DesiredStorageType::FromSettings),
QStringList() << QString::number(m_message.m_id)); QStringList() << QString::number(m_message.m_id));
m_root->getParentServiceRoot()->onAfterSwitchMessageImportance(m_root.data(), m_root->getParentServiceRoot()
QList<ImportanceChange>() ->onAfterSwitchMessageImportance(m_root.data(),
<< ImportanceChange(m_message, QList<ImportanceChange>()
m_message.m_isImportant << ImportanceChange(m_message,
? RootItem::Importance::NotImportant m_message.m_isImportant
: RootItem::Importance::Important)); ? RootItem::Importance::NotImportant
emit markMessageImportant(m_message.m_id, checked : RootItem::Importance::Important));
? RootItem::Importance::Important emit markMessageImportant(m_message.m_id,
: RootItem::Importance::NotImportant); checked ? RootItem::Importance::Important : RootItem::Importance::NotImportant);
m_message.m_isImportant = checked; m_message.m_isImportant = checked;
} }
@ -271,8 +276,9 @@ void MessagePreviewer::updateLabels(bool only_clear) {
btn_label->setIcon(Label::generateIcon(label->color())); btn_label->setIcon(Label::generateIcon(label->color()));
btn_label->setAutoRaise(false); btn_label->setAutoRaise(false);
btn_label->setText(QSL(" ") + label->title()); btn_label->setText(QSL(" ") + label->title());
btn_label->setToolButtonStyle(Qt::ToolButtonStyle(qApp->settings()->value(GROUP(GUI), btn_label->setToolButtonStyle(Qt::ToolButtonStyle(qApp->settings()
SETTING(GUI::ToolbarStyle)).toInt())); ->value(GROUP(GUI), SETTING(GUI::ToolbarStyle))
.toInt()));
btn_label->setToolTip(label->title()); btn_label->setToolTip(label->title());
btn_label->setChecked(DatabaseQueries::isLabelAssignedToMessage(database, label, m_message)); btn_label->setChecked(DatabaseQueries::isLabelAssignedToMessage(database, label, m_message));
@ -280,7 +286,7 @@ void MessagePreviewer::updateLabels(bool only_clear) {
connect(btn_label, &QToolButton::toggled, this, &MessagePreviewer::switchLabel); connect(btn_label, &QToolButton::toggled, this, &MessagePreviewer::switchLabel);
m_btnLabels.append({ btn_label, act_label }); m_btnLabels.append({btn_label, act_label});
} }
} }
} }