src/settings.h

Tue, 14 Jun 2022 19:50:31 +0300

author
Teemu Piippo <teemu.s.piippo@gmail.com>
date
Tue, 14 Jun 2022 19:50:31 +0300
changeset 218
63125c36de73
child 219
571e85c0d811
permissions
-rw-r--r--

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

mercurial