diff --git a/src/base/settingvalue.h b/src/base/settingvalue.h index e8cc4758a..e36bd42aa 100644 --- a/src/base/settingvalue.h +++ b/src/base/settingvalue.h @@ -34,6 +34,7 @@ #include #include "settingsstorage.h" +#include "utils/string.h" template class CachedSettingValue @@ -94,20 +95,13 @@ private: template ::value, int>::type = 0> U loadValue(const U &defaultValue) { - static_assert(std::is_same::type>::value, - "Enumeration underlying type has to be int"); - - bool ok = false; - const U res = static_cast(QMetaEnum::fromType().keyToValue( - SettingsStorage::instance()->loadValue(m_keyName).toString().toLatin1().constData(), &ok)); - return ok ? res : defaultValue; + return Utils::String::parse(SettingsStorage::instance()->loadValue(m_keyName).toString(), defaultValue); } template ::value, int>::type = 0> void storeValue(const U &value) { - SettingsStorage::instance()->storeValue(m_keyName, - QString::fromLatin1(QMetaEnum::fromType().valueToKey(static_cast(value)))); + SettingsStorage::instance()->storeValue(m_keyName, Utils::String::serialize(value)); } const QString m_keyName; diff --git a/src/base/utils/string.h b/src/base/utils/string.h index ae799413c..a8373e5dd 100644 --- a/src/base/utils/string.h +++ b/src/base/utils/string.h @@ -30,6 +30,7 @@ #pragma once #include +#include #include #include #include @@ -71,5 +72,22 @@ namespace Utils TriStateBool parseTriStateBool(const QString &string); QString join(const QVector &strings, const QString &separator); + + template ::value, int>::type = 0> + QString serialize(const U &value) + { + return QString::fromLatin1(QMetaEnum::fromType().valueToKey(static_cast(value))); + } + + template ::value, int>::type = 0> + U parse(const QString &serializedValue, const U &defaultValue) + { + static_assert(std::is_same::type>::value, + "Enumeration underlying type has to be int."); + + bool ok = false; + const U value = static_cast(QMetaEnum::fromType().keyToValue(serializedValue.toLatin1().constData(), &ok)); + return (ok ? value : defaultValue); + } } }