1 #ifndef CSM_PREFS_STATE_H
2 #define CSM_PREFS_STATE_H
3 
4 #include <map>
5 #include <string>
6 
7 #include <QObject>
8 #include <QMutex>
9 
10 #ifndef Q_MOC_RUN
11 #include <components/files/configurationmanager.hpp>
12 #endif
13 
14 #include <components/settings/settings.hpp>
15 
16 #include "category.hpp"
17 #include "setting.hpp"
18 #include "enumsetting.hpp"
19 #include "stringsetting.hpp"
20 #include "shortcutmanager.hpp"
21 
22 class QColor;
23 
24 namespace CSMPrefs
25 {
26     class IntSetting;
27     class DoubleSetting;
28     class BoolSetting;
29     class ColourSetting;
30     class ShortcutSetting;
31     class ModifierSetting;
32 
33     /// \brief User settings state
34     ///
35     /// \note Access to the user settings is thread-safe once all declarations and loading has
36     /// been completed.
37     class State : public QObject
38     {
39             Q_OBJECT
40 
41             static State *sThis;
42 
43         public:
44 
45             typedef std::map<std::string, Category> Collection;
46             typedef Collection::iterator Iterator;
47 
48         private:
49 
50             const std::string mConfigFile;
51             const std::string mDefaultConfigFile;
52             const Files::ConfigurationManager& mConfigurationManager;
53             ShortcutManager mShortcutManager;
54             Settings::Manager mSettings;
55             Collection mCategories;
56             Iterator mCurrentCategory;
57             QMutex mMutex;
58 
59             // not implemented
60             State (const State&);
61             State& operator= (const State&);
62 
63         private:
64 
65             void load();
66 
67             void declare();
68 
69             void declareCategory (const std::string& key);
70 
71             IntSetting& declareInt (const std::string& key, const std::string& label, int default_);
72             DoubleSetting& declareDouble (const std::string& key, const std::string& label, double default_);
73 
74             BoolSetting& declareBool (const std::string& key, const std::string& label, bool default_);
75 
76             EnumSetting& declareEnum (const std::string& key, const std::string& label, EnumValue default_);
77 
78             ColourSetting& declareColour (const std::string& key, const std::string& label, QColor default_);
79 
80             ShortcutSetting& declareShortcut (const std::string& key, const std::string& label,
81                 const QKeySequence& default_);
82 
83             StringSetting& declareString (const std::string& key, const std::string& label, std::string default_);
84 
85             ModifierSetting& declareModifier(const std::string& key, const std::string& label, int modifier_);
86 
87             void declareSeparator();
88 
89             void declareSubcategory(const std::string& label);
90 
91             void setDefault (const std::string& key, const std::string& default_);
92 
93         public:
94 
95             State (const Files::ConfigurationManager& configurationManager);
96 
97             ~State();
98 
99             void save();
100 
101             Iterator begin();
102 
103             Iterator end();
104 
105             ShortcutManager& getShortcutManager();
106 
107             Category& operator[](const std::string& key);
108 
109             void update (const Setting& setting);
110 
111             static State& get();
112 
113             void resetCategory(const std::string& category);
114 
115             void resetAll();
116 
117         signals:
118 
119             void settingChanged (const CSMPrefs::Setting *setting);
120     };
121 
122     // convenience function
123     State& get();
124 }
125 
126 #endif
127