diff --git a/isettings.cpp b/isettings.cpp index ae9d2e4..e34e6d4 100644 --- a/isettings.cpp +++ b/isettings.cpp @@ -58,6 +58,10 @@ void ISettings::sync() { void ISettings::setValue(const QString key, const QVariant &value) { + if (_cache.contains(key) && _cache.value(key) == value) { + return; + } + _cache[key] = value; emit valueChanged(key, value); diff --git a/settingslistner.cpp b/settingslistner.cpp new file mode 100644 index 0000000..3eea39d --- /dev/null +++ b/settingslistner.cpp @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2018-2021 QuasarApp. + * Distributed under the lgplv3 software license, see the accompanying + * Everyone is permitted to copy and distribute verbatim copies + * of this license document, but changing it is not allowed. +*/ + +#include "isettings.h" +#include "settingslistner.h" + +namespace QuasarAppUtils { + +SettingsListner::SettingsListner() { + + auto settings = ISettings::instance(); + if (settings) { + + auto listner = [this](const QString& key, const QVariant& val){ + this->handleSettingsChanged(key, val); + }; + + _listnerConnection = QObject::connect(settings, + &ISettings::valueChanged, + listner); + } +} + +SettingsListner::~SettingsListner() { + QObject::disconnect(_listnerConnection); +} + +} diff --git a/settingslistner.h b/settingslistner.h new file mode 100644 index 0000000..95de5f2 --- /dev/null +++ b/settingslistner.h @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2018-2021 QuasarApp. + * Distributed under the lgplv3 software license, see the accompanying + * Everyone is permitted to copy and distribute verbatim copies + * of this license document, but changing it is not allowed. +*/ + +#ifndef SETTINGSLISTNER_H +#define SETTINGSLISTNER_H + +#include +#include + + +namespace QuasarAppUtils { + +/** + * @brief The SettingsListner class is listner of the ISettings global object. + * The SettingsListner class is abstrct class and contains only one method for hendling settings changes. + * + * + * ### Example of use : + * + * @code{cpp} + * class MyClass : protected QuasarAppUtils::SettingsListner { + * protected: + * void handleSettingsChanged(const QString& key, const QVariant& value) override { + * + * if (key == "shareName") { + setSessinon(static_cast(rand()) * rand()); + } + * } + * + * }; + * @endcode + * @see ISettings + */ +class SettingsListner +{ +public: + SettingsListner(); + virtual ~SettingsListner(); + +protected: + + /** + * @brief handleSettingsChanged This method will be invoked when settings of application has bean changed. + * @param key This is key of a changed settings. + * @param value This is a new value of a changed settings. + */ + virtual void handleSettingsChanged(const QString& key, + const QVariant& value) = 0; +private: + QMetaObject::Connection _listnerConnection; +}; + +} +#endif // SETTINGSLISTNER_H