1 | /*************************************************************************** |
2 | * Copyright (C) 2005-2014 by the Quassel Project * |
3 | * devel@quassel-irc.org * |
4 | * * |
5 | * This program is free software; you can redistribute it and/or modify * |
6 | * it under the terms of the GNU General Public License as published by * |
7 | * the Free Software Foundation; either version 2 of the License, or * |
8 | * (at your option) version 3. * |
9 | * * |
10 | * This program is distributed in the hope that it will be useful, * |
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of * |
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * |
13 | * GNU General Public License for more details. * |
14 | * * |
15 | * You should have received a copy of the GNU General Public License * |
16 | * along with this program; if not, write to the * |
17 | * Free Software Foundation, Inc., * |
18 | * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * |
19 | ***************************************************************************/ |
20 | |
21 | #ifndef SETTINGS_H |
22 | #define SETTINGS_H |
23 | |
24 | #include <QCoreApplication> |
25 | #include <QHash> |
26 | #include <QSettings> |
27 | #include <QString> |
28 | #include <QVariant> |
29 | |
30 | #include "quassel.h" |
31 | |
32 | class SettingsChangeNotifier : public QObject |
33 | { |
34 | Q_OBJECT |
35 | |
36 | signals: |
37 | void valueChanged(const QVariant &newValue); |
38 | |
39 | private: |
40 | friend class Settings; |
41 | }; |
42 | |
43 | |
44 | class Settings |
45 | { |
46 | public: |
47 | enum Mode { Default, Custom }; |
48 | |
49 | public: |
50 | //! Call the given slot on change of the given key |
51 | virtual void notify(const QString &key, QObject *receiver, const char *slot); |
52 | |
53 | //! Sets up notification and calls the given slot to set the initial value |
54 | void initAndNotify(const QString &key, QObject *receiver, const char *slot, const QVariant &defaultValue = QVariant()); |
55 | |
56 | virtual uint version(); |
57 | |
58 | protected: |
59 | inline Settings(QString group_, QString appName_) : group(group_), appName(appName_) {} |
60 | inline virtual ~Settings() {} |
61 | |
62 | inline void setGroup(const QString &group_) { group = group_; } |
63 | |
64 | virtual QStringList allLocalKeys(); |
65 | virtual QStringList localChildKeys(const QString &rootkey = QString()); |
66 | virtual QStringList localChildGroups(const QString &rootkey = QString()); |
67 | |
68 | virtual void setLocalValue(const QString &key, const QVariant &data); |
69 | virtual const QVariant &localValue(const QString &key, const QVariant &def = QVariant()); |
70 | |
71 | virtual void removeLocalKey(const QString &key); |
72 | |
73 | QString group; |
74 | QString appName; |
75 | |
76 | private: |
77 | inline QSettings::Format format() |
78 | { |
79 | #ifdef Q_OS_WIN |
80 | return QSettings::IniFormat; |
81 | #else |
82 | return QSettings::NativeFormat; |
83 | #endif |
84 | } |
85 | |
86 | |
87 | inline QString fileName() |
88 | { |
89 | return Quassel::configDirPath() + appName |
90 | + ((format() == QSettings::NativeFormat) ? QLatin1String(".conf" ) : QLatin1String(".ini" )); |
91 | } |
92 | |
93 | |
94 | static QHash<QString, QVariant> settingsCache; |
95 | static QHash<QString, SettingsChangeNotifier *> settingsChangeNotifier; |
96 | |
97 | inline QString normalizedKey(const QString &group, const QString &key) |
98 | { |
99 | if (group.isEmpty()) |
100 | return key; |
101 | return group + '/' + key; |
102 | } |
103 | |
104 | |
105 | inline void setCacheValue(const QString &normKey, const QVariant &data) |
106 | { |
107 | settingsCache[normKey] = data; |
108 | } |
109 | |
110 | |
111 | inline const QVariant &cacheValue(const QString &normKey) |
112 | { |
113 | return settingsCache[normKey]; |
114 | } |
115 | |
116 | |
117 | inline bool isCached(const QString &normKey) |
118 | { |
119 | return settingsCache.contains(normKey); |
120 | } |
121 | |
122 | |
123 | inline SettingsChangeNotifier *notifier(const QString &normKey) |
124 | { |
125 | if (!hasNotifier(normKey)) |
126 | settingsChangeNotifier[normKey] = new SettingsChangeNotifier(); |
127 | return settingsChangeNotifier[normKey]; |
128 | } |
129 | |
130 | |
131 | inline bool hasNotifier(const QString &normKey) |
132 | { |
133 | return settingsChangeNotifier.contains(normKey); |
134 | } |
135 | }; |
136 | |
137 | |
138 | #endif |
139 | |