1 /******************************************************************************
2  *
3  *  SPDX-FileCopyrightText: 2008 Szymon Tomasz Stefanek <pragma@kvirc.net>
4  *
5  *  SPDX-License-Identifier: GPL-2.0-or-later
6  *
7  *******************************************************************************/
8 
9 #pragma once
10 
11 #include "core/sortorder.h"
12 #include <QList>
13 #include <QMap>
14 #include <QObject>
15 
16 #include <Akonadi/Collection>
17 
18 namespace KMime
19 {
20 class DateFormatter;
21 }
22 
23 namespace MessageList
24 {
25 namespace Core
26 {
27 class Aggregation;
28 class Theme;
29 class StorageModel;
30 class Widget;
31 
32 /**
33  * @brief: The manager for all the existing MessageList::Widget objects.
34  *
35  * This class is the "central" object of the whole MessageList framework.
36  * It's a singleton that can be accessed only by the means of static methods,
37  * is created automatically when the first MessageList::Widget object is created
38  * and destroyed automatically when the last MessageList::Widget object is destroyed.
39  *
40  * This class takes care of loading/storing/maintaining the settings for the
41  * whole MessageList framework. It also keeps track of all the existing
42  * MessageList::Widget objects and takes care of updating them when settings change.
43  */
44 class Manager : public QObject
45 {
46     Q_OBJECT
47 protected:
48     explicit Manager();
49     ~Manager() override;
50 
51 private:
52     static Manager *mInstance;
53     QList<Widget *> mWidgetList;
54     QMap<QString, Aggregation *> mAggregations;
55     QMap<QString, Theme *> mThemes;
56     KMime::DateFormatter *mDateFormatter = nullptr;
57     QString mCachedLocalizedUnknownText;
58 
59 public:
60     // instance management
instance()61     static Manager *instance()
62     {
63         return mInstance;
64     }
65 
66     // widget registration
67     static void registerWidget(Widget *pWidget);
68     static void unregisterWidget(Widget *pWidget);
69 
dateFormatter()70     const KMime::DateFormatter *dateFormatter() const
71     {
72         return mDateFormatter;
73     }
74 
cachedLocalizedUnknownText()75     const QString &cachedLocalizedUnknownText() const
76     {
77         return mCachedLocalizedUnknownText;
78     }
79 
80     // aggregation sets management
81     const Aggregation *aggregationForStorageModel(const StorageModel *storageModel, bool *storageUsesPrivateAggregation);
82     const Aggregation *aggregationForStorageModel(const QString &storageModel, bool *storageUsesPrivateAggregation);
83     const Aggregation *aggregationForStorageModel(const Akonadi::Collection &storageModel, bool *storageUsesPrivateAggregation);
84 
85     void saveAggregationForStorageModel(const StorageModel *storageModel, const QString &id, bool storageUsesPrivateAggregation);
86     void saveAggregationForStorageModel(const QString &index, const QString &id, bool storageUsesPrivateAggregation);
87     void saveAggregationForStorageModel(const Akonadi::Collection &col, const QString &id, bool storageUsesPrivateAggregation);
88 
89     const Aggregation *defaultAggregation();
90     const Aggregation *aggregation(const QString &id);
91 
92     void addAggregation(Aggregation *set);
93     void removeAllAggregations();
94 
aggregations()95     const QMap<QString, Aggregation *> &aggregations() const
96     {
97         return mAggregations;
98     }
99 
100     /**
101      * This is called by the aggregation configuration dialog
102      * once the sets have been changed.
103      */
104     void aggregationsConfigurationCompleted();
105 
106     // sort order management
107     const SortOrder sortOrderForStorageModel(const StorageModel *storageModel, bool *storageUsesPrivateSortOrder);
108     void saveSortOrderForStorageModel(const StorageModel *storageModel, SortOrder order, bool storageUsesPrivateSortOrder);
109 
110     // theme sets management
111     const Theme *themeForStorageModel(const Akonadi::Collection &col, bool *storageUsesPrivateTheme);
112     const Theme *themeForStorageModel(const StorageModel *storageModel, bool *storageUsesPrivateTheme);
113     const Theme *themeForStorageModel(const QString &id, bool *storageUsesPrivateTheme);
114 
115     void saveThemeForStorageModel(const StorageModel *storageModel, const QString &id, bool storageUsesPrivateTheme);
116     void saveThemeForStorageModel(int index, const QString &id, bool storageUsesPrivateTheme);
117     void saveThemeForStorageModel(const QString &storageModelIndex, const QString &id, bool storageUsesPrivateTheme);
118 
119     const Theme *defaultTheme();
120     const Theme *theme(const QString &id);
121 
122     void addTheme(Theme *set);
123     void removeAllThemes();
124 
themes()125     const QMap<QString, Theme *> &themes() const
126     {
127         return mThemes;
128     }
129 
130     /**
131      * This is called by the theme configuration dialog
132      * once the sets have been changed.
133      */
134     void themesConfigurationCompleted();
135 
136 protected Q_SLOTS:
137     /**
138      * Reloads the global configuration from the config files (so we assume it has changed)
139      * The settings private to MessageList (like Themes or Aggregations) aren't reloaded.
140      * If the global configuration has changed then all the views are reloaded.
141      */
142     void reloadGlobalConfiguration();
143 
144     /**
145      * Explicitly reloads the contents of all the widgets.
146      */
147     void reloadAllWidgets();
148 
149 Q_SIGNALS:
150     void aggregationsChanged();
151     void themesChanged();
152 
153 private:
154     // internal configuration stuff
155     void loadConfiguration();
156     void saveConfiguration();
157     void loadGlobalConfiguration();
158     void saveGlobalConfiguration();
159 
160     // internal option set management
161     void createDefaultAggregations();
162     void createDefaultThemes();
163 };
164 } // namespace Core
165 } // namespace MessageList
166 
167