src/settings.h

changeset 218
63125c36de73
child 219
571e85c0d811
--- /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

mercurial