diff --git a/src/librssguard/core/messagesproxymodel.cpp b/src/librssguard/core/messagesproxymodel.cpp index 326e37c98..f25c6e937 100644 --- a/src/librssguard/core/messagesproxymodel.cpp +++ b/src/librssguard/core/messagesproxymodel.cpp @@ -5,14 +5,19 @@ #include "core/messagesmodel.h" #include "miscellaneous/regexfactory.h" +#include + MessagesProxyModel::MessagesProxyModel(MessagesModel* source_model, QObject* parent) - : QSortFilterProxyModel(parent), m_sourceModel(source_model) { + : QSortFilterProxyModel(parent), m_sourceModel(source_model), m_showUnreadOnly(false) { setObjectName(QSL("MessagesProxyModel")); + setSortRole(Qt::EditRole); setSortCaseSensitivity(Qt::CaseInsensitive); + setFilterCaseSensitivity(Qt::CaseInsensitive); setFilterKeyColumn(-1); setFilterRole(Qt::EditRole); + setDynamicSortFilter(false); setSourceModel(m_sourceModel); } @@ -60,6 +65,28 @@ bool MessagesProxyModel::lessThan(const QModelIndex& left, const QModelIndex& ri return false; } +bool MessagesProxyModel::filterAcceptsRow(int source_row, const QModelIndex& source_parent) const { + return + (!m_showUnreadOnly || !m_sourceModel->messageAt(source_row).m_isRead) && + QSortFilterProxyModel::filterAcceptsRow(source_row, source_parent); +} + +bool MessagesProxyModel::showUnreadOnly() const { + return m_showUnreadOnly; +} + +void MessagesProxyModel::setShowUnreadOnly(bool show_unread_only) { + m_showUnreadOnly = show_unread_only; +} + +void MessagesProxyModel::invalidateUnreadMessagesFilter(bool set_new_value, bool show_unread_only) { + if (set_new_value) { + setShowUnreadOnly(show_unread_only); + } + + QTimer::singleShot(0, this, &MessagesProxyModel::invalidateFilter); +} + QModelIndexList MessagesProxyModel::mapListFromSource(const QModelIndexList& indexes, bool deep) const { QModelIndexList mapped_indexes; diff --git a/src/librssguard/core/messagesproxymodel.h b/src/librssguard/core/messagesproxymodel.h index afe9d4af0..4ae345f00 100644 --- a/src/librssguard/core/messagesproxymodel.h +++ b/src/librssguard/core/messagesproxymodel.h @@ -11,9 +11,7 @@ class MessagesProxyModel : public QSortFilterProxyModel { Q_OBJECT public: - - // Constructors and destructors. - explicit MessagesProxyModel(MessagesModel* source_model, QObject* parent = 0); + explicit MessagesProxyModel(MessagesModel* source_model, QObject* parent = nullptr); virtual ~MessagesProxyModel(); QModelIndex getNextPreviousUnreadItemIndex(int default_row); @@ -28,14 +26,21 @@ class MessagesProxyModel : public QSortFilterProxyModel { // Performs sort of items. void sort(int column, Qt::SortOrder order = Qt::AscendingOrder); + bool showUnreadOnly() const; + void setShowUnreadOnly(bool show_unread_only); + + public slots: + void invalidateUnreadMessagesFilter(bool set_new_value = false, bool show_unread_only = false); + private: QModelIndex getNextUnreadItemIndex(int default_row, int max_row) const; - // Compares two rows of data. bool lessThan(const QModelIndex& left, const QModelIndex& right) const; + bool filterAcceptsRow(int source_row, const QModelIndex& source_parent) const; // Source model pointer. MessagesModel* m_sourceModel; + bool m_showUnreadOnly; }; #endif // MESSAGESPROXYMODEL_H diff --git a/src/librssguard/gui/dialogs/formmain.cpp b/src/librssguard/gui/dialogs/formmain.cpp index 130c3070f..7efed1e01 100755 --- a/src/librssguard/gui/dialogs/formmain.cpp +++ b/src/librssguard/gui/dialogs/formmain.cpp @@ -160,6 +160,7 @@ QList FormMain::allActions() const { actions << m_ui->m_actionClearSelectedItems; actions << m_ui->m_actionClearAllItems; actions << m_ui->m_actionShowOnlyUnreadItems; + actions << m_ui->m_actionShowOnlyUnreadMessages; actions << m_ui->m_actionMarkSelectedMessagesAsRead; actions << m_ui->m_actionMarkSelectedMessagesAsUnread; actions << m_ui->m_actionSwitchImportanceOfSelectedMessages; @@ -514,6 +515,7 @@ void FormMain::setupIcons() { m_ui->m_actionSelectPreviousMessage->setIcon(icon_theme_factory->fromTheme(QSL("go-up"))); m_ui->m_actionSelectNextUnreadMessage->setIcon(icon_theme_factory->fromTheme(QSL("mail-mark-unread"))); m_ui->m_actionShowOnlyUnreadItems->setIcon(icon_theme_factory->fromTheme(QSL("mail-mark-unread"))); + m_ui->m_actionShowOnlyUnreadMessages->setIcon(icon_theme_factory->fromTheme(QSL("mail-mark-unread"))); m_ui->m_actionExpandCollapseItem->setIcon(icon_theme_factory->fromTheme(QSL("format-indent-more"))); m_ui->m_actionRestoreSelectedMessages->setIcon(icon_theme_factory->fromTheme(QSL("view-refresh"))); m_ui->m_actionRestoreAllRecycleBins->setIcon(icon_theme_factory->fromTheme(QSL("view-refresh"))); @@ -740,6 +742,8 @@ void FormMain::createConnections() { tabWidget()->feedMessageViewer(), &FeedMessageViewer::switchMessageSplitterOrientation); connect(m_ui->m_actionShowOnlyUnreadItems, &QAction::toggled, tabWidget()->feedMessageViewer(), &FeedMessageViewer::toggleShowOnlyUnreadFeeds); + connect(m_ui->m_actionShowOnlyUnreadMessages, &QAction::toggled, + tabWidget()->feedMessageViewer(), &FeedMessageViewer::toggleShowOnlyUnreadMessages); connect(m_ui->m_actionRestoreSelectedMessages, &QAction::triggered, tabWidget()->feedMessageViewer()->messagesView(), &MessagesView::restoreSelectedMessages); connect(m_ui->m_actionRestoreAllRecycleBins, &QAction::triggered, diff --git a/src/librssguard/gui/dialogs/formmain.ui b/src/librssguard/gui/dialogs/formmain.ui index d61eb6aee..1dcfaf5f7 100755 --- a/src/librssguard/gui/dialogs/formmain.ui +++ b/src/librssguard/gui/dialogs/formmain.ui @@ -136,6 +136,7 @@ + @@ -750,6 +751,14 @@ &Copy URLs of selected items + + + true + + + Show only &unread messages + + diff --git a/src/librssguard/gui/feedmessageviewer.cpp b/src/librssguard/gui/feedmessageviewer.cpp index 33a44331d..132d41956 100644 --- a/src/librssguard/gui/feedmessageviewer.cpp +++ b/src/librssguard/gui/feedmessageviewer.cpp @@ -167,6 +167,17 @@ void FeedMessageViewer::switchFeedComponentVisibility() { } } +void FeedMessageViewer::toggleShowOnlyUnreadMessages() { + const QAction* origin = qobject_cast(sender()); + + if (origin == nullptr) { + m_messagesView->model()->invalidateUnreadMessagesFilter(true, false); + } + else { + m_messagesView->model()->invalidateUnreadMessagesFilter(true, origin->isChecked()); + } +} + void FeedMessageViewer::toggleShowOnlyUnreadFeeds() { const QAction* origin = qobject_cast(sender()); diff --git a/src/librssguard/gui/feedmessageviewer.h b/src/librssguard/gui/feedmessageviewer.h index 62419f113..a084ce6d5 100644 --- a/src/librssguard/gui/feedmessageviewer.h +++ b/src/librssguard/gui/feedmessageviewer.h @@ -64,7 +64,7 @@ class RSSGUARD_DLLSPEC FeedMessageViewer : public TabContent { // toolbar. void switchFeedComponentVisibility(); - // Toggles displayed feeds. + void toggleShowOnlyUnreadMessages(); void toggleShowOnlyUnreadFeeds(); private slots: