From 8bc36ccbd20ccf18264d061a8af58dd06125af3b Mon Sep 17 00:00:00 2001 From: Martin Rotter Date: Tue, 16 Jun 2020 07:15:52 +0200 Subject: [PATCH] Make show msgs unread only persistent across RSS Guard app startups. --- src/librssguard/core/messagesmodel.cpp | 5 ++++ src/librssguard/core/messagesmodel.h | 1 + src/librssguard/core/messagesmodelcache.h | 31 +++++++++++---------- src/librssguard/core/messagesproxymodel.cpp | 15 ++++++++-- src/librssguard/gui/dialogs/formmain.cpp | 7 +++-- src/librssguard/miscellaneous/settings.cpp | 3 ++ src/librssguard/miscellaneous/settings.h | 7 ++--- 7 files changed, 47 insertions(+), 22 deletions(-) diff --git a/src/librssguard/core/messagesmodel.cpp b/src/librssguard/core/messagesmodel.cpp index 2e7f4c251..555ecfeae 100644 --- a/src/librssguard/core/messagesmodel.cpp +++ b/src/librssguard/core/messagesmodel.cpp @@ -37,6 +37,11 @@ void MessagesModel::setupIcons() { m_enclosuresIcon = qApp->icons()->fromTheme(QSL("mail-attachment")); } +MessagesModelCache* MessagesModel::cache() const +{ + return m_cache; +} + void MessagesModel::repopulate() { m_cache->clear(); setQuery(selectStatement(), m_db); diff --git a/src/librssguard/core/messagesmodel.h b/src/librssguard/core/messagesmodel.h index ddbf4d83f..973f48b4a 100644 --- a/src/librssguard/core/messagesmodel.h +++ b/src/librssguard/core/messagesmodel.h @@ -49,6 +49,7 @@ class MessagesModel : public QSqlQueryModel, public MessagesModelSqlLayer { RootItem::Importance messageImportance(int row_index) const; RootItem* loadedItem() const; + MessagesModelCache* cache() const; void setupFonts(); void updateDateFormat(); diff --git a/src/librssguard/core/messagesmodelcache.h b/src/librssguard/core/messagesmodelcache.h index 5d37fda83..8b7c59f10 100644 --- a/src/librssguard/core/messagesmodelcache.h +++ b/src/librssguard/core/messagesmodelcache.h @@ -17,24 +17,27 @@ class MessagesModelCache : public QObject { explicit MessagesModelCache(QObject* parent = nullptr); virtual ~MessagesModelCache() = default; - inline bool containsData(int row_idx) const { - return m_msgCache.contains(row_idx); - } - - inline QSqlRecord record(int row_idx) const { - return m_msgCache.value(row_idx); - } - - inline void clear() { - m_msgCache.clear(); - } - - void setData(const QModelIndex& index, const QVariant& value, const QSqlRecord& record); - + bool containsData(int row_idx) const; + QSqlRecord record(int row_idx) const; QVariant data(const QModelIndex& idx); + void clear(); + void setData(const QModelIndex& index, const QVariant& value, const QSqlRecord& record); + private: QHash m_msgCache; }; +inline bool MessagesModelCache::containsData(int row_idx) const { + return m_msgCache.contains(row_idx); +} + +inline QSqlRecord MessagesModelCache::record(int row_idx) const { + return m_msgCache.value(row_idx); +} + +inline void MessagesModelCache::clear() { + m_msgCache.clear(); +} + #endif // MESSAGESMODELCACHE_H diff --git a/src/librssguard/core/messagesproxymodel.cpp b/src/librssguard/core/messagesproxymodel.cpp index f25c6e937..c3e010ba3 100644 --- a/src/librssguard/core/messagesproxymodel.cpp +++ b/src/librssguard/core/messagesproxymodel.cpp @@ -3,7 +3,10 @@ #include "core/messagesproxymodel.h" #include "core/messagesmodel.h" +#include "core/messagesmodelcache.h" +#include "miscellaneous/application.h" #include "miscellaneous/regexfactory.h" +#include "miscellaneous/settings.h" #include @@ -66,9 +69,16 @@ bool MessagesProxyModel::lessThan(const QModelIndex& left, const QModelIndex& ri } bool MessagesProxyModel::filterAcceptsRow(int source_row, const QModelIndex& source_parent) const { + // We want to show only regexped messages when "all" should be visible + // and we want to show only regexped AND unread messages when unread should be visible. + // + // But also, we want to see messages which have their dirty states cached, because + // otherwise they would just disappeaar from the list for example when batch marked as read + // which is distracting. return - (!m_showUnreadOnly || !m_sourceModel->messageAt(source_row).m_isRead) && - QSortFilterProxyModel::filterAcceptsRow(source_row, source_parent); + QSortFilterProxyModel::filterAcceptsRow(source_row, source_parent) && + (m_sourceModel->cache()->containsData(source_row) || + (!m_showUnreadOnly || !m_sourceModel->messageAt(source_row).m_isRead)); } bool MessagesProxyModel::showUnreadOnly() const { @@ -77,6 +87,7 @@ bool MessagesProxyModel::showUnreadOnly() const { void MessagesProxyModel::setShowUnreadOnly(bool show_unread_only) { m_showUnreadOnly = show_unread_only; + qApp->settings()->setValue(GROUP(Messages), Messages::ShowOnlyUnreadMessages, show_unread_only); } void MessagesProxyModel::invalidateUnreadMessagesFilter(bool set_new_value, bool show_unread_only) { diff --git a/src/librssguard/gui/dialogs/formmain.cpp b/src/librssguard/gui/dialogs/formmain.cpp index 7efed1e01..ee327107b 100755 --- a/src/librssguard/gui/dialogs/formmain.cpp +++ b/src/librssguard/gui/dialogs/formmain.cpp @@ -581,8 +581,11 @@ void FormMain::loadSize() { m_ui->m_actionSwitchListHeaders->setChecked(settings->value(GROUP(GUI), SETTING(GUI::ListHeadersVisible)).toBool()); m_ui->m_actionSwitchStatusBar->setChecked(settings->value(GROUP(GUI), SETTING(GUI::StatusBarVisible)).toBool()); - // Make sure that only unread feeds are shown if user has that feature set on. - m_ui->m_actionShowOnlyUnreadItems->setChecked(settings->value(GROUP(Feeds), SETTING(Feeds::ShowOnlyUnreadFeeds)).toBool()); + // Make sure that only unread feeds/messages are shown if user has that feature set on. + m_ui->m_actionShowOnlyUnreadItems->setChecked(settings->value(GROUP(Feeds), + SETTING(Feeds::ShowOnlyUnreadFeeds)).toBool()); + m_ui->m_actionShowOnlyUnreadMessages->setChecked(settings->value(GROUP(Messages), + SETTING(Messages::ShowOnlyUnreadMessages)).toBool()); } void FormMain::saveSize() { diff --git a/src/librssguard/miscellaneous/settings.cpp b/src/librssguard/miscellaneous/settings.cpp index a7162cbdf..086beffcf 100755 --- a/src/librssguard/miscellaneous/settings.cpp +++ b/src/librssguard/miscellaneous/settings.cpp @@ -101,6 +101,9 @@ DKEY Messages::KeepCursorInCenter = "keep_cursor_center"; DVALUE(bool) Messages::KeepCursorInCenterDef = false; +DKEY Messages::ShowOnlyUnreadMessages = "show_only_unread_messages"; +DVALUE(bool) Messages::ShowOnlyUnreadMessagesDef = false; + DKEY Messages::PreviewerFontStandard = "previewer_font_standard"; NON_CONST_DVALUE(QString) Messages::PreviewerFontStandardDef = QFont(QFont().family(), 12).toString(); diff --git a/src/librssguard/miscellaneous/settings.h b/src/librssguard/miscellaneous/settings.h index 818ffe9ac..2c379dd8d 100644 --- a/src/librssguard/miscellaneous/settings.h +++ b/src/librssguard/miscellaneous/settings.h @@ -113,19 +113,18 @@ namespace Messages { VALUE(bool) UseCustomDateDef; KEY CustomDateFormat; - VALUE(char*) CustomDateFormatDef; KEY ClearReadOnExit; - VALUE(bool) ClearReadOnExitDef; KEY KeepCursorInCenter; - VALUE(bool) KeepCursorInCenterDef; - KEY PreviewerFontStandard; + KEY ShowOnlyUnreadMessages; + VALUE(bool) ShowOnlyUnreadMessagesDef; + KEY PreviewerFontStandard; NON_CONST_VALUE(QString) PreviewerFontStandardDef; KEY ListFont;