1 // For license of this file, see <project-root-folder>/LICENSE.md.
2 
3 #ifndef MESSAGESMODEL_H
4 #define MESSAGESMODEL_H
5 
6 #include "core/messagesmodelsqllayer.h"
7 #include <QSqlQueryModel>
8 
9 #include "core/message.h"
10 #include "definitions/definitions.h"
11 #include "services/abstract/rootitem.h"
12 
13 #include <QFont>
14 #include <QIcon>
15 
16 class MessagesModelCache;
17 
18 class MessagesModel : public QSqlQueryModel, public MessagesModelSqlLayer {
19   Q_OBJECT
20 
21   public:
22 
23     // Enum which describes basic filtering schemes
24     // for messages.
25     enum class MessageHighlighter {
26       NoHighlighting = 100,
27       HighlightUnread = 101,
28       HighlightImportant = 102
29     };
30 
31     // Constructors and destructors.
32     explicit MessagesModel(QObject* parent = nullptr);
33     virtual ~MessagesModel();
34 
35     // Fetches ALL available data to the model.
36     // NOTE: This activates the SQL query and populates the model with new data.
37     void repopulate();
38 
39     // Model implementation.
40     bool setData(const QModelIndex& index, const QVariant& value, int role = Qt::EditRole);
41     QVariant data(const QModelIndex& idx, int role = Qt::DisplayRole) const;
42     QVariant data(int row, int column, int role = Qt::DisplayRole) const;
43     QVariant headerData(int section, Qt::Orientation orientation, int role) const;
44     Qt::ItemFlags flags(const QModelIndex& index) const;
45 
46     // Returns message at given index.
47 
48     QList<Message> messagesAt(const QList<int>& row_indices) const;
49     Message messageAt(int row_index) const;
50     int messageId(int row_index) const;
51     RootItem::Importance messageImportance(int row_index) const;
52 
53     RootItem* loadedItem() const;
54     MessagesModelCache* cache() const;
55 
56     void setupFonts();
57     void updateDateFormat();
58     void updateFeedIconsDisplay();
59     void reloadWholeLayout();
60 
61     // SINGLE message manipulators.
62     bool switchMessageImportance(int row_index);
63     bool setMessageRead(int row_index, RootItem::ReadStatus read);
64 
65     // BATCH messages manipulators.
66     bool switchBatchMessageImportance(const QModelIndexList& messages);
67     bool setBatchMessagesDeleted(const QModelIndexList& messages);
68     bool setBatchMessagesRead(const QModelIndexList& messages, RootItem::ReadStatus read);
69     bool setBatchMessagesRestored(const QModelIndexList& messages);
70 
71     // Highlights messages.
72     void highlightMessages(MessageHighlighter highlight);
73 
74     // Loads messages of given feeds.
75     void loadMessages(RootItem* item);
76 
77   public slots:
78 
79     // NOTE: These methods DO NOT actually change data in the DB, just in the model.
80     // These are particularly used by msg browser.
81     bool setMessageImportantById(int id, RootItem::Importance important);
82     bool setMessageReadById(int id, RootItem::ReadStatus read);
83 
84   private:
85     void setupHeaderData();
86     void setupIcons();
87 
88     static QIcon generateIconForScore(double score);
89 
90   private:
91     MessagesModelCache* m_cache;
92     MessageHighlighter m_messageHighlighter;
93     QString m_customDateFormat;
94     RootItem* m_selectedItem;
95     QList<QString> m_headerData;
96     QList<QString> m_tooltipData;
97     QFont m_normalFont;
98     QFont m_boldFont;
99     QFont m_normalStrikedFont;
100     QFont m_boldStrikedFont;
101     QIcon m_favoriteIcon;
102     QIcon m_readIcon;
103     QIcon m_unreadIcon;
104     QIcon m_enclosuresIcon;
105     QList<QIcon> m_scoreIcons;
106     int m_itemHeight;
107     bool m_displayFeedIcons;
108 };
109 
110 Q_DECLARE_METATYPE(MessagesModel::MessageHighlighter)
111 
112 #endif // MESSAGESMODEL_H
113