src/settings.h

changeset 220
a6d937f8c0ac
parent 219
571e85c0d811
child 221
e28f89b8ccdf
equal deleted inserted replaced
219:571e85c0d811 220:a6d937f8c0ac
1 #ifndef SETTINGS_H 1 #ifndef SETTINGS_H
2 #define SETTINGS_H 2 #define SETTINGS_H
3 #include <QSettings> 3 #include <QSettings>
4 #include "settingdefs.h" 4 #include "settingdefs.h"
5 5
6 // settingdefs - get name and default value by setting
7 static const struct Settingdef
8 {
9 const char* name;
10 QVariant defaultValue;
11 } settingdefs[] = {
12 #define SETTING(NAME, DEFVALUE) {#NAME, QVariant::fromValue(DEFVALUE)},
13 #include "settingdefs.h"
14 #undef SETTING
15 };
16
17 // SettingType - get type of setting by enumerator 6 // SettingType - get type of setting by enumerator
18 template<Setting setting> 7 template<Setting>
19 struct SettingType{}; 8 struct SettingInfo{};
20 9
21 #define SETTING(NAME, DEFVALUE) \ 10 #define SETTING(NAME, DEFVALUE) \
22 template<> \ 11 template<> \
23 struct SettingType<Setting::NAME> \ 12 struct SettingInfo<Setting::NAME> \
24 { \ 13 { \
25 using type = decltype((DEFVALUE)); \ 14 using type = decltype((DEFVALUE)); \
15 static constexpr char name[] = #NAME; \
16 static const auto& defaultValue() { \
17 static const auto value = DEFVALUE; \
18 return value; \
19 }; \
26 }; 20 };
27 #include "settingdefs.h" 21 #include "settingdefs.h"
28 #undef SETTING 22 #undef SETTING
29 23
30 template<Setting setting> 24 template<Setting X>
31 using SettingType_t = typename SettingType<setting>::type; 25 using SettingType_t = typename SettingInfo<X>::type;
32 static_assert(std::is_same_v<SettingType_t<Setting::DrawAxes>, bool>); 26 static_assert(std::is_same_v<SettingType_t<Setting::DrawAxes>, bool>);
27
28 template<Setting X>
29 const char* settingName = SettingInfo<X>::name;
30
31 template<Setting X>
32 inline auto settingDefaultValue()
33 {
34 return SettingInfo<X>::defaultValue();
35 }
33 36
34 // get() - get setting by enumerator 37 // get() - get setting by enumerator
35 template<Setting X> 38 template<Setting X>
36 inline SettingType_t<X> setting() 39 inline SettingType_t<X> setting()
37 { 40 {
38 const Settingdef& def = settingdefs[static_cast<int>(X)]; 41 static const QVariant defvariant = QVariant::fromValue(settingDefaultValue<X>());
39 return QSettings{}.value(def.name, def.defaultValue).value<SettingType_t<X>>(); 42 const QVariant var = QSettings{}.value(settingName<X>, defvariant);
43 return var.value<SettingType_t<X>>();
40 } 44 }
41 45
42 // setSetting() - set value of setting 46 // setSetting() - set value of setting
43 template<Setting X> 47 template<Setting X>
44 inline void setSetting(const SettingType_t<X>& value) 48 inline void setSetting(const SettingType_t<X>& value)
45 { 49 {
46 const Settingdef& def = settingdefs[static_cast<int>(X)]; 50 if (value == settingDefaultValue<X>()) {
47 if (value == def.defaultValue.value<SettingType_t<X>>()) { 51 QSettings{}.remove(settingName<X>);
48 QSettings{}.remove(def.name);
49 } 52 }
50 else { 53 else {
51 QSettings{}.setValue(def.name, QVariant::fromValue(value)); 54 QSettings{}.setValue(settingName<X>, QVariant::fromValue(value));
52 } 55 }
53 } 56 }
54 57
55 #endif // SETTINGS_H 58 #endif // SETTINGS_H

mercurial