Tue, 14 Jun 2022 19:50:31 +0300
Replace config collector with a simpler system
#ifndef SETTINGS_H #define SETTINGS_H #include <QSettings> #include "settingdefs.h" // settingdefs - get name and default value by setting static const struct Settingdef { const char* name; QVariant defaultValue; } settingdefs[] = { #define SETTING(NAME, DEFVALUE) {#NAME, QVariant::fromValue(DEFVALUE)}, #include "settingdefs.h" #undef SETTING }; // SettingType - get type of setting by enumerator template<Setting setting> struct SettingType{}; #define SETTING(NAME, DEFVALUE) \ template<> \ struct SettingType<Setting::NAME> \ { \ using type = decltype((DEFVALUE)); \ }; #include "settingdefs.h" #undef SETTING template<Setting setting> using SettingType_t = typename SettingType<setting>::type; static_assert(std::is_same_v<SettingType_t<Setting::DrawAxes>, bool>); // get() - get setting by enumerator template<Setting X> inline SettingType_t<X> setting() { const Settingdef& def = settingdefs[static_cast<int>(X)]; return QSettings{}.value(def.name, def.defaultValue).value<SettingType_t<X>>(); } // get() - get setting by enumerator template<Setting X> inline void setSetting(const SettingType_t<X>& value) { const Settingdef& def = settingdefs[static_cast<int>(X)]; if (value == def.defaultValue.value<SettingType_t<X>>()) { QSettings{}.remove(def.name); } else { QSettings{}.setValue(def.name, QVariant::fromValue(value)); } } #endif // SETTINGS_H