diff --git a/plugins/lunchmealplugin/lunchmealsettings.cpp b/plugins/lunchmealplugin/lunchmealsettings.cpp index 9c3dcc1..3703770 100644 --- a/plugins/lunchmealplugin/lunchmealsettings.cpp +++ b/plugins/lunchmealplugin/lunchmealsettings.cpp @@ -19,13 +19,28 @@ QString LunchMealSettings::url() const return m_settings.value(m_url, m_defaultUrl).toString(); } -void LunchMealSettings::setUrl(const QString &url) +bool LunchMealSettings::setUrl(const QString &url) { - if(this->url() != url) - { - m_settings.setValue(QStringLiteral("LunchMealPlugin/url"), url); + if(this->url() == url) + return true; + + if(url == m_defaultUrl) + m_settings.remove(m_url); + else + m_settings.setValue(m_url, url); + + m_settings.sync(); + + const auto success = m_settings.status() == QSettings::NoError; + if(success) Q_EMIT urlChanged(url); + else + { + Q_EMIT m_settings.saveErrorOccured(); + Q_EMIT saveErrorOccured(); } + + return success; } QString LunchMealSettings::dateFormat() const @@ -33,11 +48,26 @@ QString LunchMealSettings::dateFormat() const return m_settings.value(m_dateFormat, m_defaultDateFormat).toString(); } -void LunchMealSettings::setDateFormat(const QString &dateFormat) +bool LunchMealSettings::setDateFormat(const QString &dateFormat) { - if(this->dateFormat() != dateFormat) - { - m_settings.setValue(QStringLiteral("LunchMealPlugin/dateFormat"), dateFormat); + if(this->dateFormat() == dateFormat) + return true; + + if(dateFormat == m_defaultDateFormat) + m_settings.remove(m_dateFormat); + else + m_settings.setValue(m_dateFormat, dateFormat); + + m_settings.sync(); + + const auto success = m_settings.status() == QSettings::NoError; + if(success) Q_EMIT dateFormatChanged(dateFormat); + else + { + Q_EMIT m_settings.saveErrorOccured(); + Q_EMIT saveErrorOccured(); } + + return success; } diff --git a/plugins/lunchmealplugin/lunchmealsettings.h b/plugins/lunchmealplugin/lunchmealsettings.h index 7db1913..6c8eec5 100644 --- a/plugins/lunchmealplugin/lunchmealsettings.h +++ b/plugins/lunchmealplugin/lunchmealsettings.h @@ -16,12 +16,14 @@ public: // no QString becuase placeholder %0 encodes wrong in urls! QString url() const; - void setUrl(const QString &url); + bool setUrl(const QString &url); QString dateFormat() const; - void setDateFormat(const QString &dateFormat); + bool setDateFormat(const QString &dateFormat); Q_SIGNALS: + void saveErrorOccured(); + void urlChanged(const QString &url); void dateFormatChanged(const QString &dateFormat); diff --git a/plugins/lunchmealplugin/lunchmealsettingswidget.cpp b/plugins/lunchmealplugin/lunchmealsettingswidget.cpp index a1edbb2..6f5754b 100644 --- a/plugins/lunchmealplugin/lunchmealsettingswidget.cpp +++ b/plugins/lunchmealplugin/lunchmealsettingswidget.cpp @@ -29,8 +29,8 @@ bool LunchMealSettingsWidget::isValid(QString &message) const return valid; } -void LunchMealSettingsWidget::apply() +bool LunchMealSettingsWidget::apply() { - m_settings.setUrl(m_lineEditUrl->text()); - m_settings.setDateFormat(m_lineEditDateFormat->text()); + return m_settings.setUrl(m_lineEditUrl->text()) && + m_settings.setDateFormat(m_lineEditDateFormat->text()); } diff --git a/plugins/lunchmealplugin/lunchmealsettingswidget.h b/plugins/lunchmealplugin/lunchmealsettingswidget.h index 72d99d6..779125d 100644 --- a/plugins/lunchmealplugin/lunchmealsettingswidget.h +++ b/plugins/lunchmealplugin/lunchmealsettingswidget.h @@ -16,7 +16,7 @@ public: virtual bool isValid(QString &message) const Q_DECL_OVERRIDE; public Q_SLOTS: - virtual void apply() Q_DECL_OVERRIDE; + virtual bool apply() Q_DECL_OVERRIDE; private: LunchMealSettings m_settings; diff --git a/plugins/presenceplugin/presencesettings.cpp b/plugins/presenceplugin/presencesettings.cpp index d1e315c..ba61eaf 100644 --- a/plugins/presenceplugin/presencesettings.cpp +++ b/plugins/presenceplugin/presencesettings.cpp @@ -17,11 +17,26 @@ int PresenceSettings::interval() const return m_settings.value(m_interval, m_defaultInterval).toInt(); } -void PresenceSettings::setInterval(int interval) +bool PresenceSettings::setInterval(int interval) { - if(this->interval() != interval) - { + if(this->interval() == interval) + return true; + + if(interval == m_defaultInterval) + m_settings.remove(m_interval); + else m_settings.setValue(m_interval, interval); + + m_settings.sync(); + + const auto success = m_settings.status() == QSettings::NoError; + if(success) Q_EMIT intervalChanged(interval); + else + { + Q_EMIT m_settings.saveErrorOccured(); + Q_EMIT saveErrorOccured(); } + + return success; } diff --git a/plugins/presenceplugin/presencesettings.h b/plugins/presenceplugin/presencesettings.h index 1fb2610..58f83ad 100644 --- a/plugins/presenceplugin/presencesettings.h +++ b/plugins/presenceplugin/presencesettings.h @@ -13,9 +13,11 @@ public: PresenceSettings(ZeiterfassungSettings &settings, QObject *parent = Q_NULLPTR); int interval() const; - void setInterval(int interval); + bool setInterval(int interval); Q_SIGNALS: + void saveErrorOccured(); + void intervalChanged(int interval); private: diff --git a/plugins/presenceplugin/presencesettingswidget.cpp b/plugins/presenceplugin/presencesettingswidget.cpp index b86c817..51b2733 100644 --- a/plugins/presenceplugin/presencesettingswidget.cpp +++ b/plugins/presenceplugin/presencesettingswidget.cpp @@ -18,13 +18,7 @@ PresenceSettingsWidget::PresenceSettingsWidget(ZeiterfassungSettings &settings, setLayout(layout); } -bool PresenceSettingsWidget::isValid(QString &message) const +bool PresenceSettingsWidget::apply() { - Q_UNUSED(message) - return true; -} - -void PresenceSettingsWidget::apply() -{ - m_settings.setInterval(m_spinBox->value()); + return m_settings.setInterval(m_spinBox->value()); } diff --git a/plugins/presenceplugin/presencesettingswidget.h b/plugins/presenceplugin/presencesettingswidget.h index 5427b32..c9d649b 100644 --- a/plugins/presenceplugin/presencesettingswidget.h +++ b/plugins/presenceplugin/presencesettingswidget.h @@ -13,10 +13,8 @@ class PresenceSettingsWidget : public SettingsWidget public: explicit PresenceSettingsWidget(ZeiterfassungSettings &settings, QWidget *parent = Q_NULLPTR); - virtual bool isValid(QString &message) const Q_DECL_OVERRIDE; - public Q_SLOTS: - virtual void apply() Q_DECL_OVERRIDE; + virtual bool apply() Q_DECL_OVERRIDE; private: PresenceSettings m_settings; diff --git a/plugins/updaterplugin/updatersettings.cpp b/plugins/updaterplugin/updatersettings.cpp index 2ea0fff..9d439e0 100644 --- a/plugins/updaterplugin/updatersettings.cpp +++ b/plugins/updaterplugin/updatersettings.cpp @@ -18,13 +18,28 @@ QUrl UpdaterSettings::url() const return m_settings.value(m_url, m_defaultUrl).toUrl(); } -void UpdaterSettings::setUrl(const QUrl &url) +bool UpdaterSettings::setUrl(const QUrl &url) { - if(this->url() != url) - { + if(this->url() == url) + return true; + + if(url == m_defaultUrl) + m_settings.remove(m_url); + else m_settings.setValue(m_url, url); + + m_settings.sync(); + + const auto success = m_settings.status() == QSettings::NoError; + if(success) Q_EMIT urlChanged(url); + else + { + Q_EMIT m_settings.saveErrorOccured(); + Q_EMIT saveErrorOccured(); } + + return success; } QDate UpdaterSettings::lastUpdateCheck() const @@ -32,11 +47,26 @@ QDate UpdaterSettings::lastUpdateCheck() const return m_settings.value(m_lastUpdateCheck).toDate(); } -void UpdaterSettings::setLastUpdateCheck(const QDate &lastUpdateCheck) +bool UpdaterSettings::setLastUpdateCheck(const QDate &lastUpdateCheck) { - if(this->lastUpdateCheck() != lastUpdateCheck) - { + if(this->lastUpdateCheck() == lastUpdateCheck) + return true; + + if(!lastUpdateCheck.isValid()) + m_settings.remove(m_lastUpdateCheck); + else m_settings.setValue(m_lastUpdateCheck, lastUpdateCheck); + + m_settings.sync(); + + const auto success = m_settings.status() == QSettings::NoError; + if(success) Q_EMIT lastUpdateCheckChanged(lastUpdateCheck); + else + { + Q_EMIT m_settings.saveErrorOccured(); + Q_EMIT saveErrorOccured(); } + + return success; } diff --git a/plugins/updaterplugin/updatersettings.h b/plugins/updaterplugin/updatersettings.h index 0eca1e4..f6998eb 100644 --- a/plugins/updaterplugin/updatersettings.h +++ b/plugins/updaterplugin/updatersettings.h @@ -16,12 +16,14 @@ public: explicit UpdaterSettings(ZeiterfassungSettings &settings, QObject *parent = Q_NULLPTR); QUrl url() const; - void setUrl(const QUrl &url); + bool setUrl(const QUrl &url); QDate lastUpdateCheck() const; - void setLastUpdateCheck(const QDate &lastUpdateCheck); + bool setLastUpdateCheck(const QDate &lastUpdateCheck); Q_SIGNALS: + void saveErrorOccured(); + void urlChanged(const QUrl &url); void lastUpdateCheckChanged(const QDate &lastUpdateCheck); diff --git a/plugins/updaterplugin/updatersettingswidget.cpp b/plugins/updaterplugin/updatersettingswidget.cpp index 1b0c63b..883bcc1 100644 --- a/plugins/updaterplugin/updatersettingswidget.cpp +++ b/plugins/updaterplugin/updatersettingswidget.cpp @@ -26,7 +26,7 @@ bool UpdaterSettingsWidget::isValid(QString &message) const return valid; } -void UpdaterSettingsWidget::apply() +bool UpdaterSettingsWidget::apply() { - m_settings.setUrl(QUrl(m_lineEdit->text())); + return m_settings.setUrl(QUrl(m_lineEdit->text())); } diff --git a/plugins/updaterplugin/updatersettingswidget.h b/plugins/updaterplugin/updatersettingswidget.h index 74a938e..a3568d2 100644 --- a/plugins/updaterplugin/updatersettingswidget.h +++ b/plugins/updaterplugin/updatersettingswidget.h @@ -16,7 +16,7 @@ public: virtual bool isValid(QString &message) const Q_DECL_OVERRIDE; public Q_SLOTS: - virtual void apply() Q_DECL_OVERRIDE; + virtual bool apply() Q_DECL_OVERRIDE; private: UpdaterSettings m_settings; diff --git a/plugins/weatherplugin/weathersettings.cpp b/plugins/weatherplugin/weathersettings.cpp index fc9a99c..71332df 100644 --- a/plugins/weatherplugin/weathersettings.cpp +++ b/plugins/weatherplugin/weathersettings.cpp @@ -17,11 +17,26 @@ QUrl WeatherSettings::url() const return m_settings.value(m_url, m_defaultUrl).toUrl(); } -void WeatherSettings::setUrl(const QUrl &url) +bool WeatherSettings::setUrl(const QUrl &url) { - if(this->url() != url) - { + if(this->url() == url) + return true; + + if(url == m_defaultUrl) + m_settings.remove(m_url); + else m_settings.setValue(m_url, url); + + m_settings.sync(); + + const auto success = m_settings.status() == QSettings::NoError; + if(success) Q_EMIT urlChanged(url); + else + { + Q_EMIT m_settings.saveErrorOccured(); + Q_EMIT saveErrorOccured(); } + + return success; } diff --git a/plugins/weatherplugin/weathersettings.h b/plugins/weatherplugin/weathersettings.h index c137b6f..aa9fb2f 100644 --- a/plugins/weatherplugin/weathersettings.h +++ b/plugins/weatherplugin/weathersettings.h @@ -14,9 +14,11 @@ public: WeatherSettings(ZeiterfassungSettings &settings, QObject *parent = Q_NULLPTR); QUrl url() const; - void setUrl(const QUrl &url); + bool setUrl(const QUrl &url); Q_SIGNALS: + void saveErrorOccured(); + void urlChanged(const QUrl &url); private: diff --git a/plugins/weatherplugin/weathersettingswidget.cpp b/plugins/weatherplugin/weathersettingswidget.cpp index 2e14db6..35f3cb5 100644 --- a/plugins/weatherplugin/weathersettingswidget.cpp +++ b/plugins/weatherplugin/weathersettingswidget.cpp @@ -26,7 +26,7 @@ bool WeatherSettingsWidget::isValid(QString &message) const return valid; } -void WeatherSettingsWidget::apply() +bool WeatherSettingsWidget::apply() { - m_settings.setUrl(QUrl::fromUserInput(m_lineEdit->text())); + return m_settings.setUrl(QUrl::fromUserInput(m_lineEdit->text())); } diff --git a/plugins/weatherplugin/weathersettingswidget.h b/plugins/weatherplugin/weathersettingswidget.h index b1688a6..7936f48 100644 --- a/plugins/weatherplugin/weathersettingswidget.h +++ b/plugins/weatherplugin/weathersettingswidget.h @@ -20,7 +20,7 @@ public: bool isValid(QString &message) const Q_DECL_OVERRIDE; public Q_SLOTS: - void apply() Q_DECL_OVERRIDE; + virtual bool apply() Q_DECL_OVERRIDE; private: WeatherSettings m_settings; diff --git a/plugins/webradioplugin/webradiosettings.cpp b/plugins/webradioplugin/webradiosettings.cpp index 8b65a3a..615c44a 100644 --- a/plugins/webradioplugin/webradiosettings.cpp +++ b/plugins/webradioplugin/webradiosettings.cpp @@ -31,13 +31,28 @@ QStringList WebRadioSettings::urls() const return m_settings.value(m_urls, m_defaultUrls).toStringList(); } -void WebRadioSettings::setUrls(const QStringList &urls) +bool WebRadioSettings::setUrls(const QStringList &urls) { - if(this->urls() != urls) - { + if(this->urls() == urls) + return true; + + if(urls == m_defaultUrls) + m_settings.remove(m_urls); + else m_settings.setValue(m_urls, urls); + + m_settings.sync(); + + const auto success = m_settings.status() == QSettings::NoError; + if(success) Q_EMIT urlsChanged(urls); + else + { + Q_EMIT m_settings.saveErrorOccured(); + Q_EMIT saveErrorOccured(); } + + return success; } QString WebRadioSettings::lastUrl() const @@ -45,13 +60,28 @@ QString WebRadioSettings::lastUrl() const return m_settings.value(m_lastUrl).toString(); } -void WebRadioSettings::setLastUrl(const QString &lastUrl) +bool WebRadioSettings::setLastUrl(const QString &lastUrl) { - if(this->lastUrl() != lastUrl) - { + if(this->lastUrl() == lastUrl) + return true; + + if(lastUrl.isNull()) + m_settings.remove(m_lastUrl); + else m_settings.setValue(m_lastUrl, lastUrl); + + m_settings.sync(); + + const auto success = m_settings.status() == QSettings::NoError; + if(success) Q_EMIT lastUrlChanged(lastUrl); + else + { + Q_EMIT m_settings.saveErrorOccured(); + Q_EMIT saveErrorOccured(); } + + return success; } int WebRadioSettings::volume() const @@ -59,11 +89,26 @@ int WebRadioSettings::volume() const return m_settings.value(m_volume, m_defaultVolume).toInt(); } -void WebRadioSettings::setVolume(int volume) +bool WebRadioSettings::setVolume(int volume) { - if(this->volume() != volume) - { + if(this->volume() == volume) + return true; + + if(volume == m_defaultVolume) + m_settings.remove(m_volume); + else m_settings.setValue(m_volume, volume); + + m_settings.sync(); + + const auto success = m_settings.status() == QSettings::NoError; + if(success) Q_EMIT volumeChanged(volume); + else + { + Q_EMIT m_settings.saveErrorOccured(); + Q_EMIT saveErrorOccured(); } + + return success; } diff --git a/plugins/webradioplugin/webradiosettings.h b/plugins/webradioplugin/webradiosettings.h index 12c9ad7..0e8ceb6 100644 --- a/plugins/webradioplugin/webradiosettings.h +++ b/plugins/webradioplugin/webradiosettings.h @@ -16,15 +16,17 @@ public: WebRadioSettings(ZeiterfassungSettings &settings, QObject *parent = Q_NULLPTR); QStringList urls() const; - void setUrls(const QStringList &urls); + bool setUrls(const QStringList &urls); QString lastUrl() const; - void setLastUrl(const QString &lastUrl); + bool setLastUrl(const QString &lastUrl); int volume() const; - void setVolume(int volume); + bool setVolume(int volume); Q_SIGNALS: + void saveErrorOccured(); + void urlsChanged(const QStringList &urls); void lastUrlChanged(const QString &lastUrl); void volumeChanged(int volume); diff --git a/plugins/webradioplugin/webradiosettingswidget.cpp b/plugins/webradioplugin/webradiosettingswidget.cpp index c66eff1..adec37d 100644 --- a/plugins/webradioplugin/webradiosettingswidget.cpp +++ b/plugins/webradioplugin/webradiosettingswidget.cpp @@ -31,8 +31,7 @@ bool WebRadioSettingsWidget::isValid(QString &message) const return true; } -void WebRadioSettingsWidget::apply() +bool WebRadioSettingsWidget::apply() { - if(m_urlsWidget->stringList() != m_settings.urls()) - m_settings.setUrls(m_urlsWidget->stringList()); + return m_settings.setUrls(m_urlsWidget->stringList()); } diff --git a/plugins/webradioplugin/webradiosettingswidget.h b/plugins/webradioplugin/webradiosettingswidget.h index d1f77dc..d3556ee 100644 --- a/plugins/webradioplugin/webradiosettingswidget.h +++ b/plugins/webradioplugin/webradiosettingswidget.h @@ -20,7 +20,7 @@ public: bool isValid(QString &message) const Q_DECL_OVERRIDE; public Q_SLOTS: - void apply() Q_DECL_OVERRIDE; + virtual bool apply() Q_DECL_OVERRIDE; private: WebRadioSettings m_settings; diff --git a/zeiterfassungcorelib/zeiterfassungsettings.cpp b/zeiterfassungcorelib/zeiterfassungsettings.cpp index 8f6aa6c..590872f 100644 --- a/zeiterfassungcorelib/zeiterfassungsettings.cpp +++ b/zeiterfassungcorelib/zeiterfassungsettings.cpp @@ -1,5 +1,7 @@ #include "zeiterfassungsettings.h" +#include + const QString ZeiterfassungSettings::m_language("language"); const QString ZeiterfassungSettings::m_url("url"); const QString ZeiterfassungSettings::m_username("username"); @@ -48,16 +50,25 @@ QLocale::Language ZeiterfassungSettings::language() const return value(m_language, m_defaultLanguage).value(); } -void ZeiterfassungSettings::setLanguage(QLocale::Language language) +bool ZeiterfassungSettings::setLanguage(QLocale::Language language) { - if(this->language() != language) - { - if(m_defaultLanguage == language) - remove(m_language); - else - setValue(m_language, language); + if(this->language() == language) + return true; + + if(m_defaultLanguage == language) + remove(m_language); + else + setValue(m_language, language); + + sync(); + + const auto success = status() == QSettings::NoError; + if(success) Q_EMIT languageChanged(language); - } + else + Q_EMIT saveErrorOccured(); + + return success; } QUrl ZeiterfassungSettings::url() const @@ -65,16 +76,25 @@ QUrl ZeiterfassungSettings::url() const return value(m_url, m_defaultUrl).toUrl(); } -void ZeiterfassungSettings::setUrl(const QUrl &url) +bool ZeiterfassungSettings::setUrl(const QUrl &url) { - if(this->url() != url) - { - if(m_defaultUrl == url) - remove(m_url); - else - setValue(m_url, url); + if(this->url() == url) + return true; + + if(m_defaultUrl == url) + remove(m_url); + else + setValue(m_url, url); + + sync(); + + const auto success = status() == QSettings::NoError; + if(success) Q_EMIT urlChanged(url); - } + else + Q_EMIT saveErrorOccured(); + + return success; } QString ZeiterfassungSettings::username() const @@ -82,16 +102,25 @@ QString ZeiterfassungSettings::username() const return value(m_username).toString(); } -void ZeiterfassungSettings::setUsername(const QString &username) +bool ZeiterfassungSettings::setUsername(const QString &username) { - if(this->username() != username) - { - if(username.isEmpty()) - remove(m_username); - else - setValue(m_username, username); + if(this->username() == username) + return true; + + if(username.isEmpty()) + remove(m_username); + else + setValue(m_username, username); + + sync(); + + const auto success = status() == QSettings::NoError; + if(success) Q_EMIT usernameChanged(username); - } + else + Q_EMIT saveErrorOccured(); + + return success; } QString ZeiterfassungSettings::password() const @@ -99,16 +128,25 @@ QString ZeiterfassungSettings::password() const return value(m_password).toString(); } -void ZeiterfassungSettings::setPassword(const QString &password) +bool ZeiterfassungSettings::setPassword(const QString &password) { - if(this->password() != password) - { - if(password.isEmpty()) - remove(m_password); - else - setValue(m_password, password); + if(this->password() == password) + return true; + + if(password.isEmpty()) + remove(m_password); + else + setValue(m_password, password); + + sync(); + + const auto success = status() == QSettings::NoError; + if(success) Q_EMIT passwordChanged(password); - } + else + Q_EMIT saveErrorOccured(); + + return success; } QStringList ZeiterfassungSettings::projects() const @@ -116,21 +154,30 @@ QStringList ZeiterfassungSettings::projects() const return value(m_projects).toStringList(); } -void ZeiterfassungSettings::setProjects(const QStringList &projects) +bool ZeiterfassungSettings::setProjects(const QStringList &projects) { - if(this->projects() != projects) - { - if(projects.isEmpty()) - remove(m_projects); - else - setValue(m_projects, projects); + if(this->projects() == projects) + return true; + + if(projects.isEmpty()) + remove(m_projects); + else + setValue(m_projects, projects); + + sync(); + + const auto success = status() == QSettings::NoError; + if(success) Q_EMIT projectsChanged(projects); - } + else + Q_EMIT saveErrorOccured(); + + return success; } -void ZeiterfassungSettings::prependProject(const QString &project) +bool ZeiterfassungSettings::prependProject(const QString &project) { - setProjects(prependItem(projects(), project)); + return setProjects(prependItem(projects(), project)); } QStringList ZeiterfassungSettings::subprojects() const @@ -138,21 +185,30 @@ QStringList ZeiterfassungSettings::subprojects() const return value(m_subprojects).toStringList(); } -void ZeiterfassungSettings::setSubprojects(const QStringList &subprojects) +bool ZeiterfassungSettings::setSubprojects(const QStringList &subprojects) { - if(this->subprojects() != subprojects) - { - if(subprojects.isEmpty()) - remove(m_subprojects); - else - setValue(m_subprojects, subprojects); + if(this->subprojects() == subprojects) + return true; + + if(subprojects.isEmpty()) + remove(m_subprojects); + else + setValue(m_subprojects, subprojects); + + sync(); + + const auto success = status() == QSettings::NoError; + if(success) Q_EMIT subprojectsChanged(subprojects); - } + else + Q_EMIT saveErrorOccured(); + + return success; } -void ZeiterfassungSettings::prependSubproject(const QString &subproject) +bool ZeiterfassungSettings::prependSubproject(const QString &subproject) { - setSubprojects(prependItem(subprojects(), subproject)); + return setSubprojects(prependItem(subprojects(), subproject)); } QStringList ZeiterfassungSettings::workpackages() const @@ -160,21 +216,30 @@ QStringList ZeiterfassungSettings::workpackages() const return value(m_workpackages).toStringList(); } -void ZeiterfassungSettings::setWorkpackages(const QStringList &workpackages) +bool ZeiterfassungSettings::setWorkpackages(const QStringList &workpackages) { - if(this->workpackages() != workpackages) - { - if(workpackages.isEmpty()) - remove(m_workpackages); - else - setValue(m_workpackages, workpackages); + if(this->workpackages() == workpackages) + return true; + + if(workpackages.isEmpty()) + remove(m_workpackages); + else + setValue(m_workpackages, workpackages); + + sync(); + + const auto success = status() == QSettings::NoError; + if(success) Q_EMIT workpackagesChanged(workpackages); - } + else + Q_EMIT saveErrorOccured(); + + return success; } -void ZeiterfassungSettings::prependWorkpackage(const QString &workpackage) +bool ZeiterfassungSettings::prependWorkpackage(const QString &workpackage) { - setWorkpackages(prependItem(workpackages(), workpackage)); + return setWorkpackages(prependItem(workpackages(), workpackage)); } QStringList ZeiterfassungSettings::texts() const @@ -182,21 +247,30 @@ QStringList ZeiterfassungSettings::texts() const return value(m_texts).toStringList(); } -void ZeiterfassungSettings::setTexts(const QStringList &texts) +bool ZeiterfassungSettings::setTexts(const QStringList &texts) { - if(this->texts() != texts) - { - if(m_texts.isEmpty()) - remove(m_texts); - else - setValue(m_texts, texts); + if(this->texts() == texts) + return true; + + if(m_texts.isEmpty()) + remove(m_texts); + else + setValue(m_texts, texts); + + sync(); + + const auto success = status() == QSettings::NoError; + if(success) Q_EMIT textsChanged(texts); - } + else + Q_EMIT saveErrorOccured(); + + return success; } -void ZeiterfassungSettings::prependText(const QString &text) +bool ZeiterfassungSettings::prependText(const QString &text) { - setTexts(prependItem(texts(), text)); + return setTexts(prependItem(texts(), text)); } QString ZeiterfassungSettings::theme() const @@ -204,16 +278,25 @@ QString ZeiterfassungSettings::theme() const return value(m_theme).toString(); } -void ZeiterfassungSettings::setTheme(const QString &theme) +bool ZeiterfassungSettings::setTheme(const QString &theme) { - if(this->theme() != theme) - { - if(theme.isEmpty()) - remove(m_theme); - else - setValue(m_theme, theme); + if(this->theme() == theme) + return true; + + if(theme.isEmpty()) + remove(m_theme); + else + setValue(m_theme, theme); + + sync(); + + const auto success = status() == QSettings::NoError; + if(success) Q_EMIT themeChanged(theme); - } + else + Q_EMIT saveErrorOccured(); + + return success; } QStringList ZeiterfassungSettings::prependItem(QStringList list, const QString &item) diff --git a/zeiterfassungcorelib/zeiterfassungsettings.h b/zeiterfassungcorelib/zeiterfassungsettings.h index 8b35a75..c1f80e4 100644 --- a/zeiterfassungcorelib/zeiterfassungsettings.h +++ b/zeiterfassungcorelib/zeiterfassungsettings.h @@ -33,37 +33,39 @@ public: explicit ZeiterfassungSettings(QObject *parent = Q_NULLPTR); QLocale::Language language() const; - void setLanguage(QLocale::Language language); + bool setLanguage(QLocale::Language language); QUrl url() const; - void setUrl(const QUrl &url); + bool setUrl(const QUrl &url); QString username() const; - void setUsername(const QString &username); + bool setUsername(const QString &username); QString password() const; - void setPassword(const QString &password); + bool setPassword(const QString &password); QStringList projects() const; - void setProjects(const QStringList &projects); - void prependProject(const QString &project); + bool setProjects(const QStringList &projects); + bool prependProject(const QString &project); QStringList subprojects() const; - void setSubprojects(const QStringList &subprojects); - void prependSubproject(const QString &subproject); + bool setSubprojects(const QStringList &subprojects); + bool prependSubproject(const QString &subproject); QStringList workpackages() const; - void setWorkpackages(const QStringList &workpackages); - void prependWorkpackage(const QString &workpackage); + bool setWorkpackages(const QStringList &workpackages); + bool prependWorkpackage(const QString &workpackage); QStringList texts() const; - void setTexts(const QStringList &texts); - void prependText(const QString &text); + bool setTexts(const QStringList &texts); + bool prependText(const QString &text); QString theme() const; - void setTheme(const QString &theme); + bool setTheme(const QString &theme); Q_SIGNALS: + void saveErrorOccured(); + void languageChanged(QLocale::Language language); void urlChanged(const QUrl &url); void usernameChanged(const QString &username); diff --git a/zeiterfassungguilib/dialogs/settingsdialog.cpp b/zeiterfassungguilib/dialogs/settingsdialog.cpp index 2e2c315..c1a41e9 100644 --- a/zeiterfassungguilib/dialogs/settingsdialog.cpp +++ b/zeiterfassungguilib/dialogs/settingsdialog.cpp @@ -82,7 +82,12 @@ void SettingsDialog::submit() if(ui->comboBoxLanguage->currentData().value() != m_settings.language()) { - m_settings.setLanguage(ui->comboBoxLanguage->currentData().value()); + if(!m_settings.setLanguage(ui->comboBoxLanguage->currentData().value())) + { + errorOccured(); + return; + } + //TODO #73 Allow changing of the language without restart QMessageBox::information(this, tr("Restart required!"), tr("To apply the new settings a restart is required!")); } @@ -90,9 +95,8 @@ void SettingsDialog::submit() auto theme = ui->comboBoxTheme->currentData().toString(); if(theme != m_settings.theme()) { - if(theme.isEmpty()) - qApp->setStyleSheet(QString()); - else + QString styleSheet; + if(!theme.isEmpty()) { auto themePath = QDir(QDir(QCoreApplication::applicationDirPath()).absoluteFilePath(QStringLiteral("themes"))).absoluteFilePath(theme); @@ -111,14 +115,31 @@ void SettingsDialog::submit() } QTextStream textStream(&file); - qApp->setStyleSheet(textStream.readAll().replace(QStringLiteral("@THEME_RESOURCES@"), themePath)); + styleSheet = textStream.readAll().replace(QStringLiteral("@THEME_RESOURCES@"), themePath); } - m_settings.setTheme(theme); + if(!m_settings.setTheme(theme)) + { + errorOccured(); + return; + } + + qApp->setStyleSheet(styleSheet); } for(const auto widget : m_settingsWidgets) - widget->apply(); + { + if(!widget->apply()) + { + errorOccured(); + return; + } + } accept(); } + +void SettingsDialog::errorOccured() +{ + QMessageBox::warning(this, tr("Could not save settings!"), tr("Could not load settings!") % "\n\n" % tr("Make sure you have writing permissions!")); +} diff --git a/zeiterfassungguilib/dialogs/settingsdialog.h b/zeiterfassungguilib/dialogs/settingsdialog.h index 149869d..cd567d2 100644 --- a/zeiterfassungguilib/dialogs/settingsdialog.h +++ b/zeiterfassungguilib/dialogs/settingsdialog.h @@ -20,6 +20,8 @@ private Q_SLOTS: void submit(); private: + void errorOccured(); + Ui::SettingsDialog *ui; ZeiterfassungSettings &m_settings; QVector m_settingsWidgets; diff --git a/zeiterfassungguilib/settingswidget.h b/zeiterfassungguilib/settingswidget.h index 7b21ff2..65aebee 100644 --- a/zeiterfassungguilib/settingswidget.h +++ b/zeiterfassungguilib/settingswidget.h @@ -15,5 +15,5 @@ public: virtual bool isValid(QString &message) const { Q_UNUSED(message) return true; } public Q_SLOTS: - virtual void apply() { } + virtual bool apply() = 0; };