#ifndef QTMVVM_SETTINGSENTRY_H #define QTMVVM_SETTINGSENTRY_H #include "QtMvvmCore/isettingsaccessor.h" namespace QtMvvm { template class SettingsEntry { Q_DISABLE_COPY(SettingsEntry) public: SettingsEntry() = default; bool isSet() const; T get() const; void set(const T &value); void reset(); SettingsEntry &operator=(const T &value); operator const T() const; void addChangeCallback(const std::function &callback); void addChangeCallback(QObject *scope, const std::function &callback); // internal void setup(const QString &key, ISettingsAccessor *accessor, const QVariant &defaultValue = {}); private: QString _key; ISettingsAccessor *_accessor = nullptr; QVariant _default; }; template <> class SettingsEntry { Q_DISABLE_COPY(SettingsEntry) public: SettingsEntry() = default; // internal void setup(const QString &, ISettingsAccessor *, const QVariant & = {}) {} }; // ------------- Generic Implementation ------------- template bool SettingsEntry::isSet() const { return _accessor->contains(_key); } template T SettingsEntry::get() const { return _accessor->load(_key, _default).template value(); } template void SettingsEntry::set(const T &value) { _accessor->save(_key, QVariant::fromValue(value)); } template void SettingsEntry::reset() { _accessor->remove(_key); } template SettingsEntry &SettingsEntry::operator=(const T &value) { set(value); return (*this); } template void SettingsEntry::addChangeCallback(const std::function &callback) { addChangeCallback(_accessor, callback); } template void SettingsEntry::addChangeCallback(QObject *scope, const std::function &callback) { auto mKey = _key; auto mDefault = _default; QObject::connect(_accessor, &ISettingsAccessor::entryChanged, scope, [mKey, callback](const QString &key, const QVariant &value) { if(key == mKey) callback(value.template value()); }); QObject::connect(_accessor, &ISettingsAccessor::entryRemoved, scope, [mKey, mDefault, callback](const QString &key) { if(key == mKey) callback(mDefault.template value()); }); } template SettingsEntry::operator const T() const { return get(); } template void SettingsEntry::setup(const QString &key, ISettingsAccessor *accessor, const QVariant &defaultValue) { Q_ASSERT_X(accessor, Q_FUNC_INFO, "You must set a valid accessor before initializing the settings!"); _key = key; _accessor = accessor; _default = defaultValue; } } #endif // QTMVVM_SETTINGSENTRY_H