From 6cf00041f88307573a5724a1cc1fe24c132221dd Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Mon, 19 Jan 2015 20:56:15 -0800 Subject: [PATCH] Introduced SettingHandle New class that serves as an accesor to a single setting --- libraries/shared/src/Settings.cpp | 11 +++++ libraries/shared/src/Settings.h | 75 +++++++++++++++++++++++++++++-- 2 files changed, 82 insertions(+), 4 deletions(-) diff --git a/libraries/shared/src/Settings.cpp b/libraries/shared/src/Settings.cpp index f5ccda039e..e6654ac274 100644 --- a/libraries/shared/src/Settings.cpp +++ b/libraries/shared/src/Settings.cpp @@ -9,5 +9,16 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // +#include + #include "Settings.h" +QVariant getFromSettings(QString key, QVariant defaultValue) { + return QSettings().value(key, defaultValue); +} + +void setInSettings(QString key, QVariant value) { + QSettings().setValue(key, value); +} + + diff --git a/libraries/shared/src/Settings.h b/libraries/shared/src/Settings.h index a8ae348006..6ed141e20f 100644 --- a/libraries/shared/src/Settings.h +++ b/libraries/shared/src/Settings.h @@ -12,13 +12,80 @@ #ifndef hifi_Settings_h #define hifi_Settings_h -#include +#include +#include -// Just a simple wrapper for now -class Settings : public QSettings { +template +class SettingHandle { +public: + SettingHandle(const QString& key, const T& defaultValue); + + const T& get() const; // Returns setting value, returns its default value if not found + const T& get(const T& other) const; // Returns setting value, returns other if not found + const T& getDefault() const; + + void set(const T& value) const; + void reset() const; + + static const QVariant::Type type; + +private: + const QString _key; + const QVariant _defaultValue; + + friend QVariant getFromSettings(QString key, QVariant defaultValue); + friend void setInSettings(QString key, QVariant value); }; -namespace SettingsKey { +// Specialize template here for types used in Setting +template const QVariant::Type SettingHandle::type = QVariant::Invalid; +template<> const QVariant::Type SettingHandle::type = QVariant::Int; +template<> const QVariant::Type SettingHandle::type = QVariant::Bool; +template<> const QVariant::Type SettingHandle::type = QVariant::Double; +template<> const QVariant::Type SettingHandle::type = QVariant::Double; +template<> const QVariant::Type SettingHandle::type = QVariant::String; + +template +SettingHandle::SettingHandle(const QString& key, const T& defaultValue) : _key(key), _defaultValue(defaultValue) { + // Will fire if template not specialized for that type below + Q_STATIC_ASSERT_X(SettingHandle::type != QVariant::Invalid, "SettingHandle: Invalid type"); +} + +template +const T& SettingHandle::get() const { + QVariant variant = getFromSettings(_key, _defaultValue); + if (variant.type() == type) { + return variant.value(); + } + return _defaultValue.value(); +} + +template +const T& SettingHandle::get(const T& other) const { + QVariant variant = getFromSettings(_key, _defaultValue); + if (variant.type() == type) { + return variant.value(); + } + return other; +} + +template inline +const T& SettingHandle::getDefault() const { + return _defaultValue.value(); +} + +template inline +void SettingHandle::set(const T& value) const { + setInSettings(_key, QVariant(value)); +} + +template inline +void SettingHandle::reset() const { + setInSettings(_key, _defaultValue); +} + +// Put applicationwide settings here +namespace SettingHandles { }