1 /*
2     SPDX-FileCopyrightText: 2015 Martin Klapetek <mklapetek@kde.org>
3 
4     SPDX-License-Identifier: GPL-2.0-or-later
5 */
6 
7 #ifndef EVENTPLUGINSMANAGER_H
8 #define EVENTPLUGINSMANAGER_H
9 
10 #include <QMap>
11 #include <QObject>
12 #include <QStringList>
13 
14 namespace CalendarEvents
15 {
16 class CalendarEventsPlugin;
17 class EventData;
18 }
19 class EventPluginsModel;
20 class QAbstractListModel;
21 
22 class EventPluginsManager : public QObject
23 {
24     Q_OBJECT
25     Q_PROPERTY(QAbstractListModel *model READ pluginsModel NOTIFY pluginsChanged)
26     Q_PROPERTY(QStringList enabledPlugins READ enabledPlugins WRITE setEnabledPlugins NOTIFY pluginsChanged)
27 
28 public:
29     explicit EventPluginsManager(QObject *parent = nullptr);
30     ~EventPluginsManager() override;
31 
32     QList<CalendarEvents::CalendarEventsPlugin *> plugins() const;
33     QAbstractListModel *pluginsModel() const;
34 
35     // This is a helper function to set which plugins
36     // are enabled without needing to go through setEnabledPlugins
37     // which also loads the plugins; from the Applet config
38     // the plugins are not required to be actually loaded
39     Q_INVOKABLE void populateEnabledPluginsList(const QStringList &pluginsList);
40 
41     void setEnabledPlugins(QStringList &pluginsList);
42     QStringList enabledPlugins() const;
43 
44 Q_SIGNALS:
45     void pluginsChanged();
46 
47     // These three signals below are used for relaying the
48     // plugin signals so that the EventPluginsManager don't
49     // have to worry about connecting to newly loaded plugins
50     void dataReady(const QMultiHash<QDate, CalendarEvents::EventData> &data);
51     void eventModified(const CalendarEvents::EventData &modifiedEvent);
52     void eventRemoved(const QString &uid);
53 
54 private:
55     void loadPlugin(const QString &absolutePath);
56 
57     friend class EventPluginsModel;
58     EventPluginsModel *m_model = nullptr;
59     QList<CalendarEvents::CalendarEventsPlugin *> m_plugins;
60     struct PluginData {
61         QString name;
62         QString desc;
63         QString icon;
64         QString configUi;
65     };
66     QMap<QString, PluginData> m_availablePlugins;
67     QStringList m_enabledPlugins;
68 };
69 
70 #endif
71