From a89c47fa6ed591dfe19323a453e12a37f64e685e Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Fri, 25 May 2018 18:56:45 +0200 Subject: [PATCH 01/12] ZeiterfassungSettings error handling --- .../zeiterfassungsettings.cpp | 243 ++++++++++++------ zeiterfassungcorelib/zeiterfassungsettings.h | 28 +- 2 files changed, 178 insertions(+), 93 deletions(-) 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); -- 2.50.1 From f94d53c0aaa35608b339ec0a69db2d09d4d76870 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Fri, 25 May 2018 19:06:35 +0200 Subject: [PATCH 02/12] LunchMealSettings error handling --- plugins/lunchmealplugin/lunchmealsettings.cpp | 40 +++++++++++++++---- plugins/lunchmealplugin/lunchmealsettings.h | 6 ++- 2 files changed, 36 insertions(+), 10 deletions(-) diff --git a/plugins/lunchmealplugin/lunchmealsettings.cpp b/plugins/lunchmealplugin/lunchmealsettings.cpp index 9c3dcc1..d560b90 100644 --- a/plugins/lunchmealplugin/lunchmealsettings.cpp +++ b/plugins/lunchmealplugin/lunchmealsettings.cpp @@ -19,13 +19,25 @@ 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; + + m_settings.setValue(QStringLiteral("LunchMealPlugin/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 +45,23 @@ 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; + + m_settings.setValue(QStringLiteral("LunchMealPlugin/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); -- 2.50.1 From 562569e9baa4f5d4306fbb865572db22ccb56796 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Fri, 25 May 2018 19:08:57 +0200 Subject: [PATCH 03/12] PresenceSettings error handling --- plugins/presenceplugin/presencesettings.cpp | 20 ++++++++++++++++---- plugins/presenceplugin/presencesettings.h | 4 +++- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/plugins/presenceplugin/presencesettings.cpp b/plugins/presenceplugin/presencesettings.cpp index d1e315c..eb616fe 100644 --- a/plugins/presenceplugin/presencesettings.cpp +++ b/plugins/presenceplugin/presencesettings.cpp @@ -17,11 +17,23 @@ 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) - { - m_settings.setValue(m_interval, interval); + if(this->interval() == interval) + return true; + + 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: -- 2.50.1 From ab2f9b9c100cb8df5a74651b74aa8bea51edefa1 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Fri, 25 May 2018 19:15:21 +0200 Subject: [PATCH 04/12] UpdaterSettings error handling --- plugins/updaterplugin/updatersettings.cpp | 40 ++++++++++++++++++----- plugins/updaterplugin/updatersettings.h | 6 ++-- 2 files changed, 36 insertions(+), 10 deletions(-) diff --git a/plugins/updaterplugin/updatersettings.cpp b/plugins/updaterplugin/updatersettings.cpp index 2ea0fff..d752df1 100644 --- a/plugins/updaterplugin/updatersettings.cpp +++ b/plugins/updaterplugin/updatersettings.cpp @@ -18,13 +18,25 @@ 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) - { - m_settings.setValue(m_url, url); + if(this->url() == url) + return true; + + 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 +44,23 @@ 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) - { - m_settings.setValue(m_lastUpdateCheck, lastUpdateCheck); + if(this->lastUpdateCheck() == lastUpdateCheck) + return true; + + 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); -- 2.50.1 From 1ea4748f05e4e7913383ab60e4d0718a8e0dd06b Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Fri, 25 May 2018 19:28:13 +0200 Subject: [PATCH 05/12] WeatherSettings error handling --- plugins/weatherplugin/weathersettings.cpp | 20 ++++++++++++++++---- plugins/weatherplugin/weathersettings.h | 4 +++- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/plugins/weatherplugin/weathersettings.cpp b/plugins/weatherplugin/weathersettings.cpp index fc9a99c..26463f0 100644 --- a/plugins/weatherplugin/weathersettings.cpp +++ b/plugins/weatherplugin/weathersettings.cpp @@ -17,11 +17,23 @@ 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) - { - m_settings.setValue(m_url, url); + if(this->url() == url) + return true; + + 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: -- 2.50.1 From 20b373bec7118e39870d7cc11a3743c16c8f2a14 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Fri, 25 May 2018 19:33:40 +0200 Subject: [PATCH 06/12] WebRadioSettings error handling --- plugins/webradioplugin/webradiosettings.cpp | 60 ++++++++++++++++----- plugins/webradioplugin/webradiosettings.h | 8 +-- 2 files changed, 53 insertions(+), 15 deletions(-) diff --git a/plugins/webradioplugin/webradiosettings.cpp b/plugins/webradioplugin/webradiosettings.cpp index 8b65a3a..40c9883 100644 --- a/plugins/webradioplugin/webradiosettings.cpp +++ b/plugins/webradioplugin/webradiosettings.cpp @@ -31,13 +31,25 @@ 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) - { - m_settings.setValue(m_urls, urls); + if(this->urls() == urls) + return true; + + 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 +57,25 @@ 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) - { - m_settings.setValue(m_lastUrl, lastUrl); + if(this->lastUrl() == lastUrl) + return true; + + 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 +83,23 @@ 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) - { - m_settings.setValue(m_volume, volume); + if(this->volume() == volume) + return true; + + 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); -- 2.50.1 From bb19fddddae00c8039afe80c305ae156c43137a2 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Fri, 25 May 2018 19:42:22 +0200 Subject: [PATCH 07/12] SettingsWidgets error handling --- plugins/lunchmealplugin/lunchmealsettingswidget.cpp | 6 +++--- plugins/lunchmealplugin/lunchmealsettingswidget.h | 2 +- plugins/presenceplugin/presencesettingswidget.cpp | 10 ++-------- plugins/presenceplugin/presencesettingswidget.h | 4 +--- plugins/updaterplugin/updatersettingswidget.cpp | 4 ++-- plugins/updaterplugin/updatersettingswidget.h | 2 +- plugins/weatherplugin/weathersettingswidget.cpp | 4 ++-- plugins/weatherplugin/weathersettingswidget.h | 2 +- plugins/webradioplugin/webradiosettingswidget.cpp | 5 ++--- plugins/webradioplugin/webradiosettingswidget.h | 2 +- zeiterfassungguilib/settingswidget.h | 2 +- 11 files changed, 17 insertions(+), 26 deletions(-) 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/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/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/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/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/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; }; -- 2.50.1 From 43cc25b825c14eea1c9503d10aabf41c46cd0528 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Fri, 25 May 2018 19:47:13 +0200 Subject: [PATCH 08/12] Improved default value handling in plugin settings --- plugins/lunchmealplugin/lunchmealsettings.cpp | 10 ++++++++-- plugins/presenceplugin/presencesettings.cpp | 5 ++++- plugins/updaterplugin/updatersettings.cpp | 10 ++++++++-- plugins/weatherplugin/weathersettings.cpp | 5 ++++- plugins/webradioplugin/webradiosettings.cpp | 15 ++++++++++++--- 5 files changed, 36 insertions(+), 9 deletions(-) diff --git a/plugins/lunchmealplugin/lunchmealsettings.cpp b/plugins/lunchmealplugin/lunchmealsettings.cpp index d560b90..3703770 100644 --- a/plugins/lunchmealplugin/lunchmealsettings.cpp +++ b/plugins/lunchmealplugin/lunchmealsettings.cpp @@ -24,7 +24,10 @@ bool LunchMealSettings::setUrl(const QString &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(); @@ -50,7 +53,10 @@ bool LunchMealSettings::setDateFormat(const QString &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(); diff --git a/plugins/presenceplugin/presencesettings.cpp b/plugins/presenceplugin/presencesettings.cpp index eb616fe..ba61eaf 100644 --- a/plugins/presenceplugin/presencesettings.cpp +++ b/plugins/presenceplugin/presencesettings.cpp @@ -22,7 +22,10 @@ bool PresenceSettings::setInterval(int interval) if(this->interval() == interval) return true; - m_settings.setValue(m_interval, interval); + if(interval == m_defaultInterval) + m_settings.remove(m_interval); + else + m_settings.setValue(m_interval, interval); m_settings.sync(); diff --git a/plugins/updaterplugin/updatersettings.cpp b/plugins/updaterplugin/updatersettings.cpp index d752df1..9d439e0 100644 --- a/plugins/updaterplugin/updatersettings.cpp +++ b/plugins/updaterplugin/updatersettings.cpp @@ -23,7 +23,10 @@ bool UpdaterSettings::setUrl(const QUrl &url) if(this->url() == url) return true; - m_settings.setValue(m_url, url); + if(url == m_defaultUrl) + m_settings.remove(m_url); + else + m_settings.setValue(m_url, url); m_settings.sync(); @@ -49,7 +52,10 @@ bool UpdaterSettings::setLastUpdateCheck(const QDate &lastUpdateCheck) if(this->lastUpdateCheck() == lastUpdateCheck) return true; - m_settings.setValue(m_lastUpdateCheck, lastUpdateCheck); + if(!lastUpdateCheck.isValid()) + m_settings.remove(m_lastUpdateCheck); + else + m_settings.setValue(m_lastUpdateCheck, lastUpdateCheck); m_settings.sync(); diff --git a/plugins/weatherplugin/weathersettings.cpp b/plugins/weatherplugin/weathersettings.cpp index 26463f0..71332df 100644 --- a/plugins/weatherplugin/weathersettings.cpp +++ b/plugins/weatherplugin/weathersettings.cpp @@ -22,7 +22,10 @@ bool WeatherSettings::setUrl(const QUrl &url) if(this->url() == url) return true; - m_settings.setValue(m_url, url); + if(url == m_defaultUrl) + m_settings.remove(m_url); + else + m_settings.setValue(m_url, url); m_settings.sync(); diff --git a/plugins/webradioplugin/webradiosettings.cpp b/plugins/webradioplugin/webradiosettings.cpp index 40c9883..615c44a 100644 --- a/plugins/webradioplugin/webradiosettings.cpp +++ b/plugins/webradioplugin/webradiosettings.cpp @@ -36,7 +36,10 @@ bool WebRadioSettings::setUrls(const QStringList &urls) if(this->urls() == urls) return true; - m_settings.setValue(m_urls, urls); + if(urls == m_defaultUrls) + m_settings.remove(m_urls); + else + m_settings.setValue(m_urls, urls); m_settings.sync(); @@ -62,7 +65,10 @@ bool WebRadioSettings::setLastUrl(const QString &lastUrl) if(this->lastUrl() == lastUrl) return true; - m_settings.setValue(m_lastUrl, lastUrl); + if(lastUrl.isNull()) + m_settings.remove(m_lastUrl); + else + m_settings.setValue(m_lastUrl, lastUrl); m_settings.sync(); @@ -88,7 +94,10 @@ bool WebRadioSettings::setVolume(int volume) if(this->volume() == volume) return true; - m_settings.setValue(m_volume, volume); + if(volume == m_defaultVolume) + m_settings.remove(m_volume); + else + m_settings.setValue(m_volume, volume); m_settings.sync(); -- 2.50.1 From dd99132ae0100d6592220f66f18602e37888d749 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Fri, 25 May 2018 19:51:20 +0200 Subject: [PATCH 09/12] Implemented message box if changing settings fails --- .../dialogs/settingsdialog.cpp | 35 +++++++++++++++---- zeiterfassungguilib/dialogs/settingsdialog.h | 2 ++ 2 files changed, 30 insertions(+), 7 deletions(-) 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; -- 2.50.1 From def7acc366ec440e966b49941f45d100784e217b Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Fri, 25 May 2018 19:53:17 +0200 Subject: [PATCH 10/12] Removed cpp14 polyfills --- zeiterfassungcorelib/cpp14polyfills.h | 43 ------------------- zeiterfassungcorelib/zeiterfassungapi.cpp | 3 -- zeiterfassungcorelib/zeiterfassungcorelib.pro | 3 +- 3 files changed, 1 insertion(+), 48 deletions(-) delete mode 100644 zeiterfassungcorelib/cpp14polyfills.h diff --git a/zeiterfassungcorelib/cpp14polyfills.h b/zeiterfassungcorelib/cpp14polyfills.h deleted file mode 100644 index d345a00..0000000 --- a/zeiterfassungcorelib/cpp14polyfills.h +++ /dev/null @@ -1,43 +0,0 @@ -#pragma once - -#if __cplusplus < 201402L && _MSC_VER < 1800 - -// std includes -#include -#include -#include -#include -#include - -namespace std { - template struct _Unique_if { - typedef unique_ptr _Single_object; - }; - - template struct _Unique_if { - typedef unique_ptr _Unknown_bound; - }; - - template struct _Unique_if { - typedef void _Known_bound; - }; - - template - typename _Unique_if::_Single_object - make_unique(Args&&... args) { - return unique_ptr(new T(std::forward(args)...)); - } - - template - typename _Unique_if::_Unknown_bound - make_unique(size_t n) { - typedef typename remove_extent::type U; - return unique_ptr(new U[n]()); - } - - template - typename _Unique_if::_Known_bound - make_unique(Args&&...) = delete; -} - -#endif // __cplusplus < 201402L diff --git a/zeiterfassungcorelib/zeiterfassungapi.cpp b/zeiterfassungcorelib/zeiterfassungapi.cpp index a125acc..5e38e4c 100644 --- a/zeiterfassungcorelib/zeiterfassungapi.cpp +++ b/zeiterfassungcorelib/zeiterfassungapi.cpp @@ -25,9 +25,6 @@ #include "replies/getpresencestatusreply.h" #include "replies/getabsencesreply.h" -//add support for pre cpp14 compilers -#include "cpp14polyfills.h" - ZeiterfassungApi::ZeiterfassungApi(const QUrl &url, QObject *parent) : QObject(parent), m_url(url), diff --git a/zeiterfassungcorelib/zeiterfassungcorelib.pro b/zeiterfassungcorelib/zeiterfassungcorelib.pro index f64770b..f7e9f6c 100644 --- a/zeiterfassungcorelib/zeiterfassungcorelib.pro +++ b/zeiterfassungcorelib/zeiterfassungcorelib.pro @@ -28,8 +28,7 @@ SOURCES += timeutils.cpp \ replies/updatetimeassignmentreply.cpp \ replies/zeiterfassungreply.cpp -HEADERS += cpp14polyfills.h \ - timeutils.h \ +HEADERS += timeutils.h \ zeiterfassungapi.h \ zeiterfassungcorelib_global.h \ zeiterfassungsettings.h \ -- 2.50.1 From a2a7d29b11738cf426ef8e8cf68ea15da431f161 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Fri, 25 May 2018 20:17:48 +0200 Subject: [PATCH 11/12] Implemented api for soll ist time --- .../replies/getabsencesreply.cpp | 4 +- .../replies/getbookingsreply.cpp | 6 +- .../replies/getdayinforeply.cpp | 74 +++++++++++++++++++ .../replies/getdayinforeply.h | 40 ++++++++++ .../replies/gettimeassignmentsreply.cpp | 6 +- .../replies/getuserinforeply.cpp | 4 +- .../replies/zeiterfassungreply.cpp | 17 +++++ .../replies/zeiterfassungreply.h | 5 ++ zeiterfassungcorelib/zeiterfassungapi.cpp | 63 +++++++++++----- zeiterfassungcorelib/zeiterfassungapi.h | 5 ++ zeiterfassungcorelib/zeiterfassungcorelib.pro | 2 + 11 files changed, 196 insertions(+), 30 deletions(-) create mode 100644 zeiterfassungcorelib/replies/getdayinforeply.cpp create mode 100644 zeiterfassungcorelib/replies/getdayinforeply.h diff --git a/zeiterfassungcorelib/replies/getabsencesreply.cpp b/zeiterfassungcorelib/replies/getabsencesreply.cpp index 107adc6..84c8ea5 100644 --- a/zeiterfassungcorelib/replies/getabsencesreply.cpp +++ b/zeiterfassungcorelib/replies/getabsencesreply.cpp @@ -59,12 +59,12 @@ void GetAbsencesReply::requestFinished() m_absences.append({ obj.value(QStringLiteral("altRepresentative")).toInt(), obj.value(QStringLiteral("compositeId")).toString(), - QDate::fromString(QString::number(obj.value(QStringLiteral("end")).toInt()), QStringLiteral("yyyyMMdd")), + parseDate(obj.value(QStringLiteral("end"))), obj.value(QStringLiteral("hourCategory")).toString(), obj.value(QStringLiteral("openMarking")).toString(), obj.value(QStringLiteral("persNr")).toInt(), obj.value(QStringLiteral("representative")).toInt(), - QDate::fromString(QString::number(obj.value(QStringLiteral("start")).toInt()), QStringLiteral("yyyyMMdd")), + parseDate(obj.value(QStringLiteral("start"))), obj.value(QStringLiteral("text")).toString() }); } diff --git a/zeiterfassungcorelib/replies/getbookingsreply.cpp b/zeiterfassungcorelib/replies/getbookingsreply.cpp index b286cae..5d7d95e 100644 --- a/zeiterfassungcorelib/replies/getbookingsreply.cpp +++ b/zeiterfassungcorelib/replies/getbookingsreply.cpp @@ -57,9 +57,9 @@ void GetBookingsReply::requestFinished() m_bookings.append({ obj.value(QStringLiteral("bookingNr")).toInt(), - QDate::fromString(QString::number(obj.value(QStringLiteral("bookingDate")).toInt()), QStringLiteral("yyyyMMdd")), - QTime::fromString(QStringLiteral("%0").arg(obj.value(QStringLiteral("bookingTime")).toInt(), 6, 10, QChar('0')), QStringLiteral("HHmmss")), - QTime::fromString(QStringLiteral("%0").arg(obj.value(QStringLiteral("bookingTimespan")).toInt(), 6, 10, QChar('0')), QStringLiteral("HHmmss")), + parseDate(obj.value(QStringLiteral("bookingDate"))), + parseTime(obj.value(QStringLiteral("bookingTime"))), + parseTime(obj.value(QStringLiteral("bookingTimespan"))), obj.value(QStringLiteral("bookingType")).toString(), obj.value(QStringLiteral("text")).toString() }); diff --git a/zeiterfassungcorelib/replies/getdayinforeply.cpp b/zeiterfassungcorelib/replies/getdayinforeply.cpp new file mode 100644 index 0000000..2b20a01 --- /dev/null +++ b/zeiterfassungcorelib/replies/getdayinforeply.cpp @@ -0,0 +1,74 @@ +#include "getdayinforeply.h" + +#include +#include +#include +#include +#include +#include + +#include "zeiterfassungapi.h" + +GetDayinfoReply::GetDayinfoReply(std::unique_ptr &&reply, ZeiterfassungApi *zeiterfassung) : + ZeiterfassungReply(zeiterfassung), + m_reply(std::move(reply)) +{ + connect(m_reply.get(), &QNetworkReply::finished, this, &GetDayinfoReply::requestFinished); +} + +const QVector &GetDayinfoReply::dayinfos() const +{ + return m_dayinfos; +} + +void GetDayinfoReply::requestFinished() +{ + if(m_reply->error() != QNetworkReply::NoError) + { + setSuccess(false); + setMessage(tr("Request error occured: %0").arg(m_reply->errorString())); + goto end; + } + + { + QJsonParseError error; + QJsonDocument document = QJsonDocument::fromJson(m_reply->readAll(), &error); + if(error.error != QJsonParseError::NoError) + { + setSuccess(false); + setMessage(tr("Parsing JSON failed: %0").arg(error.errorString())); + goto end; + } + + if(!document.isArray()) + { + setSuccess(false); + setMessage(tr("JSON document is not an array!")); + goto end; + } + + auto arr = document.array(); + + setSuccess(true); + m_dayinfos.clear(); + m_dayinfos.reserve(arr.count()); + for(const auto &val : arr) + { + auto obj = val.toObject(); + + m_dayinfos.append({ + obj.value(QStringLiteral("className")).toString(), + obj.value(QStringLiteral("persNr")).toInt(), + parseDate(obj.value(QStringLiteral("date"))), + parseTime(obj.value(QStringLiteral("ist"))), + parseTime(obj.value(QStringLiteral("soll"))), + obj.value(QStringLiteral("compositeId")).toString() + }); + } + } + + end: + m_reply = Q_NULLPTR; + + Q_EMIT finished(); +} diff --git a/zeiterfassungcorelib/replies/getdayinforeply.h b/zeiterfassungcorelib/replies/getdayinforeply.h new file mode 100644 index 0000000..6bdf816 --- /dev/null +++ b/zeiterfassungcorelib/replies/getdayinforeply.h @@ -0,0 +1,40 @@ +#pragma once + +#include + +#include +#include +#include +#include + +#include "zeiterfassungcorelib_global.h" +#include "zeiterfassungreply.h" + +class ZeiterfassungApi; + +class ZEITERFASSUNGCORELIBSHARED_EXPORT GetDayinfoReply : public ZeiterfassungReply +{ + Q_OBJECT + +public: + explicit GetDayinfoReply(std::unique_ptr &&reply, ZeiterfassungApi *zeiterfassung); + + struct Dayinfo + { + QString className; + int userId; + QDate date; + QTime ist; + QTime soll; + QString compositeId; + }; + + const QVector &dayinfos() const; + +private Q_SLOTS: + void requestFinished(); + +private: + std::unique_ptr m_reply; + QVector m_dayinfos; +}; diff --git a/zeiterfassungcorelib/replies/gettimeassignmentsreply.cpp b/zeiterfassungcorelib/replies/gettimeassignmentsreply.cpp index 2f13cd1..57b272c 100644 --- a/zeiterfassungcorelib/replies/gettimeassignmentsreply.cpp +++ b/zeiterfassungcorelib/replies/gettimeassignmentsreply.cpp @@ -60,9 +60,9 @@ void GetTimeAssignmentsReply::requestFinished() m_timeAssignments.append({ obj.value(QStringLiteral("bookingNr")).toInt(), - QDate::fromString(QString::number(obj.value(QStringLiteral("bookingDate")).toInt()), QStringLiteral("yyyyMMdd")), - QTime::fromString(QStringLiteral("%0").arg(obj.value(QStringLiteral("bookingTime")).toInt(), 6, 10, QChar('0')), QStringLiteral("HHmmss")), - QTime::fromString(QStringLiteral("%0").arg(obj.value(QStringLiteral("bookingTimespan")).toInt(), 6, 10, QChar('0')), QStringLiteral("HHmmss")), + parseDate(obj.value(QStringLiteral("bookingDate"))), + parseTime(obj.value(QStringLiteral("bookingTime"))), + parseTime(obj.value(QStringLiteral("bookingTimespan"))), obj.value(QStringLiteral("text")).toString(), koWertList.at(0).toObject().value(QStringLiteral("value")).toString(), koWertList.at(1).toObject().value(QStringLiteral("value")).toString(), diff --git a/zeiterfassungcorelib/replies/getuserinforeply.cpp b/zeiterfassungcorelib/replies/getuserinforeply.cpp index e07dc18..640f165 100644 --- a/zeiterfassungcorelib/replies/getuserinforeply.cpp +++ b/zeiterfassungcorelib/replies/getuserinforeply.cpp @@ -150,8 +150,8 @@ void GetUserInfoReply::request1Finished() m_userInfo.street = obj.value(QStringLiteral("gemeinde")).toString(); m_userInfo.city = obj.value(QStringLiteral("ort")).toString(); - m_userInfo.employedSince = QDate::fromString(QString::number(obj.value(QStringLiteral("angFrom")).toInt()), QStringLiteral("yyyyMMdd")); - m_userInfo.employedTill = QDate::fromString(QString::number(obj.value(QStringLiteral("angTill")).toInt()), QStringLiteral("yyyyMMdd")); + m_userInfo.employedSince = parseDate(obj.value(QStringLiteral("angFrom"))); + m_userInfo.employedTill = parseDate(obj.value(QStringLiteral("angTill"))); m_userInfo.placeOfBirth = obj.value(QStringLiteral("gebOrt")).toString(); m_userInfo.zipcode = obj.value(QStringLiteral("plz")).toString(); m_userInfo.religion = obj.value(QStringLiteral("religion")).toString(); diff --git a/zeiterfassungcorelib/replies/zeiterfassungreply.cpp b/zeiterfassungcorelib/replies/zeiterfassungreply.cpp index 6784956..2270dc1 100644 --- a/zeiterfassungcorelib/replies/zeiterfassungreply.cpp +++ b/zeiterfassungcorelib/replies/zeiterfassungreply.cpp @@ -1,6 +1,7 @@ #include "zeiterfassungreply.h" #include +#include #include "zeiterfassungapi.h" @@ -29,6 +30,22 @@ void ZeiterfassungReply::waitForFinished() eventLoop.exec(); } +QDate ZeiterfassungReply::parseDate(const QJsonValue &value) +{ + if(value.isNull()) + return QDate(); + + return QDate::fromString(QString::number(value.toInt()), QStringLiteral("yyyyMMdd")); +} + +QTime ZeiterfassungReply::parseTime(const QJsonValue &value) +{ + if(value.isNull()) + return QTime(); + + return QTime::fromString(QStringLiteral("%0").arg(value.toInt(), 6, 10, QChar('0')), QStringLiteral("HHmmss")); +} + ZeiterfassungApi *ZeiterfassungReply::zeiterfassung() const { return m_zeiterfassung; diff --git a/zeiterfassungcorelib/replies/zeiterfassungreply.h b/zeiterfassungcorelib/replies/zeiterfassungreply.h index 11b535d..88c21a0 100644 --- a/zeiterfassungcorelib/replies/zeiterfassungreply.h +++ b/zeiterfassungcorelib/replies/zeiterfassungreply.h @@ -4,6 +4,8 @@ #include "zeiterfassungcorelib_global.h" +class QJsonValue; + class ZeiterfassungApi; class ZEITERFASSUNGCORELIBSHARED_EXPORT ZeiterfassungReply : public QObject @@ -18,6 +20,9 @@ public: void waitForFinished(); + static QDate parseDate(const QJsonValue &value); + static QTime parseTime(const QJsonValue &value); + Q_SIGNALS: void finished(); diff --git a/zeiterfassungcorelib/zeiterfassungapi.cpp b/zeiterfassungcorelib/zeiterfassungapi.cpp index a125acc..78f2803 100644 --- a/zeiterfassungcorelib/zeiterfassungapi.cpp +++ b/zeiterfassungcorelib/zeiterfassungapi.cpp @@ -24,6 +24,7 @@ #include "replies/getreportreply.h" #include "replies/getpresencestatusreply.h" #include "replies/getabsencesreply.h" +#include "replies/getdayinforeply.h" //add support for pre cpp14 compilers #include "cpp14polyfills.h" @@ -84,8 +85,8 @@ std::unique_ptr ZeiterfassungApi::doGetBookings(int userId, co { QNetworkRequest request(QUrl(QStringLiteral("%0json/bookings?start=%1&end=%2&pnrLst=%3") .arg(m_url.toString()) - .arg(start.toString(QStringLiteral("yyyyMMdd"))) - .arg(end.toString(QStringLiteral("yyyyMMdd"))) + .arg(formatDate(start)) + .arg(formatDate(end)) .arg(userId))); request.setRawHeader(QByteArrayLiteral("sisAppName"), QByteArrayLiteral("bookingCalendar")); @@ -101,9 +102,9 @@ std::unique_ptr ZeiterfassungApi::doCreateBooking(int userId QJsonObject obj; obj[QStringLiteral("persNr")] = userId; - obj[QStringLiteral("bookingDate")] = date.toString(QStringLiteral("yyyyMMdd")).toInt(); - obj[QStringLiteral("bookingTime")] = time.toString(QStringLiteral("Hmmss")).toInt(); - obj[QStringLiteral("bookingTimespan")] = timespan.toString(QStringLiteral("Hmmss")).toInt(); + obj[QStringLiteral("bookingDate")] = formatDate(date).toInt(); + obj[QStringLiteral("bookingTime")] = formatTime(time).toInt(); + obj[QStringLiteral("bookingTimespan")] = formatTime(timespan).toInt(); obj[QStringLiteral("bookingType")] = type; obj[QStringLiteral("hourCategory")] = QStringLiteral(""); obj[QStringLiteral("empfEinh")] = QStringLiteral(""); @@ -125,9 +126,9 @@ std::unique_ptr ZeiterfassungApi::doUpdateBooking(int bookin QJsonObject obj; obj[QStringLiteral("bookingNr")] = bookingId; obj[QStringLiteral("persNr")] = userId; - obj[QStringLiteral("bookingDate")] = date.toString(QStringLiteral("yyyyMMdd")).toInt(); - obj[QStringLiteral("bookingTime")] = time.toString(QStringLiteral("Hmmss")).toInt(); - obj[QStringLiteral("bookingTimespan")] = timespan.toString(QStringLiteral("Hmmss")).toInt(); + obj[QStringLiteral("bookingDate")] = formatDate(date).toInt(); + obj[QStringLiteral("bookingTime")] = formatTime(time).toInt(); + obj[QStringLiteral("bookingTimespan")] = formatTime(timespan).toInt(); obj[QStringLiteral("bookingType")] = type; obj[QStringLiteral("hourCategory")] = QStringLiteral(""); obj[QStringLiteral("empfEinh")] = QStringLiteral(""); @@ -153,8 +154,8 @@ std::unique_ptr ZeiterfassungApi::doGetTimeAssignments( { QNetworkRequest request(QUrl(QStringLiteral("%0json/azebooking?start=%1&end=%2&pnrLst=%3") .arg(m_url.toString()) - .arg(start.toString(QStringLiteral("yyyyMMdd"))) - .arg(end.toString(QStringLiteral("yyyyMMdd"))) + .arg(formatDate(start)) + .arg(formatDate(end)) .arg(userId))); request.setRawHeader(QByteArrayLiteral("sisAppName"), QByteArrayLiteral("bookingCalendar")); @@ -173,9 +174,9 @@ std::unique_ptr ZeiterfassungApi::doCreateTimeAssignm QJsonObject obj; obj[QStringLiteral("bookingNr")] = QJsonValue::Null; obj[QStringLiteral("persNr")] = userId; - obj[QStringLiteral("bookingDate")] = date.toString(QStringLiteral("yyyyMMdd")).toInt(); - obj[QStringLiteral("bookingTime")] = time.toString(QStringLiteral("Hmmss")).toInt(); - obj[QStringLiteral("bookingTimespan")] = timespan.toString(QStringLiteral("Hmmss")).toInt(); + obj[QStringLiteral("bookingDate")] = formatDate(date).toInt(); + obj[QStringLiteral("bookingTime")] = formatTime(time).toInt(); + obj[QStringLiteral("bookingTimespan")] = formatTime(timespan).toInt(); obj[QStringLiteral("text")] = text; { QJsonArray koWertList; @@ -214,9 +215,9 @@ std::unique_ptr ZeiterfassungApi::doUpdateTimeAssignm QJsonObject obj; obj[QStringLiteral("bookingNr")] = timeAssignmentId; obj[QStringLiteral("persNr")] = userId; - obj[QStringLiteral("bookingDate")] = date.toString(QStringLiteral("yyyyMMdd")).toInt(); - obj[QStringLiteral("bookingTime")] = time.toString(QStringLiteral("Hmmss")).toInt(); - obj[QStringLiteral("bookingTimespan")] = timespan.toString(QStringLiteral("Hmmss")).toInt(); + obj[QStringLiteral("bookingDate")] = formatDate(date).toInt(); + obj[QStringLiteral("bookingTime")] = formatTime(time).toInt(); + obj[QStringLiteral("bookingTimespan")] = formatTime(timespan).toInt(); obj[QStringLiteral("bookingType")] = QJsonValue::Null; obj[QStringLiteral("hourCategory")] = QJsonValue::Null; obj[QStringLiteral("bewEinh")] = QJsonValue::Null; @@ -263,7 +264,7 @@ std::unique_ptr ZeiterfassungApi::doGetProjects(int userId, co QNetworkRequest request(QUrl(QStringLiteral("%0json/combobox?persnr=%1&date=%2&dqkey=KOST&kowert0=&kowert1=&kowert2=&term=") .arg(m_url.toString()) .arg(userId) - .arg(date.toString(QStringLiteral("yyyyMMdd"))))); + .arg(formatDate(date)))); request.setRawHeader(QByteArrayLiteral("sisAppName"), QByteArrayLiteral("bookingCalendar")); return std::make_unique(std::unique_ptr(m_manager->get(request)), this); @@ -274,7 +275,7 @@ std::unique_ptr ZeiterfassungApi::doGetReport(int userId, const QNetworkRequest request(QUrl(QStringLiteral("%0json/auswertung/month?persNr=%1&date=%2") .arg(m_url.toString()) .arg(userId) - .arg(date.toString(QStringLiteral("yyyyMMdd"))))); + .arg(formatDate(date)))); request.setRawHeader(QByteArrayLiteral("sisAppName"), QByteArrayLiteral("bookingCalendar")); return std::make_unique(std::unique_ptr(m_manager->get(request)), this); @@ -292,10 +293,32 @@ std::unique_ptr ZeiterfassungApi::doGetAbsences(int userId, co { QNetworkRequest request(QUrl(QStringLiteral("%0json/fulldayAbsences?start=%1&end=%2&pnrLst=%3") .arg(m_url.toString()) - .arg(start.toString(QStringLiteral("yyyyMMdd"))) - .arg(end.toString(QStringLiteral("yyyyMMdd"))) + .arg(formatDate(start)) + .arg(formatDate(end)) .arg(userId))); request.setRawHeader(QByteArrayLiteral("sisAppName"), QByteArrayLiteral("bookingCalendar")); return std::make_unique(std::unique_ptr(m_manager->get(request)), this); } + +std::unique_ptr ZeiterfassungApi::doGetDayinfo(int userId, const QDate &start, const QDate &end) +{ + QNetworkRequest request(QUrl(QStringLiteral("%0json/dayinfo?start=%1&end=%2&pnrLst=%3") + .arg(m_url.toString()) + .arg(formatDate(start)) + .arg(formatDate(end)) + .arg(userId))); + request.setRawHeader(QByteArrayLiteral("sisAppName"), QByteArrayLiteral("bookingCalendar")); + + return std::make_unique(std::unique_ptr(m_manager->get(request)), this); +} + +QString ZeiterfassungApi::formatDate(const QDate &date) +{ + return date.toString(QStringLiteral("yyyyMMdd")); +} + +QString ZeiterfassungApi::formatTime(const QTime &time) +{ + return time.toString(QStringLiteral("Hmmss")); +} diff --git a/zeiterfassungcorelib/zeiterfassungapi.h b/zeiterfassungcorelib/zeiterfassungapi.h index a3f3107..17602ba 100644 --- a/zeiterfassungcorelib/zeiterfassungapi.h +++ b/zeiterfassungcorelib/zeiterfassungapi.h @@ -27,6 +27,7 @@ class GetProjectsReply; class GetReportReply; class GetPresenceStatusReply; class GetAbsencesReply; +class GetDayinfoReply; class ZEITERFASSUNGCORELIBSHARED_EXPORT ZeiterfassungApi : public QObject { @@ -66,8 +67,12 @@ public: std::unique_ptr doGetReport(int userId, const QDate &date); std::unique_ptr doGetPresenceStatus(); std::unique_ptr doGetAbsences(int userId, const QDate &start, const QDate &end); + std::unique_ptr doGetDayinfo(int userId, const QDate &start, const QDate &end); private: + static QString formatDate(const QDate &date); + static QString formatTime(const QTime &time); + QUrl m_url; QNetworkAccessManager *m_manager; }; diff --git a/zeiterfassungcorelib/zeiterfassungcorelib.pro b/zeiterfassungcorelib/zeiterfassungcorelib.pro index f64770b..80c924d 100644 --- a/zeiterfassungcorelib/zeiterfassungcorelib.pro +++ b/zeiterfassungcorelib/zeiterfassungcorelib.pro @@ -17,6 +17,7 @@ SOURCES += timeutils.cpp \ replies/deletetimeassignmentreply.cpp \ replies/getabsencesreply.cpp \ replies/getbookingsreply.cpp \ + replies/getdayinforeply.cpp \ replies/getpresencestatusreply.cpp \ replies/getprojectsreply.cpp \ replies/getreportreply.cpp \ @@ -39,6 +40,7 @@ HEADERS += cpp14polyfills.h \ replies/deletetimeassignmentreply.h \ replies/getabsencesreply.h \ replies/getbookingsreply.h \ + replies/getdayinforeply.h \ replies/getpresencestatusreply.h \ replies/getprojectsreply.h \ replies/getreportreply.h \ -- 2.50.1 From cb5f54aa916dc9c6f20e979f9b8b82320ff5ef75 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Fri, 25 May 2018 20:27:28 +0200 Subject: [PATCH 12/12] Added display of soll ist time to StripsWidget --- zeiterfassungguilib/stripswidget.cpp | 88 +++++++++++++++++++++------- zeiterfassungguilib/stripswidget.h | 17 +++++- 2 files changed, 83 insertions(+), 22 deletions(-) diff --git a/zeiterfassungguilib/stripswidget.cpp b/zeiterfassungguilib/stripswidget.cpp index 131efba..f4c74df 100644 --- a/zeiterfassungguilib/stripswidget.cpp +++ b/zeiterfassungguilib/stripswidget.cpp @@ -12,10 +12,14 @@ #include "timeutils.h" #include "stripfactory.h" +const QStringList StripsWidget::m_weekDays { tr("Monday"), tr("Tuesday"), + tr("Wednesday"), tr("Thursday"), tr("Friday"), tr("Saturday"), tr("Sunday") }; + StripsWidget::StripsWidget(MainWindow &mainWindow, QWidget *parent) : QFrame(parent), m_mainWindow(mainWindow), m_refreshing(false), + m_refreshingDayinfo(false), m_refreshingBookings(false), m_refreshingTimeAssignments(false), m_startEnabled(false), @@ -24,15 +28,20 @@ StripsWidget::StripsWidget(MainWindow &mainWindow, QWidget *parent) : auto layout = new QVBoxLayout(this); m_headerLayout = new QHBoxLayout; - m_label = new QLabel; + + m_label[0] = new QLabel; { - auto font = m_label->font(); + auto font = m_label[0]->font(); font.setBold(true); - m_label->setFont(font); + m_label[0]->setFont(font); } - m_headerLayout->addWidget(m_label, 1); + m_headerLayout->addWidget(m_label[0], 1); + layout->addLayout(m_headerLayout); + m_label[1] = new QLabel; + layout->addWidget(m_label[1]); + m_stripsLayout = new QVBoxLayout; layout->addLayout(m_stripsLayout); @@ -56,9 +65,14 @@ QBoxLayout *StripsWidget::stripsLayout() const return m_stripsLayout; } -QLabel *StripsWidget::label() const +QLabel *StripsWidget::label0() const { - return m_label; + return m_label[0]; +} + +QLabel *StripsWidget::label1() const +{ + return m_label[1]; } const QDate &StripsWidget::date() const @@ -73,12 +87,11 @@ void StripsWidget::setDate(const QDate &date) Q_EMIT dateChanged(m_date = date); if(m_date.isValid()) - m_label->setText(tr("%0 (%1)") - .arg(std::array { tr("Monday"), tr("Tuesday"), tr("Wednesday"), tr("Thursday"), - tr("Friday"), tr("Saturday"), tr("Sunday") }[m_date.dayOfWeek() - 1]) + m_label[0]->setText(tr("%0 (%1)") + .arg(m_weekDays.at(m_date.dayOfWeek() - 1)) .arg(m_date.toString(tr("dd.MM.yyyy")))); else - m_label->setText(tr("Invalid")); + m_label[0]->setText(tr("Invalid")); refresh(); } @@ -98,6 +111,11 @@ void StripsWidget::setHighlighted(bool highlighted) } } +const GetDayinfoReply::Dayinfo &StripsWidget::dayinfo() const +{ + return m_dayinfo; +} + const QVector &StripsWidget::bookings() const { return m_bookings; @@ -128,6 +146,11 @@ bool StripsWidget::refreshing() const return m_refreshing; } +bool StripsWidget::refreshingDayinfo() const +{ + return m_refreshingDayinfo; +} + bool StripsWidget::refreshingBookings() const { return m_refreshingBookings; @@ -152,12 +175,34 @@ void StripsWidget::refresh() { clearStrips(); + m_label[1]->setText(QString()); m_stripsLayout->addWidget(new QLabel(tr("Loading..."), this)); + refreshDayinfo(); refreshBookings(false); refreshTimeAssignments(false); } +void StripsWidget::refreshDayinfo() +{ + if(!m_date.isValid()) + { + qWarning() << "invalid date"; + return; + } + + if(!m_refreshing) + Q_EMIT refreshingChanged(m_refreshing = true); + + if(!m_refreshingDayinfo) + Q_EMIT refreshingDayinfoChanged(m_refreshingDayinfo = true); + + invalidateValues(); + + m_getDayinfoReply = m_mainWindow.erfassung().doGetDayinfo(m_mainWindow.userInfo().userId, m_date, m_date); + connect(m_getDayinfoReply.get(), &ZeiterfassungReply::finished, this, &StripsWidget::getDayinfoFinished); +} + void StripsWidget::refreshBookings(bool createLabel) { if(!m_date.isValid()) @@ -483,6 +528,13 @@ void StripsWidget::clearStrips() } } +void StripsWidget::getDayinfoFinished() +{ + Q_EMIT dayinfoChanged(m_dayinfo = m_getDayinfoReply->dayinfos().first()); + + m_label[1]->setText(QString("%0 - %1").arg(m_dayinfo.soll.toString("HH:mm")).arg(m_dayinfo.ist.toString("HH:mm"))); +} + void StripsWidget::getBookingsFinished() { Q_EMIT bookingsChanged(m_bookings = m_getBookingsReply->bookings()); @@ -490,13 +542,11 @@ void StripsWidget::getBookingsFinished() if(m_refreshingBookings) Q_EMIT refreshingBookingsChanged(m_refreshingBookings = false); - if(!m_getTimeAssignmentsReply) - { - if(m_refreshing) - Q_EMIT refreshingChanged(m_refreshing = false); + if(m_refreshing && !m_getDayinfoReply && !m_getTimeAssignmentsReply) + Q_EMIT refreshingChanged(m_refreshing = false); + if(!m_getTimeAssignmentsReply) createStrips(); - } m_getBookingsReply = Q_NULLPTR; } @@ -508,13 +558,11 @@ void StripsWidget::getTimeAssignmentsFinished() if(m_refreshingTimeAssignments) Q_EMIT refreshingTimeAssignmentsChanged(m_refreshingTimeAssignments = false); - if(!m_getBookingsReply) - { - if(m_refreshing) - Q_EMIT refreshingChanged(m_refreshing = false); + if(m_refreshing && !m_getDayinfoReply && !m_getBookingsReply) + Q_EMIT refreshingChanged(m_refreshing = false); + if(!m_getBookingsReply) createStrips(); - } m_getTimeAssignmentsReply = Q_NULLPTR; } diff --git a/zeiterfassungguilib/stripswidget.h b/zeiterfassungguilib/stripswidget.h index f9a9cbe..ebeb961 100644 --- a/zeiterfassungguilib/stripswidget.h +++ b/zeiterfassungguilib/stripswidget.h @@ -6,6 +6,7 @@ #include #include "zeiterfassungguilib_global.h" +#include "replies/getdayinforeply.h" #include "replies/getbookingsreply.h" #include "replies/gettimeassignmentsreply.h" @@ -27,7 +28,8 @@ public: QBoxLayout *headerLayout() const; QBoxLayout *stripsLayout() const; - QLabel *label() const; + QLabel *label0() const; + QLabel *label1() const; const QDate &date() const; void setDate(const QDate &date); @@ -35,6 +37,7 @@ public: bool highlighted() const; void setHighlighted(bool highlighted); + const GetDayinfoReply::Dayinfo &dayinfo() const; const QVector &bookings() const; const QVector &timeAssignments() const; @@ -42,12 +45,14 @@ public: const QTime &lastTimeAssignmentStart() const; const QTime &minimumTime() const; bool refreshing() const; + bool refreshingDayinfo() const; bool refreshingBookings() const; bool refreshingTimeAssignments() const; bool startEnabled() const; bool endEnabled() const; void refresh(); + void refreshDayinfo(); void refreshBookings(bool createLabel = true); void refreshTimeAssignments(bool createLabel = true); bool createStrips(); @@ -57,6 +62,7 @@ Q_SIGNALS: void dateChanged(const QDate &date); void highlightedChanged(bool highlighted); + void dayinfoChanged(const GetDayinfoReply::Dayinfo &dayinfo); void bookingsChanged(const QVector &bookings); void timeAssignmentsChanged(const QVector &timeAssignments); @@ -64,12 +70,14 @@ Q_SIGNALS: void lastTimeAssignmentStartChanged(const QTime &lastTimeAssignmentStart); void minimumTimeChanged(const QTime &minimumTime); void refreshingChanged(bool refreshing); + void refreshingDayinfoChanged(bool refreshingDayinfo); void refreshingBookingsChanged(bool refreshingBookings); void refreshingTimeAssignmentsChanged(bool refreshingTimeAssignments); void startEnabledChanged(bool startEnabled); void endEnabledChanged(bool endEnabled); private Q_SLOTS: + void getDayinfoFinished(); void getBookingsFinished(); void getTimeAssignmentsFinished(); @@ -87,11 +95,12 @@ private: QBoxLayout *m_headerLayout; QBoxLayout *m_stripsLayout; - QLabel *m_label; + QLabel *m_label[2]; QDate m_date; bool m_highlighted; + GetDayinfoReply::Dayinfo m_dayinfo; QVector m_bookings; QVector m_timeAssignments; @@ -99,11 +108,15 @@ private: QTime m_lastTimeAssignmentStart; QTime m_minimumTime; bool m_refreshing; + bool m_refreshingDayinfo; bool m_refreshingBookings; bool m_refreshingTimeAssignments; bool m_startEnabled; bool m_endEnabled; + std::unique_ptr m_getDayinfoReply; std::unique_ptr m_getBookingsReply; std::unique_ptr m_getTimeAssignmentsReply; + + static const QStringList m_weekDays; }; -- 2.50.1