--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/settings.h Tue Jun 14 19:50:31 2022 +0300 @@ -0,0 +1,55 @@ +#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