Merge pull request #90 from 0xFEEDC0DE64/88-settings-error-handling

Improve error handling of QSettings saving [#88]
This commit is contained in:
Daniel Brunner
2018-05-25 16:04:45 +02:00
committed by GitHub
25 changed files with 408 additions and 164 deletions

View File

@@ -19,13 +19,28 @@ QString LunchMealSettings::url() const
return m_settings.value(m_url, m_defaultUrl).toString(); 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) if(this->url() == url)
{ return true;
m_settings.setValue(QStringLiteral("LunchMealPlugin/url"), url);
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); Q_EMIT urlChanged(url);
else
{
Q_EMIT m_settings.saveErrorOccured();
Q_EMIT saveErrorOccured();
} }
return success;
} }
QString LunchMealSettings::dateFormat() const QString LunchMealSettings::dateFormat() const
@@ -33,11 +48,26 @@ QString LunchMealSettings::dateFormat() const
return m_settings.value(m_dateFormat, m_defaultDateFormat).toString(); 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) if(this->dateFormat() == dateFormat)
{ return true;
m_settings.setValue(QStringLiteral("LunchMealPlugin/dateFormat"), dateFormat);
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); Q_EMIT dateFormatChanged(dateFormat);
else
{
Q_EMIT m_settings.saveErrorOccured();
Q_EMIT saveErrorOccured();
} }
return success;
} }

View File

@@ -16,12 +16,14 @@ public:
// no QString becuase placeholder %0 encodes wrong in urls! // no QString becuase placeholder %0 encodes wrong in urls!
QString url() const; QString url() const;
void setUrl(const QString &url); bool setUrl(const QString &url);
QString dateFormat() const; QString dateFormat() const;
void setDateFormat(const QString &dateFormat); bool setDateFormat(const QString &dateFormat);
Q_SIGNALS: Q_SIGNALS:
void saveErrorOccured();
void urlChanged(const QString &url); void urlChanged(const QString &url);
void dateFormatChanged(const QString &dateFormat); void dateFormatChanged(const QString &dateFormat);

View File

@@ -29,8 +29,8 @@ bool LunchMealSettingsWidget::isValid(QString &message) const
return valid; return valid;
} }
void LunchMealSettingsWidget::apply() bool LunchMealSettingsWidget::apply()
{ {
m_settings.setUrl(m_lineEditUrl->text()); return m_settings.setUrl(m_lineEditUrl->text()) &&
m_settings.setDateFormat(m_lineEditDateFormat->text()); m_settings.setDateFormat(m_lineEditDateFormat->text());
} }

View File

@@ -16,7 +16,7 @@ public:
virtual bool isValid(QString &message) const Q_DECL_OVERRIDE; virtual bool isValid(QString &message) const Q_DECL_OVERRIDE;
public Q_SLOTS: public Q_SLOTS:
virtual void apply() Q_DECL_OVERRIDE; virtual bool apply() Q_DECL_OVERRIDE;
private: private:
LunchMealSettings m_settings; LunchMealSettings m_settings;

View File

@@ -17,11 +17,26 @@ int PresenceSettings::interval() const
return m_settings.value(m_interval, m_defaultInterval).toInt(); 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.setValue(m_interval, interval);
m_settings.sync();
const auto success = m_settings.status() == QSettings::NoError;
if(success)
Q_EMIT intervalChanged(interval); Q_EMIT intervalChanged(interval);
else
{
Q_EMIT m_settings.saveErrorOccured();
Q_EMIT saveErrorOccured();
} }
return success;
} }

View File

@@ -13,9 +13,11 @@ public:
PresenceSettings(ZeiterfassungSettings &settings, QObject *parent = Q_NULLPTR); PresenceSettings(ZeiterfassungSettings &settings, QObject *parent = Q_NULLPTR);
int interval() const; int interval() const;
void setInterval(int interval); bool setInterval(int interval);
Q_SIGNALS: Q_SIGNALS:
void saveErrorOccured();
void intervalChanged(int interval); void intervalChanged(int interval);
private: private:

View File

@@ -18,13 +18,7 @@ PresenceSettingsWidget::PresenceSettingsWidget(ZeiterfassungSettings &settings,
setLayout(layout); setLayout(layout);
} }
bool PresenceSettingsWidget::isValid(QString &message) const bool PresenceSettingsWidget::apply()
{ {
Q_UNUSED(message) return m_settings.setInterval(m_spinBox->value());
return true;
}
void PresenceSettingsWidget::apply()
{
m_settings.setInterval(m_spinBox->value());
} }

View File

@@ -13,10 +13,8 @@ class PresenceSettingsWidget : public SettingsWidget
public: public:
explicit PresenceSettingsWidget(ZeiterfassungSettings &settings, QWidget *parent = Q_NULLPTR); explicit PresenceSettingsWidget(ZeiterfassungSettings &settings, QWidget *parent = Q_NULLPTR);
virtual bool isValid(QString &message) const Q_DECL_OVERRIDE;
public Q_SLOTS: public Q_SLOTS:
virtual void apply() Q_DECL_OVERRIDE; virtual bool apply() Q_DECL_OVERRIDE;
private: private:
PresenceSettings m_settings; PresenceSettings m_settings;

View File

@@ -18,13 +18,28 @@ QUrl UpdaterSettings::url() const
return m_settings.value(m_url, m_defaultUrl).toUrl(); 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.setValue(m_url, url);
m_settings.sync();
const auto success = m_settings.status() == QSettings::NoError;
if(success)
Q_EMIT urlChanged(url); Q_EMIT urlChanged(url);
else
{
Q_EMIT m_settings.saveErrorOccured();
Q_EMIT saveErrorOccured();
} }
return success;
} }
QDate UpdaterSettings::lastUpdateCheck() const QDate UpdaterSettings::lastUpdateCheck() const
@@ -32,11 +47,26 @@ QDate UpdaterSettings::lastUpdateCheck() const
return m_settings.value(m_lastUpdateCheck).toDate(); 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.setValue(m_lastUpdateCheck, lastUpdateCheck);
m_settings.sync();
const auto success = m_settings.status() == QSettings::NoError;
if(success)
Q_EMIT lastUpdateCheckChanged(lastUpdateCheck); Q_EMIT lastUpdateCheckChanged(lastUpdateCheck);
else
{
Q_EMIT m_settings.saveErrorOccured();
Q_EMIT saveErrorOccured();
} }
return success;
} }

View File

@@ -16,12 +16,14 @@ public:
explicit UpdaterSettings(ZeiterfassungSettings &settings, QObject *parent = Q_NULLPTR); explicit UpdaterSettings(ZeiterfassungSettings &settings, QObject *parent = Q_NULLPTR);
QUrl url() const; QUrl url() const;
void setUrl(const QUrl &url); bool setUrl(const QUrl &url);
QDate lastUpdateCheck() const; QDate lastUpdateCheck() const;
void setLastUpdateCheck(const QDate &lastUpdateCheck); bool setLastUpdateCheck(const QDate &lastUpdateCheck);
Q_SIGNALS: Q_SIGNALS:
void saveErrorOccured();
void urlChanged(const QUrl &url); void urlChanged(const QUrl &url);
void lastUpdateCheckChanged(const QDate &lastUpdateCheck); void lastUpdateCheckChanged(const QDate &lastUpdateCheck);

View File

@@ -26,7 +26,7 @@ bool UpdaterSettingsWidget::isValid(QString &message) const
return valid; return valid;
} }
void UpdaterSettingsWidget::apply() bool UpdaterSettingsWidget::apply()
{ {
m_settings.setUrl(QUrl(m_lineEdit->text())); return m_settings.setUrl(QUrl(m_lineEdit->text()));
} }

View File

@@ -16,7 +16,7 @@ public:
virtual bool isValid(QString &message) const Q_DECL_OVERRIDE; virtual bool isValid(QString &message) const Q_DECL_OVERRIDE;
public Q_SLOTS: public Q_SLOTS:
virtual void apply() Q_DECL_OVERRIDE; virtual bool apply() Q_DECL_OVERRIDE;
private: private:
UpdaterSettings m_settings; UpdaterSettings m_settings;

View File

@@ -17,11 +17,26 @@ QUrl WeatherSettings::url() const
return m_settings.value(m_url, m_defaultUrl).toUrl(); 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.setValue(m_url, url);
m_settings.sync();
const auto success = m_settings.status() == QSettings::NoError;
if(success)
Q_EMIT urlChanged(url); Q_EMIT urlChanged(url);
else
{
Q_EMIT m_settings.saveErrorOccured();
Q_EMIT saveErrorOccured();
} }
return success;
} }

View File

@@ -14,9 +14,11 @@ public:
WeatherSettings(ZeiterfassungSettings &settings, QObject *parent = Q_NULLPTR); WeatherSettings(ZeiterfassungSettings &settings, QObject *parent = Q_NULLPTR);
QUrl url() const; QUrl url() const;
void setUrl(const QUrl &url); bool setUrl(const QUrl &url);
Q_SIGNALS: Q_SIGNALS:
void saveErrorOccured();
void urlChanged(const QUrl &url); void urlChanged(const QUrl &url);
private: private:

View File

@@ -26,7 +26,7 @@ bool WeatherSettingsWidget::isValid(QString &message) const
return valid; 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()));
} }

View File

@@ -20,7 +20,7 @@ public:
bool isValid(QString &message) const Q_DECL_OVERRIDE; bool isValid(QString &message) const Q_DECL_OVERRIDE;
public Q_SLOTS: public Q_SLOTS:
void apply() Q_DECL_OVERRIDE; virtual bool apply() Q_DECL_OVERRIDE;
private: private:
WeatherSettings m_settings; WeatherSettings m_settings;

View File

@@ -31,13 +31,28 @@ QStringList WebRadioSettings::urls() const
return m_settings.value(m_urls, m_defaultUrls).toStringList(); 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.setValue(m_urls, urls);
m_settings.sync();
const auto success = m_settings.status() == QSettings::NoError;
if(success)
Q_EMIT urlsChanged(urls); Q_EMIT urlsChanged(urls);
else
{
Q_EMIT m_settings.saveErrorOccured();
Q_EMIT saveErrorOccured();
} }
return success;
} }
QString WebRadioSettings::lastUrl() const QString WebRadioSettings::lastUrl() const
@@ -45,13 +60,28 @@ QString WebRadioSettings::lastUrl() const
return m_settings.value(m_lastUrl).toString(); 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.setValue(m_lastUrl, lastUrl);
m_settings.sync();
const auto success = m_settings.status() == QSettings::NoError;
if(success)
Q_EMIT lastUrlChanged(lastUrl); Q_EMIT lastUrlChanged(lastUrl);
else
{
Q_EMIT m_settings.saveErrorOccured();
Q_EMIT saveErrorOccured();
} }
return success;
} }
int WebRadioSettings::volume() const int WebRadioSettings::volume() const
@@ -59,11 +89,26 @@ int WebRadioSettings::volume() const
return m_settings.value(m_volume, m_defaultVolume).toInt(); 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.setValue(m_volume, volume);
m_settings.sync();
const auto success = m_settings.status() == QSettings::NoError;
if(success)
Q_EMIT volumeChanged(volume); Q_EMIT volumeChanged(volume);
else
{
Q_EMIT m_settings.saveErrorOccured();
Q_EMIT saveErrorOccured();
} }
return success;
} }

View File

@@ -16,15 +16,17 @@ public:
WebRadioSettings(ZeiterfassungSettings &settings, QObject *parent = Q_NULLPTR); WebRadioSettings(ZeiterfassungSettings &settings, QObject *parent = Q_NULLPTR);
QStringList urls() const; QStringList urls() const;
void setUrls(const QStringList &urls); bool setUrls(const QStringList &urls);
QString lastUrl() const; QString lastUrl() const;
void setLastUrl(const QString &lastUrl); bool setLastUrl(const QString &lastUrl);
int volume() const; int volume() const;
void setVolume(int volume); bool setVolume(int volume);
Q_SIGNALS: Q_SIGNALS:
void saveErrorOccured();
void urlsChanged(const QStringList &urls); void urlsChanged(const QStringList &urls);
void lastUrlChanged(const QString &lastUrl); void lastUrlChanged(const QString &lastUrl);
void volumeChanged(int volume); void volumeChanged(int volume);

View File

@@ -31,8 +31,7 @@ bool WebRadioSettingsWidget::isValid(QString &message) const
return true; return true;
} }
void WebRadioSettingsWidget::apply() bool WebRadioSettingsWidget::apply()
{ {
if(m_urlsWidget->stringList() != m_settings.urls()) return m_settings.setUrls(m_urlsWidget->stringList());
m_settings.setUrls(m_urlsWidget->stringList());
} }

View File

@@ -20,7 +20,7 @@ public:
bool isValid(QString &message) const Q_DECL_OVERRIDE; bool isValid(QString &message) const Q_DECL_OVERRIDE;
public Q_SLOTS: public Q_SLOTS:
void apply() Q_DECL_OVERRIDE; virtual bool apply() Q_DECL_OVERRIDE;
private: private:
WebRadioSettings m_settings; WebRadioSettings m_settings;

View File

@@ -1,5 +1,7 @@
#include "zeiterfassungsettings.h" #include "zeiterfassungsettings.h"
#include <QDebug>
const QString ZeiterfassungSettings::m_language("language"); const QString ZeiterfassungSettings::m_language("language");
const QString ZeiterfassungSettings::m_url("url"); const QString ZeiterfassungSettings::m_url("url");
const QString ZeiterfassungSettings::m_username("username"); const QString ZeiterfassungSettings::m_username("username");
@@ -48,16 +50,25 @@ QLocale::Language ZeiterfassungSettings::language() const
return value(m_language, m_defaultLanguage).value<QLocale::Language>(); return value(m_language, m_defaultLanguage).value<QLocale::Language>();
} }
void ZeiterfassungSettings::setLanguage(QLocale::Language language) bool ZeiterfassungSettings::setLanguage(QLocale::Language language)
{ {
if(this->language() != language) if(this->language() == language)
{ return true;
if(m_defaultLanguage == language)
remove(m_language); if(m_defaultLanguage == language)
else remove(m_language);
setValue(m_language, language); else
setValue(m_language, language);
sync();
const auto success = status() == QSettings::NoError;
if(success)
Q_EMIT languageChanged(language); Q_EMIT languageChanged(language);
} else
Q_EMIT saveErrorOccured();
return success;
} }
QUrl ZeiterfassungSettings::url() const QUrl ZeiterfassungSettings::url() const
@@ -65,16 +76,25 @@ QUrl ZeiterfassungSettings::url() const
return value(m_url, m_defaultUrl).toUrl(); return value(m_url, m_defaultUrl).toUrl();
} }
void ZeiterfassungSettings::setUrl(const QUrl &url) bool ZeiterfassungSettings::setUrl(const QUrl &url)
{ {
if(this->url() != url) if(this->url() == url)
{ return true;
if(m_defaultUrl == url)
remove(m_url); if(m_defaultUrl == url)
else remove(m_url);
setValue(m_url, url); else
setValue(m_url, url);
sync();
const auto success = status() == QSettings::NoError;
if(success)
Q_EMIT urlChanged(url); Q_EMIT urlChanged(url);
} else
Q_EMIT saveErrorOccured();
return success;
} }
QString ZeiterfassungSettings::username() const QString ZeiterfassungSettings::username() const
@@ -82,16 +102,25 @@ QString ZeiterfassungSettings::username() const
return value(m_username).toString(); return value(m_username).toString();
} }
void ZeiterfassungSettings::setUsername(const QString &username) bool ZeiterfassungSettings::setUsername(const QString &username)
{ {
if(this->username() != username) if(this->username() == username)
{ return true;
if(username.isEmpty())
remove(m_username); if(username.isEmpty())
else remove(m_username);
setValue(m_username, username); else
setValue(m_username, username);
sync();
const auto success = status() == QSettings::NoError;
if(success)
Q_EMIT usernameChanged(username); Q_EMIT usernameChanged(username);
} else
Q_EMIT saveErrorOccured();
return success;
} }
QString ZeiterfassungSettings::password() const QString ZeiterfassungSettings::password() const
@@ -99,16 +128,25 @@ QString ZeiterfassungSettings::password() const
return value(m_password).toString(); return value(m_password).toString();
} }
void ZeiterfassungSettings::setPassword(const QString &password) bool ZeiterfassungSettings::setPassword(const QString &password)
{ {
if(this->password() != password) if(this->password() == password)
{ return true;
if(password.isEmpty())
remove(m_password); if(password.isEmpty())
else remove(m_password);
setValue(m_password, password); else
setValue(m_password, password);
sync();
const auto success = status() == QSettings::NoError;
if(success)
Q_EMIT passwordChanged(password); Q_EMIT passwordChanged(password);
} else
Q_EMIT saveErrorOccured();
return success;
} }
QStringList ZeiterfassungSettings::projects() const QStringList ZeiterfassungSettings::projects() const
@@ -116,21 +154,30 @@ QStringList ZeiterfassungSettings::projects() const
return value(m_projects).toStringList(); return value(m_projects).toStringList();
} }
void ZeiterfassungSettings::setProjects(const QStringList &projects) bool ZeiterfassungSettings::setProjects(const QStringList &projects)
{ {
if(this->projects() != projects) if(this->projects() == projects)
{ return true;
if(projects.isEmpty())
remove(m_projects); if(projects.isEmpty())
else remove(m_projects);
setValue(m_projects, projects); else
setValue(m_projects, projects);
sync();
const auto success = status() == QSettings::NoError;
if(success)
Q_EMIT projectsChanged(projects); 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 QStringList ZeiterfassungSettings::subprojects() const
@@ -138,21 +185,30 @@ QStringList ZeiterfassungSettings::subprojects() const
return value(m_subprojects).toStringList(); return value(m_subprojects).toStringList();
} }
void ZeiterfassungSettings::setSubprojects(const QStringList &subprojects) bool ZeiterfassungSettings::setSubprojects(const QStringList &subprojects)
{ {
if(this->subprojects() != subprojects) if(this->subprojects() == subprojects)
{ return true;
if(subprojects.isEmpty())
remove(m_subprojects); if(subprojects.isEmpty())
else remove(m_subprojects);
setValue(m_subprojects, subprojects); else
setValue(m_subprojects, subprojects);
sync();
const auto success = status() == QSettings::NoError;
if(success)
Q_EMIT subprojectsChanged(subprojects); 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 QStringList ZeiterfassungSettings::workpackages() const
@@ -160,21 +216,30 @@ QStringList ZeiterfassungSettings::workpackages() const
return value(m_workpackages).toStringList(); return value(m_workpackages).toStringList();
} }
void ZeiterfassungSettings::setWorkpackages(const QStringList &workpackages) bool ZeiterfassungSettings::setWorkpackages(const QStringList &workpackages)
{ {
if(this->workpackages() != workpackages) if(this->workpackages() == workpackages)
{ return true;
if(workpackages.isEmpty())
remove(m_workpackages); if(workpackages.isEmpty())
else remove(m_workpackages);
setValue(m_workpackages, workpackages); else
setValue(m_workpackages, workpackages);
sync();
const auto success = status() == QSettings::NoError;
if(success)
Q_EMIT workpackagesChanged(workpackages); 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 QStringList ZeiterfassungSettings::texts() const
@@ -182,21 +247,30 @@ QStringList ZeiterfassungSettings::texts() const
return value(m_texts).toStringList(); return value(m_texts).toStringList();
} }
void ZeiterfassungSettings::setTexts(const QStringList &texts) bool ZeiterfassungSettings::setTexts(const QStringList &texts)
{ {
if(this->texts() != texts) if(this->texts() == texts)
{ return true;
if(m_texts.isEmpty())
remove(m_texts); if(m_texts.isEmpty())
else remove(m_texts);
setValue(m_texts, texts); else
setValue(m_texts, texts);
sync();
const auto success = status() == QSettings::NoError;
if(success)
Q_EMIT textsChanged(texts); 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 QString ZeiterfassungSettings::theme() const
@@ -204,16 +278,25 @@ QString ZeiterfassungSettings::theme() const
return value(m_theme).toString(); return value(m_theme).toString();
} }
void ZeiterfassungSettings::setTheme(const QString &theme) bool ZeiterfassungSettings::setTheme(const QString &theme)
{ {
if(this->theme() != theme) if(this->theme() == theme)
{ return true;
if(theme.isEmpty())
remove(m_theme); if(theme.isEmpty())
else remove(m_theme);
setValue(m_theme, theme); else
setValue(m_theme, theme);
sync();
const auto success = status() == QSettings::NoError;
if(success)
Q_EMIT themeChanged(theme); Q_EMIT themeChanged(theme);
} else
Q_EMIT saveErrorOccured();
return success;
} }
QStringList ZeiterfassungSettings::prependItem(QStringList list, const QString &item) QStringList ZeiterfassungSettings::prependItem(QStringList list, const QString &item)

View File

@@ -33,37 +33,39 @@ public:
explicit ZeiterfassungSettings(QObject *parent = Q_NULLPTR); explicit ZeiterfassungSettings(QObject *parent = Q_NULLPTR);
QLocale::Language language() const; QLocale::Language language() const;
void setLanguage(QLocale::Language language); bool setLanguage(QLocale::Language language);
QUrl url() const; QUrl url() const;
void setUrl(const QUrl &url); bool setUrl(const QUrl &url);
QString username() const; QString username() const;
void setUsername(const QString &username); bool setUsername(const QString &username);
QString password() const; QString password() const;
void setPassword(const QString &password); bool setPassword(const QString &password);
QStringList projects() const; QStringList projects() const;
void setProjects(const QStringList &projects); bool setProjects(const QStringList &projects);
void prependProject(const QString &project); bool prependProject(const QString &project);
QStringList subprojects() const; QStringList subprojects() const;
void setSubprojects(const QStringList &subprojects); bool setSubprojects(const QStringList &subprojects);
void prependSubproject(const QString &subproject); bool prependSubproject(const QString &subproject);
QStringList workpackages() const; QStringList workpackages() const;
void setWorkpackages(const QStringList &workpackages); bool setWorkpackages(const QStringList &workpackages);
void prependWorkpackage(const QString &workpackage); bool prependWorkpackage(const QString &workpackage);
QStringList texts() const; QStringList texts() const;
void setTexts(const QStringList &texts); bool setTexts(const QStringList &texts);
void prependText(const QString &text); bool prependText(const QString &text);
QString theme() const; QString theme() const;
void setTheme(const QString &theme); bool setTheme(const QString &theme);
Q_SIGNALS: Q_SIGNALS:
void saveErrorOccured();
void languageChanged(QLocale::Language language); void languageChanged(QLocale::Language language);
void urlChanged(const QUrl &url); void urlChanged(const QUrl &url);
void usernameChanged(const QString &username); void usernameChanged(const QString &username);

View File

@@ -82,7 +82,12 @@ void SettingsDialog::submit()
if(ui->comboBoxLanguage->currentData().value<QLocale::Language>() != m_settings.language()) if(ui->comboBoxLanguage->currentData().value<QLocale::Language>() != m_settings.language())
{ {
m_settings.setLanguage(ui->comboBoxLanguage->currentData().value<QLocale::Language>()); if(!m_settings.setLanguage(ui->comboBoxLanguage->currentData().value<QLocale::Language>()))
{
errorOccured();
return;
}
//TODO #73 Allow changing of the language without restart //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!")); 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(); auto theme = ui->comboBoxTheme->currentData().toString();
if(theme != m_settings.theme()) if(theme != m_settings.theme())
{ {
if(theme.isEmpty()) QString styleSheet;
qApp->setStyleSheet(QString()); if(!theme.isEmpty())
else
{ {
auto themePath = QDir(QDir(QCoreApplication::applicationDirPath()).absoluteFilePath(QStringLiteral("themes"))).absoluteFilePath(theme); auto themePath = QDir(QDir(QCoreApplication::applicationDirPath()).absoluteFilePath(QStringLiteral("themes"))).absoluteFilePath(theme);
@@ -111,14 +115,31 @@ void SettingsDialog::submit()
} }
QTextStream textStream(&file); 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) for(const auto widget : m_settingsWidgets)
widget->apply(); {
if(!widget->apply())
{
errorOccured();
return;
}
}
accept(); 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!"));
}

View File

@@ -20,6 +20,8 @@ private Q_SLOTS:
void submit(); void submit();
private: private:
void errorOccured();
Ui::SettingsDialog *ui; Ui::SettingsDialog *ui;
ZeiterfassungSettings &m_settings; ZeiterfassungSettings &m_settings;
QVector<SettingsWidget*> m_settingsWidgets; QVector<SettingsWidget*> m_settingsWidgets;

View File

@@ -15,5 +15,5 @@ public:
virtual bool isValid(QString &message) const { Q_UNUSED(message) return true; } virtual bool isValid(QString &message) const { Q_UNUSED(message) return true; }
public Q_SLOTS: public Q_SLOTS:
virtual void apply() { } virtual bool apply() = 0;
}; };