diff --git a/src/gui/rss/feedlistwidget.cpp b/src/gui/rss/feedlistwidget.cpp index 137b54096..635d46189 100644 --- a/src/gui/rss/feedlistwidget.cpp +++ b/src/gui/rss/feedlistwidget.cpp @@ -31,6 +31,7 @@ #include #include +#include #include #include "base/global.h" @@ -40,6 +41,33 @@ #include "base/rss/rss_session.h" #include "gui/uithememanager.h" +namespace +{ + enum + { + StickyItemTagRole = Qt::UserRole + 1 + }; + + class FeedListItem final : public QTreeWidgetItem + { + public: + using QTreeWidgetItem::QTreeWidgetItem; + + private: + bool operator<(const QTreeWidgetItem &other) const override + { + const bool lhsSticky = data(0, StickyItemTagRole).toBool(); + const bool rhsSticky = other.data(0, StickyItemTagRole).toBool(); + + if (lhsSticky == rhsSticky) + return QTreeWidgetItem::operator<(other); + + const int order = treeWidget()->header()->sortIndicatorOrder(); + return ((order == Qt::AscendingOrder) ? lhsSticky : rhsSticky); + } + }; +} + FeedListWidget::FeedListWidget(QWidget *parent) : QTreeWidget(parent) { @@ -57,10 +85,12 @@ FeedListWidget::FeedListWidget(QWidget *parent) m_rssToTreeItemMapping[RSS::Session::instance()->rootFolder()] = invisibleRootItem(); - m_unreadStickyItem = new QTreeWidgetItem(this); + m_unreadStickyItem = new FeedListItem(this); m_unreadStickyItem->setData(0, Qt::UserRole, reinterpret_cast(RSS::Session::instance()->rootFolder())); m_unreadStickyItem->setText(0, tr("Unread (%1)").arg(RSS::Session::instance()->rootFolder()->unreadCount())); m_unreadStickyItem->setData(0, Qt::DecorationRole, UIThemeManager::instance()->getIcon("mail-folder-inbox")); + m_unreadStickyItem->setData(0, StickyItemTagRole, true); + connect(RSS::Session::instance()->rootFolder(), &RSS::Item::unreadCountChanged, this, &FeedListWidget::handleItemUnreadCountChanged); @@ -233,7 +263,7 @@ void FeedListWidget::dropEvent(QDropEvent *event) QTreeWidgetItem *FeedListWidget::createItem(RSS::Item *rssItem, QTreeWidgetItem *parentItem) { - auto *item = new QTreeWidgetItem; + auto *item = new FeedListItem; item->setData(0, Qt::DisplayRole, QString::fromLatin1("%1 (%2)").arg(rssItem->name(), QString::number(rssItem->unreadCount()))); item->setData(0, Qt::UserRole, reinterpret_cast(rssItem)); m_rssToTreeItemMapping[rssItem] = item;