| 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 <QMdiArea> |
| |
5 #include "libraries.h" |
| |
6 #include "gl/common.h" |
| 5 |
7 |
| 6 // SettingType - get type of setting by enumerator |
8 // SettingType - get type of setting by enumerator |
| 7 template<Setting> |
9 template<typename> |
| |
10 struct SettingId{}; |
| |
11 |
| |
12 template<SettingId> |
| 8 struct SettingInfo{}; |
13 struct SettingInfo{}; |
| 9 |
14 |
| 10 #define SETTING(NAME, DEFVALUE) \ |
15 #define SETTING(NAME, DEFVALUE) \ |
| |
16 namespace SettingIdTypes { class NAME; } \ |
| |
17 namespace Setting { constexpr SettingId<class NAME##_SettingType> NAME; } \ |
| 11 template<> \ |
18 template<> \ |
| 12 struct SettingInfo<Setting::NAME> \ |
19 struct SettingInfo<Setting::NAME> \ |
| 13 { \ |
20 { \ |
| 14 using type = decltype((DEFVALUE)); \ |
21 using type = decltype((DEFVALUE)); \ |
| 15 static constexpr char name[] = #NAME; \ |
22 static constexpr char name[] = #NAME; \ |
| 16 static const auto& defaultValue() { \ |
23 static const auto& defaultValue() { \ |
| 17 static const auto value = DEFVALUE; \ |
24 static const auto value = DEFVALUE; \ |
| 18 return value; \ |
25 return value; \ |
| 19 }; \ |
26 }; \ |
| 20 }; |
27 }; |
| 21 #include "settingdefs.h" |
28 |
| |
29 // ----------------------------------------------------------------------------- |
| |
30 // Setting definitions |
| |
31 |
| |
32 // Rendering options |
| |
33 SETTING(Locale, QStringLiteral("system")) |
| |
34 SETTING(BackgroundColor, (QColor{48, 48, 48})) |
| |
35 SETTING(MainColor, (QColor{255, 255, 64})) |
| |
36 SETTING(SelectedColor, (QColor{32, 32, 224})) |
| |
37 SETTING(LineThickness, 2.0f) |
| |
38 SETTING(LineAntiAliasing, true) |
| |
39 SETTING(RenderStyle, gl::RenderStyle::Normal) |
| |
40 SETTING(DrawWireframe, false) |
| |
41 SETTING(DrawAxes, true) |
| |
42 SETTING(MainWindowGeometry, QByteArray{}) |
| |
43 SETTING(MainSplitterState, QByteArray{}) |
| |
44 SETTING(RecentFiles, QStringList{}) |
| |
45 SETTING(ViewMode, QMdiArea::TabbedView) |
| |
46 |
| |
47 // File management options |
| |
48 SETTING(Libraries, QVector<Library>{}) |
| |
49 |
| |
50 // End of setting definitions |
| |
51 // ----------------------------------------------------------------------------- |
| 22 #undef SETTING |
52 #undef SETTING |
| 23 |
53 |
| 24 template<Setting X> |
54 template<SettingId X> |
| 25 using SettingType_t = typename SettingInfo<X>::type; |
55 using SettingType_t = typename SettingInfo<X>::type; |
| 26 static_assert(std::is_same_v<SettingType_t<Setting::DrawAxes>, bool>); |
56 static_assert(std::is_same_v<SettingType_t<Setting::DrawAxes>, bool>); |
| 27 |
57 |
| 28 template<Setting X> |
58 template<SettingId X> |
| 29 const char* settingName = SettingInfo<X>::name; |
59 const char* settingName = SettingInfo<X>::name; |
| 30 |
60 |
| 31 template<Setting X> |
61 template<SettingId X> |
| 32 inline auto settingDefaultValue() |
62 inline auto settingDefaultValue() |
| 33 { |
63 { |
| 34 return SettingInfo<X>::defaultValue(); |
64 return SettingInfo<X>::defaultValue(); |
| 35 } |
65 } |
| 36 |
66 |
| 37 // get() - get setting by enumerator |
67 // get() - get setting by enumerator |
| 38 template<Setting X> |
68 template<SettingId X> |
| 39 inline SettingType_t<X> setting() |
69 inline SettingType_t<X> setting() |
| 40 { |
70 { |
| 41 static const QVariant defvariant = QVariant::fromValue(settingDefaultValue<X>()); |
71 static const QVariant defvariant = QVariant::fromValue(settingDefaultValue<X>()); |
| 42 const QVariant var = QSettings{}.value(settingName<X>, defvariant); |
72 const QVariant var = QSettings{}.value(settingName<X>, defvariant); |
| 43 return var.value<SettingType_t<X>>(); |
73 return var.value<SettingType_t<X>>(); |
| 44 } |
74 } |
| 45 |
75 |
| 46 // setSetting() - set value of setting |
76 // setSetting() - set value of setting |
| 47 template<Setting X> |
77 template<SettingId X> |
| 48 inline void setSetting(const SettingType_t<X>& value) |
78 inline void setSetting(const SettingType_t<X>& value) |
| 49 { |
79 { |
| 50 if (value == settingDefaultValue<X>()) { |
80 if (value == settingDefaultValue<X>()) { |
| 51 QSettings{}.remove(settingName<X>); |
81 QSettings{}.remove(settingName<X>); |
| 52 } |
82 } |