|      3 #include <QSettings> | 
     3 #include <QSettings> | 
|      4 #include <QMdiArea> | 
     4 #include <QMdiArea> | 
|      5 #include "libraries.h" | 
     5 #include "libraries.h" | 
|      6 #include "gl/common.h" | 
     6 #include "gl/common.h" | 
|      7  | 
     7  | 
|      8 // SettingType - get type of setting by enumerator | 
     8 template<class> | 
|      9 template<typename> | 
        | 
|     10 struct SettingId{}; | 
        | 
|     11  | 
        | 
|     12 template<SettingId> | 
        | 
|     13 struct SettingInfo{}; | 
     9 struct SettingInfo{}; | 
|     14  | 
    10  | 
|     15 #define SETTING(NAME, DEFVALUE) \ | 
    11 #define SETTING(NAME, DEFVALUE) \ | 
|     16 	namespace SettingIdTypes { class NAME; } \ | 
    12 	namespace Setting { class NAME;  } \ | 
|     17 	namespace Setting { constexpr SettingId<class NAME##_SettingType> NAME; } \ | 
        | 
|     18 	template<> \ | 
    13 	template<> \ | 
|     19 	struct SettingInfo<Setting::NAME> \ | 
    14 	struct SettingInfo<Setting::NAME> \ | 
|     20 	{ \ | 
    15 	{ \ | 
|     21 		using type = decltype((DEFVALUE)); \ | 
    16 		using type = decltype((DEFVALUE)); \ | 
|     22 		static constexpr char name[] = #NAME; \ | 
    17 		static constexpr char name[] = #NAME; \ | 
|     49  | 
    44  | 
|     50 // End of setting definitions | 
    45 // End of setting definitions | 
|     51 // ----------------------------------------------------------------------------- | 
    46 // ----------------------------------------------------------------------------- | 
|     52 #undef SETTING | 
    47 #undef SETTING | 
|     53  | 
    48  | 
|     54 template<SettingId X> | 
    49 template<class X> | 
|     55 using SettingType_t = typename SettingInfo<X>::type; | 
    50 using SettingType_t = typename SettingInfo<X>::type; | 
|     56 static_assert(std::is_same_v<SettingType_t<Setting::DrawAxes>, bool>); | 
    51 static_assert(std::is_same_v<SettingType_t<Setting::DrawAxes>, bool>); | 
|     57  | 
    52  | 
|     58 template<SettingId X> | 
    53 template<class X> | 
|     59 const char* settingName = SettingInfo<X>::name; | 
    54 const char* settingName = SettingInfo<X>::name; | 
|     60  | 
    55  | 
|     61 template<SettingId X> | 
    56 template<class X> | 
|     62 inline auto settingDefaultValue() | 
    57 inline auto settingDefaultValue() | 
|     63 { | 
    58 { | 
|     64 	return SettingInfo<X>::defaultValue(); | 
    59 	return SettingInfo<X>::defaultValue(); | 
|     65 } | 
    60 } | 
|     66  | 
    61  | 
|     67 // get() - get setting by enumerator | 
    62 // get() - get setting by enumerator | 
|     68 template<SettingId X> | 
    63 template<class X> | 
|     69 inline SettingType_t<X> setting() | 
    64 inline SettingType_t<X> setting() | 
|     70 { | 
    65 { | 
|     71 	static const QVariant defvariant = QVariant::fromValue(settingDefaultValue<X>()); | 
    66 	static const QVariant defvariant = QVariant::fromValue(settingDefaultValue<X>()); | 
|     72 	const QVariant var = QSettings{}.value(settingName<X>, defvariant); | 
    67 	const QVariant var = QSettings{}.value(settingName<X>, defvariant); | 
|     73 	return var.value<SettingType_t<X>>(); | 
    68 	return var.value<SettingType_t<X>>(); | 
|     74 } | 
    69 } | 
|     75  | 
    70  | 
|     76 // setSetting() - set value of setting | 
    71 // setSetting() - set value of setting | 
|     77 template<SettingId X> | 
    72 template<class X> | 
|     78 inline void setSetting(const SettingType_t<X>& value) | 
    73 inline void setSetting(const SettingType_t<X>& value) | 
|     79 { | 
    74 { | 
|     80 	if (value == settingDefaultValue<X>()) { | 
    75 	if (value == settingDefaultValue<X>()) { | 
|     81 		QSettings{}.remove(settingName<X>); | 
    76 		QSettings{}.remove(settingName<X>); | 
|     82 	} | 
    77 	} |