File indexing completed on 2024-04-28 05:11:00
0001 /* 0002 This file is part of Akregator. 0003 0004 SPDX-FileCopyrightText: 2004 Stanislav Karchebny <Stanislav.Karchebny@kdemail.net> 0005 SPDX-FileCopyrightText: 2005-2007 Frank Osterfeld <osterfeld@kde.org> 0006 0007 SPDX-License-Identifier: GPL-2.0-or-later WITH Qt-Commercial-exception-1.0 0008 */ 0009 #pragma once 0010 0011 #include "abstractselectioncontroller.h" 0012 #include "akregatorpart_export.h" 0013 0014 #include <QPointer> 0015 #include <QSortFilterProxyModel> 0016 #include <QTreeView> 0017 0018 #include <QSharedPointer> 0019 #include <QUrl> 0020 0021 class QContextMenuEvent; 0022 template<class T> 0023 class QList; 0024 0025 namespace Akregator 0026 { 0027 class Article; 0028 0029 namespace Filters 0030 { 0031 } 0032 0033 class AKREGATORPART_EXPORT FilterDeletedProxyModel : public QSortFilterProxyModel 0034 { 0035 Q_OBJECT 0036 public: 0037 explicit FilterDeletedProxyModel(QObject *parent = nullptr); 0038 0039 private: 0040 bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const override; 0041 }; 0042 0043 class AKREGATORPART_EXPORT SortColorizeProxyModel : public QSortFilterProxyModel 0044 { 0045 Q_OBJECT 0046 public: 0047 explicit SortColorizeProxyModel(QObject *parent = nullptr); 0048 0049 [[nodiscard]] QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; 0050 0051 void setFilters(const std::vector<QSharedPointer<const Akregator::Filters::AbstractMatcher>> &); 0052 0053 private: 0054 bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const override; 0055 0056 QIcon m_keepFlagIcon; 0057 std::vector<QSharedPointer<const Akregator::Filters::AbstractMatcher>> m_matchers; 0058 0059 QColor m_unreadColor; 0060 QColor m_newColor; 0061 }; 0062 0063 class AKREGATORPART_EXPORT ArticleListView : public QTreeView, public ArticleLister 0064 { 0065 Q_OBJECT 0066 0067 public: 0068 explicit ArticleListView(QWidget *parent = nullptr); 0069 ~ArticleListView() override; 0070 0071 // impl ArticleLister 0072 void setArticleModel(Akregator::ArticleModel *model) override; 0073 0074 // impl ArticleLister 0075 QItemSelectionModel *articleSelectionModel() const override; 0076 0077 // impl ArticleLister 0078 const QAbstractItemView *itemView() const override; 0079 0080 // impl ArticleLister 0081 QAbstractItemView *itemView() override; 0082 0083 // impl ArticleLister 0084 [[nodiscard]] QPoint scrollBarPositions() const override; 0085 0086 // impl ArticleLister 0087 void setScrollBarPositions(const QPoint &p) override; 0088 0089 // impl ArticleLister 0090 void setFilters(const std::vector<QSharedPointer<const Akregator::Filters::AbstractMatcher>> &) override; 0091 0092 // impl ArticleLister 0093 void forceFilterUpdate() override; 0094 0095 void setIsAggregation(bool isAggregation) override; 0096 0097 void setModel(QAbstractItemModel *model) override; 0098 0099 protected: 0100 void mousePressEvent(QMouseEvent *ev) override; 0101 0102 void paintEvent(QPaintEvent *event) override; 0103 0104 Q_SIGNALS: 0105 void signalMouseButtonPressed(int, const QUrl &); 0106 0107 public Q_SLOTS: 0108 0109 void slotClear(); 0110 0111 void slotPreviousArticle(); 0112 0113 void slotNextArticle(); 0114 0115 void slotPreviousUnreadArticle(); 0116 0117 void slotNextUnreadArticle(); 0118 0119 Q_SIGNALS: 0120 0121 void userActionTakingPlace(); 0122 0123 private: 0124 void restoreHeaderState(); 0125 void saveHeaderSettings(); 0126 void loadHeaderSettings(); 0127 0128 void contextMenuEvent(QContextMenuEvent *event) override; 0129 0130 void selectIndex(const QModelIndex &index); 0131 0132 void setFeedMode(); 0133 void setGroupMode(); 0134 0135 private Q_SLOTS: 0136 void showHeaderMenu(const QPoint &pos); 0137 void startResizingTitleColumn(); 0138 void finishResizingTitleColumn(); 0139 0140 private: 0141 void generalPaletteChanged(); 0142 enum ColumnMode { GroupMode, FeedMode }; 0143 ColumnMode m_columnMode; 0144 QColor mTextColor; 0145 QPointer<SortColorizeProxyModel> m_proxy; 0146 std::vector<QSharedPointer<const Filters::AbstractMatcher>> m_matchers; 0147 QByteArray m_feedHeaderState; 0148 QByteArray m_groupHeaderState; 0149 }; 0150 } // namespace Akregator