File indexing completed on 2024-04-21 05:10:34

0001 /*
0002     This file is part of Akregator.
0003 
0004     SPDX-FileCopyrightText: 2007 Frank Osterfeld <osterfeld@kde.org>
0005 
0006     SPDX-License-Identifier: GPL-2.0-or-later WITH Qt-Commercial-exception-1.0
0007 */
0008 #pragma once
0009 
0010 #include <QAbstractTableModel>
0011 
0012 #include "akregatorpart_export.h"
0013 #include "article.h"
0014 
0015 #include <QSharedPointer>
0016 #include <vector>
0017 
0018 namespace Akregator
0019 {
0020 class TreeNode;
0021 
0022 namespace Filters
0023 {
0024 class AbstractMatcher;
0025 }
0026 
0027 class AKREGATORPART_EXPORT ArticleModel : public QAbstractTableModel
0028 {
0029     Q_OBJECT
0030 
0031 public:
0032     enum Column { ItemTitleColumn = 0, FeedTitleColumn, AuthorColumn, DateColumn, DescriptionColumn, ContentColumn, ColumnCount };
0033 
0034     enum Role { SortRole = Qt::UserRole, LinkRole, GuidRole, ItemIdRole, FeedIdRole, StatusRole, IsImportantRole, IsDeletedRole };
0035 
0036     explicit ArticleModel(const QList<Article> &articles, QObject *parent = nullptr);
0037     ~ArticleModel() override;
0038 
0039     [[nodiscard]] int columnCount(const QModelIndex &parent = QModelIndex()) const override;
0040 
0041     [[nodiscard]] int rowCount(const QModelIndex &parent = QModelIndex()) const override;
0042 
0043     [[nodiscard]] QVariant headerData(int section, Qt::Orientation, int role) const override;
0044 
0045     [[nodiscard]] QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
0046 
0047     [[nodiscard]] bool rowMatches(int row, const QSharedPointer<const Akregator::Filters::AbstractMatcher> &matcher) const;
0048 
0049     [[nodiscard]] Article article(int row) const;
0050 
0051     [[nodiscard]] QStringList mimeTypes() const override;
0052 
0053     QMimeData *mimeData(const QModelIndexList &indexes) const override;
0054 
0055     [[nodiscard]] Qt::ItemFlags flags(const QModelIndex &idx) const override;
0056 
0057 public Q_SLOTS:
0058 
0059     void articlesAdded(Akregator::TreeNode *, const QList<Akregator::Article> &);
0060     void articlesUpdated(Akregator::TreeNode *, const QList<Akregator::Article> &);
0061     void articlesRemoved(Akregator::TreeNode *, const QList<Akregator::Article> &);
0062     void clear();
0063 
0064 private:
0065     ArticleModel(const ArticleModel &);
0066     ArticleModel &operator=(const ArticleModel &);
0067 
0068     QList<Article> m_articles;
0069     QList<QString> m_titleCache;
0070 };
0071 } // namespace Akregator