From 12c0d3d46328c4e5c2628466f57fee5aa252cd93 Mon Sep 17 00:00:00 2001 From: Martin Rotter Date: Thu, 21 Jan 2016 10:53:15 +0100 Subject: [PATCH] Fully dynamic sorting. --- resources/text/CHANGELOG | 1 + src/core/feedsmodel.cpp | 1 - src/core/feedsmodel.h | 3 --- src/core/messagesproxymodel.cpp | 4 ++++ src/core/messagesproxymodel.h | 2 ++ src/gui/feedsview.cpp | 24 ++++++++---------------- src/gui/feedsview.h | 6 ++---- src/gui/messagesview.cpp | 12 ++++++++++++ src/gui/messagesview.h | 2 ++ 9 files changed, 31 insertions(+), 24 deletions(-) diff --git a/resources/text/CHANGELOG b/resources/text/CHANGELOG index 860c3346e..3980c6565 100755 --- a/resources/text/CHANGELOG +++ b/resources/text/CHANGELOG @@ -13,6 +13,7 @@ Fixed: Changed: +▪ Sorting of both views (feeds/messages) is now fully dynamic. ▪ Tweaked "remove duplicates" policy. ▪ TT-RSS plugin can now restore messages from local recycle bin. diff --git a/src/core/feedsmodel.cpp b/src/core/feedsmodel.cpp index 2b3af2539..a6fd4a42a 100755 --- a/src/core/feedsmodel.cpp +++ b/src/core/feedsmodel.cpp @@ -177,7 +177,6 @@ void FeedsModel::onFeedUpdatesFinished(const FeedDownloadResults &results) { } emit feedsUpdateFinished(); - //emit sortingRequired(); } void FeedsModel::updateAllFeeds() { diff --git a/src/core/feedsmodel.h b/src/core/feedsmodel.h index 2500a31c5..26e317e5c 100755 --- a/src/core/feedsmodel.h +++ b/src/core/feedsmodel.h @@ -211,9 +211,6 @@ class FeedsModel : public QAbstractItemModel { // NOTE: View will probably expand dropped index. void requireItemValidationAfterDragDrop(const QModelIndex &source_index); - // When emitted, view (re)sorts items. - void sortingRequired(); - private: RootItem *m_rootItem; QList m_headerData; diff --git a/src/core/messagesproxymodel.cpp b/src/core/messagesproxymodel.cpp index 167019676..3e8369f1e 100755 --- a/src/core/messagesproxymodel.cpp +++ b/src/core/messagesproxymodel.cpp @@ -179,6 +179,10 @@ QModelIndexList MessagesProxyModel::match(const QModelIndex &start, int role, return result; } +void MessagesProxyModel::sort(int column, Qt::SortOrder order) { + QSortFilterProxyModel::sort(column, order); +} + QModelIndexList MessagesProxyModel::mapListToSource(const QModelIndexList &indexes) const { QModelIndexList source_indexes; diff --git a/src/core/messagesproxymodel.h b/src/core/messagesproxymodel.h index 3c7769f09..93c48b221 100755 --- a/src/core/messagesproxymodel.h +++ b/src/core/messagesproxymodel.h @@ -45,6 +45,8 @@ class MessagesProxyModel : public QSortFilterProxyModel { // Fix for matching indexes with respect to specifics of the message model. QModelIndexList match(const QModelIndex &start, int role, const QVariant &entered_value, int hits, Qt::MatchFlags flags) const; + void sort(int column, Qt::SortOrder order = Qt::AscendingOrder); + private: QModelIndex getNextUnreadItemIndex(int default_row, int max_row) const; diff --git a/src/gui/feedsview.cpp b/src/gui/feedsview.cpp index 3bc2cfbb8..a1475573b 100755 --- a/src/gui/feedsview.cpp +++ b/src/gui/feedsview.cpp @@ -58,7 +58,6 @@ FeedsView::FeedsView(QWidget *parent) connect(m_sourceModel, SIGNAL(requireItemValidationAfterDragDrop(QModelIndex)), this, SLOT(validateItemAfterDragDrop(QModelIndex))); connect(m_sourceModel, SIGNAL(itemExpandRequested(QList,bool)), this, SLOT(onItemExpandRequested(QList,bool))); connect(m_sourceModel, SIGNAL(itemExpandStateSaveRequested(RootItem*)), this, SLOT(onItemExpandStateSaveRequested(RootItem*))); - connect(m_sourceModel, SIGNAL(sortingRequired()), this, SLOT(reSort())); connect(header(), SIGNAL(sortIndicatorChanged(int,Qt::SortOrder)), this, SLOT(saveSortState(int,Qt::SortOrder))); setModel(m_proxyModel); @@ -134,27 +133,20 @@ void FeedsView::loadAllExpandStates() { settings->value(GROUP(CategoriesExpandStates), setting_name, item->childCount() > 0).toBool()); } - sort(true); + sortByColumn(qApp->settings()->value(GROUP(GUI), SETTING(GUI::DefaultSortColumnFeeds)).toInt(), + static_cast(qApp->settings()->value(GROUP(GUI), SETTING(GUI::DefaultSortOrderFeeds)).toInt())); } -void FeedsView::sort(bool from_settings) { - int column; - Qt::SortOrder order; +void FeedsView::sortByColumn(int column, Qt::SortOrder order) { + const int old_column = header()->sortIndicatorSection(); + const Qt::SortOrder old_order = header()->sortIndicatorOrder(); - if (from_settings) { - column = qApp->settings()->value(GROUP(GUI), SETTING(GUI::DefaultSortColumnFeeds)).toInt(); - order = static_cast(qApp->settings()->value(GROUP(GUI), SETTING(GUI::DefaultSortOrderFeeds)).toInt()); + if (column == old_column && order == old_order) { + m_proxyModel->sort(column, order); } else { - column = header()->sortIndicatorSection(); - order = header()->sortIndicatorOrder(); + QTreeView::sortByColumn(column, order); } - - sortByColumn(column, order); -} - -void FeedsView::reSort() { - m_proxyModel->sort(header()->sortIndicatorSection(), header()->sortIndicatorOrder()); } void FeedsView::addFeedIntoSelectedAccount() { diff --git a/src/gui/feedsview.h b/src/gui/feedsview.h index 79231c743..e90721679 100755 --- a/src/gui/feedsview.h +++ b/src/gui/feedsview.h @@ -60,10 +60,8 @@ class FeedsView : public QTreeView { void saveAllExpandStates(); void loadAllExpandStates(); - public slots: - // Sorts according to column/order taken from settings. - void sort(bool from_settings); - void reSort(); + public slots: + void sortByColumn(int column, Qt::SortOrder order); void addFeedIntoSelectedAccount(); void addCategoryIntoSelectedAccount(); diff --git a/src/gui/messagesview.cpp b/src/gui/messagesview.cpp index 1299fc0f5..39cabe212 100755 --- a/src/gui/messagesview.cpp +++ b/src/gui/messagesview.cpp @@ -245,6 +245,18 @@ void MessagesView::loadItem(RootItem *item) { #endif } +void MessagesView::sortByColumn(int column, Qt::SortOrder order) { + const int old_column = header()->sortIndicatorSection(); + const Qt::SortOrder old_order = header()->sortIndicatorOrder(); + + if (column == old_column && order == old_order) { + m_proxyModel->sort(column, order); + } + else { + QTreeView::sortByColumn(column, order); + } +} + void MessagesView::openSelectedSourceMessagesExternally() { foreach (const QModelIndex &index, selectionModel()->selectedRows()) { const QString link = m_sourceModel->messageAt(m_proxyModel->mapToSource(index).row()).m_url; diff --git a/src/gui/messagesview.h b/src/gui/messagesview.h index 134d3c224..5e0976122 100755 --- a/src/gui/messagesview.h +++ b/src/gui/messagesview.h @@ -59,6 +59,8 @@ class MessagesView : public QTreeView { // Loads un-deleted messages from selected feeds. void loadItem(RootItem *item); + void sortByColumn(int column, Qt::SortOrder order); + // Message manipulators. void openSelectedSourceMessagesExternally(); void openSelectedSourceMessagesInternally();