diff --git a/src/lib/common/Settings.cpp b/src/lib/common/Settings.cpp index eebe8c79f..fb1b66970 100644 --- a/src/lib/common/Settings.cpp +++ b/src/lib/common/Settings.cpp @@ -12,6 +12,7 @@ #include #include +#include #include #include #include @@ -32,7 +33,9 @@ void Settings::setSettingsFile(const QString &settingsFile) if (instance()->m_settings) instance()->m_settings->deleteLater(); + instance()->m_settingsWatcher->removePath(instance()->m_settings->fileName()); instance()->m_settings = new QSettings(settingsFile, QSettings::IniFormat, instance()); + instance()->m_settingsWatcher->addPath(settingsFile); instance()->m_settingsProxy->load(settingsFile); qInfo().noquote() << "settings file changed:" << instance()->m_settings->fileName(); @@ -40,6 +43,7 @@ void Settings::setSettingsFile(const QString &settingsFile) instance()->cleanSettings(); instance()->cleanStateSettings(); instance()->setupComputerName(); + instance()->checkIfSettingsWritableChange(); } void Settings::setStateFile(const QString &stateFile) @@ -56,7 +60,7 @@ void Settings::setStateFile(const QString &stateFile) qInfo().noquote() << "state file changed:" << instance()->m_stateSettings->fileName(); } -Settings::Settings(QObject *parent) : QObject(parent) +Settings::Settings(QObject *parent) : QObject(parent), m_settingsWatcher{new QFileSystemWatcher(this)} { QString fileToLoad; #ifdef Q_OS_WIN @@ -76,6 +80,9 @@ Settings::Settings(QObject *parent) : QObject(parent) fileToLoad = UserSettingFile; m_settings = new QSettings(fileToLoad, QSettings::IniFormat, this); + m_settingsWritable = m_settings->isWritable(); + m_settingsWatcher->addPath(m_settings->fileName()); + connect(m_settingsWatcher, &QFileSystemWatcher::fileChanged, this, &Settings::checkIfSettingsWritableChange); m_settingsProxy = std::make_shared(); m_settingsProxy->load(fileToLoad); qInfo().noquote() << "initial settings file:" << m_settings->fileName(); @@ -167,6 +174,15 @@ QString Settings::cleanComputerName(const QString &name) return cleanName; } +void Settings::checkIfSettingsWritableChange() const +{ + bool writable = m_settings->isWritable(); + if (writable == m_settingsWritable) + return; + instance()->m_settingsWritable = writable; + Q_EMIT instance()->settingsWritableChanged(writable); +} + QVariant Settings::defaultValue(const QString &key) { if (m_defaultFalseValues.contains(key)) diff --git a/src/lib/common/Settings.h b/src/lib/common/Settings.h index f614d7054..7aad23cf4 100644 --- a/src/lib/common/Settings.h +++ b/src/lib/common/Settings.h @@ -15,6 +15,7 @@ #include "common/NetworkProtocol.h" #include "common/QSettingsProxy.h" +class QFileSystemWatcher; class Settings : public QObject { Q_OBJECT @@ -198,6 +199,7 @@ public: Q_SIGNALS: void settingsChanged(const QString key); + void settingsWritableChanged(bool writable); void serverSettingsChanged(); private: @@ -227,8 +229,16 @@ private: */ static QString cleanComputerName(const QString &name); + /** + * @brief checkIfSettingsWritableChange + * Checks if the changed settings is now read only + */ + void checkIfSettingsWritableChange() const; + QSettings *m_settings = nullptr; QSettings *m_stateSettings = nullptr; + bool m_settingsWritable; + QFileSystemWatcher *m_settingsWatcher = nullptr; std::shared_ptr m_settingsProxy; // clang-format off