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