Tue, 14 Jun 2022 20:44:07 +0300
Further reduce settings.h
#ifndef SETTINGS_H #define SETTINGS_H #include <QSettings> #include "settingdefs.h" // SettingType - get type of setting by enumerator template<Setting> struct SettingInfo{}; #define SETTING(NAME, DEFVALUE) \ template<> \ struct SettingInfo<Setting::NAME> \ { \ using type = decltype((DEFVALUE)); \ static constexpr char name[] = #NAME; \ static const auto& defaultValue() { \ static const auto value = DEFVALUE; \ return value; \ }; \ }; #include "settingdefs.h" #undef SETTING template<Setting X> using SettingType_t = typename SettingInfo<X>::type; static_assert(std::is_same_v<SettingType_t<Setting::DrawAxes>, bool>); template<Setting X> const char* settingName = SettingInfo<X>::name; template<Setting X> inline auto settingDefaultValue() { return SettingInfo<X>::defaultValue(); } // get() - get setting by enumerator template<Setting X> inline SettingType_t<X> setting() { static const QVariant defvariant = QVariant::fromValue(settingDefaultValue<X>()); const QVariant var = QSettings{}.value(settingName<X>, defvariant); return var.value<SettingType_t<X>>(); } // setSetting() - set value of setting template<Setting X> inline void setSetting(const SettingType_t<X>& value) { if (value == settingDefaultValue<X>()) { QSettings{}.remove(settingName<X>); } else { QSettings{}.setValue(settingName<X>, QVariant::fromValue(value)); } } #endif // SETTINGS_H