fix special toolbuttons not adopting app-wide toolbutton style

This commit is contained in:
Martin Rotter 2023-04-19 11:23:56 +02:00
parent 7197c9d0c6
commit d7f524ca81
17 changed files with 208 additions and 126 deletions

View File

@ -1075,7 +1075,7 @@ QHash<QString, QStringList> DatabaseQueries::bagsOfMessages(const QSqlDatabase&
return ids; return ids;
} }
QPair<int, int> DatabaseQueries::updateMessages(const QSqlDatabase &db, QPair<int, int> DatabaseQueries::updateMessages(const QSqlDatabase& db,
QList<Message>& messages, QList<Message>& messages,
Feed* feed, Feed* feed,
bool force_update, bool force_update,
@ -1801,13 +1801,18 @@ void DatabaseQueries::storeAccountTree(const QSqlDatabase& db, RootItem* tree_ro
} }
} }
QStringList DatabaseQueries::customIdsOfMessagesFromAccount(const QSqlDatabase& db, int account_id, bool* ok) { QStringList DatabaseQueries::customIdsOfMessagesFromAccount(const QSqlDatabase& db,
RootItem::ReadStatus target_read,
int account_id,
bool* ok) {
QSqlQuery q(db); QSqlQuery q(db);
QStringList ids; QStringList ids;
q.setForwardOnly(true); q.setForwardOnly(true);
q.prepare(QSL("SELECT custom_id FROM Messages WHERE is_pdeleted = 0 AND account_id = :account_id;")); q.prepare(QSL("SELECT custom_id FROM Messages "
"WHERE is_read = :read AND is_pdeleted = 0 AND account_id = :account_id;"));
q.bindValue(QSL(":account_id"), account_id); q.bindValue(QSL(":account_id"), account_id);
q.bindValue(QSL(":read"), target_read == RootItem::ReadStatus::Read ? 0 : 1);
if (ok != nullptr) { if (ok != nullptr) {
*ok = q.exec(); *ok = q.exec();
@ -1823,13 +1828,17 @@ QStringList DatabaseQueries::customIdsOfMessagesFromAccount(const QSqlDatabase&
return ids; return ids;
} }
QStringList DatabaseQueries::customIdsOfMessagesFromLabel(const QSqlDatabase& db, Label* label, bool* ok) { QStringList DatabaseQueries::customIdsOfMessagesFromLabel(const QSqlDatabase& db,
Label* label,
RootItem::ReadStatus target_read,
bool* ok) {
QSqlQuery q(db); QSqlQuery q(db);
QStringList ids; QStringList ids;
q.setForwardOnly(true); q.setForwardOnly(true);
q.prepare(QSL("SELECT custom_id FROM Messages " q.prepare(QSL("SELECT custom_id FROM Messages "
"WHERE " "WHERE "
" is_read = :read AND "
" is_deleted = 0 AND " " is_deleted = 0 AND "
" is_pdeleted = 0 AND " " is_pdeleted = 0 AND "
" account_id = :account_id AND " " account_id = :account_id AND "
@ -1838,6 +1847,7 @@ QStringList DatabaseQueries::customIdsOfMessagesFromLabel(const QSqlDatabase& db
"LabelsInMessages.message);")); "LabelsInMessages.message);"));
q.bindValue(QSL(":account_id"), label->getParentServiceRoot()->accountId()); q.bindValue(QSL(":account_id"), label->getParentServiceRoot()->accountId());
q.bindValue(QSL(":label"), label->customId()); q.bindValue(QSL(":label"), label->customId());
q.bindValue(QSL(":read"), target_read == RootItem::ReadStatus::Read ? 0 : 1);
if (ok != nullptr) { if (ok != nullptr) {
*ok = q.exec(); *ok = q.exec();
@ -1853,14 +1863,20 @@ QStringList DatabaseQueries::customIdsOfMessagesFromLabel(const QSqlDatabase& db
return ids; return ids;
} }
QStringList DatabaseQueries::customIdsOfImportantMessages(const QSqlDatabase& db, int account_id, bool* ok) { QStringList DatabaseQueries::customIdsOfImportantMessages(const QSqlDatabase& db,
RootItem::ReadStatus target_read,
int account_id,
bool* ok) {
QSqlQuery q(db); QSqlQuery q(db);
QStringList ids; QStringList ids;
q.setForwardOnly(true); q.setForwardOnly(true);
q.prepare(QSL("SELECT custom_id FROM Messages " q.prepare(QSL("SELECT custom_id FROM Messages "
"WHERE is_important = 1 AND is_deleted = 0 AND is_pdeleted = 0 AND account_id = :account_id;")); "WHERE "
"is_read = :read AND is_important = 1 AND is_deleted = 0 AND "
"is_pdeleted = 0 AND account_id = :account_id;"));
q.bindValue(QSL(":account_id"), account_id); q.bindValue(QSL(":account_id"), account_id);
q.bindValue(QSL(":read"), target_read == RootItem::ReadStatus::Read ? 0 : 1);
if (ok != nullptr) { if (ok != nullptr) {
*ok = q.exec(); *ok = q.exec();
@ -1899,14 +1915,18 @@ QStringList DatabaseQueries::customIdsOfUnreadMessages(const QSqlDatabase& db, i
return ids; return ids;
} }
QStringList DatabaseQueries::customIdsOfMessagesFromBin(const QSqlDatabase& db, int account_id, bool* ok) { QStringList DatabaseQueries::customIdsOfMessagesFromBin(const QSqlDatabase& db,
RootItem::ReadStatus target_read,
int account_id,
bool* ok) {
QSqlQuery q(db); QSqlQuery q(db);
QStringList ids; QStringList ids;
q.setForwardOnly(true); q.setForwardOnly(true);
q.prepare(QSL("SELECT custom_id FROM Messages WHERE is_deleted = 1 AND is_pdeleted = 0 AND account_id = " q.prepare(QSL("SELECT custom_id FROM Messages "
":account_id;")); "WHERE is_read = :read AND is_deleted = 1 AND is_pdeleted = 0 AND account_id = :account_id;"));
q.bindValue(QSL(":account_id"), account_id); q.bindValue(QSL(":account_id"), account_id);
q.bindValue(QSL(":read"), target_read == RootItem::ReadStatus::Read ? 0 : 1);
if (ok != nullptr) { if (ok != nullptr) {
*ok = q.exec(); *ok = q.exec();
@ -1924,16 +1944,19 @@ QStringList DatabaseQueries::customIdsOfMessagesFromBin(const QSqlDatabase& db,
QStringList DatabaseQueries::customIdsOfMessagesFromFeed(const QSqlDatabase& db, QStringList DatabaseQueries::customIdsOfMessagesFromFeed(const QSqlDatabase& db,
const QString& feed_custom_id, const QString& feed_custom_id,
RootItem::ReadStatus target_read,
int account_id, int account_id,
bool* ok) { bool* ok) {
QSqlQuery q(db); QSqlQuery q(db);
QStringList ids; QStringList ids;
q.setForwardOnly(true); q.setForwardOnly(true);
q.prepare(QSL("SELECT custom_id FROM Messages WHERE is_deleted = 0 AND is_pdeleted = 0 AND feed = :feed AND " q.prepare(QSL("SELECT custom_id FROM Messages "
"account_id = :account_id;")); "WHERE is_read = :read AND is_deleted = 0 AND "
"is_pdeleted = 0 AND feed = :feed AND account_id = :account_id;"));
q.bindValue(QSL(":account_id"), account_id); q.bindValue(QSL(":account_id"), account_id);
q.bindValue(QSL(":feed"), feed_custom_id); q.bindValue(QSL(":feed"), feed_custom_id);
q.bindValue(QSL(":read"), target_read == RootItem::ReadStatus::Read ? 0 : 1);
if (ok != nullptr) { if (ok != nullptr) {
*ok = q.exec(); *ok = q.exec();

View File

@ -117,13 +117,28 @@ class DatabaseQueries {
// Custom ID accumulators. // Custom ID accumulators.
static QStringList bagOfMessages(const QSqlDatabase& db, ServiceRoot::BagOfMessages bag, const Feed* feed); static QStringList bagOfMessages(const QSqlDatabase& db, ServiceRoot::BagOfMessages bag, const Feed* feed);
static QHash<QString, QStringList> bagsOfMessages(const QSqlDatabase& db, const QList<Label*>& labels); static QHash<QString, QStringList> bagsOfMessages(const QSqlDatabase& db, const QList<Label*>& labels);
static QStringList customIdsOfMessagesFromLabel(const QSqlDatabase& db, Label* label, bool* ok = nullptr); static QStringList customIdsOfMessagesFromLabel(const QSqlDatabase& db,
static QStringList customIdsOfImportantMessages(const QSqlDatabase& db, int account_id, bool* ok = nullptr); Label* label,
static QStringList customIdsOfUnreadMessages(const QSqlDatabase& db, int account_id, bool* ok = nullptr); RootItem::ReadStatus target_read,
static QStringList customIdsOfMessagesFromAccount(const QSqlDatabase& db, int account_id, bool* ok = nullptr); bool* ok = nullptr);
static QStringList customIdsOfMessagesFromBin(const QSqlDatabase& db, int account_id, bool* ok = nullptr); static QStringList customIdsOfImportantMessages(const QSqlDatabase& db,
RootItem::ReadStatus target_read,
int account_id,
bool* ok = nullptr);
static QStringList customIdsOfUnreadMessages(const QSqlDatabase& db,
int account_id,
bool* ok = nullptr);
static QStringList customIdsOfMessagesFromAccount(const QSqlDatabase& db,
RootItem::ReadStatus target_read,
int account_id,
bool* ok = nullptr);
static QStringList customIdsOfMessagesFromBin(const QSqlDatabase& db,
RootItem::ReadStatus target_read,
int account_id,
bool* ok = nullptr);
static QStringList customIdsOfMessagesFromFeed(const QSqlDatabase& db, static QStringList customIdsOfMessagesFromFeed(const QSqlDatabase& db,
const QString& feed_custom_id, const QString& feed_custom_id,
RootItem::ReadStatus target_read,
int account_id, int account_id,
bool* ok = nullptr); bool* ok = nullptr);
@ -136,7 +151,7 @@ class DatabaseQueries {
static void createOverwriteAccount(const QSqlDatabase& db, ServiceRoot* account); static void createOverwriteAccount(const QSqlDatabase& db, ServiceRoot* account);
// Returns counts of updated messages <unread, all>. // Returns counts of updated messages <unread, all>.
static QPair<int, int> updateMessages(const QSqlDatabase &db, static QPair<int, int> updateMessages(const QSqlDatabase& db,
QList<Message>& messages, QList<Message>& messages,
Feed* feed, Feed* feed,
bool force_update, bool force_update,

View File

@ -22,7 +22,8 @@
#include <QMetaObject> #include <QMetaObject>
#include <QStyleFactory> #include <QStyleFactory>
SettingsGui::SettingsGui(Settings* settings, QWidget* parent) : SettingsPanel(settings, parent), m_ui(new Ui::SettingsGui) { SettingsGui::SettingsGui(Settings* settings, QWidget* parent)
: SettingsPanel(settings, parent), m_ui(new Ui::SettingsGui) {
m_ui->setupUi(this); m_ui->setupUi(this);
m_ui->m_editorMessagesToolbar->activeItemsWidget()->viewport()->installEventFilter(this); m_ui->m_editorMessagesToolbar->activeItemsWidget()->viewport()->installEventFilter(this);
m_ui->m_editorFeedsToolbar->activeItemsWidget()->viewport()->installEventFilter(this); m_ui->m_editorFeedsToolbar->activeItemsWidget()->viewport()->installEventFilter(this);
@ -30,7 +31,7 @@ SettingsGui::SettingsGui(Settings* settings, QWidget* parent) : SettingsPanel(se
m_ui->m_editorFeedsToolbar->availableItemsWidget()->viewport()->installEventFilter(this); m_ui->m_editorFeedsToolbar->availableItemsWidget()->viewport()->installEventFilter(this);
m_ui->m_treeSkins->setColumnCount(4); m_ui->m_treeSkins->setColumnCount(4);
m_ui->m_treeSkins->setHeaderHidden(false); m_ui->m_treeSkins->setHeaderHidden(false);
m_ui->m_treeSkins->setHeaderLabels({ tr("Name"), tr("Author"), tr("Forced style"), tr("Forced skin colors") }); m_ui->m_treeSkins->setHeaderLabels({tr("Name"), tr("Author"), tr("Forced style"), tr("Forced skin colors")});
m_ui->m_tabUi->setTabVisible(m_ui->m_tabUi->indexOf(m_ui->m_tabTaskBar), m_ui->m_tabUi->setTabVisible(m_ui->m_tabUi->indexOf(m_ui->m_tabTaskBar),
#if (defined(Q_OS_UNIX) && !defined(Q_OS_MACOS)) || defined(Q_OS_WIN) #if (defined(Q_OS_UNIX) && !defined(Q_OS_MACOS)) || defined(Q_OS_WIN)
@ -40,7 +41,8 @@ SettingsGui::SettingsGui(Settings* settings, QWidget* parent) : SettingsPanel(se
#endif #endif
m_ui->m_helpCustomSkinColors->setHelpText(tr("You can override some colors defined by your skin here. " m_ui->m_helpCustomSkinColors->setHelpText(tr("You can override some colors defined by your skin here. "
"Some colors are used dynamically throughout the application."), false); "Some colors are used dynamically throughout the application."),
false);
// Setup skins. // Setup skins.
m_ui->m_treeSkins->header()->setSectionResizeMode(0, QHeaderView::ResizeMode::ResizeToContents); m_ui->m_treeSkins->header()->setSectionResizeMode(0, QHeaderView::ResizeMode::ResizeToContents);
@ -50,9 +52,13 @@ SettingsGui::SettingsGui(Settings* settings, QWidget* parent) : SettingsPanel(se
connect(m_ui->m_cmbStyles, &QComboBox::currentTextChanged, this, &SettingsGui::updateSkinOptions); connect(m_ui->m_cmbStyles, &QComboBox::currentTextChanged, this, &SettingsGui::updateSkinOptions);
connect(m_ui->m_cmbIconTheme, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), connect(m_ui->m_cmbIconTheme,
this, &SettingsGui::requireRestart); static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
connect(m_ui->m_cmbIconTheme, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this, this,
&SettingsGui::requireRestart);
connect(m_ui->m_cmbIconTheme,
static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
this,
&SettingsGui::dirtifySettings); &SettingsGui::dirtifySettings);
connect(m_ui->m_treeSkins, &QTreeWidget::currentItemChanged, this, &SettingsGui::dirtifySettings); connect(m_ui->m_treeSkins, &QTreeWidget::currentItemChanged, this, &SettingsGui::dirtifySettings);
connect(m_ui->m_treeSkins, &QTreeWidget::currentItemChanged, this, &SettingsGui::updateSkinOptions); connect(m_ui->m_treeSkins, &QTreeWidget::currentItemChanged, this, &SettingsGui::updateSkinOptions);
@ -68,17 +74,27 @@ SettingsGui::SettingsGui(Settings* settings, QWidget* parent) : SettingsPanel(se
connect(m_ui->m_checkCloseTabsMiddleClick, &QCheckBox::toggled, this, &SettingsGui::dirtifySettings); connect(m_ui->m_checkCloseTabsMiddleClick, &QCheckBox::toggled, this, &SettingsGui::dirtifySettings);
connect(m_ui->m_checkNewTabDoubleClick, &QCheckBox::toggled, this, &SettingsGui::dirtifySettings); connect(m_ui->m_checkNewTabDoubleClick, &QCheckBox::toggled, this, &SettingsGui::dirtifySettings);
connect(m_ui->m_grbCloseTabs, &QGroupBox::toggled, this, &SettingsGui::dirtifySettings); connect(m_ui->m_grbCloseTabs, &QGroupBox::toggled, this, &SettingsGui::dirtifySettings);
connect(m_ui->m_cmbToolbarButtonStyle, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this, connect(m_ui->m_cmbToolbarButtonStyle,
static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
this,
&SettingsGui::dirtifySettings); &SettingsGui::dirtifySettings);
connect(m_ui->m_editorFeedsToolbar, &ToolBarEditor::setupChanged, this, &SettingsGui::dirtifySettings); connect(m_ui->m_editorFeedsToolbar, &ToolBarEditor::setupChanged, this, &SettingsGui::dirtifySettings);
connect(m_ui->m_editorMessagesToolbar, &ToolBarEditor::setupChanged, this, &SettingsGui::dirtifySettings); connect(m_ui->m_editorMessagesToolbar, &ToolBarEditor::setupChanged, this, &SettingsGui::dirtifySettings);
connect(m_ui->m_editorStatusbar, &ToolBarEditor::setupChanged, this, &SettingsGui::dirtifySettings); connect(m_ui->m_editorStatusbar, &ToolBarEditor::setupChanged, this, &SettingsGui::dirtifySettings);
connect(m_ui->m_editorStatusbar, &ToolBarEditor::setupChanged, this, &SettingsGui::requireRestart); connect(m_ui->m_editorStatusbar, &ToolBarEditor::setupChanged, this, &SettingsGui::requireRestart);
connect(m_ui->m_cmbStyles, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this, &SettingsGui::dirtifySettings); connect(m_ui->m_cmbStyles,
connect(m_ui->m_cmbSelectToolBar, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), m_ui->m_stackedToolbars, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
this,
&SettingsGui::dirtifySettings);
connect(m_ui->m_cmbSelectToolBar,
static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
m_ui->m_stackedToolbars,
&QStackedWidget::setCurrentIndex); &QStackedWidget::setCurrentIndex);
connect(m_ui->m_gbCustomSkinColors, &QGroupBox::toggled, this, &SettingsGui::dirtifySettings); connect(m_ui->m_gbCustomSkinColors, &QGroupBox::toggled, this, &SettingsGui::dirtifySettings);
connect(m_ui->m_spinToolbarIconSize, QOverload<int>::of(&QSpinBox::valueChanged), this, &SettingsGui::dirtifySettings); connect(m_ui->m_spinToolbarIconSize,
QOverload<int>::of(&QSpinBox::valueChanged),
this,
&SettingsGui::dirtifySettings);
connect(m_ui->m_displayUnreadMessageCountOnTaskBar, &QCheckBox::toggled, this, &SettingsGui::dirtifySettings); connect(m_ui->m_displayUnreadMessageCountOnTaskBar, &QCheckBox::toggled, this, &SettingsGui::dirtifySettings);
connect(m_ui->m_spinToolbarIconSize, QOverload<int>::of(&QSpinBox::valueChanged), this, [=](int value) { connect(m_ui->m_spinToolbarIconSize, QOverload<int>::of(&QSpinBox::valueChanged), this, [=](int value) {
@ -137,12 +153,14 @@ void SettingsGui::loadSettings() {
m_ui->m_grpTray->setChecked(settings()->value(GROUP(GUI), SETTING(GUI::UseTrayIcon)).toBool()); m_ui->m_grpTray->setChecked(settings()->value(GROUP(GUI), SETTING(GUI::UseTrayIcon)).toBool());
if (!SystemTrayIcon::isSystemTrayAreaAvailable()) { if (!SystemTrayIcon::isSystemTrayAreaAvailable()) {
m_ui->m_grpTray->setTitle(m_ui->m_grpTray->title() + QL1C(' ') + tr("(Your OS does not support tray icons at the moment.)")); m_ui->m_grpTray->setTitle(m_ui->m_grpTray->title() + QL1C(' ') +
tr("(Your OS does not support tray icons at the moment.)"));
m_ui->m_grpTray->setEnabled(false); m_ui->m_grpTray->setEnabled(false);
} }
m_ui->m_checkHidden->setChecked(settings()->value(GROUP(GUI), SETTING(GUI::MainWindowStartsHidden)).toBool()); m_ui->m_checkHidden->setChecked(settings()->value(GROUP(GUI), SETTING(GUI::MainWindowStartsHidden)).toBool());
m_ui->m_checkHideWhenMinimized->setChecked(settings()->value(GROUP(GUI), SETTING(GUI::HideMainWindowWhenMinimized)).toBool()); m_ui->m_checkHideWhenMinimized
->setChecked(settings()->value(GROUP(GUI), SETTING(GUI::HideMainWindowWhenMinimized)).toBool());
// Load settings of icon theme. // Load settings of icon theme.
const QString current_theme = qApp->icons()->currentIconTheme(); const QString current_theme = qApp->icons()->currentIconTheme();
@ -164,10 +182,12 @@ void SettingsGui::loadSettings() {
} }
m_ui->m_checkMonochromeIcons->setChecked(settings()->value(GROUP(GUI), SETTING(GUI::MonochromeTrayIcon)).toBool()); m_ui->m_checkMonochromeIcons->setChecked(settings()->value(GROUP(GUI), SETTING(GUI::MonochromeTrayIcon)).toBool());
m_ui->m_checkCountUnreadMessages->setChecked(settings()->value(GROUP(GUI), SETTING(GUI::UnreadNumbersInTrayIcon)).toBool()); m_ui->m_checkCountUnreadMessages
->setChecked(settings()->value(GROUP(GUI), SETTING(GUI::UnreadNumbersInTrayIcon)).toBool());
#if (defined(Q_OS_UNIX) && !defined(Q_OS_MACOS)) || defined(Q_OS_WIN) #if (defined(Q_OS_UNIX) && !defined(Q_OS_MACOS)) || defined(Q_OS_WIN)
m_ui->m_displayUnreadMessageCountOnTaskBar->setChecked(settings()->value(GROUP(GUI), SETTING(GUI::UnreadNumbersOnTaskBar)).toBool()); m_ui->m_displayUnreadMessageCountOnTaskBar
->setChecked(settings()->value(GROUP(GUI), SETTING(GUI::UnreadNumbersOnTaskBar)).toBool());
#endif #endif
// Mark active icon theme. // Mark active icon theme.
@ -192,24 +212,27 @@ void SettingsGui::loadSettings() {
m_ui->m_cmbStyles->setCurrentIndex(item_style); m_ui->m_cmbStyles->setCurrentIndex(item_style);
} }
m_ui->m_checkForceAlternativePalette->setChecked(settings()->value(GROUP(GUI), SETTING(GUI::ForcedSkinColors)).toBool()); m_ui->m_checkForceAlternativePalette
->setChecked(settings()->value(GROUP(GUI), SETTING(GUI::ForcedSkinColors)).toBool());
// Load skin. // Load skin.
const QString selected_skin = qApp->skins()->selectedSkinName(); const QString selected_skin = qApp->skins()->selectedSkinName();
auto skins = qApp->skins()->installedSkins(); auto skins = qApp->skins()->installedSkins();
for (const Skin& skin : qAsConst(skins)) { for (const Skin& skin : qAsConst(skins)) {
QTreeWidgetItem* new_item = new QTreeWidgetItem({ QTreeWidgetItem* new_item =
skin.m_visibleName, new QTreeWidgetItem({skin.m_visibleName,
skin.m_author, skin.m_author,
skin.m_forcedStyles.isEmpty() ? QString() : skin.m_forcedStyles.join(QSL(", ")), skin.m_forcedStyles.isEmpty() ? QString() : skin.m_forcedStyles.join(QSL(", ")),
QString() }); QString()});
new_item->setToolTip(0, tr("%1\n\n" new_item->setToolTip(0,
"Version: %2\n" tr("%1\n\n"
"Description: %3").arg(skin.m_visibleName, "Version: %2\n"
skin.m_version, "Description: %3")
skin.m_description.isEmpty() ? QSL("-") : skin.m_description)); .arg(skin.m_visibleName,
skin.m_version,
skin.m_description.isEmpty() ? QSL("-") : skin.m_description));
for (int i = 1; i < m_ui->m_treeSkins->columnCount(); i++) { for (int i = 1; i < m_ui->m_treeSkins->columnCount(); i++) {
new_item->setToolTip(i, new_item->toolTip(0)); new_item->setToolTip(i, new_item->toolTip(0));
@ -219,9 +242,9 @@ void SettingsGui::loadSettings() {
new_item->setIcon(2, qApp->icons()->fromTheme(QSL("dialog-cancel"), QSL("gtk-cancel"))); new_item->setIcon(2, qApp->icons()->fromTheme(QSL("dialog-cancel"), QSL("gtk-cancel")));
} }
new_item->setIcon(3, skin.m_forcedSkinColors new_item->setIcon(3,
? qApp->icons()->fromTheme(QSL("dialog-yes"), QSL("dialog-ok")) skin.m_forcedSkinColors ? qApp->icons()->fromTheme(QSL("dialog-yes"), QSL("dialog-ok"))
: qApp->icons()->fromTheme(QSL("dialog-cancel"), QSL("gtk-cancel"))); : qApp->icons()->fromTheme(QSL("dialog-cancel"), QSL("gtk-cancel")));
new_item->setData(0, Qt::UserRole, QVariant::fromValue(skin)); new_item->setData(0, Qt::UserRole, QVariant::fromValue(skin));
@ -233,18 +256,20 @@ void SettingsGui::loadSettings() {
} }
} }
if (m_ui->m_treeSkins->currentItem() == nullptr && if (m_ui->m_treeSkins->currentItem() == nullptr && m_ui->m_treeSkins->topLevelItemCount() > 0) {
m_ui->m_treeSkins->topLevelItemCount() > 0) {
// Currently active skin is NOT available, select another one as selected // Currently active skin is NOT available, select another one as selected
// if possible. // if possible.
m_ui->m_treeSkins->setCurrentItem(m_ui->m_treeSkins->topLevelItem(0)); m_ui->m_treeSkins->setCurrentItem(m_ui->m_treeSkins->topLevelItem(0));
} }
// Load tab settings. // Load tab settings.
m_ui->m_checkCloseTabsMiddleClick->setChecked(settings()->value(GROUP(GUI), SETTING(GUI::TabCloseMiddleClick)).toBool()); m_ui->m_checkCloseTabsMiddleClick
m_ui->m_checkCloseTabsDoubleClick->setChecked(settings()->value(GROUP(GUI), SETTING(GUI::TabCloseDoubleClick)).toBool()); ->setChecked(settings()->value(GROUP(GUI), SETTING(GUI::TabCloseMiddleClick)).toBool());
m_ui->m_checkCloseTabsDoubleClick
->setChecked(settings()->value(GROUP(GUI), SETTING(GUI::TabCloseDoubleClick)).toBool());
m_ui->m_checkNewTabDoubleClick->setChecked(settings()->value(GROUP(GUI), SETTING(GUI::TabNewDoubleClick)).toBool()); m_ui->m_checkNewTabDoubleClick->setChecked(settings()->value(GROUP(GUI), SETTING(GUI::TabNewDoubleClick)).toBool());
m_ui->m_checkHideTabBarIfOneTabVisible->setChecked(settings()->value(GROUP(GUI), SETTING(GUI::HideTabBarIfOnlyOneTab)).toBool()); m_ui->m_checkHideTabBarIfOneTabVisible
->setChecked(settings()->value(GROUP(GUI), SETTING(GUI::HideTabBarIfOnlyOneTab)).toBool());
// Load toolbar button style. // Load toolbar button style.
m_ui->m_spinToolbarIconSize->setValue(settings()->value(GROUP(GUI), SETTING(GUI::ToolbarIconSize)).toInt()); m_ui->m_spinToolbarIconSize->setValue(settings()->value(GROUP(GUI), SETTING(GUI::ToolbarIconSize)).toInt());
@ -253,9 +278,9 @@ void SettingsGui::loadSettings() {
m_ui->m_cmbToolbarButtonStyle->addItem(tr("Text beside icon"), Qt::ToolButtonStyle::ToolButtonTextBesideIcon); m_ui->m_cmbToolbarButtonStyle->addItem(tr("Text beside icon"), Qt::ToolButtonStyle::ToolButtonTextBesideIcon);
m_ui->m_cmbToolbarButtonStyle->addItem(tr("Text under icon"), Qt::ToolButtonStyle::ToolButtonTextUnderIcon); m_ui->m_cmbToolbarButtonStyle->addItem(tr("Text under icon"), Qt::ToolButtonStyle::ToolButtonTextUnderIcon);
m_ui->m_cmbToolbarButtonStyle->addItem(tr("Follow OS style"), Qt::ToolButtonStyle::ToolButtonFollowStyle); m_ui->m_cmbToolbarButtonStyle->addItem(tr("Follow OS style"), Qt::ToolButtonStyle::ToolButtonFollowStyle);
m_ui->m_cmbToolbarButtonStyle->setCurrentIndex(m_ui->m_cmbToolbarButtonStyle->findData(settings()->value(GROUP(GUI), m_ui->m_cmbToolbarButtonStyle
SETTING( ->setCurrentIndex(m_ui->m_cmbToolbarButtonStyle
GUI::ToolbarStyle)).toInt())); ->findData(settings()->value(GROUP(GUI), SETTING(GUI::ToolbarStyle)).toInt()));
// Load toolbars. // Load toolbars.
m_ui->m_editorFeedsToolbar->loadFromToolBar(qApp->mainForm()->tabWidget()->feedMessageViewer()->feedsToolBar()); m_ui->m_editorFeedsToolbar->loadFromToolBar(qApp->mainForm()->tabWidget()->feedMessageViewer()->feedsToolBar());
@ -263,8 +288,8 @@ void SettingsGui::loadSettings() {
m_ui->m_editorStatusbar->loadFromToolBar(qApp->mainForm()->statusBar()); m_ui->m_editorStatusbar->loadFromToolBar(qApp->mainForm()->statusBar());
// Load custom colors. // Load custom colors.
m_ui->m_gbCustomSkinColors->setChecked(settings()->value(GROUP(CustomSkinColors), m_ui->m_gbCustomSkinColors
SETTING(CustomSkinColors::Enabled)).toBool()); ->setChecked(settings()->value(GROUP(CustomSkinColors), SETTING(CustomSkinColors::Enabled)).toBool());
const QMetaObject& mo = SkinEnums::staticMetaObject; const QMetaObject& mo = SkinEnums::staticMetaObject;
QMetaEnum enumer = mo.enumerator(mo.indexOfEnumerator(QSL("PaletteColors").toLocal8Bit().constData())); QMetaEnum enumer = mo.enumerator(mo.indexOfEnumerator(QSL("PaletteColors").toLocal8Bit().constData()));
@ -297,14 +322,14 @@ void SettingsGui::loadSettings() {
lay->addWidget(clr_btn); lay->addWidget(clr_btn);
lay->addWidget(rst_btn); lay->addWidget(rst_btn);
m_ui->m_layoutCustomColors->setWidget(row, m_ui->m_layoutCustomColors
QFormLayout::ItemRole::LabelRole, ->setWidget(row,
new QLabel( QFormLayout::ItemRole::LabelRole,
TextFactory::capitalizeFirstLetter(SkinEnums::palleteColorText(SkinEnums::PaletteColors(enumer.value(i)))), new QLabel(TextFactory::
this)); capitalizeFirstLetter(SkinEnums::
m_ui->m_layoutCustomColors->setLayout(row, palleteColorText(SkinEnums::PaletteColors(enumer.value(i)))),
QFormLayout::ItemRole::FieldRole, this));
lay); m_ui->m_layoutCustomColors->setLayout(row, QFormLayout::ItemRole::FieldRole, lay);
} }
onEndLoadSettings(); onEndLoadSettings();
@ -328,15 +353,13 @@ void SettingsGui::saveSettings() {
auto children = m_ui->m_gbCustomSkinColors->findChildren<ColorToolButton*>(); auto children = m_ui->m_gbCustomSkinColors->findChildren<ColorToolButton*>();
for (const ColorToolButton* clr : children) { for (const ColorToolButton* clr : children) {
settings()->setValue(GROUP(CustomSkinColors), settings()->setValue(GROUP(CustomSkinColors), enumer.valueToKey(clr->objectName().toInt()), clr->color().name());
enumer.valueToKey(clr->objectName().toInt()),
clr->color().name());
} }
// Save toolbar. // Save toolbar.
settings()->setValue(GROUP(GUI), GUI::ToolbarIconSize, m_ui->m_spinToolbarIconSize->value()); settings()->setValue(GROUP(GUI), GUI::ToolbarIconSize, m_ui->m_spinToolbarIconSize->value());
settings()->setValue(GROUP(GUI),
settings()->setValue(GROUP(GUI), GUI::ToolbarStyle, GUI::ToolbarStyle,
m_ui->m_cmbToolbarButtonStyle->itemData(m_ui->m_cmbToolbarButtonStyle->currentIndex())); m_ui->m_cmbToolbarButtonStyle->itemData(m_ui->m_cmbToolbarButtonStyle->currentIndex()));
// Save tray icon. // Save tray icon.
@ -363,7 +386,9 @@ void SettingsGui::saveSettings() {
settings()->setValue(GROUP(GUI), GUI::HideMainWindowWhenMinimized, m_ui->m_checkHideWhenMinimized->isChecked()); settings()->setValue(GROUP(GUI), GUI::HideMainWindowWhenMinimized, m_ui->m_checkHideWhenMinimized->isChecked());
#if (defined(Q_OS_UNIX) && !defined(Q_OS_MACOS)) || defined(Q_OS_WIN) #if (defined(Q_OS_UNIX) && !defined(Q_OS_MACOS)) || defined(Q_OS_WIN)
settings()->setValue(GROUP(GUI), GUI::UnreadNumbersOnTaskBar, m_ui->m_displayUnreadMessageCountOnTaskBar->isChecked()); settings()->setValue(GROUP(GUI),
GUI::UnreadNumbersOnTaskBar,
m_ui->m_displayUnreadMessageCountOnTaskBar->isChecked());
#endif #endif
// Make sure that number of unread messages is shown in tray icon as requested. // Make sure that number of unread messages is shown in tray icon as requested.

View File

@ -182,6 +182,7 @@ void MessagesToolBar::addActionToMenu(QMenu* menu,
void MessagesToolBar::initializeHighlighter() { void MessagesToolBar::initializeHighlighter() {
m_menuMessageHighlighter = new QMenu(tr("Menu for highlighting articles"), this); m_menuMessageHighlighter = new QMenu(tr("Menu for highlighting articles"), this);
addActionToMenu(m_menuMessageHighlighter, addActionToMenu(m_menuMessageHighlighter,
qApp->icons()->fromTheme(QSL("mail-mark-read")), qApp->icons()->fromTheme(QSL("mail-mark-read")),
tr("No extra highlighting"), tr("No extra highlighting"),
@ -199,6 +200,7 @@ void MessagesToolBar::initializeHighlighter() {
"highlight_important"); "highlight_important");
m_menuMessageFilter = new QMenu(tr("Menu for filtering articles"), this); m_menuMessageFilter = new QMenu(tr("Menu for filtering articles"), this);
addActionToMenu(m_menuMessageFilter, addActionToMenu(m_menuMessageFilter,
qApp->icons()->fromTheme(QSL("mail-mark-read")), qApp->icons()->fromTheme(QSL("mail-mark-read")),
tr("No extra filtering"), tr("No extra filtering"),
@ -261,17 +263,20 @@ void MessagesToolBar::initializeHighlighter() {
m_btnMessageHighlighter->setPopupMode(QToolButton::ToolButtonPopupMode::MenuButtonPopup); m_btnMessageHighlighter->setPopupMode(QToolButton::ToolButtonPopupMode::MenuButtonPopup);
m_btnMessageHighlighter->setIcon(qApp->icons()->fromTheme(QSL("mail-mark-read"))); m_btnMessageHighlighter->setIcon(qApp->icons()->fromTheme(QSL("mail-mark-read")));
m_btnMessageHighlighter->setDefaultAction(m_menuMessageHighlighter->actions().constFirst()); m_btnMessageHighlighter->setDefaultAction(m_menuMessageHighlighter->actions().constFirst());
m_btnMessageFilter = new QToolButton(this); m_btnMessageFilter = new QToolButton(this);
m_btnMessageFilter->setToolTip(tr("Display all articles")); m_btnMessageFilter->setToolTip(tr("Display all articles"));
m_btnMessageFilter->setMenu(m_menuMessageFilter); m_btnMessageFilter->setMenu(m_menuMessageFilter);
m_btnMessageFilter->setPopupMode(QToolButton::ToolButtonPopupMode::MenuButtonPopup); m_btnMessageFilter->setPopupMode(QToolButton::ToolButtonPopupMode::MenuButtonPopup);
m_btnMessageFilter->setIcon(qApp->icons()->fromTheme(QSL("mail-mark-read"))); m_btnMessageFilter->setIcon(qApp->icons()->fromTheme(QSL("mail-mark-read")));
m_btnMessageFilter->setDefaultAction(m_menuMessageFilter->actions().constFirst()); m_btnMessageFilter->setDefaultAction(m_menuMessageFilter->actions().constFirst());
m_actionMessageHighlighter = new QWidgetAction(this); m_actionMessageHighlighter = new QWidgetAction(this);
m_actionMessageHighlighter->setDefaultWidget(m_btnMessageHighlighter); m_actionMessageHighlighter->setDefaultWidget(m_btnMessageHighlighter);
m_actionMessageHighlighter->setIcon(m_btnMessageHighlighter->icon()); m_actionMessageHighlighter->setIcon(m_btnMessageHighlighter->icon());
m_actionMessageHighlighter->setProperty("type", HIGHLIGHTER_ACTION_NAME); m_actionMessageHighlighter->setProperty("type", HIGHLIGHTER_ACTION_NAME);
m_actionMessageHighlighter->setProperty("name", tr("Article highlighter")); m_actionMessageHighlighter->setProperty("name", tr("Article highlighter"));
m_actionMessageFilter = new QWidgetAction(this); m_actionMessageFilter = new QWidgetAction(this);
m_actionMessageFilter->setDefaultWidget(m_btnMessageFilter); m_actionMessageFilter->setDefaultWidget(m_btnMessageFilter);
m_actionMessageFilter->setIcon(m_btnMessageFilter->icon()); m_actionMessageFilter->setIcon(m_btnMessageFilter->icon());
@ -280,6 +285,11 @@ void MessagesToolBar::initializeHighlighter() {
connect(m_menuMessageHighlighter, &QMenu::triggered, this, &MessagesToolBar::handleMessageHighlighterChange); connect(m_menuMessageHighlighter, &QMenu::triggered, this, &MessagesToolBar::handleMessageHighlighterChange);
connect(m_menuMessageFilter, &QMenu::triggered, this, &MessagesToolBar::handleMessageFilterChange); connect(m_menuMessageFilter, &QMenu::triggered, this, &MessagesToolBar::handleMessageFilterChange);
connect(this, &MessagesToolBar::toolButtonStyleChanged, this, [=](Qt::ToolButtonStyle style) {
m_btnMessageHighlighter->setToolButtonStyle(style);
m_btnMessageFilter->setToolButtonStyle(style);
});
} }
void MessagesToolBar::saveToolButtonSelection(const QString& button_name, const QList<QAction*>& actions) const { void MessagesToolBar::saveToolButtonSelection(const QString& button_name, const QList<QAction*>& actions) const {

View File

@ -17,6 +17,10 @@ CacheForServiceRoot::~CacheForServiceRoot() {}
void CacheForServiceRoot::addLabelsAssignmentsToCache(const QStringList& ids_of_messages, void CacheForServiceRoot::addLabelsAssignmentsToCache(const QStringList& ids_of_messages,
const QString& lbl_custom_id, const QString& lbl_custom_id,
bool assign) { bool assign) {
if (ids_of_messages.isEmpty()) {
return;
}
if (assign) { if (assign) {
for (const QString& custom_id : ids_of_messages) { for (const QString& custom_id : ids_of_messages) {
if (m_cachedLabelDeassignments[lbl_custom_id].contains(custom_id)) { if (m_cachedLabelDeassignments[lbl_custom_id].contains(custom_id)) {
@ -51,12 +55,17 @@ void CacheForServiceRoot::addLabelsAssignmentsToCache(const QList<Message>& ids_
addLabelsAssignmentsToCache(custom_ids, lbl->customId(), assign); addLabelsAssignmentsToCache(custom_ids, lbl->customId(), assign);
} }
void CacheForServiceRoot::addMessageStatesToCache(const QList<Message>& ids_of_messages, RootItem::Importance importance) { void CacheForServiceRoot::addMessageStatesToCache(const QList<Message>& ids_of_messages,
RootItem::Importance importance) {
if (ids_of_messages.isEmpty()) {
return;
}
QMutexLocker lck(m_cacheSaveMutex.data()); QMutexLocker lck(m_cacheSaveMutex.data());
QList<Message>& list_act = m_cachedStatesImportant[importance]; QList<Message>& list_act = m_cachedStatesImportant[importance];
QList<Message>& list_other = m_cachedStatesImportant[importance == RootItem::Importance::Important QList<Message>& list_other =
? RootItem::Importance::NotImportant m_cachedStatesImportant[importance == RootItem::Importance::Important ? RootItem::Importance::NotImportant
: RootItem::Importance::Important]; : RootItem::Importance::Important];
// Store changes, they will be sent to server later. // Store changes, they will be sent to server later.
list_act.append(ids_of_messages); list_act.append(ids_of_messages);
@ -80,11 +89,14 @@ void CacheForServiceRoot::addMessageStatesToCache(const QList<Message>& ids_of_m
} }
void CacheForServiceRoot::addMessageStatesToCache(const QStringList& ids_of_messages, RootItem::ReadStatus read) { void CacheForServiceRoot::addMessageStatesToCache(const QStringList& ids_of_messages, RootItem::ReadStatus read) {
if (ids_of_messages.isEmpty()) {
return;
}
QMutexLocker lck(m_cacheSaveMutex.data()); QMutexLocker lck(m_cacheSaveMutex.data());
QStringList& list_act = m_cachedStatesRead[read]; QStringList& list_act = m_cachedStatesRead[read];
QStringList& list_other = m_cachedStatesRead[read == RootItem::ReadStatus::Read QStringList& list_other =
? RootItem::ReadStatus::Unread m_cachedStatesRead[read == RootItem::ReadStatus::Read ? RootItem::ReadStatus::Unread : RootItem::ReadStatus::Read];
: RootItem::ReadStatus::Read];
// Store changes, they will be sent to server later. // Store changes, they will be sent to server later.
list_act.append(ids_of_messages); list_act.append(ids_of_messages);
@ -109,7 +121,8 @@ void CacheForServiceRoot::addMessageStatesToCache(const QStringList& ids_of_mess
void CacheForServiceRoot::saveCacheToFile() { void CacheForServiceRoot::saveCacheToFile() {
// Save to file. // Save to file.
const QString file_cache = qApp->userDataFolder() + QDir::separator() + QString::number(m_uniqueId) + "-cached-msgs.dat"; const QString file_cache =
qApp->userDataFolder() + QDir::separator() + QString::number(m_uniqueId) + "-cached-msgs.dat";
if (isEmpty()) { if (isEmpty()) {
QFile::remove(file_cache); QFile::remove(file_cache);
@ -140,7 +153,8 @@ void CacheForServiceRoot::loadCacheFromFile() {
clearCache(); clearCache();
// Load from file. // Load from file.
const QString file_cache = qApp->userDataFolder() + QDir::separator() + QString::number(m_uniqueId) + "-cached-msgs.dat"; const QString file_cache =
qApp->userDataFolder() + QDir::separator() + QString::number(m_uniqueId) + "-cached-msgs.dat";
QFile file(file_cache); QFile file(file_cache);
if (file.exists()) { if (file.exists()) {
@ -189,6 +203,6 @@ CacheSnapshot CacheForServiceRoot::takeMessageCache() {
} }
bool CacheForServiceRoot::isEmpty() const { bool CacheForServiceRoot::isEmpty() const {
return m_cachedStatesRead.isEmpty() && m_cachedStatesImportant.isEmpty() && return m_cachedStatesRead.isEmpty() && m_cachedStatesImportant.isEmpty() && m_cachedLabelAssignments.isEmpty() &&
m_cachedLabelAssignments.isEmpty() && m_cachedLabelDeassignments.isEmpty(); m_cachedLabelDeassignments.isEmpty();
} }

View File

@ -37,11 +37,12 @@ void Category::updateCounts(bool including_total_count) {
QSqlDatabase database = qApp->database()->driver()->connection(metaObject()->className()); QSqlDatabase database = qApp->database()->driver()->connection(metaObject()->className());
bool ok; bool ok;
QMap<QString, QPair<int, int>> counts = DatabaseQueries::getMessageCountsForCategory(database, QMap<QString, QPair<int, int>> counts =
customId(), DatabaseQueries::getMessageCountsForCategory(database,
getParentServiceRoot()->accountId(), customId(),
including_total_count, getParentServiceRoot()->accountId(),
&ok); including_total_count,
&ok);
if (ok) { if (ok) {
for (Feed* feed : feeds) { for (Feed* feed : feeds) {
@ -65,7 +66,7 @@ bool Category::markAsReadUnread(RootItem::ReadStatus status) {
auto* cache = dynamic_cast<CacheForServiceRoot*>(service); auto* cache = dynamic_cast<CacheForServiceRoot*>(service);
if (cache != nullptr) { if (cache != nullptr) {
cache->addMessageStatesToCache(service->customIDSOfMessagesForItem(this), status); cache->addMessageStatesToCache(service->customIDSOfMessagesForItem(this, status), status);
} }
return service->markFeedsReadUnread(getSubTreeFeeds(), status); return service->markFeedsReadUnread(getSubTreeFeeds(), status);

View File

@ -213,10 +213,10 @@ bool Feed::markAsReadUnread(RootItem::ReadStatus status) {
auto* cache = dynamic_cast<CacheForServiceRoot*>(service); auto* cache = dynamic_cast<CacheForServiceRoot*>(service);
if (cache != nullptr) { if (cache != nullptr) {
cache->addMessageStatesToCache(service->customIDSOfMessagesForItem(this), status); cache->addMessageStatesToCache(service->customIDSOfMessagesForItem(this, status), status);
} }
return service->markFeedsReadUnread(QList<Feed*>() << this, status); return service->markFeedsReadUnread({this}, status);
} }
QString Feed::getAutoUpdateStatusDescription() const { QString Feed::getAutoUpdateStatusDescription() const {

View File

@ -53,7 +53,7 @@ bool ImportantNode::markAsReadUnread(RootItem::ReadStatus status) {
auto* cache = dynamic_cast<CacheForServiceRoot*>(service); auto* cache = dynamic_cast<CacheForServiceRoot*>(service);
if (cache != nullptr) { if (cache != nullptr) {
cache->addMessageStatesToCache(service->customIDSOfMessagesForItem(this), status); cache->addMessageStatesToCache(service->customIDSOfMessagesForItem(this, status), status);
} }
QSqlDatabase database = qApp->database()->driver()->connection(metaObject()->className()); QSqlDatabase database = qApp->database()->driver()->connection(metaObject()->className());

View File

@ -153,7 +153,7 @@ bool Label::markAsReadUnread(RootItem::ReadStatus status) {
auto* cache = dynamic_cast<CacheForServiceRoot*>(service); auto* cache = dynamic_cast<CacheForServiceRoot*>(service);
if (cache != nullptr) { if (cache != nullptr) {
cache->addMessageStatesToCache(service->customIDSOfMessagesForItem(this), status); cache->addMessageStatesToCache(service->customIDSOfMessagesForItem(this, status), status);
} }
QSqlDatabase database = qApp->database()->driver()->connection(metaObject()->className()); QSqlDatabase database = qApp->database()->driver()->connection(metaObject()->className());

View File

@ -64,17 +64,17 @@ QList<Message> RecycleBin::undeletedMessages() const {
bool RecycleBin::markAsReadUnread(RootItem::ReadStatus status) { bool RecycleBin::markAsReadUnread(RootItem::ReadStatus status) {
QSqlDatabase database = qApp->database()->driver()->connection(metaObject()->className()); QSqlDatabase database = qApp->database()->driver()->connection(metaObject()->className());
ServiceRoot* parent_root = getParentServiceRoot(); ServiceRoot* service = getParentServiceRoot();
auto* cache = dynamic_cast<CacheForServiceRoot*>(parent_root); auto* cache = dynamic_cast<CacheForServiceRoot*>(service);
if (cache != nullptr) { if (cache != nullptr) {
cache->addMessageStatesToCache(parent_root->customIDSOfMessagesForItem(this), status); cache->addMessageStatesToCache(service->customIDSOfMessagesForItem(this, status), status);
} }
if (DatabaseQueries::markBinReadUnread(database, parent_root->accountId(), status)) { if (DatabaseQueries::markBinReadUnread(database, service->accountId(), status)) {
updateCounts(false); updateCounts(false);
parent_root->itemChanged(QList<RootItem*>() << this); service->itemChanged(QList<RootItem*>() << this);
parent_root->requestReloadMessageList(status == RootItem::ReadStatus::Read); service->requestReloadMessageList(status == RootItem::ReadStatus::Read);
return true; return true;
} }
else { else {

View File

@ -27,11 +27,11 @@ class RSSGUARD_DLLSPEC RootItem : public QObject {
Q_PROPERTY(QString customId READ customId) Q_PROPERTY(QString customId READ customId)
public: public:
enum class ReadStatus { Unread = 0, Read = 1 }; enum class ReadStatus { Unread = 0, Read = 1, Unknown = 256 };
// Holds statuses for messages // Holds statuses for messages
// to be switched importance (starred). // to be switched importance (starred).
enum class Importance { NotImportant = 0, Important = 1 }; enum class Importance { NotImportant = 0, Important = 1, Unknown = 256 };
// Describes the kind of the item. // Describes the kind of the item.
enum class Kind { enum class Kind {
@ -142,7 +142,7 @@ class RSSGUARD_DLLSPEC RootItem : public QObject {
QHash<int, Category*> getSubTreeCategoriesForAssemble() const; QHash<int, Category*> getSubTreeCategoriesForAssemble() const;
// Returns list of categories complemented by their own string CUSTOM ID. // Returns list of categories complemented by their own string CUSTOM ID.
QHash<QString, Category *> getHashedSubTreeCategories() const; QHash<QString, Category*> getHashedSubTreeCategories() const;
// Returns list of feeds complemented by their own string CUSTOM ID. // Returns list of feeds complemented by their own string CUSTOM ID.
QHash<QString, Feed*> getHashedSubTreeFeeds() const; QHash<QString, Feed*> getHashedSubTreeFeeds() const;

View File

@ -46,7 +46,7 @@ bool ServiceRoot::markAsReadUnread(RootItem::ReadStatus status) {
auto* cache = dynamic_cast<CacheForServiceRoot*>(this); auto* cache = dynamic_cast<CacheForServiceRoot*>(this);
if (cache != nullptr) { if (cache != nullptr) {
cache->addMessageStatesToCache(customIDSOfMessagesForItem(this), status); cache->addMessageStatesToCache(customIDSOfMessagesForItem(this, status), status);
} }
QSqlDatabase database = qApp->database()->driver()->connection(metaObject()->className()); QSqlDatabase database = qApp->database()->driver()->connection(metaObject()->className());
@ -559,7 +559,7 @@ RootItem* ServiceRoot::obtainNewTreeForSyncIn() const {
return nullptr; return nullptr;
} }
QStringList ServiceRoot::customIDSOfMessagesForItem(RootItem* item) { QStringList ServiceRoot::customIDSOfMessagesForItem(RootItem* item, ReadStatus target_read) {
if (item->getParentServiceRoot() != this) { if (item->getParentServiceRoot() != this) {
// Not item from this account. // Not item from this account.
return {}; return {};
@ -573,7 +573,7 @@ QStringList ServiceRoot::customIDSOfMessagesForItem(RootItem* item) {
auto chi = item->childItems(); auto chi = item->childItems();
for (RootItem* child : qAsConst(chi)) { for (RootItem* child : qAsConst(chi)) {
list.append(customIDSOfMessagesForItem(child)); list.append(customIDSOfMessagesForItem(child, target_read));
} }
return list; return list;
@ -582,35 +582,35 @@ QStringList ServiceRoot::customIDSOfMessagesForItem(RootItem* item) {
case RootItem::Kind::Label: { case RootItem::Kind::Label: {
QSqlDatabase database = qApp->database()->driver()->connection(metaObject()->className()); QSqlDatabase database = qApp->database()->driver()->connection(metaObject()->className());
list = DatabaseQueries::customIdsOfMessagesFromLabel(database, item->toLabel()); list = DatabaseQueries::customIdsOfMessagesFromLabel(database, item->toLabel(), target_read);
break; break;
} }
case RootItem::Kind::ServiceRoot: { case RootItem::Kind::ServiceRoot: {
QSqlDatabase database = qApp->database()->driver()->connection(metaObject()->className()); QSqlDatabase database = qApp->database()->driver()->connection(metaObject()->className());
list = DatabaseQueries::customIdsOfMessagesFromAccount(database, accountId()); list = DatabaseQueries::customIdsOfMessagesFromAccount(database, target_read, accountId());
break; break;
} }
case RootItem::Kind::Bin: { case RootItem::Kind::Bin: {
QSqlDatabase database = qApp->database()->driver()->connection(metaObject()->className()); QSqlDatabase database = qApp->database()->driver()->connection(metaObject()->className());
list = DatabaseQueries::customIdsOfMessagesFromBin(database, accountId()); list = DatabaseQueries::customIdsOfMessagesFromBin(database, target_read, accountId());
break; break;
} }
case RootItem::Kind::Feed: { case RootItem::Kind::Feed: {
QSqlDatabase database = qApp->database()->driver()->connection(metaObject()->className()); QSqlDatabase database = qApp->database()->driver()->connection(metaObject()->className());
list = DatabaseQueries::customIdsOfMessagesFromFeed(database, item->customId(), accountId()); list = DatabaseQueries::customIdsOfMessagesFromFeed(database, item->customId(), target_read, accountId());
break; break;
} }
case RootItem::Kind::Important: { case RootItem::Kind::Important: {
QSqlDatabase database = qApp->database()->driver()->connection(metaObject()->className()); QSqlDatabase database = qApp->database()->driver()->connection(metaObject()->className());
list = DatabaseQueries::customIdsOfImportantMessages(database, accountId()); list = DatabaseQueries::customIdsOfImportantMessages(database, target_read, accountId());
break; break;
} }

View File

@ -222,7 +222,15 @@ class ServiceRoot : public RootItem {
QStringList textualFeedIds(const QList<Feed*>& feeds) const; QStringList textualFeedIds(const QList<Feed*>& feeds) const;
QStringList customIDsOfMessages(const QList<ImportanceChange>& changes); QStringList customIDsOfMessages(const QList<ImportanceChange>& changes);
QStringList customIDsOfMessages(const QList<Message>& messages); QStringList customIDsOfMessages(const QList<Message>& messages);
QStringList customIDSOfMessagesForItem(RootItem* item);
// Returns list of article IDs depending on what target operation is.
// NOTE: So if we want to mark some articles as read,
// then we only return UNREAD IDs here to really return
// only IDs when the change makes sense.
// NOTE: Importance is not dealt here because it was not needed
// yet.
QStringList customIDSOfMessagesForItem(RootItem* item,
RootItem::ReadStatus target_read = RootItem::ReadStatus::Unknown);
void performInitialAssembly(const Assignment& categories, const Assignment& feeds, const QList<Label*>& labels); void performInitialAssembly(const Assignment& categories, const Assignment& feeds, const QList<Label*>& labels);

View File

@ -58,7 +58,7 @@ bool UnreadNode::markAsReadUnread(RootItem::ReadStatus status) {
auto* cache = dynamic_cast<CacheForServiceRoot*>(service); auto* cache = dynamic_cast<CacheForServiceRoot*>(service);
if (cache != nullptr) { if (cache != nullptr) {
cache->addMessageStatesToCache(service->customIDSOfMessagesForItem(this), status); cache->addMessageStatesToCache(service->customIDSOfMessagesForItem(this, status), status);
} }
QSqlDatabase database = qApp->database()->driver()->connection(metaObject()->className()); QSqlDatabase database = qApp->database()->driver()->connection(metaObject()->className());

View File

@ -152,11 +152,7 @@ void FeedlyServiceRoot::saveAllCachedData(bool ignore_errors) {
QList<Message> messages = j.value(); QList<Message> messages = j.value();
if (!messages.isEmpty()) { if (!messages.isEmpty()) {
QStringList ids; QStringList ids = customIDsOfMessages(messages);
for (const Message& msg : messages) {
ids.append(msg.m_customId);
}
try { try {
network()->markers(key == RootItem::Importance::Important ? FEEDLY_MARKERS_IMPORTANT network()->markers(key == RootItem::Importance::Important ? FEEDLY_MARKERS_IMPORTANT

View File

@ -236,12 +236,7 @@ void GmailServiceRoot::saveAllCachedData(bool ignore_errors) {
QList<Message> messages = j.value(); QList<Message> messages = j.value();
if (!messages.isEmpty()) { if (!messages.isEmpty()) {
QStringList custom_ids; QStringList custom_ids = customIDsOfMessages(messages);
custom_ids.reserve(messages.size());
for (const Message& msg : messages) {
custom_ids.append(msg.m_customId);
}
if (network()->markMessagesStarred(key, custom_ids, networkProxy()) != QNetworkReply::NetworkError::NoError && if (network()->markMessagesStarred(key, custom_ids, networkProxy()) != QNetworkReply::NetworkError::NoError &&
!ignore_errors) { !ignore_errors) {

View File

@ -201,12 +201,7 @@ void GreaderServiceRoot::saveAllCachedData(bool ignore_errors) {
QList<Message> messages = j.value(); QList<Message> messages = j.value();
if (!messages.isEmpty()) { if (!messages.isEmpty()) {
QStringList custom_ids; QStringList custom_ids = customIDsOfMessages(messages);
custom_ids.reserve(messages.size());
for (const Message& msg : messages) {
custom_ids.append(msg.m_customId);
}
if (network()->markMessagesStarred(key, custom_ids, networkProxy()) != QNetworkReply::NetworkError::NoError && if (network()->markMessagesStarred(key, custom_ids, networkProxy()) != QNetworkReply::NetworkError::NoError &&
!ignore_errors) { !ignore_errors) {