From 81f175d0b4254a6daee2a3b588ad0e261fb51a95 Mon Sep 17 00:00:00 2001 From: Oy! Rahm Date: Tue, 10 Apr 2018 10:08:43 +0200 Subject: [PATCH 01/39] Replaced Gotos but different Author --- zeiterfassung/main.cpp | 62 ++++++++++++++++++++++++------------------ 1 file changed, 36 insertions(+), 26 deletions(-) diff --git a/zeiterfassung/main.cpp b/zeiterfassung/main.cpp index 21a4aef..95675f0 100755 --- a/zeiterfassung/main.cpp +++ b/zeiterfassung/main.cpp @@ -168,38 +168,47 @@ bool loadLoginPage(QSplashScreen &splashScreen, ZeiterfassungSettings &settings, { splashScreen.showMessage(QCoreApplication::translate("main", "Loading login page..."), Qt::AlignHCenter | Qt::AlignBottom); - again: - auto reply = erfassung.doLoginPage(); + bool b_do_it_again = false; - reply->waitForFinished(); + do{ + b_do_it_again = false; - if(!reply->success()) - { - QMessageBox::warning(&splashScreen, QCoreApplication::translate("main", "Could not access Zeiterfassung!"), - QCoreApplication::translate("main", "Could not access Zeiterfassung!") % "\n\n" % reply->message()); + auto reply = erfassung.doLoginPage(); - inputAgain: - bool ok; - auto text = QInputDialog::getText(&splashScreen, QCoreApplication::translate("main", "Base url"), - QCoreApplication::translate("main", "Please enter the base url to the Zeiterfassung:"), - QLineEdit::Normal, settings.url().toString(), &ok); + reply->waitForFinished(); - if(!ok) - return false; - - auto url = QUrl::fromUserInput(text); - if(!url.isValid()) + if(!reply->success()) { - QMessageBox::warning(&splashScreen, QCoreApplication::translate("main", "Invalid url!"), - QCoreApplication::translate("main", "This url is not valid!")); - goto inputAgain; + QMessageBox::warning(&splashScreen, QCoreApplication::translate("main", "Could not access Zeiterfassung!"), + QCoreApplication::translate("main", "Could not access Zeiterfassung!") % "\n\n" % reply->message()); + + bool b_inputAgain = false; + + do{ + b_inputAgain = true; + bool ok; + auto text = QInputDialog::getText(&splashScreen, QCoreApplication::translate("main", "Base url"), + QCoreApplication::translate("main", "Please enter the base url to the Zeiterfassung:"), + QLineEdit::Normal, settings.url().toString(), &ok); + + if(!ok) + return false; + + auto url = QUrl::fromUserInput(text); + if(!url.isValid()) + { + QMessageBox::warning(&splashScreen, QCoreApplication::translate("main", "Invalid url!"), + QCoreApplication::translate("main", "This url is not valid!")); + b_inputAgain=true; + } + }while(b_inputAgain); + + settings.setUrl(url); + erfassung.setUrl(url); + + b_do_it_again = true; } - - settings.setUrl(url); - erfassung.setUrl(url); - - goto again; - } + }while (b_do_it_again); return true; } @@ -375,3 +384,4 @@ int main(int argc, char *argv[]) return app.exec(); } + -- 2.50.1 From 7294a6d23737628d4d773ae367ca592347f96db7 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE <0xfeedc0de64@gmail.com> Date: Tue, 10 Apr 2018 20:45:36 +0200 Subject: [PATCH 02/39] Fixed compilation under MSVC 2017 compiler --- zeiterfassungcorelib/cpp14polyfills.h | 2 +- zeiterfassungguilib/mainwindow.h | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/zeiterfassungcorelib/cpp14polyfills.h b/zeiterfassungcorelib/cpp14polyfills.h index 2fcbe50..d345a00 100644 --- a/zeiterfassungcorelib/cpp14polyfills.h +++ b/zeiterfassungcorelib/cpp14polyfills.h @@ -1,6 +1,6 @@ #pragma once -#if __cplusplus < 201402L +#if __cplusplus < 201402L && _MSC_VER < 1800 // std includes #include diff --git a/zeiterfassungguilib/mainwindow.h b/zeiterfassungguilib/mainwindow.h index 3b3d57c..d10ba18 100644 --- a/zeiterfassungguilib/mainwindow.h +++ b/zeiterfassungguilib/mainwindow.h @@ -1,5 +1,6 @@ #pragma once +#include #include #include -- 2.50.1 From 0eb0cb5473c0e2fe45336a6681ffe2b02a4e53ac Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Wed, 11 Apr 2018 19:29:17 +0100 Subject: [PATCH 03/39] Removed the need for a start script under unix --- lrelease.pri | 11 ------ plugins/absenceplugin/absenceplugin.pro | 16 +------- .../advancedviewplugin/advancedviewplugin.pro | 16 +------- plugins/devtoolsplugin/devtoolsplugin.pro | 16 +------- plugins/lunchmealplugin/lunchmealplugin.pro | 16 +------- plugins/plugin.pri | 9 +++++ plugins/presenceplugin/presenceplugin.pro | 16 +------- plugins/profileplugin/profileplugin.pro | 16 +------- plugins/reportsplugin/reportsplugin.pro | 16 +------- plugins/updaterplugin/updaterplugin.pro | 16 +------- plugins/weatherplugin/weatherplugin.pro | 16 +------- plugins/webradioplugin/webradioplugin.pro | 16 +------- project.pri | 39 +++++++++++++++++++ zeiterfassung/installs_unix.pri | 3 -- zeiterfassung/unix/zeiterfassung.sh | 3 -- zeiterfassung/zeiterfassung.pro | 11 +----- zeiterfassungcorelib/zeiterfassungcorelib.pro | 7 +--- zeiterfassungguilib/zeiterfassungguilib.pro | 12 +----- 18 files changed, 73 insertions(+), 182 deletions(-) delete mode 100644 lrelease.pri create mode 100644 plugins/plugin.pri create mode 100644 project.pri delete mode 100644 zeiterfassung/installs_unix.pri delete mode 100755 zeiterfassung/unix/zeiterfassung.sh diff --git a/lrelease.pri b/lrelease.pri deleted file mode 100644 index a17903f..0000000 --- a/lrelease.pri +++ /dev/null @@ -1,11 +0,0 @@ -isEmpty(QMAKE_LRELEASE) { - win32:QMAKE_LRELEASE = $$[QT_INSTALL_BINS]\lrelease.exe - else:QMAKE_LRELEASE = $$[QT_INSTALL_BINS]/lrelease -} - -lrelease.input = TRANSLATIONS -lrelease.output = $${OUT_PWD}/$${PROJECT_ROOT}/bin/translations/${QMAKE_FILE_BASE}.qm -lrelease.commands = $${QMAKE_LRELEASE} ${QMAKE_FILE_IN} -qm ${QMAKE_FILE_OUT} -lrelease.CONFIG += no_link -QMAKE_EXTRA_COMPILERS += lrelease -PRE_TARGETDEPS += compiler_lrelease_make_all diff --git a/plugins/absenceplugin/absenceplugin.pro b/plugins/absenceplugin/absenceplugin.pro index b0206c7..5e0eb4f 100644 --- a/plugins/absenceplugin/absenceplugin.pro +++ b/plugins/absenceplugin/absenceplugin.pro @@ -1,20 +1,8 @@ QT += core network gui widgets TARGET = absenceplugin -TEMPLATE = lib -CONFIG += shared c++14 - -PROJECT_ROOT = ../.. - -DESTDIR = $${OUT_PWD}/$${PROJECT_ROOT}/bin/plugins/zeiterfassung - -LIBS += -L$${OUT_PWD}/$${PROJECT_ROOT}/bin -lzeiterfassungcorelib -lzeiterfassungguilib - -INCLUDEPATH += $$PWD/$${PROJECT_ROOT}/zeiterfassungcorelib $$PWD/$${PROJECT_ROOT}/zeiterfassungguilib -DEPENDPATH += $$PWD/$${PROJECT_ROOT}/zeiterfassungcorelib $$PWD/$${PROJECT_ROOT}/zeiterfassungguilib - -DEFINES += QT_DEPRECATED_WARNINGS QT_DISABLE_DEPRECATED_BEFORE=0x060000 QT_MESSAGELOGCONTEXT +DBLIBS += core gui HEADERS += absencedialog.h \ absencesmodel.h \ @@ -35,4 +23,4 @@ TRANSLATIONS += translations/absenceplugin_en.ts \ OTHER_FILES += absenceplugin.json -include($${PROJECT_ROOT}/lrelease.pri) +include(../plugin.pri) diff --git a/plugins/advancedviewplugin/advancedviewplugin.pro b/plugins/advancedviewplugin/advancedviewplugin.pro index 6c90247..dcaa527 100644 --- a/plugins/advancedviewplugin/advancedviewplugin.pro +++ b/plugins/advancedviewplugin/advancedviewplugin.pro @@ -1,20 +1,8 @@ QT += core network gui widgets TARGET = advancedviewplugin -TEMPLATE = lib -CONFIG += shared c++14 - -PROJECT_ROOT = ../.. - -DESTDIR = $${OUT_PWD}/$${PROJECT_ROOT}/bin/plugins/zeiterfassung - -LIBS += -L$${OUT_PWD}/$${PROJECT_ROOT}/bin -lzeiterfassungcorelib -lzeiterfassungguilib - -INCLUDEPATH += $$PWD/$${PROJECT_ROOT}/zeiterfassungcorelib $$PWD/$${PROJECT_ROOT}/zeiterfassungguilib -DEPENDPATH += $$PWD/$${PROJECT_ROOT}/zeiterfassungcorelib $$PWD/$${PROJECT_ROOT}/zeiterfassungguilib - -DEFINES += QT_DEPRECATED_WARNINGS QT_DISABLE_DEPRECATED_BEFORE=0x060000 QT_MESSAGELOGCONTEXT +DBLIBS += core gui HEADERS += advancedviewdialog.h \ advancedviewplugin.h \ @@ -43,4 +31,4 @@ TRANSLATIONS += translations/advancedviewplugin_en.ts \ OTHER_FILES += advancedviewplugin.json -include($${PROJECT_ROOT}/lrelease.pri) +include(../plugin.pri) diff --git a/plugins/devtoolsplugin/devtoolsplugin.pro b/plugins/devtoolsplugin/devtoolsplugin.pro index 1b84eea..bf24d6a 100644 --- a/plugins/devtoolsplugin/devtoolsplugin.pro +++ b/plugins/devtoolsplugin/devtoolsplugin.pro @@ -1,20 +1,8 @@ QT += core network gui widgets TARGET = devtoolsplugin -TEMPLATE = lib -CONFIG += shared c++14 - -PROJECT_ROOT = ../.. - -DESTDIR = $${OUT_PWD}/$${PROJECT_ROOT}/bin/plugins/zeiterfassung - -LIBS += -L$${OUT_PWD}/$${PROJECT_ROOT}/bin -lzeiterfassungcorelib -lzeiterfassungguilib - -INCLUDEPATH += $$PWD/$${PROJECT_ROOT}/zeiterfassungcorelib $$PWD/$${PROJECT_ROOT}/zeiterfassungguilib -DEPENDPATH += $$PWD/$${PROJECT_ROOT}/zeiterfassungcorelib $$PWD/$${PROJECT_ROOT}/zeiterfassungguilib - -DEFINES += QT_DEPRECATED_WARNINGS QT_DISABLE_DEPRECATED_BEFORE=0x060000 QT_MESSAGELOGCONTEXT +DBLIBS += core gui HEADERS += devtoolsplugin.h \ logdialog.h \ @@ -33,4 +21,4 @@ TRANSLATIONS += translations/devtoolsplugin_en.ts \ OTHER_FILES += devtoolsplugin.json -include($${PROJECT_ROOT}/lrelease.pri) +include(../plugin.pri) diff --git a/plugins/lunchmealplugin/lunchmealplugin.pro b/plugins/lunchmealplugin/lunchmealplugin.pro index a786a82..8376b1f 100644 --- a/plugins/lunchmealplugin/lunchmealplugin.pro +++ b/plugins/lunchmealplugin/lunchmealplugin.pro @@ -1,20 +1,8 @@ QT += core network gui widgets TARGET = lunchmealplugin -TEMPLATE = lib -CONFIG += shared c++14 - -PROJECT_ROOT = ../.. - -DESTDIR = $${OUT_PWD}/$${PROJECT_ROOT}/bin/plugins/zeiterfassung - -LIBS += -L$${OUT_PWD}/$${PROJECT_ROOT}/bin -lzeiterfassungcorelib -lzeiterfassungguilib - -INCLUDEPATH += $$PWD/$${PROJECT_ROOT}/zeiterfassungcorelib $$PWD/$${PROJECT_ROOT}/zeiterfassungguilib -DEPENDPATH += $$PWD/$${PROJECT_ROOT}/zeiterfassungcorelib $$PWD/$${PROJECT_ROOT}/zeiterfassungguilib - -DEFINES += QT_DEPRECATED_WARNINGS QT_DISABLE_DEPRECATED_BEFORE=0x060000 QT_MESSAGELOGCONTEXT +DBLIBS += core gui HEADERS += lunchmealdialog.h \ lunchmealsettings.h \ @@ -37,4 +25,4 @@ TRANSLATIONS += translations/lunchmealplugin_en.ts \ OTHER_FILES += lunchmealplugin.json -include($${PROJECT_ROOT}/lrelease.pri) +include(../plugin.pri) diff --git a/plugins/plugin.pri b/plugins/plugin.pri new file mode 100644 index 0000000..e069ff8 --- /dev/null +++ b/plugins/plugin.pri @@ -0,0 +1,9 @@ +TEMPLATE = lib + +CONFIG += shared + +PROJECT_ROOT = ../.. + +include(../project.pri) + +DESTDIR = $${OUT_PWD}/$${PROJECT_ROOT}/bin/plugins/zeiterfassung diff --git a/plugins/presenceplugin/presenceplugin.pro b/plugins/presenceplugin/presenceplugin.pro index 302ff93..6bb4c79 100644 --- a/plugins/presenceplugin/presenceplugin.pro +++ b/plugins/presenceplugin/presenceplugin.pro @@ -1,20 +1,8 @@ QT += core network gui widgets TARGET = presenceplugin -TEMPLATE = lib -CONFIG += shared c++14 - -PROJECT_ROOT = ../.. - -DESTDIR = $${OUT_PWD}/$${PROJECT_ROOT}/bin/plugins/zeiterfassung - -LIBS += -L$${OUT_PWD}/$${PROJECT_ROOT}/bin -lzeiterfassungcorelib -lzeiterfassungguilib - -INCLUDEPATH += $$PWD/$${PROJECT_ROOT}/zeiterfassungcorelib $$PWD/$${PROJECT_ROOT}/zeiterfassungguilib -DEPENDPATH += $$PWD/$${PROJECT_ROOT}/zeiterfassungcorelib $$PWD/$${PROJECT_ROOT}/zeiterfassungguilib - -DEFINES += QT_DEPRECATED_WARNINGS QT_DISABLE_DEPRECATED_BEFORE=0x060000 QT_MESSAGELOGCONTEXT +DBLIBS += core gui HEADERS += presenceplugin.h \ presencewidget.h \ @@ -35,4 +23,4 @@ TRANSLATIONS += translations/presenceplugin_en.ts \ OTHER_FILES += presenceplugin.json -include($${PROJECT_ROOT}/lrelease.pri) +include(../plugin.pri) diff --git a/plugins/profileplugin/profileplugin.pro b/plugins/profileplugin/profileplugin.pro index c48fefd..1bf3077 100644 --- a/plugins/profileplugin/profileplugin.pro +++ b/plugins/profileplugin/profileplugin.pro @@ -1,20 +1,8 @@ QT += core network gui widgets TARGET = profileplugin -TEMPLATE = lib -CONFIG += shared c++14 - -PROJECT_ROOT = ../.. - -DESTDIR = $${OUT_PWD}/$${PROJECT_ROOT}/bin/plugins/zeiterfassung - -LIBS += -L$${OUT_PWD}/$${PROJECT_ROOT}/bin -lzeiterfassungcorelib -lzeiterfassungguilib - -INCLUDEPATH += $$PWD/$${PROJECT_ROOT}/zeiterfassungcorelib $$PWD/$${PROJECT_ROOT}/zeiterfassungguilib -DEPENDPATH += $$PWD/$${PROJECT_ROOT}/zeiterfassungcorelib $$PWD/$${PROJECT_ROOT}/zeiterfassungguilib - -DEFINES += QT_DEPRECATED_WARNINGS QT_DISABLE_DEPRECATED_BEFORE=0x060000 QT_MESSAGELOGCONTEXT +DBLIBS += core gui HEADERS += profiledialog.h \ profileplugin.h @@ -31,4 +19,4 @@ TRANSLATIONS += translations/profileplugin_en.ts \ OTHER_FILES += profileplugin.json -include($${PROJECT_ROOT}/lrelease.pri) +include(../plugin.pri) diff --git a/plugins/reportsplugin/reportsplugin.pro b/plugins/reportsplugin/reportsplugin.pro index b502ce4..d76802d 100644 --- a/plugins/reportsplugin/reportsplugin.pro +++ b/plugins/reportsplugin/reportsplugin.pro @@ -1,20 +1,8 @@ QT += core network gui widgets TARGET = reportsplugin -TEMPLATE = lib -CONFIG += shared c++14 - -PROJECT_ROOT = ../.. - -DESTDIR = $${OUT_PWD}/$${PROJECT_ROOT}/bin/plugins/zeiterfassung - -LIBS += -L$${OUT_PWD}/$${PROJECT_ROOT}/bin -lzeiterfassungcorelib -lzeiterfassungguilib - -INCLUDEPATH += $$PWD/$${PROJECT_ROOT}/zeiterfassungcorelib $$PWD/$${PROJECT_ROOT}/zeiterfassungguilib -DEPENDPATH += $$PWD/$${PROJECT_ROOT}/zeiterfassungcorelib $$PWD/$${PROJECT_ROOT}/zeiterfassungguilib - -DEFINES += QT_DEPRECATED_WARNINGS QT_DISABLE_DEPRECATED_BEFORE=0x060000 QT_MESSAGELOGCONTEXT +DBLIBS += core gui HEADERS += reportsplugin.h \ reportswidget.h @@ -31,4 +19,4 @@ TRANSLATIONS += translations/reportsplugin_en.ts \ OTHER_FILES += reportsplugin.json -include($${PROJECT_ROOT}/lrelease.pri) +include(../plugin.pri) diff --git a/plugins/updaterplugin/updaterplugin.pro b/plugins/updaterplugin/updaterplugin.pro index 68e3210..3cd325d 100644 --- a/plugins/updaterplugin/updaterplugin.pro +++ b/plugins/updaterplugin/updaterplugin.pro @@ -1,20 +1,8 @@ QT += core network gui widgets TARGET = updaterplugin -TEMPLATE = lib -CONFIG += shared c++14 - -PROJECT_ROOT = ../.. - -DESTDIR = $${OUT_PWD}/$${PROJECT_ROOT}/bin/plugins/zeiterfassung - -LIBS += -L$${OUT_PWD}/$${PROJECT_ROOT}/bin -lzeiterfassungcorelib -lzeiterfassungguilib - -INCLUDEPATH += $$PWD/$${PROJECT_ROOT}/zeiterfassungcorelib $$PWD/$${PROJECT_ROOT}/zeiterfassungguilib -DEPENDPATH += $$PWD/$${PROJECT_ROOT}/zeiterfassungcorelib $$PWD/$${PROJECT_ROOT}/zeiterfassungguilib - -DEFINES += QT_DEPRECATED_WARNINGS QT_DISABLE_DEPRECATED_BEFORE=0x060000 QT_MESSAGELOGCONTEXT +DBLIBS += core gui HEADERS += updaterdialog.h \ updaterplugin.h \ @@ -35,4 +23,4 @@ TRANSLATIONS += translations/updaterplugin_en.ts \ OTHER_FILES += updaterplugin.json -include($${PROJECT_ROOT}/lrelease.pri) +include(../plugin.pri) diff --git a/plugins/weatherplugin/weatherplugin.pro b/plugins/weatherplugin/weatherplugin.pro index 2fb4997..1bd8178 100644 --- a/plugins/weatherplugin/weatherplugin.pro +++ b/plugins/weatherplugin/weatherplugin.pro @@ -1,20 +1,8 @@ QT += core network gui widgets TARGET = weatherplugin -TEMPLATE = lib -CONFIG += shared c++14 - -PROJECT_ROOT = ../.. - -DESTDIR = $${OUT_PWD}/$${PROJECT_ROOT}/bin/plugins/zeiterfassung - -LIBS += -L$${OUT_PWD}/$${PROJECT_ROOT}/bin -lzeiterfassungcorelib -lzeiterfassungguilib - -INCLUDEPATH += $$PWD/$${PROJECT_ROOT}/zeiterfassungcorelib $$PWD/$${PROJECT_ROOT}/zeiterfassungguilib -DEPENDPATH += $$PWD/$${PROJECT_ROOT}/zeiterfassungcorelib $$PWD/$${PROJECT_ROOT}/zeiterfassungguilib - -DEFINES += QT_DEPRECATED_WARNINGS QT_DISABLE_DEPRECATED_BEFORE=0x060000 QT_MESSAGELOGCONTEXT +DBLIBS += core gui HEADERS += weatherplugin.h \ weathersettings.h \ @@ -35,4 +23,4 @@ TRANSLATIONS += translations/weatherplugin_en.ts \ OTHER_FILES += weatherplugin.json -include($${PROJECT_ROOT}/lrelease.pri) +include(../plugin.pri) diff --git a/plugins/webradioplugin/webradioplugin.pro b/plugins/webradioplugin/webradioplugin.pro index 8f7de0b..364ed49 100644 --- a/plugins/webradioplugin/webradioplugin.pro +++ b/plugins/webradioplugin/webradioplugin.pro @@ -1,20 +1,8 @@ QT += core network gui widgets multimedia TARGET = webradioplugin -TEMPLATE = lib -CONFIG += shared c++14 - -PROJECT_ROOT = ../.. - -DESTDIR = $${OUT_PWD}/$${PROJECT_ROOT}/bin/plugins/zeiterfassung - -LIBS += -L$${OUT_PWD}/$${PROJECT_ROOT}/bin -lzeiterfassungcorelib -lzeiterfassungguilib - -INCLUDEPATH += $$PWD/$${PROJECT_ROOT}/zeiterfassungcorelib $$PWD/$${PROJECT_ROOT}/zeiterfassungguilib -DEPENDPATH += $$PWD/$${PROJECT_ROOT}/zeiterfassungcorelib $$PWD/$${PROJECT_ROOT}/zeiterfassungguilib - -DEFINES += QT_DEPRECATED_WARNINGS QT_DISABLE_DEPRECATED_BEFORE=0x060000 QT_MESSAGELOGCONTEXT +DBLIBS += core gui HEADERS += webradiodialog.h \ webradioplugin.h \ @@ -35,4 +23,4 @@ TRANSLATIONS += translations/webradioplugin_en.ts \ OTHER_FILES += webradioplugin.json -include($${PROJECT_ROOT}/lrelease.pri) +include(../plugin.pri) diff --git a/project.pri b/project.pri new file mode 100644 index 0000000..cdd906d --- /dev/null +++ b/project.pri @@ -0,0 +1,39 @@ +CONFIG += c++14 + +DEFINES += QT_DEPRECATED_WARNINGS QT_DISABLE_DEPRECATED_BEFORE=0x060000 QT_MESSAGELOGCONTEXT + +equals(TEMPLATE, "lib") { + win32: DESTDIR = $${OUT_PWD}/$${PROJECT_ROOT}/bin + else: DESTDIR = $${OUT_PWD}/$${PROJECT_ROOT}/lib +} + +!isEmpty(DBLIBS) { + win32: LIBS += -L$${OUT_PWD}/$${PROJECT_ROOT}/bin + else: LIBS += -Wl,-rpath=\\\$$ORIGIN/../lib -L$${OUT_PWD}/$${PROJECT_ROOT}/lib +} + +contains(DBLIBS, core) { + LIBS += -lzeiterfassungcorelib + + INCLUDEPATH += $$PWD/zeiterfassungcorelib + DEPENDPATH += $$PWD/zeiterfassungcorelib +} + +contains(DBLIBS, gui) { + LIBS += -lzeiterfassungguilib + + INCLUDEPATH += $$PWD/zeiterfassungguilib + DEPENDPATH += $$PWD/zeiterfassungguilib +} + +isEmpty(QMAKE_LRELEASE) { + win32:QMAKE_LRELEASE = $$[QT_INSTALL_BINS]\lrelease.exe + else:QMAKE_LRELEASE = $$[QT_INSTALL_BINS]/lrelease +} + +lrelease.input = TRANSLATIONS +lrelease.output = $${OUT_PWD}/$${PROJECT_ROOT}/bin/translations/${QMAKE_FILE_BASE}.qm +lrelease.commands = $${QMAKE_LRELEASE} ${QMAKE_FILE_IN} -qm ${QMAKE_FILE_OUT} +lrelease.CONFIG += no_link +QMAKE_EXTRA_COMPILERS += lrelease +PRE_TARGETDEPS += compiler_lrelease_make_all diff --git a/zeiterfassung/installs_unix.pri b/zeiterfassung/installs_unix.pri deleted file mode 100644 index 26f2133..0000000 --- a/zeiterfassung/installs_unix.pri +++ /dev/null @@ -1,3 +0,0 @@ -scriptsInstall.path = $${DESTDIR} -scriptsInstall.files = unix/zeiterfassung.sh -INSTALLS += scriptsInstall diff --git a/zeiterfassung/unix/zeiterfassung.sh b/zeiterfassung/unix/zeiterfassung.sh deleted file mode 100755 index 29ab530..0000000 --- a/zeiterfassung/unix/zeiterfassung.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash -cd "${0%/*}" -LD_LIBRARY_PATH=. ./zeiterfassung diff --git a/zeiterfassung/zeiterfassung.pro b/zeiterfassung/zeiterfassung.pro index 506e989..98d5fbc 100755 --- a/zeiterfassung/zeiterfassung.pro +++ b/zeiterfassung/zeiterfassung.pro @@ -3,19 +3,13 @@ QT += core network gui widgets TARGET = zeiterfassung TEMPLATE = app -CONFIG += c++14 CONFIG -= app_bundle PROJECT_ROOT = .. DESTDIR = $${OUT_PWD}/$${PROJECT_ROOT}/bin -LIBS += -L$${OUT_PWD}/$${PROJECT_ROOT}/bin -lzeiterfassungcorelib -lzeiterfassungguilib - -INCLUDEPATH += $$PWD/$${PROJECT_ROOT}/zeiterfassungcorelib $$PWD/$${PROJECT_ROOT}/zeiterfassungguilib -DEPENDPATH += $$PWD/$${PROJECT_ROOT}/zeiterfassungcorelib $$PWD/$${PROJECT_ROOT}/zeiterfassungguilib - -DEFINES += QT_DEPRECATED_WARNINGS QT_DISABLE_DEPRECATED_BEFORE=0x060000 QT_MESSAGELOGCONTEXT +DBLIBS += core gui RC_ICONS = icon.ico @@ -32,7 +26,6 @@ RESOURCES += zeiterfassung_resources.qrc TRANSLATIONS += translations/zeiterfassung_en.ts \ translations/zeiterfassung_de.ts -include($${PROJECT_ROOT}/lrelease.pri) +include($${PROJECT_ROOT}/project.pri) include(installs.pri) -unix: include(installs_unix.pri) diff --git a/zeiterfassungcorelib/zeiterfassungcorelib.pro b/zeiterfassungcorelib/zeiterfassungcorelib.pro index 9ba114a..ad1b953 100644 --- a/zeiterfassungcorelib/zeiterfassungcorelib.pro +++ b/zeiterfassungcorelib/zeiterfassungcorelib.pro @@ -4,13 +4,8 @@ QT -= gui widgets TARGET = zeiterfassungcorelib TEMPLATE = lib -CONFIG += c++14 - PROJECT_ROOT = .. -DESTDIR = $${OUT_PWD}/$${PROJECT_ROOT}/bin - -DEFINES += QT_DEPRECATED_WARNINGS QT_DISABLE_DEPRECATED_BEFORE=0x060000 QT_MESSAGELOGCONTEXT DEFINES += ZEITERFASSUNGCORELIB_LIBRARY SOURCES += timeutils.cpp \ @@ -62,4 +57,4 @@ RESOURCES += TRANSLATIONS += translations/zeiterfassungcorelib_en.ts \ translations/zeiterfassungcorelib_de.ts -include($${PROJECT_ROOT}/lrelease.pri) +include($${PROJECT_ROOT}/project.pri) diff --git a/zeiterfassungguilib/zeiterfassungguilib.pro b/zeiterfassungguilib/zeiterfassungguilib.pro index 15c428a..002093b 100644 --- a/zeiterfassungguilib/zeiterfassungguilib.pro +++ b/zeiterfassungguilib/zeiterfassungguilib.pro @@ -3,18 +3,10 @@ QT += core network gui widgets uitools TARGET = zeiterfassungguilib TEMPLATE = lib -CONFIG += c++14 - PROJECT_ROOT = .. -DESTDIR = $${OUT_PWD}/$${PROJECT_ROOT}/bin +DBLIBS += core -LIBS += -L$$DESTDIR -lzeiterfassungcorelib - -INCLUDEPATH += $$PWD/$${PROJECT_ROOT}/zeiterfassungcorelib $$PWD/$${PROJECT_ROOT}/zeiterfassungguilib -DEPENDPATH += $$PWD/$${PROJECT_ROOT}/zeiterfassungcorelib $$PWD/$${PROJECT_ROOT}/zeiterfassungguilib - -DEFINES += QT_DEPRECATED_WARNINGS QT_DISABLE_DEPRECATED_BEFORE=0x060000 QT_MESSAGELOGCONTEXT DEFINES += ZEITERFASSUNGGUILIB_LIBRARY SOURCES += mainwindow.cpp \ @@ -48,6 +40,6 @@ RESOURCES += zeiterfassungguilib_resources.qrc TRANSLATIONS += translations/zeiterfassungguilib_en.ts \ translations/zeiterfassungguilib_de.ts -include($${PROJECT_ROOT}/lrelease.pri) +include($${PROJECT_ROOT}/project.pri) include(QStringListWidget/QStringListWidget.pri) -- 2.50.1 From 19fe53016a4acd311d45ef0cb6e8f06fd445aed1 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Wed, 11 Apr 2018 23:33:58 +0200 Subject: [PATCH 04/39] Replaced include guards with pragma once --- plugins/lunchmealplugin/lunchmealsettings.h | 5 +---- plugins/lunchmealplugin/lunchmealsettingswidget.h | 5 +---- plugins/presenceplugin/presencesettings.h | 5 +---- plugins/presenceplugin/presencesettingswidget.h | 5 +---- plugins/updaterplugin/updatersettings.h | 5 +---- plugins/updaterplugin/updatersettingswidget.h | 5 +---- plugins/weatherplugin/weathersettings.h | 5 +---- plugins/weatherplugin/weathersettingswidget.h | 5 +---- plugins/webradioplugin/webradiosettings.h | 5 +---- plugins/webradioplugin/webradiosettingswidget.h | 5 +---- zeiterfassungguilib/settingswidget.h | 5 +---- 11 files changed, 11 insertions(+), 44 deletions(-) diff --git a/plugins/lunchmealplugin/lunchmealsettings.h b/plugins/lunchmealplugin/lunchmealsettings.h index daa3d2b..7db1913 100644 --- a/plugins/lunchmealplugin/lunchmealsettings.h +++ b/plugins/lunchmealplugin/lunchmealsettings.h @@ -1,5 +1,4 @@ -#ifndef LUNCHMEALSETTINGS_H -#define LUNCHMEALSETTINGS_H +#pragma once #include #include @@ -34,5 +33,3 @@ private: static const QString m_defaultUrl; static const QString m_defaultDateFormat; }; - -#endif // LUNCHMEALSETTINGS_H diff --git a/plugins/lunchmealplugin/lunchmealsettingswidget.h b/plugins/lunchmealplugin/lunchmealsettingswidget.h index 90f7ff0..72d99d6 100644 --- a/plugins/lunchmealplugin/lunchmealsettingswidget.h +++ b/plugins/lunchmealplugin/lunchmealsettingswidget.h @@ -1,5 +1,4 @@ -#ifndef LUNCHMEALSETTINGSWIDGET_H -#define LUNCHMEALSETTINGSWIDGET_H +#pragma once #include "settingswidget.h" @@ -25,5 +24,3 @@ private: QLineEdit *m_lineEditUrl; QLineEdit *m_lineEditDateFormat; }; - -#endif // LUNCHMEALSETTINGSWIDGET_H diff --git a/plugins/presenceplugin/presencesettings.h b/plugins/presenceplugin/presencesettings.h index 5df7126..1fb2610 100644 --- a/plugins/presenceplugin/presencesettings.h +++ b/plugins/presenceplugin/presencesettings.h @@ -1,5 +1,4 @@ -#ifndef PRESENCESETTINGS_H -#define PRESENCESETTINGS_H +#pragma once #include @@ -25,5 +24,3 @@ private: static const QString m_interval; static const int m_defaultInterval; }; - -#endif // PRESENCESETTINGS_H diff --git a/plugins/presenceplugin/presencesettingswidget.h b/plugins/presenceplugin/presencesettingswidget.h index 6aaf882..5427b32 100644 --- a/plugins/presenceplugin/presencesettingswidget.h +++ b/plugins/presenceplugin/presencesettingswidget.h @@ -1,5 +1,4 @@ -#ifndef PRESENCESETTINGSWIDGET_H -#define PRESENCESETTINGSWIDGET_H +#pragma once #include "settingswidget.h" @@ -24,5 +23,3 @@ private: QSpinBox *m_spinBox; }; - -#endif // PRESENCESETTINGSWIDGET_H diff --git a/plugins/updaterplugin/updatersettings.h b/plugins/updaterplugin/updatersettings.h index dbce8ea..0eca1e4 100644 --- a/plugins/updaterplugin/updatersettings.h +++ b/plugins/updaterplugin/updatersettings.h @@ -1,5 +1,4 @@ -#ifndef UPDATERSETTINGS_H -#define UPDATERSETTINGS_H +#pragma once #include #include @@ -33,5 +32,3 @@ private: static const QString m_lastUpdateCheck; static const QUrl m_defaultUrl; }; - -#endif // UPDATERSETTINGS_H diff --git a/plugins/updaterplugin/updatersettingswidget.h b/plugins/updaterplugin/updatersettingswidget.h index b5c0cda..74a938e 100644 --- a/plugins/updaterplugin/updatersettingswidget.h +++ b/plugins/updaterplugin/updatersettingswidget.h @@ -1,5 +1,4 @@ -#ifndef UPDATERSETTINGSWIDGET_H -#define UPDATERSETTINGSWIDGET_H +#pragma once #include "settingswidget.h" @@ -24,5 +23,3 @@ private: QLineEdit *m_lineEdit; }; - -#endif // UPDATERSETTINGSWIDGET_H diff --git a/plugins/weatherplugin/weathersettings.h b/plugins/weatherplugin/weathersettings.h index 92da89f..c137b6f 100644 --- a/plugins/weatherplugin/weathersettings.h +++ b/plugins/weatherplugin/weathersettings.h @@ -1,5 +1,4 @@ -#ifndef WEATHERSETTINGS_H -#define WEATHERSETTINGS_H +#pragma once #include #include @@ -26,5 +25,3 @@ private: static const QString m_url; static const QUrl m_defaultUrl; }; - -#endif // WEATHERSETTINGS_H diff --git a/plugins/weatherplugin/weathersettingswidget.h b/plugins/weatherplugin/weathersettingswidget.h index e291159..b1688a6 100644 --- a/plugins/weatherplugin/weathersettingswidget.h +++ b/plugins/weatherplugin/weathersettingswidget.h @@ -1,5 +1,4 @@ -#ifndef WEATHERSETTINGSWIDGET_H -#define WEATHERSETTINGSWIDGET_H +#pragma once #include @@ -28,5 +27,3 @@ private: QLineEdit *m_lineEdit; }; - -#endif // WEATHERSETTINGSWIDGET_H diff --git a/plugins/webradioplugin/webradiosettings.h b/plugins/webradioplugin/webradiosettings.h index e70d7da..12c9ad7 100644 --- a/plugins/webradioplugin/webradiosettings.h +++ b/plugins/webradioplugin/webradiosettings.h @@ -1,5 +1,4 @@ -#ifndef WEBRADIOSETTINGS_H -#define WEBRADIOSETTINGS_H +#pragma once #include #include @@ -39,5 +38,3 @@ private: static const QStringList m_defaultUrls; static const int m_defaultVolume; }; - -#endif // WEBRADIOSETTINGS_H diff --git a/plugins/webradioplugin/webradiosettingswidget.h b/plugins/webradioplugin/webradiosettingswidget.h index 1499985..d1f77dc 100644 --- a/plugins/webradioplugin/webradiosettingswidget.h +++ b/plugins/webradioplugin/webradiosettingswidget.h @@ -1,5 +1,4 @@ -#ifndef WEBRADIOSETTINGSWIDGET_H -#define WEBRADIOSETTINGSWIDGET_H +#pragma once #include @@ -28,5 +27,3 @@ private: QStringListWidget *m_urlsWidget; }; - -#endif // WEBRADIOSETTINGSWIDGET_H diff --git a/zeiterfassungguilib/settingswidget.h b/zeiterfassungguilib/settingswidget.h index ed671be..7b21ff2 100644 --- a/zeiterfassungguilib/settingswidget.h +++ b/zeiterfassungguilib/settingswidget.h @@ -1,5 +1,4 @@ -#ifndef SETTINGSWIDGET_H -#define SETTINGSWIDGET_H +#pragma once #include #include @@ -18,5 +17,3 @@ public: public Q_SLOTS: virtual void apply() { } }; - -#endif // SETTINGSWIDGET_H -- 2.50.1 From 2fa2f55ad146b4e877f3c47638f2a2210af2681e Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Wed, 11 Apr 2018 23:34:18 +0200 Subject: [PATCH 05/39] Fixed warning in PresenceSettingsWidget --- plugins/presenceplugin/presencesettingswidget.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/presenceplugin/presencesettingswidget.cpp b/plugins/presenceplugin/presencesettingswidget.cpp index bd7e027..b86c817 100644 --- a/plugins/presenceplugin/presencesettingswidget.cpp +++ b/plugins/presenceplugin/presencesettingswidget.cpp @@ -20,6 +20,7 @@ PresenceSettingsWidget::PresenceSettingsWidget(ZeiterfassungSettings &settings, bool PresenceSettingsWidget::isValid(QString &message) const { + Q_UNUSED(message) return true; } -- 2.50.1 From ccddc736b7b8140307b627c9835057f1a9178487 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Wed, 11 Apr 2018 23:37:42 +0200 Subject: [PATCH 06/39] Updated QStringListWidget library --- zeiterfassungguilib/QStringListWidget | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zeiterfassungguilib/QStringListWidget b/zeiterfassungguilib/QStringListWidget index 0090c29..a975450 160000 --- a/zeiterfassungguilib/QStringListWidget +++ b/zeiterfassungguilib/QStringListWidget @@ -1 +1 @@ -Subproject commit 0090c29663d23293d6d0b90f8dd9f7ac57170df1 +Subproject commit a975450b63ba065bc2036f0b413eeec95fb1ccb8 -- 2.50.1 From 9d3853fc0778953256d9784532756e9ab6a14cbe Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Wed, 11 Apr 2018 23:38:26 +0200 Subject: [PATCH 07/39] Fixed compilation of QStringListWidget in lib --- QtZeiterfassung.pro | 2 +- project.pri | 4 +++- zeiterfassungguilib/zeiterfassungguilib.pro | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/QtZeiterfassung.pro b/QtZeiterfassung.pro index 7fae094..34ea3b1 100644 --- a/QtZeiterfassung.pro +++ b/QtZeiterfassung.pro @@ -5,7 +5,7 @@ SUBDIRS += plugins \ zeiterfassungcorelib \ zeiterfassungguilib -plugins.depends += zeiterfassungguilib +plugins.depends += zeiterfassungcorelib zeiterfassungguilib zeiterfassung.depends += zeiterfassungcorelib zeiterfassungguilib zeiterfassungguilib.depends += zeiterfassungcorelib diff --git a/project.pri b/project.pri index cdd906d..23337c2 100644 --- a/project.pri +++ b/project.pri @@ -1,6 +1,8 @@ CONFIG += c++14 -DEFINES += QT_DEPRECATED_WARNINGS QT_DISABLE_DEPRECATED_BEFORE=0x060000 QT_MESSAGELOGCONTEXT +DEFINES += QT_DEPRECATED_WARNINGS \ + QT_DISABLE_DEPRECATED_BEFORE=0x060000 \ + QT_MESSAGELOGCONTEXT equals(TEMPLATE, "lib") { win32: DESTDIR = $${OUT_PWD}/$${PROJECT_ROOT}/bin diff --git a/zeiterfassungguilib/zeiterfassungguilib.pro b/zeiterfassungguilib/zeiterfassungguilib.pro index 002093b..61021a1 100644 --- a/zeiterfassungguilib/zeiterfassungguilib.pro +++ b/zeiterfassungguilib/zeiterfassungguilib.pro @@ -7,7 +7,8 @@ PROJECT_ROOT = .. DBLIBS += core -DEFINES += ZEITERFASSUNGGUILIB_LIBRARY +DEFINES += ZEITERFASSUNGGUILIB_LIBRARY \ + QSTRINGLISTWIDGETLIB_LIBRARY SOURCES += mainwindow.cpp \ settingswidget.cpp \ -- 2.50.1 From 9c1e992b4203605f8b26821fa936d988ee7edddc Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Wed, 11 Apr 2018 23:39:59 +0200 Subject: [PATCH 08/39] Fixed loading of translations of corelib --- zeiterfassung/main.cpp | 8 +++++--- zeiterfassungcorelib/zeiterfassungcorelib.pro | 4 ++-- zeiterfassungguilib/zeiterfassungguilib.pro | 4 ++-- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/zeiterfassung/main.cpp b/zeiterfassung/main.cpp index 21a4aef..b185274 100755 --- a/zeiterfassung/main.cpp +++ b/zeiterfassung/main.cpp @@ -31,6 +31,7 @@ struct { QTranslator qtTranslator; QTranslator zeiterfassungTranslator; + QTranslator zeiterfassungcorelibTranslator; QTranslator zeiterfassungguilibTranslator; } translators; @@ -80,9 +81,10 @@ bool loadTranslations(QSplashScreen &splashScreen, ZeiterfassungSettings &settin QLocale::setDefault(QLocale(settings.language(), QLocale::Austria)); - loadAndInstallTranslator(translators.qtTranslator, QStringLiteral("qt")); - loadAndInstallTranslator(translators.zeiterfassungTranslator, QStringLiteral("zeiterfassung")); - loadAndInstallTranslator(translators.zeiterfassungguilibTranslator, QStringLiteral("zeiterfassungguilib")); + loadAndInstallTranslator(translators.qtTranslator, QStringLiteral("qt")); + loadAndInstallTranslator(translators.zeiterfassungTranslator, QStringLiteral("zeiterfassung")); + loadAndInstallTranslator(translators.zeiterfassungcorelibTranslator, QStringLiteral("zeiterfassungcorelib")); + loadAndInstallTranslator(translators.zeiterfassungguilibTranslator, QStringLiteral("zeiterfassungguilib")); return true; } diff --git a/zeiterfassungcorelib/zeiterfassungcorelib.pro b/zeiterfassungcorelib/zeiterfassungcorelib.pro index ad1b953..f64770b 100644 --- a/zeiterfassungcorelib/zeiterfassungcorelib.pro +++ b/zeiterfassungcorelib/zeiterfassungcorelib.pro @@ -54,7 +54,7 @@ FORMS += RESOURCES += -TRANSLATIONS += translations/zeiterfassungcorelib_en.ts \ - translations/zeiterfassungcorelib_de.ts +TRANSLATIONS += translations/zeiterfassungcorelib_en.ts \ + translations/zeiterfassungcorelib_de.ts include($${PROJECT_ROOT}/project.pri) diff --git a/zeiterfassungguilib/zeiterfassungguilib.pro b/zeiterfassungguilib/zeiterfassungguilib.pro index 61021a1..617b6f6 100644 --- a/zeiterfassungguilib/zeiterfassungguilib.pro +++ b/zeiterfassungguilib/zeiterfassungguilib.pro @@ -38,8 +38,8 @@ FORMS += mainwindow.ui \ RESOURCES += zeiterfassungguilib_resources.qrc -TRANSLATIONS += translations/zeiterfassungguilib_en.ts \ - translations/zeiterfassungguilib_de.ts +TRANSLATIONS += translations/zeiterfassungguilib_en.ts \ + translations/zeiterfassungguilib_de.ts include($${PROJECT_ROOT}/project.pri) -- 2.50.1 From 40168628c2d37976e971785abb1a4dc6ecb3e12e Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Wed, 11 Apr 2018 23:48:17 +0200 Subject: [PATCH 09/39] Added sketchplugin project --- plugins/plugins.pro | 1 + plugins/sketchplugin/sketchplugin.cpp | 26 +++++++++++++++++++ plugins/sketchplugin/sketchplugin.h | 21 +++++++++++++++ plugins/sketchplugin/sketchplugin.json | 0 plugins/sketchplugin/sketchplugin.pro | 20 ++++++++++++++ .../sketchplugin/sketchplugin_resources.qrc | 4 +++ .../translations/sketchplugin_de.ts | 4 +++ .../translations/sketchplugin_en.ts | 4 +++ 8 files changed, 80 insertions(+) create mode 100644 plugins/sketchplugin/sketchplugin.cpp create mode 100644 plugins/sketchplugin/sketchplugin.h create mode 100644 plugins/sketchplugin/sketchplugin.json create mode 100644 plugins/sketchplugin/sketchplugin.pro create mode 100644 plugins/sketchplugin/sketchplugin_resources.qrc create mode 100644 plugins/sketchplugin/translations/sketchplugin_de.ts create mode 100644 plugins/sketchplugin/translations/sketchplugin_en.ts diff --git a/plugins/plugins.pro b/plugins/plugins.pro index 2857a61..09d0bcd 100644 --- a/plugins/plugins.pro +++ b/plugins/plugins.pro @@ -7,6 +7,7 @@ SUBDIRS += absenceplugin \ profileplugin \ presenceplugin \ reportsplugin \ + sketchplugin \ updaterplugin \ weatherplugin \ webradioplugin diff --git a/plugins/sketchplugin/sketchplugin.cpp b/plugins/sketchplugin/sketchplugin.cpp new file mode 100644 index 0000000..1e7b643 --- /dev/null +++ b/plugins/sketchplugin/sketchplugin.cpp @@ -0,0 +1,26 @@ +#include "sketchplugin.h" + +#include +#include +#include +#include + +SketchPlugin::SketchPlugin(QObject *parent) : + ZeiterfassungPlugin(parent) +{ + qDebug() << "called"; + + static auto dir = QDir(QCoreApplication::applicationDirPath()).absoluteFilePath(QStringLiteral("translations")); + + if(m_translator.load(QLocale(), QStringLiteral("sketchplugin"), QStringLiteral("_"), dir)) + { + if(!QCoreApplication::installTranslator(&m_translator)) + { + qWarning() << "could not install translation sketchplugin"; + } + } + else + { + qWarning() << "could not load translation sketchplugin"; + } +} diff --git a/plugins/sketchplugin/sketchplugin.h b/plugins/sketchplugin/sketchplugin.h new file mode 100644 index 0000000..471d06c --- /dev/null +++ b/plugins/sketchplugin/sketchplugin.h @@ -0,0 +1,21 @@ +#pragma once + +#include +#include + +#include "zeiterfassungplugin.h" + +class MainWindow; + +class Q_DECL_EXPORT SketchPlugin : public ZeiterfassungPlugin +{ + Q_OBJECT + Q_PLUGIN_METADATA(IID "dbsoftware.zeiterfassung.plugin/1.0" FILE "sketchplugin.json") + Q_INTERFACES(ZeiterfassungPlugin) + +public: + explicit SketchPlugin(QObject *parent = Q_NULLPTR); + +private: + QTranslator m_translator; +}; diff --git a/plugins/sketchplugin/sketchplugin.json b/plugins/sketchplugin/sketchplugin.json new file mode 100644 index 0000000..e69de29 diff --git a/plugins/sketchplugin/sketchplugin.pro b/plugins/sketchplugin/sketchplugin.pro new file mode 100644 index 0000000..6929490 --- /dev/null +++ b/plugins/sketchplugin/sketchplugin.pro @@ -0,0 +1,20 @@ +QT += core network gui widgets + +TARGET = sketchplugin + +DBLIBS += core gui + +HEADERS += sketchplugin.h + +SOURCES += sketchplugin.cpp + +FORMS += + +RESOURCES += sketchplugin_resources.qrc + +TRANSLATIONS += translations/sketchplugin_en.ts \ + translations/sketchplugin_de.ts + +OTHER_FILES += sketchplugin.json + +include(../plugin.pri) diff --git a/plugins/sketchplugin/sketchplugin_resources.qrc b/plugins/sketchplugin/sketchplugin_resources.qrc new file mode 100644 index 0000000..b69afa7 --- /dev/null +++ b/plugins/sketchplugin/sketchplugin_resources.qrc @@ -0,0 +1,4 @@ + + + + diff --git a/plugins/sketchplugin/translations/sketchplugin_de.ts b/plugins/sketchplugin/translations/sketchplugin_de.ts new file mode 100644 index 0000000..1552582 --- /dev/null +++ b/plugins/sketchplugin/translations/sketchplugin_de.ts @@ -0,0 +1,4 @@ + + + + diff --git a/plugins/sketchplugin/translations/sketchplugin_en.ts b/plugins/sketchplugin/translations/sketchplugin_en.ts new file mode 100644 index 0000000..bc6d6e7 --- /dev/null +++ b/plugins/sketchplugin/translations/sketchplugin_en.ts @@ -0,0 +1,4 @@ + + + + -- 2.50.1 From 412c083c9ea24fb4e111b2b40fbb5377ccc2099a Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Wed, 11 Apr 2018 23:50:33 +0200 Subject: [PATCH 10/39] Added QtSketch submodule --- .gitmodules | 3 +++ plugins/sketchplugin/QtSketch | 1 + 2 files changed, 4 insertions(+) create mode 160000 plugins/sketchplugin/QtSketch diff --git a/.gitmodules b/.gitmodules index 464f0ed..627633b 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "zeiterfassungguilib/QStringListWidget"] path = zeiterfassungguilib/QStringListWidget url = https://github.com/0xFEEDC0DE64/QStringListWidget.git +[submodule "plugins/sketchplugin/QtSketch"] + path = plugins/sketchplugin/QtSketch + url = https://github.com/0xFEEDC0DE64/QtSketch.git diff --git a/plugins/sketchplugin/QtSketch b/plugins/sketchplugin/QtSketch new file mode 160000 index 0000000..a059f6a --- /dev/null +++ b/plugins/sketchplugin/QtSketch @@ -0,0 +1 @@ +Subproject commit a059f6a157868670a4311021d311688a7a72fa3e -- 2.50.1 From 3214f2f1e18ea5716668dc9f405456584a834c15 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Thu, 12 Apr 2018 00:03:44 +0200 Subject: [PATCH 11/39] sketchlib now gets compiled with sketch plugin --- plugins/sketchplugin/QtSketch | 2 +- plugins/sketchplugin/sketchplugin.pro | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/plugins/sketchplugin/QtSketch b/plugins/sketchplugin/QtSketch index a059f6a..e510829 160000 --- a/plugins/sketchplugin/QtSketch +++ b/plugins/sketchplugin/QtSketch @@ -1 +1 @@ -Subproject commit a059f6a157868670a4311021d311688a7a72fa3e +Subproject commit e510829dfdb2b83b6ed82e48d6a069f834b8baa6 diff --git a/plugins/sketchplugin/sketchplugin.pro b/plugins/sketchplugin/sketchplugin.pro index 6929490..4414097 100644 --- a/plugins/sketchplugin/sketchplugin.pro +++ b/plugins/sketchplugin/sketchplugin.pro @@ -18,3 +18,5 @@ TRANSLATIONS += translations/sketchplugin_en.ts \ OTHER_FILES += sketchplugin.json include(../plugin.pri) + +include(QtSketch/sketchlib.pri) -- 2.50.1 From 9502a77073a55bfd1e4605e1e8ab1333f32b9ec6 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Thu, 12 Apr 2018 00:06:27 +0200 Subject: [PATCH 12/39] Updated QStringListWidget lib --- zeiterfassungguilib/QStringListWidget | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zeiterfassungguilib/QStringListWidget b/zeiterfassungguilib/QStringListWidget index a975450..f83c27a 160000 --- a/zeiterfassungguilib/QStringListWidget +++ b/zeiterfassungguilib/QStringListWidget @@ -1 +1 @@ -Subproject commit a975450b63ba065bc2036f0b413eeec95fb1ccb8 +Subproject commit f83c27ab3cbfa2804f38329b24df561afc3b08f2 -- 2.50.1 From 80d8a6bd87a34a12d39e7997b60b78bcb27c796d Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Thu, 12 Apr 2018 00:08:27 +0200 Subject: [PATCH 13/39] Eliminated the need for QStringListWidget include prefix --- plugins/webradioplugin/webradiosettingswidget.cpp | 2 +- project.pri | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/webradioplugin/webradiosettingswidget.cpp b/plugins/webradioplugin/webradiosettingswidget.cpp index 84ab61c..c66eff1 100644 --- a/plugins/webradioplugin/webradiosettingswidget.cpp +++ b/plugins/webradioplugin/webradiosettingswidget.cpp @@ -2,7 +2,7 @@ #include -#include "QStringListWidget/qstringlistwidget.h" +#include "qstringlistwidget.h" WebRadioSettingsWidget::WebRadioSettingsWidget(ZeiterfassungSettings &settings, QWidget *parent) : SettingsWidget(parent), diff --git a/project.pri b/project.pri index 23337c2..bffcdcc 100644 --- a/project.pri +++ b/project.pri @@ -24,8 +24,8 @@ contains(DBLIBS, core) { contains(DBLIBS, gui) { LIBS += -lzeiterfassungguilib - INCLUDEPATH += $$PWD/zeiterfassungguilib - DEPENDPATH += $$PWD/zeiterfassungguilib + INCLUDEPATH += $$PWD/zeiterfassungguilib $$PWD/zeiterfassungguilib/QStringListWidget + DEPENDPATH += $$PWD/zeiterfassungguilib $$PWD/zeiterfassungguilib/QStringListWidget } isEmpty(QMAKE_LRELEASE) { -- 2.50.1 From 45d901191c598e79baa251d5e2d398549f142ced Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Thu, 12 Apr 2018 19:41:27 +0200 Subject: [PATCH 14/39] Updated QtSketch library --- plugins/sketchplugin/QtSketch | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/sketchplugin/QtSketch b/plugins/sketchplugin/QtSketch index e510829..6a0122c 160000 --- a/plugins/sketchplugin/QtSketch +++ b/plugins/sketchplugin/QtSketch @@ -1 +1 @@ -Subproject commit e510829dfdb2b83b6ed82e48d6a069f834b8baa6 +Subproject commit 6a0122cf268e4cea87d1d80bc8458b438dd1b1db -- 2.50.1 From 61c52b8d777610ca6c4950850b6a20156f2e6c44 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Thu, 12 Apr 2018 19:53:14 +0200 Subject: [PATCH 15/39] Implemented menu action for sketch viewer --- plugins/sketchplugin/QtSketch | 2 +- plugins/sketchplugin/images/sketch.png | Bin 0 -> 3139 bytes plugins/sketchplugin/sketchplugin.cpp | 9 +++++++++ plugins/sketchplugin/sketchplugin.h | 3 +++ plugins/sketchplugin/sketchplugin_resources.qrc | 1 + 5 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 plugins/sketchplugin/images/sketch.png diff --git a/plugins/sketchplugin/QtSketch b/plugins/sketchplugin/QtSketch index 6a0122c..534892b 160000 --- a/plugins/sketchplugin/QtSketch +++ b/plugins/sketchplugin/QtSketch @@ -1 +1 @@ -Subproject commit 6a0122cf268e4cea87d1d80bc8458b438dd1b1db +Subproject commit 534892b633ee07af16d2ce0f5a86459c3880fe91 diff --git a/plugins/sketchplugin/images/sketch.png b/plugins/sketchplugin/images/sketch.png new file mode 100644 index 0000000000000000000000000000000000000000..05310ffe63965d93c364c66d3b4a626b0986d124 GIT binary patch literal 3139 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 Yy_TsBaxp343=9kmp00i_>zopr0M)1Ivj6}9 literal 0 HcmV?d00001 diff --git a/plugins/sketchplugin/sketchplugin.cpp b/plugins/sketchplugin/sketchplugin.cpp index 1e7b643..9acc62e 100644 --- a/plugins/sketchplugin/sketchplugin.cpp +++ b/plugins/sketchplugin/sketchplugin.cpp @@ -4,6 +4,10 @@ #include #include #include +#include +#include + +#include "mainwindow.h" SketchPlugin::SketchPlugin(QObject *parent) : ZeiterfassungPlugin(parent) @@ -24,3 +28,8 @@ SketchPlugin::SketchPlugin(QObject *parent) : qWarning() << "could not load translation sketchplugin"; } } + +void SketchPlugin::attachTo(MainWindow &mainWindow) +{ + mainWindow.menuTools()->addAction(QIcon(QStringLiteral(":/zeiterfassung/plugins/sketchplugin/images/sketch.png")), tr("Open Sketch viewer")); +} diff --git a/plugins/sketchplugin/sketchplugin.h b/plugins/sketchplugin/sketchplugin.h index 471d06c..991b067 100644 --- a/plugins/sketchplugin/sketchplugin.h +++ b/plugins/sketchplugin/sketchplugin.h @@ -16,6 +16,9 @@ class Q_DECL_EXPORT SketchPlugin : public ZeiterfassungPlugin public: explicit SketchPlugin(QObject *parent = Q_NULLPTR); + // ZeiterfassungPlugin interface + void attachTo(MainWindow &mainWindow) Q_DECL_OVERRIDE; + private: QTranslator m_translator; }; diff --git a/plugins/sketchplugin/sketchplugin_resources.qrc b/plugins/sketchplugin/sketchplugin_resources.qrc index b69afa7..01ae86b 100644 --- a/plugins/sketchplugin/sketchplugin_resources.qrc +++ b/plugins/sketchplugin/sketchplugin_resources.qrc @@ -1,4 +1,5 @@ + images/sketch.png -- 2.50.1 From 733d514436d4bc00876fd9ab17ce99ef2101cf37 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Thu, 12 Apr 2018 19:57:11 +0200 Subject: [PATCH 16/39] Added sketch viewer window --- plugins/sketchplugin/sketchmainwindow.cpp | 14 +++++++++++++ plugins/sketchplugin/sketchmainwindow.h | 22 +++++++++++++++++++++ plugins/sketchplugin/sketchmainwindow.ui | 24 +++++++++++++++++++++++ plugins/sketchplugin/sketchplugin.cpp | 11 ++++++++++- plugins/sketchplugin/sketchplugin.h | 3 +++ plugins/sketchplugin/sketchplugin.pro | 8 +++++--- 6 files changed, 78 insertions(+), 4 deletions(-) create mode 100644 plugins/sketchplugin/sketchmainwindow.cpp create mode 100644 plugins/sketchplugin/sketchmainwindow.h create mode 100644 plugins/sketchplugin/sketchmainwindow.ui diff --git a/plugins/sketchplugin/sketchmainwindow.cpp b/plugins/sketchplugin/sketchmainwindow.cpp new file mode 100644 index 0000000..fc8f26a --- /dev/null +++ b/plugins/sketchplugin/sketchmainwindow.cpp @@ -0,0 +1,14 @@ +#include "sketchmainwindow.h" +#include "ui_sketchmainwindow.h" + +SketchMainWindow::SketchMainWindow(QWidget *parent) : + QMainWindow(parent), + ui(new Ui::SketchMainWindow) +{ + ui->setupUi(this); +} + +SketchMainWindow::~SketchMainWindow() +{ + delete ui; +} diff --git a/plugins/sketchplugin/sketchmainwindow.h b/plugins/sketchplugin/sketchmainwindow.h new file mode 100644 index 0000000..ede19cb --- /dev/null +++ b/plugins/sketchplugin/sketchmainwindow.h @@ -0,0 +1,22 @@ +#ifndef SKETCHMAINWINDOW_H +#define SKETCHMAINWINDOW_H + +#include + +namespace Ui { +class SketchMainWindow; +} + +class SketchMainWindow : public QMainWindow +{ + Q_OBJECT + +public: + explicit SketchMainWindow(QWidget *parent = 0); + ~SketchMainWindow(); + +private: + Ui::SketchMainWindow *ui; +}; + +#endif // SKETCHMAINWINDOW_H diff --git a/plugins/sketchplugin/sketchmainwindow.ui b/plugins/sketchplugin/sketchmainwindow.ui new file mode 100644 index 0000000..71a9d3b --- /dev/null +++ b/plugins/sketchplugin/sketchmainwindow.ui @@ -0,0 +1,24 @@ + + + + + SketchMainWindow + + + + 0 + 0 + 800 + 600 + + + + MainWindow + + + + + + + + diff --git a/plugins/sketchplugin/sketchplugin.cpp b/plugins/sketchplugin/sketchplugin.cpp index 9acc62e..0d65840 100644 --- a/plugins/sketchplugin/sketchplugin.cpp +++ b/plugins/sketchplugin/sketchplugin.cpp @@ -8,6 +8,7 @@ #include #include "mainwindow.h" +#include "sketchmainwindow.h" SketchPlugin::SketchPlugin(QObject *parent) : ZeiterfassungPlugin(parent) @@ -31,5 +32,13 @@ SketchPlugin::SketchPlugin(QObject *parent) : void SketchPlugin::attachTo(MainWindow &mainWindow) { - mainWindow.menuTools()->addAction(QIcon(QStringLiteral(":/zeiterfassung/plugins/sketchplugin/images/sketch.png")), tr("Open Sketch viewer")); + mainWindow.menuTools()->addAction(QIcon(QStringLiteral(":/zeiterfassung/plugins/sketchplugin/images/sketch.png")), tr("Open Sketch viewer"), + this, &SketchPlugin::openWindow); +} + +void SketchPlugin::openWindow() +{ + auto window = new SketchMainWindow; + window->setAttribute(Qt::WA_DeleteOnClose); + window->show(); } diff --git a/plugins/sketchplugin/sketchplugin.h b/plugins/sketchplugin/sketchplugin.h index 991b067..4285c74 100644 --- a/plugins/sketchplugin/sketchplugin.h +++ b/plugins/sketchplugin/sketchplugin.h @@ -19,6 +19,9 @@ public: // ZeiterfassungPlugin interface void attachTo(MainWindow &mainWindow) Q_DECL_OVERRIDE; +private Q_SLOTS: + void openWindow(); + private: QTranslator m_translator; }; diff --git a/plugins/sketchplugin/sketchplugin.pro b/plugins/sketchplugin/sketchplugin.pro index 4414097..bbc92f6 100644 --- a/plugins/sketchplugin/sketchplugin.pro +++ b/plugins/sketchplugin/sketchplugin.pro @@ -4,11 +4,13 @@ TARGET = sketchplugin DBLIBS += core gui -HEADERS += sketchplugin.h +HEADERS += sketchmainwindow.h \ + sketchplugin.h -SOURCES += sketchplugin.cpp +SOURCES += sketchmainwindow.cpp \ + sketchplugin.cpp -FORMS += +FORMS += sketchmainwindow.ui RESOURCES += sketchplugin_resources.qrc -- 2.50.1 From a1ec681ee0276d9f9d2fff0231b7b9aca49f49c5 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Thu, 12 Apr 2018 20:11:07 +0200 Subject: [PATCH 17/39] Added file open dialog --- plugins/sketchplugin/sketchmainwindow.cpp | 12 ++++ plugins/sketchplugin/sketchmainwindow.h | 3 + plugins/sketchplugin/sketchmainwindow.ui | 69 +++++++++++++++++++---- 3 files changed, 74 insertions(+), 10 deletions(-) diff --git a/plugins/sketchplugin/sketchmainwindow.cpp b/plugins/sketchplugin/sketchmainwindow.cpp index fc8f26a..c9e23c4 100644 --- a/plugins/sketchplugin/sketchmainwindow.cpp +++ b/plugins/sketchplugin/sketchmainwindow.cpp @@ -1,14 +1,26 @@ #include "sketchmainwindow.h" #include "ui_sketchmainwindow.h" +#include + SketchMainWindow::SketchMainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::SketchMainWindow) { ui->setupUi(this); + + ui->actionOpen->setShortcut(QKeySequence::Open); + ui->actionQuit->setShortcut(QKeySequence::Quit); + + connect(ui->actionOpen, &QAction::triggered, this, &SketchMainWindow::openPressed); } SketchMainWindow::~SketchMainWindow() { delete ui; } + +void SketchMainWindow::openPressed() +{ + QFileDialog::getOpenFileName(this, tr("Select a sketch file"), QString(), QStringLiteral("%0 (*.sketch)").arg(tr("Sketch file"))); +} diff --git a/plugins/sketchplugin/sketchmainwindow.h b/plugins/sketchplugin/sketchmainwindow.h index ede19cb..d2970a4 100644 --- a/plugins/sketchplugin/sketchmainwindow.h +++ b/plugins/sketchplugin/sketchmainwindow.h @@ -15,6 +15,9 @@ public: explicit SketchMainWindow(QWidget *parent = 0); ~SketchMainWindow(); +private Q_SLOTS: + void openPressed(); + private: Ui::SketchMainWindow *ui; }; diff --git a/plugins/sketchplugin/sketchmainwindow.ui b/plugins/sketchplugin/sketchmainwindow.ui index 71a9d3b..0fe15fa 100644 --- a/plugins/sketchplugin/sketchmainwindow.ui +++ b/plugins/sketchplugin/sketchmainwindow.ui @@ -1,9 +1,7 @@ + - - - SketchMainWindow - + 0 @@ -13,12 +11,63 @@ - MainWindow + Sketch Viewer - - - + + + + + + + + + + + 0 + 0 + 800 + 20 + + + + + &File + + + + + + + + + + + &Open + + + + + &Quit + + - - + + + + actionQuit + triggered() + SketchMainWindow + close() + + + -1 + -1 + + + 399 + 299 + + + + -- 2.50.1 From 68688fb53971252ad0234af0a18d47cf47ecbef4 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Thu, 12 Apr 2018 20:23:36 +0200 Subject: [PATCH 18/39] Implemented SketchMainWindow --- plugins/sketchplugin/sketchmainwindow.cpp | 59 ++++++++++++++++++++++- plugins/sketchplugin/sketchmainwindow.h | 2 + 2 files changed, 60 insertions(+), 1 deletion(-) diff --git a/plugins/sketchplugin/sketchmainwindow.cpp b/plugins/sketchplugin/sketchmainwindow.cpp index c9e23c4..04d057b 100644 --- a/plugins/sketchplugin/sketchmainwindow.cpp +++ b/plugins/sketchplugin/sketchmainwindow.cpp @@ -2,6 +2,15 @@ #include "ui_sketchmainwindow.h" #include +#include +#include +#include +#include + +#include "sketchfile.h" +#include "container/document.h" +#include "container/page.h" +#include "container/msjsonfilereference.h" SketchMainWindow::SketchMainWindow(QWidget *parent) : QMainWindow(parent), @@ -22,5 +31,53 @@ SketchMainWindow::~SketchMainWindow() void SketchMainWindow::openPressed() { - QFileDialog::getOpenFileName(this, tr("Select a sketch file"), QString(), QStringLiteral("%0 (*.sketch)").arg(tr("Sketch file"))); + auto filename = QFileDialog::getOpenFileName(this, tr("Select a sketch file"), QString(), QStringLiteral("%0 (*.sketch)").arg(tr("Sketch file"))); + if(filename.isEmpty()) + return; + + load(filename); +} + +void SketchMainWindow::load(const QString &filename) +{ + while(ui->tabWidget->count()) + { + auto widget = ui->tabWidget->widget(0); + ui->tabWidget->removeTab(0); + widget->deleteLater(); + } + + SketchFile file; + try + { + file.open(filename); + } + catch(const QString &msg) + { + QMessageBox::warning(this, tr("Could not load sketch file!"), tr("Could not load sketch file!") % "\n\n" % msg); + return; + } + + for(auto pageRef : file.document()->pages()) + { + Page *page; + try + { + page = file.loadPage(pageRef->_ref()); + } catch (QString msg) { + ui->tabWidget->addTab(new QLabel(QStringLiteral("Could not parse page: %0").arg(msg), ui->tabWidget), pageRef->_ref()); + continue; + } + + QGraphicsScene *scene; + try + { + scene = file.createScene(page); + } catch (QString msg) { + ui->tabWidget->addTab(new QLabel(QStringLiteral("Could not render page: %0").arg(msg), ui->tabWidget), page->name()); + continue; + } + + ui->tabWidget->addTab(new QGraphicsView(scene, ui->tabWidget), page->name()); + } } diff --git a/plugins/sketchplugin/sketchmainwindow.h b/plugins/sketchplugin/sketchmainwindow.h index d2970a4..f29296b 100644 --- a/plugins/sketchplugin/sketchmainwindow.h +++ b/plugins/sketchplugin/sketchmainwindow.h @@ -19,6 +19,8 @@ private Q_SLOTS: void openPressed(); private: + void load(const QString &filename); + Ui::SketchMainWindow *ui; }; -- 2.50.1 From f1301a4749814b0e12a2ca84dcb745d228a19860 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Fri, 13 Apr 2018 00:01:20 +0200 Subject: [PATCH 19/39] Fixed docker again --- .dockerignore | 7 +++++++ Dockerfile | 4 +++- 2 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 .dockerignore diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..aac63f5 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,7 @@ +/.gitignore +/.gitmodules +/.travis.yml +/Dockerfile +/LICENSE +/README.md +/screenshot.png diff --git a/Dockerfile b/Dockerfile index e997ef7..ed3a3dd 100644 --- a/Dockerfile +++ b/Dockerfile @@ -37,4 +37,6 @@ RUN apt update \ COPY --from=0 /tmp/build_QtZeiterfassung/bin /root/bin -CMD /root/bin/zeiterfassung.sh +COPY --from=0 /tmp/build_QtZeiterfassung/lib /root/lib + +CMD /root/bin/zeiterfassung -- 2.50.1 From 2d855f7d295b2b3bcab0e0750e7300d479f4df5b Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Fri, 13 Apr 2018 00:09:55 +0200 Subject: [PATCH 20/39] Updated QtSketch lib --- plugins/sketchplugin/QtSketch | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/sketchplugin/QtSketch b/plugins/sketchplugin/QtSketch index 534892b..1fe3eed 160000 --- a/plugins/sketchplugin/QtSketch +++ b/plugins/sketchplugin/QtSketch @@ -1 +1 @@ -Subproject commit 534892b633ee07af16d2ce0f5a86459c3880fe91 +Subproject commit 1fe3eed7da9d25412e224be2cbda7e54a484eeff -- 2.50.1 From 2f4b5f7cb638f10a0d117507a72d2aefbbffba29 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Wed, 9 May 2018 19:48:40 +0200 Subject: [PATCH 21/39] Using new qt build and runtime base images --- Dockerfile | 28 ++-------------------------- 1 file changed, 2 insertions(+), 26 deletions(-) diff --git a/Dockerfile b/Dockerfile index ed3a3dd..845e016 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,18 +1,4 @@ -FROM ubuntu:artful - -RUN ln -snf /usr/share/zoneinfo/Europe/Vienna /etc/localtime && echo Europe/Vienna > /etc/timezone - -RUN apt update \ - && apt install tzdata -y \ - && rm /var/lib/apt/lists/* /var/log/* -Rf - -RUN apt update \ - && apt install libssl1.0.0 ca-certificates libqt5core5a libqt5gui5 libqt5network5 libqt5multimedia5 -y \ - && rm /var/lib/apt/lists/* /var/log/* -Rf - -RUN apt update \ - && apt install git-core g++ make qt5-default qtmultimedia5-dev qttools5-dev qttools5-dev-tools -y \ - && rm /var/lib/apt/lists/* /var/log/* -Rf +FROM 0xfeedc0de64/qt-build ADD . /tmp/QtZeiterfassung @@ -23,17 +9,7 @@ RUN mkdir -p /tmp/build_QtZeiterfassung \ -FROM ubuntu:artful - -RUN ln -snf /usr/share/zoneinfo/Europe/Vienna /etc/localtime && echo Europe/Vienna > /etc/timezone - -RUN apt update \ - && apt install tzdata -y \ - && rm /var/lib/apt/lists/* /var/log/* -Rf - -RUN apt update \ - && apt install libssl1.0.0 ca-certificates libqt5core5a libqt5gui5 libqt5network5 libqt5multimedia5 -y \ - && rm /var/lib/apt/lists/* /var/log/* -Rf +FROM 0xfeedc0de64/qt-runtime COPY --from=0 /tmp/build_QtZeiterfassung/bin /root/bin -- 2.50.1 From f132f1b58342536a481728d905846fc3cc7e7f82 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Thu, 17 May 2018 19:33:17 +0200 Subject: [PATCH 22/39] Implemented prev/next week buttons --- zeiterfassungguilib/images/next_week.png | Bin 0 -> 5573 bytes zeiterfassungguilib/images/previous_week.png | Bin 0 -> 5569 bytes zeiterfassungguilib/mainwindow.cpp | 2 ++ zeiterfassungguilib/mainwindow.ui | 34 ++++++++++++++++-- .../zeiterfassungguilib_resources.qrc | 2 ++ 5 files changed, 35 insertions(+), 3 deletions(-) create mode 100644 zeiterfassungguilib/images/next_week.png create mode 100644 zeiterfassungguilib/images/previous_week.png diff --git a/zeiterfassungguilib/images/next_week.png b/zeiterfassungguilib/images/next_week.png new file mode 100644 index 0000000000000000000000000000000000000000..1eff4d83117e1ff0ca6b49112759cc4d37bb0703 GIT binary patch literal 5573 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 HDWM4f_)jfk literal 0 HcmV?d00001 diff --git a/zeiterfassungguilib/images/previous_week.png b/zeiterfassungguilib/images/previous_week.png new file mode 100644 index 0000000000000000000000000000000000000000..b636bbe4050fe64677f353fa64a3bdd373525448 GIT binary patch literal 5569 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 G&;$Try-@A| literal 0 HcmV?d00001 diff --git a/zeiterfassungguilib/mainwindow.cpp b/zeiterfassungguilib/mainwindow.cpp index 01ea863..071fba7 100644 --- a/zeiterfassungguilib/mainwindow.cpp +++ b/zeiterfassungguilib/mainwindow.cpp @@ -59,8 +59,10 @@ MainWindow::MainWindow(ZeiterfassungSettings &settings, ZeiterfassungApi &erfass ui->dateEditDate->setDate(QDate::currentDate()); connect(ui->dateEditDate, &QDateTimeEdit::dateChanged, this, &MainWindow::dateChangedSlot); + connect(ui->pushButtonPrevWeek, &QAbstractButton::pressed, this, [=](){ ui->dateEditDate->setDate(ui->dateEditDate->date().addDays(-7)); }); connect(ui->pushButtonPrev, &QAbstractButton::pressed, this, [=](){ ui->dateEditDate->setDate(ui->dateEditDate->date().addDays(-1)); }); connect(ui->pushButtonNext, &QAbstractButton::pressed, this, [=](){ ui->dateEditDate->setDate(ui->dateEditDate->date().addDays(1)); }); + connect(ui->pushButtonNextWeek, &QAbstractButton::pressed, this, [=](){ ui->dateEditDate->setDate(ui->dateEditDate->date().addDays(7)); }); connect(ui->timeEditTime, &QTimeEdit::timeChanged, this, [&](){ if(m_timerId != -1) diff --git a/zeiterfassungguilib/mainwindow.ui b/zeiterfassungguilib/mainwindow.ui index c96c07d..4e3720f 100644 --- a/zeiterfassungguilib/mainwindow.ui +++ b/zeiterfassungguilib/mainwindow.ui @@ -19,7 +19,18 @@ - + + + Previous week + + + + + + + :/zeiterfassungguilib/images/previous_week.png:/zeiterfassungguilib/images/previous_week.png + + @@ -35,6 +46,9 @@ + + + @@ -49,6 +63,20 @@ + + + + Next week + + + + + + + :/zeiterfassungguilib/images/next_week.png:/zeiterfassungguilib/images/next_week.png + + + @@ -183,7 +211,7 @@ 0 0 1393 - 440 + 428 @@ -198,7 +226,7 @@ 0 0 1411 - 22 + 26 diff --git a/zeiterfassungguilib/zeiterfassungguilib_resources.qrc b/zeiterfassungguilib/zeiterfassungguilib_resources.qrc index 2baf83f..f5bc43c 100644 --- a/zeiterfassungguilib/zeiterfassungguilib_resources.qrc +++ b/zeiterfassungguilib/zeiterfassungguilib_resources.qrc @@ -5,8 +5,10 @@ images/help.png images/icon.png images/next.png + images/next_week.png images/now.png images/previous.png + images/previous_week.png images/qt.png images/quit.png images/refresh.png -- 2.50.1 From 660390afa921b393b229d2648ccf744a9a539480 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Thu, 17 May 2018 19:38:55 +0200 Subject: [PATCH 23/39] Implemented box showing currently selected day --- zeiterfassungguilib/mainwindow.cpp | 3 +++ zeiterfassungguilib/stripswidget.cpp | 16 +++++++++++++++- zeiterfassungguilib/stripswidget.h | 9 +++++++-- 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/zeiterfassungguilib/mainwindow.cpp b/zeiterfassungguilib/mainwindow.cpp index 071fba7..e3d93ad 100644 --- a/zeiterfassungguilib/mainwindow.cpp +++ b/zeiterfassungguilib/mainwindow.cpp @@ -355,6 +355,7 @@ void MainWindow::dateChangedSlot(const QDate &date) { if(m_currentStripWidget) { + m_currentStripWidget->setHighlighted(false); disconnect(m_currentStripWidget, &StripsWidget::minimumTimeChanged, this, &MainWindow::minimumTimeChanged); disconnect(m_currentStripWidget, &StripsWidget::startEnabledChanged, this, &MainWindow::startEnabledChanged); disconnect(m_currentStripWidget, &StripsWidget::endEnabledChanged, this, &MainWindow::endEnabledChanged); @@ -362,6 +363,8 @@ void MainWindow::dateChangedSlot(const QDate &date) m_currentStripWidget = m_stripsWidgets[i]; + m_currentStripWidget->setHighlighted(true); + minimumTimeChanged(); startEnabledChanged(); endEnabledChanged(); diff --git a/zeiterfassungguilib/stripswidget.cpp b/zeiterfassungguilib/stripswidget.cpp index ab0e37c..131efba 100644 --- a/zeiterfassungguilib/stripswidget.cpp +++ b/zeiterfassungguilib/stripswidget.cpp @@ -13,7 +13,7 @@ #include "stripfactory.h" StripsWidget::StripsWidget(MainWindow &mainWindow, QWidget *parent) : - QWidget(parent), + QFrame(parent), m_mainWindow(mainWindow), m_refreshing(false), m_refreshingBookings(false), @@ -84,6 +84,20 @@ void StripsWidget::setDate(const QDate &date) } } +bool StripsWidget::highlighted() const +{ + return m_highlighted; +} + +void StripsWidget::setHighlighted(bool highlighted) +{ + if(m_highlighted != highlighted) + { + Q_EMIT highlightedChanged(m_highlighted = highlighted); + setFrameStyle(highlighted ? QFrame::Box : QFrame::NoFrame); + } +} + const QVector &StripsWidget::bookings() const { return m_bookings; diff --git a/zeiterfassungguilib/stripswidget.h b/zeiterfassungguilib/stripswidget.h index 38f1b61..f9a9cbe 100644 --- a/zeiterfassungguilib/stripswidget.h +++ b/zeiterfassungguilib/stripswidget.h @@ -2,7 +2,7 @@ #include -#include +#include #include #include "zeiterfassungguilib_global.h" @@ -15,7 +15,7 @@ template class QVector; class MainWindow; -class ZEITERFASSUNGGUILIBSHARED_EXPORT StripsWidget : public QWidget +class ZEITERFASSUNGGUILIBSHARED_EXPORT StripsWidget : public QFrame { Q_OBJECT @@ -32,6 +32,9 @@ public: const QDate &date() const; void setDate(const QDate &date); + bool highlighted() const; + void setHighlighted(bool highlighted); + const QVector &bookings() const; const QVector &timeAssignments() const; @@ -52,6 +55,7 @@ public: Q_SIGNALS: void dateChanged(const QDate &date); + void highlightedChanged(bool highlighted); void bookingsChanged(const QVector &bookings); void timeAssignmentsChanged(const QVector &timeAssignments); @@ -86,6 +90,7 @@ private: QLabel *m_label; QDate m_date; + bool m_highlighted; QVector m_bookings; QVector m_timeAssignments; -- 2.50.1 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 24/39] 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 25/39] 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 26/39] 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 27/39] 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 28/39] 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 29/39] 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 30/39] 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 31/39] 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 32/39] 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 33/39] 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 34/39] 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 35/39] 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 From 014884efdde091ac0cc868b9f8ba6005e8caa1d7 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Fri, 25 May 2018 20:44:18 +0200 Subject: [PATCH 36/39] Revert "Removed cpp14 polyfills" to fix travis again. This reverts commit def7acc366ec440e966b49941f45d100784e217b. --- zeiterfassungcorelib/cpp14polyfills.h | 43 +++++++++++++++++++ zeiterfassungcorelib/zeiterfassungapi.cpp | 3 ++ zeiterfassungcorelib/zeiterfassungcorelib.pro | 3 +- 3 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 zeiterfassungcorelib/cpp14polyfills.h diff --git a/zeiterfassungcorelib/cpp14polyfills.h b/zeiterfassungcorelib/cpp14polyfills.h new file mode 100644 index 0000000..d345a00 --- /dev/null +++ b/zeiterfassungcorelib/cpp14polyfills.h @@ -0,0 +1,43 @@ +#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 67d8ed3..78f2803 100644 --- a/zeiterfassungcorelib/zeiterfassungapi.cpp +++ b/zeiterfassungcorelib/zeiterfassungapi.cpp @@ -26,6 +26,9 @@ #include "replies/getabsencesreply.h" #include "replies/getdayinforeply.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 3a90c0b..80c924d 100644 --- a/zeiterfassungcorelib/zeiterfassungcorelib.pro +++ b/zeiterfassungcorelib/zeiterfassungcorelib.pro @@ -29,7 +29,8 @@ SOURCES += timeutils.cpp \ replies/updatetimeassignmentreply.cpp \ replies/zeiterfassungreply.cpp -HEADERS += timeutils.h \ +HEADERS += cpp14polyfills.h \ + timeutils.h \ zeiterfassungapi.h \ zeiterfassungcorelib_global.h \ zeiterfassungsettings.h \ -- 2.50.1 From d19ff8e3343a337675b1be5252dce01f118879f5 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Sun, 27 May 2018 19:08:50 +0200 Subject: [PATCH 37/39] Updated screenshot #57 --- screenshot.png | Bin 62981 -> 100542 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/screenshot.png b/screenshot.png index eefd6843f8d8a9e4fb1d9c604d79bb846632f002..6d17735130f0a8a59e654a505dd1ba32113f1f0f 100644 GIT binary patch literal 100542 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 -- 2.50.1 From 0b1a6e6db51db68f13935c7135b8999f7be313b1 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Sun, 27 May 2018 19:24:21 +0200 Subject: [PATCH 38/39] Date and time formatting now uses QLocale --- plugins/absenceplugin/absencedialog.cpp | 3 +- plugins/lunchmealplugin/lunchmealdialog.cpp | 3 +- plugins/profileplugin/profiledialog.cpp | 4 +- plugins/profileplugin/profiledialog.ui | 68 ++++++++++++++++----- zeiterfassungguilib/stripswidget.cpp | 29 ++++----- zeiterfassungguilib/stripswidget.h | 2 - 6 files changed, 71 insertions(+), 38 deletions(-) diff --git a/plugins/absenceplugin/absencedialog.cpp b/plugins/absenceplugin/absencedialog.cpp index 3706455..40c66fa 100644 --- a/plugins/absenceplugin/absencedialog.cpp +++ b/plugins/absenceplugin/absencedialog.cpp @@ -2,6 +2,7 @@ #include "ui_absencedialog.h" #include +#include #include #include #include @@ -15,7 +16,7 @@ AbsenceDialog::AbsenceDialog(int userId, const QDate &date, ZeiterfassungApi &er { ui->setupUi(this); - ui->labelTitle->setText(tr("Absences for %0").arg(date.toString(tr("dd.MM.yyyy")))); + ui->labelTitle->setText(tr("Absences for %0").arg(QLocale().toString(date))); m_model = new AbsencesModel(userId, date, erfassung, this); connect(m_model, &AbsencesModel::errorOccured, this, &AbsenceDialog::errorOccured); diff --git a/plugins/lunchmealplugin/lunchmealdialog.cpp b/plugins/lunchmealplugin/lunchmealdialog.cpp index 972de57..2bed534 100644 --- a/plugins/lunchmealplugin/lunchmealdialog.cpp +++ b/plugins/lunchmealplugin/lunchmealdialog.cpp @@ -2,6 +2,7 @@ #include "ui_lunchmealdialog.h" #include +#include LunchMealDialog::LunchMealDialog(const QDate &date, const QString &content, QWidget *parent) : ZeiterfassungDialog(parent), @@ -9,7 +10,7 @@ LunchMealDialog::LunchMealDialog(const QDate &date, const QString &content, QWid { ui->setupUi(this); - ui->labelTitle->setText(tr("Lunch meal for %0").arg(date.toString(tr("dd.MM.yyyy")))); + ui->labelTitle->setText(tr("Lunch meal for %0").arg(QLocale().toString(date))); ui->labelLunchMeal->setText(content); } diff --git a/plugins/profileplugin/profiledialog.cpp b/plugins/profileplugin/profiledialog.cpp index 92bddae..38538be 100644 --- a/plugins/profileplugin/profiledialog.cpp +++ b/plugins/profileplugin/profiledialog.cpp @@ -14,8 +14,8 @@ ProfileDialog::ProfileDialog(const GetUserInfoReply::UserInfo &userInfo, QWidget ui->lineEditUsername->setText(userInfo.username); ui->lineEditStreet->setText(userInfo.street); ui->lineEditCity->setText(userInfo.city); - ui->lineEditEmployedSince->setText(userInfo.employedSince.toString(tr("dd.MM.yyyy"))); - ui->lineEditEmployedTill->setText(userInfo.employedTill.toString(tr("dd.MM.yyyy"))); + ui->dateEditEmployedSince->setDate(userInfo.employedSince); + ui->dateEditEmployedTill->setDate(userInfo.employedTill); ui->lineEditPlaceOfBirth->setText(userInfo.placeOfBirth); ui->lineEditZipcode->setText(userInfo.zipcode); ui->lineEditReligion->setText(userInfo.religion); diff --git a/plugins/profileplugin/profiledialog.ui b/plugins/profileplugin/profiledialog.ui index 3ce9181..252749c 100644 --- a/plugins/profileplugin/profiledialog.ui +++ b/plugins/profileplugin/profiledialog.ui @@ -13,7 +13,7 @@ Profile - + @@ -25,7 +25,7 @@ 0 0 420 - 540 + 610 @@ -122,6 +122,9 @@ Street: + + lineEditStreet + @@ -129,6 +132,9 @@ City: + + lineEditCity + @@ -136,6 +142,9 @@ Employed since: + + dateEditEmployedSince + @@ -143,6 +152,9 @@ Employed till: + + dateEditEmployedTill + @@ -150,6 +162,9 @@ Place of birth: + + lineEditPlaceOfBirth + @@ -157,6 +172,9 @@ Zipcode: + + lineEditZipcode + @@ -164,6 +182,9 @@ Religion: + + lineEditReligion + @@ -171,6 +192,9 @@ Department: + + lineEditDepartment + @@ -178,6 +202,9 @@ Verwendgr: + + lineEditVerwendgr + @@ -185,6 +212,9 @@ Taetig: + + lineEditTaetig + @@ -192,6 +222,9 @@ Arbverh: + + lineEditArbverh + @@ -199,6 +232,9 @@ Betriebsnr: + + lineEditBetriebsnr + @@ -215,20 +251,6 @@ - - - - true - - - - - - - true - - - @@ -285,6 +307,20 @@ + + + + true + + + + + + + true + + + diff --git a/zeiterfassungguilib/stripswidget.cpp b/zeiterfassungguilib/stripswidget.cpp index f4c74df..e2e9ec6 100644 --- a/zeiterfassungguilib/stripswidget.cpp +++ b/zeiterfassungguilib/stripswidget.cpp @@ -1,6 +1,7 @@ #include "stripswidget.h" #include +#include #include #include #include @@ -12,9 +13,6 @@ #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), @@ -87,9 +85,7 @@ void StripsWidget::setDate(const QDate &date) Q_EMIT dateChanged(m_date = date); if(m_date.isValid()) - m_label[0]->setText(tr("%0 (%1)") - .arg(m_weekDays.at(m_date.dayOfWeek() - 1)) - .arg(m_date.toString(tr("dd.MM.yyyy")))); + m_label[0]->setText(QLocale().toString(m_date, QLocale::LongFormat)); else m_label[0]->setText(tr("Invalid")); @@ -313,7 +309,7 @@ bool StripsWidget::createStrips() if(lastBooking) { auto breakTime = timeBetween(lastBooking->time, startBooking.time); - auto label = new QLabel(tr("%0: %1").arg(tr("Break")).arg(tr("%0h").arg(breakTime.toString(tr("HH:mm")))), this); + auto label = new QLabel(tr("%0: %1").arg(tr("Break")).arg(tr("%0h").arg(QLocale().toString(breakTime, QLocale::ShortFormat))), this); m_stripsLayout->addWidget(label); } @@ -420,7 +416,7 @@ bool StripsWidget::createStrips() if(timeAssignmentsIter == m_timeAssignments.constEnd()) { errorMessage = tr("Missing time assignment! Missing: %0") - .arg(tr("%0h").arg(timeBetween(timeAssignmentTime, bookingTimespan).toString(tr("HH:mm:ss")))); + .arg(tr("%0h").arg(QLocale().toString(timeBetween(timeAssignmentTime, bookingTimespan), QLocale::ShortFormat))); appendBookingEndStrip(endBooking.id, endBooking.time, currBookingDuration); @@ -464,8 +460,8 @@ bool StripsWidget::createStrips() if(timeAssignmentTime > bookingTimespan) { errorMessage = tr("Time assignment time longer than booking time!\nTime assignment: %0\nBooking: %1") - .arg(timeAssignmentTime.toString(tr("HH:mm:ss"))) - .arg(bookingTimespan.toString(tr("HH:mm:ss"))); + .arg(QLocale().toString(timeAssignmentTime, QLocale::ShortFormat)) + .arg(QLocale().toString(bookingTimespan, QLocale::ShortFormat)); } appendBookingEndStrip(endBooking.id, endBooking.time, currBookingDuration); @@ -483,7 +479,7 @@ bool StripsWidget::createStrips() { auto label = new QLabel(tr("%0: %1") .arg(tr("Assigned time")) - .arg(tr("%0h").arg(timeAssignmentTime.toString(tr("HH:mm")))), this); + .arg(tr("%0h").arg(QLocale().toString(timeAssignmentTime, QLocale::ShortFormat))), this); m_stripsLayout->addWidget(label); } else @@ -532,7 +528,8 @@ 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"))); + m_label[1]->setText(QString("%0 - %1").arg(QLocale().toString(m_dayinfo.soll, QLocale::ShortFormat), + QLocale().toString(m_dayinfo.ist, QLocale::ShortFormat))); } void StripsWidget::getBookingsFinished() @@ -601,7 +598,7 @@ QWidget *StripsWidget::appendBookingStartStrip(int id, const QTime &time) auto widget = m_mainWindow.stripFactory().createBookingStartStrip(this).release(); if(auto labelTime = widget->findChild(QStringLiteral("labelTime"))) - labelTime->setProperty("text", time.toString(tr("HH:mm"))); + labelTime->setProperty("text", QLocale().toString(time, QLocale::ShortFormat)); else qWarning() << "no labelTime found!"; @@ -620,12 +617,12 @@ QWidget *StripsWidget::appendBookingEndStrip(int id, const QTime &time, const QT auto widget = m_mainWindow.stripFactory().createBookingEndStrip(this).release(); if(auto labelTime = widget->findChild(QStringLiteral("labelTime"))) - labelTime->setProperty("text", time.toString(tr("HH:mm"))); + labelTime->setProperty("text", QLocale().toString(time, QLocale::ShortFormat)); else qWarning() << "no labelTime found!"; if(auto labelDuration = widget->findChild(QStringLiteral("labelDuration"))) - labelDuration->setProperty("text", tr("%0h").arg(duration.toString(tr("HH:mm")))); + labelDuration->setProperty("text", tr("%0h").arg(QLocale().toString(duration, QLocale::ShortFormat))); else qWarning() << "no labelDuration found!"; @@ -644,7 +641,7 @@ QWidget *StripsWidget::appendTimeAssignmentStrip(int id, const QTime &duration, auto widget = m_mainWindow.stripFactory().createTimeAssignmentStrip(this).release(); if(auto labelTime = widget->findChild(QStringLiteral("labelTime"))) - labelTime->setProperty("text", duration == QTime(0, 0) ? tr("Open") : duration.toString(tr("HH:mm"))); + labelTime->setProperty("text", duration == QTime(0, 0) ? tr("Open") : QLocale().toString(duration, QLocale::ShortFormat)); else qWarning() << "no labelTime found!"; diff --git a/zeiterfassungguilib/stripswidget.h b/zeiterfassungguilib/stripswidget.h index ebeb961..f7c852f 100644 --- a/zeiterfassungguilib/stripswidget.h +++ b/zeiterfassungguilib/stripswidget.h @@ -117,6 +117,4 @@ private: std::unique_ptr m_getDayinfoReply; std::unique_ptr m_getBookingsReply; std::unique_ptr m_getTimeAssignmentsReply; - - static const QStringList m_weekDays; }; -- 2.50.1 From 8bea2703e4d5a5028ea456476de1928d6fc190e1 Mon Sep 17 00:00:00 2001 From: The Codacy Badger Date: Fri, 6 Jul 2018 10:16:43 +0000 Subject: [PATCH 39/39] Add Codacy badge --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 99578e4..4c7b677 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ # Zeiterfassung This tool helps me assigning my working hours to projects at work. +[![Codacy Badge](https://api.codacy.com/project/badge/Grade/57dffc1fba4345a9a638695d620f1489)](https://app.codacy.com/app/0xFEEDC0DE64/QtZeiterfassung?utm_source=github.com&utm_medium=referral&utm_content=0xFEEDC0DE64/QtZeiterfassung&utm_campaign=badger) [![Build Status](https://travis-ci.org/0xFEEDC0DE64/QtZeiterfassung.svg?branch=master)](https://travis-ci.org/0xFEEDC0DE64/QtZeiterfassung) ![Screenshot of the main window](https://raw.githubusercontent.com/0xFEEDC0DE64/QtZeiterfassung/master/screenshot.png) -- 2.50.1