From 25e81aa0bb208077cb1160257ebb3b3794c5aeef Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Wed, 20 Dec 2017 18:58:45 +0100 Subject: [PATCH 01/78] Fixed bookings being marked as modified #20 --- .../replies/createbookingreply.cpp | 44 ++----------------- zeiterfassunglib/replies/createbookingreply.h | 3 -- zeiterfassunglib/zeiterfassungapi.cpp | 5 ++- 3 files changed, 6 insertions(+), 46 deletions(-) diff --git a/zeiterfassunglib/replies/createbookingreply.cpp b/zeiterfassunglib/replies/createbookingreply.cpp index 07cd2c3..2083164 100644 --- a/zeiterfassunglib/replies/createbookingreply.cpp +++ b/zeiterfassunglib/replies/createbookingreply.cpp @@ -1,23 +1,12 @@ #include "createbookingreply.h" -#include -#include -#include -#include - CreateBookingReply::CreateBookingReply(std::unique_ptr &&reply, ZeiterfassungApi *zeiterfassung) : ZeiterfassungReply(zeiterfassung), - m_reply(std::move(reply)), - m_bookingId(-1) + m_reply(std::move(reply)) { connect(m_reply.get(), &QNetworkReply::finished, this, &CreateBookingReply::requestFinished); } -int CreateBookingReply::bookingId() const -{ - return m_bookingId; -} - void CreateBookingReply::requestFinished() { if(m_reply->error() != QNetworkReply::NoError) @@ -27,35 +16,8 @@ void CreateBookingReply::requestFinished() 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.isObject()) - { - setSuccess(false); - setMessage(tr("JSON document is not an object!")); - goto end; - } - - auto obj = document.object(); - - if(!obj.contains(QStringLiteral("bookingNr"))) - { - setSuccess(false); - setMessage(tr("JSON does not contain bookingNr!")); - goto end; - } - - setSuccess(true); - m_bookingId = obj.value(QStringLiteral("bookingNr")).toInt(); - } + // empty response so nothing to check + setSuccess(true); end: m_reply = Q_NULLPTR; diff --git a/zeiterfassunglib/replies/createbookingreply.h b/zeiterfassunglib/replies/createbookingreply.h index 7111181..90bf397 100644 --- a/zeiterfassunglib/replies/createbookingreply.h +++ b/zeiterfassunglib/replies/createbookingreply.h @@ -15,14 +15,11 @@ class ZEITERFASSUNGLIBSHARED_EXPORT CreateBookingReply : public ZeiterfassungRep public: CreateBookingReply(std::unique_ptr &&reply, ZeiterfassungApi *zeiterfassung); - int bookingId() const; - private Q_SLOTS: void requestFinished(); private: std::unique_ptr m_reply; - int m_bookingId; }; #endif // CREATEBOOKINGREPLY_H diff --git a/zeiterfassunglib/zeiterfassungapi.cpp b/zeiterfassunglib/zeiterfassungapi.cpp index ffdfa24..0b4298e 100644 --- a/zeiterfassunglib/zeiterfassungapi.cpp +++ b/zeiterfassunglib/zeiterfassungapi.cpp @@ -98,9 +98,9 @@ std::unique_ptr ZeiterfassungApi::doGetBookings(int userId, co std::unique_ptr ZeiterfassungApi::doCreateBooking(int userId, const QDate &date, const QTime &time, const QTime ×pan, const QString &type, const QString &text) { - QNetworkRequest request(QUrl(m_url % "json/booking")); + QNetworkRequest request(QUrl(m_url % "json/terminalPageController/evoTerminalBooking")); request.setHeader(QNetworkRequest::ContentTypeHeader, QByteArrayLiteral("application/json")); - request.setRawHeader(QByteArrayLiteral("sisAppName"), QByteArrayLiteral("bookingCalendar")); + request.setRawHeader(QByteArrayLiteral("sisAppName"), QByteArrayLiteral("terminal")); QJsonObject obj; obj[QStringLiteral("persNr")] = userId; @@ -111,6 +111,7 @@ std::unique_ptr ZeiterfassungApi::doCreateBooking(int userId obj[QStringLiteral("hourCategory")] = QStringLiteral(""); obj[QStringLiteral("empfEinh")] = QStringLiteral(""); obj[QStringLiteral("bewEinh")] = QStringLiteral(""); + obj[QStringLiteral("einstuf")] = QStringLiteral(""); obj[QStringLiteral("text")] = text; auto reply = std::unique_ptr(m_manager->post(request, QJsonDocument(obj).toJson())); -- 2.50.1 From 4e48d3c2f26b5f4ee851060bad3422afc750df40 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Wed, 20 Dec 2017 19:28:18 +0100 Subject: [PATCH 02/78] Added second request for user data to get more data #19 --- zeiterfassunglib/replies/getuserinforeply.cpp | 128 +++++++++++++++--- zeiterfassunglib/replies/getuserinforeply.h | 21 ++- zeiterfassunglib/zeiterfassungapi.cpp | 62 +++------ 3 files changed, 146 insertions(+), 65 deletions(-) diff --git a/zeiterfassunglib/replies/getuserinforeply.cpp b/zeiterfassunglib/replies/getuserinforeply.cpp index 73d751b..60caed0 100644 --- a/zeiterfassunglib/replies/getuserinforeply.cpp +++ b/zeiterfassunglib/replies/getuserinforeply.cpp @@ -4,14 +4,21 @@ #include #include #include +#include #include "zeiterfassungapi.h" -GetUserInfoReply::GetUserInfoReply(std::unique_ptr &&reply, ZeiterfassungApi *zeiterfassung) : +GetUserInfoReply::GetUserInfoReply(std::unique_ptr &&reply0, std::unique_ptr &&reply1, + ZeiterfassungApi *zeiterfassung) : ZeiterfassungReply(zeiterfassung), - m_reply(std::move(reply)) + m_reply0(std::move(reply0)), + m_reply1(std::move(reply1)) { - connect(m_reply.get(), &QNetworkReply::finished, this, &GetUserInfoReply::requestFinished); + Q_ASSERT(m_reply0 != Q_NULLPTR); + Q_ASSERT(m_reply1 != Q_NULLPTR); + + connect(m_reply0.get(), &QNetworkReply::finished, this, &GetUserInfoReply::request0Finished); + connect(m_reply1.get(), &QNetworkReply::finished, this, &GetUserInfoReply::request1Finished); } const GetUserInfoReply::UserInfo &GetUserInfoReply::userInfo() const @@ -19,29 +26,32 @@ const GetUserInfoReply::UserInfo &GetUserInfoReply::userInfo() const return m_userInfo; } -void GetUserInfoReply::requestFinished() +void GetUserInfoReply::request0Finished() { - if(m_reply->error() != QNetworkReply::NoError) + if(m_reply0->error() != QNetworkReply::NoError) { setSuccess(false); - setMessage(tr("Request error occured: %0").arg(m_reply->error())); + setMessage(tr("Request 0 error occured: %0").arg(m_reply0->error())); + m_reply1 = Q_NULLPTR; goto end; } { QJsonParseError error; - auto document = QJsonDocument::fromJson(m_reply->readAll(), &error); + auto document = QJsonDocument::fromJson(m_reply0->readAll(), &error); if(error.error != QJsonParseError::NoError) { setSuccess(false); - setMessage(tr("Parsing JSON failed: %0").arg(error.errorString())); + setMessage(tr("Parsing JSON 0 failed: %0").arg(error.errorString())); + m_reply1 = Q_NULLPTR; goto end; } if(!document.isObject()) { setSuccess(false); - setMessage(tr("JSON document is not an object!")); + setMessage(tr("JSON document 0 is not an object!")); + m_reply1 = Q_NULLPTR; goto end; } @@ -50,7 +60,8 @@ void GetUserInfoReply::requestFinished() if(!rootObj.contains(QStringLiteral("evoAppsUser"))) { setSuccess(false); - setMessage(tr("JSON does not contain evoAppsUser!")); + setMessage(tr("JSON 0 does not contain evoAppsUser!")); + m_reply1 = Q_NULLPTR; goto end; } @@ -60,23 +71,100 @@ void GetUserInfoReply::requestFinished() { setSuccess(false); setMessage(tr("evoAppsUser is not an object!")); + m_reply1 = Q_NULLPTR; goto end; } auto evoAppsUserObj = evoAppsUser.toObject(); - setSuccess(true); - m_userInfo = { - evoAppsUserObj.value(QStringLiteral("persNr")).toInt(), - evoAppsUserObj.value(QStringLiteral("email")).toString(), - evoAppsUserObj.value(QStringLiteral("longUsername")).toString(), - evoAppsUserObj.value(QStringLiteral("text")).toString(), - evoAppsUserObj.value(QStringLiteral("username")).toString() - }; + if(!m_reply1) + setSuccess(true); + + m_userInfo.userId = evoAppsUserObj.value(QStringLiteral("persNr")).toInt(); + m_userInfo.email = evoAppsUserObj.value(QStringLiteral("email")).toString(); + m_userInfo.longUsername = evoAppsUserObj.value(QStringLiteral("longUsername")).toString(); + m_userInfo.text = evoAppsUserObj.value(QStringLiteral("text")).toString(); + m_userInfo.username = evoAppsUserObj.value(QStringLiteral("username")).toString(); } end: - m_reply = Q_NULLPTR; + m_reply0 = Q_NULLPTR; - Q_EMIT finished(); + if(!m_reply1) + Q_EMIT finished(); +} + +void GetUserInfoReply::request1Finished() +{ + if(m_reply1->error() != QNetworkReply::NoError) + { + setSuccess(false); + setMessage(tr("Request 1 error occured: %0").arg(m_reply0->error())); + m_reply0 = Q_NULLPTR; + goto end; + } + + { + QJsonParseError error; + auto document = QJsonDocument::fromJson(m_reply1->readAll(), &error); + if(error.error != QJsonParseError::NoError) + { + setSuccess(false); + setMessage(tr("Parsing JSON 1 failed: %0").arg(error.errorString())); + m_reply0 = Q_NULLPTR; + goto end; + } + + if(!document.isArray()) + { + setSuccess(false); + setMessage(tr("JSON document 1 is not an array!")); + m_reply0 = Q_NULLPTR; + goto end; + } + + auto arr = document.array(); + + if(arr.isEmpty()) + { + setSuccess(false); + setMessage(tr("JSON array 1 is empty!")); + m_reply0 = Q_NULLPTR; + goto end; + } + + auto first = arr.first(); + + if(!first.isObject()) + { + setSuccess(false); + setMessage(tr("JSON array value is not an object!")); + m_reply0 = Q_NULLPTR; + goto end; + } + + auto obj = first.toObject(); + + if(!m_reply0) + setSuccess(true); + + m_userInfo.gemeinde = obj.value(QStringLiteral("gemeinde")).toString(); + m_userInfo.ort = obj.value(QStringLiteral("ort")).toString(); + m_userInfo.angFrom = QDate::fromString(QString::number(obj.value(QStringLiteral("angFrom")).toInt()), QStringLiteral("yyyyMMdd")); + m_userInfo.angTill = QDate::fromString(QString::number(obj.value(QStringLiteral("angTill")).toInt()), QStringLiteral("yyyyMMdd")); + m_userInfo.gebOrt = obj.value(QStringLiteral("gebOrt")).toString(); + m_userInfo.plz = obj.value(QStringLiteral("plz")).toString(); + m_userInfo.religion = obj.value(QStringLiteral("religion")).toString(); + m_userInfo.bereich = obj.value(QStringLiteral("bereich")).toString(); + m_userInfo.verwendgr = obj.value(QStringLiteral("verwendgr")).toString(); + m_userInfo.taetig = obj.value(QStringLiteral("taetig")).toString(); + m_userInfo.arbverh = obj.value(QStringLiteral("arbverh")).toString(); + m_userInfo.betriebsnr = obj.value(QStringLiteral("betriebsnr")).toString(); + } + + end: + m_reply1 = Q_NULLPTR; + + if(!m_reply0) + Q_EMIT finished(); } diff --git a/zeiterfassunglib/replies/getuserinforeply.h b/zeiterfassunglib/replies/getuserinforeply.h index 30e2579..4a4bb76 100644 --- a/zeiterfassunglib/replies/getuserinforeply.h +++ b/zeiterfassunglib/replies/getuserinforeply.h @@ -15,7 +15,8 @@ class ZEITERFASSUNGLIBSHARED_EXPORT GetUserInfoReply : public ZeiterfassungReply Q_OBJECT public: - GetUserInfoReply(std::unique_ptr &&reply, ZeiterfassungApi *zeiterfassung); + GetUserInfoReply(std::unique_ptr &&reply0, std::unique_ptr &&reply1, + ZeiterfassungApi *zeiterfassung); struct UserInfo { @@ -24,15 +25,29 @@ public: QString longUsername; QString text; QString username; + QString gemeinde; + QString ort; + QDate angFrom; + QDate angTill; + QString gebOrt; + QString plz; + QString religion; + QString bereich; + QString verwendgr; + QString taetig; + QString arbverh; + QString betriebsnr; }; const UserInfo &userInfo() const; private Q_SLOTS: - void requestFinished(); + void request0Finished(); + void request1Finished(); private: - std::unique_ptr m_reply; + std::unique_ptr m_reply0; + std::unique_ptr m_reply1; UserInfo m_userInfo; }; diff --git a/zeiterfassunglib/zeiterfassungapi.cpp b/zeiterfassunglib/zeiterfassungapi.cpp index 0b4298e..b6dd10a 100644 --- a/zeiterfassunglib/zeiterfassungapi.cpp +++ b/zeiterfassunglib/zeiterfassungapi.cpp @@ -53,9 +53,7 @@ std::unique_ptr ZeiterfassungApi::doLoginPage() { QNetworkRequest request(QUrl(m_url % "pages/login.jsp")); - auto reply = std::unique_ptr(m_manager->get(request)); - - return std::make_unique(std::move(reply), this); + return std::make_unique(std::unique_ptr(m_manager->get(request)), this); } std::unique_ptr ZeiterfassungApi::doLogin(const QString &username, const QString &password) @@ -66,19 +64,19 @@ std::unique_ptr ZeiterfassungApi::doLogin(const QString &username, c auto data = QStringLiteral("j_username=%0&j_password=%1&login=Anmelden").arg(username).arg(password).toUtf8(); - auto reply = std::unique_ptr(m_manager->post(request, data)); - - return std::make_unique(std::move(reply), this); + return std::make_unique(std::unique_ptr(m_manager->post(request, data)), this); } std::unique_ptr ZeiterfassungApi::doUserInfo() { - QNetworkRequest request(QUrl(m_url % "json/evoAppsUserInfoDialogController/load-EvoAppsUserInfoTO")); - request.setRawHeader(QByteArrayLiteral("sisAppName"), QByteArrayLiteral("home")); + QNetworkRequest request0(QUrl(m_url % "json/evoAppsUserInfoDialogController/load-EvoAppsUserInfoTO")); + request0.setRawHeader(QByteArrayLiteral("sisAppName"), QByteArrayLiteral("home")); - auto reply = std::unique_ptr(m_manager->get(request)); + QNetworkRequest request1(QUrl(m_url % "json/persons")); + request1.setRawHeader(QByteArrayLiteral("sisAppName"), QByteArrayLiteral("bookingCalendar")); - return std::make_unique(std::move(reply), this); + return std::make_unique(std::unique_ptr(m_manager->get(request0)), + std::unique_ptr(m_manager->get(request1)), this); } std::unique_ptr ZeiterfassungApi::doGetBookings(int userId, const QDate &start, const QDate &end) @@ -90,9 +88,7 @@ std::unique_ptr ZeiterfassungApi::doGetBookings(int userId, co .arg(userId))); request.setRawHeader(QByteArrayLiteral("sisAppName"), QByteArrayLiteral("bookingCalendar")); - auto reply = std::unique_ptr(m_manager->get(request)); - - return std::make_unique(std::move(reply), this); + return std::make_unique(std::unique_ptr(m_manager->get(request)), this); } std::unique_ptr ZeiterfassungApi::doCreateBooking(int userId, const QDate &date, const QTime &time, const QTime ×pan, @@ -114,9 +110,9 @@ std::unique_ptr ZeiterfassungApi::doCreateBooking(int userId obj[QStringLiteral("einstuf")] = QStringLiteral(""); obj[QStringLiteral("text")] = text; - auto reply = std::unique_ptr(m_manager->post(request, QJsonDocument(obj).toJson())); + auto data = QJsonDocument(obj).toJson(); - return std::make_unique(std::move(reply), this); + return std::make_unique(std::unique_ptr(m_manager->post(request, data)), this); } std::unique_ptr ZeiterfassungApi::doUpdateBooking(int bookingId, int userId, const QDate &date, const QTime &time, @@ -140,9 +136,7 @@ std::unique_ptr ZeiterfassungApi::doUpdateBooking(int bookin auto data = QJsonDocument(obj).toJson(); - auto reply = std::unique_ptr(m_manager->put(request, data)); - - return std::make_unique(std::move(reply), this); + return std::make_unique(std::unique_ptr(m_manager->put(request, data)), this); } std::unique_ptr ZeiterfassungApi::doDeleteBooking(int bookingId) @@ -152,9 +146,7 @@ std::unique_ptr ZeiterfassungApi::doDeleteBooking(int bookin .arg(bookingId))); request.setRawHeader(QByteArrayLiteral("sisAppName"), QByteArrayLiteral("bookingCalendar")); - auto reply = std::unique_ptr(m_manager->deleteResource(request)); - - return std::make_unique(std::move(reply), this); + return std::make_unique(std::unique_ptr(m_manager->deleteResource(request)), this); } std::unique_ptr ZeiterfassungApi::doGetTimeAssignments(int userId, const QDate &start, const QDate &end) @@ -166,9 +158,7 @@ std::unique_ptr ZeiterfassungApi::doGetTimeAssignments( .arg(userId))); request.setRawHeader(QByteArrayLiteral("sisAppName"), QByteArrayLiteral("bookingCalendar")); - auto reply = std::unique_ptr(m_manager->get(request)); - - return std::make_unique(std::move(reply), this); + return std::make_unique(std::unique_ptr(m_manager->get(request)), this); } std::unique_ptr ZeiterfassungApi::doCreateTimeAssignment(int userId, const QDate &date, const QTime &time, @@ -209,9 +199,7 @@ std::unique_ptr ZeiterfassungApi::doCreateTimeAssignm auto data = QJsonDocument(obj).toJson(); - auto reply = std::unique_ptr(m_manager->post(request, data)); - - return std::make_unique(std::move(reply), this); + return std::make_unique(std::unique_ptr(m_manager->post(request, data)), this); } std::unique_ptr ZeiterfassungApi::doUpdateTimeAssignment(int timeAssignmentId, int userId, const QDate &date, @@ -257,9 +245,7 @@ std::unique_ptr ZeiterfassungApi::doUpdateTimeAssignm auto data = QJsonDocument(obj).toJson(); - auto reply = std::unique_ptr(m_manager->put(request, data)); - - return std::make_unique(std::move(reply), this); + return std::make_unique(std::unique_ptr(m_manager->put(request, data)), this); } std::unique_ptr ZeiterfassungApi::doDeleteTimeAssignment(int timeAssignmentId) @@ -269,9 +255,7 @@ std::unique_ptr ZeiterfassungApi::doDeleteTimeAssignm .arg(timeAssignmentId))); request.setRawHeader(QByteArrayLiteral("sisAppName"), QByteArrayLiteral("bookingCalendar")); - auto reply = std::unique_ptr(m_manager->deleteResource(request)); - - return std::make_unique(std::move(reply), this); + return std::make_unique(std::unique_ptr(m_manager->deleteResource(request)), this); } std::unique_ptr ZeiterfassungApi::doGetProjects(int userId, const QDate &date) @@ -282,9 +266,7 @@ std::unique_ptr ZeiterfassungApi::doGetProjects(int userId, co .arg(date.toString(QStringLiteral("yyyyMMdd"))))); request.setRawHeader(QByteArrayLiteral("sisAppName"), QByteArrayLiteral("bookingCalendar")); - auto reply = std::unique_ptr(m_manager->get(request)); - - return std::make_unique(std::move(reply), this); + return std::make_unique(std::unique_ptr(m_manager->get(request)), this); } std::unique_ptr ZeiterfassungApi::doGetReport(int userId, const QDate &date) @@ -295,9 +277,7 @@ std::unique_ptr ZeiterfassungApi::doGetReport(int userId, const .arg(date.toString(QStringLiteral("yyyyMMdd"))))); request.setRawHeader(QByteArrayLiteral("sisAppName"), QByteArrayLiteral("bookingCalendar")); - auto reply = std::unique_ptr(m_manager->get(request)); - - return std::make_unique(std::move(reply), this); + return std::make_unique(std::unique_ptr(m_manager->get(request)), this); } std::unique_ptr ZeiterfassungApi::doGetPresenceStatus() @@ -305,7 +285,5 @@ std::unique_ptr ZeiterfassungApi::doGetPresenceStatus() QNetworkRequest request(QUrl(m_url % "json/presencestatus")); request.setRawHeader(QByteArrayLiteral("sisAppName"), QByteArrayLiteral("presenceStatus")); - auto reply = std::unique_ptr(m_manager->get(request)); - - return std::make_unique(std::move(reply), this); + return std::make_unique(std::unique_ptr(m_manager->get(request)), this); } -- 2.50.1 From 32be8551c1bade6b5a773c1bfdfceed1bdd633b8 Mon Sep 17 00:00:00 2001 From: Daniel Brunner <0xFEEDC0DE64@gmail.com> Date: Wed, 20 Dec 2017 20:29:33 +0100 Subject: [PATCH 03/78] Moved splashscreen into app resources --- .../advancedviewplugin/advancedviewdialog.cpp | 4 ++-- .../images/splash.png | Bin zeiterfassung/main.cpp | 2 +- zeiterfassung/zeiterfassung.pro | 2 +- zeiterfassung/zeiterfassung_resources.qrc | 5 ++++ .../dialogs/authenticationdialog.ui | 2 +- zeiterfassunglib/mainwindow.ui | 22 +++++++++--------- zeiterfassunglib/zeiterfassunglib.pro | 2 +- ...ces.qrc => zeiterfassunglib_resources.qrc} | 3 +-- 9 files changed, 23 insertions(+), 19 deletions(-) rename {zeiterfassunglib => zeiterfassung}/images/splash.png (100%) create mode 100644 zeiterfassung/zeiterfassung_resources.qrc rename zeiterfassunglib/{resources.qrc => zeiterfassunglib_resources.qrc} (85%) diff --git a/plugins/advancedviewplugin/advancedviewdialog.cpp b/plugins/advancedviewplugin/advancedviewdialog.cpp index cc3680f..95e7079 100644 --- a/plugins/advancedviewplugin/advancedviewdialog.cpp +++ b/plugins/advancedviewplugin/advancedviewdialog.cpp @@ -54,7 +54,7 @@ void AdvancedViewDialog::contextMenuBooking(const QPoint &pos) { QMenu menu; auto createAction = menu.addAction(tr("Create booking")); - auto refreshAction = menu.addAction(QIcon(QPixmap(QStringLiteral(":/zeiterfassunglib/images/refresh.png"))), tr("Refresh bookings")); + auto refreshAction = menu.addAction(QIcon(QPixmap(QStringLiteral(":/zeiterfassung/zeiterfassunglib/images/refresh.png"))), tr("Refresh bookings")); auto selectedAction = menu.exec(ui->bookingsView->viewport()->mapToGlobal(pos)); if(selectedAction == createAction) { @@ -160,7 +160,7 @@ void AdvancedViewDialog::contextMenuTimeAssignment(const QPoint &pos) { QMenu menu; auto createAction = menu.addAction(tr("Create time assignment")); - auto refreshAction = menu.addAction(QIcon(QPixmap(QStringLiteral(":/zeiterfassunglib/images/refresh.png"))), tr("Refresh time assignments")); + auto refreshAction = menu.addAction(QIcon(QPixmap(QStringLiteral(":/zeiterfassung/zeiterfassunglib/images/refresh.png"))), tr("Refresh time assignments")); auto selectedAction = menu.exec(ui->timeAssignmentsView->viewport()->mapToGlobal(pos)); if(selectedAction == createAction) { diff --git a/zeiterfassunglib/images/splash.png b/zeiterfassung/images/splash.png similarity index 100% rename from zeiterfassunglib/images/splash.png rename to zeiterfassung/images/splash.png diff --git a/zeiterfassung/main.cpp b/zeiterfassung/main.cpp index 42c2855..c506f17 100755 --- a/zeiterfassung/main.cpp +++ b/zeiterfassung/main.cpp @@ -333,7 +333,7 @@ int main(int argc, char *argv[]) QCoreApplication::setApplicationName(QStringLiteral("zeiterfassung")); QCoreApplication::setApplicationVersion(QStringLiteral("1.5")); - QSplashScreen splashScreen(QPixmap(QStringLiteral(":/zeiterfassunglib/images/splash.png"))); + QSplashScreen splashScreen(QPixmap(QStringLiteral(":/zeiterfassung/images/splash.png"))); splashScreen.showMessage(QCoreApplication::translate("main", "Loading settings...")); splashScreen.show(); diff --git a/zeiterfassung/zeiterfassung.pro b/zeiterfassung/zeiterfassung.pro index 23b76b5..c4d583b 100755 --- a/zeiterfassung/zeiterfassung.pro +++ b/zeiterfassung/zeiterfassung.pro @@ -25,7 +25,7 @@ FORMS += strips/bookingstartstrip.ui \ strips/bookingendstrip.ui \ strips/timeassignmentstrip.ui -RESOURCES += +RESOURCES += zeiterfassung_resources.qrc TRANSLATIONS += translations/zeiterfassung_en.ts \ translations/zeiterfassung_de.ts diff --git a/zeiterfassung/zeiterfassung_resources.qrc b/zeiterfassung/zeiterfassung_resources.qrc new file mode 100644 index 0000000..e5e1897 --- /dev/null +++ b/zeiterfassung/zeiterfassung_resources.qrc @@ -0,0 +1,5 @@ + + + images/splash.png + + diff --git a/zeiterfassunglib/dialogs/authenticationdialog.ui b/zeiterfassunglib/dialogs/authenticationdialog.ui index cbb43c6..e25c84a 100644 --- a/zeiterfassunglib/dialogs/authenticationdialog.ui +++ b/zeiterfassunglib/dialogs/authenticationdialog.ui @@ -37,7 +37,7 @@ - :/zeiterfassunglib/images/authentication.png + :/zeiterfassung/zeiterfassunglib/images/authentication.png true diff --git a/zeiterfassunglib/mainwindow.ui b/zeiterfassunglib/mainwindow.ui index ebc7280..f6d5d36 100644 --- a/zeiterfassunglib/mainwindow.ui +++ b/zeiterfassunglib/mainwindow.ui @@ -12,7 +12,7 @@ - :/zeiterfassunglib/images/icon.png:/zeiterfassunglib/images/icon.png + :/zeiterfassung/zeiterfassunglib/images/icon.png:/zeiterfassung/zeiterfassunglib/images/icon.png @@ -31,7 +31,7 @@ - :/zeiterfassunglib/images/previous.png:/zeiterfassunglib/images/previous.png + :/zeiterfassung/zeiterfassunglib/images/previous.png:/zeiterfassung/zeiterfassunglib/images/previous.png @@ -45,7 +45,7 @@ - :/zeiterfassunglib/images/next.png:/zeiterfassunglib/images/next.png + :/zeiterfassung/zeiterfassunglib/images/next.png:/zeiterfassung/zeiterfassunglib/images/next.png @@ -75,7 +75,7 @@ - :/zeiterfassunglib/images/now.png:/zeiterfassunglib/images/now.png + :/zeiterfassung/zeiterfassunglib/images/now.png:/zeiterfassung/zeiterfassunglib/images/now.png @@ -249,7 +249,7 @@ - :/zeiterfassunglib/images/quit.png:/zeiterfassunglib/images/quit.png + :/zeiterfassung/zeiterfassunglib/images/quit.png:/zeiterfassung/zeiterfassunglib/images/quit.png &Quit @@ -258,7 +258,7 @@ - :/zeiterfassunglib/images/user.png:/zeiterfassunglib/images/user.png + :/zeiterfassung/zeiterfassunglib/images/user.png:/zeiterfassung/zeiterfassunglib/images/user.png About &Me @@ -267,7 +267,7 @@ - :/zeiterfassunglib/images/about.png:/zeiterfassunglib/images/about.png + :/zeiterfassung/zeiterfassunglib/images/about.png:/zeiterfassung/zeiterfassunglib/images/about.png About &zeiterfassung @@ -281,7 +281,7 @@ - :/zeiterfassunglib/images/today.png:/zeiterfassunglib/images/today.png + :/zeiterfassung/zeiterfassunglib/images/today.png:/zeiterfassung/zeiterfassunglib/images/today.png &Today @@ -290,7 +290,7 @@ - :/zeiterfassunglib/images/refresh.png:/zeiterfassunglib/images/refresh.png + :/zeiterfassung/zeiterfassunglib/images/refresh.png:/zeiterfassung/zeiterfassunglib/images/refresh.png &Refresh everything @@ -299,7 +299,7 @@ - :/zeiterfassunglib/images/settings.png:/zeiterfassunglib/images/settings.png + :/zeiterfassung/zeiterfassunglib/images/settings.png:/zeiterfassung/zeiterfassunglib/images/settings.png &Settings @@ -308,7 +308,7 @@ - :/zeiterfassunglib/images/help.png:/zeiterfassunglib/images/help.png + :/zeiterfassung/zeiterfassunglib/images/help.png:/zeiterfassung/zeiterfassunglib/images/help.png Help diff --git a/zeiterfassunglib/zeiterfassunglib.pro b/zeiterfassunglib/zeiterfassunglib.pro index e58e448..f69b9d0 100644 --- a/zeiterfassunglib/zeiterfassunglib.pro +++ b/zeiterfassunglib/zeiterfassunglib.pro @@ -72,7 +72,7 @@ FORMS += mainwindow.ui \ dialogs/authenticationdialog.ui \ dialogs/aboutmedialog.ui -RESOURCES += resources.qrc +RESOURCES += zeiterfassunglib_resources.qrc TRANSLATIONS += translations/zeiterfassunglib_en.ts \ translations/zeiterfassunglib_de.ts diff --git a/zeiterfassunglib/resources.qrc b/zeiterfassunglib/zeiterfassunglib_resources.qrc similarity index 85% rename from zeiterfassunglib/resources.qrc rename to zeiterfassunglib/zeiterfassunglib_resources.qrc index 252e452..8e0562e 100644 --- a/zeiterfassunglib/resources.qrc +++ b/zeiterfassunglib/zeiterfassunglib_resources.qrc @@ -1,5 +1,5 @@ - + images/about.png images/authentication.png images/help.png @@ -10,7 +10,6 @@ images/quit.png images/refresh.png images/settings.png - images/splash.png images/today.png images/user.png -- 2.50.1 From 4ec479f8623cd76600f4c8be4e95468326fac9c9 Mon Sep 17 00:00:00 2001 From: Daniel Brunner <0xFEEDC0DE64@gmail.com> Date: Wed, 20 Dec 2017 21:06:16 +0100 Subject: [PATCH 04/78] Updated splash screen #1 --- zeiterfassung/images/splash.png | Bin 26172 -> 43566 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/zeiterfassung/images/splash.png b/zeiterfassung/images/splash.png index cc66e5f64cfa889cd4b30df28ae21fe6a42f9c68..a56288e9f3d5769f870a0e402ae93e5c015c05e4 100644 GIT binary patch literal 43566 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

@xA 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 DQSJ8V literal 26172 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 r_%@Hp5R0F{(!3 Date: Wed, 20 Dec 2017 21:12:40 +0100 Subject: [PATCH 05/78] Removed useless checks for timeAssignment.time #16 --- zeiterfassunglib/stripswidget.cpp | 24 ------------------------ 1 file changed, 24 deletions(-) diff --git a/zeiterfassunglib/stripswidget.cpp b/zeiterfassunglib/stripswidget.cpp index 34f41a8..1984ef5 100644 --- a/zeiterfassunglib/stripswidget.cpp +++ b/zeiterfassunglib/stripswidget.cpp @@ -270,14 +270,6 @@ bool StripsWidget::createStrips() } auto timeAssignment = *timeAssignmentsIter++; - if(timeAssignment.time != timeAssignmentTime) - { - errorMessage = tr("Expected %0 but received %1 in time assignment.\nTime assignment ID: %2") - .arg(timeAssignmentTime.toString(tr("HH:mm:ss"))) - .arg(timeAssignment.time.toString(tr("HH:mm:ss"))) - .arg(timeAssignment.id); - goto after; - } appendTimeAssignmentStrip(timeAssignment.id, timeAssignment.timespan, buildProjectString(timeAssignment.project), timeAssignment.subproject, timeAssignment.workpackage, timeAssignment.text); @@ -321,14 +313,6 @@ bool StripsWidget::createStrips() } timeAssignment = *timeAssignmentsIter++; - if(timeAssignment.time != timeAssignmentTime) - { - errorMessage = tr("Expected %0 but received %1 in time assignment.\nTime assignment ID: %2") - .arg(timeAssignmentTime.toString(tr("HH:mm:ss"))) - .arg(timeAssignment.time.toString(tr("HH:mm:ss"))) - .arg(timeAssignment.id); - goto after; - } appendTimeAssignmentStrip(timeAssignment.id, timeAssignment.timespan, buildProjectString(timeAssignment.project), timeAssignment.subproject, timeAssignment.workpackage, timeAssignment.text); @@ -384,14 +368,6 @@ bool StripsWidget::createStrips() } timeAssignment = *timeAssignmentsIter++; - if(timeAssignment.time != timeAssignmentTime) - { - errorMessage = tr("Expected %0 but received %1 in time assignment.\nTime assignment ID: %2") - .arg(timeAssignmentTime.toString(tr("HH:mm:ss"))) - .arg(timeAssignment.time.toString(tr("HH:mm:ss"))) - .arg(timeAssignment.id); - goto after; - } appendTimeAssignmentStrip(timeAssignment.id, timeAssignment.timespan, buildProjectString(timeAssignment.project), timeAssignment.subproject, timeAssignment.workpackage, timeAssignment.text); -- 2.50.1 From 7fda5e28d304ef41f7cf18165f655b1d93813ca7 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Wed, 20 Dec 2017 21:15:17 +0100 Subject: [PATCH 06/78] Fixed small pixel errors in splash screen --- zeiterfassung/images/splash.png | Bin 43566 -> 43571 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/zeiterfassung/images/splash.png b/zeiterfassung/images/splash.png index a56288e9f3d5769f870a0e402ae93e5c015c05e4..7140cd2a5c6eebebc5cace9321e55415a4bc8955 100644 GIT binary patch delta 41838 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 delta 41840 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 -- 2.50.1 From 3f1b45228084fa45fd8a5edbc19bc6b9cce739bf Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Wed, 20 Dec 2017 21:25:33 +0100 Subject: [PATCH 07/78] Replaced ifdef include guards with #pragma once --- plugins/advancedviewplugin/advancedviewdialog.h | 5 +---- plugins/advancedviewplugin/advancedviewplugin.h | 5 +---- plugins/advancedviewplugin/advancedviewwidget.h | 5 +---- plugins/advancedviewplugin/dialogs/bookingdialog.h | 5 +---- .../advancedviewplugin/dialogs/timeassignmentdialog.h | 5 +---- plugins/advancedviewplugin/models/bookingsmodel.h | 5 +---- .../advancedviewplugin/models/timeassignmentsmodel.h | 5 +---- plugins/lunchmealplugin/lunchmealdialog.h | 5 +---- plugins/lunchmealplugin/lunchmealplugin.h | 5 +---- plugins/lunchmealplugin/lunchmealwidget.h | 5 +---- plugins/presenceplugin/presenceplugin.h | 5 +---- plugins/presenceplugin/presencewidget.h | 5 +---- plugins/reportsplugin/reportsplugin.h | 5 +---- plugins/reportsplugin/reportswidget.h | 5 +---- plugins/updaterplugin/updaterdialog.h | 5 +---- plugins/updaterplugin/updaterplugin.h | 5 +---- plugins/weatherplugin/weatherplugin.h | 5 +---- plugins/weatherplugin/weatherwidget.h | 5 +---- zeiterfassunglib/cpp14polyfills.h | 10 +--------- zeiterfassunglib/dialogs/aboutmedialog.h | 5 +---- zeiterfassunglib/dialogs/authenticationdialog.h | 5 +---- zeiterfassunglib/dialogs/languageselectiondialog.h | 5 +---- zeiterfassunglib/dialogs/settingsdialog.h | 5 +---- zeiterfassunglib/mainwindow.h | 5 +---- zeiterfassunglib/replies/createbookingreply.h | 5 +---- zeiterfassunglib/replies/createtimeassignmentreply.h | 5 +---- zeiterfassunglib/replies/deletebookingreply.h | 5 +---- zeiterfassunglib/replies/deletetimeassignmentreply.h | 5 +---- zeiterfassunglib/replies/getbookingsreply.h | 5 +---- zeiterfassunglib/replies/getpresencestatusreply.h | 5 +---- zeiterfassunglib/replies/getprojectsreply.h | 5 +---- zeiterfassunglib/replies/getreportreply.h | 5 +---- zeiterfassunglib/replies/gettimeassignmentsreply.h | 5 +---- zeiterfassunglib/replies/getuserinforeply.h | 5 +---- zeiterfassunglib/replies/loginpagereply.h | 5 +---- zeiterfassunglib/replies/loginreply.h | 5 +---- zeiterfassunglib/replies/updatebookingreply.h | 5 +---- zeiterfassunglib/replies/updatetimeassignmentreply.h | 5 +---- zeiterfassunglib/replies/zeiterfassungreply.h | 5 +---- zeiterfassunglib/stripfactory.h | 5 +---- zeiterfassunglib/stripswidget.h | 5 +---- zeiterfassunglib/timeutils.h | 5 +---- zeiterfassunglib/zeiterfassungapi.h | 5 +---- zeiterfassunglib/zeiterfassunglib_global.h | 5 +---- zeiterfassunglib/zeiterfassungplugin.h | 5 +---- zeiterfassunglib/zeiterfassungsettings.h | 5 +---- 46 files changed, 46 insertions(+), 189 deletions(-) diff --git a/plugins/advancedviewplugin/advancedviewdialog.h b/plugins/advancedviewplugin/advancedviewdialog.h index b35068b..da5fd89 100644 --- a/plugins/advancedviewplugin/advancedviewdialog.h +++ b/plugins/advancedviewplugin/advancedviewdialog.h @@ -1,5 +1,4 @@ -#ifndef ADVANCEDVIEWDIALOG_H -#define ADVANCEDVIEWDIALOG_H +#pragma once #include @@ -28,5 +27,3 @@ private: BookingsModel *m_bookingsModel; TimeAssignmentsModel *m_timeAssignmentsModel; }; - -#endif // ADVANCEDVIEWDIALOG_H diff --git a/plugins/advancedviewplugin/advancedviewplugin.h b/plugins/advancedviewplugin/advancedviewplugin.h index 73a4052..0e2c7ad 100644 --- a/plugins/advancedviewplugin/advancedviewplugin.h +++ b/plugins/advancedviewplugin/advancedviewplugin.h @@ -1,5 +1,4 @@ -#ifndef ADVANCEDVIEWPLUGIN_H -#define ADVANCEDVIEWPLUGIN_H +#pragma once #include #include @@ -23,5 +22,3 @@ public: private: QTranslator m_translator; }; - -#endif // ADVANCEDVIEWPLUGIN_H diff --git a/plugins/advancedviewplugin/advancedviewwidget.h b/plugins/advancedviewplugin/advancedviewwidget.h index 52bff81..d1004a8 100644 --- a/plugins/advancedviewplugin/advancedviewwidget.h +++ b/plugins/advancedviewplugin/advancedviewwidget.h @@ -1,5 +1,4 @@ -#ifndef ADVANCEDVIEWWIDGET_H -#define ADVANCEDVIEWWIDGET_H +#pragma once #include @@ -19,5 +18,3 @@ private Q_SLOTS: private: StripsWidget &m_stripsWidget; }; - -#endif // ADVANCEDVIEWWIDGET_H diff --git a/plugins/advancedviewplugin/dialogs/bookingdialog.h b/plugins/advancedviewplugin/dialogs/bookingdialog.h index 4a308f2..6f16b7d 100644 --- a/plugins/advancedviewplugin/dialogs/bookingdialog.h +++ b/plugins/advancedviewplugin/dialogs/bookingdialog.h @@ -1,5 +1,4 @@ -#ifndef BOOKINGDIALOG_H -#define BOOKINGDIALOG_H +#pragma once #include #include @@ -29,5 +28,3 @@ public: private: Ui::BookingDialog *ui; }; - -#endif // BOOKINGDIALOG_H diff --git a/plugins/advancedviewplugin/dialogs/timeassignmentdialog.h b/plugins/advancedviewplugin/dialogs/timeassignmentdialog.h index a8d253c..032a53f 100644 --- a/plugins/advancedviewplugin/dialogs/timeassignmentdialog.h +++ b/plugins/advancedviewplugin/dialogs/timeassignmentdialog.h @@ -1,5 +1,4 @@ -#ifndef TIMEASSIGNMENTDIALOG_H -#define TIMEASSIGNMENTDIALOG_H +#pragma once #include #include @@ -40,5 +39,3 @@ public: private: Ui::TimeAssignmentDialog *ui; }; - -#endif // TIMEASSIGNMENTDIALOG_H diff --git a/plugins/advancedviewplugin/models/bookingsmodel.h b/plugins/advancedviewplugin/models/bookingsmodel.h index ced2306..fd8b654 100644 --- a/plugins/advancedviewplugin/models/bookingsmodel.h +++ b/plugins/advancedviewplugin/models/bookingsmodel.h @@ -1,5 +1,4 @@ -#ifndef BOOKINGSMODEL_H -#define BOOKINGSMODEL_H +#pragma once #include #include @@ -36,5 +35,3 @@ private Q_SLOTS: private: StripsWidget &m_stripsWidget; }; - -#endif // BOOKINGSMODEL_H diff --git a/plugins/advancedviewplugin/models/timeassignmentsmodel.h b/plugins/advancedviewplugin/models/timeassignmentsmodel.h index 05ffc55..cedbcd9 100644 --- a/plugins/advancedviewplugin/models/timeassignmentsmodel.h +++ b/plugins/advancedviewplugin/models/timeassignmentsmodel.h @@ -1,5 +1,4 @@ -#ifndef TIMEASSIGNMENTSMODEL_H -#define TIMEASSIGNMENTSMODEL_H +#pragma once #include #include @@ -37,5 +36,3 @@ private Q_SLOTS: private: StripsWidget &m_stripsWidget; }; - -#endif // TIMEASSIGNMENTSMODEL_H diff --git a/plugins/lunchmealplugin/lunchmealdialog.h b/plugins/lunchmealplugin/lunchmealdialog.h index 9345fcf..be160cd 100644 --- a/plugins/lunchmealplugin/lunchmealdialog.h +++ b/plugins/lunchmealplugin/lunchmealdialog.h @@ -1,5 +1,4 @@ -#ifndef LUNCHMEALDIALOG_H -#define LUNCHMEALDIALOG_H +#pragma once #include @@ -25,5 +24,3 @@ private: Ui::LunchMealDialog *ui; std::unique_ptr m_reply; }; - -#endif // LUNCHMEALDIALOG_H diff --git a/plugins/lunchmealplugin/lunchmealplugin.h b/plugins/lunchmealplugin/lunchmealplugin.h index f2a0f7c..8b14f85 100644 --- a/plugins/lunchmealplugin/lunchmealplugin.h +++ b/plugins/lunchmealplugin/lunchmealplugin.h @@ -1,5 +1,4 @@ -#ifndef LUNCHMEALPLUGIN_H -#define LUNCHMEALPLUGIN_H +#pragma once #include #include @@ -23,5 +22,3 @@ public: private: QTranslator m_translator; }; - -#endif // LUNCHMEALPLUGIN_H diff --git a/plugins/lunchmealplugin/lunchmealwidget.h b/plugins/lunchmealplugin/lunchmealwidget.h index a609ab9..161610c 100644 --- a/plugins/lunchmealplugin/lunchmealwidget.h +++ b/plugins/lunchmealplugin/lunchmealwidget.h @@ -1,5 +1,4 @@ -#ifndef LUNCHMEALWIDGET_H -#define LUNCHMEALWIDGET_H +#pragma once #include @@ -17,5 +16,3 @@ private Q_SLOTS: private: StripsWidget &m_stripsWidget; }; - -#endif // LUNCHMEALWIDGET_H diff --git a/plugins/presenceplugin/presenceplugin.h b/plugins/presenceplugin/presenceplugin.h index 2fc9f87..2907b7f 100644 --- a/plugins/presenceplugin/presenceplugin.h +++ b/plugins/presenceplugin/presenceplugin.h @@ -1,5 +1,4 @@ -#ifndef PRESENCEPLUGIN_H -#define PRESENCEPLUGIN_H +#pragma once #include #include @@ -23,5 +22,3 @@ public: private: QTranslator m_translator; }; - -#endif // PRESENCEPLUGIN_H diff --git a/plugins/presenceplugin/presencewidget.h b/plugins/presenceplugin/presencewidget.h index ce7f6dc..71f6f86 100644 --- a/plugins/presenceplugin/presencewidget.h +++ b/plugins/presenceplugin/presencewidget.h @@ -1,5 +1,4 @@ -#ifndef PRESENCEWIDGET_H -#define PRESENCEWIDGET_H +#pragma once #include @@ -31,5 +30,3 @@ private: std::unique_ptr m_reply; }; - -#endif // PRESENCEWIDGET_H diff --git a/plugins/reportsplugin/reportsplugin.h b/plugins/reportsplugin/reportsplugin.h index 469ac83..6f58568 100644 --- a/plugins/reportsplugin/reportsplugin.h +++ b/plugins/reportsplugin/reportsplugin.h @@ -1,5 +1,4 @@ -#ifndef REPORTSPLUGIN_H -#define REPORTSPLUGIN_H +#pragma once #include #include @@ -23,5 +22,3 @@ public: private: QTranslator m_translator; }; - -#endif // REPORTSPLUGIN_H diff --git a/plugins/reportsplugin/reportswidget.h b/plugins/reportsplugin/reportswidget.h index 9adcfe7..718a050 100644 --- a/plugins/reportsplugin/reportswidget.h +++ b/plugins/reportsplugin/reportswidget.h @@ -1,5 +1,4 @@ -#ifndef REPORTSWIDGET_H -#define REPORTSWIDGET_H +#pragma once #include #include @@ -39,5 +38,3 @@ private: std::unique_ptr m_reply; }; - -#endif // REPORTSWIDGET_H diff --git a/plugins/updaterplugin/updaterdialog.h b/plugins/updaterplugin/updaterdialog.h index c714506..ba3b40a 100644 --- a/plugins/updaterplugin/updaterdialog.h +++ b/plugins/updaterplugin/updaterdialog.h @@ -1,5 +1,4 @@ -#ifndef UPDATERDIALOG_H -#define UPDATERDIALOG_H +#pragma once #include #include @@ -29,5 +28,3 @@ private: QUrl m_url; }; - -#endif // UPDATERDIALOG_H diff --git a/plugins/updaterplugin/updaterplugin.h b/plugins/updaterplugin/updaterplugin.h index 51311b2..7cefe30 100644 --- a/plugins/updaterplugin/updaterplugin.h +++ b/plugins/updaterplugin/updaterplugin.h @@ -1,5 +1,4 @@ -#ifndef UPDATERPLUGIN_H -#define UPDATERPLUGIN_H +#pragma once #include #include @@ -23,5 +22,3 @@ public: private: QTranslator m_translator; }; - -#endif // UPDATERPLUGIN_H diff --git a/plugins/weatherplugin/weatherplugin.h b/plugins/weatherplugin/weatherplugin.h index c4dc84f..07f4f68 100644 --- a/plugins/weatherplugin/weatherplugin.h +++ b/plugins/weatherplugin/weatherplugin.h @@ -1,5 +1,4 @@ -#ifndef WEATHERPLUGIN_H -#define WEATHERPLUGIN_H +#pragma once #include #include @@ -21,5 +20,3 @@ public: private: QTranslator m_translator; }; - -#endif // WEATHERPLUGIN_H diff --git a/plugins/weatherplugin/weatherwidget.h b/plugins/weatherplugin/weatherwidget.h index 17532c5..8a3a2f7 100644 --- a/plugins/weatherplugin/weatherwidget.h +++ b/plugins/weatherplugin/weatherwidget.h @@ -1,5 +1,4 @@ -#ifndef WEATHERWIDGET_H -#define WEATHERWIDGET_H +#pragma once #include @@ -24,5 +23,3 @@ private: std::unique_ptr m_reply; }; - -#endif // WEATHERWIDGET_H diff --git a/zeiterfassunglib/cpp14polyfills.h b/zeiterfassunglib/cpp14polyfills.h index 1c482e9..2fcbe50 100644 --- a/zeiterfassunglib/cpp14polyfills.h +++ b/zeiterfassunglib/cpp14polyfills.h @@ -1,8 +1,4 @@ -#ifndef CPP14POLYFILLS_H -#define CPP14POLYFILLS_H - -#ifndef CPP14POLYFILLS_INCLUDED -#define CPP14POLYFILLS_INCLUDED +#pragma once #if __cplusplus < 201402L @@ -45,7 +41,3 @@ namespace std { } #endif // __cplusplus < 201402L - -#endif // CPP14POLYFILLS_INCLUDED - -#endif // CPP14POLYFILLS_H diff --git a/zeiterfassunglib/dialogs/aboutmedialog.h b/zeiterfassunglib/dialogs/aboutmedialog.h index d33fbd4..befbe19 100644 --- a/zeiterfassunglib/dialogs/aboutmedialog.h +++ b/zeiterfassunglib/dialogs/aboutmedialog.h @@ -1,5 +1,4 @@ -#ifndef ABOUTMEDIALOG_H -#define ABOUTMEDIALOG_H +#pragma once #include @@ -19,5 +18,3 @@ public: private: Ui::AboutMeDialog *ui; }; - -#endif // ABOUTMEDIALOG_H diff --git a/zeiterfassunglib/dialogs/authenticationdialog.h b/zeiterfassunglib/dialogs/authenticationdialog.h index 712059c..0c8cd6e 100644 --- a/zeiterfassunglib/dialogs/authenticationdialog.h +++ b/zeiterfassunglib/dialogs/authenticationdialog.h @@ -1,5 +1,4 @@ -#ifndef AUTHENTICATIONDIALOG_H -#define AUTHENTICATIONDIALOG_H +#pragma once #include @@ -26,5 +25,3 @@ public: private: Ui::AuthenticationDialog *ui; }; - -#endif // AUTHENTICATIONDIALOG_H diff --git a/zeiterfassunglib/dialogs/languageselectiondialog.h b/zeiterfassunglib/dialogs/languageselectiondialog.h index e28b883..21c216b 100644 --- a/zeiterfassunglib/dialogs/languageselectiondialog.h +++ b/zeiterfassunglib/dialogs/languageselectiondialog.h @@ -1,5 +1,4 @@ -#ifndef LANGUAGESELECTIONDIALOG_H -#define LANGUAGESELECTIONDIALOG_H +#pragma once #include #include @@ -22,5 +21,3 @@ public: private: Ui::LanguageSelectionDialog *ui; }; - -#endif // LANGUAGESELECTIONDIALOG_H diff --git a/zeiterfassunglib/dialogs/settingsdialog.h b/zeiterfassunglib/dialogs/settingsdialog.h index 5cafed2..150beed 100644 --- a/zeiterfassunglib/dialogs/settingsdialog.h +++ b/zeiterfassunglib/dialogs/settingsdialog.h @@ -1,5 +1,4 @@ -#ifndef SETTINGSDIALOG_H -#define SETTINGSDIALOG_H +#pragma once #include @@ -23,5 +22,3 @@ private: Ui::SettingsDialog *ui; ZeiterfassungSettings &m_settings; }; - -#endif // SETTINGSDIALOG_H diff --git a/zeiterfassunglib/mainwindow.h b/zeiterfassunglib/mainwindow.h index b9d88de..cfe851b 100644 --- a/zeiterfassunglib/mainwindow.h +++ b/zeiterfassunglib/mainwindow.h @@ -1,5 +1,4 @@ -#ifndef MAINWINDOW_H -#define MAINWINDOW_H +#pragma once #include @@ -77,5 +76,3 @@ private: std::array m_stripsWidgets; StripsWidget *m_currentStripWidget; }; - -#endif // MAINWINDOW_H diff --git a/zeiterfassunglib/replies/createbookingreply.h b/zeiterfassunglib/replies/createbookingreply.h index 90bf397..a7b0fb4 100644 --- a/zeiterfassunglib/replies/createbookingreply.h +++ b/zeiterfassunglib/replies/createbookingreply.h @@ -1,5 +1,4 @@ -#ifndef CREATEBOOKINGREPLY_H -#define CREATEBOOKINGREPLY_H +#pragma once #include @@ -21,5 +20,3 @@ private Q_SLOTS: private: std::unique_ptr m_reply; }; - -#endif // CREATEBOOKINGREPLY_H diff --git a/zeiterfassunglib/replies/createtimeassignmentreply.h b/zeiterfassunglib/replies/createtimeassignmentreply.h index 0224410..baa7827 100644 --- a/zeiterfassunglib/replies/createtimeassignmentreply.h +++ b/zeiterfassunglib/replies/createtimeassignmentreply.h @@ -1,5 +1,4 @@ -#ifndef CREATETIMEASSIGNMENTREPLY_H -#define CREATETIMEASSIGNMENTREPLY_H +#pragma once #include @@ -24,5 +23,3 @@ private: std::unique_ptr m_reply; int m_timeAssignmentId; }; - -#endif // CREATETIMEASSIGNMENTREPLY_H diff --git a/zeiterfassunglib/replies/deletebookingreply.h b/zeiterfassunglib/replies/deletebookingreply.h index 6e701fa..fab6e07 100644 --- a/zeiterfassunglib/replies/deletebookingreply.h +++ b/zeiterfassunglib/replies/deletebookingreply.h @@ -1,5 +1,4 @@ -#ifndef DELETEBOOKINGREPLY_H -#define DELETEBOOKINGREPLY_H +#pragma once #include @@ -21,5 +20,3 @@ private Q_SLOTS: private: std::unique_ptr m_reply; }; - -#endif // DELETEBOOKINGREPLY_H diff --git a/zeiterfassunglib/replies/deletetimeassignmentreply.h b/zeiterfassunglib/replies/deletetimeassignmentreply.h index ec7a4d0..3d380f2 100644 --- a/zeiterfassunglib/replies/deletetimeassignmentreply.h +++ b/zeiterfassunglib/replies/deletetimeassignmentreply.h @@ -1,5 +1,4 @@ -#ifndef DELETETIMEASSIGNMENT_H -#define DELETETIMEASSIGNMENT_H +#pragma once #include @@ -21,5 +20,3 @@ private Q_SLOTS: private: std::unique_ptr m_reply; }; - -#endif // DELETETIMEASSIGNMENT_H diff --git a/zeiterfassunglib/replies/getbookingsreply.h b/zeiterfassunglib/replies/getbookingsreply.h index 59344b9..e6b83be 100644 --- a/zeiterfassunglib/replies/getbookingsreply.h +++ b/zeiterfassunglib/replies/getbookingsreply.h @@ -1,5 +1,4 @@ -#ifndef GETBOOKINGSREPLY_H -#define GETBOOKINGSREPLY_H +#pragma once #include @@ -37,5 +36,3 @@ private: std::unique_ptr m_reply; QVector m_bookings; }; - -#endif // GETBOOKINGSREPLY_H diff --git a/zeiterfassunglib/replies/getpresencestatusreply.h b/zeiterfassunglib/replies/getpresencestatusreply.h index e220379..73fdf65 100644 --- a/zeiterfassunglib/replies/getpresencestatusreply.h +++ b/zeiterfassunglib/replies/getpresencestatusreply.h @@ -1,5 +1,4 @@ -#ifndef GETPRESENCESTATUSREPLY_H -#define GETPRESENCESTATUSREPLY_H +#pragma once #include @@ -34,5 +33,3 @@ private: std::unique_ptr m_reply; QVector m_presenceStatuses; }; - -#endif // GETPRESENCESTATUSREPLY_H diff --git a/zeiterfassunglib/replies/getprojectsreply.h b/zeiterfassunglib/replies/getprojectsreply.h index 576728a..8081bf9 100644 --- a/zeiterfassunglib/replies/getprojectsreply.h +++ b/zeiterfassunglib/replies/getprojectsreply.h @@ -1,5 +1,4 @@ -#ifndef GETPROJECTSREPLY_H -#define GETPROJECTSREPLY_H +#pragma once #include @@ -33,5 +32,3 @@ private: std::unique_ptr m_reply; QVector m_projects; }; - -#endif // GETPROJECTSREPLY_H diff --git a/zeiterfassunglib/replies/getreportreply.h b/zeiterfassunglib/replies/getreportreply.h index 1590681..f6d8b3d 100644 --- a/zeiterfassunglib/replies/getreportreply.h +++ b/zeiterfassunglib/replies/getreportreply.h @@ -1,5 +1,4 @@ -#ifndef GETREPORTREPLY_H -#define GETREPORTREPLY_H +#pragma once #include @@ -26,5 +25,3 @@ private: std::unique_ptr m_reply; QByteArray m_content; }; - -#endif // GETREPORTREPLY_H diff --git a/zeiterfassunglib/replies/gettimeassignmentsreply.h b/zeiterfassunglib/replies/gettimeassignmentsreply.h index a335a70..2483202 100644 --- a/zeiterfassunglib/replies/gettimeassignmentsreply.h +++ b/zeiterfassunglib/replies/gettimeassignmentsreply.h @@ -1,5 +1,4 @@ -#ifndef GETTIMEASSIGNMENTSREPLY_H -#define GETTIMEASSIGNMENTSREPLY_H +#pragma once #include @@ -39,5 +38,3 @@ private: std::unique_ptr m_reply; QVector m_timeAssignments; }; - -#endif // GETTIMEASSIGNMENTSREPLY_H diff --git a/zeiterfassunglib/replies/getuserinforeply.h b/zeiterfassunglib/replies/getuserinforeply.h index 4a4bb76..7e0cd64 100644 --- a/zeiterfassunglib/replies/getuserinforeply.h +++ b/zeiterfassunglib/replies/getuserinforeply.h @@ -1,5 +1,4 @@ -#ifndef GETUSERINFOREPLY_H -#define GETUSERINFOREPLY_H +#pragma once #include @@ -50,5 +49,3 @@ private: std::unique_ptr m_reply1; UserInfo m_userInfo; }; - -#endif // GETUSERINFOREPLY_H diff --git a/zeiterfassunglib/replies/loginpagereply.h b/zeiterfassunglib/replies/loginpagereply.h index daf0f44..9a09a78 100644 --- a/zeiterfassunglib/replies/loginpagereply.h +++ b/zeiterfassunglib/replies/loginpagereply.h @@ -1,5 +1,4 @@ -#ifndef LOGINPAGEREPLY_H -#define LOGINPAGEREPLY_H +#pragma once #include @@ -21,5 +20,3 @@ private Q_SLOTS: private: std::unique_ptr m_reply; }; - -#endif // LOGINPAGEREPLY_H diff --git a/zeiterfassunglib/replies/loginreply.h b/zeiterfassunglib/replies/loginreply.h index 2626d7a..817e799 100644 --- a/zeiterfassunglib/replies/loginreply.h +++ b/zeiterfassunglib/replies/loginreply.h @@ -1,5 +1,4 @@ -#ifndef LOGINREPLY_H -#define LOGINREPLY_H +#pragma once #include @@ -21,5 +20,3 @@ private Q_SLOTS: private: std::unique_ptr m_reply; }; - -#endif // LOGINREPLY_H diff --git a/zeiterfassunglib/replies/updatebookingreply.h b/zeiterfassunglib/replies/updatebookingreply.h index c948485..c3f09bb 100644 --- a/zeiterfassunglib/replies/updatebookingreply.h +++ b/zeiterfassunglib/replies/updatebookingreply.h @@ -1,5 +1,4 @@ -#ifndef UPDATEBOOKINGREPLY_H -#define UPDATEBOOKINGREPLY_H +#pragma once #include @@ -22,5 +21,3 @@ private: std::unique_ptr m_reply; int m_bookingId; }; - -#endif // UPDATEBOOKINGREPLY_H diff --git a/zeiterfassunglib/replies/updatetimeassignmentreply.h b/zeiterfassunglib/replies/updatetimeassignmentreply.h index ea9977a..1ea264b 100644 --- a/zeiterfassunglib/replies/updatetimeassignmentreply.h +++ b/zeiterfassunglib/replies/updatetimeassignmentreply.h @@ -1,5 +1,4 @@ -#ifndef UPDATETIMEASSIGNMENTREPLY_H -#define UPDATETIMEASSIGNMENTREPLY_H +#pragma once #include @@ -24,5 +23,3 @@ private: std::unique_ptr m_reply; int m_timeAssignmentId; }; - -#endif // UPDATETIMEASSIGNMENTREPLY_H diff --git a/zeiterfassunglib/replies/zeiterfassungreply.h b/zeiterfassunglib/replies/zeiterfassungreply.h index 05187e3..450263a 100644 --- a/zeiterfassunglib/replies/zeiterfassungreply.h +++ b/zeiterfassunglib/replies/zeiterfassungreply.h @@ -1,5 +1,4 @@ -#ifndef ZEITERFASSUNGREPLY_H -#define ZEITERFASSUNGREPLY_H +#pragma once #include @@ -32,5 +31,3 @@ private: bool m_success; QString m_message; }; - -#endif // ZEITERFASSUNGREPLY_H diff --git a/zeiterfassunglib/stripfactory.h b/zeiterfassunglib/stripfactory.h index af3e1d3..f47723f 100644 --- a/zeiterfassunglib/stripfactory.h +++ b/zeiterfassunglib/stripfactory.h @@ -1,5 +1,4 @@ -#ifndef STRIPFACTORY_H -#define STRIPFACTORY_H +#pragma once #include @@ -34,5 +33,3 @@ private: QByteArray m_bookingEndStrip; QByteArray m_timeAssignmentStrip; }; - -#endif // STRIPFACTORY_H diff --git a/zeiterfassunglib/stripswidget.h b/zeiterfassunglib/stripswidget.h index 76e48d7..90f69bf 100644 --- a/zeiterfassunglib/stripswidget.h +++ b/zeiterfassunglib/stripswidget.h @@ -1,5 +1,4 @@ -#ifndef STRIPSWIDGET_H -#define STRIPSWIDGET_H +#pragma once #include @@ -103,5 +102,3 @@ private: std::unique_ptr m_getBookingsReply; std::unique_ptr m_getTimeAssignmentsReply; }; - -#endif // STRIPSWIDGET_H diff --git a/zeiterfassunglib/timeutils.h b/zeiterfassunglib/timeutils.h index 0bc866a..8364352 100644 --- a/zeiterfassunglib/timeutils.h +++ b/zeiterfassunglib/timeutils.h @@ -1,5 +1,4 @@ -#ifndef TIMEUTILS_H -#define TIMEUTILS_H +#pragma once #include @@ -9,5 +8,3 @@ int ZEITERFASSUNGLIBSHARED_EXPORT timeToSeconds(const QTime &time); QTime ZEITERFASSUNGLIBSHARED_EXPORT timeBetween(const QTime &l, const QTime &r); QTime ZEITERFASSUNGLIBSHARED_EXPORT timeAdd(const QTime &l, const QTime &r); QTime ZEITERFASSUNGLIBSHARED_EXPORT timeNormalise(const QTime &time); - -#endif // TIMEUTILS_H diff --git a/zeiterfassunglib/zeiterfassungapi.h b/zeiterfassunglib/zeiterfassungapi.h index e978094..b50b62c 100644 --- a/zeiterfassunglib/zeiterfassungapi.h +++ b/zeiterfassunglib/zeiterfassungapi.h @@ -1,5 +1,4 @@ -#ifndef ZEITERFASSUNGAPI_H -#define ZEITERFASSUNGAPI_H +#pragma once #include @@ -69,5 +68,3 @@ private: QString m_url; QNetworkAccessManager *m_manager; }; - -#endif // ZEITERFASSUNGAPI_H diff --git a/zeiterfassunglib/zeiterfassunglib_global.h b/zeiterfassunglib/zeiterfassunglib_global.h index bfb9534..8994853 100644 --- a/zeiterfassunglib/zeiterfassunglib_global.h +++ b/zeiterfassunglib/zeiterfassunglib_global.h @@ -1,5 +1,4 @@ -#ifndef ZEITERFASSUNGLIB_GLOBAL_H -#define ZEITERFASSUNGLIB_GLOBAL_H +#pragma once #include @@ -8,5 +7,3 @@ #else # define ZEITERFASSUNGLIBSHARED_EXPORT Q_DECL_IMPORT #endif - -#endif // ZEITERFASSUNGLIB_GLOBAL_H diff --git a/zeiterfassunglib/zeiterfassungplugin.h b/zeiterfassunglib/zeiterfassungplugin.h index 1b170c0..4fac76f 100644 --- a/zeiterfassunglib/zeiterfassungplugin.h +++ b/zeiterfassunglib/zeiterfassungplugin.h @@ -1,5 +1,4 @@ -#ifndef ZEITERFASSUNGPLUGIN_H -#define ZEITERFASSUNGPLUGIN_H +#pragma once #include @@ -19,5 +18,3 @@ public: }; Q_DECLARE_INTERFACE(ZeiterfassungPlugin, "dbsoftware.zeiterfassung.plugin/1.0") - -#endif // ZEITERFASSUNGPLUGIN_H diff --git a/zeiterfassunglib/zeiterfassungsettings.h b/zeiterfassunglib/zeiterfassungsettings.h index 0a56adf..879fd3e 100644 --- a/zeiterfassunglib/zeiterfassungsettings.h +++ b/zeiterfassunglib/zeiterfassungsettings.h @@ -1,5 +1,4 @@ -#ifndef ZEITERFASSUNGSETTINGS_H -#define ZEITERFASSUNGSETTINGS_H +#pragma once #include #include @@ -57,5 +56,3 @@ public: private: void prependItem(const QString &name, const QString &item); }; - -#endif // ZEITERFASSUNGSETTINGS_H -- 2.50.1 From 7573ff507bc985df62829504e7f3e2d68ac15ec3 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Wed, 20 Dec 2017 21:38:56 +0100 Subject: [PATCH 08/78] Renamed zeiterfassunglib to zeiterfassungguilib --- .../advancedviewplugin/advancedviewdialog.cpp | 4 ++-- .../advancedviewplugin/advancedviewplugin.pro | 6 ++--- plugins/lunchmealplugin/lunchmealplugin.pro | 6 ++--- plugins/presenceplugin/presenceplugin.pro | 6 ++--- plugins/reportsplugin/reportsplugin.pro | 6 ++--- plugins/updaterplugin/updaterplugin.pro | 6 ++--- plugins/weatherplugin/weatherplugin.pro | 6 ++--- zeiterfassung.pro | 6 ++--- zeiterfassung/installs.pri | 4 ++-- zeiterfassung/installs_win32.pri | 2 +- zeiterfassung/main.cpp | 4 ++-- zeiterfassung/zeiterfassung.pro | 6 ++--- .../cpp14polyfills.h | 0 .../dialogs/aboutmedialog.cpp | 0 .../dialogs/aboutmedialog.h | 4 ++-- .../dialogs/aboutmedialog.ui | 0 .../dialogs/authenticationdialog.cpp | 0 .../dialogs/authenticationdialog.h | 4 ++-- .../dialogs/authenticationdialog.ui | 2 +- .../dialogs/languageselectiondialog.cpp | 0 .../dialogs/languageselectiondialog.h | 4 ++-- .../dialogs/languageselectiondialog.ui | 0 .../dialogs/settingsdialog.cpp | 0 .../dialogs/settingsdialog.h | 4 ++-- .../dialogs/settingsdialog.ui | 0 .../images/about.png | Bin .../images/authentication.png | Bin .../images/help.png | Bin .../images/icon.png | Bin .../images/next.png | Bin .../images/now.png | Bin .../images/previous.png | Bin .../images/quit.png | Bin .../images/refresh.png | Bin .../images/settings.png | Bin .../images/today.png | Bin .../images/user.png | Bin .../mainwindow.cpp | 0 .../mainwindow.h | 4 ++-- .../mainwindow.ui | 22 +++++++++--------- .../replies/createbookingreply.cpp | 0 .../replies/createbookingreply.h | 4 ++-- .../replies/createtimeassignmentreply.cpp | 0 .../replies/createtimeassignmentreply.h | 4 ++-- .../replies/deletebookingreply.cpp | 0 .../replies/deletebookingreply.h | 4 ++-- .../replies/deletetimeassignmentreply.cpp | 0 .../replies/deletetimeassignmentreply.h | 4 ++-- .../replies/getbookingsreply.cpp | 0 .../replies/getbookingsreply.h | 4 ++-- .../replies/getpresencestatusreply.cpp | 0 .../replies/getpresencestatusreply.h | 4 ++-- .../replies/getprojectsreply.cpp | 0 .../replies/getprojectsreply.h | 4 ++-- .../replies/getreportreply.cpp | 0 .../replies/getreportreply.h | 4 ++-- .../replies/gettimeassignmentsreply.cpp | 0 .../replies/gettimeassignmentsreply.h | 4 ++-- .../replies/getuserinforeply.cpp | 0 .../replies/getuserinforeply.h | 4 ++-- .../replies/loginpagereply.cpp | 0 .../replies/loginpagereply.h | 4 ++-- .../replies/loginreply.cpp | 0 .../replies/loginreply.h | 4 ++-- .../replies/updatebookingreply.cpp | 0 .../replies/updatebookingreply.h | 4 ++-- .../replies/updatetimeassignmentreply.cpp | 0 .../replies/updatetimeassignmentreply.h | 4 ++-- .../replies/zeiterfassungreply.cpp | 0 .../replies/zeiterfassungreply.h | 4 ++-- .../stripfactory.cpp | 0 .../stripfactory.h | 4 ++-- .../stripswidget.cpp | 0 .../stripswidget.h | 4 ++-- .../timeutils.cpp | 0 zeiterfassungguilib/timeutils.h | 10 ++++++++ .../translations/zeiterfassungguilib_de.ts | 0 .../translations/zeiterfassungguilib_en.ts | 0 .../zeiterfassungapi.cpp | 0 .../zeiterfassungapi.h | 4 ++-- .../zeiterfassungguilib.pro | 12 +++++----- .../zeiterfassungguilib_global.h | 9 +++++++ .../zeiterfassungguilib_resources.qrc | 2 +- .../zeiterfassungplugin.cpp | 0 .../zeiterfassungplugin.h | 4 ++-- .../zeiterfassungsettings.cpp | 0 .../zeiterfassungsettings.h | 4 ++-- zeiterfassunglib/timeutils.h | 10 -------- zeiterfassunglib/zeiterfassunglib_global.h | 9 ------- 89 files changed, 119 insertions(+), 119 deletions(-) rename {zeiterfassunglib => zeiterfassungguilib}/cpp14polyfills.h (100%) rename {zeiterfassunglib => zeiterfassungguilib}/dialogs/aboutmedialog.cpp (100%) rename {zeiterfassunglib => zeiterfassungguilib}/dialogs/aboutmedialog.h (73%) rename {zeiterfassunglib => zeiterfassungguilib}/dialogs/aboutmedialog.ui (100%) rename {zeiterfassunglib => zeiterfassungguilib}/dialogs/authenticationdialog.cpp (100%) rename {zeiterfassunglib => zeiterfassungguilib}/dialogs/authenticationdialog.h (77%) rename {zeiterfassunglib => zeiterfassungguilib}/dialogs/authenticationdialog.ui (96%) rename {zeiterfassunglib => zeiterfassungguilib}/dialogs/languageselectiondialog.cpp (100%) rename {zeiterfassunglib => zeiterfassungguilib}/dialogs/languageselectiondialog.h (75%) rename {zeiterfassunglib => zeiterfassungguilib}/dialogs/languageselectiondialog.ui (100%) rename {zeiterfassunglib => zeiterfassungguilib}/dialogs/settingsdialog.cpp (100%) rename {zeiterfassunglib => zeiterfassungguilib}/dialogs/settingsdialog.h (76%) rename {zeiterfassunglib => zeiterfassungguilib}/dialogs/settingsdialog.ui (100%) rename {zeiterfassunglib => zeiterfassungguilib}/images/about.png (100%) rename {zeiterfassunglib => zeiterfassungguilib}/images/authentication.png (100%) rename {zeiterfassunglib => zeiterfassungguilib}/images/help.png (100%) rename {zeiterfassunglib => zeiterfassungguilib}/images/icon.png (100%) rename {zeiterfassunglib => zeiterfassungguilib}/images/next.png (100%) rename {zeiterfassunglib => zeiterfassungguilib}/images/now.png (100%) rename {zeiterfassunglib => zeiterfassungguilib}/images/previous.png (100%) rename {zeiterfassunglib => zeiterfassungguilib}/images/quit.png (100%) rename {zeiterfassunglib => zeiterfassungguilib}/images/refresh.png (100%) rename {zeiterfassunglib => zeiterfassungguilib}/images/settings.png (100%) rename {zeiterfassunglib => zeiterfassungguilib}/images/today.png (100%) rename {zeiterfassunglib => zeiterfassungguilib}/images/user.png (100%) rename {zeiterfassunglib => zeiterfassungguilib}/mainwindow.cpp (100%) rename {zeiterfassunglib => zeiterfassungguilib}/mainwindow.h (94%) rename {zeiterfassunglib => zeiterfassungguilib}/mainwindow.ui (84%) rename {zeiterfassunglib => zeiterfassungguilib}/replies/createbookingreply.cpp (100%) rename {zeiterfassunglib => zeiterfassungguilib}/replies/createbookingreply.h (71%) rename {zeiterfassunglib => zeiterfassungguilib}/replies/createtimeassignmentreply.cpp (100%) rename {zeiterfassunglib => zeiterfassungguilib}/replies/createtimeassignmentreply.h (74%) rename {zeiterfassunglib => zeiterfassungguilib}/replies/deletebookingreply.cpp (100%) rename {zeiterfassunglib => zeiterfassungguilib}/replies/deletebookingreply.h (71%) rename {zeiterfassunglib => zeiterfassungguilib}/replies/deletetimeassignmentreply.cpp (100%) rename {zeiterfassunglib => zeiterfassungguilib}/replies/deletetimeassignmentreply.h (70%) rename {zeiterfassunglib => zeiterfassungguilib}/replies/getbookingsreply.cpp (100%) rename {zeiterfassunglib => zeiterfassungguilib}/replies/getbookingsreply.h (82%) rename {zeiterfassunglib => zeiterfassungguilib}/replies/getpresencestatusreply.cpp (100%) rename {zeiterfassunglib => zeiterfassungguilib}/replies/getpresencestatusreply.h (82%) rename {zeiterfassunglib => zeiterfassungguilib}/replies/getprojectsreply.cpp (100%) rename {zeiterfassunglib => zeiterfassungguilib}/replies/getprojectsreply.h (80%) rename {zeiterfassunglib => zeiterfassungguilib}/replies/getreportreply.cpp (100%) rename {zeiterfassunglib => zeiterfassungguilib}/replies/getreportreply.h (77%) rename {zeiterfassunglib => zeiterfassungguilib}/replies/gettimeassignmentsreply.cpp (100%) rename {zeiterfassunglib => zeiterfassungguilib}/replies/gettimeassignmentsreply.h (84%) rename {zeiterfassunglib => zeiterfassungguilib}/replies/getuserinforeply.cpp (100%) rename {zeiterfassunglib => zeiterfassungguilib}/replies/getuserinforeply.h (88%) rename {zeiterfassunglib => zeiterfassungguilib}/replies/loginpagereply.cpp (100%) rename {zeiterfassunglib => zeiterfassungguilib}/replies/loginpagereply.h (71%) rename {zeiterfassunglib => zeiterfassungguilib}/replies/loginreply.cpp (100%) rename {zeiterfassunglib => zeiterfassungguilib}/replies/loginreply.h (72%) rename {zeiterfassunglib => zeiterfassungguilib}/replies/updatebookingreply.cpp (100%) rename {zeiterfassunglib => zeiterfassungguilib}/replies/updatebookingreply.h (72%) rename {zeiterfassunglib => zeiterfassungguilib}/replies/updatetimeassignmentreply.cpp (100%) rename {zeiterfassunglib => zeiterfassungguilib}/replies/updatetimeassignmentreply.h (74%) rename {zeiterfassunglib => zeiterfassungguilib}/replies/zeiterfassungreply.cpp (100%) rename {zeiterfassunglib => zeiterfassungguilib}/replies/zeiterfassungreply.h (81%) rename {zeiterfassunglib => zeiterfassungguilib}/stripfactory.cpp (100%) rename {zeiterfassunglib => zeiterfassungguilib}/stripfactory.h (86%) rename {zeiterfassunglib => zeiterfassungguilib}/stripswidget.cpp (100%) rename {zeiterfassunglib => zeiterfassungguilib}/stripswidget.h (96%) rename {zeiterfassunglib => zeiterfassungguilib}/timeutils.cpp (100%) create mode 100644 zeiterfassungguilib/timeutils.h rename zeiterfassunglib/translations/zeiterfassunglib_de.ts => zeiterfassungguilib/translations/zeiterfassungguilib_de.ts (100%) rename zeiterfassunglib/translations/zeiterfassunglib_en.ts => zeiterfassungguilib/translations/zeiterfassungguilib_en.ts (100%) rename {zeiterfassunglib => zeiterfassungguilib}/zeiterfassungapi.cpp (100%) rename {zeiterfassunglib => zeiterfassungguilib}/zeiterfassungapi.h (96%) rename zeiterfassunglib/zeiterfassunglib.pro => zeiterfassungguilib/zeiterfassungguilib.pro (90%) create mode 100644 zeiterfassungguilib/zeiterfassungguilib_global.h rename zeiterfassunglib/zeiterfassunglib_resources.qrc => zeiterfassungguilib/zeiterfassungguilib_resources.qrc (89%) rename {zeiterfassunglib => zeiterfassungguilib}/zeiterfassungplugin.cpp (100%) rename {zeiterfassunglib => zeiterfassungguilib}/zeiterfassungplugin.h (73%) rename {zeiterfassunglib => zeiterfassungguilib}/zeiterfassungsettings.cpp (100%) rename {zeiterfassunglib => zeiterfassungguilib}/zeiterfassungsettings.h (93%) delete mode 100644 zeiterfassunglib/timeutils.h delete mode 100644 zeiterfassunglib/zeiterfassunglib_global.h diff --git a/plugins/advancedviewplugin/advancedviewdialog.cpp b/plugins/advancedviewplugin/advancedviewdialog.cpp index 95e7079..c3ab43e 100644 --- a/plugins/advancedviewplugin/advancedviewdialog.cpp +++ b/plugins/advancedviewplugin/advancedviewdialog.cpp @@ -54,7 +54,7 @@ void AdvancedViewDialog::contextMenuBooking(const QPoint &pos) { QMenu menu; auto createAction = menu.addAction(tr("Create booking")); - auto refreshAction = menu.addAction(QIcon(QPixmap(QStringLiteral(":/zeiterfassung/zeiterfassunglib/images/refresh.png"))), tr("Refresh bookings")); + auto refreshAction = menu.addAction(QIcon(QPixmap(QStringLiteral(":/zeiterfassungguilib/images/refresh.png"))), tr("Refresh bookings")); auto selectedAction = menu.exec(ui->bookingsView->viewport()->mapToGlobal(pos)); if(selectedAction == createAction) { @@ -160,7 +160,7 @@ void AdvancedViewDialog::contextMenuTimeAssignment(const QPoint &pos) { QMenu menu; auto createAction = menu.addAction(tr("Create time assignment")); - auto refreshAction = menu.addAction(QIcon(QPixmap(QStringLiteral(":/zeiterfassung/zeiterfassunglib/images/refresh.png"))), tr("Refresh time assignments")); + auto refreshAction = menu.addAction(QIcon(QPixmap(QStringLiteral(":/zeiterfassungguilib/images/refresh.png"))), tr("Refresh time assignments")); auto selectedAction = menu.exec(ui->timeAssignmentsView->viewport()->mapToGlobal(pos)); if(selectedAction == createAction) { diff --git a/plugins/advancedviewplugin/advancedviewplugin.pro b/plugins/advancedviewplugin/advancedviewplugin.pro index 3f522ca..ad05070 100644 --- a/plugins/advancedviewplugin/advancedviewplugin.pro +++ b/plugins/advancedviewplugin/advancedviewplugin.pro @@ -7,10 +7,10 @@ CONFIG += shared c++14 DESTDIR = $${OUT_PWD}/../../bin/plugins/zeiterfassung -LIBS += -L$$OUT_PWD/../../lib -lzeiterfassunglib +LIBS += -L$$OUT_PWD/../../lib -lzeiterfassungguilib -INCLUDEPATH += $$PWD/../../zeiterfassunglib -DEPENDPATH += $$PWD/../../zeiterfassunglib +INCLUDEPATH += $$PWD/../../zeiterfassungguilib +DEPENDPATH += $$PWD/../../zeiterfassungguilib DEFINES += QT_DEPRECATED_WARNINGS QT_DISABLE_DEPRECATED_BEFORE=0x060000 QT_MESSAGELOGCONTEXT diff --git a/plugins/lunchmealplugin/lunchmealplugin.pro b/plugins/lunchmealplugin/lunchmealplugin.pro index c3debe5..a034877 100644 --- a/plugins/lunchmealplugin/lunchmealplugin.pro +++ b/plugins/lunchmealplugin/lunchmealplugin.pro @@ -7,10 +7,10 @@ CONFIG += shared c++14 DESTDIR = $${OUT_PWD}/../../bin/plugins/zeiterfassung -LIBS += -L$$OUT_PWD/../../lib -lzeiterfassunglib +LIBS += -L$$OUT_PWD/../../lib -lzeiterfassungguilib -INCLUDEPATH += $$PWD/../../zeiterfassunglib -DEPENDPATH += $$PWD/../../zeiterfassunglib +INCLUDEPATH += $$PWD/../../zeiterfassungguilib +DEPENDPATH += $$PWD/../../zeiterfassungguilib DEFINES += QT_DEPRECATED_WARNINGS QT_DISABLE_DEPRECATED_BEFORE=0x060000 QT_MESSAGELOGCONTEXT diff --git a/plugins/presenceplugin/presenceplugin.pro b/plugins/presenceplugin/presenceplugin.pro index e3e1d82..cb39656 100644 --- a/plugins/presenceplugin/presenceplugin.pro +++ b/plugins/presenceplugin/presenceplugin.pro @@ -7,10 +7,10 @@ CONFIG += shared c++14 DESTDIR = $${OUT_PWD}/../../bin/plugins/zeiterfassung -LIBS += -L$$OUT_PWD/../../lib -lzeiterfassunglib +LIBS += -L$$OUT_PWD/../../lib -lzeiterfassungguilib -INCLUDEPATH += $$PWD/../../zeiterfassunglib -DEPENDPATH += $$PWD/../../zeiterfassunglib +INCLUDEPATH += $$PWD/../../zeiterfassungguilib +DEPENDPATH += $$PWD/../../zeiterfassungguilib DEFINES += QT_DEPRECATED_WARNINGS QT_DISABLE_DEPRECATED_BEFORE=0x060000 QT_MESSAGELOGCONTEXT diff --git a/plugins/reportsplugin/reportsplugin.pro b/plugins/reportsplugin/reportsplugin.pro index e5fcadf..139de8a 100644 --- a/plugins/reportsplugin/reportsplugin.pro +++ b/plugins/reportsplugin/reportsplugin.pro @@ -7,10 +7,10 @@ CONFIG += shared c++14 DESTDIR = $${OUT_PWD}/../../bin/plugins/zeiterfassung -LIBS += -L$$OUT_PWD/../../lib -lzeiterfassunglib +LIBS += -L$$OUT_PWD/../../lib -lzeiterfassungguilib -INCLUDEPATH += $$PWD/../../zeiterfassunglib -DEPENDPATH += $$PWD/../../zeiterfassunglib +INCLUDEPATH += $$PWD/../../zeiterfassungguilib +DEPENDPATH += $$PWD/../../zeiterfassungguilib DEFINES += QT_DEPRECATED_WARNINGS QT_DISABLE_DEPRECATED_BEFORE=0x060000 QT_MESSAGELOGCONTEXT diff --git a/plugins/updaterplugin/updaterplugin.pro b/plugins/updaterplugin/updaterplugin.pro index 0e6f1ce..ccc22f0 100644 --- a/plugins/updaterplugin/updaterplugin.pro +++ b/plugins/updaterplugin/updaterplugin.pro @@ -7,10 +7,10 @@ CONFIG += shared c++14 DESTDIR = $${OUT_PWD}/../../bin/plugins/zeiterfassung -LIBS += -L$$OUT_PWD/../../lib -lzeiterfassunglib +LIBS += -L$$OUT_PWD/../../lib -lzeiterfassungguilib -INCLUDEPATH += $$PWD/../../zeiterfassunglib -DEPENDPATH += $$PWD/../../zeiterfassunglib +INCLUDEPATH += $$PWD/../../zeiterfassungguilib +DEPENDPATH += $$PWD/../../zeiterfassungguilib DEFINES += QT_DEPRECATED_WARNINGS QT_DISABLE_DEPRECATED_BEFORE=0x060000 QT_MESSAGELOGCONTEXT diff --git a/plugins/weatherplugin/weatherplugin.pro b/plugins/weatherplugin/weatherplugin.pro index 43118e3..558bac6 100644 --- a/plugins/weatherplugin/weatherplugin.pro +++ b/plugins/weatherplugin/weatherplugin.pro @@ -7,10 +7,10 @@ CONFIG += shared c++14 DESTDIR = $${OUT_PWD}/../../bin/plugins/zeiterfassung -LIBS += -L$$OUT_PWD/../../lib -lzeiterfassunglib +LIBS += -L$$OUT_PWD/../../lib -lzeiterfassungguilib -INCLUDEPATH += $$PWD/../../zeiterfassunglib -DEPENDPATH += $$PWD/../../zeiterfassunglib +INCLUDEPATH += $$PWD/../../zeiterfassungguilib +DEPENDPATH += $$PWD/../../zeiterfassungguilib DEFINES += QT_DEPRECATED_WARNINGS QT_DISABLE_DEPRECATED_BEFORE=0x060000 QT_MESSAGELOGCONTEXT diff --git a/zeiterfassung.pro b/zeiterfassung.pro index 337265b..dba4b08 100644 --- a/zeiterfassung.pro +++ b/zeiterfassung.pro @@ -2,7 +2,7 @@ TEMPLATE = subdirs SUBDIRS += plugins \ zeiterfassung \ - zeiterfassunglib + zeiterfassungguilib -plugins.depends += zeiterfassunglib -zeiterfassung.depends += zeiterfassunglib +plugins.depends += zeiterfassungguilib +zeiterfassung.depends += zeiterfassungguilib diff --git a/zeiterfassung/installs.pri b/zeiterfassung/installs.pri index 7782a92..6f8b73d 100644 --- a/zeiterfassung/installs.pri +++ b/zeiterfassung/installs.pri @@ -12,8 +12,8 @@ COMPILED_TRANSLATIONS += $$[QT_INSTALL_TRANSLATIONS]/qt_en.qm \ $$[QT_INSTALL_TRANSLATIONS]/qtxmlpatterns_de.qm \ $${OUT_PWD}/translations/zeiterfassung_en.qm \ $${OUT_PWD}/translations/zeiterfassung_de.qm \ - $${OUT_PWD}/../zeiterfassunglib/translations/zeiterfassunglib_en.qm \ - $${OUT_PWD}/../zeiterfassunglib/translations/zeiterfassunglib_de.qm + $${OUT_PWD}/../zeiterfassungguilib/translations/zeiterfassungguilib_en.qm \ + $${OUT_PWD}/../zeiterfassungguilib/translations/zeiterfassungguilib_de.qm copy_compiled_translations.input = COMPILED_TRANSLATIONS copy_compiled_translations.output = $${DESTDIR}/translations/${QMAKE_FILE_BASE}${QMAKE_FILE_EXT} diff --git a/zeiterfassung/installs_win32.pri b/zeiterfassung/installs_win32.pri index a953930..3344a13 100644 --- a/zeiterfassung/installs_win32.pri +++ b/zeiterfassung/installs_win32.pri @@ -1,7 +1,7 @@ CONFIG(debug, release|debug): DEBUG_SIGN = d LIBRARIES += win32/Qt.conf \ - $$OUT_PWD/../lib/zeiterfassunglib.dll \ + $$OUT_PWD/../lib/zeiterfassungguilib.dll \ $$[QT_INSTALL_BINS]/Qt5Core$${DEBUG_SIGN}.dll \ $$[QT_INSTALL_BINS]/Qt5Gui$${DEBUG_SIGN}.dll \ $$[QT_INSTALL_BINS]/Qt5Network$${DEBUG_SIGN}.dll \ diff --git a/zeiterfassung/main.cpp b/zeiterfassung/main.cpp index c506f17..4b6c39a 100755 --- a/zeiterfassung/main.cpp +++ b/zeiterfassung/main.cpp @@ -29,7 +29,7 @@ struct { QTranslator qtTranslator; QTranslator zeiterfassungTranslator; - QTranslator zeiterfassunglibTranslator; + QTranslator zeiterfassungguilibTranslator; } translators; QVector plugins; @@ -80,7 +80,7 @@ bool loadTranslations(QSplashScreen &splashScreen, ZeiterfassungSettings &settin loadAndInstallTranslator(translators.qtTranslator, QStringLiteral("qt")); loadAndInstallTranslator(translators.zeiterfassungTranslator, QStringLiteral("zeiterfassung")); - loadAndInstallTranslator(translators.zeiterfassunglibTranslator, QStringLiteral("zeiterfassunglib")); + loadAndInstallTranslator(translators.zeiterfassungguilibTranslator, QStringLiteral("zeiterfassungguilib")); return true; } diff --git a/zeiterfassung/zeiterfassung.pro b/zeiterfassung/zeiterfassung.pro index c4d583b..7502644 100755 --- a/zeiterfassung/zeiterfassung.pro +++ b/zeiterfassung/zeiterfassung.pro @@ -8,10 +8,10 @@ CONFIG -= app_bundle DESTDIR = $${OUT_PWD}/../bin -LIBS += -L$$OUT_PWD/../lib -lzeiterfassunglib +LIBS += -L$$OUT_PWD/../lib -lzeiterfassungguilib -INCLUDEPATH += $$PWD/../zeiterfassunglib -DEPENDPATH += $$PWD/../zeiterfassunglib +INCLUDEPATH += $$PWD/../zeiterfassungguilib +DEPENDPATH += $$PWD/../zeiterfassungguilib DEFINES += QT_DEPRECATED_WARNINGS QT_DISABLE_DEPRECATED_BEFORE=0x060000 QT_MESSAGELOGCONTEXT diff --git a/zeiterfassunglib/cpp14polyfills.h b/zeiterfassungguilib/cpp14polyfills.h similarity index 100% rename from zeiterfassunglib/cpp14polyfills.h rename to zeiterfassungguilib/cpp14polyfills.h diff --git a/zeiterfassunglib/dialogs/aboutmedialog.cpp b/zeiterfassungguilib/dialogs/aboutmedialog.cpp similarity index 100% rename from zeiterfassunglib/dialogs/aboutmedialog.cpp rename to zeiterfassungguilib/dialogs/aboutmedialog.cpp diff --git a/zeiterfassunglib/dialogs/aboutmedialog.h b/zeiterfassungguilib/dialogs/aboutmedialog.h similarity index 73% rename from zeiterfassunglib/dialogs/aboutmedialog.h rename to zeiterfassungguilib/dialogs/aboutmedialog.h index befbe19..769226b 100644 --- a/zeiterfassunglib/dialogs/aboutmedialog.h +++ b/zeiterfassungguilib/dialogs/aboutmedialog.h @@ -2,12 +2,12 @@ #include -#include "zeiterfassunglib_global.h" +#include "zeiterfassungguilib_global.h" #include "replies/getuserinforeply.h" namespace Ui { class AboutMeDialog; } -class ZEITERFASSUNGLIBSHARED_EXPORT AboutMeDialog : public QDialog +class ZEITERFASSUNGGUILIBSHARED_EXPORT AboutMeDialog : public QDialog { Q_OBJECT diff --git a/zeiterfassunglib/dialogs/aboutmedialog.ui b/zeiterfassungguilib/dialogs/aboutmedialog.ui similarity index 100% rename from zeiterfassunglib/dialogs/aboutmedialog.ui rename to zeiterfassungguilib/dialogs/aboutmedialog.ui diff --git a/zeiterfassunglib/dialogs/authenticationdialog.cpp b/zeiterfassungguilib/dialogs/authenticationdialog.cpp similarity index 100% rename from zeiterfassunglib/dialogs/authenticationdialog.cpp rename to zeiterfassungguilib/dialogs/authenticationdialog.cpp diff --git a/zeiterfassunglib/dialogs/authenticationdialog.h b/zeiterfassungguilib/dialogs/authenticationdialog.h similarity index 77% rename from zeiterfassunglib/dialogs/authenticationdialog.h rename to zeiterfassungguilib/dialogs/authenticationdialog.h index 0c8cd6e..f294ccc 100644 --- a/zeiterfassunglib/dialogs/authenticationdialog.h +++ b/zeiterfassungguilib/dialogs/authenticationdialog.h @@ -2,13 +2,13 @@ #include -#include "zeiterfassunglib_global.h" +#include "zeiterfassungguilib_global.h" namespace Ui { class AuthenticationDialog; } -class ZEITERFASSUNGLIBSHARED_EXPORT AuthenticationDialog : public QDialog +class ZEITERFASSUNGGUILIBSHARED_EXPORT AuthenticationDialog : public QDialog { Q_OBJECT diff --git a/zeiterfassunglib/dialogs/authenticationdialog.ui b/zeiterfassungguilib/dialogs/authenticationdialog.ui similarity index 96% rename from zeiterfassunglib/dialogs/authenticationdialog.ui rename to zeiterfassungguilib/dialogs/authenticationdialog.ui index e25c84a..7a35741 100644 --- a/zeiterfassunglib/dialogs/authenticationdialog.ui +++ b/zeiterfassungguilib/dialogs/authenticationdialog.ui @@ -37,7 +37,7 @@ - :/zeiterfassung/zeiterfassunglib/images/authentication.png + :/zeiterfassungguilib/images/authentication.png true diff --git a/zeiterfassunglib/dialogs/languageselectiondialog.cpp b/zeiterfassungguilib/dialogs/languageselectiondialog.cpp similarity index 100% rename from zeiterfassunglib/dialogs/languageselectiondialog.cpp rename to zeiterfassungguilib/dialogs/languageselectiondialog.cpp diff --git a/zeiterfassunglib/dialogs/languageselectiondialog.h b/zeiterfassungguilib/dialogs/languageselectiondialog.h similarity index 75% rename from zeiterfassunglib/dialogs/languageselectiondialog.h rename to zeiterfassungguilib/dialogs/languageselectiondialog.h index 21c216b..121e177 100644 --- a/zeiterfassunglib/dialogs/languageselectiondialog.h +++ b/zeiterfassungguilib/dialogs/languageselectiondialog.h @@ -3,11 +3,11 @@ #include #include -#include "zeiterfassunglib_global.h" +#include "zeiterfassungguilib_global.h" namespace Ui { class LanguageSelectionDialog; } -class ZEITERFASSUNGLIBSHARED_EXPORT LanguageSelectionDialog : public QDialog +class ZEITERFASSUNGGUILIBSHARED_EXPORT LanguageSelectionDialog : public QDialog { Q_OBJECT diff --git a/zeiterfassunglib/dialogs/languageselectiondialog.ui b/zeiterfassungguilib/dialogs/languageselectiondialog.ui similarity index 100% rename from zeiterfassunglib/dialogs/languageselectiondialog.ui rename to zeiterfassungguilib/dialogs/languageselectiondialog.ui diff --git a/zeiterfassunglib/dialogs/settingsdialog.cpp b/zeiterfassungguilib/dialogs/settingsdialog.cpp similarity index 100% rename from zeiterfassunglib/dialogs/settingsdialog.cpp rename to zeiterfassungguilib/dialogs/settingsdialog.cpp diff --git a/zeiterfassunglib/dialogs/settingsdialog.h b/zeiterfassungguilib/dialogs/settingsdialog.h similarity index 76% rename from zeiterfassunglib/dialogs/settingsdialog.h rename to zeiterfassungguilib/dialogs/settingsdialog.h index 150beed..bec947a 100644 --- a/zeiterfassunglib/dialogs/settingsdialog.h +++ b/zeiterfassungguilib/dialogs/settingsdialog.h @@ -2,12 +2,12 @@ #include -#include "zeiterfassunglib_global.h" +#include "zeiterfassungguilib_global.h" class ZeiterfassungSettings; namespace Ui { class SettingsDialog; } -class ZEITERFASSUNGLIBSHARED_EXPORT SettingsDialog : public QDialog +class ZEITERFASSUNGGUILIBSHARED_EXPORT SettingsDialog : public QDialog { Q_OBJECT diff --git a/zeiterfassunglib/dialogs/settingsdialog.ui b/zeiterfassungguilib/dialogs/settingsdialog.ui similarity index 100% rename from zeiterfassunglib/dialogs/settingsdialog.ui rename to zeiterfassungguilib/dialogs/settingsdialog.ui diff --git a/zeiterfassunglib/images/about.png b/zeiterfassungguilib/images/about.png similarity index 100% rename from zeiterfassunglib/images/about.png rename to zeiterfassungguilib/images/about.png diff --git a/zeiterfassunglib/images/authentication.png b/zeiterfassungguilib/images/authentication.png similarity index 100% rename from zeiterfassunglib/images/authentication.png rename to zeiterfassungguilib/images/authentication.png diff --git a/zeiterfassunglib/images/help.png b/zeiterfassungguilib/images/help.png similarity index 100% rename from zeiterfassunglib/images/help.png rename to zeiterfassungguilib/images/help.png diff --git a/zeiterfassunglib/images/icon.png b/zeiterfassungguilib/images/icon.png similarity index 100% rename from zeiterfassunglib/images/icon.png rename to zeiterfassungguilib/images/icon.png diff --git a/zeiterfassunglib/images/next.png b/zeiterfassungguilib/images/next.png similarity index 100% rename from zeiterfassunglib/images/next.png rename to zeiterfassungguilib/images/next.png diff --git a/zeiterfassunglib/images/now.png b/zeiterfassungguilib/images/now.png similarity index 100% rename from zeiterfassunglib/images/now.png rename to zeiterfassungguilib/images/now.png diff --git a/zeiterfassunglib/images/previous.png b/zeiterfassungguilib/images/previous.png similarity index 100% rename from zeiterfassunglib/images/previous.png rename to zeiterfassungguilib/images/previous.png diff --git a/zeiterfassunglib/images/quit.png b/zeiterfassungguilib/images/quit.png similarity index 100% rename from zeiterfassunglib/images/quit.png rename to zeiterfassungguilib/images/quit.png diff --git a/zeiterfassunglib/images/refresh.png b/zeiterfassungguilib/images/refresh.png similarity index 100% rename from zeiterfassunglib/images/refresh.png rename to zeiterfassungguilib/images/refresh.png diff --git a/zeiterfassunglib/images/settings.png b/zeiterfassungguilib/images/settings.png similarity index 100% rename from zeiterfassunglib/images/settings.png rename to zeiterfassungguilib/images/settings.png diff --git a/zeiterfassunglib/images/today.png b/zeiterfassungguilib/images/today.png similarity index 100% rename from zeiterfassunglib/images/today.png rename to zeiterfassungguilib/images/today.png diff --git a/zeiterfassunglib/images/user.png b/zeiterfassungguilib/images/user.png similarity index 100% rename from zeiterfassunglib/images/user.png rename to zeiterfassungguilib/images/user.png diff --git a/zeiterfassunglib/mainwindow.cpp b/zeiterfassungguilib/mainwindow.cpp similarity index 100% rename from zeiterfassunglib/mainwindow.cpp rename to zeiterfassungguilib/mainwindow.cpp diff --git a/zeiterfassunglib/mainwindow.h b/zeiterfassungguilib/mainwindow.h similarity index 94% rename from zeiterfassunglib/mainwindow.h rename to zeiterfassungguilib/mainwindow.h index cfe851b..a6e5a5b 100644 --- a/zeiterfassunglib/mainwindow.h +++ b/zeiterfassungguilib/mainwindow.h @@ -5,7 +5,7 @@ #include #include -#include "zeiterfassunglib_global.h" +#include "zeiterfassungguilib_global.h" #include "replies/getuserinforeply.h" #include "replies/getprojectsreply.h" #include "replies/getpresencestatusreply.h" @@ -20,7 +20,7 @@ class ZeiterfassungSettings; class StripFactory; class StripsWidget; -class ZEITERFASSUNGLIBSHARED_EXPORT MainWindow : public QMainWindow +class ZEITERFASSUNGGUILIBSHARED_EXPORT MainWindow : public QMainWindow { Q_OBJECT diff --git a/zeiterfassunglib/mainwindow.ui b/zeiterfassungguilib/mainwindow.ui similarity index 84% rename from zeiterfassunglib/mainwindow.ui rename to zeiterfassungguilib/mainwindow.ui index f6d5d36..71f4aeb 100644 --- a/zeiterfassunglib/mainwindow.ui +++ b/zeiterfassungguilib/mainwindow.ui @@ -12,7 +12,7 @@ - :/zeiterfassung/zeiterfassunglib/images/icon.png:/zeiterfassung/zeiterfassunglib/images/icon.png + :/zeiterfassungguilib/images/icon.png:/zeiterfassungguilib/images/icon.png @@ -31,7 +31,7 @@ - :/zeiterfassung/zeiterfassunglib/images/previous.png:/zeiterfassung/zeiterfassunglib/images/previous.png + :/zeiterfassungguilib/images/previous.png:/zeiterfassungguilib/images/previous.png @@ -45,7 +45,7 @@ - :/zeiterfassung/zeiterfassunglib/images/next.png:/zeiterfassung/zeiterfassunglib/images/next.png + :/zeiterfassungguilib/images/next.png:/zeiterfassungguilib/images/next.png @@ -75,7 +75,7 @@ - :/zeiterfassung/zeiterfassunglib/images/now.png:/zeiterfassung/zeiterfassunglib/images/now.png + :/zeiterfassungguilib/images/now.png:/zeiterfassungguilib/images/now.png @@ -249,7 +249,7 @@ - :/zeiterfassung/zeiterfassunglib/images/quit.png:/zeiterfassung/zeiterfassunglib/images/quit.png + :/zeiterfassungguilib/images/quit.png:/zeiterfassungguilib/images/quit.png &Quit @@ -258,7 +258,7 @@ - :/zeiterfassung/zeiterfassunglib/images/user.png:/zeiterfassung/zeiterfassunglib/images/user.png + :/zeiterfassungguilib/images/user.png:/zeiterfassungguilib/images/user.png About &Me @@ -267,7 +267,7 @@ - :/zeiterfassung/zeiterfassunglib/images/about.png:/zeiterfassung/zeiterfassunglib/images/about.png + :/zeiterfassungguilib/images/about.png:/zeiterfassungguilib/images/about.png About &zeiterfassung @@ -281,7 +281,7 @@ - :/zeiterfassung/zeiterfassunglib/images/today.png:/zeiterfassung/zeiterfassunglib/images/today.png + :/zeiterfassungguilib/images/today.png:/zeiterfassungguilib/images/today.png &Today @@ -290,7 +290,7 @@ - :/zeiterfassung/zeiterfassunglib/images/refresh.png:/zeiterfassung/zeiterfassunglib/images/refresh.png + :/zeiterfassungguilib/images/refresh.png:/zeiterfassungguilib/images/refresh.png &Refresh everything @@ -299,7 +299,7 @@ - :/zeiterfassung/zeiterfassunglib/images/settings.png:/zeiterfassung/zeiterfassunglib/images/settings.png + :/zeiterfassungguilib/images/settings.png:/zeiterfassungguilib/images/settings.png &Settings @@ -308,7 +308,7 @@ - :/zeiterfassung/zeiterfassunglib/images/help.png:/zeiterfassung/zeiterfassunglib/images/help.png + :/zeiterfassungguilib/images/help.png:/zeiterfassungguilib/images/help.png Help diff --git a/zeiterfassunglib/replies/createbookingreply.cpp b/zeiterfassungguilib/replies/createbookingreply.cpp similarity index 100% rename from zeiterfassunglib/replies/createbookingreply.cpp rename to zeiterfassungguilib/replies/createbookingreply.cpp diff --git a/zeiterfassunglib/replies/createbookingreply.h b/zeiterfassungguilib/replies/createbookingreply.h similarity index 71% rename from zeiterfassunglib/replies/createbookingreply.h rename to zeiterfassungguilib/replies/createbookingreply.h index a7b0fb4..f179041 100644 --- a/zeiterfassunglib/replies/createbookingreply.h +++ b/zeiterfassungguilib/replies/createbookingreply.h @@ -4,10 +4,10 @@ #include -#include "zeiterfassunglib_global.h" +#include "zeiterfassungguilib_global.h" #include "zeiterfassungreply.h" -class ZEITERFASSUNGLIBSHARED_EXPORT CreateBookingReply : public ZeiterfassungReply +class ZEITERFASSUNGGUILIBSHARED_EXPORT CreateBookingReply : public ZeiterfassungReply { Q_OBJECT diff --git a/zeiterfassunglib/replies/createtimeassignmentreply.cpp b/zeiterfassungguilib/replies/createtimeassignmentreply.cpp similarity index 100% rename from zeiterfassunglib/replies/createtimeassignmentreply.cpp rename to zeiterfassungguilib/replies/createtimeassignmentreply.cpp diff --git a/zeiterfassunglib/replies/createtimeassignmentreply.h b/zeiterfassungguilib/replies/createtimeassignmentreply.h similarity index 74% rename from zeiterfassunglib/replies/createtimeassignmentreply.h rename to zeiterfassungguilib/replies/createtimeassignmentreply.h index baa7827..efbf1e7 100644 --- a/zeiterfassunglib/replies/createtimeassignmentreply.h +++ b/zeiterfassungguilib/replies/createtimeassignmentreply.h @@ -4,10 +4,10 @@ #include -#include "zeiterfassunglib_global.h" +#include "zeiterfassungguilib_global.h" #include "zeiterfassungreply.h" -class ZEITERFASSUNGLIBSHARED_EXPORT CreateTimeAssignmentReply : public ZeiterfassungReply +class ZEITERFASSUNGGUILIBSHARED_EXPORT CreateTimeAssignmentReply : public ZeiterfassungReply { Q_OBJECT diff --git a/zeiterfassunglib/replies/deletebookingreply.cpp b/zeiterfassungguilib/replies/deletebookingreply.cpp similarity index 100% rename from zeiterfassunglib/replies/deletebookingreply.cpp rename to zeiterfassungguilib/replies/deletebookingreply.cpp diff --git a/zeiterfassunglib/replies/deletebookingreply.h b/zeiterfassungguilib/replies/deletebookingreply.h similarity index 71% rename from zeiterfassunglib/replies/deletebookingreply.h rename to zeiterfassungguilib/replies/deletebookingreply.h index fab6e07..755bd5b 100644 --- a/zeiterfassunglib/replies/deletebookingreply.h +++ b/zeiterfassungguilib/replies/deletebookingreply.h @@ -4,10 +4,10 @@ #include -#include "zeiterfassunglib_global.h" +#include "zeiterfassungguilib_global.h" #include "zeiterfassungreply.h" -class ZEITERFASSUNGLIBSHARED_EXPORT DeleteBookingReply : public ZeiterfassungReply +class ZEITERFASSUNGGUILIBSHARED_EXPORT DeleteBookingReply : public ZeiterfassungReply { Q_OBJECT diff --git a/zeiterfassunglib/replies/deletetimeassignmentreply.cpp b/zeiterfassungguilib/replies/deletetimeassignmentreply.cpp similarity index 100% rename from zeiterfassunglib/replies/deletetimeassignmentreply.cpp rename to zeiterfassungguilib/replies/deletetimeassignmentreply.cpp diff --git a/zeiterfassunglib/replies/deletetimeassignmentreply.h b/zeiterfassungguilib/replies/deletetimeassignmentreply.h similarity index 70% rename from zeiterfassunglib/replies/deletetimeassignmentreply.h rename to zeiterfassungguilib/replies/deletetimeassignmentreply.h index 3d380f2..1d33bd2 100644 --- a/zeiterfassunglib/replies/deletetimeassignmentreply.h +++ b/zeiterfassungguilib/replies/deletetimeassignmentreply.h @@ -4,10 +4,10 @@ #include -#include "zeiterfassunglib_global.h" +#include "zeiterfassungguilib_global.h" #include "zeiterfassungreply.h" -class ZEITERFASSUNGLIBSHARED_EXPORT DeleteTimeAssignmentReply : public ZeiterfassungReply +class ZEITERFASSUNGGUILIBSHARED_EXPORT DeleteTimeAssignmentReply : public ZeiterfassungReply { Q_OBJECT diff --git a/zeiterfassunglib/replies/getbookingsreply.cpp b/zeiterfassungguilib/replies/getbookingsreply.cpp similarity index 100% rename from zeiterfassunglib/replies/getbookingsreply.cpp rename to zeiterfassungguilib/replies/getbookingsreply.cpp diff --git a/zeiterfassunglib/replies/getbookingsreply.h b/zeiterfassungguilib/replies/getbookingsreply.h similarity index 82% rename from zeiterfassunglib/replies/getbookingsreply.h rename to zeiterfassungguilib/replies/getbookingsreply.h index e6b83be..90974a1 100644 --- a/zeiterfassunglib/replies/getbookingsreply.h +++ b/zeiterfassungguilib/replies/getbookingsreply.h @@ -5,12 +5,12 @@ #include #include -#include "zeiterfassunglib_global.h" +#include "zeiterfassungguilib_global.h" #include "zeiterfassungreply.h" class ZeiterfassungApi; -class ZEITERFASSUNGLIBSHARED_EXPORT GetBookingsReply : public ZeiterfassungReply +class ZEITERFASSUNGGUILIBSHARED_EXPORT GetBookingsReply : public ZeiterfassungReply { Q_OBJECT diff --git a/zeiterfassunglib/replies/getpresencestatusreply.cpp b/zeiterfassungguilib/replies/getpresencestatusreply.cpp similarity index 100% rename from zeiterfassunglib/replies/getpresencestatusreply.cpp rename to zeiterfassungguilib/replies/getpresencestatusreply.cpp diff --git a/zeiterfassunglib/replies/getpresencestatusreply.h b/zeiterfassungguilib/replies/getpresencestatusreply.h similarity index 82% rename from zeiterfassunglib/replies/getpresencestatusreply.h rename to zeiterfassungguilib/replies/getpresencestatusreply.h index 73fdf65..3c12ae6 100644 --- a/zeiterfassunglib/replies/getpresencestatusreply.h +++ b/zeiterfassungguilib/replies/getpresencestatusreply.h @@ -4,12 +4,12 @@ #include -#include "zeiterfassunglib_global.h" +#include "zeiterfassungguilib_global.h" #include "zeiterfassungreply.h" class ZeiterfassungApi; -class ZEITERFASSUNGLIBSHARED_EXPORT GetPresenceStatusReply : public ZeiterfassungReply +class ZEITERFASSUNGGUILIBSHARED_EXPORT GetPresenceStatusReply : public ZeiterfassungReply { Q_OBJECT diff --git a/zeiterfassunglib/replies/getprojectsreply.cpp b/zeiterfassungguilib/replies/getprojectsreply.cpp similarity index 100% rename from zeiterfassunglib/replies/getprojectsreply.cpp rename to zeiterfassungguilib/replies/getprojectsreply.cpp diff --git a/zeiterfassunglib/replies/getprojectsreply.h b/zeiterfassungguilib/replies/getprojectsreply.h similarity index 80% rename from zeiterfassunglib/replies/getprojectsreply.h rename to zeiterfassungguilib/replies/getprojectsreply.h index 8081bf9..2461baf 100644 --- a/zeiterfassunglib/replies/getprojectsreply.h +++ b/zeiterfassungguilib/replies/getprojectsreply.h @@ -5,12 +5,12 @@ #include #include -#include "zeiterfassunglib_global.h" +#include "zeiterfassungguilib_global.h" #include "zeiterfassungreply.h" class ZeiterfassungApi; -class ZEITERFASSUNGLIBSHARED_EXPORT GetProjectsReply : public ZeiterfassungReply +class ZEITERFASSUNGGUILIBSHARED_EXPORT GetProjectsReply : public ZeiterfassungReply { Q_OBJECT diff --git a/zeiterfassunglib/replies/getreportreply.cpp b/zeiterfassungguilib/replies/getreportreply.cpp similarity index 100% rename from zeiterfassunglib/replies/getreportreply.cpp rename to zeiterfassungguilib/replies/getreportreply.cpp diff --git a/zeiterfassunglib/replies/getreportreply.h b/zeiterfassungguilib/replies/getreportreply.h similarity index 77% rename from zeiterfassunglib/replies/getreportreply.h rename to zeiterfassungguilib/replies/getreportreply.h index f6d8b3d..b2de3bf 100644 --- a/zeiterfassunglib/replies/getreportreply.h +++ b/zeiterfassungguilib/replies/getreportreply.h @@ -5,10 +5,10 @@ #include #include -#include "zeiterfassunglib_global.h" +#include "zeiterfassungguilib_global.h" #include "zeiterfassungreply.h" -class ZEITERFASSUNGLIBSHARED_EXPORT GetReportReply : public ZeiterfassungReply +class ZEITERFASSUNGGUILIBSHARED_EXPORT GetReportReply : public ZeiterfassungReply { Q_OBJECT diff --git a/zeiterfassunglib/replies/gettimeassignmentsreply.cpp b/zeiterfassungguilib/replies/gettimeassignmentsreply.cpp similarity index 100% rename from zeiterfassunglib/replies/gettimeassignmentsreply.cpp rename to zeiterfassungguilib/replies/gettimeassignmentsreply.cpp diff --git a/zeiterfassunglib/replies/gettimeassignmentsreply.h b/zeiterfassungguilib/replies/gettimeassignmentsreply.h similarity index 84% rename from zeiterfassunglib/replies/gettimeassignmentsreply.h rename to zeiterfassungguilib/replies/gettimeassignmentsreply.h index 2483202..4b32d85 100644 --- a/zeiterfassunglib/replies/gettimeassignmentsreply.h +++ b/zeiterfassungguilib/replies/gettimeassignmentsreply.h @@ -5,12 +5,12 @@ #include #include -#include "zeiterfassunglib_global.h" +#include "zeiterfassungguilib_global.h" #include "zeiterfassungreply.h" class ZeiterfassungApi; -class ZEITERFASSUNGLIBSHARED_EXPORT GetTimeAssignmentsReply : public ZeiterfassungReply +class ZEITERFASSUNGGUILIBSHARED_EXPORT GetTimeAssignmentsReply : public ZeiterfassungReply { Q_OBJECT diff --git a/zeiterfassunglib/replies/getuserinforeply.cpp b/zeiterfassungguilib/replies/getuserinforeply.cpp similarity index 100% rename from zeiterfassunglib/replies/getuserinforeply.cpp rename to zeiterfassungguilib/replies/getuserinforeply.cpp diff --git a/zeiterfassunglib/replies/getuserinforeply.h b/zeiterfassungguilib/replies/getuserinforeply.h similarity index 88% rename from zeiterfassunglib/replies/getuserinforeply.h rename to zeiterfassungguilib/replies/getuserinforeply.h index 7e0cd64..e816611 100644 --- a/zeiterfassunglib/replies/getuserinforeply.h +++ b/zeiterfassungguilib/replies/getuserinforeply.h @@ -4,12 +4,12 @@ #include -#include "zeiterfassunglib_global.h" +#include "zeiterfassungguilib_global.h" #include "zeiterfassungreply.h" class ZeiterfassungApi; -class ZEITERFASSUNGLIBSHARED_EXPORT GetUserInfoReply : public ZeiterfassungReply +class ZEITERFASSUNGGUILIBSHARED_EXPORT GetUserInfoReply : public ZeiterfassungReply { Q_OBJECT diff --git a/zeiterfassunglib/replies/loginpagereply.cpp b/zeiterfassungguilib/replies/loginpagereply.cpp similarity index 100% rename from zeiterfassunglib/replies/loginpagereply.cpp rename to zeiterfassungguilib/replies/loginpagereply.cpp diff --git a/zeiterfassunglib/replies/loginpagereply.h b/zeiterfassungguilib/replies/loginpagereply.h similarity index 71% rename from zeiterfassunglib/replies/loginpagereply.h rename to zeiterfassungguilib/replies/loginpagereply.h index 9a09a78..6ade4ce 100644 --- a/zeiterfassunglib/replies/loginpagereply.h +++ b/zeiterfassungguilib/replies/loginpagereply.h @@ -4,10 +4,10 @@ #include -#include "zeiterfassunglib_global.h" +#include "zeiterfassungguilib_global.h" #include "zeiterfassungreply.h" -class ZEITERFASSUNGLIBSHARED_EXPORT LoginPageReply : public ZeiterfassungReply +class ZEITERFASSUNGGUILIBSHARED_EXPORT LoginPageReply : public ZeiterfassungReply { Q_OBJECT diff --git a/zeiterfassunglib/replies/loginreply.cpp b/zeiterfassungguilib/replies/loginreply.cpp similarity index 100% rename from zeiterfassunglib/replies/loginreply.cpp rename to zeiterfassungguilib/replies/loginreply.cpp diff --git a/zeiterfassunglib/replies/loginreply.h b/zeiterfassungguilib/replies/loginreply.h similarity index 72% rename from zeiterfassunglib/replies/loginreply.h rename to zeiterfassungguilib/replies/loginreply.h index 817e799..10e7d6e 100644 --- a/zeiterfassunglib/replies/loginreply.h +++ b/zeiterfassungguilib/replies/loginreply.h @@ -4,10 +4,10 @@ #include -#include "zeiterfassunglib_global.h" +#include "zeiterfassungguilib_global.h" #include "zeiterfassungreply.h" -class ZEITERFASSUNGLIBSHARED_EXPORT LoginReply : public ZeiterfassungReply +class ZEITERFASSUNGGUILIBSHARED_EXPORT LoginReply : public ZeiterfassungReply { Q_OBJECT diff --git a/zeiterfassunglib/replies/updatebookingreply.cpp b/zeiterfassungguilib/replies/updatebookingreply.cpp similarity index 100% rename from zeiterfassunglib/replies/updatebookingreply.cpp rename to zeiterfassungguilib/replies/updatebookingreply.cpp diff --git a/zeiterfassunglib/replies/updatebookingreply.h b/zeiterfassungguilib/replies/updatebookingreply.h similarity index 72% rename from zeiterfassunglib/replies/updatebookingreply.h rename to zeiterfassungguilib/replies/updatebookingreply.h index c3f09bb..295f927 100644 --- a/zeiterfassunglib/replies/updatebookingreply.h +++ b/zeiterfassungguilib/replies/updatebookingreply.h @@ -4,10 +4,10 @@ #include -#include "zeiterfassunglib_global.h" +#include "zeiterfassungguilib_global.h" #include "zeiterfassungreply.h" -class ZEITERFASSUNGLIBSHARED_EXPORT UpdateBookingReply : public ZeiterfassungReply +class ZEITERFASSUNGGUILIBSHARED_EXPORT UpdateBookingReply : public ZeiterfassungReply { Q_OBJECT diff --git a/zeiterfassunglib/replies/updatetimeassignmentreply.cpp b/zeiterfassungguilib/replies/updatetimeassignmentreply.cpp similarity index 100% rename from zeiterfassunglib/replies/updatetimeassignmentreply.cpp rename to zeiterfassungguilib/replies/updatetimeassignmentreply.cpp diff --git a/zeiterfassunglib/replies/updatetimeassignmentreply.h b/zeiterfassungguilib/replies/updatetimeassignmentreply.h similarity index 74% rename from zeiterfassunglib/replies/updatetimeassignmentreply.h rename to zeiterfassungguilib/replies/updatetimeassignmentreply.h index 1ea264b..a6d9872 100644 --- a/zeiterfassunglib/replies/updatetimeassignmentreply.h +++ b/zeiterfassungguilib/replies/updatetimeassignmentreply.h @@ -4,10 +4,10 @@ #include -#include "zeiterfassunglib_global.h" +#include "zeiterfassungguilib_global.h" #include "zeiterfassungreply.h" -class ZEITERFASSUNGLIBSHARED_EXPORT UpdateTimeAssignmentReply : public ZeiterfassungReply +class ZEITERFASSUNGGUILIBSHARED_EXPORT UpdateTimeAssignmentReply : public ZeiterfassungReply { Q_OBJECT diff --git a/zeiterfassunglib/replies/zeiterfassungreply.cpp b/zeiterfassungguilib/replies/zeiterfassungreply.cpp similarity index 100% rename from zeiterfassunglib/replies/zeiterfassungreply.cpp rename to zeiterfassungguilib/replies/zeiterfassungreply.cpp diff --git a/zeiterfassunglib/replies/zeiterfassungreply.h b/zeiterfassungguilib/replies/zeiterfassungreply.h similarity index 81% rename from zeiterfassunglib/replies/zeiterfassungreply.h rename to zeiterfassungguilib/replies/zeiterfassungreply.h index 450263a..a278db4 100644 --- a/zeiterfassunglib/replies/zeiterfassungreply.h +++ b/zeiterfassungguilib/replies/zeiterfassungreply.h @@ -2,11 +2,11 @@ #include -#include "zeiterfassunglib_global.h" +#include "zeiterfassungguilib_global.h" class ZeiterfassungApi; -class ZEITERFASSUNGLIBSHARED_EXPORT ZeiterfassungReply : public QObject +class ZEITERFASSUNGGUILIBSHARED_EXPORT ZeiterfassungReply : public QObject { Q_OBJECT diff --git a/zeiterfassunglib/stripfactory.cpp b/zeiterfassungguilib/stripfactory.cpp similarity index 100% rename from zeiterfassunglib/stripfactory.cpp rename to zeiterfassungguilib/stripfactory.cpp diff --git a/zeiterfassunglib/stripfactory.h b/zeiterfassungguilib/stripfactory.h similarity index 86% rename from zeiterfassunglib/stripfactory.h rename to zeiterfassungguilib/stripfactory.h index f47723f..8a8deef 100644 --- a/zeiterfassunglib/stripfactory.h +++ b/zeiterfassungguilib/stripfactory.h @@ -5,12 +5,12 @@ #include #include -#include "zeiterfassunglib_global.h" +#include "zeiterfassungguilib_global.h" class QUiLoader; class QByteArray; -class ZEITERFASSUNGLIBSHARED_EXPORT StripFactory : public QObject +class ZEITERFASSUNGGUILIBSHARED_EXPORT StripFactory : public QObject { Q_OBJECT diff --git a/zeiterfassunglib/stripswidget.cpp b/zeiterfassungguilib/stripswidget.cpp similarity index 100% rename from zeiterfassunglib/stripswidget.cpp rename to zeiterfassungguilib/stripswidget.cpp diff --git a/zeiterfassunglib/stripswidget.h b/zeiterfassungguilib/stripswidget.h similarity index 96% rename from zeiterfassunglib/stripswidget.h rename to zeiterfassungguilib/stripswidget.h index 90f69bf..182c9ce 100644 --- a/zeiterfassunglib/stripswidget.h +++ b/zeiterfassungguilib/stripswidget.h @@ -5,7 +5,7 @@ #include #include -#include "zeiterfassunglib_global.h" +#include "zeiterfassungguilib_global.h" #include "replies/getbookingsreply.h" #include "replies/gettimeassignmentsreply.h" @@ -15,7 +15,7 @@ template class QVector; class MainWindow; -class ZEITERFASSUNGLIBSHARED_EXPORT StripsWidget : public QWidget +class ZEITERFASSUNGGUILIBSHARED_EXPORT StripsWidget : public QWidget { Q_OBJECT diff --git a/zeiterfassunglib/timeutils.cpp b/zeiterfassungguilib/timeutils.cpp similarity index 100% rename from zeiterfassunglib/timeutils.cpp rename to zeiterfassungguilib/timeutils.cpp diff --git a/zeiterfassungguilib/timeutils.h b/zeiterfassungguilib/timeutils.h new file mode 100644 index 0000000..00a48e0 --- /dev/null +++ b/zeiterfassungguilib/timeutils.h @@ -0,0 +1,10 @@ +#pragma once + +#include + +#include "zeiterfassungguilib_global.h" + +int ZEITERFASSUNGGUILIBSHARED_EXPORT timeToSeconds(const QTime &time); +QTime ZEITERFASSUNGGUILIBSHARED_EXPORT timeBetween(const QTime &l, const QTime &r); +QTime ZEITERFASSUNGGUILIBSHARED_EXPORT timeAdd(const QTime &l, const QTime &r); +QTime ZEITERFASSUNGGUILIBSHARED_EXPORT timeNormalise(const QTime &time); diff --git a/zeiterfassunglib/translations/zeiterfassunglib_de.ts b/zeiterfassungguilib/translations/zeiterfassungguilib_de.ts similarity index 100% rename from zeiterfassunglib/translations/zeiterfassunglib_de.ts rename to zeiterfassungguilib/translations/zeiterfassungguilib_de.ts diff --git a/zeiterfassunglib/translations/zeiterfassunglib_en.ts b/zeiterfassungguilib/translations/zeiterfassungguilib_en.ts similarity index 100% rename from zeiterfassunglib/translations/zeiterfassunglib_en.ts rename to zeiterfassungguilib/translations/zeiterfassungguilib_en.ts diff --git a/zeiterfassunglib/zeiterfassungapi.cpp b/zeiterfassungguilib/zeiterfassungapi.cpp similarity index 100% rename from zeiterfassunglib/zeiterfassungapi.cpp rename to zeiterfassungguilib/zeiterfassungapi.cpp diff --git a/zeiterfassunglib/zeiterfassungapi.h b/zeiterfassungguilib/zeiterfassungapi.h similarity index 96% rename from zeiterfassunglib/zeiterfassungapi.h rename to zeiterfassungguilib/zeiterfassungapi.h index b50b62c..c4bce45 100644 --- a/zeiterfassunglib/zeiterfassungapi.h +++ b/zeiterfassungguilib/zeiterfassungapi.h @@ -7,7 +7,7 @@ #include #include -#include "zeiterfassunglib_global.h" +#include "zeiterfassungguilib_global.h" class QNetworkAccessManager; @@ -26,7 +26,7 @@ class GetProjectsReply; class GetReportReply; class GetPresenceStatusReply; -class ZEITERFASSUNGLIBSHARED_EXPORT ZeiterfassungApi : public QObject +class ZEITERFASSUNGGUILIBSHARED_EXPORT ZeiterfassungApi : public QObject { Q_OBJECT diff --git a/zeiterfassunglib/zeiterfassunglib.pro b/zeiterfassungguilib/zeiterfassungguilib.pro similarity index 90% rename from zeiterfassunglib/zeiterfassunglib.pro rename to zeiterfassungguilib/zeiterfassungguilib.pro index f69b9d0..27e6778 100644 --- a/zeiterfassunglib/zeiterfassunglib.pro +++ b/zeiterfassungguilib/zeiterfassungguilib.pro @@ -1,6 +1,6 @@ QT += core network gui widgets uitools -TARGET = zeiterfassunglib +TARGET = zeiterfassungguilib TEMPLATE = lib CONFIG += c++14 @@ -8,7 +8,7 @@ CONFIG += c++14 DESTDIR = $${OUT_PWD}/../lib DEFINES += QT_DEPRECATED_WARNINGS QT_DISABLE_DEPRECATED_BEFORE=0x060000 QT_MESSAGELOGCONTEXT -DEFINES += ZEITERFASSUNGLIB_LIBRARY +DEFINES += ZEITERFASSUNGGUILIB_LIBRARY SOURCES += mainwindow.cpp \ stripfactory.cpp \ @@ -43,7 +43,7 @@ HEADERS += cpp14polyfills.h \ stripswidget.h \ timeutils.h \ zeiterfassungapi.h \ - zeiterfassunglib_global.h \ + zeiterfassungguilib_global.h \ zeiterfassungplugin.h \ zeiterfassungsettings.h \ dialogs/aboutmedialog.h \ @@ -72,10 +72,10 @@ FORMS += mainwindow.ui \ dialogs/authenticationdialog.ui \ dialogs/aboutmedialog.ui -RESOURCES += zeiterfassunglib_resources.qrc +RESOURCES += zeiterfassungguilib_resources.qrc -TRANSLATIONS += translations/zeiterfassunglib_en.ts \ - translations/zeiterfassunglib_de.ts +TRANSLATIONS += translations/zeiterfassungguilib_en.ts \ + translations/zeiterfassungguilib_de.ts include(../lrelease.pri) diff --git a/zeiterfassungguilib/zeiterfassungguilib_global.h b/zeiterfassungguilib/zeiterfassungguilib_global.h new file mode 100644 index 0000000..985c61f --- /dev/null +++ b/zeiterfassungguilib/zeiterfassungguilib_global.h @@ -0,0 +1,9 @@ +#pragma once + +#include + +#if defined(ZEITERFASSUNGGUILIB_LIBRARY) +# define ZEITERFASSUNGGUILIBSHARED_EXPORT Q_DECL_EXPORT +#else +# define ZEITERFASSUNGGUILIBSHARED_EXPORT Q_DECL_IMPORT +#endif diff --git a/zeiterfassunglib/zeiterfassunglib_resources.qrc b/zeiterfassungguilib/zeiterfassungguilib_resources.qrc similarity index 89% rename from zeiterfassunglib/zeiterfassunglib_resources.qrc rename to zeiterfassungguilib/zeiterfassungguilib_resources.qrc index 8e0562e..b3f106b 100644 --- a/zeiterfassunglib/zeiterfassunglib_resources.qrc +++ b/zeiterfassungguilib/zeiterfassungguilib_resources.qrc @@ -1,5 +1,5 @@ - + images/about.png images/authentication.png images/help.png diff --git a/zeiterfassunglib/zeiterfassungplugin.cpp b/zeiterfassungguilib/zeiterfassungplugin.cpp similarity index 100% rename from zeiterfassunglib/zeiterfassungplugin.cpp rename to zeiterfassungguilib/zeiterfassungplugin.cpp diff --git a/zeiterfassunglib/zeiterfassungplugin.h b/zeiterfassungguilib/zeiterfassungplugin.h similarity index 73% rename from zeiterfassunglib/zeiterfassungplugin.h rename to zeiterfassungguilib/zeiterfassungplugin.h index 4fac76f..ed50fb2 100644 --- a/zeiterfassunglib/zeiterfassungplugin.h +++ b/zeiterfassungguilib/zeiterfassungplugin.h @@ -2,12 +2,12 @@ #include -#include "zeiterfassunglib_global.h" +#include "zeiterfassungguilib_global.h" class MainWindow; class StripsWidget; -class ZEITERFASSUNGLIBSHARED_EXPORT ZeiterfassungPlugin : public QObject +class ZEITERFASSUNGGUILIBSHARED_EXPORT ZeiterfassungPlugin : public QObject { Q_OBJECT diff --git a/zeiterfassunglib/zeiterfassungsettings.cpp b/zeiterfassungguilib/zeiterfassungsettings.cpp similarity index 100% rename from zeiterfassunglib/zeiterfassungsettings.cpp rename to zeiterfassungguilib/zeiterfassungsettings.cpp diff --git a/zeiterfassunglib/zeiterfassungsettings.h b/zeiterfassungguilib/zeiterfassungsettings.h similarity index 93% rename from zeiterfassunglib/zeiterfassungsettings.h rename to zeiterfassungguilib/zeiterfassungsettings.h index 879fd3e..a919bd0 100644 --- a/zeiterfassunglib/zeiterfassungsettings.h +++ b/zeiterfassungguilib/zeiterfassungsettings.h @@ -6,9 +6,9 @@ #include #include -#include "zeiterfassunglib_global.h" +#include "zeiterfassungguilib_global.h" -class ZEITERFASSUNGLIBSHARED_EXPORT ZeiterfassungSettings : public QSettings +class ZEITERFASSUNGGUILIBSHARED_EXPORT ZeiterfassungSettings : public QSettings { Q_OBJECT diff --git a/zeiterfassunglib/timeutils.h b/zeiterfassunglib/timeutils.h deleted file mode 100644 index 8364352..0000000 --- a/zeiterfassunglib/timeutils.h +++ /dev/null @@ -1,10 +0,0 @@ -#pragma once - -#include - -#include "zeiterfassunglib_global.h" - -int ZEITERFASSUNGLIBSHARED_EXPORT timeToSeconds(const QTime &time); -QTime ZEITERFASSUNGLIBSHARED_EXPORT timeBetween(const QTime &l, const QTime &r); -QTime ZEITERFASSUNGLIBSHARED_EXPORT timeAdd(const QTime &l, const QTime &r); -QTime ZEITERFASSUNGLIBSHARED_EXPORT timeNormalise(const QTime &time); diff --git a/zeiterfassunglib/zeiterfassunglib_global.h b/zeiterfassunglib/zeiterfassunglib_global.h deleted file mode 100644 index 8994853..0000000 --- a/zeiterfassunglib/zeiterfassunglib_global.h +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once - -#include - -#if defined(ZEITERFASSUNGLIB_LIBRARY) -# define ZEITERFASSUNGLIBSHARED_EXPORT Q_DECL_EXPORT -#else -# define ZEITERFASSUNGLIBSHARED_EXPORT Q_DECL_IMPORT -#endif -- 2.50.1 From 27164f42a19c39b14052e20988b4cb51eb9dc690 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Wed, 20 Dec 2017 21:44:41 +0100 Subject: [PATCH 09/78] Added zeiterfassungcorelib --- .../advancedviewplugin/advancedviewplugin.pro | 6 +- plugins/lunchmealplugin/lunchmealplugin.pro | 6 +- plugins/presenceplugin/presenceplugin.pro | 6 +- plugins/reportsplugin/reportsplugin.pro | 6 +- plugins/updaterplugin/updaterplugin.pro | 6 +- plugins/weatherplugin/weatherplugin.pro | 6 +- zeiterfassung.pro | 4 +- zeiterfassung/installs.pri | 2 + zeiterfassung/installs_win32.pri | 1 + zeiterfassung/zeiterfassung.pro | 6 +- .../cpp14polyfills.h | 0 .../replies/createbookingreply.cpp | 0 .../replies/createbookingreply.h | 4 +- .../replies/createtimeassignmentreply.cpp | 0 .../replies/createtimeassignmentreply.h | 4 +- .../replies/deletebookingreply.cpp | 0 .../replies/deletebookingreply.h | 4 +- .../replies/deletetimeassignmentreply.cpp | 0 .../replies/deletetimeassignmentreply.h | 4 +- .../replies/getbookingsreply.cpp | 0 .../replies/getbookingsreply.h | 4 +- .../replies/getpresencestatusreply.cpp | 0 .../replies/getpresencestatusreply.h | 4 +- .../replies/getprojectsreply.cpp | 0 .../replies/getprojectsreply.h | 4 +- .../replies/getreportreply.cpp | 0 .../replies/getreportreply.h | 4 +- .../replies/gettimeassignmentsreply.cpp | 0 .../replies/gettimeassignmentsreply.h | 4 +- .../replies/getuserinforeply.cpp | 0 .../replies/getuserinforeply.h | 4 +- .../replies/loginpagereply.cpp | 0 .../replies/loginpagereply.h | 4 +- .../replies/loginreply.cpp | 0 .../replies/loginreply.h | 4 +- .../replies/updatebookingreply.cpp | 0 .../replies/updatebookingreply.h | 4 +- .../replies/updatetimeassignmentreply.cpp | 0 .../replies/updatetimeassignmentreply.h | 4 +- .../replies/zeiterfassungreply.cpp | 0 .../replies/zeiterfassungreply.h | 4 +- .../timeutils.cpp | 0 zeiterfassungcorelib/timeutils.h | 10 + .../translations/zeiterfassungcorelib_de.ts | 277 +++++++++++++++ .../translations/zeiterfassungcorelib_en.ts | 277 +++++++++++++++ .../zeiterfassungapi.cpp | 0 .../zeiterfassungapi.h | 4 +- zeiterfassungcorelib/zeiterfassungcorelib.pro | 65 ++++ .../zeiterfassungcorelib_global.h | 9 + .../zeiterfassungsettings.cpp | 0 .../zeiterfassungsettings.h | 4 +- zeiterfassungguilib/timeutils.h | 10 - .../translations/zeiterfassungguilib_de.ts | 321 ++---------------- .../translations/zeiterfassungguilib_en.ts | 321 ++---------------- zeiterfassungguilib/zeiterfassungguilib.pro | 48 +-- .../zeiterfassungguilib_global.h | 2 +- 56 files changed, 752 insertions(+), 705 deletions(-) rename {zeiterfassungguilib => zeiterfassungcorelib}/cpp14polyfills.h (100%) rename {zeiterfassungguilib => zeiterfassungcorelib}/replies/createbookingreply.cpp (100%) rename {zeiterfassungguilib => zeiterfassungcorelib}/replies/createbookingreply.h (71%) rename {zeiterfassungguilib => zeiterfassungcorelib}/replies/createtimeassignmentreply.cpp (100%) rename {zeiterfassungguilib => zeiterfassungcorelib}/replies/createtimeassignmentreply.h (74%) rename {zeiterfassungguilib => zeiterfassungcorelib}/replies/deletebookingreply.cpp (100%) rename {zeiterfassungguilib => zeiterfassungcorelib}/replies/deletebookingreply.h (71%) rename {zeiterfassungguilib => zeiterfassungcorelib}/replies/deletetimeassignmentreply.cpp (100%) rename {zeiterfassungguilib => zeiterfassungcorelib}/replies/deletetimeassignmentreply.h (70%) rename {zeiterfassungguilib => zeiterfassungcorelib}/replies/getbookingsreply.cpp (100%) rename {zeiterfassungguilib => zeiterfassungcorelib}/replies/getbookingsreply.h (82%) rename {zeiterfassungguilib => zeiterfassungcorelib}/replies/getpresencestatusreply.cpp (100%) rename {zeiterfassungguilib => zeiterfassungcorelib}/replies/getpresencestatusreply.h (82%) rename {zeiterfassungguilib => zeiterfassungcorelib}/replies/getprojectsreply.cpp (100%) rename {zeiterfassungguilib => zeiterfassungcorelib}/replies/getprojectsreply.h (80%) rename {zeiterfassungguilib => zeiterfassungcorelib}/replies/getreportreply.cpp (100%) rename {zeiterfassungguilib => zeiterfassungcorelib}/replies/getreportreply.h (77%) rename {zeiterfassungguilib => zeiterfassungcorelib}/replies/gettimeassignmentsreply.cpp (100%) rename {zeiterfassungguilib => zeiterfassungcorelib}/replies/gettimeassignmentsreply.h (83%) rename {zeiterfassungguilib => zeiterfassungcorelib}/replies/getuserinforeply.cpp (100%) rename {zeiterfassungguilib => zeiterfassungcorelib}/replies/getuserinforeply.h (88%) rename {zeiterfassungguilib => zeiterfassungcorelib}/replies/loginpagereply.cpp (100%) rename {zeiterfassungguilib => zeiterfassungcorelib}/replies/loginpagereply.h (71%) rename {zeiterfassungguilib => zeiterfassungcorelib}/replies/loginreply.cpp (100%) rename {zeiterfassungguilib => zeiterfassungcorelib}/replies/loginreply.h (71%) rename {zeiterfassungguilib => zeiterfassungcorelib}/replies/updatebookingreply.cpp (100%) rename {zeiterfassungguilib => zeiterfassungcorelib}/replies/updatebookingreply.h (72%) rename {zeiterfassungguilib => zeiterfassungcorelib}/replies/updatetimeassignmentreply.cpp (100%) rename {zeiterfassungguilib => zeiterfassungcorelib}/replies/updatetimeassignmentreply.h (74%) rename {zeiterfassungguilib => zeiterfassungcorelib}/replies/zeiterfassungreply.cpp (100%) rename {zeiterfassungguilib => zeiterfassungcorelib}/replies/zeiterfassungreply.h (81%) rename {zeiterfassungguilib => zeiterfassungcorelib}/timeutils.cpp (100%) create mode 100644 zeiterfassungcorelib/timeutils.h create mode 100644 zeiterfassungcorelib/translations/zeiterfassungcorelib_de.ts create mode 100644 zeiterfassungcorelib/translations/zeiterfassungcorelib_en.ts rename {zeiterfassungguilib => zeiterfassungcorelib}/zeiterfassungapi.cpp (100%) rename {zeiterfassungguilib => zeiterfassungcorelib}/zeiterfassungapi.h (96%) create mode 100644 zeiterfassungcorelib/zeiterfassungcorelib.pro create mode 100644 zeiterfassungcorelib/zeiterfassungcorelib_global.h rename {zeiterfassungguilib => zeiterfassungcorelib}/zeiterfassungsettings.cpp (100%) rename {zeiterfassungguilib => zeiterfassungcorelib}/zeiterfassungsettings.h (93%) delete mode 100644 zeiterfassungguilib/timeutils.h diff --git a/plugins/advancedviewplugin/advancedviewplugin.pro b/plugins/advancedviewplugin/advancedviewplugin.pro index ad05070..58a31f5 100644 --- a/plugins/advancedviewplugin/advancedviewplugin.pro +++ b/plugins/advancedviewplugin/advancedviewplugin.pro @@ -7,10 +7,10 @@ CONFIG += shared c++14 DESTDIR = $${OUT_PWD}/../../bin/plugins/zeiterfassung -LIBS += -L$$OUT_PWD/../../lib -lzeiterfassungguilib +LIBS += -L$$OUT_PWD/../../lib -lzeiterfassungcorelib -lzeiterfassungguilib -INCLUDEPATH += $$PWD/../../zeiterfassungguilib -DEPENDPATH += $$PWD/../../zeiterfassungguilib +INCLUDEPATH += $$PWD/../../zeiterfassungcorelib $$PWD/../../zeiterfassungguilib +DEPENDPATH += $$PWD/../../zeiterfassungcorelib $$PWD/../../zeiterfassungguilib DEFINES += QT_DEPRECATED_WARNINGS QT_DISABLE_DEPRECATED_BEFORE=0x060000 QT_MESSAGELOGCONTEXT diff --git a/plugins/lunchmealplugin/lunchmealplugin.pro b/plugins/lunchmealplugin/lunchmealplugin.pro index a034877..9ce77c2 100644 --- a/plugins/lunchmealplugin/lunchmealplugin.pro +++ b/plugins/lunchmealplugin/lunchmealplugin.pro @@ -7,10 +7,10 @@ CONFIG += shared c++14 DESTDIR = $${OUT_PWD}/../../bin/plugins/zeiterfassung -LIBS += -L$$OUT_PWD/../../lib -lzeiterfassungguilib +LIBS += -L$$OUT_PWD/../../lib -lzeiterfassungcorelib -lzeiterfassungguilib -INCLUDEPATH += $$PWD/../../zeiterfassungguilib -DEPENDPATH += $$PWD/../../zeiterfassungguilib +INCLUDEPATH += $$PWD/../../zeiterfassungcorelib $$PWD/../../zeiterfassungguilib +DEPENDPATH += $$PWD/../../zeiterfassungcorelib $$PWD/../../zeiterfassungguilib DEFINES += QT_DEPRECATED_WARNINGS QT_DISABLE_DEPRECATED_BEFORE=0x060000 QT_MESSAGELOGCONTEXT diff --git a/plugins/presenceplugin/presenceplugin.pro b/plugins/presenceplugin/presenceplugin.pro index cb39656..2411bac 100644 --- a/plugins/presenceplugin/presenceplugin.pro +++ b/plugins/presenceplugin/presenceplugin.pro @@ -7,10 +7,10 @@ CONFIG += shared c++14 DESTDIR = $${OUT_PWD}/../../bin/plugins/zeiterfassung -LIBS += -L$$OUT_PWD/../../lib -lzeiterfassungguilib +LIBS += -L$$OUT_PWD/../../lib -lzeiterfassungcorelib -lzeiterfassungguilib -INCLUDEPATH += $$PWD/../../zeiterfassungguilib -DEPENDPATH += $$PWD/../../zeiterfassungguilib +INCLUDEPATH += $$PWD/../../zeiterfassungcorelib $$PWD/../../zeiterfassungguilib +DEPENDPATH += $$PWD/../../zeiterfassungcorelib $$PWD/../../zeiterfassungguilib DEFINES += QT_DEPRECATED_WARNINGS QT_DISABLE_DEPRECATED_BEFORE=0x060000 QT_MESSAGELOGCONTEXT diff --git a/plugins/reportsplugin/reportsplugin.pro b/plugins/reportsplugin/reportsplugin.pro index 139de8a..8a9a6d8 100644 --- a/plugins/reportsplugin/reportsplugin.pro +++ b/plugins/reportsplugin/reportsplugin.pro @@ -7,10 +7,10 @@ CONFIG += shared c++14 DESTDIR = $${OUT_PWD}/../../bin/plugins/zeiterfassung -LIBS += -L$$OUT_PWD/../../lib -lzeiterfassungguilib +LIBS += -L$$OUT_PWD/../../lib -lzeiterfassungcorelib -lzeiterfassungguilib -INCLUDEPATH += $$PWD/../../zeiterfassungguilib -DEPENDPATH += $$PWD/../../zeiterfassungguilib +INCLUDEPATH += $$PWD/../../zeiterfassungcorelib $$PWD/../../zeiterfassungguilib +DEPENDPATH += $$PWD/../../zeiterfassungcorelib $$PWD/../../zeiterfassungguilib DEFINES += QT_DEPRECATED_WARNINGS QT_DISABLE_DEPRECATED_BEFORE=0x060000 QT_MESSAGELOGCONTEXT diff --git a/plugins/updaterplugin/updaterplugin.pro b/plugins/updaterplugin/updaterplugin.pro index ccc22f0..95c635b 100644 --- a/plugins/updaterplugin/updaterplugin.pro +++ b/plugins/updaterplugin/updaterplugin.pro @@ -7,10 +7,10 @@ CONFIG += shared c++14 DESTDIR = $${OUT_PWD}/../../bin/plugins/zeiterfassung -LIBS += -L$$OUT_PWD/../../lib -lzeiterfassungguilib +LIBS += -L$$OUT_PWD/../../lib -lzeiterfassungcorelib -lzeiterfassungguilib -INCLUDEPATH += $$PWD/../../zeiterfassungguilib -DEPENDPATH += $$PWD/../../zeiterfassungguilib +INCLUDEPATH += $$PWD/../../zeiterfassungcorelib $$PWD/../../zeiterfassungguilib +DEPENDPATH += $$PWD/../../zeiterfassungcorelib $$PWD/../../zeiterfassungguilib DEFINES += QT_DEPRECATED_WARNINGS QT_DISABLE_DEPRECATED_BEFORE=0x060000 QT_MESSAGELOGCONTEXT diff --git a/plugins/weatherplugin/weatherplugin.pro b/plugins/weatherplugin/weatherplugin.pro index 558bac6..275eeaa 100644 --- a/plugins/weatherplugin/weatherplugin.pro +++ b/plugins/weatherplugin/weatherplugin.pro @@ -7,10 +7,10 @@ CONFIG += shared c++14 DESTDIR = $${OUT_PWD}/../../bin/plugins/zeiterfassung -LIBS += -L$$OUT_PWD/../../lib -lzeiterfassungguilib +LIBS += -L$$OUT_PWD/../../lib -lzeiterfassungcorelib -lzeiterfassungguilib -INCLUDEPATH += $$PWD/../../zeiterfassungguilib -DEPENDPATH += $$PWD/../../zeiterfassungguilib +INCLUDEPATH += $$PWD/../../zeiterfassungcorelib $$PWD/../../zeiterfassungguilib +DEPENDPATH += $$PWD/../../zeiterfassungcorelib $$PWD/../../zeiterfassungguilib DEFINES += QT_DEPRECATED_WARNINGS QT_DISABLE_DEPRECATED_BEFORE=0x060000 QT_MESSAGELOGCONTEXT diff --git a/zeiterfassung.pro b/zeiterfassung.pro index dba4b08..fed8288 100644 --- a/zeiterfassung.pro +++ b/zeiterfassung.pro @@ -2,7 +2,9 @@ TEMPLATE = subdirs SUBDIRS += plugins \ zeiterfassung \ + zeiterfassungcorelib \ zeiterfassungguilib plugins.depends += zeiterfassungguilib -zeiterfassung.depends += zeiterfassungguilib +zeiterfassung.depends += zeiterfassungcorelib zeiterfassungguilib +zeiterfassungguilib.depends += zeiterfassungcorelib diff --git a/zeiterfassung/installs.pri b/zeiterfassung/installs.pri index 6f8b73d..6d9adc7 100644 --- a/zeiterfassung/installs.pri +++ b/zeiterfassung/installs.pri @@ -12,6 +12,8 @@ COMPILED_TRANSLATIONS += $$[QT_INSTALL_TRANSLATIONS]/qt_en.qm \ $$[QT_INSTALL_TRANSLATIONS]/qtxmlpatterns_de.qm \ $${OUT_PWD}/translations/zeiterfassung_en.qm \ $${OUT_PWD}/translations/zeiterfassung_de.qm \ + $${OUT_PWD}/../zeiterfassungcorelib/translations/zeiterfassungcorelib_en.qm \ + $${OUT_PWD}/../zeiterfassungcorelib/translations/zeiterfassungcorelib_de.qm \ $${OUT_PWD}/../zeiterfassungguilib/translations/zeiterfassungguilib_en.qm \ $${OUT_PWD}/../zeiterfassungguilib/translations/zeiterfassungguilib_de.qm diff --git a/zeiterfassung/installs_win32.pri b/zeiterfassung/installs_win32.pri index 3344a13..4609981 100644 --- a/zeiterfassung/installs_win32.pri +++ b/zeiterfassung/installs_win32.pri @@ -1,6 +1,7 @@ CONFIG(debug, release|debug): DEBUG_SIGN = d LIBRARIES += win32/Qt.conf \ + $$OUT_PWD/../lib/zeiterfassungcorelib.dll \ $$OUT_PWD/../lib/zeiterfassungguilib.dll \ $$[QT_INSTALL_BINS]/Qt5Core$${DEBUG_SIGN}.dll \ $$[QT_INSTALL_BINS]/Qt5Gui$${DEBUG_SIGN}.dll \ diff --git a/zeiterfassung/zeiterfassung.pro b/zeiterfassung/zeiterfassung.pro index 7502644..82626d1 100755 --- a/zeiterfassung/zeiterfassung.pro +++ b/zeiterfassung/zeiterfassung.pro @@ -8,10 +8,10 @@ CONFIG -= app_bundle DESTDIR = $${OUT_PWD}/../bin -LIBS += -L$$OUT_PWD/../lib -lzeiterfassungguilib +LIBS += -L$$OUT_PWD/../lib -lzeiterfassungcorelib -lzeiterfassungguilib -INCLUDEPATH += $$PWD/../zeiterfassungguilib -DEPENDPATH += $$PWD/../zeiterfassungguilib +INCLUDEPATH += $$PWD/../zeiterfassungcorelib $$PWD/../zeiterfassungguilib +DEPENDPATH += $$PWD/../zeiterfassungcorelib $$PWD/../zeiterfassungguilib DEFINES += QT_DEPRECATED_WARNINGS QT_DISABLE_DEPRECATED_BEFORE=0x060000 QT_MESSAGELOGCONTEXT diff --git a/zeiterfassungguilib/cpp14polyfills.h b/zeiterfassungcorelib/cpp14polyfills.h similarity index 100% rename from zeiterfassungguilib/cpp14polyfills.h rename to zeiterfassungcorelib/cpp14polyfills.h diff --git a/zeiterfassungguilib/replies/createbookingreply.cpp b/zeiterfassungcorelib/replies/createbookingreply.cpp similarity index 100% rename from zeiterfassungguilib/replies/createbookingreply.cpp rename to zeiterfassungcorelib/replies/createbookingreply.cpp diff --git a/zeiterfassungguilib/replies/createbookingreply.h b/zeiterfassungcorelib/replies/createbookingreply.h similarity index 71% rename from zeiterfassungguilib/replies/createbookingreply.h rename to zeiterfassungcorelib/replies/createbookingreply.h index f179041..d3527ad 100644 --- a/zeiterfassungguilib/replies/createbookingreply.h +++ b/zeiterfassungcorelib/replies/createbookingreply.h @@ -4,10 +4,10 @@ #include -#include "zeiterfassungguilib_global.h" +#include "zeiterfassungcorelib_global.h" #include "zeiterfassungreply.h" -class ZEITERFASSUNGGUILIBSHARED_EXPORT CreateBookingReply : public ZeiterfassungReply +class ZEITERFASSUNGCORELIBSHARED_EXPORT CreateBookingReply : public ZeiterfassungReply { Q_OBJECT diff --git a/zeiterfassungguilib/replies/createtimeassignmentreply.cpp b/zeiterfassungcorelib/replies/createtimeassignmentreply.cpp similarity index 100% rename from zeiterfassungguilib/replies/createtimeassignmentreply.cpp rename to zeiterfassungcorelib/replies/createtimeassignmentreply.cpp diff --git a/zeiterfassungguilib/replies/createtimeassignmentreply.h b/zeiterfassungcorelib/replies/createtimeassignmentreply.h similarity index 74% rename from zeiterfassungguilib/replies/createtimeassignmentreply.h rename to zeiterfassungcorelib/replies/createtimeassignmentreply.h index efbf1e7..1b50982 100644 --- a/zeiterfassungguilib/replies/createtimeassignmentreply.h +++ b/zeiterfassungcorelib/replies/createtimeassignmentreply.h @@ -4,10 +4,10 @@ #include -#include "zeiterfassungguilib_global.h" +#include "zeiterfassungcorelib_global.h" #include "zeiterfassungreply.h" -class ZEITERFASSUNGGUILIBSHARED_EXPORT CreateTimeAssignmentReply : public ZeiterfassungReply +class ZEITERFASSUNGCORELIBSHARED_EXPORT CreateTimeAssignmentReply : public ZeiterfassungReply { Q_OBJECT diff --git a/zeiterfassungguilib/replies/deletebookingreply.cpp b/zeiterfassungcorelib/replies/deletebookingreply.cpp similarity index 100% rename from zeiterfassungguilib/replies/deletebookingreply.cpp rename to zeiterfassungcorelib/replies/deletebookingreply.cpp diff --git a/zeiterfassungguilib/replies/deletebookingreply.h b/zeiterfassungcorelib/replies/deletebookingreply.h similarity index 71% rename from zeiterfassungguilib/replies/deletebookingreply.h rename to zeiterfassungcorelib/replies/deletebookingreply.h index 755bd5b..e7bd1a8 100644 --- a/zeiterfassungguilib/replies/deletebookingreply.h +++ b/zeiterfassungcorelib/replies/deletebookingreply.h @@ -4,10 +4,10 @@ #include -#include "zeiterfassungguilib_global.h" +#include "zeiterfassungcorelib_global.h" #include "zeiterfassungreply.h" -class ZEITERFASSUNGGUILIBSHARED_EXPORT DeleteBookingReply : public ZeiterfassungReply +class ZEITERFASSUNGCORELIBSHARED_EXPORT DeleteBookingReply : public ZeiterfassungReply { Q_OBJECT diff --git a/zeiterfassungguilib/replies/deletetimeassignmentreply.cpp b/zeiterfassungcorelib/replies/deletetimeassignmentreply.cpp similarity index 100% rename from zeiterfassungguilib/replies/deletetimeassignmentreply.cpp rename to zeiterfassungcorelib/replies/deletetimeassignmentreply.cpp diff --git a/zeiterfassungguilib/replies/deletetimeassignmentreply.h b/zeiterfassungcorelib/replies/deletetimeassignmentreply.h similarity index 70% rename from zeiterfassungguilib/replies/deletetimeassignmentreply.h rename to zeiterfassungcorelib/replies/deletetimeassignmentreply.h index 1d33bd2..ff65b86 100644 --- a/zeiterfassungguilib/replies/deletetimeassignmentreply.h +++ b/zeiterfassungcorelib/replies/deletetimeassignmentreply.h @@ -4,10 +4,10 @@ #include -#include "zeiterfassungguilib_global.h" +#include "zeiterfassungcorelib_global.h" #include "zeiterfassungreply.h" -class ZEITERFASSUNGGUILIBSHARED_EXPORT DeleteTimeAssignmentReply : public ZeiterfassungReply +class ZEITERFASSUNGCORELIBSHARED_EXPORT DeleteTimeAssignmentReply : public ZeiterfassungReply { Q_OBJECT diff --git a/zeiterfassungguilib/replies/getbookingsreply.cpp b/zeiterfassungcorelib/replies/getbookingsreply.cpp similarity index 100% rename from zeiterfassungguilib/replies/getbookingsreply.cpp rename to zeiterfassungcorelib/replies/getbookingsreply.cpp diff --git a/zeiterfassungguilib/replies/getbookingsreply.h b/zeiterfassungcorelib/replies/getbookingsreply.h similarity index 82% rename from zeiterfassungguilib/replies/getbookingsreply.h rename to zeiterfassungcorelib/replies/getbookingsreply.h index 90974a1..2272829 100644 --- a/zeiterfassungguilib/replies/getbookingsreply.h +++ b/zeiterfassungcorelib/replies/getbookingsreply.h @@ -5,12 +5,12 @@ #include #include -#include "zeiterfassungguilib_global.h" +#include "zeiterfassungcorelib_global.h" #include "zeiterfassungreply.h" class ZeiterfassungApi; -class ZEITERFASSUNGGUILIBSHARED_EXPORT GetBookingsReply : public ZeiterfassungReply +class ZEITERFASSUNGCORELIBSHARED_EXPORT GetBookingsReply : public ZeiterfassungReply { Q_OBJECT diff --git a/zeiterfassungguilib/replies/getpresencestatusreply.cpp b/zeiterfassungcorelib/replies/getpresencestatusreply.cpp similarity index 100% rename from zeiterfassungguilib/replies/getpresencestatusreply.cpp rename to zeiterfassungcorelib/replies/getpresencestatusreply.cpp diff --git a/zeiterfassungguilib/replies/getpresencestatusreply.h b/zeiterfassungcorelib/replies/getpresencestatusreply.h similarity index 82% rename from zeiterfassungguilib/replies/getpresencestatusreply.h rename to zeiterfassungcorelib/replies/getpresencestatusreply.h index 3c12ae6..91e86b0 100644 --- a/zeiterfassungguilib/replies/getpresencestatusreply.h +++ b/zeiterfassungcorelib/replies/getpresencestatusreply.h @@ -4,12 +4,12 @@ #include -#include "zeiterfassungguilib_global.h" +#include "zeiterfassungcorelib_global.h" #include "zeiterfassungreply.h" class ZeiterfassungApi; -class ZEITERFASSUNGGUILIBSHARED_EXPORT GetPresenceStatusReply : public ZeiterfassungReply +class ZEITERFASSUNGCORELIBSHARED_EXPORT GetPresenceStatusReply : public ZeiterfassungReply { Q_OBJECT diff --git a/zeiterfassungguilib/replies/getprojectsreply.cpp b/zeiterfassungcorelib/replies/getprojectsreply.cpp similarity index 100% rename from zeiterfassungguilib/replies/getprojectsreply.cpp rename to zeiterfassungcorelib/replies/getprojectsreply.cpp diff --git a/zeiterfassungguilib/replies/getprojectsreply.h b/zeiterfassungcorelib/replies/getprojectsreply.h similarity index 80% rename from zeiterfassungguilib/replies/getprojectsreply.h rename to zeiterfassungcorelib/replies/getprojectsreply.h index 2461baf..6124d63 100644 --- a/zeiterfassungguilib/replies/getprojectsreply.h +++ b/zeiterfassungcorelib/replies/getprojectsreply.h @@ -5,12 +5,12 @@ #include #include -#include "zeiterfassungguilib_global.h" +#include "zeiterfassungcorelib_global.h" #include "zeiterfassungreply.h" class ZeiterfassungApi; -class ZEITERFASSUNGGUILIBSHARED_EXPORT GetProjectsReply : public ZeiterfassungReply +class ZEITERFASSUNGCORELIBSHARED_EXPORT GetProjectsReply : public ZeiterfassungReply { Q_OBJECT diff --git a/zeiterfassungguilib/replies/getreportreply.cpp b/zeiterfassungcorelib/replies/getreportreply.cpp similarity index 100% rename from zeiterfassungguilib/replies/getreportreply.cpp rename to zeiterfassungcorelib/replies/getreportreply.cpp diff --git a/zeiterfassungguilib/replies/getreportreply.h b/zeiterfassungcorelib/replies/getreportreply.h similarity index 77% rename from zeiterfassungguilib/replies/getreportreply.h rename to zeiterfassungcorelib/replies/getreportreply.h index b2de3bf..aea13e3 100644 --- a/zeiterfassungguilib/replies/getreportreply.h +++ b/zeiterfassungcorelib/replies/getreportreply.h @@ -5,10 +5,10 @@ #include #include -#include "zeiterfassungguilib_global.h" +#include "zeiterfassungcorelib_global.h" #include "zeiterfassungreply.h" -class ZEITERFASSUNGGUILIBSHARED_EXPORT GetReportReply : public ZeiterfassungReply +class ZEITERFASSUNGCORELIBSHARED_EXPORT GetReportReply : public ZeiterfassungReply { Q_OBJECT diff --git a/zeiterfassungguilib/replies/gettimeassignmentsreply.cpp b/zeiterfassungcorelib/replies/gettimeassignmentsreply.cpp similarity index 100% rename from zeiterfassungguilib/replies/gettimeassignmentsreply.cpp rename to zeiterfassungcorelib/replies/gettimeassignmentsreply.cpp diff --git a/zeiterfassungguilib/replies/gettimeassignmentsreply.h b/zeiterfassungcorelib/replies/gettimeassignmentsreply.h similarity index 83% rename from zeiterfassungguilib/replies/gettimeassignmentsreply.h rename to zeiterfassungcorelib/replies/gettimeassignmentsreply.h index 4b32d85..cd97149 100644 --- a/zeiterfassungguilib/replies/gettimeassignmentsreply.h +++ b/zeiterfassungcorelib/replies/gettimeassignmentsreply.h @@ -5,12 +5,12 @@ #include #include -#include "zeiterfassungguilib_global.h" +#include "zeiterfassungcorelib_global.h" #include "zeiterfassungreply.h" class ZeiterfassungApi; -class ZEITERFASSUNGGUILIBSHARED_EXPORT GetTimeAssignmentsReply : public ZeiterfassungReply +class ZEITERFASSUNGCORELIBSHARED_EXPORT GetTimeAssignmentsReply : public ZeiterfassungReply { Q_OBJECT diff --git a/zeiterfassungguilib/replies/getuserinforeply.cpp b/zeiterfassungcorelib/replies/getuserinforeply.cpp similarity index 100% rename from zeiterfassungguilib/replies/getuserinforeply.cpp rename to zeiterfassungcorelib/replies/getuserinforeply.cpp diff --git a/zeiterfassungguilib/replies/getuserinforeply.h b/zeiterfassungcorelib/replies/getuserinforeply.h similarity index 88% rename from zeiterfassungguilib/replies/getuserinforeply.h rename to zeiterfassungcorelib/replies/getuserinforeply.h index e816611..4be4278 100644 --- a/zeiterfassungguilib/replies/getuserinforeply.h +++ b/zeiterfassungcorelib/replies/getuserinforeply.h @@ -4,12 +4,12 @@ #include -#include "zeiterfassungguilib_global.h" +#include "zeiterfassungcorelib_global.h" #include "zeiterfassungreply.h" class ZeiterfassungApi; -class ZEITERFASSUNGGUILIBSHARED_EXPORT GetUserInfoReply : public ZeiterfassungReply +class ZEITERFASSUNGCORELIBSHARED_EXPORT GetUserInfoReply : public ZeiterfassungReply { Q_OBJECT diff --git a/zeiterfassungguilib/replies/loginpagereply.cpp b/zeiterfassungcorelib/replies/loginpagereply.cpp similarity index 100% rename from zeiterfassungguilib/replies/loginpagereply.cpp rename to zeiterfassungcorelib/replies/loginpagereply.cpp diff --git a/zeiterfassungguilib/replies/loginpagereply.h b/zeiterfassungcorelib/replies/loginpagereply.h similarity index 71% rename from zeiterfassungguilib/replies/loginpagereply.h rename to zeiterfassungcorelib/replies/loginpagereply.h index 6ade4ce..0777741 100644 --- a/zeiterfassungguilib/replies/loginpagereply.h +++ b/zeiterfassungcorelib/replies/loginpagereply.h @@ -4,10 +4,10 @@ #include -#include "zeiterfassungguilib_global.h" +#include "zeiterfassungcorelib_global.h" #include "zeiterfassungreply.h" -class ZEITERFASSUNGGUILIBSHARED_EXPORT LoginPageReply : public ZeiterfassungReply +class ZEITERFASSUNGCORELIBSHARED_EXPORT LoginPageReply : public ZeiterfassungReply { Q_OBJECT diff --git a/zeiterfassungguilib/replies/loginreply.cpp b/zeiterfassungcorelib/replies/loginreply.cpp similarity index 100% rename from zeiterfassungguilib/replies/loginreply.cpp rename to zeiterfassungcorelib/replies/loginreply.cpp diff --git a/zeiterfassungguilib/replies/loginreply.h b/zeiterfassungcorelib/replies/loginreply.h similarity index 71% rename from zeiterfassungguilib/replies/loginreply.h rename to zeiterfassungcorelib/replies/loginreply.h index 10e7d6e..f6f76c4 100644 --- a/zeiterfassungguilib/replies/loginreply.h +++ b/zeiterfassungcorelib/replies/loginreply.h @@ -4,10 +4,10 @@ #include -#include "zeiterfassungguilib_global.h" +#include "zeiterfassungcorelib_global.h" #include "zeiterfassungreply.h" -class ZEITERFASSUNGGUILIBSHARED_EXPORT LoginReply : public ZeiterfassungReply +class ZEITERFASSUNGCORELIBSHARED_EXPORT LoginReply : public ZeiterfassungReply { Q_OBJECT diff --git a/zeiterfassungguilib/replies/updatebookingreply.cpp b/zeiterfassungcorelib/replies/updatebookingreply.cpp similarity index 100% rename from zeiterfassungguilib/replies/updatebookingreply.cpp rename to zeiterfassungcorelib/replies/updatebookingreply.cpp diff --git a/zeiterfassungguilib/replies/updatebookingreply.h b/zeiterfassungcorelib/replies/updatebookingreply.h similarity index 72% rename from zeiterfassungguilib/replies/updatebookingreply.h rename to zeiterfassungcorelib/replies/updatebookingreply.h index 295f927..137bd2e 100644 --- a/zeiterfassungguilib/replies/updatebookingreply.h +++ b/zeiterfassungcorelib/replies/updatebookingreply.h @@ -4,10 +4,10 @@ #include -#include "zeiterfassungguilib_global.h" +#include "zeiterfassungcorelib_global.h" #include "zeiterfassungreply.h" -class ZEITERFASSUNGGUILIBSHARED_EXPORT UpdateBookingReply : public ZeiterfassungReply +class ZEITERFASSUNGCORELIBSHARED_EXPORT UpdateBookingReply : public ZeiterfassungReply { Q_OBJECT diff --git a/zeiterfassungguilib/replies/updatetimeassignmentreply.cpp b/zeiterfassungcorelib/replies/updatetimeassignmentreply.cpp similarity index 100% rename from zeiterfassungguilib/replies/updatetimeassignmentreply.cpp rename to zeiterfassungcorelib/replies/updatetimeassignmentreply.cpp diff --git a/zeiterfassungguilib/replies/updatetimeassignmentreply.h b/zeiterfassungcorelib/replies/updatetimeassignmentreply.h similarity index 74% rename from zeiterfassungguilib/replies/updatetimeassignmentreply.h rename to zeiterfassungcorelib/replies/updatetimeassignmentreply.h index a6d9872..3bdb59e 100644 --- a/zeiterfassungguilib/replies/updatetimeassignmentreply.h +++ b/zeiterfassungcorelib/replies/updatetimeassignmentreply.h @@ -4,10 +4,10 @@ #include -#include "zeiterfassungguilib_global.h" +#include "zeiterfassungcorelib_global.h" #include "zeiterfassungreply.h" -class ZEITERFASSUNGGUILIBSHARED_EXPORT UpdateTimeAssignmentReply : public ZeiterfassungReply +class ZEITERFASSUNGCORELIBSHARED_EXPORT UpdateTimeAssignmentReply : public ZeiterfassungReply { Q_OBJECT diff --git a/zeiterfassungguilib/replies/zeiterfassungreply.cpp b/zeiterfassungcorelib/replies/zeiterfassungreply.cpp similarity index 100% rename from zeiterfassungguilib/replies/zeiterfassungreply.cpp rename to zeiterfassungcorelib/replies/zeiterfassungreply.cpp diff --git a/zeiterfassungguilib/replies/zeiterfassungreply.h b/zeiterfassungcorelib/replies/zeiterfassungreply.h similarity index 81% rename from zeiterfassungguilib/replies/zeiterfassungreply.h rename to zeiterfassungcorelib/replies/zeiterfassungreply.h index a278db4..11b535d 100644 --- a/zeiterfassungguilib/replies/zeiterfassungreply.h +++ b/zeiterfassungcorelib/replies/zeiterfassungreply.h @@ -2,11 +2,11 @@ #include -#include "zeiterfassungguilib_global.h" +#include "zeiterfassungcorelib_global.h" class ZeiterfassungApi; -class ZEITERFASSUNGGUILIBSHARED_EXPORT ZeiterfassungReply : public QObject +class ZEITERFASSUNGCORELIBSHARED_EXPORT ZeiterfassungReply : public QObject { Q_OBJECT diff --git a/zeiterfassungguilib/timeutils.cpp b/zeiterfassungcorelib/timeutils.cpp similarity index 100% rename from zeiterfassungguilib/timeutils.cpp rename to zeiterfassungcorelib/timeutils.cpp diff --git a/zeiterfassungcorelib/timeutils.h b/zeiterfassungcorelib/timeutils.h new file mode 100644 index 0000000..3544299 --- /dev/null +++ b/zeiterfassungcorelib/timeutils.h @@ -0,0 +1,10 @@ +#pragma once + +#include + +#include "zeiterfassungcorelib_global.h" + +int ZEITERFASSUNGCORELIBSHARED_EXPORT timeToSeconds(const QTime &time); +QTime ZEITERFASSUNGCORELIBSHARED_EXPORT timeBetween(const QTime &l, const QTime &r); +QTime ZEITERFASSUNGCORELIBSHARED_EXPORT timeAdd(const QTime &l, const QTime &r); +QTime ZEITERFASSUNGCORELIBSHARED_EXPORT timeNormalise(const QTime &time); diff --git a/zeiterfassungcorelib/translations/zeiterfassungcorelib_de.ts b/zeiterfassungcorelib/translations/zeiterfassungcorelib_de.ts new file mode 100644 index 0000000..b624ce5 --- /dev/null +++ b/zeiterfassungcorelib/translations/zeiterfassungcorelib_de.ts @@ -0,0 +1,277 @@ + + + + + CreateBookingReply + + + Request error occured: %0 + + + + + CreateTimeAssignmentReply + + + Request error occured: %0 + + + + + Parsing JSON failed: %0 + + + + + JSON document is not an object! + + + + + JSON does not contain bookingNr! + + + + + DeleteBookingReply + + + Request error occured: %0 + + + + + DeleteTimeAssignmentReply + + + Request error occured: %0 + + + + + GetBookingsReply + + + Request error occured: %0 + + + + + Parsing JSON failed: %0 + + + + + JSON document is not an array! + + + + + GetPresenceStatusReply + + + Request error occured: %0 + + + + + Parsing JSON failed: %0 + + + + + JSON document is not an array! + + + + + GetProjectsReply + + + Request error occured: %0 + + + + + Parsing JSON failed: %0 + + + + + JSON document is not an object! + + + + + JSON does not contain elements! + + + + + elements is not an array! + + + + + GetReportReply + + + + Request error occured: %0 + + + + + GetTimeAssignmentsReply + + + Request error occured: %0 + + + + + Parsing JSON failed: %0 + + + + + JSON document is not an array! + + + + + GetUserInfoReply + + + Request 0 error occured: %0 + + + + + Parsing JSON 0 failed: %0 + + + + + JSON document 0 is not an object! + + + + + JSON 0 does not contain evoAppsUser! + + + + + evoAppsUser is not an object! + + + + + Request 1 error occured: %0 + + + + + Parsing JSON 1 failed: %0 + + + + + JSON document 1 is not an array! + + + + + JSON array 1 is empty! + + + + + JSON array value is not an object! + + + + + LoginPageReply + + + Request error occured: %0 + + + + + Could not find necessary keywords in login page! + + + + + LoginReply + + + Request error occured: %0 + + + + + Response did not contain a Location header. + + + + + Authentication failure. Please check username and password. + + + + + An unknown authentication failure occured. Redirected to: %0 + + + + + UpdateBookingReply + + + Request error occured: %0 + + + + + Parsing JSON failed: %0 + + + + + JSON document is not an object! + + + + + JSON does not contain bookingNr! + + + + + UpdateTimeAssignmentReply + + + Request error occured: %0 + + + + + Parsing JSON failed: %0 + + + + + JSON document is not an object! + + + + + JSON does not contain bookingNr! + + + + diff --git a/zeiterfassungcorelib/translations/zeiterfassungcorelib_en.ts b/zeiterfassungcorelib/translations/zeiterfassungcorelib_en.ts new file mode 100644 index 0000000..747f7a7 --- /dev/null +++ b/zeiterfassungcorelib/translations/zeiterfassungcorelib_en.ts @@ -0,0 +1,277 @@ + + + + + CreateBookingReply + + + Request error occured: %0 + + + + + CreateTimeAssignmentReply + + + Request error occured: %0 + + + + + Parsing JSON failed: %0 + + + + + JSON document is not an object! + + + + + JSON does not contain bookingNr! + + + + + DeleteBookingReply + + + Request error occured: %0 + + + + + DeleteTimeAssignmentReply + + + Request error occured: %0 + + + + + GetBookingsReply + + + Request error occured: %0 + + + + + Parsing JSON failed: %0 + + + + + JSON document is not an array! + + + + + GetPresenceStatusReply + + + Request error occured: %0 + + + + + Parsing JSON failed: %0 + + + + + JSON document is not an array! + + + + + GetProjectsReply + + + Request error occured: %0 + + + + + Parsing JSON failed: %0 + + + + + JSON document is not an object! + + + + + JSON does not contain elements! + + + + + elements is not an array! + + + + + GetReportReply + + + + Request error occured: %0 + + + + + GetTimeAssignmentsReply + + + Request error occured: %0 + + + + + Parsing JSON failed: %0 + + + + + JSON document is not an array! + + + + + GetUserInfoReply + + + Request 0 error occured: %0 + + + + + Parsing JSON 0 failed: %0 + + + + + JSON document 0 is not an object! + + + + + JSON 0 does not contain evoAppsUser! + + + + + evoAppsUser is not an object! + + + + + Request 1 error occured: %0 + + + + + Parsing JSON 1 failed: %0 + + + + + JSON document 1 is not an array! + + + + + JSON array 1 is empty! + + + + + JSON array value is not an object! + + + + + LoginPageReply + + + Request error occured: %0 + + + + + Could not find necessary keywords in login page! + + + + + LoginReply + + + Request error occured: %0 + + + + + Response did not contain a Location header. + + + + + Authentication failure. Please check username and password. + + + + + An unknown authentication failure occured. Redirected to: %0 + + + + + UpdateBookingReply + + + Request error occured: %0 + + + + + Parsing JSON failed: %0 + + + + + JSON document is not an object! + + + + + JSON does not contain bookingNr! + + + + + UpdateTimeAssignmentReply + + + Request error occured: %0 + + + + + Parsing JSON failed: %0 + + + + + JSON document is not an object! + + + + + JSON does not contain bookingNr! + + + + diff --git a/zeiterfassungguilib/zeiterfassungapi.cpp b/zeiterfassungcorelib/zeiterfassungapi.cpp similarity index 100% rename from zeiterfassungguilib/zeiterfassungapi.cpp rename to zeiterfassungcorelib/zeiterfassungapi.cpp diff --git a/zeiterfassungguilib/zeiterfassungapi.h b/zeiterfassungcorelib/zeiterfassungapi.h similarity index 96% rename from zeiterfassungguilib/zeiterfassungapi.h rename to zeiterfassungcorelib/zeiterfassungapi.h index c4bce45..b1320ee 100644 --- a/zeiterfassungguilib/zeiterfassungapi.h +++ b/zeiterfassungcorelib/zeiterfassungapi.h @@ -7,7 +7,7 @@ #include #include -#include "zeiterfassungguilib_global.h" +#include "zeiterfassungcorelib_global.h" class QNetworkAccessManager; @@ -26,7 +26,7 @@ class GetProjectsReply; class GetReportReply; class GetPresenceStatusReply; -class ZEITERFASSUNGGUILIBSHARED_EXPORT ZeiterfassungApi : public QObject +class ZEITERFASSUNGCORELIBSHARED_EXPORT ZeiterfassungApi : public QObject { Q_OBJECT diff --git a/zeiterfassungcorelib/zeiterfassungcorelib.pro b/zeiterfassungcorelib/zeiterfassungcorelib.pro new file mode 100644 index 0000000..d653219 --- /dev/null +++ b/zeiterfassungcorelib/zeiterfassungcorelib.pro @@ -0,0 +1,65 @@ +QT += core network + +TARGET = zeiterfassungcorelib +TEMPLATE = lib + +CONFIG += c++14 + +DESTDIR = $${OUT_PWD}/../lib + +DEFINES += QT_DEPRECATED_WARNINGS QT_DISABLE_DEPRECATED_BEFORE=0x060000 QT_MESSAGELOGCONTEXT +DEFINES += ZEITERFASSUNGCORELIB_LIBRARY + +SOURCES += timeutils.cpp \ + zeiterfassungapi.cpp \ + zeiterfassungsettings.cpp \ + replies/createbookingreply.cpp \ + replies/createtimeassignmentreply.cpp \ + replies/deletebookingreply.cpp \ + replies/deletetimeassignmentreply.cpp \ + replies/getbookingsreply.cpp \ + replies/getpresencestatusreply.cpp \ + replies/getprojectsreply.cpp \ + replies/getreportreply.cpp \ + replies/gettimeassignmentsreply.cpp \ + replies/getuserinforeply.cpp \ + replies/loginpagereply.cpp \ + replies/loginreply.cpp \ + replies/updatebookingreply.cpp \ + replies/updatetimeassignmentreply.cpp \ + replies/zeiterfassungreply.cpp + +HEADERS += cpp14polyfills.h \ + timeutils.h \ + zeiterfassungapi.h \ + zeiterfassungcorelib_global.h \ + zeiterfassungsettings.h \ + replies/createbookingreply.h \ + replies/createtimeassignmentreply.h \ + replies/deletebookingreply.h \ + replies/deletetimeassignmentreply.h \ + replies/getbookingsreply.h \ + replies/getpresencestatusreply.h \ + replies/getprojectsreply.h \ + replies/getreportreply.h \ + replies/gettimeassignmentsreply.h \ + replies/getuserinforeply.h \ + replies/loginpagereply.h \ + replies/loginreply.h \ + replies/updatebookingreply.h \ + replies/updatetimeassignmentreply.h \ + replies/zeiterfassungreply.h + +FORMS += + +RESOURCES += + +TRANSLATIONS += translations/zeiterfassungcorelib_en.ts \ + translations/zeiterfassungcorelib_de.ts + +include(../lrelease.pri) + +# unix { +# target.path = /usr/lib +# INSTALLS += target +# } diff --git a/zeiterfassungcorelib/zeiterfassungcorelib_global.h b/zeiterfassungcorelib/zeiterfassungcorelib_global.h new file mode 100644 index 0000000..334fcf9 --- /dev/null +++ b/zeiterfassungcorelib/zeiterfassungcorelib_global.h @@ -0,0 +1,9 @@ +#pragma once + +#include + +#if defined(ZEITERFASSUNGCORELIB_LIBRARY) +# define ZEITERFASSUNGCORELIBSHARED_EXPORT Q_DECL_EXPORT +#else +# define ZEITERFASSUNGCORELIBSHARED_EXPORT Q_DECL_IMPORT +#endif diff --git a/zeiterfassungguilib/zeiterfassungsettings.cpp b/zeiterfassungcorelib/zeiterfassungsettings.cpp similarity index 100% rename from zeiterfassungguilib/zeiterfassungsettings.cpp rename to zeiterfassungcorelib/zeiterfassungsettings.cpp diff --git a/zeiterfassungguilib/zeiterfassungsettings.h b/zeiterfassungcorelib/zeiterfassungsettings.h similarity index 93% rename from zeiterfassungguilib/zeiterfassungsettings.h rename to zeiterfassungcorelib/zeiterfassungsettings.h index a919bd0..843ea9c 100644 --- a/zeiterfassungguilib/zeiterfassungsettings.h +++ b/zeiterfassungcorelib/zeiterfassungsettings.h @@ -6,9 +6,9 @@ #include #include -#include "zeiterfassungguilib_global.h" +#include "zeiterfassungcorelib_global.h" -class ZEITERFASSUNGGUILIBSHARED_EXPORT ZeiterfassungSettings : public QSettings +class ZEITERFASSUNGCORELIBSHARED_EXPORT ZeiterfassungSettings : public QSettings { Q_OBJECT diff --git a/zeiterfassungguilib/timeutils.h b/zeiterfassungguilib/timeutils.h deleted file mode 100644 index 00a48e0..0000000 --- a/zeiterfassungguilib/timeutils.h +++ /dev/null @@ -1,10 +0,0 @@ -#pragma once - -#include - -#include "zeiterfassungguilib_global.h" - -int ZEITERFASSUNGGUILIBSHARED_EXPORT timeToSeconds(const QTime &time); -QTime ZEITERFASSUNGGUILIBSHARED_EXPORT timeBetween(const QTime &l, const QTime &r); -QTime ZEITERFASSUNGGUILIBSHARED_EXPORT timeAdd(const QTime &l, const QTime &r); -QTime ZEITERFASSUNGGUILIBSHARED_EXPORT timeNormalise(const QTime &time); diff --git a/zeiterfassungguilib/translations/zeiterfassungguilib_de.ts b/zeiterfassungguilib/translations/zeiterfassungguilib_de.ts index 873a88d..baf47aa 100644 --- a/zeiterfassungguilib/translations/zeiterfassungguilib_de.ts +++ b/zeiterfassungguilib/translations/zeiterfassungguilib_de.ts @@ -54,187 +54,6 @@ Passwort: - - CreateBookingReply - - - Request error occured: %0 - - - - - Parsing JSON failed: %0 - - - - - JSON document is not an object! - - - - - JSON does not contain bookingNr! - - - - - CreateTimeAssignmentReply - - - Request error occured: %0 - - - - - Parsing JSON failed: %0 - - - - - JSON document is not an object! - - - - - JSON does not contain bookingNr! - - - - - DeleteBookingReply - - - Request error occured: %0 - - - - - DeleteTimeAssignmentReply - - - Request error occured: %0 - - - - - GetBookingsReply - - - Request error occured: %0 - - - - - Parsing JSON failed: %0 - - - - - JSON document is not an array! - - - - - GetPresenceStatusReply - - - Request error occured: %0 - - - - - Parsing JSON failed: %0 - - - - - JSON document is not an array! - - - - - GetProjectsReply - - - Request error occured: %0 - - - - - Parsing JSON failed: %0 - - - - - JSON document is not an object! - - - - - JSON does not contain elements! - - - - - elements is not an array! - - - - - GetReportReply - - - - Request error occured: %0 - - - - - GetTimeAssignmentsReply - - - Request error occured: %0 - - - - - Parsing JSON failed: %0 - - - - - JSON document is not an array! - - - - - GetUserInfoReply - - - Request error occured: %0 - - - - - Parsing JSON failed: %0 - - - - - JSON document is not an object! - - - - - JSON does not contain evoAppsUser! - - - - - evoAppsUser is not an object! - - - LanguageSelectionDialog @@ -264,42 +83,6 @@ Deutsch - - LoginPageReply - - - Request error occured: %0 - - - - - Could not find necessary keywords in login page! - - - - - LoginReply - - - Request error occured: %0 - - - - - Response did not contain a Location header. - - - - - Authentication failure. Please check username and password. - - - - - An unknown authentication failure occured. Redirected to: %0 - - - MainWindow @@ -544,7 +327,7 @@ Booking ID: %1 - + %0: %1 %0: %1 @@ -555,17 +338,17 @@ Booking ID: %1 - - + + %0h %0h - - - - + + + + HH:mm HH:mm @@ -575,62 +358,48 @@ Booking ID: %1 Kontierung fehlend! - - - - Expected %0 but received %1 in time assignment. -Time assignment ID: %2 - - - - - - - - - - - - + + + HH:mm:ss HH:mm:ss - - + + There is another booking after an unfinished time assignment. Booking ID: %0 Time assignment ID: %1 - - - + + + There is another time assignment after an unfinished time assignment. Time assignment ID: %0 Time assignment ID: %1 - + The last time assignment is finished without end booking Time assignment ID: %0 - + Expected end booking, instead got type %0 Booking ID: %1 - + Missing time assignment! Missing: %0 Kontierung fehlend! %0 nicht kontiert - + Assigned time Kontierte Zeit @@ -645,14 +414,14 @@ Booking ID: %1 %0 (%1) - + Time assignment time longer than booking time! Time assignment: %0 Booking: %1 - + Strip rendering aborted due error. Your bookings and time assignments for this day are in an illegal state! @@ -698,55 +467,9 @@ Your bookings and time assignments for this day are in an illegal state!Ungültig - + Open Offen - - UpdateBookingReply - - - Request error occured: %0 - - - - - Parsing JSON failed: %0 - - - - - JSON document is not an object! - - - - - JSON does not contain bookingNr! - - - - - UpdateTimeAssignmentReply - - - Request error occured: %0 - - - - - Parsing JSON failed: %0 - - - - - JSON document is not an object! - - - - - JSON does not contain bookingNr! - - - diff --git a/zeiterfassungguilib/translations/zeiterfassungguilib_en.ts b/zeiterfassungguilib/translations/zeiterfassungguilib_en.ts index 2e4ce17..27f9a57 100644 --- a/zeiterfassungguilib/translations/zeiterfassungguilib_en.ts +++ b/zeiterfassungguilib/translations/zeiterfassungguilib_en.ts @@ -54,187 +54,6 @@ - - CreateBookingReply - - - Request error occured: %0 - - - - - Parsing JSON failed: %0 - - - - - JSON document is not an object! - - - - - JSON does not contain bookingNr! - - - - - CreateTimeAssignmentReply - - - Request error occured: %0 - - - - - Parsing JSON failed: %0 - - - - - JSON document is not an object! - - - - - JSON does not contain bookingNr! - - - - - DeleteBookingReply - - - Request error occured: %0 - - - - - DeleteTimeAssignmentReply - - - Request error occured: %0 - - - - - GetBookingsReply - - - Request error occured: %0 - - - - - Parsing JSON failed: %0 - - - - - JSON document is not an array! - - - - - GetPresenceStatusReply - - - Request error occured: %0 - - - - - Parsing JSON failed: %0 - - - - - JSON document is not an array! - - - - - GetProjectsReply - - - Request error occured: %0 - - - - - Parsing JSON failed: %0 - - - - - JSON document is not an object! - - - - - JSON does not contain elements! - - - - - elements is not an array! - - - - - GetReportReply - - - - Request error occured: %0 - - - - - GetTimeAssignmentsReply - - - Request error occured: %0 - - - - - Parsing JSON failed: %0 - - - - - JSON document is not an array! - - - - - GetUserInfoReply - - - Request error occured: %0 - - - - - Parsing JSON failed: %0 - - - - - JSON document is not an object! - - - - - JSON does not contain evoAppsUser! - - - - - evoAppsUser is not an object! - - - LanguageSelectionDialog @@ -264,42 +83,6 @@ - - LoginPageReply - - - Request error occured: %0 - - - - - Could not find necessary keywords in login page! - - - - - LoginReply - - - Request error occured: %0 - - - - - Response did not contain a Location header. - - - - - Authentication failure. Please check username and password. - - - - - An unknown authentication failure occured. Redirected to: %0 - - - MainWindow @@ -544,7 +327,7 @@ Booking ID: %1 - + %0: %1 @@ -555,17 +338,17 @@ Booking ID: %1 - - + + %0h - - - - + + + + HH:mm @@ -575,74 +358,60 @@ Booking ID: %1 - - - - Expected %0 but received %1 in time assignment. -Time assignment ID: %2 - - - - - - - - - - - - + + + HH:mm:ss - - + + There is another booking after an unfinished time assignment. Booking ID: %0 Time assignment ID: %1 - - - + + + There is another time assignment after an unfinished time assignment. Time assignment ID: %0 Time assignment ID: %1 - + The last time assignment is finished without end booking Time assignment ID: %0 - + Expected end booking, instead got type %0 Booking ID: %1 - + Missing time assignment! Missing: %0 - + Time assignment time longer than booking time! Time assignment: %0 Booking: %1 - + Assigned time - + Strip rendering aborted due error. Your bookings and time assignments for this day are in an illegal state! @@ -698,55 +467,9 @@ Your bookings and time assignments for this day are in an illegal state! - + Open - - UpdateBookingReply - - - Request error occured: %0 - - - - - Parsing JSON failed: %0 - - - - - JSON document is not an object! - - - - - JSON does not contain bookingNr! - - - - - UpdateTimeAssignmentReply - - - Request error occured: %0 - - - - - Parsing JSON failed: %0 - - - - - JSON document is not an object! - - - - - JSON does not contain bookingNr! - - - diff --git a/zeiterfassungguilib/zeiterfassungguilib.pro b/zeiterfassungguilib/zeiterfassungguilib.pro index 27e6778..0f252db 100644 --- a/zeiterfassungguilib/zeiterfassungguilib.pro +++ b/zeiterfassungguilib/zeiterfassungguilib.pro @@ -7,64 +7,32 @@ CONFIG += c++14 DESTDIR = $${OUT_PWD}/../lib +LIBS += -L$$OUT_PWD/../lib -lzeiterfassungcorelib + +INCLUDEPATH += $$PWD/../zeiterfassungcorelib +DEPENDPATH += $$PWD/../zeiterfassungcorelib + DEFINES += QT_DEPRECATED_WARNINGS QT_DISABLE_DEPRECATED_BEFORE=0x060000 QT_MESSAGELOGCONTEXT DEFINES += ZEITERFASSUNGGUILIB_LIBRARY SOURCES += mainwindow.cpp \ stripfactory.cpp \ stripswidget.cpp \ - timeutils.cpp \ - zeiterfassungapi.cpp \ zeiterfassungplugin.cpp \ - zeiterfassungsettings.cpp \ dialogs/aboutmedialog.cpp \ dialogs/authenticationdialog.cpp \ dialogs/languageselectiondialog.cpp \ - dialogs/settingsdialog.cpp \ - replies/createbookingreply.cpp \ - replies/createtimeassignmentreply.cpp \ - replies/deletebookingreply.cpp \ - replies/deletetimeassignmentreply.cpp \ - replies/getbookingsreply.cpp \ - replies/getpresencestatusreply.cpp \ - replies/getprojectsreply.cpp \ - replies/gettimeassignmentsreply.cpp \ - replies/loginpagereply.cpp \ - replies/loginreply.cpp \ - replies/updatebookingreply.cpp \ - replies/updatetimeassignmentreply.cpp \ - replies/zeiterfassungreply.cpp \ - replies/getuserinforeply.cpp \ - replies/getreportreply.cpp + dialogs/settingsdialog.cpp -HEADERS += cpp14polyfills.h \ - mainwindow.h \ +HEADERS += mainwindow.h \ stripfactory.h \ stripswidget.h \ - timeutils.h \ - zeiterfassungapi.h \ zeiterfassungguilib_global.h \ zeiterfassungplugin.h \ - zeiterfassungsettings.h \ dialogs/aboutmedialog.h \ dialogs/authenticationdialog.h \ dialogs/languageselectiondialog.h \ - dialogs/settingsdialog.h \ - replies/createbookingreply.h \ - replies/createtimeassignmentreply.h \ - replies/deletebookingreply.h \ - replies/deletetimeassignmentreply.h \ - replies/getbookingsreply.h \ - replies/getpresencestatusreply.h \ - replies/getprojectsreply.h \ - replies/gettimeassignmentsreply.h \ - replies/loginpagereply.h \ - replies/loginreply.h \ - replies/updatebookingreply.h \ - replies/updatetimeassignmentreply.h \ - replies/zeiterfassungreply.h \ - replies/getuserinforeply.h \ - replies/getreportreply.h + dialogs/settingsdialog.h FORMS += mainwindow.ui \ dialogs/settingsdialog.ui \ diff --git a/zeiterfassungguilib/zeiterfassungguilib_global.h b/zeiterfassungguilib/zeiterfassungguilib_global.h index 985c61f..3da52d5 100644 --- a/zeiterfassungguilib/zeiterfassungguilib_global.h +++ b/zeiterfassungguilib/zeiterfassungguilib_global.h @@ -1,6 +1,6 @@ #pragma once -#include +#include #if defined(ZEITERFASSUNGGUILIB_LIBRARY) # define ZEITERFASSUNGGUILIBSHARED_EXPORT Q_DECL_EXPORT -- 2.50.1 From 856ddd3c2635a93553aa83d1dbc2225881fb0a0c Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Thu, 21 Dec 2017 20:24:42 +0100 Subject: [PATCH 10/78] Added new user data fields also into dialog --- .../replies/getuserinforeply.cpp | 14 +- .../replies/getuserinforeply.h | 14 +- zeiterfassungguilib/dialogs/aboutmedialog.cpp | 12 + zeiterfassungguilib/dialogs/aboutmedialog.ui | 371 +++++++++++++----- .../translations/zeiterfassungguilib_de.ts | 80 +++- .../translations/zeiterfassungguilib_en.ts | 80 +++- 6 files changed, 446 insertions(+), 125 deletions(-) diff --git a/zeiterfassungcorelib/replies/getuserinforeply.cpp b/zeiterfassungcorelib/replies/getuserinforeply.cpp index 60caed0..7feb964 100644 --- a/zeiterfassungcorelib/replies/getuserinforeply.cpp +++ b/zeiterfassungcorelib/replies/getuserinforeply.cpp @@ -148,14 +148,14 @@ void GetUserInfoReply::request1Finished() if(!m_reply0) setSuccess(true); - m_userInfo.gemeinde = obj.value(QStringLiteral("gemeinde")).toString(); - m_userInfo.ort = obj.value(QStringLiteral("ort")).toString(); - m_userInfo.angFrom = QDate::fromString(QString::number(obj.value(QStringLiteral("angFrom")).toInt()), QStringLiteral("yyyyMMdd")); - m_userInfo.angTill = QDate::fromString(QString::number(obj.value(QStringLiteral("angTill")).toInt()), QStringLiteral("yyyyMMdd")); - m_userInfo.gebOrt = obj.value(QStringLiteral("gebOrt")).toString(); - m_userInfo.plz = obj.value(QStringLiteral("plz")).toString(); + 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.placeOfBirth = obj.value(QStringLiteral("gebOrt")).toString(); + m_userInfo.zipcode = obj.value(QStringLiteral("plz")).toString(); m_userInfo.religion = obj.value(QStringLiteral("religion")).toString(); - m_userInfo.bereich = obj.value(QStringLiteral("bereich")).toString(); + m_userInfo.department = obj.value(QStringLiteral("bereich")).toString(); m_userInfo.verwendgr = obj.value(QStringLiteral("verwendgr")).toString(); m_userInfo.taetig = obj.value(QStringLiteral("taetig")).toString(); m_userInfo.arbverh = obj.value(QStringLiteral("arbverh")).toString(); diff --git a/zeiterfassungcorelib/replies/getuserinforeply.h b/zeiterfassungcorelib/replies/getuserinforeply.h index 4be4278..7003506 100644 --- a/zeiterfassungcorelib/replies/getuserinforeply.h +++ b/zeiterfassungcorelib/replies/getuserinforeply.h @@ -24,14 +24,14 @@ public: QString longUsername; QString text; QString username; - QString gemeinde; - QString ort; - QDate angFrom; - QDate angTill; - QString gebOrt; - QString plz; + QString street; + QString city; + QDate employedSince; + QDate employedTill; + QString placeOfBirth; + QString zipcode; QString religion; - QString bereich; + QString department; QString verwendgr; QString taetig; QString arbverh; diff --git a/zeiterfassungguilib/dialogs/aboutmedialog.cpp b/zeiterfassungguilib/dialogs/aboutmedialog.cpp index 338a67b..473c1ac 100644 --- a/zeiterfassungguilib/dialogs/aboutmedialog.cpp +++ b/zeiterfassungguilib/dialogs/aboutmedialog.cpp @@ -12,6 +12,18 @@ AboutMeDialog::AboutMeDialog(const GetUserInfoReply::UserInfo &userInfo, QWidget ui->lineEditLongUsername->setText(userInfo.longUsername); ui->lineEditText->setText(userInfo.text); 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->lineEditPlaceOfBirth->setText(userInfo.placeOfBirth); + ui->lineEditZipcode->setText(userInfo.zipcode); + ui->lineEditReligion->setText(userInfo.religion); + ui->lineEditDepartment->setText(userInfo.department); + ui->lineEditVerwendgr->setText(userInfo.verwendgr); + ui->lineEditTaetig->setText(userInfo.taetig); + ui->lineEditArbverh->setText(userInfo.arbverh); + ui->lineEditBetriebsnr->setText(userInfo.betriebsnr); } AboutMeDialog::~AboutMeDialog() diff --git a/zeiterfassungguilib/dialogs/aboutmedialog.ui b/zeiterfassungguilib/dialogs/aboutmedialog.ui index 3564b77..d6f99d9 100644 --- a/zeiterfassungguilib/dialogs/aboutmedialog.ui +++ b/zeiterfassungguilib/dialogs/aboutmedialog.ui @@ -7,15 +7,9 @@ 0 0 454 - 0 + 281 - - - 16777215 - 0 - - About me @@ -33,96 +27,279 @@ - - - - - User-ID: - - - spinBoxUserId - - - - - - - E-Mail: - - - lineEditEmail - - - - - - - Long username: - - - lineEditLongUsername - - - - - - - Text: - - - lineEditText - - - - - - - Username: - - - lineEditUsername - - - - - - - true - - - 16777215 - - - - - - - true - - - - - - - true - - - - - - - true - - - - - - - true - - - - + + + true + + + + + 0 + 0 + 420 + 540 + + + + + + + User-ID: + + + spinBoxUserId + + + + + + + E-Mail: + + + lineEditEmail + + + + + + + Long username: + + + lineEditLongUsername + + + + + + + Text: + + + lineEditText + + + + + + + Username: + + + lineEditUsername + + + + + + + true + + + 16777215 + + + + + + + true + + + + + + + true + + + + + + + true + + + + + + + true + + + + + + + Street: + + + + + + + City: + + + + + + + Employed since: + + + + + + + Employed till: + + + + + + + Place of birth: + + + + + + + Zipcode: + + + + + + + Religion: + + + + + + + Department: + + + + + + + Verwendgr: + + + + + + + Taetig: + + + + + + + Arbverh: + + + + + + + Betriebsnr: + + + + + + + true + + + + + + + true + + + + + + + true + + + + + + + true + + + + + + + true + + + + + + + true + + + + + + + true + + + + + + + true + + + + + + + true + + + + + + + true + + + + + + + true + + + + + + + true + + + + + + diff --git a/zeiterfassungguilib/translations/zeiterfassungguilib_de.ts b/zeiterfassungguilib/translations/zeiterfassungguilib_de.ts index baf47aa..f2c1ce6 100644 --- a/zeiterfassungguilib/translations/zeiterfassungguilib_de.ts +++ b/zeiterfassungguilib/translations/zeiterfassungguilib_de.ts @@ -4,36 +4,102 @@ AboutMeDialog - - + + About me Über mich - + User-ID: Benutzer-ID: - + E-Mail: E-Mail: - + Long username: Langer Benutzername: - + Text: Text: - + Username: Benutzername: + + + Street: + Straße: + + + + City: + Stadt: + + + + Employed since: + Angestellt seit: + + + + Employed till: + Angestellt bis: + + + + Place of birth: + Geburtsort: + + + + Zipcode: + Postleitzahl: + + + + Religion: + Religion: + + + + Department: + Abteilung: + + + + Verwendgr: + Verwendgr: + + + + Taetig: + Taetig: + + + + Arbverh: + Arbverh: + + + + Betriebsnr: + Betriebsnr: + + + + + dd.MM.yyyy + dd.MM.yyyy + AuthenticationDialog diff --git a/zeiterfassungguilib/translations/zeiterfassungguilib_en.ts b/zeiterfassungguilib/translations/zeiterfassungguilib_en.ts index 27f9a57..3c57104 100644 --- a/zeiterfassungguilib/translations/zeiterfassungguilib_en.ts +++ b/zeiterfassungguilib/translations/zeiterfassungguilib_en.ts @@ -4,36 +4,102 @@ AboutMeDialog - - + + About me - + User-ID: - + E-Mail: - + Long username: - + Text: - + Username: + + + Street: + + + + + City: + + + + + Employed since: + + + + + Employed till: + + + + + Place of birth: + + + + + Zipcode: + + + + + Religion: + + + + + Department: + + + + + Verwendgr: + + + + + Taetig: + + + + + Arbverh: + + + + + Betriebsnr: + + + + + + dd.MM.yyyy + + AuthenticationDialog -- 2.50.1 From 0720659763597c880585e1934a31176749b5f871 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Thu, 21 Dec 2017 20:24:57 +0100 Subject: [PATCH 11/78] Added icon to about qt action --- zeiterfassungguilib/images/qt.png | Bin 0 -> 2384 bytes zeiterfassungguilib/mainwindow.ui | 28 ++++++++++-------- .../zeiterfassungguilib_resources.qrc | 1 + 3 files changed, 17 insertions(+), 12 deletions(-) create mode 100644 zeiterfassungguilib/images/qt.png diff --git a/zeiterfassungguilib/images/qt.png b/zeiterfassungguilib/images/qt.png new file mode 100644 index 0000000000000000000000000000000000000000..f0088ac5978f38c343b3be6bd7e9a06fe73bd6ce GIT binary patch literal 2384 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4mJh`hEl<@WFh54C|@OnICU|^8V42dXl&d<$F%`0I5 z0q3IB#FEq$h4Rdj3_pbK+*{te4Nd{*c z#LJ{thzfPcW&}!m1V$}gE0X9H(0%LDv<)E>TzNYjgeIMO#T1k|yQFi`r4SR(`U_^F zxf)(U9>N-_#%5;sKIZjLpIP~O@83qr&o+;r@@^|!^K;G5ho7hYez)^^&GX&QZ58?~ z9(5>#h-8i}MfNjKeU`rZcU@|#+7`1OFKV*T-tNhErdPB_|*xfgU3%dZ=GHir++p-)cT>2Ot97$*(+?F zT^+9)SeyFec|+#kE-B5oV`f(^IaSnc^Z(E7 z+rs~32<|_<;rW9LI~jXl2kc~Ab%nLWZx8jl55G;K{B|$=vq0j8!${l`r zZ4NCn!fQ8bvs>>~)$oaFcz7Z>jq6^feeYu4Bqu1C>Gz9U7GrWy(Ea;YuVbP(=Uf7)_>J6T=jag;^MyM$DcL%ADo=o-z>z` z*&n0En{b%NTYSa09ve@jRs_ps0Wik4#yu$HSnQI>IH!0LhyS04go8Q@W zt;xFYl^hEWxv6ltFsOfhTWdu)5oS@b0DBkY(>GLa(D>DOjDbnRK+$mNOVp;myCnsg*98;SL_xsJb9^h(;La=RZjV5YCAbg8yqrP zo|FVwZ+auSIIf;g;rPtdO{S}5zb{FbXl7=K;Ru=Wd8XHi(sP>vW>`#9*E5TJ_2gM# zs1Vbw_lK%Ini!Q^s+QhN(f_8?+THi(mrtTpSS8m)g&jWMRv(lO+}d)kbn>}!u5TOX z)aRrIC@}rI^l{i4siWnsn4fWXIhOw*vlEsFh3s27IXXaajdPp2>Kw7=g@v+86V>!s^I|-Pd-!(l`-P5~uCuSTmYwYn+bV2YBu4yTxd`)0)-aLoD8!MP!j)6v;&_cdNGjyEBjuDI^n+bt{1en-rip};xM zW$K-Z)rAHb{1a2pAGo$=eOvCzB%yETZZ^FS+tYKzahJj@;k?&9a>^VMG7OE@ZT{sI z_45@yi@KBdsjDh1P*~71tB!?5-Rhou@0}E@|C>*Ke>m|9yY5$E4uQ|wL418G2YXx3 zS?aI*y5>iMllfELBJRGee{>J+JN}(z($OP@^6}5DzTYzbnDJ}XU;7WWe|PRyb6mY4 zkn{NMe~GK4o*sKWUq_J?10&pYmI zy8qz*YCWeH{u4jCOnPz5dEWUqcc0$<@oYvo<7%0Q=2ag*w7z#`P*P!Ft=t zYdj@Qrt{mG3TFB?vFrDzIjPoDPX=G)sP zIT4B~4NeM7Et;P)Wgg31&RO}x>D1q))_YW!Dr-4PPn6p%?AiZSdF4qqUa2md(??|Q tO|q9?^WXI5>$`^p-DL`ofC)p6|Li=zNeY% - + :/zeiterfassungguilib/images/icon.png:/zeiterfassungguilib/images/icon.png @@ -30,7 +30,7 @@ - + :/zeiterfassungguilib/images/previous.png:/zeiterfassungguilib/images/previous.png @@ -44,7 +44,7 @@ - + :/zeiterfassungguilib/images/next.png:/zeiterfassungguilib/images/next.png @@ -74,7 +74,7 @@ - + :/zeiterfassungguilib/images/now.png:/zeiterfassungguilib/images/now.png @@ -248,7 +248,7 @@ - + :/zeiterfassungguilib/images/quit.png:/zeiterfassungguilib/images/quit.png @@ -257,7 +257,7 @@ - + :/zeiterfassungguilib/images/user.png:/zeiterfassungguilib/images/user.png @@ -266,7 +266,7 @@ - + :/zeiterfassungguilib/images/about.png:/zeiterfassungguilib/images/about.png @@ -274,13 +274,17 @@ + + + :/zeiterfassungguilib/images/qt.png:/zeiterfassungguilib/images/qt.png + About &Qt - + :/zeiterfassungguilib/images/today.png:/zeiterfassungguilib/images/today.png @@ -289,7 +293,7 @@ - + :/zeiterfassungguilib/images/refresh.png:/zeiterfassungguilib/images/refresh.png @@ -298,7 +302,7 @@ - + :/zeiterfassungguilib/images/settings.png:/zeiterfassungguilib/images/settings.png @@ -307,7 +311,7 @@ - + :/zeiterfassungguilib/images/help.png:/zeiterfassungguilib/images/help.png @@ -316,7 +320,7 @@ - + diff --git a/zeiterfassungguilib/zeiterfassungguilib_resources.qrc b/zeiterfassungguilib/zeiterfassungguilib_resources.qrc index b3f106b..2baf83f 100644 --- a/zeiterfassungguilib/zeiterfassungguilib_resources.qrc +++ b/zeiterfassungguilib/zeiterfassungguilib_resources.qrc @@ -7,6 +7,7 @@ images/next.png images/now.png images/previous.png + images/qt.png images/quit.png images/refresh.png images/settings.png -- 2.50.1 From 88b4e79282ecfa85019b1fc21ddc6cb9a7f6a7fe Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Thu, 21 Dec 2017 20:32:10 +0100 Subject: [PATCH 12/78] Added duration of current booking to booking end strip #40 --- zeiterfassung/strips/bookingendstrip.ui | 12 ++++- zeiterfassungguilib/stripswidget.cpp | 14 ++++-- zeiterfassungguilib/stripswidget.h | 2 +- .../translations/zeiterfassungguilib_de.ts | 44 ++++++++++--------- .../translations/zeiterfassungguilib_en.ts | 44 ++++++++++--------- 5 files changed, 68 insertions(+), 48 deletions(-) diff --git a/zeiterfassung/strips/bookingendstrip.ui b/zeiterfassung/strips/bookingendstrip.ui index 0116a4f..e901bb5 100644 --- a/zeiterfassung/strips/bookingendstrip.ui +++ b/zeiterfassung/strips/bookingendstrip.ui @@ -19,7 +19,7 @@ QFrame::Raised - + 10 @@ -73,6 +73,16 @@ + + + + background-color: rgba(0,0,0,30); + + + 9:99h + + + diff --git a/zeiterfassungguilib/stripswidget.cpp b/zeiterfassungguilib/stripswidget.cpp index 1984ef5..2abac45 100644 --- a/zeiterfassungguilib/stripswidget.cpp +++ b/zeiterfassungguilib/stripswidget.cpp @@ -352,7 +352,8 @@ bool StripsWidget::createStrips() lastBooking = &endBooking; - bookingTimespan = timeAdd(bookingTimespan, timeBetween(startBooking.time, endBooking.time)); + auto currBookingDuration = timeBetween(startBooking.time, endBooking.time); + bookingTimespan = timeAdd(bookingTimespan, currBookingDuration); minimumTime = timeAdd(endBooking.time, QTime(0, 1)); while(timeAssignmentTime < bookingTimespan) @@ -362,7 +363,7 @@ bool StripsWidget::createStrips() errorMessage = tr("Missing time assignment! Missing: %0") .arg(tr("%0h").arg(timeBetween(timeAssignmentTime, bookingTimespan).toString(tr("HH:mm:ss")))); - appendBookingEndStrip(endBooking.id, endBooking.time); + appendBookingEndStrip(endBooking.id, endBooking.time, currBookingDuration); goto after; } @@ -408,7 +409,7 @@ bool StripsWidget::createStrips() .arg(bookingTimespan.toString(tr("HH:mm:ss"))); } - appendBookingEndStrip(endBooking.id, endBooking.time); + appendBookingEndStrip(endBooking.id, endBooking.time, currBookingDuration); if(timeAssignmentTime > bookingTimespan) goto after; @@ -552,7 +553,7 @@ QWidget *StripsWidget::appendBookingStartStrip(int id, const QTime &time) return widget; } -QWidget *StripsWidget::appendBookingEndStrip(int id, const QTime &time) +QWidget *StripsWidget::appendBookingEndStrip(int id, const QTime &time, const QTime &duration) { auto widget = m_mainWindow.stripFactory().createBookingEndStrip(this).release(); @@ -561,6 +562,11 @@ QWidget *StripsWidget::appendBookingEndStrip(int id, const QTime &time) else qWarning() << "no labelTime found!"; + if(auto labelDuration = widget->findChild(QStringLiteral("labelDuration"))) + labelDuration->setProperty("text", tr("%0h").arg(duration.toString(tr("HH:mm")))); + else + qWarning() << "no labelDuration found!"; + if(auto labelId = widget->findChild(QStringLiteral("labelId"))) labelId->setProperty("text", QString::number(id)); else diff --git a/zeiterfassungguilib/stripswidget.h b/zeiterfassungguilib/stripswidget.h index 182c9ce..38f1b61 100644 --- a/zeiterfassungguilib/stripswidget.h +++ b/zeiterfassungguilib/stripswidget.h @@ -74,7 +74,7 @@ private: QString buildProjectString(const QString &project) const; QWidget *appendBookingStartStrip(int id, const QTime &time); - QWidget *appendBookingEndStrip(int id, const QTime &time); + QWidget *appendBookingEndStrip(int id, const QTime &time, const QTime &duration); QWidget *appendTimeAssignmentStrip(int id, const QTime &duration, const QString &project, const QString &subproject, const QString &workpackage, const QString &text); diff --git a/zeiterfassungguilib/translations/zeiterfassungguilib_de.ts b/zeiterfassungguilib/translations/zeiterfassungguilib_de.ts index f2c1ce6..5c5b234 100644 --- a/zeiterfassungguilib/translations/zeiterfassungguilib_de.ts +++ b/zeiterfassungguilib/translations/zeiterfassungguilib_de.ts @@ -214,27 +214,27 @@ Über &zeiterfassung - + About &Qt Über &Qt - + &Today &Heute - + &Refresh everything Alles &neu laden - + &Settings &Einstellungen - + Help Hilfe @@ -393,7 +393,7 @@ Booking ID: %1 - + %0: %1 %0: %1 @@ -404,17 +404,19 @@ Booking ID: %1 - - + + + %0h %0h - - - - + + + + + HH:mm HH:mm @@ -424,15 +426,15 @@ Booking ID: %1 Kontierung fehlend! - - + + HH:mm:ss HH:mm:ss - + There is another booking after an unfinished time assignment. Booking ID: %0 Time assignment ID: %1 @@ -441,7 +443,7 @@ Time assignment ID: %1 - + There is another time assignment after an unfinished time assignment. Time assignment ID: %0 Time assignment ID: %1 @@ -460,12 +462,12 @@ Booking ID: %1 - + Missing time assignment! Missing: %0 Kontierung fehlend! %0 nicht kontiert - + Assigned time Kontierte Zeit @@ -480,14 +482,14 @@ Booking ID: %1 %0 (%1) - + Time assignment time longer than booking time! Time assignment: %0 Booking: %1 - + Strip rendering aborted due error. Your bookings and time assignments for this day are in an illegal state! @@ -533,7 +535,7 @@ Your bookings and time assignments for this day are in an illegal state!Ungültig - + Open Offen diff --git a/zeiterfassungguilib/translations/zeiterfassungguilib_en.ts b/zeiterfassungguilib/translations/zeiterfassungguilib_en.ts index 3c57104..d2dbf7d 100644 --- a/zeiterfassungguilib/translations/zeiterfassungguilib_en.ts +++ b/zeiterfassungguilib/translations/zeiterfassungguilib_en.ts @@ -214,27 +214,27 @@ - + About &Qt - + &Today - + &Refresh everything - + &Settings - + Help @@ -393,7 +393,7 @@ Booking ID: %1 - + %0: %1 @@ -404,17 +404,19 @@ Booking ID: %1 - - + + + %0h - - - - + + + + + HH:mm @@ -424,15 +426,15 @@ Booking ID: %1 - - + + HH:mm:ss - + There is another booking after an unfinished time assignment. Booking ID: %0 Time assignment ID: %1 @@ -441,7 +443,7 @@ Time assignment ID: %1 - + There is another time assignment after an unfinished time assignment. Time assignment ID: %0 Time assignment ID: %1 @@ -460,24 +462,24 @@ Booking ID: %1 - + Missing time assignment! Missing: %0 - + Time assignment time longer than booking time! Time assignment: %0 Booking: %1 - + Assigned time - + Strip rendering aborted due error. Your bookings and time assignments for this day are in an illegal state! @@ -533,7 +535,7 @@ Your bookings and time assignments for this day are in an illegal state! - + Open -- 2.50.1 From 2c495454fb8039dd756ae023a437e26400c64900 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Thu, 21 Dec 2017 20:59:45 +0100 Subject: [PATCH 13/78] Added .travis.yml --- .travis.yml | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..cd1cba7 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,23 @@ +language: cpp +os: + - linux +dist: trusty +compiler: + - clang + - gcc + +before_install: + - sudo add-apt-repository --yes ppa:ubuntu-sdk-team/ppa + - sudo apt update -qq + +install: + - sudo apt install -qq -y qt5-default qt5-qmake qttools5-dev qttools5-dev-tools + +before_script: + - mkdir -p build + - pushd build + - qmake .. -config release + - popd + +script: + - make -C build \ No newline at end of file -- 2.50.1 From af805754b856869b3f966b41a90fdc13535317cb Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Thu, 21 Dec 2017 21:16:37 +0100 Subject: [PATCH 14/78] Added devtoolsplugin --- plugins/devtoolsplugin/devtoolsplugin.cpp | 33 +++++++++++++++++ plugins/devtoolsplugin/devtoolsplugin.h | 22 ++++++++++++ plugins/devtoolsplugin/devtoolsplugin.json | 0 plugins/devtoolsplugin/devtoolsplugin.pro | 35 +++++++++++++++++++ .../translations/devtoolsplugin_de.ts | 4 +++ .../translations/devtoolsplugin_en.ts | 4 +++ plugins/plugins.pro | 1 + 7 files changed, 99 insertions(+) create mode 100644 plugins/devtoolsplugin/devtoolsplugin.cpp create mode 100644 plugins/devtoolsplugin/devtoolsplugin.h create mode 100644 plugins/devtoolsplugin/devtoolsplugin.json create mode 100644 plugins/devtoolsplugin/devtoolsplugin.pro create mode 100644 plugins/devtoolsplugin/translations/devtoolsplugin_de.ts create mode 100644 plugins/devtoolsplugin/translations/devtoolsplugin_en.ts diff --git a/plugins/devtoolsplugin/devtoolsplugin.cpp b/plugins/devtoolsplugin/devtoolsplugin.cpp new file mode 100644 index 0000000..9fc1c28 --- /dev/null +++ b/plugins/devtoolsplugin/devtoolsplugin.cpp @@ -0,0 +1,33 @@ +#include "devtoolsplugin.h" + +#include +#include +#include +#include + +#include "mainwindow.h" + +DevToolsPlugin::DevToolsPlugin(QObject *parent) : + ZeiterfassungPlugin(parent) +{ + qDebug() << "called"; + + static auto dir = QDir(QCoreApplication::applicationDirPath()).absoluteFilePath(QStringLiteral("translations")); + + if(m_translator.load(QLocale(), QStringLiteral("devtoolsplugin"), QStringLiteral("_"), dir)) + { + if(!QCoreApplication::installTranslator(&m_translator)) + { + qWarning() << "could not install translation devtoolsplugin"; + } + } + else + { + qWarning() << "could not load translation devtoolsplugin"; + } +} + +void DevToolsPlugin::attachTo(MainWindow &mainWindow) +{ + //TODO +} diff --git a/plugins/devtoolsplugin/devtoolsplugin.h b/plugins/devtoolsplugin/devtoolsplugin.h new file mode 100644 index 0000000..f02e084 --- /dev/null +++ b/plugins/devtoolsplugin/devtoolsplugin.h @@ -0,0 +1,22 @@ +#pragma once + +#include +#include + +#include "zeiterfassungplugin.h" + +class Q_DECL_EXPORT DevToolsPlugin : public ZeiterfassungPlugin +{ + Q_OBJECT + Q_PLUGIN_METADATA(IID "dbsoftware.zeiterfassung.plugin/1.0" FILE "devtoolsplugin.json") + Q_INTERFACES(ZeiterfassungPlugin) + +public: + explicit DevToolsPlugin(QObject *parent = Q_NULLPTR); + + // ZeiterfassungPlugin interface + void attachTo(MainWindow &mainWindow) Q_DECL_OVERRIDE; + +private: + QTranslator m_translator; +}; diff --git a/plugins/devtoolsplugin/devtoolsplugin.json b/plugins/devtoolsplugin/devtoolsplugin.json new file mode 100644 index 0000000..e69de29 diff --git a/plugins/devtoolsplugin/devtoolsplugin.pro b/plugins/devtoolsplugin/devtoolsplugin.pro new file mode 100644 index 0000000..b22008b --- /dev/null +++ b/plugins/devtoolsplugin/devtoolsplugin.pro @@ -0,0 +1,35 @@ +QT += core network gui widgets + +TARGET = devtoolsplugin +TEMPLATE = lib + +CONFIG += shared c++14 + +DESTDIR = $${OUT_PWD}/../../bin/plugins/zeiterfassung + +LIBS += -L$$OUT_PWD/../../lib -lzeiterfassungcorelib -lzeiterfassungguilib + +INCLUDEPATH += $$PWD/../../zeiterfassungcorelib $$PWD/../../zeiterfassungguilib +DEPENDPATH += $$PWD/../../zeiterfassungcorelib $$PWD/../../zeiterfassungguilib + +DEFINES += QT_DEPRECATED_WARNINGS QT_DISABLE_DEPRECATED_BEFORE=0x060000 QT_MESSAGELOGCONTEXT + +HEADERS += devtoolsplugin.h + +SOURCES += devtoolsplugin.cpp + +FORMS += + +RESOURCES += + +TRANSLATIONS += translations/devtoolsplugin_en.ts \ + translations/devtoolsplugin_de.ts + +OTHER_FILES += devtoolsplugin.json + +include(../../lrelease.pri) + +COMPILED_TRANSLATIONS += $${OUT_PWD}/translations/devtoolsplugin_en.qm \ + $${OUT_PWD}/translations/devtoolsplugin_de.qm + +include(../copy_translations.pri) diff --git a/plugins/devtoolsplugin/translations/devtoolsplugin_de.ts b/plugins/devtoolsplugin/translations/devtoolsplugin_de.ts new file mode 100644 index 0000000..1552582 --- /dev/null +++ b/plugins/devtoolsplugin/translations/devtoolsplugin_de.ts @@ -0,0 +1,4 @@ + + + + diff --git a/plugins/devtoolsplugin/translations/devtoolsplugin_en.ts b/plugins/devtoolsplugin/translations/devtoolsplugin_en.ts new file mode 100644 index 0000000..bc6d6e7 --- /dev/null +++ b/plugins/devtoolsplugin/translations/devtoolsplugin_en.ts @@ -0,0 +1,4 @@ + + + + diff --git a/plugins/plugins.pro b/plugins/plugins.pro index f8c26c3..dab007d 100644 --- a/plugins/plugins.pro +++ b/plugins/plugins.pro @@ -1,6 +1,7 @@ TEMPLATE = subdirs SUBDIRS += advancedviewplugin \ + devtoolsplugin \ lunchmealplugin \ presenceplugin \ reportsplugin \ -- 2.50.1 From 2b1cdc2bd0040e9ff07d58c7d23a6addb7c6aeb9 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Thu, 21 Dec 2017 21:22:01 +0100 Subject: [PATCH 15/78] Splitted plugin loading and attaching to mainwindow --- plugins/devtoolsplugin/devtoolsplugin.cpp | 7 ++++ zeiterfassung/main.cpp | 42 ++++++++--------------- 2 files changed, 22 insertions(+), 27 deletions(-) diff --git a/plugins/devtoolsplugin/devtoolsplugin.cpp b/plugins/devtoolsplugin/devtoolsplugin.cpp index 9fc1c28..db8ffd3 100644 --- a/plugins/devtoolsplugin/devtoolsplugin.cpp +++ b/plugins/devtoolsplugin/devtoolsplugin.cpp @@ -7,6 +7,13 @@ #include "mainwindow.h" +void registerMessageHandler() +{ + qDebug() << "called"; +} + +Q_COREAPP_STARTUP_FUNCTION(registerMessageHandler) + DevToolsPlugin::DevToolsPlugin(QObject *parent) : ZeiterfassungPlugin(parent) { diff --git a/zeiterfassung/main.cpp b/zeiterfassung/main.cpp index 4b6c39a..2d5eb51 100755 --- a/zeiterfassung/main.cpp +++ b/zeiterfassung/main.cpp @@ -1,3 +1,5 @@ +#include + #include #include #include @@ -32,7 +34,7 @@ struct { QTranslator zeiterfassungguilibTranslator; } translators; -QVector plugins; +QVector > pluginLoaders; bool loadAndInstallTranslator(QTranslator &translator, const QString &filename) { @@ -270,44 +272,25 @@ bool loadPlugins(QSplashScreen &splashScreen) ).absoluteFilePath(QStringLiteral("zeiterfassung")) ); - for(const auto &fileInfo : dir.entryInfoList(QDir::Files)) + for(const auto &fileInfo : dir.entryInfoList(QDir::Files | QDir::NoSymLinks)) { - if(fileInfo.isSymLink()) - { - qWarning() << "skipping" << fileInfo.fileName() << "because symlink"; - continue; // to skip unix so symlinks - } - if(!QLibrary::isLibrary(fileInfo.filePath())) { qWarning() << "skipping" << fileInfo.fileName() << "because no QLibrary"; continue; // to skip windows junk files } - qDebug() << "loading" << fileInfo.fileName(); - - QPluginLoader loader(fileInfo.filePath()); - if(!loader.load()) + auto pluginLoader = std::make_shared(fileInfo.filePath()); + if(!pluginLoader->load()) { QMessageBox::warning(&splashScreen, QCoreApplication::translate("main", "Could not load plugin %0!"), QCoreApplication::translate("main", "Could not load plugin %0!").arg(fileInfo.fileName()) % - "\n\n" % loader.errorString()); + "\n\n" % pluginLoader->errorString()); ok = false; continue; } - auto plugin = qobject_cast(loader.instance()); - - if(!plugin) - { - QMessageBox::warning(&splashScreen, QCoreApplication::translate("main", "Plugin not valid %0!"), - QCoreApplication::translate("main", "Plugin not valid %0!").arg(fileInfo.fileName()) % - "\n\n" % loader.errorString()); - ok = false; - continue; - } - - plugins.append(plugin); + pluginLoaders.append(pluginLoader); } return ok; @@ -370,8 +353,13 @@ int main(int argc, char *argv[]) MainWindow mainWindow(settings, erfassung, userInfo, stripFactory); splashScreen.finish(&mainWindow); - for(auto plugin : plugins) - plugin->attachTo(mainWindow); + for(auto &pluginLoader : pluginLoaders) + if(auto plugin = qobject_cast(pluginLoader->instance())) + plugin->attachTo(mainWindow); + else + QMessageBox::warning(&splashScreen, QCoreApplication::translate("main", "Plugin not valid %0!"), + QCoreApplication::translate("main", "Plugin not valid %0!").arg(pluginLoader->fileName()) % + "\n\n" % pluginLoader->errorString()); mainWindow.show(); -- 2.50.1 From d301a9bd71c7b1fa55e4b490168fe272c140b120 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Thu, 21 Dec 2017 21:29:13 +0100 Subject: [PATCH 16/78] Added LogDialog and LogModel --- plugins/devtoolsplugin/devtoolsplugin.cpp | 25 +++++++- plugins/devtoolsplugin/devtoolsplugin.pro | 11 +++- plugins/devtoolsplugin/logdialog.cpp | 19 ++++++ plugins/devtoolsplugin/logdialog.h | 24 ++++++++ plugins/devtoolsplugin/logdialog.ui | 67 ++++++++++++++++++++++ plugins/devtoolsplugin/logmodel.cpp | 70 +++++++++++++++++++++++ plugins/devtoolsplugin/logmodel.h | 39 +++++++++++++ 7 files changed, 250 insertions(+), 5 deletions(-) create mode 100644 plugins/devtoolsplugin/logdialog.cpp create mode 100644 plugins/devtoolsplugin/logdialog.h create mode 100644 plugins/devtoolsplugin/logdialog.ui create mode 100644 plugins/devtoolsplugin/logmodel.cpp create mode 100644 plugins/devtoolsplugin/logmodel.h diff --git a/plugins/devtoolsplugin/devtoolsplugin.cpp b/plugins/devtoolsplugin/devtoolsplugin.cpp index db8ffd3..df80d05 100644 --- a/plugins/devtoolsplugin/devtoolsplugin.cpp +++ b/plugins/devtoolsplugin/devtoolsplugin.cpp @@ -1,15 +1,34 @@ #include "devtoolsplugin.h" +#include + #include #include #include #include +#include +#include #include "mainwindow.h" +#include "logmodel.h" +#include "logdialog.h" + +std::shared_ptr model; +QtMessageHandler previousHandler; + +void myMessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &message) +{ + previousHandler(type, context, message); + + if(!model) + model = std::make_shared(); + model->log(type, context.file, context.line, context.function, context.category, message); +} + void registerMessageHandler() { - qDebug() << "called"; + previousHandler = qInstallMessageHandler(myMessageHandler); } Q_COREAPP_STARTUP_FUNCTION(registerMessageHandler) @@ -36,5 +55,7 @@ DevToolsPlugin::DevToolsPlugin(QObject *parent) : void DevToolsPlugin::attachTo(MainWindow &mainWindow) { - //TODO + auto dialog = new LogDialog(&mainWindow); + dialog->setModel(model.get()); + mainWindow.menuTools()->addAction(tr("Show log"), dialog, &QDialog::open); } diff --git a/plugins/devtoolsplugin/devtoolsplugin.pro b/plugins/devtoolsplugin/devtoolsplugin.pro index b22008b..d856846 100644 --- a/plugins/devtoolsplugin/devtoolsplugin.pro +++ b/plugins/devtoolsplugin/devtoolsplugin.pro @@ -14,11 +14,16 @@ DEPENDPATH += $$PWD/../../zeiterfassungcorelib $$PWD/../../zeiterfassungguilib DEFINES += QT_DEPRECATED_WARNINGS QT_DISABLE_DEPRECATED_BEFORE=0x060000 QT_MESSAGELOGCONTEXT -HEADERS += devtoolsplugin.h +HEADERS += devtoolsplugin.h \ + logmodel.h \ + logdialog.h -SOURCES += devtoolsplugin.cpp +SOURCES += devtoolsplugin.cpp \ + logmodel.cpp \ + logdialog.cpp -FORMS += +FORMS += \ + logdialog.ui RESOURCES += diff --git a/plugins/devtoolsplugin/logdialog.cpp b/plugins/devtoolsplugin/logdialog.cpp new file mode 100644 index 0000000..8605398 --- /dev/null +++ b/plugins/devtoolsplugin/logdialog.cpp @@ -0,0 +1,19 @@ +#include "logdialog.h" +#include "ui_logdialog.h" + +LogDialog::LogDialog(QWidget *parent) : + QDialog(parent), + ui(new Ui::LogDialog) +{ + ui->setupUi(this); +} + +LogDialog::~LogDialog() +{ + delete ui; +} + +void LogDialog::setModel(QAbstractItemModel *model) +{ + ui->treeView->setModel(model); +} diff --git a/plugins/devtoolsplugin/logdialog.h b/plugins/devtoolsplugin/logdialog.h new file mode 100644 index 0000000..52ae161 --- /dev/null +++ b/plugins/devtoolsplugin/logdialog.h @@ -0,0 +1,24 @@ +#ifndef LOGDIALOG_H +#define LOGDIALOG_H + +#include + +class QAbstractItemModel; + +namespace Ui { class LogDialog; } + +class LogDialog : public QDialog +{ + Q_OBJECT + +public: + explicit LogDialog(QWidget *parent = 0); + ~LogDialog(); + + void setModel(QAbstractItemModel *model); + +private: + Ui::LogDialog *ui; +}; + +#endif // LOGDIALOG_H diff --git a/plugins/devtoolsplugin/logdialog.ui b/plugins/devtoolsplugin/logdialog.ui new file mode 100644 index 0000000..eb5c262 --- /dev/null +++ b/plugins/devtoolsplugin/logdialog.ui @@ -0,0 +1,67 @@ + + + LogDialog + + + + 0 + 0 + 400 + 300 + + + + Log + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Close + + + + + + + + + buttonBox + accepted() + LogDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + LogDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/plugins/devtoolsplugin/logmodel.cpp b/plugins/devtoolsplugin/logmodel.cpp new file mode 100644 index 0000000..2da7363 --- /dev/null +++ b/plugins/devtoolsplugin/logmodel.cpp @@ -0,0 +1,70 @@ +#include "logmodel.h" + +LogModel::LogModel(QObject *parent) : + QAbstractListModel(parent) +{ +} + +void LogModel::log(QtMsgType type, const char *fileName, int lineNumber, const char *functionName, const char *categoryName, const QString &message) +{ + beginInsertRows(QModelIndex(), m_entries.count(), m_entries.count()); + m_entries.append(Entry { QDateTime::currentDateTime(), type, fileName, lineNumber, functionName, categoryName, message }); + endInsertRows(); +} + +int LogModel::rowCount(const QModelIndex &parent) const +{ + Q_UNUSED(parent) + return m_entries.count(); +} + +int LogModel::columnCount(const QModelIndex &parent) const +{ + Q_UNUSED(parent) + return 4; +} + +QVariant LogModel::data(const QModelIndex &index, int role) const +{ + Q_ASSERT(index.row() < m_entries.count()); + const auto &entry = m_entries.at(index.row()); + + switch(role) + { + case Qt::DisplayRole: + case Qt::EditRole: + switch(index.column()) + { + case 0: return entry.type; + case 1: return entry.dateTime.toString(QStringLiteral("dd.MM.yyyy HH:mm:ss.zzz")); + case 2: return entry.functionName; + case 3: return entry.message; + } + } + + return QVariant(); +} + +QVariant LogModel::headerData(int section, Qt::Orientation orientation, int role) const +{ + switch(orientation) + { + case Qt::Horizontal: + switch(role) + { + case Qt::DisplayRole: + case Qt::EditRole: + switch(section) + { + case 0: return tr("Type"); + case 1: return tr("Timestamp"); + case 2: return tr("Function"); + case 3: return tr("Message"); + } + } + default: + qt_noop(); + } + + return QVariant(); +} diff --git a/plugins/devtoolsplugin/logmodel.h b/plugins/devtoolsplugin/logmodel.h new file mode 100644 index 0000000..75d9eb5 --- /dev/null +++ b/plugins/devtoolsplugin/logmodel.h @@ -0,0 +1,39 @@ +#ifndef LOGMODEL_H +#define LOGMODEL_H + +#include +#include +#include +#include + +class LogModel : public QAbstractListModel +{ + Q_OBJECT + +public: + explicit LogModel(QObject *parent = Q_NULLPTR); + + void log(QtMsgType type, const char *fileName, int lineNumber, const char *functionName, const char *categoryName, const QString &message); + + // QAbstractItemModel interface + int rowCount(const QModelIndex &parent) const Q_DECL_OVERRIDE; + int columnCount(const QModelIndex &parent) const Q_DECL_OVERRIDE; + QVariant data(const QModelIndex &index, int role) const Q_DECL_OVERRIDE; + QVariant headerData(int section, Qt::Orientation orientation, int role) const Q_DECL_OVERRIDE; + +private: + struct Entry + { + QDateTime dateTime; + QtMsgType type; + const char *fileName; + int lineNumber; + const char *functionName; + const char *categoryName; + QString message; + }; + + QList m_entries; +}; + +#endif // LOGMODEL_H -- 2.50.1 From f4cf491051e80f63e6984776c3d364ed3d8ad4c3 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Thu, 21 Dec 2017 21:33:46 +0100 Subject: [PATCH 17/78] Translated devtoolsplugin --- plugins/devtoolsplugin/devtoolsplugin.cpp | 3 +- plugins/devtoolsplugin/devtoolsplugin.pro | 2 +- .../devtoolsplugin_resources.qrc | 5 ++ plugins/devtoolsplugin/images/dev-tools.png | Bin 0 -> 3327 bytes plugins/devtoolsplugin/logdialog.ui | 2 +- plugins/devtoolsplugin/logmodel.cpp | 12 +++- .../translations/devtoolsplugin_de.ts | 53 ++++++++++++++++++ .../translations/devtoolsplugin_en.ts | 53 ++++++++++++++++++ 8 files changed, 126 insertions(+), 4 deletions(-) create mode 100644 plugins/devtoolsplugin/devtoolsplugin_resources.qrc create mode 100644 plugins/devtoolsplugin/images/dev-tools.png diff --git a/plugins/devtoolsplugin/devtoolsplugin.cpp b/plugins/devtoolsplugin/devtoolsplugin.cpp index df80d05..3174313 100644 --- a/plugins/devtoolsplugin/devtoolsplugin.cpp +++ b/plugins/devtoolsplugin/devtoolsplugin.cpp @@ -57,5 +57,6 @@ void DevToolsPlugin::attachTo(MainWindow &mainWindow) { auto dialog = new LogDialog(&mainWindow); dialog->setModel(model.get()); - mainWindow.menuTools()->addAction(tr("Show log"), dialog, &QDialog::open); + mainWindow.menuTools()->addAction(QIcon(QStringLiteral(":/zeiterfassung/plugins/devtoolsplugin/images/dev-tools.png")), + tr("Show log"), dialog, &QDialog::open); } diff --git a/plugins/devtoolsplugin/devtoolsplugin.pro b/plugins/devtoolsplugin/devtoolsplugin.pro index d856846..424bf9e 100644 --- a/plugins/devtoolsplugin/devtoolsplugin.pro +++ b/plugins/devtoolsplugin/devtoolsplugin.pro @@ -25,7 +25,7 @@ SOURCES += devtoolsplugin.cpp \ FORMS += \ logdialog.ui -RESOURCES += +RESOURCES += devtoolsplugin_resources.qrc TRANSLATIONS += translations/devtoolsplugin_en.ts \ translations/devtoolsplugin_de.ts diff --git a/plugins/devtoolsplugin/devtoolsplugin_resources.qrc b/plugins/devtoolsplugin/devtoolsplugin_resources.qrc new file mode 100644 index 0000000..5c8bd5c --- /dev/null +++ b/plugins/devtoolsplugin/devtoolsplugin_resources.qrc @@ -0,0 +1,5 @@ + + + images/dev-tools.png + + diff --git a/plugins/devtoolsplugin/images/dev-tools.png b/plugins/devtoolsplugin/images/dev-tools.png new file mode 100644 index 0000000000000000000000000000000000000000..a12dbb094a8ff1b92db9643abb1edb769c9d06fd GIT binary patch literal 3327 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 P)RFOY^>bP0l+XkKoWSh{ literal 0 HcmV?d00001 diff --git a/plugins/devtoolsplugin/logdialog.ui b/plugins/devtoolsplugin/logdialog.ui index eb5c262..583dbcc 100644 --- a/plugins/devtoolsplugin/logdialog.ui +++ b/plugins/devtoolsplugin/logdialog.ui @@ -6,7 +6,7 @@ 0 0 - 400 + 694 300 diff --git a/plugins/devtoolsplugin/logmodel.cpp b/plugins/devtoolsplugin/logmodel.cpp index 2da7363..ad71ceb 100644 --- a/plugins/devtoolsplugin/logmodel.cpp +++ b/plugins/devtoolsplugin/logmodel.cpp @@ -35,7 +35,17 @@ QVariant LogModel::data(const QModelIndex &index, int role) const case Qt::EditRole: switch(index.column()) { - case 0: return entry.type; + case 0: + { + switch(entry.type) + { + case QtDebugMsg: return tr("Debug"); + case QtWarningMsg: return tr("Warning"); + case QtCriticalMsg: return tr("Critical"); + case QtFatalMsg: return tr("Fatal"); + case QtInfoMsg: return tr("Info"); + } + } case 1: return entry.dateTime.toString(QStringLiteral("dd.MM.yyyy HH:mm:ss.zzz")); case 2: return entry.functionName; case 3: return entry.message; diff --git a/plugins/devtoolsplugin/translations/devtoolsplugin_de.ts b/plugins/devtoolsplugin/translations/devtoolsplugin_de.ts index 1552582..f0cf20a 100644 --- a/plugins/devtoolsplugin/translations/devtoolsplugin_de.ts +++ b/plugins/devtoolsplugin/translations/devtoolsplugin_de.ts @@ -1,4 +1,57 @@ + + DevToolsPlugin + + Show log + Log anzeigen + + + + LogDialog + + Log + Log + + + + LogModel + + Type + Typ + + + Timestamp + Zeitpunkt + + + Function + Funktion + + + Message + Nachricht + + + Debug + Debug + + + Warning + Warnung + + + Critical + Kritisch + + + Fatal + Fatal + + + Info + Info + + diff --git a/plugins/devtoolsplugin/translations/devtoolsplugin_en.ts b/plugins/devtoolsplugin/translations/devtoolsplugin_en.ts index bc6d6e7..93ffe55 100644 --- a/plugins/devtoolsplugin/translations/devtoolsplugin_en.ts +++ b/plugins/devtoolsplugin/translations/devtoolsplugin_en.ts @@ -1,4 +1,57 @@ + + DevToolsPlugin + + Show log + + + + + LogDialog + + Log + + + + + LogModel + + Type + + + + Timestamp + + + + Function + + + + Message + + + + Debug + + + + Warning + + + + Critical + + + + Fatal + + + + Info + + + -- 2.50.1 From b767ece5c507dc15833dc83a9296280bbae584bd Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Thu, 21 Dec 2017 21:39:51 +0100 Subject: [PATCH 18/78] Fixed buttons getting disabled in MainWindow --- .../translations/zeiterfassung_de.ts | 70 +++++++++---------- .../translations/zeiterfassung_en.ts | 70 +++++++++---------- zeiterfassungguilib/mainwindow.cpp | 12 ---- 3 files changed, 70 insertions(+), 82 deletions(-) diff --git a/zeiterfassung/translations/zeiterfassung_de.ts b/zeiterfassung/translations/zeiterfassung_de.ts index 777228f..a5213e5 100644 --- a/zeiterfassung/translations/zeiterfassung_de.ts +++ b/zeiterfassung/translations/zeiterfassung_de.ts @@ -20,113 +20,113 @@ main - + Loading settings... Lade Einstellungen... - + Loading translations... Lade Übersetzungen... - - + + Invalid language selection! Ungültige Sprachauswahl! - + You did not select a valid language! Sie haben keine gültige Sprachauswahl getroffen! - + Loading theme... Lade Aussehen... - - - - + + + + Could not load theme! Konnte Aussehen nicht laden! - + Theme file does not exist! Aussehen-Datei existiert nicht! - + Loading login page... Lade Login-Seite... - - + + Could not access Zeiterfassung! Konnte Zeiterfassung nicht erreichen! - + Base url Basis URL - + Please enter the base url to the Zeiterfassung: Bitte geben Sie die Basis URL zur Zeiterfassung ein: - + Authenticating... Authentifiziere... - - + + Could not authenticate with Zeiterfassung! Konnte nicht mit Zeiterfassung authentifizieren! - + Getting user information... Hole Benutzer Information... - - + + Could not get user information! Konnte Benutzer Information nicht holen! - - + + Could not load plugin %0! Konnte Plugin %0 nicht laden! - - + + Plugin not valid %0! Plugin %0 nicht gültig! - + Loading strip layouts... Lade Streifenlayouts... - - - - - - - - + + + + + + + + Could not load strips! Konnte Streifenlayouts nicht laden! diff --git a/zeiterfassung/translations/zeiterfassung_en.ts b/zeiterfassung/translations/zeiterfassung_en.ts index 0229025..f881ea3 100644 --- a/zeiterfassung/translations/zeiterfassung_en.ts +++ b/zeiterfassung/translations/zeiterfassung_en.ts @@ -20,113 +20,113 @@ main - + Loading settings... - + Loading translations... - - + + Invalid language selection! - + You did not select a valid language! - + Loading theme... - - - - + + + + Could not load theme! - + Theme file does not exist! - + Loading login page... - - + + Could not access Zeiterfassung! - + Base url - + Please enter the base url to the Zeiterfassung: - + Authenticating... - - + + Could not authenticate with Zeiterfassung! - + Getting user information... - - + + Could not get user information! - - + + Could not load plugin %0! - - + + Plugin not valid %0! - + Loading strip layouts... - - - - - - - - + + + + + + + + Could not load strips! diff --git a/zeiterfassungguilib/mainwindow.cpp b/zeiterfassungguilib/mainwindow.cpp index 29abb46..2a35266 100644 --- a/zeiterfassungguilib/mainwindow.cpp +++ b/zeiterfassungguilib/mainwindow.cpp @@ -254,12 +254,6 @@ void MainWindow::pushButtonStartPressed() } else m_currentStripWidget->refreshTimeAssignments(); - - ui->actionToday->setEnabled(false); - ui->actionRefresh->setEnabled(false); - ui->dateEditDate->setReadOnly(true); - ui->pushButtonPrev->setEnabled(false); - ui->pushButtonNext->setEnabled(false); } void MainWindow::pushButtonEndPressed() @@ -302,12 +296,6 @@ void MainWindow::pushButtonEndPressed() m_currentStripWidget->refresh(); //refreshReport(); - - ui->actionToday->setEnabled(false); - ui->actionRefresh->setEnabled(false); - ui->dateEditDate->setReadOnly(true); - ui->pushButtonPrev->setEnabled(false); - ui->pushButtonNext->setEnabled(false); } void MainWindow::dateChangedSlot(const QDate &date) -- 2.50.1 From f397c64e9a1c3e1549aa784b5f4dcf87962f6bb5 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Thu, 21 Dec 2017 21:42:23 +0100 Subject: [PATCH 19/78] Added webradioplugin --- plugins/plugins.pro | 3 +- plugins/webradioplugin/images/web-radio.png | Bin 0 -> 4209 bytes .../translations/webradioplugin_de.ts | 12 ++++++ .../translations/webradioplugin_en.ts | 12 ++++++ plugins/webradioplugin/webradioplugin.cpp | 40 ++++++++++++++++++ plugins/webradioplugin/webradioplugin.h | 22 ++++++++++ plugins/webradioplugin/webradioplugin.json | 0 plugins/webradioplugin/webradioplugin.pro | 35 +++++++++++++++ .../webradioplugin_resources.qrc | 5 +++ 9 files changed, 128 insertions(+), 1 deletion(-) create mode 100644 plugins/webradioplugin/images/web-radio.png create mode 100644 plugins/webradioplugin/translations/webradioplugin_de.ts create mode 100644 plugins/webradioplugin/translations/webradioplugin_en.ts create mode 100644 plugins/webradioplugin/webradioplugin.cpp create mode 100644 plugins/webradioplugin/webradioplugin.h create mode 100644 plugins/webradioplugin/webradioplugin.json create mode 100644 plugins/webradioplugin/webradioplugin.pro create mode 100644 plugins/webradioplugin/webradioplugin_resources.qrc diff --git a/plugins/plugins.pro b/plugins/plugins.pro index dab007d..5a6d1f5 100644 --- a/plugins/plugins.pro +++ b/plugins/plugins.pro @@ -6,4 +6,5 @@ SUBDIRS += advancedviewplugin \ presenceplugin \ reportsplugin \ updaterplugin \ - weatherplugin + weatherplugin \ + webradioplugin diff --git a/plugins/webradioplugin/images/web-radio.png b/plugins/webradioplugin/images/web-radio.png new file mode 100644 index 0000000000000000000000000000000000000000..c68d7c11690f317fe2d334bf8705d11bc5e390d5 GIT binary patch literal 4209 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 + + + + WebRadioPlugin + + + Play webradio + + + + diff --git a/plugins/webradioplugin/translations/webradioplugin_en.ts b/plugins/webradioplugin/translations/webradioplugin_en.ts new file mode 100644 index 0000000..9db9347 --- /dev/null +++ b/plugins/webradioplugin/translations/webradioplugin_en.ts @@ -0,0 +1,12 @@ + + + + + WebRadioPlugin + + + Play webradio + + + + diff --git a/plugins/webradioplugin/webradioplugin.cpp b/plugins/webradioplugin/webradioplugin.cpp new file mode 100644 index 0000000..98a0b99 --- /dev/null +++ b/plugins/webradioplugin/webradioplugin.cpp @@ -0,0 +1,40 @@ +#include "webradioplugin.h" + +#include +#include +#include +#include +#include +#include +#include + +#include "mainwindow.h" + +WebRadioPlugin::WebRadioPlugin(QObject *parent) : + ZeiterfassungPlugin(parent) +{ + qDebug() << "called"; + + static auto dir = QDir(QCoreApplication::applicationDirPath()).absoluteFilePath(QStringLiteral("translations")); + + if(m_translator.load(QLocale(), QStringLiteral("webradioplugin"), QStringLiteral("_"), dir)) + { + if(!QCoreApplication::installTranslator(&m_translator)) + { + qWarning() << "could not install translation webradioplugin"; + } + } + else + { + qWarning() << "could not load translation webradioplugin"; + } +} + +void WebRadioPlugin::attachTo(MainWindow &mainWindow) +{ + auto dialog = new QDialog(&mainWindow); + dialog->setWindowFlag(Qt::WindowCloseButtonHint, true); + dialog->setWindowFlag(Qt::WindowContextHelpButtonHint, false); + mainWindow.menuTools()->addAction(QIcon(QStringLiteral(":/zeiterfassung/plugins/webradioplugin/images/web-radio.png")), + tr("Play webradio"), dialog, &QWidget::show); +} diff --git a/plugins/webradioplugin/webradioplugin.h b/plugins/webradioplugin/webradioplugin.h new file mode 100644 index 0000000..e11932d --- /dev/null +++ b/plugins/webradioplugin/webradioplugin.h @@ -0,0 +1,22 @@ +#pragma once + +#include +#include + +#include "zeiterfassungplugin.h" + +class Q_DECL_EXPORT WebRadioPlugin : public ZeiterfassungPlugin +{ + Q_OBJECT + Q_PLUGIN_METADATA(IID "dbsoftware.zeiterfassung.plugin/1.0" FILE "webradioplugin.json") + Q_INTERFACES(ZeiterfassungPlugin) + +public: + explicit WebRadioPlugin(QObject *parent = Q_NULLPTR); + + // ZeiterfassungPlugin interface + void attachTo(MainWindow &mainWindow) Q_DECL_OVERRIDE; + +private: + QTranslator m_translator; +}; diff --git a/plugins/webradioplugin/webradioplugin.json b/plugins/webradioplugin/webradioplugin.json new file mode 100644 index 0000000..e69de29 diff --git a/plugins/webradioplugin/webradioplugin.pro b/plugins/webradioplugin/webradioplugin.pro new file mode 100644 index 0000000..d56f0d6 --- /dev/null +++ b/plugins/webradioplugin/webradioplugin.pro @@ -0,0 +1,35 @@ +QT += core network gui widgets multimedia + +TARGET = webradioplugin +TEMPLATE = lib + +CONFIG += shared c++14 + +DESTDIR = $${OUT_PWD}/../../bin/plugins/zeiterfassung + +LIBS += -L$$OUT_PWD/../../lib -lzeiterfassungcorelib -lzeiterfassungguilib + +INCLUDEPATH += $$PWD/../../zeiterfassungcorelib $$PWD/../../zeiterfassungguilib +DEPENDPATH += $$PWD/../../zeiterfassungcorelib $$PWD/../../zeiterfassungguilib + +DEFINES += QT_DEPRECATED_WARNINGS QT_DISABLE_DEPRECATED_BEFORE=0x060000 QT_MESSAGELOGCONTEXT + +HEADERS += webradioplugin.h + +SOURCES += webradioplugin.cpp + +FORMS += + +RESOURCES += webradioplugin_resources.qrc + +TRANSLATIONS += translations/webradioplugin_en.ts \ + translations/webradioplugin_de.ts + +OTHER_FILES += webradioplugin.json + +include(../../lrelease.pri) + +COMPILED_TRANSLATIONS += $${OUT_PWD}/translations/webradioplugin_en.qm \ + $${OUT_PWD}/translations/webradioplugin_de.qm + +include(../copy_translations.pri) diff --git a/plugins/webradioplugin/webradioplugin_resources.qrc b/plugins/webradioplugin/webradioplugin_resources.qrc new file mode 100644 index 0000000..f7b12b5 --- /dev/null +++ b/plugins/webradioplugin/webradioplugin_resources.qrc @@ -0,0 +1,5 @@ + + + images/web-radio.png + + -- 2.50.1 From 75f5825d2b08aecbe314494da3e8421e01dd1639 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Thu, 21 Dec 2017 21:46:47 +0100 Subject: [PATCH 20/78] Added WebRadioDialog --- .../translations/webradioplugin_de.ts | 15 +++- .../translations/webradioplugin_en.ts | 15 +++- plugins/webradioplugin/webradiodialog.cpp | 26 ++++++ plugins/webradioplugin/webradiodialog.h | 27 +++++++ plugins/webradioplugin/webradiodialog.ui | 81 +++++++++++++++++++ plugins/webradioplugin/webradioplugin.cpp | 7 +- plugins/webradioplugin/webradioplugin.pro | 9 ++- 7 files changed, 171 insertions(+), 9 deletions(-) create mode 100644 plugins/webradioplugin/webradiodialog.cpp create mode 100644 plugins/webradioplugin/webradiodialog.h create mode 100644 plugins/webradioplugin/webradiodialog.ui diff --git a/plugins/webradioplugin/translations/webradioplugin_de.ts b/plugins/webradioplugin/translations/webradioplugin_de.ts index 3e2f9c2..b0a61dd 100644 --- a/plugins/webradioplugin/translations/webradioplugin_de.ts +++ b/plugins/webradioplugin/translations/webradioplugin_de.ts @@ -1,10 +1,23 @@ + + WebRadioDialog + + + Dialog + + + + + PushButton + + + WebRadioPlugin - + Play webradio diff --git a/plugins/webradioplugin/translations/webradioplugin_en.ts b/plugins/webradioplugin/translations/webradioplugin_en.ts index 9db9347..6ed3a57 100644 --- a/plugins/webradioplugin/translations/webradioplugin_en.ts +++ b/plugins/webradioplugin/translations/webradioplugin_en.ts @@ -1,10 +1,23 @@ + + WebRadioDialog + + + Dialog + + + + + PushButton + + + WebRadioPlugin - + Play webradio diff --git a/plugins/webradioplugin/webradiodialog.cpp b/plugins/webradioplugin/webradiodialog.cpp new file mode 100644 index 0000000..8625153 --- /dev/null +++ b/plugins/webradioplugin/webradiodialog.cpp @@ -0,0 +1,26 @@ +#include "webradiodialog.h" +#include "ui_webradiodialog.h" + +#include + +WebRadioDialog::WebRadioDialog(QWidget *parent) : + QDialog(parent), + ui(new Ui::WebRadioDialog), + m_player(new QMediaPlayer(this)) +{ + ui->setupUi(this); + + m_player->setMedia(QMediaContent(QUrl(QStringLiteral("http://stream.drumandbass.fm:9002")))); + + connect(ui->pushButton, &QAbstractButton::pressed, m_player, &QMediaPlayer::play); +} + +WebRadioDialog::~WebRadioDialog() +{ + delete ui; +} + +void WebRadioDialog::play() +{ + +} diff --git a/plugins/webradioplugin/webradiodialog.h b/plugins/webradioplugin/webradiodialog.h new file mode 100644 index 0000000..2bdd804 --- /dev/null +++ b/plugins/webradioplugin/webradiodialog.h @@ -0,0 +1,27 @@ +#ifndef WEBRADIODIALOG_H +#define WEBRADIODIALOG_H + +#include + +class QMediaPlayer; + +namespace Ui { class WebRadioDialog; } + +class WebRadioDialog : public QDialog +{ + Q_OBJECT + +public: + explicit WebRadioDialog(QWidget *parent = 0); + ~WebRadioDialog(); + +private Q_SLOTS: + void play(); + +private: + Ui::WebRadioDialog *ui; + + QMediaPlayer *m_player; +}; + +#endif // WEBRADIODIALOG_H diff --git a/plugins/webradioplugin/webradiodialog.ui b/plugins/webradioplugin/webradiodialog.ui new file mode 100644 index 0000000..90cbbfb --- /dev/null +++ b/plugins/webradioplugin/webradiodialog.ui @@ -0,0 +1,81 @@ + + + WebRadioDialog + + + + 0 + 0 + 433 + 300 + + + + Dialog + + + + + 30 + 240 + 341 + 32 + + + + Qt::Horizontal + + + QDialogButtonBox::Close + + + + + + 110 + 60 + 191 + 51 + + + + PushButton + + + + + + + buttonBox + accepted() + WebRadioDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + WebRadioDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/plugins/webradioplugin/webradioplugin.cpp b/plugins/webradioplugin/webradioplugin.cpp index 98a0b99..d6bd079 100644 --- a/plugins/webradioplugin/webradioplugin.cpp +++ b/plugins/webradioplugin/webradioplugin.cpp @@ -4,12 +4,13 @@ #include #include #include -#include #include #include #include "mainwindow.h" +#include "webradiodialog.h" + WebRadioPlugin::WebRadioPlugin(QObject *parent) : ZeiterfassungPlugin(parent) { @@ -32,9 +33,7 @@ WebRadioPlugin::WebRadioPlugin(QObject *parent) : void WebRadioPlugin::attachTo(MainWindow &mainWindow) { - auto dialog = new QDialog(&mainWindow); - dialog->setWindowFlag(Qt::WindowCloseButtonHint, true); - dialog->setWindowFlag(Qt::WindowContextHelpButtonHint, false); + auto dialog = new WebRadioDialog(&mainWindow); mainWindow.menuTools()->addAction(QIcon(QStringLiteral(":/zeiterfassung/plugins/webradioplugin/images/web-radio.png")), tr("Play webradio"), dialog, &QWidget::show); } diff --git a/plugins/webradioplugin/webradioplugin.pro b/plugins/webradioplugin/webradioplugin.pro index d56f0d6..b6ae942 100644 --- a/plugins/webradioplugin/webradioplugin.pro +++ b/plugins/webradioplugin/webradioplugin.pro @@ -14,11 +14,14 @@ DEPENDPATH += $$PWD/../../zeiterfassungcorelib $$PWD/../../zeiterfassungguilib DEFINES += QT_DEPRECATED_WARNINGS QT_DISABLE_DEPRECATED_BEFORE=0x060000 QT_MESSAGELOGCONTEXT -HEADERS += webradioplugin.h +HEADERS += webradioplugin.h \ + webradiodialog.h -SOURCES += webradioplugin.cpp +SOURCES += webradioplugin.cpp \ + webradiodialog.cpp -FORMS += +FORMS += \ + webradiodialog.ui RESOURCES += webradioplugin_resources.qrc -- 2.50.1 From f877ab8a0a1c01af6a3d0eae9b933766f416e006 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Thu, 21 Dec 2017 21:47:58 +0100 Subject: [PATCH 21/78] Project files cleanup --- plugins/devtoolsplugin/devtoolsplugin.pro | 11 +++++------ plugins/reportsplugin/reportsplugin.pro | 4 ++-- zeiterfassungcorelib/zeiterfassungcorelib.pro | 1 + .../dialogs/authenticationdialog.h | 4 +--- .../translations/zeiterfassungguilib_de.ts | 16 ++++++++-------- .../translations/zeiterfassungguilib_en.ts | 16 ++++++++-------- 6 files changed, 25 insertions(+), 27 deletions(-) diff --git a/plugins/devtoolsplugin/devtoolsplugin.pro b/plugins/devtoolsplugin/devtoolsplugin.pro index 424bf9e..b6af1b6 100644 --- a/plugins/devtoolsplugin/devtoolsplugin.pro +++ b/plugins/devtoolsplugin/devtoolsplugin.pro @@ -15,15 +15,14 @@ DEPENDPATH += $$PWD/../../zeiterfassungcorelib $$PWD/../../zeiterfassungguilib DEFINES += QT_DEPRECATED_WARNINGS QT_DISABLE_DEPRECATED_BEFORE=0x060000 QT_MESSAGELOGCONTEXT HEADERS += devtoolsplugin.h \ - logmodel.h \ - logdialog.h + logmodel.h \ + logdialog.h SOURCES += devtoolsplugin.cpp \ - logmodel.cpp \ - logdialog.cpp + logmodel.cpp \ + logdialog.cpp -FORMS += \ - logdialog.ui +FORMS += logdialog.ui RESOURCES += devtoolsplugin_resources.qrc diff --git a/plugins/reportsplugin/reportsplugin.pro b/plugins/reportsplugin/reportsplugin.pro index 8a9a6d8..706fb62 100644 --- a/plugins/reportsplugin/reportsplugin.pro +++ b/plugins/reportsplugin/reportsplugin.pro @@ -15,10 +15,10 @@ DEPENDPATH += $$PWD/../../zeiterfassungcorelib $$PWD/../../zeiterfassungguilib DEFINES += QT_DEPRECATED_WARNINGS QT_DISABLE_DEPRECATED_BEFORE=0x060000 QT_MESSAGELOGCONTEXT HEADERS += reportsplugin.h \ - reportswidget.h + reportswidget.h SOURCES += reportsplugin.cpp \ - reportswidget.cpp + reportswidget.cpp FORMS += diff --git a/zeiterfassungcorelib/zeiterfassungcorelib.pro b/zeiterfassungcorelib/zeiterfassungcorelib.pro index d653219..079d25e 100644 --- a/zeiterfassungcorelib/zeiterfassungcorelib.pro +++ b/zeiterfassungcorelib/zeiterfassungcorelib.pro @@ -1,4 +1,5 @@ QT += core network +QT -= gui widgets TARGET = zeiterfassungcorelib TEMPLATE = lib diff --git a/zeiterfassungguilib/dialogs/authenticationdialog.h b/zeiterfassungguilib/dialogs/authenticationdialog.h index f294ccc..128b25b 100644 --- a/zeiterfassungguilib/dialogs/authenticationdialog.h +++ b/zeiterfassungguilib/dialogs/authenticationdialog.h @@ -4,9 +4,7 @@ #include "zeiterfassungguilib_global.h" -namespace Ui { -class AuthenticationDialog; -} +namespace Ui { class AuthenticationDialog; } class ZEITERFASSUNGGUILIBSHARED_EXPORT AuthenticationDialog : public QDialog { diff --git a/zeiterfassungguilib/translations/zeiterfassungguilib_de.ts b/zeiterfassungguilib/translations/zeiterfassungguilib_de.ts index 5c5b234..d66d22a 100644 --- a/zeiterfassungguilib/translations/zeiterfassungguilib_de.ts +++ b/zeiterfassungguilib/translations/zeiterfassungguilib_de.ts @@ -168,8 +168,8 @@ - - + + Start Kommen @@ -266,19 +266,19 @@ - + Could not create booking! Konnte Buchung nicht erstellen! - + Could not edit time assignment! Konnte Kontierung nicht bearbeiten! - - + + %0 (%1) %0 (%1) @@ -288,8 +288,8 @@ Konnte Kontierung nicht erstellen! - - + + Switch Wechseln diff --git a/zeiterfassungguilib/translations/zeiterfassungguilib_en.ts b/zeiterfassungguilib/translations/zeiterfassungguilib_en.ts index d2dbf7d..8c38655 100644 --- a/zeiterfassungguilib/translations/zeiterfassungguilib_en.ts +++ b/zeiterfassungguilib/translations/zeiterfassungguilib_en.ts @@ -168,8 +168,8 @@ - - + + Start @@ -266,7 +266,7 @@ - + Could not create booking! @@ -277,19 +277,19 @@ - + Could not edit time assignment! - - + + Switch - - + + %0 (%1) -- 2.50.1 From 43515e32452622476970a3d69d610dfb48db383c Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Thu, 21 Dec 2017 21:49:02 +0100 Subject: [PATCH 22/78] Added QStringLiteral and tr --- plugins/updaterplugin/updaterdialog.cpp | 4 ++-- plugins/weatherplugin/weatherwidget.cpp | 4 ++-- zeiterfassungguilib/stripswidget.cpp | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/plugins/updaterplugin/updaterdialog.cpp b/plugins/updaterplugin/updaterdialog.cpp index 55f5bdb..74272d4 100644 --- a/plugins/updaterplugin/updaterdialog.cpp +++ b/plugins/updaterplugin/updaterdialog.cpp @@ -31,8 +31,8 @@ UpdaterDialog::UpdaterDialog(MainWindow &mainWindow) : connect(ui->buttonBox, &QDialogButtonBox::rejected, this, &UpdaterDialog::rejectedSlot); auto url = m_mainWindow.settings().value(QStringLiteral("UpdaterPlugin/url"), - QUrl(QStringLiteral("https://api.github.com/repos/0xFEEDC0DE64/QtZeiterfassung/releases"))).toUrl(); - m_reply = m_mainWindow.erfassung().manager()->get(QNetworkRequest(url)); + QStringLiteral("https://api.github.com/repos/0xFEEDC0DE64/QtZeiterfassung/releases")).toString(); + m_reply = m_mainWindow.erfassung().manager()->get(QNetworkRequest(QUrl(url))); connect(m_reply, &QNetworkReply::finished, this, &UpdaterDialog::finished); } diff --git a/plugins/weatherplugin/weatherwidget.cpp b/plugins/weatherplugin/weatherwidget.cpp index 76efa1a..4bdb88d 100644 --- a/plugins/weatherplugin/weatherwidget.cpp +++ b/plugins/weatherplugin/weatherwidget.cpp @@ -69,14 +69,14 @@ void WeatherWidget::finished() if(!obj.contains(QStringLiteral("weather"))) { qWarning() << "no weather" << obj; - setText("No weater found"); + setText(tr("No weather found")); goto after; } if(!obj.contains(QStringLiteral("main"))) { qWarning() << "no main" << obj; - setText("No main found"); + setText(tr("No main found")); goto after; } diff --git a/zeiterfassungguilib/stripswidget.cpp b/zeiterfassungguilib/stripswidget.cpp index 2abac45..ab0e37c 100644 --- a/zeiterfassungguilib/stripswidget.cpp +++ b/zeiterfassungguilib/stripswidget.cpp @@ -438,7 +438,7 @@ bool StripsWidget::createStrips() auto label = new QLabel(tr("Strip rendering aborted due error.\n" "Your bookings and time assignments for this day are in an illegal state!") % "\n" % errorMessage, this); - label->setStyleSheet("color: red;"); + label->setStyleSheet(QStringLiteral("color: red;")); m_stripsLayout->addWidget(label); } -- 2.50.1 From 39c7580932b4f6770a3e5bdf41794b9d22efa79d Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Thu, 21 Dec 2017 21:53:26 +0100 Subject: [PATCH 23/78] Added profileplugin --- plugins/plugins.pro | 1 + plugins/profileplugin/images/profile.png | Bin 0 -> 5577 bytes plugins/profileplugin/profileplugin.cpp | 38 ++++++++++++++++++ plugins/profileplugin/profileplugin.h | 24 +++++++++++ plugins/profileplugin/profileplugin.json | 0 plugins/profileplugin/profileplugin.pro | 35 ++++++++++++++++ .../profileplugin/profileplugin_resources.qrc | 5 +++ .../translations/profileplugin_de.ts | 12 ++++++ .../translations/profileplugin_en.ts | 12 ++++++ 9 files changed, 127 insertions(+) create mode 100644 plugins/profileplugin/images/profile.png create mode 100644 plugins/profileplugin/profileplugin.cpp create mode 100644 plugins/profileplugin/profileplugin.h create mode 100644 plugins/profileplugin/profileplugin.json create mode 100644 plugins/profileplugin/profileplugin.pro create mode 100644 plugins/profileplugin/profileplugin_resources.qrc create mode 100644 plugins/profileplugin/translations/profileplugin_de.ts create mode 100644 plugins/profileplugin/translations/profileplugin_en.ts diff --git a/plugins/plugins.pro b/plugins/plugins.pro index dab007d..f035e31 100644 --- a/plugins/plugins.pro +++ b/plugins/plugins.pro @@ -3,6 +3,7 @@ TEMPLATE = subdirs SUBDIRS += advancedviewplugin \ devtoolsplugin \ lunchmealplugin \ + profileplugin \ presenceplugin \ reportsplugin \ updaterplugin \ diff --git a/plugins/profileplugin/images/profile.png b/plugins/profileplugin/images/profile.png new file mode 100644 index 0000000000000000000000000000000000000000..e6e955fcc9165f5bc8b6b7ce89bc2263dcd199e8 GIT binary patch literal 5577 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 +#include +#include +#include +#include +#include +#include + +#include "mainwindow.h" + +ProfilePlugin::ProfilePlugin(QObject *parent) : + ZeiterfassungPlugin(parent) +{ + qDebug() << "called"; + + static auto dir = QDir(QCoreApplication::applicationDirPath()).absoluteFilePath(QStringLiteral("translations")); + + if(m_translator.load(QLocale(), QStringLiteral("profileplugin"), QStringLiteral("_"), dir)) + { + if(!QCoreApplication::installTranslator(&m_translator)) + { + qWarning() << "could not install translation profileplugin"; + } + } + else + { + qWarning() << "could not load translation profileplugin"; + } +} + +void ProfilePlugin::attachTo(MainWindow &mainWindow) +{ + auto dialog = new QDialog(&mainWindow); + mainWindow.menuTools()->addAction(QIcon(QStringLiteral(":/zeiterfassung/plugins/profileplugin/images/profile.png")), + tr("My profile"), dialog, &QDialog::open); +} diff --git a/plugins/profileplugin/profileplugin.h b/plugins/profileplugin/profileplugin.h new file mode 100644 index 0000000..ee1f67e --- /dev/null +++ b/plugins/profileplugin/profileplugin.h @@ -0,0 +1,24 @@ +#pragma once + +#include +#include + +#include "zeiterfassungplugin.h" + +class MainWindow; + +class Q_DECL_EXPORT ProfilePlugin : public ZeiterfassungPlugin +{ + Q_OBJECT + Q_PLUGIN_METADATA(IID "dbsoftware.zeiterfassung.plugin/1.0" FILE "profileplugin.json") + Q_INTERFACES(ZeiterfassungPlugin) + +public: + explicit ProfilePlugin(QObject *parent = Q_NULLPTR); + + // ZeiterfassungPlugin interface + void attachTo(MainWindow &mainWindow) Q_DECL_OVERRIDE; + +private: + QTranslator m_translator; +}; diff --git a/plugins/profileplugin/profileplugin.json b/plugins/profileplugin/profileplugin.json new file mode 100644 index 0000000..e69de29 diff --git a/plugins/profileplugin/profileplugin.pro b/plugins/profileplugin/profileplugin.pro new file mode 100644 index 0000000..215c70b --- /dev/null +++ b/plugins/profileplugin/profileplugin.pro @@ -0,0 +1,35 @@ +QT += core network gui widgets + +TARGET = profileplugin +TEMPLATE = lib + +CONFIG += shared c++14 + +DESTDIR = $${OUT_PWD}/../../bin/plugins/zeiterfassung + +LIBS += -L$$OUT_PWD/../../lib -lzeiterfassungcorelib -lzeiterfassungguilib + +INCLUDEPATH += $$PWD/../../zeiterfassungcorelib $$PWD/../../zeiterfassungguilib +DEPENDPATH += $$PWD/../../zeiterfassungcorelib $$PWD/../../zeiterfassungguilib + +DEFINES += QT_DEPRECATED_WARNINGS QT_DISABLE_DEPRECATED_BEFORE=0x060000 QT_MESSAGELOGCONTEXT + +HEADERS += profileplugin.h + +SOURCES += profileplugin.cpp + +FORMS += + +RESOURCES += profileplugin_resources.qrc + +TRANSLATIONS += translations/profileplugin_en.ts \ + translations/profileplugin_de.ts + +OTHER_FILES += profileplugin.json + +include(../../lrelease.pri) + +COMPILED_TRANSLATIONS += $${OUT_PWD}/translations/profileplugin_en.qm \ + $${OUT_PWD}/translations/profileplugin_de.qm + +include(../copy_translations.pri) diff --git a/plugins/profileplugin/profileplugin_resources.qrc b/plugins/profileplugin/profileplugin_resources.qrc new file mode 100644 index 0000000..d1346b0 --- /dev/null +++ b/plugins/profileplugin/profileplugin_resources.qrc @@ -0,0 +1,5 @@ + + + images/profile.png + + diff --git a/plugins/profileplugin/translations/profileplugin_de.ts b/plugins/profileplugin/translations/profileplugin_de.ts new file mode 100644 index 0000000..0d7005a --- /dev/null +++ b/plugins/profileplugin/translations/profileplugin_de.ts @@ -0,0 +1,12 @@ + + + + + ProfilePlugin + + + My profile + + + + diff --git a/plugins/profileplugin/translations/profileplugin_en.ts b/plugins/profileplugin/translations/profileplugin_en.ts new file mode 100644 index 0000000..d73e0c8 --- /dev/null +++ b/plugins/profileplugin/translations/profileplugin_en.ts @@ -0,0 +1,12 @@ + + + + + ProfilePlugin + + + My profile + + + + -- 2.50.1 From 01889ffe684e71a61c51c313188c372affdd506d Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Fri, 22 Dec 2017 16:47:09 +0100 Subject: [PATCH 24/78] Fixed holidays not showing up #44 --- plugins/reportsplugin/reportswidget.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/reportsplugin/reportswidget.cpp b/plugins/reportsplugin/reportswidget.cpp index 1aded66..73cfae6 100644 --- a/plugins/reportsplugin/reportswidget.cpp +++ b/plugins/reportsplugin/reportswidget.cpp @@ -108,7 +108,7 @@ void ReportsWidget::finished() } { - static QRegularExpression regex(QStringLiteral("Urlaubsanspruch +([0-9]+\\.[0-9]+\\-?) +([0-9]+\\.[0-9]+\\-?)")); + static QRegularExpression regex(QStringLiteral("Urlaubsanspruch +(\\-?[0-9]+\\.[0-9]+) +(\\-?[0-9]+\\.[0-9]+)")); auto match = regex.match(content); if(match.hasMatch()) m_labelHolidays->setText(tr("%0: %1").arg(tr("Holidays")).arg(match.captured(2))); -- 2.50.1 From 85e208b69bc0453cc7bbb8a2d8b962513ad718c0 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Fri, 22 Dec 2017 17:25:22 +0100 Subject: [PATCH 25/78] Moved AboutMeDialog into profileplugin --- .../profileplugin/profiledialog.cpp | 10 +- plugins/profileplugin/profiledialog.h | 20 +++ .../profileplugin/profiledialog.ui | 20 +-- plugins/profileplugin/profileplugin.cpp | 5 +- plugins/profileplugin/profileplugin.pro | 8 +- .../translations/profileplugin_de.ts | 103 +++++++++++- .../translations/profileplugin_en.ts | 101 +++++++++++- zeiterfassungguilib/dialogs/aboutmedialog.h | 20 --- zeiterfassungguilib/mainwindow.cpp | 2 - zeiterfassungguilib/mainwindow.ui | 1 - .../translations/zeiterfassungguilib_de.ts | 154 +++--------------- .../translations/zeiterfassungguilib_en.ts | 154 +++--------------- zeiterfassungguilib/zeiterfassungguilib.pro | 5 +- 13 files changed, 293 insertions(+), 310 deletions(-) rename zeiterfassungguilib/dialogs/aboutmedialog.cpp => plugins/profileplugin/profiledialog.cpp (85%) create mode 100644 plugins/profileplugin/profiledialog.h rename zeiterfassungguilib/dialogs/aboutmedialog.ui => plugins/profileplugin/profiledialog.ui (95%) delete mode 100644 zeiterfassungguilib/dialogs/aboutmedialog.h diff --git a/zeiterfassungguilib/dialogs/aboutmedialog.cpp b/plugins/profileplugin/profiledialog.cpp similarity index 85% rename from zeiterfassungguilib/dialogs/aboutmedialog.cpp rename to plugins/profileplugin/profiledialog.cpp index 473c1ac..1a52589 100644 --- a/zeiterfassungguilib/dialogs/aboutmedialog.cpp +++ b/plugins/profileplugin/profiledialog.cpp @@ -1,9 +1,9 @@ -#include "aboutmedialog.h" -#include "ui_aboutmedialog.h" +#include "profiledialog.h" +#include "ui_profiledialog.h" -AboutMeDialog::AboutMeDialog(const GetUserInfoReply::UserInfo &userInfo, QWidget *parent) : +ProfileDialog::ProfileDialog(const GetUserInfoReply::UserInfo &userInfo, QWidget *parent) : QDialog(parent), - ui(new Ui::AboutMeDialog) + ui(new Ui::ProfileDialog) { ui->setupUi(this); @@ -26,7 +26,7 @@ AboutMeDialog::AboutMeDialog(const GetUserInfoReply::UserInfo &userInfo, QWidget ui->lineEditBetriebsnr->setText(userInfo.betriebsnr); } -AboutMeDialog::~AboutMeDialog() +ProfileDialog::~ProfileDialog() { delete ui; } diff --git a/plugins/profileplugin/profiledialog.h b/plugins/profileplugin/profiledialog.h new file mode 100644 index 0000000..b2abd1c --- /dev/null +++ b/plugins/profileplugin/profiledialog.h @@ -0,0 +1,20 @@ +#pragma once + +#include + +#include "zeiterfassungguilib_global.h" +#include "replies/getuserinforeply.h" + +namespace Ui { class ProfileDialog; } + +class ZEITERFASSUNGGUILIBSHARED_EXPORT ProfileDialog : public QDialog +{ + Q_OBJECT + +public: + explicit ProfileDialog(const GetUserInfoReply::UserInfo &userInfo, QWidget *parent = Q_NULLPTR); + ~ProfileDialog(); + +private: + Ui::ProfileDialog *ui; +}; diff --git a/zeiterfassungguilib/dialogs/aboutmedialog.ui b/plugins/profileplugin/profiledialog.ui similarity index 95% rename from zeiterfassungguilib/dialogs/aboutmedialog.ui rename to plugins/profileplugin/profiledialog.ui index d6f99d9..3ce9181 100644 --- a/zeiterfassungguilib/dialogs/aboutmedialog.ui +++ b/plugins/profileplugin/profiledialog.ui @@ -1,7 +1,7 @@ - AboutMeDialog - + ProfileDialog + 0 @@ -11,21 +11,9 @@ - About me + Profile - - - - - 20 - - - - About me - - - @@ -315,7 +303,7 @@ buttonBox rejected() - AboutMeDialog + ProfileDialog close() diff --git a/plugins/profileplugin/profileplugin.cpp b/plugins/profileplugin/profileplugin.cpp index d3719fe..1dc949d 100644 --- a/plugins/profileplugin/profileplugin.cpp +++ b/plugins/profileplugin/profileplugin.cpp @@ -4,12 +4,13 @@ #include #include #include -#include #include #include #include "mainwindow.h" +#include "profiledialog.h" + ProfilePlugin::ProfilePlugin(QObject *parent) : ZeiterfassungPlugin(parent) { @@ -32,7 +33,7 @@ ProfilePlugin::ProfilePlugin(QObject *parent) : void ProfilePlugin::attachTo(MainWindow &mainWindow) { - auto dialog = new QDialog(&mainWindow); + auto dialog = new ProfileDialog(mainWindow.userInfo(), &mainWindow); mainWindow.menuTools()->addAction(QIcon(QStringLiteral(":/zeiterfassung/plugins/profileplugin/images/profile.png")), tr("My profile"), dialog, &QDialog::open); } diff --git a/plugins/profileplugin/profileplugin.pro b/plugins/profileplugin/profileplugin.pro index 215c70b..d299e48 100644 --- a/plugins/profileplugin/profileplugin.pro +++ b/plugins/profileplugin/profileplugin.pro @@ -14,11 +14,13 @@ DEPENDPATH += $$PWD/../../zeiterfassungcorelib $$PWD/../../zeiterfassungguilib DEFINES += QT_DEPRECATED_WARNINGS QT_DISABLE_DEPRECATED_BEFORE=0x060000 QT_MESSAGELOGCONTEXT -HEADERS += profileplugin.h +HEADERS += profiledialog.h \ + profileplugin.h -SOURCES += profileplugin.cpp +SOURCES += profiledialog.cpp \ + profileplugin.cpp -FORMS += +FORMS += profiledialog.ui RESOURCES += profileplugin_resources.qrc diff --git a/plugins/profileplugin/translations/profileplugin_de.ts b/plugins/profileplugin/translations/profileplugin_de.ts index 0d7005a..e8cb231 100644 --- a/plugins/profileplugin/translations/profileplugin_de.ts +++ b/plugins/profileplugin/translations/profileplugin_de.ts @@ -1,12 +1,111 @@ + + ProfileDialog + + + Profile + Profil + + + + User-ID: + Benutzer-ID: + + + + E-Mail: + E-Mail: + + + + Long username: + Langer Benutzername: + + + + Text: + Text: + + + + Username: + Benutzername: + + + + Street: + Straße: + + + + City: + Stadt: + + + + Employed since: + Angestellt seit: + + + + Employed till: + Angestellt bis: + + + + Place of birth: + Geburtsort: + + + + Zipcode: + Postleitzahl: + + + + Religion: + Religion: + + + + Department: + Abteilung: + + + + Verwendgr: + Verwendgr: + + + + Taetig: + Taetig: + + + + Arbverh: + Arbverh: + + + + Betriebsnr: + Betriebsnr: + + + + + dd.MM.yyyy + dd.MM.yyyy + + ProfilePlugin - + My profile - + Mein Profil diff --git a/plugins/profileplugin/translations/profileplugin_en.ts b/plugins/profileplugin/translations/profileplugin_en.ts index d73e0c8..d6f19e1 100644 --- a/plugins/profileplugin/translations/profileplugin_en.ts +++ b/plugins/profileplugin/translations/profileplugin_en.ts @@ -1,10 +1,109 @@ + + ProfileDialog + + + Profile + + + + + User-ID: + + + + + E-Mail: + + + + + Long username: + + + + + Text: + + + + + Username: + + + + + Street: + + + + + City: + + + + + Employed since: + + + + + Employed till: + + + + + Place of birth: + + + + + Zipcode: + + + + + Religion: + + + + + Department: + + + + + Verwendgr: + + + + + Taetig: + + + + + Arbverh: + + + + + Betriebsnr: + + + + + + dd.MM.yyyy + + + ProfilePlugin - + My profile diff --git a/zeiterfassungguilib/dialogs/aboutmedialog.h b/zeiterfassungguilib/dialogs/aboutmedialog.h deleted file mode 100644 index 769226b..0000000 --- a/zeiterfassungguilib/dialogs/aboutmedialog.h +++ /dev/null @@ -1,20 +0,0 @@ -#pragma once - -#include - -#include "zeiterfassungguilib_global.h" -#include "replies/getuserinforeply.h" - -namespace Ui { class AboutMeDialog; } - -class ZEITERFASSUNGGUILIBSHARED_EXPORT AboutMeDialog : public QDialog -{ - Q_OBJECT - -public: - explicit AboutMeDialog(const GetUserInfoReply::UserInfo &userInfo, QWidget *parent = Q_NULLPTR); - ~AboutMeDialog(); - -private: - Ui::AboutMeDialog *ui; -}; diff --git a/zeiterfassungguilib/mainwindow.cpp b/zeiterfassungguilib/mainwindow.cpp index 2a35266..845ea44 100644 --- a/zeiterfassungguilib/mainwindow.cpp +++ b/zeiterfassungguilib/mainwindow.cpp @@ -19,7 +19,6 @@ #include "zeiterfassungsettings.h" #include "stripfactory.h" #include "stripswidget.h" -#include "dialogs/aboutmedialog.h" #include "dialogs/settingsdialog.h" #include "replies/getprojectsreply.h" #include "replies/createbookingreply.h" @@ -47,7 +46,6 @@ MainWindow::MainWindow(ZeiterfassungSettings &settings, ZeiterfassungApi &erfass ui->actionRefresh->setShortcut(QKeySequence::Refresh); connect(ui->actionRefresh, &QAction::triggered, this, &MainWindow::refreshEverything); - connect(ui->actionAboutMe, &QAction::triggered, [=](){ AboutMeDialog(userInfo, this).exec(); }); connect(ui->actionSettings, &QAction::triggered, [=](){ SettingsDialog(m_settings, this).exec(); }); ui->actionHelp->setShortcut(QKeySequence::HelpContents); diff --git a/zeiterfassungguilib/mainwindow.ui b/zeiterfassungguilib/mainwindow.ui index 5735f18..c96c07d 100644 --- a/zeiterfassungguilib/mainwindow.ui +++ b/zeiterfassungguilib/mainwindow.ui @@ -211,7 +211,6 @@ &About - diff --git a/zeiterfassungguilib/translations/zeiterfassungguilib_de.ts b/zeiterfassungguilib/translations/zeiterfassungguilib_de.ts index d66d22a..626b154 100644 --- a/zeiterfassungguilib/translations/zeiterfassungguilib_de.ts +++ b/zeiterfassungguilib/translations/zeiterfassungguilib_de.ts @@ -1,106 +1,6 @@ - - AboutMeDialog - - - - About me - Über mich - - - - User-ID: - Benutzer-ID: - - - - E-Mail: - E-Mail: - - - - Long username: - Langer Benutzername: - - - - Text: - Text: - - - - Username: - Benutzername: - - - - Street: - Straße: - - - - City: - Stadt: - - - - Employed since: - Angestellt seit: - - - - Employed till: - Angestellt bis: - - - - Place of birth: - Geburtsort: - - - - Zipcode: - Postleitzahl: - - - - Religion: - Religion: - - - - Department: - Abteilung: - - - - Verwendgr: - Verwendgr: - - - - Taetig: - Taetig: - - - - Arbverh: - Arbverh: - - - - Betriebsnr: - Betriebsnr: - - - - - dd.MM.yyyy - dd.MM.yyyy - - AuthenticationDialog @@ -168,8 +68,8 @@ - - + + Start Kommen @@ -189,107 +89,107 @@ &Über - + &View &Ansicht - + &Tools &Werkzeuge - + &Quit &Beenden - + About &Me Über &mich - + About &zeiterfassung Über &zeiterfassung - + About &Qt Über &Qt - + &Today &Heute - + &Refresh everything Alles &neu laden - + &Settings &Einstellungen - + Help Hilfe - + Zeiterfassung - %0 (%1) Zeiterfassung - %0 (%1) - + Subproject Subprojekt - + Workpackage Arbeitspaket - + Text Text - - + + Could not load bookings! Konnte Buchungen nicht laden! - - + + Could not create booking! Konnte Buchung nicht erstellen! - - + + Could not edit time assignment! Konnte Kontierung nicht bearbeiten! - - + + %0 (%1) %0 (%1) - + Could not create time assignment! Konnte Kontierung nicht erstellen! - - + + Switch Wechseln diff --git a/zeiterfassungguilib/translations/zeiterfassungguilib_en.ts b/zeiterfassungguilib/translations/zeiterfassungguilib_en.ts index 8c38655..b96835a 100644 --- a/zeiterfassungguilib/translations/zeiterfassungguilib_en.ts +++ b/zeiterfassungguilib/translations/zeiterfassungguilib_en.ts @@ -1,106 +1,6 @@ - - AboutMeDialog - - - - About me - - - - - User-ID: - - - - - E-Mail: - - - - - Long username: - - - - - Text: - - - - - Username: - - - - - Street: - - - - - City: - - - - - Employed since: - - - - - Employed till: - - - - - Place of birth: - - - - - Zipcode: - - - - - Religion: - - - - - Department: - - - - - Verwendgr: - - - - - Taetig: - - - - - Arbverh: - - - - - Betriebsnr: - - - - - - dd.MM.yyyy - - - AuthenticationDialog @@ -168,8 +68,8 @@ - - + + Start @@ -189,107 +89,107 @@ - + &View - + &Tools - + &Quit - + About &Me - + About &zeiterfassung - + About &Qt - + &Today - + &Refresh everything - + &Settings - + Help - + Zeiterfassung - %0 (%1) - + Subproject - + Workpackage - + Text - - + + Could not load bookings! - - + + Could not create booking! - + Could not create time assignment! - - + + Could not edit time assignment! - - + + Switch - - + + %0 (%1) diff --git a/zeiterfassungguilib/zeiterfassungguilib.pro b/zeiterfassungguilib/zeiterfassungguilib.pro index 0f252db..2936ed3 100644 --- a/zeiterfassungguilib/zeiterfassungguilib.pro +++ b/zeiterfassungguilib/zeiterfassungguilib.pro @@ -19,7 +19,6 @@ SOURCES += mainwindow.cpp \ stripfactory.cpp \ stripswidget.cpp \ zeiterfassungplugin.cpp \ - dialogs/aboutmedialog.cpp \ dialogs/authenticationdialog.cpp \ dialogs/languageselectiondialog.cpp \ dialogs/settingsdialog.cpp @@ -29,7 +28,6 @@ HEADERS += mainwindow.h \ stripswidget.h \ zeiterfassungguilib_global.h \ zeiterfassungplugin.h \ - dialogs/aboutmedialog.h \ dialogs/authenticationdialog.h \ dialogs/languageselectiondialog.h \ dialogs/settingsdialog.h @@ -37,8 +35,7 @@ HEADERS += mainwindow.h \ FORMS += mainwindow.ui \ dialogs/settingsdialog.ui \ dialogs/languageselectiondialog.ui \ - dialogs/authenticationdialog.ui \ - dialogs/aboutmedialog.ui + dialogs/authenticationdialog.ui RESOURCES += zeiterfassungguilib_resources.qrc -- 2.50.1 From 6c3c7ac37aa5c5952317604f2a73a4d7e15ee8b5 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Fri, 22 Dec 2017 17:28:25 +0100 Subject: [PATCH 26/78] Updated translations for weatherplugin --- plugins/weatherplugin/translations/weatherplugin_de.ts | 10 ++++++++++ plugins/weatherplugin/translations/weatherplugin_en.ts | 10 ++++++++++ 2 files changed, 20 insertions(+) diff --git a/plugins/weatherplugin/translations/weatherplugin_de.ts b/plugins/weatherplugin/translations/weatherplugin_de.ts index 40f7555..c7baf36 100644 --- a/plugins/weatherplugin/translations/weatherplugin_de.ts +++ b/plugins/weatherplugin/translations/weatherplugin_de.ts @@ -23,6 +23,16 @@ Not an json obj Kein json obj + + + No weather found + Kein weather gefunden + + + + No main found + Kein main gefunden + %0 (%1°C) diff --git a/plugins/weatherplugin/translations/weatherplugin_en.ts b/plugins/weatherplugin/translations/weatherplugin_en.ts index c4bb548..fd63ccf 100644 --- a/plugins/weatherplugin/translations/weatherplugin_en.ts +++ b/plugins/weatherplugin/translations/weatherplugin_en.ts @@ -23,6 +23,16 @@ Not an json obj + + + No weather found + + + + + No main found + + %0 (%1°C) -- 2.50.1 From 59c877f9fc4707fdb19408ccc794b8606fb11465 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Fri, 22 Dec 2017 19:33:46 +0100 Subject: [PATCH 27/78] Added comboBox to choose from webradios --- plugins/webradioplugin/webradiodialog.cpp | 34 ++++++++++- plugins/webradioplugin/webradiodialog.ui | 72 +++++++++++++++++++++-- plugins/webradioplugin/webradioplugin.pro | 11 ++-- 3 files changed, 104 insertions(+), 13 deletions(-) diff --git a/plugins/webradioplugin/webradiodialog.cpp b/plugins/webradioplugin/webradiodialog.cpp index 8625153..39dd264 100644 --- a/plugins/webradioplugin/webradiodialog.cpp +++ b/plugins/webradioplugin/webradiodialog.cpp @@ -10,9 +10,39 @@ WebRadioDialog::WebRadioDialog(QWidget *parent) : { ui->setupUi(this); - m_player->setMedia(QMediaContent(QUrl(QStringLiteral("http://stream.drumandbass.fm:9002")))); + for(const auto &url : QStringList { + QStringLiteral("http://stream.drumandbass.fm:9002"), + QStringLiteral("http://stream.trap.fm:6002"), + QStringLiteral("http://stream.dubbase.fm:7002"), + QStringLiteral("http://lw1.mp3.tb-group.fm/hb.mp3"), + QStringLiteral("http://lw1.mp3.tb-group.fm/tb.mp3"), + QStringLiteral("http://lw1.mp3.tb-group.fm/tt.mp3"), + QStringLiteral("http://lw1.mp3.tb-group.fm/ht.mp3"), + QStringLiteral("http://lw1.mp3.tb-group.fm/trb.mp3"), + QStringLiteral("http://lw1.mp3.tb-group.fm/ct.mp3"), + QStringLiteral("http://lw1.mp3.tb-group.fm/clt.mp3"), + QStringLiteral("https://live.helsinki.at:8088/live160.ogg") + }) + { + ui->comboBox->addItem(url); + } - connect(ui->pushButton, &QAbstractButton::pressed, m_player, &QMediaPlayer::play); + connect(ui->comboBox, &QComboBox::currentTextChanged, this, [=](const QString &url){ m_player->setMedia(QMediaContent(QUrl(url))); }); + + Q_EMIT ui->comboBox->currentTextChanged(ui->comboBox->currentText()); + + connect(ui->pushButtonPlay, &QAbstractButton::pressed, m_player, &QMediaPlayer::play); + connect(ui->pushButtonPause, &QAbstractButton::pressed, m_player, &QMediaPlayer::pause); + connect(ui->pushButtonStop, &QAbstractButton::pressed, m_player, &QMediaPlayer::stop); + connect(ui->horizontalSlider, &QAbstractSlider::valueChanged, m_player, &QMediaPlayer::setVolume); + + connect(m_player, &QMediaPlayer::stateChanged, [](QMediaPlayer::State newState){ qDebug() << newState; }); + connect(m_player, &QMediaPlayer::mediaStatusChanged, [](QMediaPlayer::MediaStatus status){ qDebug() << status; }); + connect(m_player, static_cast(&QMediaPlayer::error), + [](QMediaPlayer::Error error){ qDebug() << error; }); + connect(m_player, SIGNAL(volumeChanged(int)), ui->horizontalSlider, SLOT(setValue(int))); + + Q_EMIT m_player->volumeChanged(m_player->volume()); } WebRadioDialog::~WebRadioDialog() diff --git a/plugins/webradioplugin/webradiodialog.ui b/plugins/webradioplugin/webradiodialog.ui index 90cbbfb..8d7d9eb 100644 --- a/plugins/webradioplugin/webradiodialog.ui +++ b/plugins/webradioplugin/webradiodialog.ui @@ -6,7 +6,7 @@ 0 0 - 433 + 539 300 @@ -29,17 +29,79 @@ QDialogButtonBox::Close - + - 110 + 20 60 - 191 + 131 51 - PushButton + play() + + + + + + 50 + 160 + 351 + 23 + + + + 24 + + + + + + 160 + 60 + 131 + 51 + + + + pause() + + + + + + 300 + 60 + 131 + 51 + + + + stop() + + + + + + 270 + 130 + 160 + 16 + + + + Qt::Horizontal + + + + + + 40 + 20 + 271 + 25 + diff --git a/plugins/webradioplugin/webradioplugin.pro b/plugins/webradioplugin/webradioplugin.pro index b6ae942..28eb042 100644 --- a/plugins/webradioplugin/webradioplugin.pro +++ b/plugins/webradioplugin/webradioplugin.pro @@ -14,14 +14,13 @@ DEPENDPATH += $$PWD/../../zeiterfassungcorelib $$PWD/../../zeiterfassungguilib DEFINES += QT_DEPRECATED_WARNINGS QT_DISABLE_DEPRECATED_BEFORE=0x060000 QT_MESSAGELOGCONTEXT -HEADERS += webradioplugin.h \ - webradiodialog.h +HEADERS += webradiodialog.h \ + webradioplugin.h -SOURCES += webradioplugin.cpp \ - webradiodialog.cpp +SOURCES += webradiodialog.cpp \ + webradioplugin.cpp -FORMS += \ - webradiodialog.ui +FORMS += webradiodialog.ui RESOURCES += webradioplugin_resources.qrc -- 2.50.1 From 4e16a15994c6299a7623741573fff1b5dfcb2a02 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Fri, 22 Dec 2017 19:37:52 +0100 Subject: [PATCH 28/78] Project files cleanup again --- plugins/devtoolsplugin/devtoolsplugin.pro | 8 ++++---- plugins/lunchmealplugin/lunchmealplugin.pro | 12 ++++++------ 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/plugins/devtoolsplugin/devtoolsplugin.pro b/plugins/devtoolsplugin/devtoolsplugin.pro index b6af1b6..17fc54a 100644 --- a/plugins/devtoolsplugin/devtoolsplugin.pro +++ b/plugins/devtoolsplugin/devtoolsplugin.pro @@ -15,12 +15,12 @@ DEPENDPATH += $$PWD/../../zeiterfassungcorelib $$PWD/../../zeiterfassungguilib DEFINES += QT_DEPRECATED_WARNINGS QT_DISABLE_DEPRECATED_BEFORE=0x060000 QT_MESSAGELOGCONTEXT HEADERS += devtoolsplugin.h \ - logmodel.h \ - logdialog.h + logdialog.h \ + logmodel.h SOURCES += devtoolsplugin.cpp \ - logmodel.cpp \ - logdialog.cpp + logdialog.cpp \ + logmodel.cpp FORMS += logdialog.ui diff --git a/plugins/lunchmealplugin/lunchmealplugin.pro b/plugins/lunchmealplugin/lunchmealplugin.pro index 9ce77c2..0e74977 100644 --- a/plugins/lunchmealplugin/lunchmealplugin.pro +++ b/plugins/lunchmealplugin/lunchmealplugin.pro @@ -14,13 +14,13 @@ DEPENDPATH += $$PWD/../../zeiterfassungcorelib $$PWD/../../zeiterfassungguilib DEFINES += QT_DEPRECATED_WARNINGS QT_DISABLE_DEPRECATED_BEFORE=0x060000 QT_MESSAGELOGCONTEXT -HEADERS += lunchmealplugin.h \ - lunchmealwidget.h \ - lunchmealdialog.h +HEADERS += lunchmealdialog.h \ + lunchmealplugin.h \ + lunchmealwidget.h -SOURCES += lunchmealplugin.cpp \ - lunchmealwidget.cpp \ - lunchmealdialog.cpp +SOURCES += lunchmealdialog.cpp \ + lunchmealplugin.cpp \ + lunchmealwidget.cpp FORMS += lunchmealdialog.ui -- 2.50.1 From c3c1b486ba193b4d415863e77332ee92b94d27f4 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Fri, 22 Dec 2017 20:14:01 +0100 Subject: [PATCH 29/78] WebRadioDialog now stores last used radio station in config --- plugins/webradioplugin/webradiodialog.cpp | 67 ++++++--- plugins/webradioplugin/webradiodialog.h | 11 +- plugins/webradioplugin/webradiodialog.ui | 169 ++++++++++------------ plugins/webradioplugin/webradioplugin.cpp | 2 +- 4 files changed, 134 insertions(+), 115 deletions(-) diff --git a/plugins/webradioplugin/webradiodialog.cpp b/plugins/webradioplugin/webradiodialog.cpp index 39dd264..81dcab3 100644 --- a/plugins/webradioplugin/webradiodialog.cpp +++ b/plugins/webradioplugin/webradiodialog.cpp @@ -1,16 +1,22 @@ #include "webradiodialog.h" #include "ui_webradiodialog.h" -#include +#include "mainwindow.h" +#include "zeiterfassungsettings.h" -WebRadioDialog::WebRadioDialog(QWidget *parent) : - QDialog(parent), +WebRadioDialog::WebRadioDialog(MainWindow &mainWindow) : + QDialog(&mainWindow), ui(new Ui::WebRadioDialog), + m_mainWindow(mainWindow), m_player(new QMediaPlayer(this)) { ui->setupUi(this); - for(const auto &url : QStringList { + connect(m_player, &QMediaPlayer::stateChanged, this, &WebRadioDialog::stateChanged); + connect(m_player, &QMediaPlayer::mediaStatusChanged, this, &WebRadioDialog::mediaStatusChanged); + connect(m_player, static_cast(&QMediaPlayer::error), this, &WebRadioDialog::error); + + for(const auto &url : m_mainWindow.settings().value(QStringLiteral("WebRadioPlugin/urls"), QStringList { QStringLiteral("http://stream.drumandbass.fm:9002"), QStringLiteral("http://stream.trap.fm:6002"), QStringLiteral("http://stream.dubbase.fm:7002"), @@ -22,27 +28,24 @@ WebRadioDialog::WebRadioDialog(QWidget *parent) : QStringLiteral("http://lw1.mp3.tb-group.fm/ct.mp3"), QStringLiteral("http://lw1.mp3.tb-group.fm/clt.mp3"), QStringLiteral("https://live.helsinki.at:8088/live160.ogg") - }) + }).toStringList()) { - ui->comboBox->addItem(url); + ui->comboBox->addItem(url, url); } - connect(ui->comboBox, &QComboBox::currentTextChanged, this, [=](const QString &url){ m_player->setMedia(QMediaContent(QUrl(url))); }); + auto lastUrl = m_mainWindow.settings().value(QStringLiteral("WebRadioPlugin/lastUrl")).toString(); + qDebug() << lastUrl; + auto index = ui->comboBox->findData(lastUrl); + qDebug() << index; + ui->comboBox->setCurrentIndex(index); - Q_EMIT ui->comboBox->currentTextChanged(ui->comboBox->currentText()); - - connect(ui->pushButtonPlay, &QAbstractButton::pressed, m_player, &QMediaPlayer::play); + connect(ui->pushButtonPlay, &QAbstractButton::pressed, this, &WebRadioDialog::play); connect(ui->pushButtonPause, &QAbstractButton::pressed, m_player, &QMediaPlayer::pause); connect(ui->pushButtonStop, &QAbstractButton::pressed, m_player, &QMediaPlayer::stop); - connect(ui->horizontalSlider, &QAbstractSlider::valueChanged, m_player, &QMediaPlayer::setVolume); - connect(m_player, &QMediaPlayer::stateChanged, [](QMediaPlayer::State newState){ qDebug() << newState; }); - connect(m_player, &QMediaPlayer::mediaStatusChanged, [](QMediaPlayer::MediaStatus status){ qDebug() << status; }); - connect(m_player, static_cast(&QMediaPlayer::error), - [](QMediaPlayer::Error error){ qDebug() << error; }); - connect(m_player, SIGNAL(volumeChanged(int)), ui->horizontalSlider, SLOT(setValue(int))); - - Q_EMIT m_player->volumeChanged(m_player->volume()); + m_player->setVolume(m_mainWindow.settings().value(QStringLiteral("WebRadioPlugin/volume"), 100).toInt()); + ui->horizontalSlider->setValue(m_player->volume()); + connect(ui->horizontalSlider, &QAbstractSlider::valueChanged, this, &WebRadioDialog::volumeChanged); } WebRadioDialog::~WebRadioDialog() @@ -50,7 +53,35 @@ WebRadioDialog::~WebRadioDialog() delete ui; } +void WebRadioDialog::stateChanged(QMediaPlayer::State newState) +{ + qDebug() << newState; +} + +void WebRadioDialog::mediaStatusChanged(QMediaPlayer::MediaStatus status) +{ + qDebug() << status; +} + +void WebRadioDialog::error(QMediaPlayer::Error error) +{ + qDebug() << error; +} + void WebRadioDialog::play() { + qDebug() << "called"; + if(ui->comboBox->currentIndex() == -1) + return; + m_mainWindow.settings().setValue(QStringLiteral("WebRadioPlugin/lastUrl"), ui->comboBox->currentData().toString()); + + m_player->setMedia(QMediaContent(QUrl(ui->comboBox->currentData().toString()))); + m_player->play(); +} + +void WebRadioDialog::volumeChanged(int volume) +{ + m_mainWindow.settings().setValue(QStringLiteral("WebRadioPlugin/volume"), volume); + m_player->setVolume(volume); } diff --git a/plugins/webradioplugin/webradiodialog.h b/plugins/webradioplugin/webradiodialog.h index 2bdd804..6a2d1df 100644 --- a/plugins/webradioplugin/webradiodialog.h +++ b/plugins/webradioplugin/webradiodialog.h @@ -2,8 +2,9 @@ #define WEBRADIODIALOG_H #include +#include -class QMediaPlayer; +class MainWindow; namespace Ui { class WebRadioDialog; } @@ -12,15 +13,21 @@ class WebRadioDialog : public QDialog Q_OBJECT public: - explicit WebRadioDialog(QWidget *parent = 0); + explicit WebRadioDialog(MainWindow &mainWindow); ~WebRadioDialog(); private Q_SLOTS: + void stateChanged(QMediaPlayer::State newState); + void mediaStatusChanged(QMediaPlayer::MediaStatus status); + void error(QMediaPlayer::Error error); + + void volumeChanged(int volume); void play(); private: Ui::WebRadioDialog *ui; + MainWindow &m_mainWindow; QMediaPlayer *m_player; }; diff --git a/plugins/webradioplugin/webradiodialog.ui b/plugins/webradioplugin/webradiodialog.ui index 8d7d9eb..07f2387 100644 --- a/plugins/webradioplugin/webradiodialog.ui +++ b/plugins/webradioplugin/webradiodialog.ui @@ -6,104 +6,85 @@ 0 0 - 539 - 300 + 494 + 155 - Dialog + Radio - - - - 30 - 240 - 341 - 32 - - - - Qt::Horizontal - - - QDialogButtonBox::Close - - - - - - 20 - 60 - 131 - 51 - - - - play() - - - - - - 50 - 160 - 351 - 23 - - - - 24 - - - - - - 160 - 60 - 131 - 51 - - - - pause() - - - - - - 300 - 60 - 131 - 51 - - - - stop() - - - - - - 270 - 130 - 160 - 16 - - - - Qt::Horizontal - - - - - - 40 - 20 - 271 - 25 - - - + + + + + + + + + + + 0 + 50 + + + + play() + + + + + + + + 0 + 50 + + + + pause() + + + + + + + + 0 + 50 + + + + stop() + + + + + + + Qt::Horizontal + + + + + + + + + TextLabel + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Close + + + + diff --git a/plugins/webradioplugin/webradioplugin.cpp b/plugins/webradioplugin/webradioplugin.cpp index d6bd079..9a749d7 100644 --- a/plugins/webradioplugin/webradioplugin.cpp +++ b/plugins/webradioplugin/webradioplugin.cpp @@ -33,7 +33,7 @@ WebRadioPlugin::WebRadioPlugin(QObject *parent) : void WebRadioPlugin::attachTo(MainWindow &mainWindow) { - auto dialog = new WebRadioDialog(&mainWindow); + auto dialog = new WebRadioDialog(mainWindow); mainWindow.menuTools()->addAction(QIcon(QStringLiteral(":/zeiterfassung/plugins/webradioplugin/images/web-radio.png")), tr("Play webradio"), dialog, &QWidget::show); } -- 2.50.1 From eb9627d8a5f54c10adf8e3eb81d8cd9d71a25808 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Fri, 22 Dec 2017 20:44:58 +0100 Subject: [PATCH 30/78] Buttons are now disabled when not available in webradioplugin --- .../translations/webradioplugin_de.ts | 88 +++++++++++++++++-- .../translations/webradioplugin_en.ts | 82 ++++++++++++++++- plugins/webradioplugin/webradiodialog.cpp | 67 +++++++++++--- plugins/webradioplugin/webradiodialog.h | 4 +- plugins/webradioplugin/webradiodialog.ui | 27 ++++-- 5 files changed, 240 insertions(+), 28 deletions(-) diff --git a/plugins/webradioplugin/translations/webradioplugin_de.ts b/plugins/webradioplugin/translations/webradioplugin_de.ts index b0a61dd..c21f851 100644 --- a/plugins/webradioplugin/translations/webradioplugin_de.ts +++ b/plugins/webradioplugin/translations/webradioplugin_de.ts @@ -5,13 +5,89 @@ WebRadioDialog - Dialog - + Radio + Radio - - PushButton - + + Play + Abspielen + + + + Pause + Pause + + + + Stop + Stop + + + + Stopped + Gestoppt + + + + Playing + Wird abgespielt + + + + Paused + Pausiert + + + + + Unknown + Unbekannt + + + + Unknown media + Unbekanntes Medium + + + + No media + Kein Medium + + + + Loading media... + Lade Medium... + + + + Loaded media + Medium geladen + + + + Stalled media + Medium angehalten + + + + Buffering media + Puffere Medium + + + + Buffered media + Medium gepuffert + + + + End of media + Ende des Mediums + + + + Invalid media + Ungültiges Medium @@ -19,7 +95,7 @@ Play webradio - + Webradio spielen diff --git a/plugins/webradioplugin/translations/webradioplugin_en.ts b/plugins/webradioplugin/translations/webradioplugin_en.ts index 6ed3a57..e84a249 100644 --- a/plugins/webradioplugin/translations/webradioplugin_en.ts +++ b/plugins/webradioplugin/translations/webradioplugin_en.ts @@ -5,12 +5,88 @@ WebRadioDialog - Dialog + Radio - - PushButton + + Play + + + + + Pause + + + + + Stop + + + + + Stopped + + + + + Playing + + + + + Paused + + + + + + Unknown + + + + + Unknown media + + + + + No media + + + + + Loading media... + + + + + Loaded media + + + + + Stalled media + + + + + Buffering media + + + + + Buffered media + + + + + End of media + + + + + Invalid media diff --git a/plugins/webradioplugin/webradiodialog.cpp b/plugins/webradioplugin/webradiodialog.cpp index 81dcab3..b8ddc01 100644 --- a/plugins/webradioplugin/webradiodialog.cpp +++ b/plugins/webradioplugin/webradiodialog.cpp @@ -13,7 +13,9 @@ WebRadioDialog::WebRadioDialog(MainWindow &mainWindow) : ui->setupUi(this); connect(m_player, &QMediaPlayer::stateChanged, this, &WebRadioDialog::stateChanged); + connect(m_player, &QMediaPlayer::stateChanged, this, &WebRadioDialog::updateWidgets); connect(m_player, &QMediaPlayer::mediaStatusChanged, this, &WebRadioDialog::mediaStatusChanged); + connect(m_player, &QMediaPlayer::mediaStatusChanged, this, &WebRadioDialog::updateWidgets); connect(m_player, static_cast(&QMediaPlayer::error), this, &WebRadioDialog::error); for(const auto &url : m_mainWindow.settings().value(QStringLiteral("WebRadioPlugin/urls"), QStringList { @@ -33,11 +35,13 @@ WebRadioDialog::WebRadioDialog(MainWindow &mainWindow) : ui->comboBox->addItem(url, url); } - auto lastUrl = m_mainWindow.settings().value(QStringLiteral("WebRadioPlugin/lastUrl")).toString(); - qDebug() << lastUrl; - auto index = ui->comboBox->findData(lastUrl); - qDebug() << index; - ui->comboBox->setCurrentIndex(index); + ui->comboBox->setCurrentIndex(ui->comboBox->findData(m_mainWindow.settings().value(QStringLiteral("WebRadioPlugin/lastUrl")).toString())); + + connect(ui->comboBox, static_cast(&QComboBox::currentIndexChanged), + this, &WebRadioDialog::currentIndexChanged); + + connect(ui->comboBox, static_cast(&QComboBox::currentIndexChanged), + this, &WebRadioDialog::updateWidgets); connect(ui->pushButtonPlay, &QAbstractButton::pressed, this, &WebRadioDialog::play); connect(ui->pushButtonPause, &QAbstractButton::pressed, m_player, &QMediaPlayer::pause); @@ -46,6 +50,11 @@ WebRadioDialog::WebRadioDialog(MainWindow &mainWindow) : m_player->setVolume(m_mainWindow.settings().value(QStringLiteral("WebRadioPlugin/volume"), 100).toInt()); ui->horizontalSlider->setValue(m_player->volume()); connect(ui->horizontalSlider, &QAbstractSlider::valueChanged, this, &WebRadioDialog::volumeChanged); + + stateChanged(m_player->state()); + mediaStatusChanged(m_player->mediaStatus()); + currentIndexChanged(ui->comboBox->currentIndex()); + updateWidgets(); } WebRadioDialog::~WebRadioDialog() @@ -55,31 +64,69 @@ WebRadioDialog::~WebRadioDialog() void WebRadioDialog::stateChanged(QMediaPlayer::State newState) { - qDebug() << newState; + switch(newState) + { + case QMediaPlayer::StoppedState: ui->labelState->setText(tr("Stopped")); break; + case QMediaPlayer::PlayingState: ui->labelState->setText(tr("Playing")); break; + case QMediaPlayer::PausedState: ui->labelState->setText(tr("Paused")); break; + default: + qWarning() << "unknown state" << newState; + ui->labelState->setText(tr("Unknown")); + } } void WebRadioDialog::mediaStatusChanged(QMediaPlayer::MediaStatus status) { - qDebug() << status; + switch(status) + { + case QMediaPlayer::UnknownMediaStatus: ui->labelMediaStatus->setText(tr("Unknown media")); break; + case QMediaPlayer::NoMedia: ui->labelMediaStatus->setText(tr("No media")); break; + case QMediaPlayer::LoadingMedia: ui->labelMediaStatus->setText(tr("Loading media...")); break; + case QMediaPlayer::LoadedMedia: ui->labelMediaStatus->setText(tr("Loaded media")); break; + case QMediaPlayer::StalledMedia: ui->labelMediaStatus->setText(tr("Stalled media")); break; + case QMediaPlayer::BufferingMedia: ui->labelMediaStatus->setText(tr("Buffering media")); break; + case QMediaPlayer::BufferedMedia: ui->labelMediaStatus->setText(tr("Buffered media")); break; + case QMediaPlayer::EndOfMedia: ui->labelMediaStatus->setText(tr("End of media")); break; + case QMediaPlayer::InvalidMedia: ui->labelMediaStatus->setText(tr("Invalid media")); break; + default: + qWarning() << "unknown mediaStatus" << status; + ui->labelMediaStatus->setText(tr("Unknown")); + } } void WebRadioDialog::error(QMediaPlayer::Error error) { - qDebug() << error; + qWarning() << error; +} + +void WebRadioDialog::currentIndexChanged(int index) +{ + if(index == -1) + m_player->setMedia(QMediaContent()); + else + m_player->setMedia(QMediaContent(QUrl(ui->comboBox->currentData().toString()))); } void WebRadioDialog::play() { - qDebug() << "called"; if(ui->comboBox->currentIndex() == -1) return; m_mainWindow.settings().setValue(QStringLiteral("WebRadioPlugin/lastUrl"), ui->comboBox->currentData().toString()); - m_player->setMedia(QMediaContent(QUrl(ui->comboBox->currentData().toString()))); m_player->play(); } +void WebRadioDialog::updateWidgets() +{ + ui->comboBox->setEnabled(m_player->state() != QMediaPlayer::PlayingState); + ui->pushButtonPlay->setEnabled(ui->comboBox->currentIndex() > -1 && + (m_player->state() == QMediaPlayer::StoppedState || m_player->state() == QMediaPlayer::PausedState) && + (m_player->mediaStatus() == QMediaPlayer::LoadedMedia || m_player->mediaStatus() == QMediaPlayer::BufferedMedia)); + ui->pushButtonPause->setEnabled(m_player->state() == QMediaPlayer::PlayingState || m_player->state() == QMediaPlayer::PausedState); + ui->pushButtonStop->setEnabled(m_player->state() == QMediaPlayer::PlayingState || m_player->state() == QMediaPlayer::PausedState); +} + void WebRadioDialog::volumeChanged(int volume) { m_mainWindow.settings().setValue(QStringLiteral("WebRadioPlugin/volume"), volume); diff --git a/plugins/webradioplugin/webradiodialog.h b/plugins/webradioplugin/webradiodialog.h index 6a2d1df..ed40035 100644 --- a/plugins/webradioplugin/webradiodialog.h +++ b/plugins/webradioplugin/webradiodialog.h @@ -20,11 +20,13 @@ private Q_SLOTS: void stateChanged(QMediaPlayer::State newState); void mediaStatusChanged(QMediaPlayer::MediaStatus status); void error(QMediaPlayer::Error error); - + void currentIndexChanged(int index); void volumeChanged(int volume); void play(); private: + void updateWidgets(); + Ui::WebRadioDialog *ui; MainWindow &m_mainWindow; diff --git a/plugins/webradioplugin/webradiodialog.ui b/plugins/webradioplugin/webradiodialog.ui index 07f2387..5758e10 100644 --- a/plugins/webradioplugin/webradiodialog.ui +++ b/plugins/webradioplugin/webradiodialog.ui @@ -28,7 +28,7 @@ - play() + Play @@ -41,7 +41,7 @@ - pause() + Pause @@ -54,7 +54,7 @@ - stop() + Stop @@ -68,11 +68,22 @@ - - - TextLabel - - + + + + + state + + + + + + + mediaStatus + + + + -- 2.50.1 From fe0152b00acdbbfbde0d78304f0354e351a31148 Mon Sep 17 00:00:00 2001 From: Daniel Brunner <0xFEEDC0DE64@gmail.com> Date: Fri, 22 Dec 2017 20:58:21 +0100 Subject: [PATCH 31/78] Fixed compilation on windows (wrong export macro) --- plugins/profileplugin/profiledialog.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/plugins/profileplugin/profiledialog.h b/plugins/profileplugin/profiledialog.h index b2abd1c..c3ea218 100644 --- a/plugins/profileplugin/profiledialog.h +++ b/plugins/profileplugin/profiledialog.h @@ -2,12 +2,11 @@ #include -#include "zeiterfassungguilib_global.h" #include "replies/getuserinforeply.h" namespace Ui { class ProfileDialog; } -class ZEITERFASSUNGGUILIBSHARED_EXPORT ProfileDialog : public QDialog +class ProfileDialog : public QDialog { Q_OBJECT -- 2.50.1 From 3049c6b09e8b4c65bff2c5d1bc209b3727e285fe Mon Sep 17 00:00:00 2001 From: Daniel Brunner <0xFEEDC0DE64@gmail.com> Date: Fri, 22 Dec 2017 21:02:01 +0100 Subject: [PATCH 32/78] Removed question mark buttons on windows --- plugins/advancedviewplugin/advancedviewdialog.cpp | 1 + plugins/advancedviewplugin/dialogs/bookingdialog.cpp | 1 + plugins/advancedviewplugin/dialogs/timeassignmentdialog.cpp | 1 + plugins/devtoolsplugin/logdialog.cpp | 1 + plugins/lunchmealplugin/lunchmealdialog.cpp | 1 + plugins/profileplugin/profiledialog.cpp | 1 + plugins/updaterplugin/updaterdialog.cpp | 1 + plugins/webradioplugin/webradiodialog.cpp | 1 + zeiterfassungguilib/dialogs/authenticationdialog.cpp | 1 + zeiterfassungguilib/dialogs/languageselectiondialog.cpp | 1 + zeiterfassungguilib/dialogs/settingsdialog.cpp | 1 + 11 files changed, 11 insertions(+) diff --git a/plugins/advancedviewplugin/advancedviewdialog.cpp b/plugins/advancedviewplugin/advancedviewdialog.cpp index c3ab43e..e25f390 100644 --- a/plugins/advancedviewplugin/advancedviewdialog.cpp +++ b/plugins/advancedviewplugin/advancedviewdialog.cpp @@ -29,6 +29,7 @@ AdvancedViewDialog::AdvancedViewDialog(StripsWidget &stripsWidget) : m_timeAssignmentsModel(new TimeAssignmentsModel(stripsWidget, this)) { ui->setupUi(this); + setWindowFlag(Qt::WindowContextHelpButtonHint, false); ui->bookingsView->setModel(m_bookingsModel); ui->bookingsView->setEnabled(m_bookingsModel->enabled()); diff --git a/plugins/advancedviewplugin/dialogs/bookingdialog.cpp b/plugins/advancedviewplugin/dialogs/bookingdialog.cpp index 768e872..0ebcb31 100644 --- a/plugins/advancedviewplugin/dialogs/bookingdialog.cpp +++ b/plugins/advancedviewplugin/dialogs/bookingdialog.cpp @@ -6,6 +6,7 @@ BookingDialog::BookingDialog(QWidget *parent) : ui(new Ui::BookingDialog) { ui->setupUi(this); + setWindowFlag(Qt::WindowContextHelpButtonHint, false); } BookingDialog::~BookingDialog() diff --git a/plugins/advancedviewplugin/dialogs/timeassignmentdialog.cpp b/plugins/advancedviewplugin/dialogs/timeassignmentdialog.cpp index 8f1c6d4..894430c 100644 --- a/plugins/advancedviewplugin/dialogs/timeassignmentdialog.cpp +++ b/plugins/advancedviewplugin/dialogs/timeassignmentdialog.cpp @@ -13,6 +13,7 @@ TimeAssignmentDialog::TimeAssignmentDialog(const QMap &project ui(new Ui::TimeAssignmentDialog) { ui->setupUi(this); + setWindowFlag(Qt::WindowContextHelpButtonHint, false); { for(const auto &preferedProject : settings.projects()) diff --git a/plugins/devtoolsplugin/logdialog.cpp b/plugins/devtoolsplugin/logdialog.cpp index 8605398..0780c99 100644 --- a/plugins/devtoolsplugin/logdialog.cpp +++ b/plugins/devtoolsplugin/logdialog.cpp @@ -6,6 +6,7 @@ LogDialog::LogDialog(QWidget *parent) : ui(new Ui::LogDialog) { ui->setupUi(this); + setWindowFlag(Qt::WindowContextHelpButtonHint, false); } LogDialog::~LogDialog() diff --git a/plugins/lunchmealplugin/lunchmealdialog.cpp b/plugins/lunchmealplugin/lunchmealdialog.cpp index a61dd57..6627216 100644 --- a/plugins/lunchmealplugin/lunchmealdialog.cpp +++ b/plugins/lunchmealplugin/lunchmealdialog.cpp @@ -16,6 +16,7 @@ LunchMealDialog::LunchMealDialog(StripsWidget &stripsWidget) : ui(new Ui::LunchMealDialog) { ui->setupUi(this); + setWindowFlag(Qt::WindowContextHelpButtonHint, false); ui->labelTitle->setText(tr("Lunch meal for %0").arg(stripsWidget.date().toString(tr("dd.MM.yyyy")))); diff --git a/plugins/profileplugin/profiledialog.cpp b/plugins/profileplugin/profiledialog.cpp index 1a52589..6db4220 100644 --- a/plugins/profileplugin/profiledialog.cpp +++ b/plugins/profileplugin/profiledialog.cpp @@ -6,6 +6,7 @@ ProfileDialog::ProfileDialog(const GetUserInfoReply::UserInfo &userInfo, QWidget ui(new Ui::ProfileDialog) { ui->setupUi(this); + setWindowFlag(Qt::WindowContextHelpButtonHint, false); ui->spinBoxUserId->setValue(userInfo.userId); ui->lineEditEmail->setText(userInfo.email); diff --git a/plugins/updaterplugin/updaterdialog.cpp b/plugins/updaterplugin/updaterdialog.cpp index 74272d4..32781e2 100644 --- a/plugins/updaterplugin/updaterdialog.cpp +++ b/plugins/updaterplugin/updaterdialog.cpp @@ -24,6 +24,7 @@ UpdaterDialog::UpdaterDialog(MainWindow &mainWindow) : m_mainWindow(mainWindow) { ui->setupUi(this); + setWindowFlag(Qt::WindowContextHelpButtonHint, false); setAttribute(Qt::WA_DeleteOnClose); diff --git a/plugins/webradioplugin/webradiodialog.cpp b/plugins/webradioplugin/webradiodialog.cpp index b8ddc01..68b64cb 100644 --- a/plugins/webradioplugin/webradiodialog.cpp +++ b/plugins/webradioplugin/webradiodialog.cpp @@ -11,6 +11,7 @@ WebRadioDialog::WebRadioDialog(MainWindow &mainWindow) : m_player(new QMediaPlayer(this)) { ui->setupUi(this); + setWindowFlag(Qt::WindowContextHelpButtonHint, false); connect(m_player, &QMediaPlayer::stateChanged, this, &WebRadioDialog::stateChanged); connect(m_player, &QMediaPlayer::stateChanged, this, &WebRadioDialog::updateWidgets); diff --git a/zeiterfassungguilib/dialogs/authenticationdialog.cpp b/zeiterfassungguilib/dialogs/authenticationdialog.cpp index 5de7cf2..72b68c6 100644 --- a/zeiterfassungguilib/dialogs/authenticationdialog.cpp +++ b/zeiterfassungguilib/dialogs/authenticationdialog.cpp @@ -6,6 +6,7 @@ AuthenticationDialog::AuthenticationDialog(QWidget *parent) : ui(new Ui::AuthenticationDialog) { ui->setupUi(this); + setWindowFlag(Qt::WindowContextHelpButtonHint, false); } AuthenticationDialog::~AuthenticationDialog() diff --git a/zeiterfassungguilib/dialogs/languageselectiondialog.cpp b/zeiterfassungguilib/dialogs/languageselectiondialog.cpp index 3cf0c6a..ae5195c 100644 --- a/zeiterfassungguilib/dialogs/languageselectiondialog.cpp +++ b/zeiterfassungguilib/dialogs/languageselectiondialog.cpp @@ -6,6 +6,7 @@ LanguageSelectionDialog::LanguageSelectionDialog(QWidget *parent) : ui(new Ui::LanguageSelectionDialog) { ui->setupUi(this); + setWindowFlag(Qt::WindowContextHelpButtonHint, false); ui->comboBoxLanguage->addItem(tr("English"), QLocale::English); ui->comboBoxLanguage->addItem(tr("German"), QLocale::German); diff --git a/zeiterfassungguilib/dialogs/settingsdialog.cpp b/zeiterfassungguilib/dialogs/settingsdialog.cpp index 0532c8a..c00ec0e 100644 --- a/zeiterfassungguilib/dialogs/settingsdialog.cpp +++ b/zeiterfassungguilib/dialogs/settingsdialog.cpp @@ -16,6 +16,7 @@ SettingsDialog::SettingsDialog(ZeiterfassungSettings &settings, QWidget *parent) m_settings(settings) { ui->setupUi(this); + setWindowFlag(Qt::WindowContextHelpButtonHint, false); ui->comboBoxLanguage->addItem(tr("English"), QLocale::English); ui->comboBoxLanguage->addItem(tr("German"), QLocale::German); -- 2.50.1 From d15ec864705dcfbf4e82e978736cbc100d6892e9 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Fri, 22 Dec 2017 23:14:03 +0100 Subject: [PATCH 33/78] Fixed compilation with older qt versions --- plugins/advancedviewplugin/advancedviewdialog.cpp | 5 +++++ plugins/advancedviewplugin/dialogs/bookingdialog.cpp | 5 +++++ plugins/advancedviewplugin/dialogs/timeassignmentdialog.cpp | 5 +++++ plugins/devtoolsplugin/logdialog.cpp | 5 +++++ plugins/lunchmealplugin/lunchmealdialog.cpp | 5 +++++ plugins/profileplugin/profiledialog.cpp | 5 +++++ plugins/updaterplugin/updaterdialog.cpp | 5 +++++ plugins/webradioplugin/webradiodialog.cpp | 5 +++++ zeiterfassungguilib/dialogs/authenticationdialog.cpp | 5 +++++ zeiterfassungguilib/dialogs/languageselectiondialog.cpp | 5 +++++ zeiterfassungguilib/dialogs/settingsdialog.cpp | 5 +++++ 11 files changed, 55 insertions(+) diff --git a/plugins/advancedviewplugin/advancedviewdialog.cpp b/plugins/advancedviewplugin/advancedviewdialog.cpp index e25f390..c258ae4 100644 --- a/plugins/advancedviewplugin/advancedviewdialog.cpp +++ b/plugins/advancedviewplugin/advancedviewdialog.cpp @@ -29,7 +29,12 @@ AdvancedViewDialog::AdvancedViewDialog(StripsWidget &stripsWidget) : m_timeAssignmentsModel(new TimeAssignmentsModel(stripsWidget, this)) { ui->setupUi(this); + +#if (QT_VERSION >= QT_VERSION_CHECK(5, 9, 0)) setWindowFlag(Qt::WindowContextHelpButtonHint, false); +#else + setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); +#endif ui->bookingsView->setModel(m_bookingsModel); ui->bookingsView->setEnabled(m_bookingsModel->enabled()); diff --git a/plugins/advancedviewplugin/dialogs/bookingdialog.cpp b/plugins/advancedviewplugin/dialogs/bookingdialog.cpp index 0ebcb31..556839f 100644 --- a/plugins/advancedviewplugin/dialogs/bookingdialog.cpp +++ b/plugins/advancedviewplugin/dialogs/bookingdialog.cpp @@ -6,7 +6,12 @@ BookingDialog::BookingDialog(QWidget *parent) : ui(new Ui::BookingDialog) { ui->setupUi(this); + +#if (QT_VERSION >= QT_VERSION_CHECK(5, 9, 0)) setWindowFlag(Qt::WindowContextHelpButtonHint, false); +#else + setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); +#endif } BookingDialog::~BookingDialog() diff --git a/plugins/advancedviewplugin/dialogs/timeassignmentdialog.cpp b/plugins/advancedviewplugin/dialogs/timeassignmentdialog.cpp index 894430c..575d2ca 100644 --- a/plugins/advancedviewplugin/dialogs/timeassignmentdialog.cpp +++ b/plugins/advancedviewplugin/dialogs/timeassignmentdialog.cpp @@ -13,7 +13,12 @@ TimeAssignmentDialog::TimeAssignmentDialog(const QMap &project ui(new Ui::TimeAssignmentDialog) { ui->setupUi(this); + +#if (QT_VERSION >= QT_VERSION_CHECK(5, 9, 0)) setWindowFlag(Qt::WindowContextHelpButtonHint, false); +#else + setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); +#endif { for(const auto &preferedProject : settings.projects()) diff --git a/plugins/devtoolsplugin/logdialog.cpp b/plugins/devtoolsplugin/logdialog.cpp index 0780c99..f401579 100644 --- a/plugins/devtoolsplugin/logdialog.cpp +++ b/plugins/devtoolsplugin/logdialog.cpp @@ -6,7 +6,12 @@ LogDialog::LogDialog(QWidget *parent) : ui(new Ui::LogDialog) { ui->setupUi(this); + +#if (QT_VERSION >= QT_VERSION_CHECK(5, 9, 0)) setWindowFlag(Qt::WindowContextHelpButtonHint, false); +#else + setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); +#endif } LogDialog::~LogDialog() diff --git a/plugins/lunchmealplugin/lunchmealdialog.cpp b/plugins/lunchmealplugin/lunchmealdialog.cpp index 6627216..0693f31 100644 --- a/plugins/lunchmealplugin/lunchmealdialog.cpp +++ b/plugins/lunchmealplugin/lunchmealdialog.cpp @@ -16,7 +16,12 @@ LunchMealDialog::LunchMealDialog(StripsWidget &stripsWidget) : ui(new Ui::LunchMealDialog) { ui->setupUi(this); + +#if (QT_VERSION >= QT_VERSION_CHECK(5, 9, 0)) setWindowFlag(Qt::WindowContextHelpButtonHint, false); +#else + setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); +#endif ui->labelTitle->setText(tr("Lunch meal for %0").arg(stripsWidget.date().toString(tr("dd.MM.yyyy")))); diff --git a/plugins/profileplugin/profiledialog.cpp b/plugins/profileplugin/profiledialog.cpp index 6db4220..fae2c94 100644 --- a/plugins/profileplugin/profiledialog.cpp +++ b/plugins/profileplugin/profiledialog.cpp @@ -6,7 +6,12 @@ ProfileDialog::ProfileDialog(const GetUserInfoReply::UserInfo &userInfo, QWidget ui(new Ui::ProfileDialog) { ui->setupUi(this); + +#if (QT_VERSION >= QT_VERSION_CHECK(5, 9, 0)) setWindowFlag(Qt::WindowContextHelpButtonHint, false); +#else + setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); +#endif ui->spinBoxUserId->setValue(userInfo.userId); ui->lineEditEmail->setText(userInfo.email); diff --git a/plugins/updaterplugin/updaterdialog.cpp b/plugins/updaterplugin/updaterdialog.cpp index 32781e2..b890a90 100644 --- a/plugins/updaterplugin/updaterdialog.cpp +++ b/plugins/updaterplugin/updaterdialog.cpp @@ -24,7 +24,12 @@ UpdaterDialog::UpdaterDialog(MainWindow &mainWindow) : m_mainWindow(mainWindow) { ui->setupUi(this); + +#if (QT_VERSION >= QT_VERSION_CHECK(5, 9, 0)) setWindowFlag(Qt::WindowContextHelpButtonHint, false); +#else + setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); +#endif setAttribute(Qt::WA_DeleteOnClose); diff --git a/plugins/webradioplugin/webradiodialog.cpp b/plugins/webradioplugin/webradiodialog.cpp index 68b64cb..49d7ce3 100644 --- a/plugins/webradioplugin/webradiodialog.cpp +++ b/plugins/webradioplugin/webradiodialog.cpp @@ -11,7 +11,12 @@ WebRadioDialog::WebRadioDialog(MainWindow &mainWindow) : m_player(new QMediaPlayer(this)) { ui->setupUi(this); + +#if (QT_VERSION >= QT_VERSION_CHECK(5, 9, 0)) setWindowFlag(Qt::WindowContextHelpButtonHint, false); +#else + setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); +#endif connect(m_player, &QMediaPlayer::stateChanged, this, &WebRadioDialog::stateChanged); connect(m_player, &QMediaPlayer::stateChanged, this, &WebRadioDialog::updateWidgets); diff --git a/zeiterfassungguilib/dialogs/authenticationdialog.cpp b/zeiterfassungguilib/dialogs/authenticationdialog.cpp index 72b68c6..d705e31 100644 --- a/zeiterfassungguilib/dialogs/authenticationdialog.cpp +++ b/zeiterfassungguilib/dialogs/authenticationdialog.cpp @@ -6,7 +6,12 @@ AuthenticationDialog::AuthenticationDialog(QWidget *parent) : ui(new Ui::AuthenticationDialog) { ui->setupUi(this); + +#if (QT_VERSION >= QT_VERSION_CHECK(5, 9, 0)) setWindowFlag(Qt::WindowContextHelpButtonHint, false); +#else + setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); +#endif } AuthenticationDialog::~AuthenticationDialog() diff --git a/zeiterfassungguilib/dialogs/languageselectiondialog.cpp b/zeiterfassungguilib/dialogs/languageselectiondialog.cpp index ae5195c..86a3e6b 100644 --- a/zeiterfassungguilib/dialogs/languageselectiondialog.cpp +++ b/zeiterfassungguilib/dialogs/languageselectiondialog.cpp @@ -6,7 +6,12 @@ LanguageSelectionDialog::LanguageSelectionDialog(QWidget *parent) : ui(new Ui::LanguageSelectionDialog) { ui->setupUi(this); + +#if (QT_VERSION >= QT_VERSION_CHECK(5, 9, 0)) setWindowFlag(Qt::WindowContextHelpButtonHint, false); +#else + setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); +#endif ui->comboBoxLanguage->addItem(tr("English"), QLocale::English); ui->comboBoxLanguage->addItem(tr("German"), QLocale::German); diff --git a/zeiterfassungguilib/dialogs/settingsdialog.cpp b/zeiterfassungguilib/dialogs/settingsdialog.cpp index c00ec0e..f9e5c66 100644 --- a/zeiterfassungguilib/dialogs/settingsdialog.cpp +++ b/zeiterfassungguilib/dialogs/settingsdialog.cpp @@ -16,7 +16,12 @@ SettingsDialog::SettingsDialog(ZeiterfassungSettings &settings, QWidget *parent) m_settings(settings) { ui->setupUi(this); + +#if (QT_VERSION >= QT_VERSION_CHECK(5, 9, 0)) setWindowFlag(Qt::WindowContextHelpButtonHint, false); +#else + setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); +#endif ui->comboBoxLanguage->addItem(tr("English"), QLocale::English); ui->comboBoxLanguage->addItem(tr("German"), QLocale::German); -- 2.50.1 From 45fcf52db388761ad41e36f6e186b44210d6b0a3 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Fri, 22 Dec 2017 23:14:25 +0100 Subject: [PATCH 34/78] PresencePlugin now shows employees #37 --- plugins/presenceplugin/presencewidget.cpp | 52 +++++++++++------------ plugins/presenceplugin/presencewidget.h | 9 ++-- 2 files changed, 32 insertions(+), 29 deletions(-) diff --git a/plugins/presenceplugin/presencewidget.cpp b/plugins/presenceplugin/presencewidget.cpp index cbcbca6..d3c0857 100644 --- a/plugins/presenceplugin/presencewidget.cpp +++ b/plugins/presenceplugin/presencewidget.cpp @@ -1,12 +1,14 @@ #include "presencewidget.h" -#include -#include +#include #include +#include #include #include #include +#include + #include "mainwindow.h" #include "zeiterfassungapi.h" @@ -16,15 +18,15 @@ PresenceWidget::PresenceWidget(MainWindow &mainWindow) : { connect(&m_mainWindow, &MainWindow::refreshEverything, this, &PresenceWidget::refresh); - m_labelAvailable = new QLabel(this); - m_labelAvailable->setFrameShape(QFrame::Panel); - m_labelAvailable->setFrameShadow(QFrame::Sunken); - m_mainWindow.statusBar()->addWidget(m_labelAvailable); + m_buttonAvailable = new QPushButton(this); + m_menuAvailable = new QMenu(this); + m_buttonAvailable->setMenu(m_menuAvailable); + m_mainWindow.statusBar()->addWidget(m_buttonAvailable); - m_labelNotAvailable = new QLabel(this); - m_labelNotAvailable->setFrameShape(QFrame::Panel); - m_labelNotAvailable->setFrameShadow(QFrame::Sunken); - m_mainWindow.statusBar()->addWidget(m_labelNotAvailable); + m_buttonNotAvailable = new QPushButton(this); + m_menuNotAvailable = new QMenu(this); + m_buttonNotAvailable->setMenu(m_menuNotAvailable); + m_mainWindow.statusBar()->addWidget(m_buttonNotAvailable); m_action = m_mainWindow.menuView()->addAction(QIcon(QStringLiteral(":zeiterfassung/plugins/presenceplugin/images/refresh.png")), tr("Refresh presence"), this, &PresenceWidget::refresh); @@ -39,8 +41,10 @@ PresenceWidget::PresenceWidget(MainWindow &mainWindow) : void PresenceWidget::refresh() { - m_labelAvailable->setText(tr("%0: %1").arg(tr("Available")).arg(tr("???"))); - m_labelNotAvailable->setText(tr("%0: %1").arg(tr("Not available")).arg(tr("???"))); + m_buttonAvailable->setText(tr("%0: %1").arg(tr("Available")).arg(tr("???"))); + m_menuAvailable->clear(); + m_buttonNotAvailable->setText(tr("%0: %1").arg(tr("Not available")).arg(tr("???"))); + m_menuNotAvailable->clear(); m_action->setEnabled(false); @@ -57,23 +61,19 @@ void PresenceWidget::finished() goto after; } + for(const auto &status : m_reply->presenceStatuses()) { - int available = 0, - notAvailable = 0; - for(const auto &status : m_reply->presenceStatuses()) - { - if(status.presence == QStringLiteral("J")) - available++; - else if(status.presence == QStringLiteral("N")) - notAvailable++; - else - qWarning() << "unknown presence" << status.firstName << status.lastName << status.presence; - } - - m_labelAvailable->setText(tr("%0: %1").arg(tr("Available")).arg(available)); - m_labelNotAvailable->setText(tr("%0: %1").arg(tr("Not available")).arg(notAvailable)); + if(status.presence == QStringLiteral("J")) + m_menuAvailable->addAction(tr("%0 %1").arg(status.firstName).arg(status.lastName)); + else if(status.presence == QStringLiteral("N")) + m_menuNotAvailable->addAction(tr("%0 %1").arg(status.firstName).arg(status.lastName)); + else + qWarning() << "unknown presence" << status.firstName << status.lastName << status.presence; } + m_buttonAvailable->setText(tr("%0: %1").arg(tr("Available")).arg(m_menuAvailable->actions().count())); + m_buttonNotAvailable->setText(tr("%0: %1").arg(tr("Not available")).arg(m_menuNotAvailable->actions().count())); + after: m_action->setEnabled(true); m_reply = Q_NULLPTR; diff --git a/plugins/presenceplugin/presencewidget.h b/plugins/presenceplugin/presencewidget.h index 71f6f86..15a8ed6 100644 --- a/plugins/presenceplugin/presencewidget.h +++ b/plugins/presenceplugin/presencewidget.h @@ -4,7 +4,8 @@ #include "replies/getpresencestatusreply.h" -class QLabel; +class QPushButton; +class QMenu; class QAction; class MainWindow; @@ -23,8 +24,10 @@ private Q_SLOTS: private: MainWindow &m_mainWindow; - QLabel *m_labelAvailable; - QLabel *m_labelNotAvailable; + QPushButton *m_buttonAvailable; + QMenu *m_menuAvailable; + QPushButton *m_buttonNotAvailable; + QMenu *m_menuNotAvailable; QAction *m_action; -- 2.50.1 From 20b14979897aa14af509927c62faf0dbfd793fe8 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Fri, 22 Dec 2017 23:18:42 +0100 Subject: [PATCH 35/78] Added icons to presenceplugin --- plugins/presenceplugin/images/not-present.png | Bin 0 -> 3600 bytes plugins/presenceplugin/images/present.png | Bin 0 -> 4125 bytes .../presenceplugin/presenceplugin_resources.qrc | 2 ++ plugins/presenceplugin/presencewidget.cpp | 4 ++-- 4 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 plugins/presenceplugin/images/not-present.png create mode 100644 plugins/presenceplugin/images/present.png diff --git a/plugins/presenceplugin/images/not-present.png b/plugins/presenceplugin/images/not-present.png new file mode 100644 index 0000000000000000000000000000000000000000..ff9da22ef0f8322adc9ffe22daf376f5f5e3501c GIT binary patch literal 3600 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 s{H|U97v4Yl`YYdlo;wEzGB literal 0 HcmV?d00001 diff --git a/plugins/presenceplugin/images/present.png b/plugins/presenceplugin/images/present.png new file mode 100644 index 0000000000000000000000000000000000000000..21232afc1635828ba7dbaf851e7fb88ccf0e913b GIT binary patch literal 4125 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 YSnOQea)&vMfq{X+)78&qol`;+0EwrQpa1{> literal 0 HcmV?d00001 diff --git a/plugins/presenceplugin/presenceplugin_resources.qrc b/plugins/presenceplugin/presenceplugin_resources.qrc index 9eca07d..0e59021 100644 --- a/plugins/presenceplugin/presenceplugin_resources.qrc +++ b/plugins/presenceplugin/presenceplugin_resources.qrc @@ -1,5 +1,7 @@ + images/not-present.png + images/present.png images/refresh.png diff --git a/plugins/presenceplugin/presencewidget.cpp b/plugins/presenceplugin/presencewidget.cpp index d3c0857..227810c 100644 --- a/plugins/presenceplugin/presencewidget.cpp +++ b/plugins/presenceplugin/presencewidget.cpp @@ -18,12 +18,12 @@ PresenceWidget::PresenceWidget(MainWindow &mainWindow) : { connect(&m_mainWindow, &MainWindow::refreshEverything, this, &PresenceWidget::refresh); - m_buttonAvailable = new QPushButton(this); + m_buttonAvailable = new QPushButton(QIcon(QStringLiteral(":zeiterfassung/plugins/presenceplugin/images/present.png")), QStringLiteral(), this); m_menuAvailable = new QMenu(this); m_buttonAvailable->setMenu(m_menuAvailable); m_mainWindow.statusBar()->addWidget(m_buttonAvailable); - m_buttonNotAvailable = new QPushButton(this); + m_buttonNotAvailable = new QPushButton(QIcon(QStringLiteral(":zeiterfassung/plugins/presenceplugin/images/not-present.png")), QStringLiteral(), this); m_menuNotAvailable = new QMenu(this); m_buttonNotAvailable->setMenu(m_menuNotAvailable); m_mainWindow.statusBar()->addWidget(m_buttonNotAvailable); -- 2.50.1 From a0052019156b85895e3efbb442b3a427a9c08f92 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Fri, 22 Dec 2017 23:18:56 +0100 Subject: [PATCH 36/78] Updated translations --- .../translations/advancedviewplugin_de.ts | 36 +++++++++---------- .../translations/advancedviewplugin_en.ts | 36 +++++++++---------- .../translations/lunchmealplugin_de.ts | 4 +-- .../translations/lunchmealplugin_en.ts | 4 +-- .../translations/presenceplugin_de.ts | 30 +++++++++------- .../translations/presenceplugin_en.ts | 30 +++++++++------- .../translations/profileplugin_de.ts | 4 +-- .../translations/profileplugin_en.ts | 4 +-- .../translations/updaterplugin_de.ts | 2 +- .../translations/updaterplugin_en.ts | 2 +- .../translations/webradioplugin_de.ts | 28 +++++++-------- .../translations/webradioplugin_en.ts | 28 +++++++-------- .../translations/zeiterfassungguilib_de.ts | 30 ++++++++-------- .../translations/zeiterfassungguilib_en.ts | 30 ++++++++-------- 14 files changed, 140 insertions(+), 128 deletions(-) diff --git a/plugins/advancedviewplugin/translations/advancedviewplugin_de.ts b/plugins/advancedviewplugin/translations/advancedviewplugin_de.ts index b68cae8..cc947e2 100644 --- a/plugins/advancedviewplugin/translations/advancedviewplugin_de.ts +++ b/plugins/advancedviewplugin/translations/advancedviewplugin_de.ts @@ -9,82 +9,82 @@ Erweiterte Anzeige - + Create booking Buchung erstellen - + Refresh bookings Buchungen aktualisieren - + Could not create booking! Konnte Buchung nicht erstellen! - + Edit booking Buchung bearbeiten - + Delete booking Buchung löschen - + Could not edit booking! Konnte Buchung nicht bearbeiten! - + Do you really want to delete the booking? Möchten Sie die Buchung wirklich löschen? - + Could not delete booking! Konnte Buchung nicht löschen! - + Create time assignment Kontierung erstellen - + Refresh time assignments Kontierungen aktualisieren - + Could not create time assignment! Konnte Kontierung nicht erstellen! - + Edit time assignment Kontierung bearbeiten - + Delete time assignment Kontierung löschen - + Could not edit time assignment! Konnte Kontierung nicht bearbeiten! - + Do you really want to delete the time assignment? Möchten Sie die Kontierung wirklich löschen? - + Could not delete time assignment! Konnte Kontierung nicht löschen! @@ -193,8 +193,8 @@ Text: - - + + %0 (%1) %0 (%1) diff --git a/plugins/advancedviewplugin/translations/advancedviewplugin_en.ts b/plugins/advancedviewplugin/translations/advancedviewplugin_en.ts index 80acdaf..a20f8f0 100644 --- a/plugins/advancedviewplugin/translations/advancedviewplugin_en.ts +++ b/plugins/advancedviewplugin/translations/advancedviewplugin_en.ts @@ -9,82 +9,82 @@ - + Create booking - + Refresh bookings - + Could not create booking! - + Edit booking - + Delete booking - + Could not edit booking! - + Do you really want to delete the booking? - + Could not delete booking! - + Create time assignment - + Refresh time assignments - + Could not create time assignment! - + Edit time assignment - + Delete time assignment - + Could not edit time assignment! - + Do you really want to delete the time assignment? - + Could not delete time assignment! @@ -193,8 +193,8 @@ - - + + %0 (%1) diff --git a/plugins/lunchmealplugin/translations/lunchmealplugin_de.ts b/plugins/lunchmealplugin/translations/lunchmealplugin_de.ts index 0a13bcc..6ce0111 100644 --- a/plugins/lunchmealplugin/translations/lunchmealplugin_de.ts +++ b/plugins/lunchmealplugin/translations/lunchmealplugin_de.ts @@ -14,12 +14,12 @@ Lade... - + Lunch meal for %0 Mittagsmenü vom %0 - + dd.MM.yyyy dd.MM.yyyy diff --git a/plugins/lunchmealplugin/translations/lunchmealplugin_en.ts b/plugins/lunchmealplugin/translations/lunchmealplugin_en.ts index ac807ce..53dbb95 100644 --- a/plugins/lunchmealplugin/translations/lunchmealplugin_en.ts +++ b/plugins/lunchmealplugin/translations/lunchmealplugin_en.ts @@ -14,12 +14,12 @@ - + Lunch meal for %0 - + dd.MM.yyyy diff --git a/plugins/presenceplugin/translations/presenceplugin_de.ts b/plugins/presenceplugin/translations/presenceplugin_de.ts index 6f9be17..13d204d 100644 --- a/plugins/presenceplugin/translations/presenceplugin_de.ts +++ b/plugins/presenceplugin/translations/presenceplugin_de.ts @@ -4,41 +4,47 @@ PresenceWidget - + Refresh presence Verfügbarkeit aktualisieren - - - + + + %0: %1 %0: %1 - - + + Available Verfügbar - - + + ??? ??? - - + + Not available Nicht verfügbar - - + + Could not get presence status! Konnte Verfügbarkeit nicht laden! + + + + %0 %1 + + diff --git a/plugins/presenceplugin/translations/presenceplugin_en.ts b/plugins/presenceplugin/translations/presenceplugin_en.ts index 924bcb5..ee1ad62 100644 --- a/plugins/presenceplugin/translations/presenceplugin_en.ts +++ b/plugins/presenceplugin/translations/presenceplugin_en.ts @@ -4,41 +4,47 @@ PresenceWidget - + Refresh presence - - - + + + %0: %1 - - + + Available - - + + ??? - - + + Not available - - + + Could not get presence status! + + + + %0 %1 + + diff --git a/plugins/profileplugin/translations/profileplugin_de.ts b/plugins/profileplugin/translations/profileplugin_de.ts index e8cb231..87a46c7 100644 --- a/plugins/profileplugin/translations/profileplugin_de.ts +++ b/plugins/profileplugin/translations/profileplugin_de.ts @@ -94,8 +94,8 @@ Betriebsnr: - - + + dd.MM.yyyy dd.MM.yyyy diff --git a/plugins/profileplugin/translations/profileplugin_en.ts b/plugins/profileplugin/translations/profileplugin_en.ts index d6f19e1..d4a55e7 100644 --- a/plugins/profileplugin/translations/profileplugin_en.ts +++ b/plugins/profileplugin/translations/profileplugin_en.ts @@ -94,8 +94,8 @@ - - + + dd.MM.yyyy diff --git a/plugins/updaterplugin/translations/updaterplugin_de.ts b/plugins/updaterplugin/translations/updaterplugin_de.ts index 0fd56e0..d07c870 100644 --- a/plugins/updaterplugin/translations/updaterplugin_de.ts +++ b/plugins/updaterplugin/translations/updaterplugin_de.ts @@ -20,7 +20,7 @@ Heute nicht mehr anzeigen - + Could not open default webbrowser! Konnte Standard-Browser nicht öffnen! diff --git a/plugins/updaterplugin/translations/updaterplugin_en.ts b/plugins/updaterplugin/translations/updaterplugin_en.ts index fd1099e..0da5318 100644 --- a/plugins/updaterplugin/translations/updaterplugin_en.ts +++ b/plugins/updaterplugin/translations/updaterplugin_en.ts @@ -20,7 +20,7 @@ - + Could not open default webbrowser! diff --git a/plugins/webradioplugin/translations/webradioplugin_de.ts b/plugins/webradioplugin/translations/webradioplugin_de.ts index c21f851..039b33f 100644 --- a/plugins/webradioplugin/translations/webradioplugin_de.ts +++ b/plugins/webradioplugin/translations/webradioplugin_de.ts @@ -24,68 +24,68 @@ Stop - + Stopped Gestoppt - + Playing Wird abgespielt - + Paused Pausiert - - + + Unknown Unbekannt - + Unknown media Unbekanntes Medium - + No media Kein Medium - + Loading media... Lade Medium... - + Loaded media Medium geladen - + Stalled media Medium angehalten - + Buffering media Puffere Medium - + Buffered media Medium gepuffert - + End of media Ende des Mediums - + Invalid media Ungültiges Medium diff --git a/plugins/webradioplugin/translations/webradioplugin_en.ts b/plugins/webradioplugin/translations/webradioplugin_en.ts index e84a249..77f91eb 100644 --- a/plugins/webradioplugin/translations/webradioplugin_en.ts +++ b/plugins/webradioplugin/translations/webradioplugin_en.ts @@ -24,68 +24,68 @@ - + Stopped - + Playing - + Paused - - + + Unknown - + Unknown media - + No media - + Loading media... - + Loaded media - + Stalled media - + Buffering media - + Buffered media - + End of media - + Invalid media diff --git a/zeiterfassungguilib/translations/zeiterfassungguilib_de.ts b/zeiterfassungguilib/translations/zeiterfassungguilib_de.ts index 626b154..c069490 100644 --- a/zeiterfassungguilib/translations/zeiterfassungguilib_de.ts +++ b/zeiterfassungguilib/translations/zeiterfassungguilib_de.ts @@ -39,12 +39,12 @@ Sprache: - + English Englisch - + German Deutsch @@ -213,60 +213,60 @@ Aussehen: - + English Englisch - + German Deutsch - - - + + + Invalid settings! Ungültige Einstellungen! - + Unknown language! Unbekannte Sprache! - + Default Standard - + Unknown theme! Unbekanntes Aussehen! - + Please fill all options with valid values! Bitte füllen Sie alle Felder mit gültigen Werten! - + Could not load theme! Konnte Aussehen nicht laden! - + Theme file does not exist! Aussehen-Datei existiert nicht! - + Restart required! Neustart erforderlich! - + To apply the new settings a restart is required! Um die neuen Einstellungen zu übernehmen, ist ein Neustart erforderlich! diff --git a/zeiterfassungguilib/translations/zeiterfassungguilib_en.ts b/zeiterfassungguilib/translations/zeiterfassungguilib_en.ts index b96835a..77fe691 100644 --- a/zeiterfassungguilib/translations/zeiterfassungguilib_en.ts +++ b/zeiterfassungguilib/translations/zeiterfassungguilib_en.ts @@ -39,12 +39,12 @@ - + English - + German @@ -213,60 +213,60 @@ - + English - + German - - - + + + Invalid settings! - + Unknown language! - + Default - + Unknown theme! - + Please fill all options with valid values! - + Could not load theme! - + Theme file does not exist! - + Restart required! - + To apply the new settings a restart is required! -- 2.50.1 From 59536b69ec10a39e8335f8c60d63b75f81d5b8f3 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Sat, 23 Dec 2017 10:41:01 +0100 Subject: [PATCH 37/78] Removd PresenceWidget blocking the input #50 --- plugins/presenceplugin/presenceplugin.cpp | 5 +- plugins/presenceplugin/presencewidget.cpp | 59 ++++++++++++----------- plugins/presenceplugin/presencewidget.h | 11 ++--- 3 files changed, 39 insertions(+), 36 deletions(-) diff --git a/plugins/presenceplugin/presenceplugin.cpp b/plugins/presenceplugin/presenceplugin.cpp index 3e5e64d..870f593 100644 --- a/plugins/presenceplugin/presenceplugin.cpp +++ b/plugins/presenceplugin/presenceplugin.cpp @@ -4,6 +4,9 @@ #include #include #include +#include + +#include "mainwindow.h" #include "presencewidget.h" @@ -29,5 +32,5 @@ PresencePlugin::PresencePlugin(QObject *parent) : void PresencePlugin::attachTo(MainWindow &mainWindow) { - new PresenceWidget(mainWindow); + mainWindow.statusBar()->addWidget(new PresenceWidget(mainWindow)); } diff --git a/plugins/presenceplugin/presencewidget.cpp b/plugins/presenceplugin/presencewidget.cpp index 227810c..190476d 100644 --- a/plugins/presenceplugin/presencewidget.cpp +++ b/plugins/presenceplugin/presencewidget.cpp @@ -1,6 +1,5 @@ #include "presencewidget.h" -#include #include #include #include @@ -13,23 +12,18 @@ #include "zeiterfassungapi.h" PresenceWidget::PresenceWidget(MainWindow &mainWindow) : - QWidget(&mainWindow), + QPushButton(&mainWindow), m_mainWindow(mainWindow) { connect(&m_mainWindow, &MainWindow::refreshEverything, this, &PresenceWidget::refresh); - m_buttonAvailable = new QPushButton(QIcon(QStringLiteral(":zeiterfassung/plugins/presenceplugin/images/present.png")), QStringLiteral(), this); - m_menuAvailable = new QMenu(this); - m_buttonAvailable->setMenu(m_menuAvailable); - m_mainWindow.statusBar()->addWidget(m_buttonAvailable); + m_menu = new QMenu(this); + setMenu(m_menu); - m_buttonNotAvailable = new QPushButton(QIcon(QStringLiteral(":zeiterfassung/plugins/presenceplugin/images/not-present.png")), QStringLiteral(), this); - m_menuNotAvailable = new QMenu(this); - m_buttonNotAvailable->setMenu(m_menuNotAvailable); - m_mainWindow.statusBar()->addWidget(m_buttonNotAvailable); - - m_action = m_mainWindow.menuView()->addAction(QIcon(QStringLiteral(":zeiterfassung/plugins/presenceplugin/images/refresh.png")), - tr("Refresh presence"), this, &PresenceWidget::refresh); + m_action = new QAction(QIcon(QStringLiteral(":zeiterfassung/plugins/presenceplugin/images/refresh.png")), + tr("Refresh presence"), this); + connect(m_action, &QAction::triggered, this, &PresenceWidget::refresh); + m_mainWindow.menuView()->addAction(m_action); auto timer = new QTimer(this); timer->setInterval(60000); @@ -41,10 +35,8 @@ PresenceWidget::PresenceWidget(MainWindow &mainWindow) : void PresenceWidget::refresh() { - m_buttonAvailable->setText(tr("%0: %1").arg(tr("Available")).arg(tr("???"))); - m_menuAvailable->clear(); - m_buttonNotAvailable->setText(tr("%0: %1").arg(tr("Not available")).arg(tr("???"))); - m_menuNotAvailable->clear(); + setText(tr("%0 available, %1 not available").arg(tr("???")).arg(tr("???"))); + m_menu->clear(); m_action->setEnabled(false); @@ -61,18 +53,31 @@ void PresenceWidget::finished() goto after; } - for(const auto &status : m_reply->presenceStatuses()) { - if(status.presence == QStringLiteral("J")) - m_menuAvailable->addAction(tr("%0 %1").arg(status.firstName).arg(status.lastName)); - else if(status.presence == QStringLiteral("N")) - m_menuNotAvailable->addAction(tr("%0 %1").arg(status.firstName).arg(status.lastName)); - else - qWarning() << "unknown presence" << status.firstName << status.lastName << status.presence; - } + int present = 0, + notPresent = 0; - m_buttonAvailable->setText(tr("%0: %1").arg(tr("Available")).arg(m_menuAvailable->actions().count())); - m_buttonNotAvailable->setText(tr("%0: %1").arg(tr("Not available")).arg(m_menuNotAvailable->actions().count())); + for(const auto &status : m_reply->presenceStatuses()) + { + QIcon icon; + if(status.presence == QStringLiteral("J")) + { + present++; + icon = QIcon(QStringLiteral(":zeiterfassung/plugins/presenceplugin/images/present.png")); + } + else if(status.presence == QStringLiteral("N")) + { + notPresent++; + icon = QIcon(QStringLiteral(":zeiterfassung/plugins/presenceplugin/images/not-present.png")); + } + else + qWarning() << "unknown presence" << status.firstName << status.lastName << status.presence; + + m_menu->addAction(icon, tr("%0 %1").arg(status.firstName).arg(status.lastName)); + } + + setText(tr("%0 available, %1 not available").arg(present).arg(notPresent)); + } after: m_action->setEnabled(true); diff --git a/plugins/presenceplugin/presencewidget.h b/plugins/presenceplugin/presencewidget.h index 15a8ed6..e05b230 100644 --- a/plugins/presenceplugin/presencewidget.h +++ b/plugins/presenceplugin/presencewidget.h @@ -1,16 +1,15 @@ #pragma once -#include +#include #include "replies/getpresencestatusreply.h" -class QPushButton; class QMenu; class QAction; class MainWindow; -class PresenceWidget : public QWidget +class PresenceWidget : public QPushButton { Q_OBJECT @@ -24,11 +23,7 @@ private Q_SLOTS: private: MainWindow &m_mainWindow; - QPushButton *m_buttonAvailable; - QMenu *m_menuAvailable; - QPushButton *m_buttonNotAvailable; - QMenu *m_menuNotAvailable; - + QMenu *m_menu; QAction *m_action; std::unique_ptr m_reply; -- 2.50.1 From 2d9d87844557e7dcbfc060b2159402b8a1d367f6 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Sat, 23 Dec 2017 10:48:56 +0100 Subject: [PATCH 38/78] Removd ReportsWidget blocking the input #50 --- plugins/reportsplugin/reportsplugin.cpp | 5 ++- plugins/reportsplugin/reportswidget.cpp | 45 +++++++++++++------------ plugins/reportsplugin/reportswidget.h | 8 ++--- 3 files changed, 29 insertions(+), 29 deletions(-) diff --git a/plugins/reportsplugin/reportsplugin.cpp b/plugins/reportsplugin/reportsplugin.cpp index ce4dec0..c629073 100644 --- a/plugins/reportsplugin/reportsplugin.cpp +++ b/plugins/reportsplugin/reportsplugin.cpp @@ -4,6 +4,9 @@ #include #include #include +#include + +#include "mainwindow.h" #include "reportswidget.h" @@ -29,5 +32,5 @@ ReportsPlugin::ReportsPlugin(QObject *parent) : void ReportsPlugin::attachTo(MainWindow &mainWindow) { - new ReportsWidget(mainWindow); + mainWindow.statusBar()->addPermanentWidget(new ReportsWidget(mainWindow)); } diff --git a/plugins/reportsplugin/reportswidget.cpp b/plugins/reportsplugin/reportswidget.cpp index 73cfae6..cc34127 100644 --- a/plugins/reportsplugin/reportswidget.cpp +++ b/plugins/reportsplugin/reportswidget.cpp @@ -1,6 +1,5 @@ #include "reportswidget.h" -#include #include #include #include @@ -15,27 +14,25 @@ #include "zeiterfassungapi.h" ReportsWidget::ReportsWidget(MainWindow &mainWindow) : - QWidget(&mainWindow), + QLabel(&mainWindow), m_mainWindow(mainWindow) { connect(&m_mainWindow, &MainWindow::dateChanged, this, &ReportsWidget::dateChanged); connect(&m_mainWindow, &MainWindow::refreshEverything, this, &ReportsWidget::refresh); - m_labelBalance = new QLabel(this); - m_labelBalance->setFrameShape(QFrame::Panel); - m_labelBalance->setFrameShadow(QFrame::Sunken); - m_mainWindow.statusBar()->addPermanentWidget(m_labelBalance); + setFrameShape(QFrame::Panel); + setFrameShadow(QFrame::Sunken); - m_labelHolidays = new QLabel(this); - m_labelHolidays->setFrameShape(QFrame::Panel); - m_labelHolidays->setFrameShadow(QFrame::Sunken); - m_mainWindow.statusBar()->addPermanentWidget(m_labelHolidays); + m_actionRefreshReport = new QAction(QIcon(QStringLiteral(":/zeiterfassung/plugins/reportsplugin/images/refresh.png")), + tr("Refresh report"), this); + connect(m_actionRefreshReport, &QAction::triggered, this, &ReportsWidget::refresh); + m_mainWindow.menuView()->addAction(m_actionRefreshReport); - m_actionRefreshReport = m_mainWindow.menuView()->addAction(QIcon(QStringLiteral(":/zeiterfassung/plugins/reportsplugin/images/refresh.png")), - tr("Refresh report"), this, &ReportsWidget::refresh); + m_actionOpenReport = new QAction(QIcon(QStringLiteral(":/zeiterfassung/plugins/reportsplugin/images/report.png")), + tr("Open report"), this); + connect(m_actionOpenReport, &QAction::triggered, this, &ReportsWidget::openReport); + m_mainWindow.menuTools()->addAction(m_actionOpenReport); - m_actionOpenReport = m_mainWindow.menuTools()->addAction(QIcon(QStringLiteral(":/zeiterfassung/plugins/reportsplugin/images/report.png")), - tr("Open report"), this, &ReportsWidget::openReport); m_mainWindow.toolBar()->addAction(m_actionOpenReport); dateChanged(m_mainWindow.date()); @@ -65,12 +62,11 @@ void ReportsWidget::refresh() return; } + setText(tr("Balance: %0, Holidays: %0").arg(tr("???")).arg(tr("???"))); + m_actionRefreshReport->setEnabled(false); m_actionOpenReport->setEnabled(false); - m_labelBalance->setText(tr("%0: %1").arg(tr("Balance")).arg(tr("???"))); - m_labelHolidays->setText(tr("%0: %1").arg(tr("Holidays")).arg(tr("???"))); - m_reply = m_mainWindow.erfassung().doGetReport(m_mainWindow.userInfo().userId, m_date); connect(m_reply.get(), &ZeiterfassungReply::finished, this, &ReportsWidget::finished); } @@ -87,38 +83,43 @@ void ReportsWidget::finished() { auto content = m_reply->content(); + QString balance; + { static QRegularExpression regex(QStringLiteral("Gleitzeit +([0-9]+\\:[0-9]+\\-?) +([0-9]+\\:[0-9]+\\-?)")); auto match = regex.match(content); if(match.hasMatch()) { - auto balance = match.captured(2); + balance = match.captured(2); if(balance.endsWith(QChar('-'))) { balance.chop(1); balance = QChar('-') % balance; } - m_labelBalance->setText(tr("%0: %1").arg(tr("Balance")).arg(tr("%0h").arg(balance))); } else { - m_labelBalance->setText(tr("%0: %1").arg(tr("Balance")).arg(tr("n/a"))); + balance = tr("n/a"); qWarning() << "balance not found in PDF"; } } + QString holidays; + { static QRegularExpression regex(QStringLiteral("Urlaubsanspruch +(\\-?[0-9]+\\.[0-9]+) +(\\-?[0-9]+\\.[0-9]+)")); auto match = regex.match(content); if(match.hasMatch()) - m_labelHolidays->setText(tr("%0: %1").arg(tr("Holidays")).arg(match.captured(2))); + holidays = match.captured(2); else { - m_labelHolidays->setText(tr("%0: %1").arg(tr("Holidays")).arg(tr("n/a"))); + holidays = tr("n/a"); qWarning() << "holidays not found in PDF"; } } + setText(tr("Balance: %0, Holidays: %0").arg(balance).arg(holidays)); + { QTemporaryFile file(QDir::temp().absoluteFilePath(QStringLiteral("reportXXXXXX.pdf"))); file.setAutoRemove(false); diff --git a/plugins/reportsplugin/reportswidget.h b/plugins/reportsplugin/reportswidget.h index 718a050..46ad7d9 100644 --- a/plugins/reportsplugin/reportswidget.h +++ b/plugins/reportsplugin/reportswidget.h @@ -1,17 +1,16 @@ #pragma once -#include +#include #include #include #include "replies/getreportreply.h" -class QLabel; class QAction; class MainWindow; -class ReportsWidget : public QWidget +class ReportsWidget : public QLabel { Q_OBJECT @@ -27,9 +26,6 @@ private Q_SLOTS: private: MainWindow &m_mainWindow; - QLabel *m_labelBalance; - QLabel *m_labelHolidays; - QAction *m_actionOpenReport; QAction *m_actionRefreshReport; -- 2.50.1 From 2ef13fe0ff73eefe20c52dd61af86937eaf0abaa Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Sat, 23 Dec 2017 10:50:48 +0100 Subject: [PATCH 39/78] Updated translations for presenceplugin and reportsplugin --- .../translations/presenceplugin_de.ts | 36 ++++---------- .../translations/presenceplugin_en.ts | 32 ++++--------- plugins/reportsplugin/reportswidget.cpp | 4 +- .../translations/reportsplugin_de.ts | 48 +++++-------------- .../translations/reportsplugin_en.ts | 46 +++++------------- 5 files changed, 43 insertions(+), 123 deletions(-) diff --git a/plugins/presenceplugin/translations/presenceplugin_de.ts b/plugins/presenceplugin/translations/presenceplugin_de.ts index 13d204d..1d34124 100644 --- a/plugins/presenceplugin/translations/presenceplugin_de.ts +++ b/plugins/presenceplugin/translations/presenceplugin_de.ts @@ -4,47 +4,31 @@ PresenceWidget - + Refresh presence Verfügbarkeit aktualisieren - - - - - %0: %1 - %0: %1 - - - - - Available - Verfügbar - - - - + ??? ??? - - - Not available - Nicht verfügbar + + + %0 available, %1 not available + %0 verfügbar, %1 nicht verfügbar - - + + Could not get presence status! Konnte Verfügbarkeit nicht laden! - - + %0 %1 - + %0 %1 diff --git a/plugins/presenceplugin/translations/presenceplugin_en.ts b/plugins/presenceplugin/translations/presenceplugin_en.ts index ee1ad62..7865d10 100644 --- a/plugins/presenceplugin/translations/presenceplugin_en.ts +++ b/plugins/presenceplugin/translations/presenceplugin_en.ts @@ -4,45 +4,29 @@ PresenceWidget - + Refresh presence - - - - - %0: %1 - - - - - - Available - - - - - + ??? - - - Not available + + + %0 available, %1 not available - - + + Could not get presence status! - - + %0 %1 diff --git a/plugins/reportsplugin/reportswidget.cpp b/plugins/reportsplugin/reportswidget.cpp index cc34127..b5292a1 100644 --- a/plugins/reportsplugin/reportswidget.cpp +++ b/plugins/reportsplugin/reportswidget.cpp @@ -62,7 +62,7 @@ void ReportsWidget::refresh() return; } - setText(tr("Balance: %0, Holidays: %0").arg(tr("???")).arg(tr("???"))); + setText(tr("Balance: %0, Holidays: %1").arg(tr("???")).arg(tr("???"))); m_actionRefreshReport->setEnabled(false); m_actionOpenReport->setEnabled(false); @@ -118,7 +118,7 @@ void ReportsWidget::finished() } } - setText(tr("Balance: %0, Holidays: %0").arg(balance).arg(holidays)); + setText(tr("Balance: %0, Holidays: %1").arg(balance).arg(holidays)); { QTemporaryFile file(QDir::temp().absoluteFilePath(QStringLiteral("reportXXXXXX.pdf"))); diff --git a/plugins/reportsplugin/translations/reportsplugin_de.ts b/plugins/reportsplugin/translations/reportsplugin_de.ts index fdca085..20c4d29 100644 --- a/plugins/reportsplugin/translations/reportsplugin_de.ts +++ b/plugins/reportsplugin/translations/reportsplugin_de.ts @@ -4,68 +4,44 @@ ReportsWidget - + Refresh report Auswertung aktualisieren - + Open report Auswertung öffnen - - - - - - - %0: %1 - %0: %1 - - - - - - Balance - Gleitzeit - - - - + ??? ??? - - - - Holidays - Urlaub + + + Balance: %0, Holidays: %1 + Gleitzeit: %0, Urlaub: %1 - + Could not load report! Konnte Auswertung nicht laden! - - %0h - %0h - - - - + + n/a n/v - + Could not write report! Konnte Auswertung nicht abspeichern! - + Could not launch your default PDF viewer! Konnte Standard-PDF-Viewer nicht öffnen! diff --git a/plugins/reportsplugin/translations/reportsplugin_en.ts b/plugins/reportsplugin/translations/reportsplugin_en.ts index 03ce2d6..0dc51dd 100644 --- a/plugins/reportsplugin/translations/reportsplugin_en.ts +++ b/plugins/reportsplugin/translations/reportsplugin_en.ts @@ -4,68 +4,44 @@ ReportsWidget - + Refresh report - + Open report - - - - - - - %0: %1 - - - - - - - Balance - - - - - + ??? - - - - Holidays + + + Balance: %0, Holidays: %1 - + Could not load report! - - %0h - - - - - + + n/a - + Could not write report! - + Could not launch your default PDF viewer! -- 2.50.1 From 8d9b42ef914214693ebc31fce2590ab3379c896b Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Sat, 23 Dec 2017 11:10:57 +0100 Subject: [PATCH 40/78] Fixed #42 --- plugins/devtoolsplugin/logdialog.h | 2 +- plugins/lunchmealplugin/lunchmealdialog.cpp | 40 ++--------------- plugins/lunchmealplugin/lunchmealdialog.h | 11 ++--- plugins/lunchmealplugin/lunchmealwidget.cpp | 48 ++++++++++++++++++++- plugins/lunchmealplugin/lunchmealwidget.h | 7 +++ 5 files changed, 62 insertions(+), 46 deletions(-) diff --git a/plugins/devtoolsplugin/logdialog.h b/plugins/devtoolsplugin/logdialog.h index 52ae161..8f50e2e 100644 --- a/plugins/devtoolsplugin/logdialog.h +++ b/plugins/devtoolsplugin/logdialog.h @@ -12,7 +12,7 @@ class LogDialog : public QDialog Q_OBJECT public: - explicit LogDialog(QWidget *parent = 0); + explicit LogDialog(QWidget *parent = Q_NULLPTR); ~LogDialog(); void setModel(QAbstractItemModel *model); diff --git a/plugins/lunchmealplugin/lunchmealdialog.cpp b/plugins/lunchmealplugin/lunchmealdialog.cpp index 0693f31..2897bc1 100644 --- a/plugins/lunchmealplugin/lunchmealdialog.cpp +++ b/plugins/lunchmealplugin/lunchmealdialog.cpp @@ -2,17 +2,9 @@ #include "ui_lunchmealdialog.h" #include -#include -#include -#include -#include "stripswidget.h" -#include "mainwindow.h" -#include "zeiterfassungsettings.h" -#include "zeiterfassungapi.h" - -LunchMealDialog::LunchMealDialog(StripsWidget &stripsWidget) : - QDialog(&stripsWidget.mainWindow()), +LunchMealDialog::LunchMealDialog(const QDate &date, const QString &content, QWidget *parent) : + QDialog(parent), ui(new Ui::LunchMealDialog) { ui->setupUi(this); @@ -23,35 +15,11 @@ LunchMealDialog::LunchMealDialog(StripsWidget &stripsWidget) : setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); #endif - ui->labelTitle->setText(tr("Lunch meal for %0").arg(stripsWidget.date().toString(tr("dd.MM.yyyy")))); - - const auto &settings = stripsWidget.mainWindow().settings(); - - auto url = settings.value(QStringLiteral("LunchMealPlugin/url"), - QStringLiteral("https://brunner.ninja/lunch/%0.txt")).toString() - .arg(stripsWidget.date().toString(settings.value(QStringLiteral("LunchMealPlugin/dateFormat"), - QStringLiteral("yyyy-MM-dd")).toString())); - m_reply = std::unique_ptr(stripsWidget.mainWindow().erfassung().manager()->get(QNetworkRequest(QUrl(url)))); - connect(m_reply.get(), &QNetworkReply::finished, this, &LunchMealDialog::finished); + ui->labelTitle->setText(tr("Lunch meal for %0").arg(date.toString(tr("dd.MM.yyyy")))); + ui->labelLunchMeal->setText(content); } LunchMealDialog::~LunchMealDialog() { delete ui; } - -void LunchMealDialog::finished() -{ - if(m_reply->error() != QNetworkReply::NoError) - { - ui->labelLunchMeal->setText(QStringLiteral("%0\n\n%1") - .arg(m_reply->errorString()) - .arg(QString(m_reply->readAll()))); - goto after; - } - - ui->labelLunchMeal->setText(m_reply->readAll()); - - after: - m_reply = Q_NULLPTR; -} diff --git a/plugins/lunchmealplugin/lunchmealdialog.h b/plugins/lunchmealplugin/lunchmealdialog.h index be160cd..c0191ee 100644 --- a/plugins/lunchmealplugin/lunchmealdialog.h +++ b/plugins/lunchmealplugin/lunchmealdialog.h @@ -1,9 +1,8 @@ #pragma once -#include - #include -#include + +class QDate; class StripsWidget; @@ -14,13 +13,9 @@ class LunchMealDialog : public QDialog Q_OBJECT public: - explicit LunchMealDialog(StripsWidget &stripsWidget); + explicit LunchMealDialog(const QDate &date, const QString &content, QWidget *parent = Q_NULLPTR); ~LunchMealDialog(); -private Q_SLOTS: - void finished(); - private: Ui::LunchMealDialog *ui; - std::unique_ptr m_reply; }; diff --git a/plugins/lunchmealplugin/lunchmealwidget.cpp b/plugins/lunchmealplugin/lunchmealwidget.cpp index eacaaf6..f93b4b5 100644 --- a/plugins/lunchmealplugin/lunchmealwidget.cpp +++ b/plugins/lunchmealplugin/lunchmealwidget.cpp @@ -1,9 +1,15 @@ #include "lunchmealwidget.h" #include +#include +#include +#include +#include +#include #include "stripswidget.h" #include "mainwindow.h" +#include "zeiterfassungsettings.h" #include "zeiterfassungapi.h" #include "lunchmealdialog.h" @@ -16,10 +22,50 @@ LunchMealWidget::LunchMealWidget(StripsWidget &stripsWidget) : setText(tr("Lunch meal")); connect(this, &QAbstractButton::pressed, this, &LunchMealWidget::pressedSlot); + + connect(&m_stripsWidget, &StripsWidget::dateChanged, this, &LunchMealWidget::dateChanged); + dateChanged(m_stripsWidget.date()); } void LunchMealWidget::pressedSlot() { - LunchMealDialog dialog(m_stripsWidget); + LunchMealDialog dialog(m_stripsWidget.date(), m_content, &m_stripsWidget.mainWindow()); dialog.exec(); } + +void LunchMealWidget::dateChanged(const QDate &date) +{ + qDebug() << "called"; + + setEnabled(false); + setVisible(false); + + const auto &settings = m_stripsWidget.mainWindow().settings(); + + auto url = settings.value(QStringLiteral("LunchMealPlugin/url"), + QStringLiteral("https://brunner.ninja/lunch/%0.txt")).toString() + .arg(date.toString(settings.value(QStringLiteral("LunchMealPlugin/dateFormat"), QStringLiteral("yyyy-MM-dd")).toString())); + m_reply = std::unique_ptr(m_stripsWidget.mainWindow().erfassung().manager()->get(QNetworkRequest(QUrl(url)))); + connect(m_reply.get(), &QNetworkReply::finished, this, &LunchMealWidget::finished); +} + +void LunchMealWidget::finished() +{ + if(m_reply->error() != QNetworkReply::NoError && + m_reply->error() != QNetworkReply::ContentNotFoundError) + { + QMessageBox::warning(&m_stripsWidget.mainWindow(), tr("Could not load lunch meal!"), + tr("Could not load lunch meal!") % "\n\n" % m_reply->errorString()); + goto after; + } + + if(m_reply->error() == QNetworkReply::NoError) + { + setEnabled(true); + setVisible(true); + m_content = m_reply->readAll(); + } + + after: + m_reply = Q_NULLPTR; +} diff --git a/plugins/lunchmealplugin/lunchmealwidget.h b/plugins/lunchmealplugin/lunchmealwidget.h index 161610c..fb7e3c7 100644 --- a/plugins/lunchmealplugin/lunchmealwidget.h +++ b/plugins/lunchmealplugin/lunchmealwidget.h @@ -1,6 +1,9 @@ #pragma once +#include + #include +#include class StripsWidget; @@ -12,7 +15,11 @@ public: private Q_SLOTS: void pressedSlot(); + void dateChanged(const QDate &date); + void finished(); private: StripsWidget &m_stripsWidget; + std::unique_ptr m_reply; + QString m_content; }; -- 2.50.1 From cbc4e8ccfda3df65ce82ef8d48ff084e2af9eae3 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Sat, 23 Dec 2017 11:14:16 +0100 Subject: [PATCH 41/78] Fixed #51 --- zeiterfassungcorelib/replies/createbookingreply.cpp | 2 +- zeiterfassungcorelib/replies/createtimeassignmentreply.cpp | 2 +- zeiterfassungcorelib/replies/deletebookingreply.cpp | 2 +- zeiterfassungcorelib/replies/deletetimeassignmentreply.cpp | 2 +- zeiterfassungcorelib/replies/getbookingsreply.cpp | 2 +- zeiterfassungcorelib/replies/getpresencestatusreply.cpp | 2 +- zeiterfassungcorelib/replies/getprojectsreply.cpp | 2 +- zeiterfassungcorelib/replies/getreportreply.cpp | 4 ++-- zeiterfassungcorelib/replies/gettimeassignmentsreply.cpp | 2 +- zeiterfassungcorelib/replies/getuserinforeply.cpp | 4 ++-- zeiterfassungcorelib/replies/loginpagereply.cpp | 2 +- zeiterfassungcorelib/replies/loginreply.cpp | 2 +- zeiterfassungcorelib/replies/updatebookingreply.cpp | 2 +- zeiterfassungcorelib/replies/updatetimeassignmentreply.cpp | 2 +- 14 files changed, 16 insertions(+), 16 deletions(-) diff --git a/zeiterfassungcorelib/replies/createbookingreply.cpp b/zeiterfassungcorelib/replies/createbookingreply.cpp index 2083164..0b73d39 100644 --- a/zeiterfassungcorelib/replies/createbookingreply.cpp +++ b/zeiterfassungcorelib/replies/createbookingreply.cpp @@ -12,7 +12,7 @@ void CreateBookingReply::requestFinished() if(m_reply->error() != QNetworkReply::NoError) { setSuccess(false); - setMessage(tr("Request error occured: %0").arg(m_reply->error())); + setMessage(tr("Request error occured: %0").arg(m_reply->errorString())); goto end; } diff --git a/zeiterfassungcorelib/replies/createtimeassignmentreply.cpp b/zeiterfassungcorelib/replies/createtimeassignmentreply.cpp index 51c3a62..68c6e7f 100644 --- a/zeiterfassungcorelib/replies/createtimeassignmentreply.cpp +++ b/zeiterfassungcorelib/replies/createtimeassignmentreply.cpp @@ -23,7 +23,7 @@ void CreateTimeAssignmentReply::requestFinished() if(m_reply->error() != QNetworkReply::NoError) { setSuccess(false); - setMessage(tr("Request error occured: %0").arg(m_reply->error())); + setMessage(tr("Request error occured: %0").arg(m_reply->errorString())); goto end; } diff --git a/zeiterfassungcorelib/replies/deletebookingreply.cpp b/zeiterfassungcorelib/replies/deletebookingreply.cpp index 5549f32..f16916c 100644 --- a/zeiterfassungcorelib/replies/deletebookingreply.cpp +++ b/zeiterfassungcorelib/replies/deletebookingreply.cpp @@ -12,7 +12,7 @@ void DeleteBookingReply::requestFinished() if(m_reply->error() != QNetworkReply::NoError) { setSuccess(false); - setMessage(tr("Request error occured: %0").arg(m_reply->error())); + setMessage(tr("Request error occured: %0").arg(m_reply->errorString())); goto end; } diff --git a/zeiterfassungcorelib/replies/deletetimeassignmentreply.cpp b/zeiterfassungcorelib/replies/deletetimeassignmentreply.cpp index 5c3ea75..2b54ddc 100644 --- a/zeiterfassungcorelib/replies/deletetimeassignmentreply.cpp +++ b/zeiterfassungcorelib/replies/deletetimeassignmentreply.cpp @@ -12,7 +12,7 @@ void DeleteTimeAssignmentReply::requestFinished() if(m_reply->error() != QNetworkReply::NoError) { setSuccess(false); - setMessage(tr("Request error occured: %0").arg(m_reply->error())); + setMessage(tr("Request error occured: %0").arg(m_reply->errorString())); goto end; } diff --git a/zeiterfassungcorelib/replies/getbookingsreply.cpp b/zeiterfassungcorelib/replies/getbookingsreply.cpp index b7941fa..b286cae 100644 --- a/zeiterfassungcorelib/replies/getbookingsreply.cpp +++ b/zeiterfassungcorelib/replies/getbookingsreply.cpp @@ -25,7 +25,7 @@ void GetBookingsReply::requestFinished() if(m_reply->error() != QNetworkReply::NoError) { setSuccess(false); - setMessage(tr("Request error occured: %0").arg(m_reply->error())); + setMessage(tr("Request error occured: %0").arg(m_reply->errorString())); goto end; } diff --git a/zeiterfassungcorelib/replies/getpresencestatusreply.cpp b/zeiterfassungcorelib/replies/getpresencestatusreply.cpp index 5ee41db..8dca891 100644 --- a/zeiterfassungcorelib/replies/getpresencestatusreply.cpp +++ b/zeiterfassungcorelib/replies/getpresencestatusreply.cpp @@ -25,7 +25,7 @@ void GetPresenceStatusReply::requestFinished() if(m_reply->error() != QNetworkReply::NoError) { setSuccess(false); - setMessage(tr("Request error occured: %0").arg(m_reply->error())); + setMessage(tr("Request error occured: %0").arg(m_reply->errorString())); goto end; } diff --git a/zeiterfassungcorelib/replies/getprojectsreply.cpp b/zeiterfassungcorelib/replies/getprojectsreply.cpp index 1800d10..58b47d4 100644 --- a/zeiterfassungcorelib/replies/getprojectsreply.cpp +++ b/zeiterfassungcorelib/replies/getprojectsreply.cpp @@ -25,7 +25,7 @@ void GetProjectsReply::requestFinished() if(m_reply->error() != QNetworkReply::NoError) { setSuccess(false); - setMessage(tr("Request error occured: %0").arg(m_reply->error())); + setMessage(tr("Request error occured: %0").arg(m_reply->errorString())); goto end; } diff --git a/zeiterfassungcorelib/replies/getreportreply.cpp b/zeiterfassungcorelib/replies/getreportreply.cpp index b63f91f..41e004b 100644 --- a/zeiterfassungcorelib/replies/getreportreply.cpp +++ b/zeiterfassungcorelib/replies/getreportreply.cpp @@ -19,7 +19,7 @@ void GetReportReply::request0Finished() if(m_reply->error() != QNetworkReply::NoError) { setSuccess(false); - setMessage(tr("Request error occured: %0").arg(m_reply->error())); + setMessage(tr("Request error occured: %0").arg(m_reply->errorString())); m_reply = Q_NULLPTR; Q_EMIT finished(); return; @@ -37,7 +37,7 @@ void GetReportReply::request1Finished() if(m_reply->error() != QNetworkReply::NoError) { setSuccess(false); - setMessage(tr("Request error occured: %0").arg(m_reply->error())); + setMessage(tr("Request error occured: %0").arg(m_reply->errorString())); goto end; } diff --git a/zeiterfassungcorelib/replies/gettimeassignmentsreply.cpp b/zeiterfassungcorelib/replies/gettimeassignmentsreply.cpp index a4b62ef..2f13cd1 100644 --- a/zeiterfassungcorelib/replies/gettimeassignmentsreply.cpp +++ b/zeiterfassungcorelib/replies/gettimeassignmentsreply.cpp @@ -26,7 +26,7 @@ void GetTimeAssignmentsReply::requestFinished() if(m_reply->error() != QNetworkReply::NoError) { setSuccess(false); - setMessage(tr("Request error occured: %0").arg(m_reply->error())); + setMessage(tr("Request error occured: %0").arg(m_reply->errorString())); goto end; } diff --git a/zeiterfassungcorelib/replies/getuserinforeply.cpp b/zeiterfassungcorelib/replies/getuserinforeply.cpp index 7feb964..e07dc18 100644 --- a/zeiterfassungcorelib/replies/getuserinforeply.cpp +++ b/zeiterfassungcorelib/replies/getuserinforeply.cpp @@ -31,7 +31,7 @@ void GetUserInfoReply::request0Finished() if(m_reply0->error() != QNetworkReply::NoError) { setSuccess(false); - setMessage(tr("Request 0 error occured: %0").arg(m_reply0->error())); + setMessage(tr("Request 0 error occured: %0").arg(m_reply0->errorString())); m_reply1 = Q_NULLPTR; goto end; } @@ -99,7 +99,7 @@ void GetUserInfoReply::request1Finished() if(m_reply1->error() != QNetworkReply::NoError) { setSuccess(false); - setMessage(tr("Request 1 error occured: %0").arg(m_reply0->error())); + setMessage(tr("Request 1 error occured: %0").arg(m_reply0->errorString())); m_reply0 = Q_NULLPTR; goto end; } diff --git a/zeiterfassungcorelib/replies/loginpagereply.cpp b/zeiterfassungcorelib/replies/loginpagereply.cpp index f05f60e..1157581 100644 --- a/zeiterfassungcorelib/replies/loginpagereply.cpp +++ b/zeiterfassungcorelib/replies/loginpagereply.cpp @@ -14,7 +14,7 @@ void LoginPageReply::requestFinished() if(m_reply->error() != QNetworkReply::NoError) { setSuccess(false); - setMessage(tr("Request error occured: %0").arg(m_reply->error())); + setMessage(tr("Request error occured: %0").arg(m_reply->errorString())); goto end; } diff --git a/zeiterfassungcorelib/replies/loginreply.cpp b/zeiterfassungcorelib/replies/loginreply.cpp index a81971b..abc64ca 100644 --- a/zeiterfassungcorelib/replies/loginreply.cpp +++ b/zeiterfassungcorelib/replies/loginreply.cpp @@ -14,7 +14,7 @@ void LoginReply::requestFinished() if(m_reply->error() != QNetworkReply::NoError) { setSuccess(false); - setMessage(tr("Request error occured: %0").arg(m_reply->error())); + setMessage(tr("Request error occured: %0").arg(m_reply->errorString())); goto end; } diff --git a/zeiterfassungcorelib/replies/updatebookingreply.cpp b/zeiterfassungcorelib/replies/updatebookingreply.cpp index 8feb6c9..5386d22 100644 --- a/zeiterfassungcorelib/replies/updatebookingreply.cpp +++ b/zeiterfassungcorelib/replies/updatebookingreply.cpp @@ -18,7 +18,7 @@ void UpdateBookingReply::requestFinished() if(m_reply->error() != QNetworkReply::NoError) { setSuccess(false); - setMessage(tr("Request error occured: %0").arg(m_reply->error())); + setMessage(tr("Request error occured: %0").arg(m_reply->errorString())); goto end; } diff --git a/zeiterfassungcorelib/replies/updatetimeassignmentreply.cpp b/zeiterfassungcorelib/replies/updatetimeassignmentreply.cpp index 6a08740..100981d 100644 --- a/zeiterfassungcorelib/replies/updatetimeassignmentreply.cpp +++ b/zeiterfassungcorelib/replies/updatetimeassignmentreply.cpp @@ -23,7 +23,7 @@ void UpdateTimeAssignmentReply::requestFinished() if(m_reply->error() != QNetworkReply::NoError) { setSuccess(false); - setMessage(tr("Request error occured: %0").arg(m_reply->error())); + setMessage(tr("Request error occured: %0").arg(m_reply->errorString())); goto end; } -- 2.50.1 From ae96fa1d1e801ea2cb45ccef6517535d999d94ba Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Sun, 24 Dec 2017 20:38:57 +0100 Subject: [PATCH 42/78] Updated .travis.yml --- .travis.yml | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/.travis.yml b/.travis.yml index cd1cba7..63aeed6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,21 +3,29 @@ os: - linux dist: trusty compiler: - - clang - gcc before_install: - - sudo add-apt-repository --yes ppa:ubuntu-sdk-team/ppa - - sudo apt update -qq install: - - sudo apt install -qq -y qt5-default qt5-qmake qttools5-dev qttools5-dev-tools before_script: + - if [ ! -d qt5 ] + - then + - git clone --branch=5.10 git://code.qt.io/qt/qt5.git + - pushd qt5 + - perl init-repository --module-subset=qtbase,qtimageformats + - ./configure -static -opensource -nomake examples -nomake tests -confirm-license + - make -j2 + - sudo make install + - popd + - fi + +script: + - which qmake + - which lrelease - mkdir -p build - pushd build - qmake .. -config release - - popd - -script: - - make -C build \ No newline at end of file + - make -j2 + - popd \ No newline at end of file -- 2.50.1 From faa7778685875b4cccf2e756a9aaa60b4254ff5a Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Sun, 24 Dec 2017 20:44:26 +0100 Subject: [PATCH 43/78] Added caching of qt5 in .travis.yml --- .travis.yml | 17 ++++------------- make_qt.sh | 8 ++++++++ 2 files changed, 12 insertions(+), 13 deletions(-) create mode 100644 make_qt.sh diff --git a/.travis.yml b/.travis.yml index 63aeed6..f0d5e8c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,21 +5,12 @@ dist: trusty compiler: - gcc -before_install: - -install: +cache: + directories: + - qt5 before_script: - - if [ ! -d qt5 ] - - then - - git clone --branch=5.10 git://code.qt.io/qt/qt5.git - - pushd qt5 - - perl init-repository --module-subset=qtbase,qtimageformats - - ./configure -static -opensource -nomake examples -nomake tests -confirm-license - - make -j2 - - sudo make install - - popd - - fi + - if [ ! -d qt5 ] ; then source make_qt.sh ; fi script: - which qmake diff --git a/make_qt.sh b/make_qt.sh new file mode 100644 index 0000000..9769b82 --- /dev/null +++ b/make_qt.sh @@ -0,0 +1,8 @@ +#!/bin/bash0 +git clone --branch=5.10 git://code.qt.io/qt/qt5.git +pushd qt5 +perl init-repository --module-subset=qtbase,qtimageformats +./configure -static -opensource -nomake examples -nomake tests -confirm-license +make -j2 +sudo make install +popd \ No newline at end of file -- 2.50.1 From e04ef5cf1a018c8c655482f4c587e2835afefc1d Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Sun, 24 Dec 2017 20:52:11 +0100 Subject: [PATCH 44/78] Removed caching in .travis.yml to avoid error --- .travis.yml | 22 ++++++++++------------ make_qt.sh | 8 -------- 2 files changed, 10 insertions(+), 20 deletions(-) delete mode 100644 make_qt.sh diff --git a/.travis.yml b/.travis.yml index f0d5e8c..ae9175b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,22 +1,20 @@ language: cpp -os: - - linux +os: linux dist: trusty -compiler: - - gcc - -cache: - directories: - - qt5 +compiler: gcc before_script: - - if [ ! -d qt5 ] ; then source make_qt.sh ; fi + - git clone --branch=5.10 git://code.qt.io/qt/qt5.git + - pushd qt5 + - perl init-repository --module-subset=qtbase,qtimageformats + - ./configure -opensource -nomake examples -nomake tests -confirm-license + - make -j2 + - sudo make install + - popd script: - - which qmake - - which lrelease - mkdir -p build - pushd build - - qmake .. -config release + - ../qt5/qtbase/bin/qmake .. -config release - make -j2 - popd \ No newline at end of file diff --git a/make_qt.sh b/make_qt.sh deleted file mode 100644 index 9769b82..0000000 --- a/make_qt.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash0 -git clone --branch=5.10 git://code.qt.io/qt/qt5.git -pushd qt5 -perl init-repository --module-subset=qtbase,qtimageformats -./configure -static -opensource -nomake examples -nomake tests -confirm-license -make -j2 -sudo make install -popd \ No newline at end of file -- 2.50.1 From aca9664316b0524faca98521e59688126ad73415 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Sun, 24 Dec 2017 21:30:19 +0100 Subject: [PATCH 45/78] Added cache again --- .travis.yml | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index ae9175b..b4a4c17 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,11 +3,16 @@ os: linux dist: trusty compiler: gcc +cache: + directories: + - qt5 + before_script: - - git clone --branch=5.10 git://code.qt.io/qt/qt5.git + - mkdir -p qt5 + - if [ ! -d qt5/.git ] ; then rm qt5 -Rf ; git clone --branch=5.10 git://code.qt.io/qt/qt5.git ; fi - pushd qt5 - - perl init-repository --module-subset=qtbase,qtimageformats - - ./configure -opensource -nomake examples -nomake tests -confirm-license + - if [ ! -d qtbase/.git ] ; then perl init-repository --module-subset=qtbase,qtimageformats ; fi + - if [ ! -f config.summaryr ] ; then ./configure -opensource -nomake examples -nomake tests -confirm-license ; fi - make -j2 - sudo make install - popd -- 2.50.1 From 4c7510184540380b071ad567c1d46357b2967e30 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Sun, 24 Dec 2017 21:31:30 +0100 Subject: [PATCH 46/78] Fixed typo in .travis.yml --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index b4a4c17..0dd59f3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,7 +12,7 @@ before_script: - if [ ! -d qt5/.git ] ; then rm qt5 -Rf ; git clone --branch=5.10 git://code.qt.io/qt/qt5.git ; fi - pushd qt5 - if [ ! -d qtbase/.git ] ; then perl init-repository --module-subset=qtbase,qtimageformats ; fi - - if [ ! -f config.summaryr ] ; then ./configure -opensource -nomake examples -nomake tests -confirm-license ; fi + - if [ ! -f config.summary ] ; then ./configure -opensource -confirm-license -nomake examples -nomake tests ; fi - make -j2 - sudo make install - popd -- 2.50.1 From 6f70e8894e19179cf88fbe279395224c79301139 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Sun, 24 Dec 2017 21:39:04 +0100 Subject: [PATCH 47/78] Added qttools to .travis.yml --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 0dd59f3..3f7d43a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,7 +11,7 @@ before_script: - mkdir -p qt5 - if [ ! -d qt5/.git ] ; then rm qt5 -Rf ; git clone --branch=5.10 git://code.qt.io/qt/qt5.git ; fi - pushd qt5 - - if [ ! -d qtbase/.git ] ; then perl init-repository --module-subset=qtbase,qtimageformats ; fi + - if [ ! -d qtbase/.git ] ; then perl init-repository --module-subset=qtbase,qtimageformats,qttools ; fi - if [ ! -f config.summary ] ; then ./configure -opensource -confirm-license -nomake examples -nomake tests ; fi - make -j2 - sudo make install -- 2.50.1 From e72c389de54010302094250539fce3e404cf0ce2 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Sun, 24 Dec 2017 22:29:53 +0100 Subject: [PATCH 48/78] Removed make output to avoid build abort --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 3f7d43a..834d93e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,7 +13,7 @@ before_script: - pushd qt5 - if [ ! -d qtbase/.git ] ; then perl init-repository --module-subset=qtbase,qtimageformats,qttools ; fi - if [ ! -f config.summary ] ; then ./configure -opensource -confirm-license -nomake examples -nomake tests ; fi - - make -j2 + - make -j2 > /dev/null - sudo make install - popd -- 2.50.1 From f2bb3f393f7a028c503acb309d3bd456a13a51df Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Mon, 25 Dec 2017 10:13:32 +0100 Subject: [PATCH 49/78] Added prefix to qt configure --- .travis.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 834d93e..c06434f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,6 @@ language: cpp os: linux +sudo: false dist: trusty compiler: gcc @@ -12,14 +13,13 @@ before_script: - if [ ! -d qt5/.git ] ; then rm qt5 -Rf ; git clone --branch=5.10 git://code.qt.io/qt/qt5.git ; fi - pushd qt5 - if [ ! -d qtbase/.git ] ; then perl init-repository --module-subset=qtbase,qtimageformats,qttools ; fi - - if [ ! -f config.summary ] ; then ./configure -opensource -confirm-license -nomake examples -nomake tests ; fi - - make -j2 > /dev/null - - sudo make install + - if [ ! -f config.summary ] ; then ./configure -prefix `pwd`/build -opensource -confirm-license -nomake examples -nomake tests ; fi + - if [ ! -d build ] ; then make -j2 > /dev/null && make install ; fi - popd script: - mkdir -p build - pushd build - - ../qt5/qtbase/bin/qmake .. -config release + - ../qt5/build/bin/qmake .. -config release - make -j2 - popd \ No newline at end of file -- 2.50.1 From 25814dacbb3976dfa5c3f9fed8e722360b14b072 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Mon, 25 Dec 2017 10:50:40 +0100 Subject: [PATCH 50/78] Added qtmultimedia to qt build --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index c06434f..0d8c2a3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,7 +12,7 @@ before_script: - mkdir -p qt5 - if [ ! -d qt5/.git ] ; then rm qt5 -Rf ; git clone --branch=5.10 git://code.qt.io/qt/qt5.git ; fi - pushd qt5 - - if [ ! -d qtbase/.git ] ; then perl init-repository --module-subset=qtbase,qtimageformats,qttools ; fi + - if [ ! -d qtbase/.git ] ; then perl init-repository --module-subset=qtbase,qtimageformats,qtmultimedia,qttools ; fi - if [ ! -f config.summary ] ; then ./configure -prefix `pwd`/build -opensource -confirm-license -nomake examples -nomake tests ; fi - if [ ! -d build ] ; then make -j2 > /dev/null && make install ; fi - popd -- 2.50.1 From c8671b54171a5024e71247872d49d0f8e8848746 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Tue, 26 Dec 2017 15:55:41 +0100 Subject: [PATCH 51/78] Translations are compiled directly into bin folder and fixed #24 --- lrelease.pri | 4 ++-- .../advancedviewplugin/advancedviewplugin.pro | 15 ++++++--------- plugins/copy_translations.pri | 6 ------ plugins/devtoolsplugin/devtoolsplugin.pro | 15 ++++++--------- plugins/lunchmealplugin/lunchmealplugin.pro | 15 ++++++--------- plugins/presenceplugin/presenceplugin.pro | 15 ++++++--------- plugins/profileplugin/profileplugin.pro | 15 ++++++--------- plugins/reportsplugin/reportsplugin.pro | 15 ++++++--------- plugins/updaterplugin/updaterplugin.pro | 15 ++++++--------- plugins/weatherplugin/weatherplugin.pro | 15 ++++++--------- plugins/webradioplugin/webradioplugin.pro | 15 ++++++--------- zeiterfassung/installs.pri | 16 +++++----------- zeiterfassung/installs_unix.pri | 2 +- zeiterfassung/installs_win32.pri | 8 +++----- zeiterfassung/unix/start.sh | 2 +- zeiterfassung/zeiterfassung.pro | 12 +++++++----- zeiterfassungcorelib/zeiterfassungcorelib.pro | 11 ++++------- zeiterfassungguilib/zeiterfassungguilib.pro | 17 +++++++---------- 18 files changed, 84 insertions(+), 129 deletions(-) delete mode 100644 plugins/copy_translations.pri diff --git a/lrelease.pri b/lrelease.pri index a0ad8fa..a17903f 100644 --- a/lrelease.pri +++ b/lrelease.pri @@ -4,8 +4,8 @@ isEmpty(QMAKE_LRELEASE) { } lrelease.input = TRANSLATIONS -lrelease.output = $${OUT_PWD}/translations/${QMAKE_FILE_BASE}.qm -lrelease.commands = $$QMAKE_LRELEASE ${QMAKE_FILE_IN} -qm ${QMAKE_FILE_OUT} +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/advancedviewplugin/advancedviewplugin.pro b/plugins/advancedviewplugin/advancedviewplugin.pro index 58a31f5..6c89a24 100644 --- a/plugins/advancedviewplugin/advancedviewplugin.pro +++ b/plugins/advancedviewplugin/advancedviewplugin.pro @@ -5,12 +5,14 @@ TEMPLATE = lib CONFIG += shared c++14 -DESTDIR = $${OUT_PWD}/../../bin/plugins/zeiterfassung +PROJECT_ROOT = ../.. -LIBS += -L$$OUT_PWD/../../lib -lzeiterfassungcorelib -lzeiterfassungguilib +DESTDIR = $${OUT_PWD}/$${PROJECT_ROOT}/bin/plugins/zeiterfassung -INCLUDEPATH += $$PWD/../../zeiterfassungcorelib $$PWD/../../zeiterfassungguilib -DEPENDPATH += $$PWD/../../zeiterfassungcorelib $$PWD/../../zeiterfassungguilib +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 @@ -42,8 +44,3 @@ TRANSLATIONS += translations/advancedviewplugin_en.ts \ OTHER_FILES += advancedviewplugin.json include(../../lrelease.pri) - -COMPILED_TRANSLATIONS += $${OUT_PWD}/translations/advancedviewplugin_en.qm \ - $${OUT_PWD}/translations/advancedviewplugin_de.qm - -include(../copy_translations.pri) diff --git a/plugins/copy_translations.pri b/plugins/copy_translations.pri deleted file mode 100644 index 966c686..0000000 --- a/plugins/copy_translations.pri +++ /dev/null @@ -1,6 +0,0 @@ -copy_compiled_translations.input = COMPILED_TRANSLATIONS -copy_compiled_translations.output = $${OUT_PWD}/../../bin/translations/${QMAKE_FILE_BASE}${QMAKE_FILE_EXT} -copy_compiled_translations.commands = $$QMAKE_COPY ${QMAKE_FILE_IN} ${QMAKE_FILE_OUT} -copy_compiled_translations.CONFIG += no_link -QMAKE_EXTRA_COMPILERS += copy_compiled_translations -PRE_TARGETDEPS += compiler_copy_compiled_translations_make_all diff --git a/plugins/devtoolsplugin/devtoolsplugin.pro b/plugins/devtoolsplugin/devtoolsplugin.pro index 17fc54a..83335cb 100644 --- a/plugins/devtoolsplugin/devtoolsplugin.pro +++ b/plugins/devtoolsplugin/devtoolsplugin.pro @@ -5,12 +5,14 @@ TEMPLATE = lib CONFIG += shared c++14 -DESTDIR = $${OUT_PWD}/../../bin/plugins/zeiterfassung +PROJECT_ROOT = ../.. -LIBS += -L$$OUT_PWD/../../lib -lzeiterfassungcorelib -lzeiterfassungguilib +DESTDIR = $${OUT_PWD}/$${PROJECT_ROOT}/bin/plugins/zeiterfassung -INCLUDEPATH += $$PWD/../../zeiterfassungcorelib $$PWD/../../zeiterfassungguilib -DEPENDPATH += $$PWD/../../zeiterfassungcorelib $$PWD/../../zeiterfassungguilib +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 @@ -32,8 +34,3 @@ TRANSLATIONS += translations/devtoolsplugin_en.ts \ OTHER_FILES += devtoolsplugin.json include(../../lrelease.pri) - -COMPILED_TRANSLATIONS += $${OUT_PWD}/translations/devtoolsplugin_en.qm \ - $${OUT_PWD}/translations/devtoolsplugin_de.qm - -include(../copy_translations.pri) diff --git a/plugins/lunchmealplugin/lunchmealplugin.pro b/plugins/lunchmealplugin/lunchmealplugin.pro index 0e74977..daf797d 100644 --- a/plugins/lunchmealplugin/lunchmealplugin.pro +++ b/plugins/lunchmealplugin/lunchmealplugin.pro @@ -5,12 +5,14 @@ TEMPLATE = lib CONFIG += shared c++14 -DESTDIR = $${OUT_PWD}/../../bin/plugins/zeiterfassung +PROJECT_ROOT = ../.. -LIBS += -L$$OUT_PWD/../../lib -lzeiterfassungcorelib -lzeiterfassungguilib +DESTDIR = $${OUT_PWD}/$${PROJECT_ROOT}/bin/plugins/zeiterfassung -INCLUDEPATH += $$PWD/../../zeiterfassungcorelib $$PWD/../../zeiterfassungguilib -DEPENDPATH += $$PWD/../../zeiterfassungcorelib $$PWD/../../zeiterfassungguilib +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 @@ -32,8 +34,3 @@ TRANSLATIONS += translations/lunchmealplugin_en.ts \ OTHER_FILES += lunchmealplugin.json include(../../lrelease.pri) - -COMPILED_TRANSLATIONS += $${OUT_PWD}/translations/lunchmealplugin_en.qm \ - $${OUT_PWD}/translations/lunchmealplugin_de.qm - -include(../copy_translations.pri) diff --git a/plugins/presenceplugin/presenceplugin.pro b/plugins/presenceplugin/presenceplugin.pro index 2411bac..c4b421b 100644 --- a/plugins/presenceplugin/presenceplugin.pro +++ b/plugins/presenceplugin/presenceplugin.pro @@ -5,12 +5,14 @@ TEMPLATE = lib CONFIG += shared c++14 -DESTDIR = $${OUT_PWD}/../../bin/plugins/zeiterfassung +PROJECT_ROOT = ../.. -LIBS += -L$$OUT_PWD/../../lib -lzeiterfassungcorelib -lzeiterfassungguilib +DESTDIR = $${OUT_PWD}/$${PROJECT_ROOT}/bin/plugins/zeiterfassung -INCLUDEPATH += $$PWD/../../zeiterfassungcorelib $$PWD/../../zeiterfassungguilib -DEPENDPATH += $$PWD/../../zeiterfassungcorelib $$PWD/../../zeiterfassungguilib +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 @@ -30,8 +32,3 @@ TRANSLATIONS += translations/presenceplugin_en.ts \ OTHER_FILES += presenceplugin.json include(../../lrelease.pri) - -COMPILED_TRANSLATIONS += $${OUT_PWD}/translations/presenceplugin_en.qm \ - $${OUT_PWD}/translations/presenceplugin_de.qm - -include(../copy_translations.pri) diff --git a/plugins/profileplugin/profileplugin.pro b/plugins/profileplugin/profileplugin.pro index d299e48..42cd1c0 100644 --- a/plugins/profileplugin/profileplugin.pro +++ b/plugins/profileplugin/profileplugin.pro @@ -5,12 +5,14 @@ TEMPLATE = lib CONFIG += shared c++14 -DESTDIR = $${OUT_PWD}/../../bin/plugins/zeiterfassung +PROJECT_ROOT = ../.. -LIBS += -L$$OUT_PWD/../../lib -lzeiterfassungcorelib -lzeiterfassungguilib +DESTDIR = $${OUT_PWD}/$${PROJECT_ROOT}/bin/plugins/zeiterfassung -INCLUDEPATH += $$PWD/../../zeiterfassungcorelib $$PWD/../../zeiterfassungguilib -DEPENDPATH += $$PWD/../../zeiterfassungcorelib $$PWD/../../zeiterfassungguilib +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 @@ -30,8 +32,3 @@ TRANSLATIONS += translations/profileplugin_en.ts \ OTHER_FILES += profileplugin.json include(../../lrelease.pri) - -COMPILED_TRANSLATIONS += $${OUT_PWD}/translations/profileplugin_en.qm \ - $${OUT_PWD}/translations/profileplugin_de.qm - -include(../copy_translations.pri) diff --git a/plugins/reportsplugin/reportsplugin.pro b/plugins/reportsplugin/reportsplugin.pro index 706fb62..002d60b 100644 --- a/plugins/reportsplugin/reportsplugin.pro +++ b/plugins/reportsplugin/reportsplugin.pro @@ -5,12 +5,14 @@ TEMPLATE = lib CONFIG += shared c++14 -DESTDIR = $${OUT_PWD}/../../bin/plugins/zeiterfassung +PROJECT_ROOT = ../.. -LIBS += -L$$OUT_PWD/../../lib -lzeiterfassungcorelib -lzeiterfassungguilib +DESTDIR = $${OUT_PWD}/$${PROJECT_ROOT}/bin/plugins/zeiterfassung -INCLUDEPATH += $$PWD/../../zeiterfassungcorelib $$PWD/../../zeiterfassungguilib -DEPENDPATH += $$PWD/../../zeiterfassungcorelib $$PWD/../../zeiterfassungguilib +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 @@ -30,8 +32,3 @@ TRANSLATIONS += translations/reportsplugin_en.ts \ OTHER_FILES += reportsplugin.json include(../../lrelease.pri) - -COMPILED_TRANSLATIONS += $${OUT_PWD}/translations/reportsplugin_en.qm \ - $${OUT_PWD}/translations/reportsplugin_de.qm - -include(../copy_translations.pri) diff --git a/plugins/updaterplugin/updaterplugin.pro b/plugins/updaterplugin/updaterplugin.pro index 95c635b..ec3d037 100644 --- a/plugins/updaterplugin/updaterplugin.pro +++ b/plugins/updaterplugin/updaterplugin.pro @@ -5,12 +5,14 @@ TEMPLATE = lib CONFIG += shared c++14 -DESTDIR = $${OUT_PWD}/../../bin/plugins/zeiterfassung +PROJECT_ROOT = ../.. -LIBS += -L$$OUT_PWD/../../lib -lzeiterfassungcorelib -lzeiterfassungguilib +DESTDIR = $${OUT_PWD}/$${PROJECT_ROOT}/bin/plugins/zeiterfassung -INCLUDEPATH += $$PWD/../../zeiterfassungcorelib $$PWD/../../zeiterfassungguilib -DEPENDPATH += $$PWD/../../zeiterfassungcorelib $$PWD/../../zeiterfassungguilib +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 @@ -30,8 +32,3 @@ TRANSLATIONS += translations/updaterplugin_en.ts \ OTHER_FILES += updaterplugin.json include(../../lrelease.pri) - -COMPILED_TRANSLATIONS += $${OUT_PWD}/translations/updaterplugin_en.qm \ - $${OUT_PWD}/translations/updaterplugin_de.qm - -include(../copy_translations.pri) diff --git a/plugins/weatherplugin/weatherplugin.pro b/plugins/weatherplugin/weatherplugin.pro index 275eeaa..02016bc 100644 --- a/plugins/weatherplugin/weatherplugin.pro +++ b/plugins/weatherplugin/weatherplugin.pro @@ -5,12 +5,14 @@ TEMPLATE = lib CONFIG += shared c++14 -DESTDIR = $${OUT_PWD}/../../bin/plugins/zeiterfassung +PROJECT_ROOT = ../.. -LIBS += -L$$OUT_PWD/../../lib -lzeiterfassungcorelib -lzeiterfassungguilib +DESTDIR = $${OUT_PWD}/$${PROJECT_ROOT}/bin/plugins/zeiterfassung -INCLUDEPATH += $$PWD/../../zeiterfassungcorelib $$PWD/../../zeiterfassungguilib -DEPENDPATH += $$PWD/../../zeiterfassungcorelib $$PWD/../../zeiterfassungguilib +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 @@ -30,8 +32,3 @@ TRANSLATIONS += translations/weatherplugin_en.ts \ OTHER_FILES += weatherplugin.json include(../../lrelease.pri) - -COMPILED_TRANSLATIONS += $${OUT_PWD}/translations/weatherplugin_en.qm \ - $${OUT_PWD}/translations/weatherplugin_de.qm - -include(../copy_translations.pri) diff --git a/plugins/webradioplugin/webradioplugin.pro b/plugins/webradioplugin/webradioplugin.pro index 28eb042..1024a95 100644 --- a/plugins/webradioplugin/webradioplugin.pro +++ b/plugins/webradioplugin/webradioplugin.pro @@ -5,12 +5,14 @@ TEMPLATE = lib CONFIG += shared c++14 -DESTDIR = $${OUT_PWD}/../../bin/plugins/zeiterfassung +PROJECT_ROOT = ../.. -LIBS += -L$$OUT_PWD/../../lib -lzeiterfassungcorelib -lzeiterfassungguilib +DESTDIR = $${OUT_PWD}/$${PROJECT_ROOT}/bin/plugins/zeiterfassung -INCLUDEPATH += $$PWD/../../zeiterfassungcorelib $$PWD/../../zeiterfassungguilib -DEPENDPATH += $$PWD/../../zeiterfassungcorelib $$PWD/../../zeiterfassungguilib +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 @@ -30,8 +32,3 @@ TRANSLATIONS += translations/webradioplugin_en.ts \ OTHER_FILES += webradioplugin.json include(../../lrelease.pri) - -COMPILED_TRANSLATIONS += $${OUT_PWD}/translations/webradioplugin_en.qm \ - $${OUT_PWD}/translations/webradioplugin_de.qm - -include(../copy_translations.pri) diff --git a/zeiterfassung/installs.pri b/zeiterfassung/installs.pri index 6d9adc7..cf6320d 100644 --- a/zeiterfassung/installs.pri +++ b/zeiterfassung/installs.pri @@ -9,17 +9,11 @@ COMPILED_TRANSLATIONS += $$[QT_INSTALL_TRANSLATIONS]/qt_en.qm \ $$[QT_INSTALL_TRANSLATIONS]/qtmultimedia_de.qm \ $$[QT_INSTALL_TRANSLATIONS]/qtquick1_de.qm \ $$[QT_INSTALL_TRANSLATIONS]/qtscript_de.qm \ - $$[QT_INSTALL_TRANSLATIONS]/qtxmlpatterns_de.qm \ - $${OUT_PWD}/translations/zeiterfassung_en.qm \ - $${OUT_PWD}/translations/zeiterfassung_de.qm \ - $${OUT_PWD}/../zeiterfassungcorelib/translations/zeiterfassungcorelib_en.qm \ - $${OUT_PWD}/../zeiterfassungcorelib/translations/zeiterfassungcorelib_de.qm \ - $${OUT_PWD}/../zeiterfassungguilib/translations/zeiterfassungguilib_en.qm \ - $${OUT_PWD}/../zeiterfassungguilib/translations/zeiterfassungguilib_de.qm + $$[QT_INSTALL_TRANSLATIONS]/qtxmlpatterns_de.qm copy_compiled_translations.input = COMPILED_TRANSLATIONS copy_compiled_translations.output = $${DESTDIR}/translations/${QMAKE_FILE_BASE}${QMAKE_FILE_EXT} -copy_compiled_translations.commands = $$QMAKE_COPY ${QMAKE_FILE_IN} ${QMAKE_FILE_OUT} +copy_compiled_translations.commands = $${QMAKE_COPY} ${QMAKE_FILE_IN} ${QMAKE_FILE_OUT} copy_compiled_translations.CONFIG += no_link QMAKE_EXTRA_COMPILERS += copy_compiled_translations PRE_TARGETDEPS += compiler_copy_compiled_translations_make_all @@ -28,7 +22,7 @@ THEMES += themes/dark_theme.qss copy_themes.input = THEMES copy_themes.output = $${DESTDIR}/themes/${QMAKE_FILE_BASE}${QMAKE_FILE_EXT} -copy_themes.commands = $$QMAKE_COPY ${QMAKE_FILE_IN} ${QMAKE_FILE_OUT} +copy_themes.commands = $${QMAKE_COPY} ${QMAKE_FILE_IN} ${QMAKE_FILE_OUT} copy_themes.CONFIG += no_link QMAKE_EXTRA_COMPILERS += copy_themes PRE_TARGETDEPS += compiler_copy_themes_make_all @@ -76,7 +70,7 @@ DARK_THEME_RESOURCES += themes/dark_theme/checkbox_indeterminate_disabled.png \ copy_dark_theme_resouces.input = DARK_THEME_RESOURCES copy_dark_theme_resouces.output = $${DESTDIR}/themes/dark_theme/${QMAKE_FILE_BASE}${QMAKE_FILE_EXT} -copy_dark_theme_resouces.commands = $$QMAKE_COPY ${QMAKE_FILE_IN} ${QMAKE_FILE_OUT} +copy_dark_theme_resouces.commands = $${QMAKE_COPY} ${QMAKE_FILE_IN} ${QMAKE_FILE_OUT} copy_dark_theme_resouces.CONFIG += no_link QMAKE_EXTRA_COMPILERS += copy_dark_theme_resouces PRE_TARGETDEPS += compiler_copy_dark_theme_resouces_make_all @@ -87,7 +81,7 @@ STRIPLAYOUTS += strips/bookingstartstrip.ui \ copy_striplayouts.input = STRIPLAYOUTS copy_striplayouts.output = $${DESTDIR}/strips/${QMAKE_FILE_BASE}${QMAKE_FILE_EXT} -copy_striplayouts.commands = $$QMAKE_COPY ${QMAKE_FILE_IN} ${QMAKE_FILE_OUT} +copy_striplayouts.commands = $${QMAKE_COPY} ${QMAKE_FILE_IN} ${QMAKE_FILE_OUT} copy_striplayouts.CONFIG += no_link QMAKE_EXTRA_COMPILERS += copy_striplayouts PRE_TARGETDEPS += compiler_copy_striplayouts_make_all diff --git a/zeiterfassung/installs_unix.pri b/zeiterfassung/installs_unix.pri index c8dd1f2..6a4db79 100644 --- a/zeiterfassung/installs_unix.pri +++ b/zeiterfassung/installs_unix.pri @@ -2,7 +2,7 @@ SCRIPTS += unix/start.sh copy_scripts.input = SCRIPTS copy_scripts.output = $${DESTDIR}/${QMAKE_FILE_BASE}${QMAKE_FILE_EXT} -copy_scripts.commands = $$QMAKE_COPY ${QMAKE_FILE_IN} ${QMAKE_FILE_OUT} +copy_scripts.commands = $${QMAKE_COPY} ${QMAKE_FILE_IN} ${QMAKE_FILE_OUT} copy_scripts.CONFIG += no_link QMAKE_EXTRA_COMPILERS += copy_scripts PRE_TARGETDEPS += compiler_copy_scripts_make_all diff --git a/zeiterfassung/installs_win32.pri b/zeiterfassung/installs_win32.pri index 4609981..00fd871 100644 --- a/zeiterfassung/installs_win32.pri +++ b/zeiterfassung/installs_win32.pri @@ -1,8 +1,6 @@ CONFIG(debug, release|debug): DEBUG_SIGN = d LIBRARIES += win32/Qt.conf \ - $$OUT_PWD/../lib/zeiterfassungcorelib.dll \ - $$OUT_PWD/../lib/zeiterfassungguilib.dll \ $$[QT_INSTALL_BINS]/Qt5Core$${DEBUG_SIGN}.dll \ $$[QT_INSTALL_BINS]/Qt5Gui$${DEBUG_SIGN}.dll \ $$[QT_INSTALL_BINS]/Qt5Network$${DEBUG_SIGN}.dll \ @@ -13,7 +11,7 @@ LIBRARIES += win32/Qt.conf \ copy_libraries.input = LIBRARIES copy_libraries.output = $${DESTDIR}/${QMAKE_FILE_BASE}${QMAKE_FILE_EXT} -copy_libraries.commands = $$QMAKE_COPY ${QMAKE_FILE_IN} ${QMAKE_FILE_OUT} +copy_libraries.commands = $${QMAKE_COPY} ${QMAKE_FILE_IN} ${QMAKE_FILE_OUT} copy_libraries.CONFIG += no_link QMAKE_EXTRA_COMPILERS += copy_libraries PRE_TARGETDEPS += compiler_copy_libraries_make_all @@ -30,7 +28,7 @@ IMAGE_FORMATS += $$[QT_INSTALL_PLUGINS]/imageformats/qgif$${DEBUG_SIGN}.dll \ copy_image_formats.input = IMAGE_FORMATS copy_image_formats.output = $${DESTDIR}/plugins/imageformats/${QMAKE_FILE_BASE}${QMAKE_FILE_EXT} -copy_image_formats.commands = $$QMAKE_COPY ${QMAKE_FILE_IN} ${QMAKE_FILE_OUT} +copy_image_formats.commands = $${QMAKE_COPY} ${QMAKE_FILE_IN} ${QMAKE_FILE_OUT} copy_image_formats.CONFIG += no_link QMAKE_EXTRA_COMPILERS += copy_image_formats PRE_TARGETDEPS += compiler_copy_image_formats_make_all @@ -39,7 +37,7 @@ PLATFORMS += $$[QT_INSTALL_PLUGINS]/platforms/qwindows$${DEBUG_SIGN}.dll copy_platforms.input = PLATFORMS copy_platforms.output = $${DESTDIR}/plugins/platforms/${QMAKE_FILE_BASE}${QMAKE_FILE_EXT} -copy_platforms.commands = $$QMAKE_COPY ${QMAKE_FILE_IN} ${QMAKE_FILE_OUT} +copy_platforms.commands = $${QMAKE_COPY} ${QMAKE_FILE_IN} ${QMAKE_FILE_OUT} copy_platforms.CONFIG += no_link QMAKE_EXTRA_COMPILERS += copy_platforms PRE_TARGETDEPS += compiler_copy_platforms_make_all diff --git a/zeiterfassung/unix/start.sh b/zeiterfassung/unix/start.sh index b3c1ca6..29ab530 100755 --- a/zeiterfassung/unix/start.sh +++ b/zeiterfassung/unix/start.sh @@ -1,3 +1,3 @@ #!/bin/bash cd "${0%/*}" -LD_LIBRARY_PATH=../lib ./zeiterfassung +LD_LIBRARY_PATH=. ./zeiterfassung diff --git a/zeiterfassung/zeiterfassung.pro b/zeiterfassung/zeiterfassung.pro index 82626d1..1b9a5ae 100755 --- a/zeiterfassung/zeiterfassung.pro +++ b/zeiterfassung/zeiterfassung.pro @@ -6,12 +6,14 @@ TEMPLATE = app CONFIG += c++14 CONFIG -= app_bundle -DESTDIR = $${OUT_PWD}/../bin +PROJECT_ROOT = .. -LIBS += -L$$OUT_PWD/../lib -lzeiterfassungcorelib -lzeiterfassungguilib +DESTDIR = $${OUT_PWD}/$${PROJECT_ROOT}/bin -INCLUDEPATH += $$PWD/../zeiterfassungcorelib $$PWD/../zeiterfassungguilib -DEPENDPATH += $$PWD/../zeiterfassungcorelib $$PWD/../zeiterfassungguilib +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 @@ -30,7 +32,7 @@ RESOURCES += zeiterfassung_resources.qrc TRANSLATIONS += translations/zeiterfassung_en.ts \ translations/zeiterfassung_de.ts -include(../lrelease.pri) +include($${PROJECT_ROOT}/lrelease.pri) include(installs.pri) unix: include(installs_unix.pri) diff --git a/zeiterfassungcorelib/zeiterfassungcorelib.pro b/zeiterfassungcorelib/zeiterfassungcorelib.pro index 079d25e..8c0d06f 100644 --- a/zeiterfassungcorelib/zeiterfassungcorelib.pro +++ b/zeiterfassungcorelib/zeiterfassungcorelib.pro @@ -6,7 +6,9 @@ TEMPLATE = lib CONFIG += c++14 -DESTDIR = $${OUT_PWD}/../lib +PROJECT_ROOT = .. + +DESTDIR = $${OUT_PWD}/$${PROJECT_ROOT}/bin DEFINES += QT_DEPRECATED_WARNINGS QT_DISABLE_DEPRECATED_BEFORE=0x060000 QT_MESSAGELOGCONTEXT DEFINES += ZEITERFASSUNGCORELIB_LIBRARY @@ -58,9 +60,4 @@ RESOURCES += TRANSLATIONS += translations/zeiterfassungcorelib_en.ts \ translations/zeiterfassungcorelib_de.ts -include(../lrelease.pri) - -# unix { -# target.path = /usr/lib -# INSTALLS += target -# } +include($${PROJECT_ROOT}/lrelease.pri) diff --git a/zeiterfassungguilib/zeiterfassungguilib.pro b/zeiterfassungguilib/zeiterfassungguilib.pro index 2936ed3..363bf9d 100644 --- a/zeiterfassungguilib/zeiterfassungguilib.pro +++ b/zeiterfassungguilib/zeiterfassungguilib.pro @@ -5,12 +5,14 @@ TEMPLATE = lib CONFIG += c++14 -DESTDIR = $${OUT_PWD}/../lib +PROJECT_ROOT = .. -LIBS += -L$$OUT_PWD/../lib -lzeiterfassungcorelib +DESTDIR = $${OUT_PWD}/$${PROJECT_ROOT}/bin -INCLUDEPATH += $$PWD/../zeiterfassungcorelib -DEPENDPATH += $$PWD/../zeiterfassungcorelib +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 @@ -42,9 +44,4 @@ RESOURCES += zeiterfassungguilib_resources.qrc TRANSLATIONS += translations/zeiterfassungguilib_en.ts \ translations/zeiterfassungguilib_de.ts -include(../lrelease.pri) - -# unix { -# target.path = /usr/lib -# INSTALLS += target -# } +include($${PROJECT_ROOT}/lrelease.pri) -- 2.50.1 From d5378377c55f96d55def53dda66c5624c5ecc2e4 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Tue, 26 Dec 2017 16:16:28 +0100 Subject: [PATCH 52/78] Moved copying of qt translations into separate install step --- zeiterfassung.pro => QtZeiterfassung.pro | 3 ++ installs.pri | 14 ++++++ installs_win32.pri | 28 ++++++++++++ {zeiterfassung/win32 => win32}/Qt.conf | 0 zeiterfassung/installs.pri | 20 --------- zeiterfassung/installs_unix.pri | 11 ++--- zeiterfassung/installs_win32.pri | 43 ------------------- .../unix/{start.sh => zeiterfassung.sh} | 0 zeiterfassung/zeiterfassung.pro | 1 - 9 files changed, 48 insertions(+), 72 deletions(-) rename zeiterfassung.pro => QtZeiterfassung.pro (83%) create mode 100644 installs.pri create mode 100644 installs_win32.pri rename {zeiterfassung/win32 => win32}/Qt.conf (100%) delete mode 100644 zeiterfassung/installs_win32.pri rename zeiterfassung/unix/{start.sh => zeiterfassung.sh} (100%) diff --git a/zeiterfassung.pro b/QtZeiterfassung.pro similarity index 83% rename from zeiterfassung.pro rename to QtZeiterfassung.pro index fed8288..17025d9 100644 --- a/zeiterfassung.pro +++ b/QtZeiterfassung.pro @@ -8,3 +8,6 @@ SUBDIRS += plugins \ plugins.depends += zeiterfassungguilib zeiterfassung.depends += zeiterfassungcorelib zeiterfassungguilib zeiterfassungguilib.depends += zeiterfassungcorelib + +include(installs.pri) +win32: include(installs_win32.pri) diff --git a/installs.pri b/installs.pri new file mode 100644 index 0000000..3a7ab5d --- /dev/null +++ b/installs.pri @@ -0,0 +1,14 @@ +qtTranslationsInstalls.path = $${OUT_PWD}/bin/translations +qtTranslationsInstalls.files = $$[QT_INSTALL_TRANSLATIONS]/qt_en.qm \ + $$[QT_INSTALL_TRANSLATIONS]/qtbase_en.qm \ + $$[QT_INSTALL_TRANSLATIONS]/qtmultimedia_en.qm \ + $$[QT_INSTALL_TRANSLATIONS]/qtquick1_en.qm \ + $$[QT_INSTALL_TRANSLATIONS]/qtscript_en.qm \ + $$[QT_INSTALL_TRANSLATIONS]/qtxmlpatterns_en.qm \ + $$[QT_INSTALL_TRANSLATIONS]/qt_de.qm \ + $$[QT_INSTALL_TRANSLATIONS]/qtbase_de.qm \ + $$[QT_INSTALL_TRANSLATIONS]/qtmultimedia_de.qm \ + $$[QT_INSTALL_TRANSLATIONS]/qtquick1_de.qm \ + $$[QT_INSTALL_TRANSLATIONS]/qtscript_de.qm \ + $$[QT_INSTALL_TRANSLATIONS]/qtxmlpatterns_de.qm +INSTALLS += qtTranslationsInstalls diff --git a/installs_win32.pri b/installs_win32.pri new file mode 100644 index 0000000..65ce4a7 --- /dev/null +++ b/installs_win32.pri @@ -0,0 +1,28 @@ +CONFIG(debug, release|debug): DEBUG_SIGN = d + +qtLibsInstall.path = $${OUT_PWD}/bin +qtLibsInstall.files = win32/Qt.conf \ + $$[QT_INSTALL_BINS]/Qt5Core$${DEBUG_SIGN}.dll \ + $$[QT_INSTALL_BINS]/Qt5Gui$${DEBUG_SIGN}.dll \ + $$[QT_INSTALL_BINS]/Qt5Network$${DEBUG_SIGN}.dll \ + $$[QT_INSTALL_BINS]/Qt5Widgets$${DEBUG_SIGN}.dll \ + $$[QT_INSTALL_BINS]/libgcc_s_dw2-1.dll \ + $$[QT_INSTALL_BINS]/libstdc++-6.dll \ + $$[QT_INSTALL_BINS]/libwinpthread-1.dll +INSTALLS += qtLibsInstall + +qtImageFormats.path = $${OUT_PWD}/bin/plugins/imageformats +qtImageFormats.files = $$[QT_INSTALL_PLUGINS]/imageformats/qgif$${DEBUG_SIGN}.dll \ + $$[QT_INSTALL_PLUGINS]/imageformats/qicns$${DEBUG_SIGN}.dll \ + $$[QT_INSTALL_PLUGINS]/imageformats/qico$${DEBUG_SIGN}.dll \ + $$[QT_INSTALL_PLUGINS]/imageformats/qjpeg$${DEBUG_SIGN}.dll \ + $$[QT_INSTALL_PLUGINS]/imageformats/qsvg$${DEBUG_SIGN}.dll \ + $$[QT_INSTALL_PLUGINS]/imageformats/qtga$${DEBUG_SIGN}.dll \ + $$[QT_INSTALL_PLUGINS]/imageformats/qtiff$${DEBUG_SIGN}.dll \ + $$[QT_INSTALL_PLUGINS]/imageformats/qwbmp$${DEBUG_SIGN}.dll \ + $$[QT_INSTALL_PLUGINS]/imageformats/qwebp$${DEBUG_SIGN}.dll +INSTALLS += qtImageFormats + +qtPlatformsInstall.path = $${OUT_PWD}/bin/plugins/platforms +qtPlatformsInstall.files = $$[QT_INSTALL_PLUGINS]/platforms/qwindows$${DEBUG_SIGN}.dll +INSTALLS += qtPlatformsInstall diff --git a/zeiterfassung/win32/Qt.conf b/win32/Qt.conf similarity index 100% rename from zeiterfassung/win32/Qt.conf rename to win32/Qt.conf diff --git a/zeiterfassung/installs.pri b/zeiterfassung/installs.pri index cf6320d..ec42827 100644 --- a/zeiterfassung/installs.pri +++ b/zeiterfassung/installs.pri @@ -1,23 +1,3 @@ -COMPILED_TRANSLATIONS += $$[QT_INSTALL_TRANSLATIONS]/qt_en.qm \ - $$[QT_INSTALL_TRANSLATIONS]/qtbase_en.qm \ - $$[QT_INSTALL_TRANSLATIONS]/qtmultimedia_en.qm \ - $$[QT_INSTALL_TRANSLATIONS]/qtquick1_en.qm \ - $$[QT_INSTALL_TRANSLATIONS]/qtscript_en.qm \ - $$[QT_INSTALL_TRANSLATIONS]/qtxmlpatterns_en.qm \ - $$[QT_INSTALL_TRANSLATIONS]/qt_de.qm \ - $$[QT_INSTALL_TRANSLATIONS]/qtbase_de.qm \ - $$[QT_INSTALL_TRANSLATIONS]/qtmultimedia_de.qm \ - $$[QT_INSTALL_TRANSLATIONS]/qtquick1_de.qm \ - $$[QT_INSTALL_TRANSLATIONS]/qtscript_de.qm \ - $$[QT_INSTALL_TRANSLATIONS]/qtxmlpatterns_de.qm - -copy_compiled_translations.input = COMPILED_TRANSLATIONS -copy_compiled_translations.output = $${DESTDIR}/translations/${QMAKE_FILE_BASE}${QMAKE_FILE_EXT} -copy_compiled_translations.commands = $${QMAKE_COPY} ${QMAKE_FILE_IN} ${QMAKE_FILE_OUT} -copy_compiled_translations.CONFIG += no_link -QMAKE_EXTRA_COMPILERS += copy_compiled_translations -PRE_TARGETDEPS += compiler_copy_compiled_translations_make_all - THEMES += themes/dark_theme.qss copy_themes.input = THEMES diff --git a/zeiterfassung/installs_unix.pri b/zeiterfassung/installs_unix.pri index 6a4db79..26f2133 100644 --- a/zeiterfassung/installs_unix.pri +++ b/zeiterfassung/installs_unix.pri @@ -1,8 +1,3 @@ -SCRIPTS += unix/start.sh - -copy_scripts.input = SCRIPTS -copy_scripts.output = $${DESTDIR}/${QMAKE_FILE_BASE}${QMAKE_FILE_EXT} -copy_scripts.commands = $${QMAKE_COPY} ${QMAKE_FILE_IN} ${QMAKE_FILE_OUT} -copy_scripts.CONFIG += no_link -QMAKE_EXTRA_COMPILERS += copy_scripts -PRE_TARGETDEPS += compiler_copy_scripts_make_all +scriptsInstall.path = $${DESTDIR} +scriptsInstall.files = unix/zeiterfassung.sh +INSTALLS += scriptsInstall diff --git a/zeiterfassung/installs_win32.pri b/zeiterfassung/installs_win32.pri deleted file mode 100644 index 00fd871..0000000 --- a/zeiterfassung/installs_win32.pri +++ /dev/null @@ -1,43 +0,0 @@ -CONFIG(debug, release|debug): DEBUG_SIGN = d - -LIBRARIES += win32/Qt.conf \ - $$[QT_INSTALL_BINS]/Qt5Core$${DEBUG_SIGN}.dll \ - $$[QT_INSTALL_BINS]/Qt5Gui$${DEBUG_SIGN}.dll \ - $$[QT_INSTALL_BINS]/Qt5Network$${DEBUG_SIGN}.dll \ - $$[QT_INSTALL_BINS]/Qt5Widgets$${DEBUG_SIGN}.dll \ - $$[QT_INSTALL_BINS]/libgcc_s_dw2-1.dll \ - $$[QT_INSTALL_BINS]/libstdc++-6.dll \ - $$[QT_INSTALL_BINS]/libwinpthread-1.dll - -copy_libraries.input = LIBRARIES -copy_libraries.output = $${DESTDIR}/${QMAKE_FILE_BASE}${QMAKE_FILE_EXT} -copy_libraries.commands = $${QMAKE_COPY} ${QMAKE_FILE_IN} ${QMAKE_FILE_OUT} -copy_libraries.CONFIG += no_link -QMAKE_EXTRA_COMPILERS += copy_libraries -PRE_TARGETDEPS += compiler_copy_libraries_make_all - -IMAGE_FORMATS += $$[QT_INSTALL_PLUGINS]/imageformats/qgif$${DEBUG_SIGN}.dll \ - $$[QT_INSTALL_PLUGINS]/imageformats/qicns$${DEBUG_SIGN}.dll \ - $$[QT_INSTALL_PLUGINS]/imageformats/qico$${DEBUG_SIGN}.dll \ - $$[QT_INSTALL_PLUGINS]/imageformats/qjpeg$${DEBUG_SIGN}.dll \ - $$[QT_INSTALL_PLUGINS]/imageformats/qsvg$${DEBUG_SIGN}.dll \ - $$[QT_INSTALL_PLUGINS]/imageformats/qtga$${DEBUG_SIGN}.dll \ - $$[QT_INSTALL_PLUGINS]/imageformats/qtiff$${DEBUG_SIGN}.dll \ - $$[QT_INSTALL_PLUGINS]/imageformats/qwbmp$${DEBUG_SIGN}.dll \ - $$[QT_INSTALL_PLUGINS]/imageformats/qwebp$${DEBUG_SIGN}.dll - -copy_image_formats.input = IMAGE_FORMATS -copy_image_formats.output = $${DESTDIR}/plugins/imageformats/${QMAKE_FILE_BASE}${QMAKE_FILE_EXT} -copy_image_formats.commands = $${QMAKE_COPY} ${QMAKE_FILE_IN} ${QMAKE_FILE_OUT} -copy_image_formats.CONFIG += no_link -QMAKE_EXTRA_COMPILERS += copy_image_formats -PRE_TARGETDEPS += compiler_copy_image_formats_make_all - -PLATFORMS += $$[QT_INSTALL_PLUGINS]/platforms/qwindows$${DEBUG_SIGN}.dll - -copy_platforms.input = PLATFORMS -copy_platforms.output = $${DESTDIR}/plugins/platforms/${QMAKE_FILE_BASE}${QMAKE_FILE_EXT} -copy_platforms.commands = $${QMAKE_COPY} ${QMAKE_FILE_IN} ${QMAKE_FILE_OUT} -copy_platforms.CONFIG += no_link -QMAKE_EXTRA_COMPILERS += copy_platforms -PRE_TARGETDEPS += compiler_copy_platforms_make_all diff --git a/zeiterfassung/unix/start.sh b/zeiterfassung/unix/zeiterfassung.sh similarity index 100% rename from zeiterfassung/unix/start.sh rename to zeiterfassung/unix/zeiterfassung.sh diff --git a/zeiterfassung/zeiterfassung.pro b/zeiterfassung/zeiterfassung.pro index 1b9a5ae..506e989 100755 --- a/zeiterfassung/zeiterfassung.pro +++ b/zeiterfassung/zeiterfassung.pro @@ -36,4 +36,3 @@ include($${PROJECT_ROOT}/lrelease.pri) include(installs.pri) unix: include(installs_unix.pri) -win32: include(installs_win32.pri) -- 2.50.1 From 6c1a362396671e32786b061f96a7b30415fb42c2 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Tue, 26 Dec 2017 17:44:09 +0100 Subject: [PATCH 53/78] Updated README.md with make install step --- README.md | 3 ++- .../translations/lunchmealplugin_de.ts | 12 +++++++++--- .../translations/lunchmealplugin_en.ts | 12 +++++++++--- 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 40176c6..42a9c60 100644 --- a/README.md +++ b/README.md @@ -13,11 +13,12 @@ mkdir build_QtZeiterfassung cd build_QtZeiterfassung qmake ../QtZeiterfassung make +make install # only needed on first build to copy Qt resources ``` ## Launching (on unix) ``` -LD_LIBRARY_PATH=../lib ./zeiterfassung # or just use start.sh +./zeiterfassung.sh ``` ## Launching (on win32) diff --git a/plugins/lunchmealplugin/translations/lunchmealplugin_de.ts b/plugins/lunchmealplugin/translations/lunchmealplugin_de.ts index 6ce0111..d0f4690 100644 --- a/plugins/lunchmealplugin/translations/lunchmealplugin_de.ts +++ b/plugins/lunchmealplugin/translations/lunchmealplugin_de.ts @@ -14,12 +14,12 @@ Lade... - + Lunch meal for %0 Mittagsmenü vom %0 - + dd.MM.yyyy dd.MM.yyyy @@ -27,9 +27,15 @@ LunchMealWidget - + Lunch meal Mittagsmenü + + + + Could not load lunch meal! + + diff --git a/plugins/lunchmealplugin/translations/lunchmealplugin_en.ts b/plugins/lunchmealplugin/translations/lunchmealplugin_en.ts index 53dbb95..5637f62 100644 --- a/plugins/lunchmealplugin/translations/lunchmealplugin_en.ts +++ b/plugins/lunchmealplugin/translations/lunchmealplugin_en.ts @@ -14,12 +14,12 @@ - + Lunch meal for %0 - + dd.MM.yyyy @@ -27,9 +27,15 @@ LunchMealWidget - + Lunch meal + + + + Could not load lunch meal! + + -- 2.50.1 From 38d97be88d0df6940218db9cadbbed69d38583ba Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Thu, 28 Dec 2017 11:24:50 +0100 Subject: [PATCH 54/78] Reverted change to doCreateBooking() to fix #20 --- zeiterfassungcorelib/zeiterfassungapi.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/zeiterfassungcorelib/zeiterfassungapi.cpp b/zeiterfassungcorelib/zeiterfassungapi.cpp index b6dd10a..34b11c2 100644 --- a/zeiterfassungcorelib/zeiterfassungapi.cpp +++ b/zeiterfassungcorelib/zeiterfassungapi.cpp @@ -94,9 +94,9 @@ std::unique_ptr ZeiterfassungApi::doGetBookings(int userId, co std::unique_ptr ZeiterfassungApi::doCreateBooking(int userId, const QDate &date, const QTime &time, const QTime ×pan, const QString &type, const QString &text) { - QNetworkRequest request(QUrl(m_url % "json/terminalPageController/evoTerminalBooking")); + QNetworkRequest request(QUrl(m_url % "json/booking")); request.setHeader(QNetworkRequest::ContentTypeHeader, QByteArrayLiteral("application/json")); - request.setRawHeader(QByteArrayLiteral("sisAppName"), QByteArrayLiteral("terminal")); + request.setRawHeader(QByteArrayLiteral("sisAppName"), QByteArrayLiteral("bookingCalendar")); QJsonObject obj; obj[QStringLiteral("persNr")] = userId; @@ -107,7 +107,6 @@ std::unique_ptr ZeiterfassungApi::doCreateBooking(int userId obj[QStringLiteral("hourCategory")] = QStringLiteral(""); obj[QStringLiteral("empfEinh")] = QStringLiteral(""); obj[QStringLiteral("bewEinh")] = QStringLiteral(""); - obj[QStringLiteral("einstuf")] = QStringLiteral(""); obj[QStringLiteral("text")] = text; auto data = QJsonDocument(obj).toJson(); -- 2.50.1 From a76d33711cfad547e4d560a73248fad8091d5dea Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Thu, 28 Dec 2017 11:49:42 +0100 Subject: [PATCH 55/78] Added absenceplugin --- plugins/absenceplugin/absenceplugin.cpp | 31 +++++++++++++++++ plugins/absenceplugin/absenceplugin.h | 24 ++++++++++++++ plugins/absenceplugin/absenceplugin.json | 0 plugins/absenceplugin/absenceplugin.pro | 33 +++++++++++++++++++ plugins/plugins.pro | 3 +- .../dialogs/authenticationdialog.ui | 4 +-- 6 files changed, 92 insertions(+), 3 deletions(-) create mode 100644 plugins/absenceplugin/absenceplugin.cpp create mode 100644 plugins/absenceplugin/absenceplugin.h create mode 100644 plugins/absenceplugin/absenceplugin.json create mode 100644 plugins/absenceplugin/absenceplugin.pro diff --git a/plugins/absenceplugin/absenceplugin.cpp b/plugins/absenceplugin/absenceplugin.cpp new file mode 100644 index 0000000..2065cc3 --- /dev/null +++ b/plugins/absenceplugin/absenceplugin.cpp @@ -0,0 +1,31 @@ +#include "absenceplugin.h" + +#include +#include +#include +#include + +AbsencePlugin::AbsencePlugin(QObject *parent) : + ZeiterfassungPlugin(parent) +{ + qDebug() << "called"; + + static auto dir = QDir(QCoreApplication::applicationDirPath()).absoluteFilePath(QStringLiteral("translations")); + + if(m_translator.load(QLocale(), QStringLiteral("absenceplugin"), QStringLiteral("_"), dir)) + { + if(!QCoreApplication::installTranslator(&m_translator)) + { + qWarning() << "could not install translation absenceplugin"; + } + } + else + { + qWarning() << "could not load translation absenceplugin"; + } +} + +void AbsencePlugin::attachTo(MainWindow &mainWindow) +{ + //TODO +} diff --git a/plugins/absenceplugin/absenceplugin.h b/plugins/absenceplugin/absenceplugin.h new file mode 100644 index 0000000..b3884b8 --- /dev/null +++ b/plugins/absenceplugin/absenceplugin.h @@ -0,0 +1,24 @@ +#pragma once + +#include +#include + +#include "zeiterfassungplugin.h" + +class MainWindow; + +class Q_DECL_EXPORT AbsencePlugin : public ZeiterfassungPlugin +{ + Q_OBJECT + Q_PLUGIN_METADATA(IID "dbsoftware.zeiterfassung.plugin/1.0" FILE "absenceplugin.json") + Q_INTERFACES(ZeiterfassungPlugin) + +public: + explicit AbsencePlugin(QObject *parent = Q_NULLPTR); + + // ZeiterfassungPlugin interface + void attachTo(MainWindow &mainWindow) Q_DECL_OVERRIDE; + +private: + QTranslator m_translator; +}; diff --git a/plugins/absenceplugin/absenceplugin.json b/plugins/absenceplugin/absenceplugin.json new file mode 100644 index 0000000..e69de29 diff --git a/plugins/absenceplugin/absenceplugin.pro b/plugins/absenceplugin/absenceplugin.pro new file mode 100644 index 0000000..bb56955 --- /dev/null +++ b/plugins/absenceplugin/absenceplugin.pro @@ -0,0 +1,33 @@ +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 + +HEADERS += \ + absenceplugin.h + +SOURCES += \ + absenceplugin.cpp + +FORMS += + +RESOURCES += + +TRANSLATIONS += + +OTHER_FILES += absenceplugin.json + +include(../../lrelease.pri) diff --git a/plugins/plugins.pro b/plugins/plugins.pro index 647ff3d..2857a61 100644 --- a/plugins/plugins.pro +++ b/plugins/plugins.pro @@ -1,6 +1,7 @@ TEMPLATE = subdirs -SUBDIRS += advancedviewplugin \ +SUBDIRS += absenceplugin \ + advancedviewplugin \ devtoolsplugin \ lunchmealplugin \ profileplugin \ diff --git a/zeiterfassungguilib/dialogs/authenticationdialog.ui b/zeiterfassungguilib/dialogs/authenticationdialog.ui index 7a35741..e68034f 100644 --- a/zeiterfassungguilib/dialogs/authenticationdialog.ui +++ b/zeiterfassungguilib/dialogs/authenticationdialog.ui @@ -37,7 +37,7 @@ - :/zeiterfassungguilib/images/authentication.png + :/zeiterfassungguilib/images/authentication.png true @@ -105,7 +105,7 @@ - + -- 2.50.1 From 6a50d54864d42c925d6f4eca44441a8002207b20 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Thu, 28 Dec 2017 14:05:14 +0100 Subject: [PATCH 56/78] Added clang compiler to .travis.yml --- .travis.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 0d8c2a3..afb2677 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,7 +2,9 @@ language: cpp os: linux sudo: false dist: trusty -compiler: gcc +compiler: + - gcc + - clang cache: directories: @@ -22,4 +24,4 @@ script: - pushd build - ../qt5/build/bin/qmake .. -config release - make -j2 - - popd \ No newline at end of file + - popd -- 2.50.1 From 64f1a81ff5d9b553b5cf7ffa51155c73cd1b16a0 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Thu, 28 Dec 2017 14:28:29 +0100 Subject: [PATCH 57/78] Added absenceplugin resources --- plugins/absenceplugin/absenceplugin.pro | 2 +- .../absenceplugin/absenceplugin_resources.qrc | 5 +++++ plugins/absenceplugin/images/absence.png | Bin 0 -> 5690 bytes 3 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 plugins/absenceplugin/absenceplugin_resources.qrc create mode 100644 plugins/absenceplugin/images/absence.png diff --git a/plugins/absenceplugin/absenceplugin.pro b/plugins/absenceplugin/absenceplugin.pro index bb56955..9631d58 100644 --- a/plugins/absenceplugin/absenceplugin.pro +++ b/plugins/absenceplugin/absenceplugin.pro @@ -24,7 +24,7 @@ SOURCES += \ FORMS += -RESOURCES += +RESOURCES += absenceplugin_resources.qrc TRANSLATIONS += diff --git a/plugins/absenceplugin/absenceplugin_resources.qrc b/plugins/absenceplugin/absenceplugin_resources.qrc new file mode 100644 index 0000000..a3b089d --- /dev/null +++ b/plugins/absenceplugin/absenceplugin_resources.qrc @@ -0,0 +1,5 @@ + + + images/absence.png + + diff --git a/plugins/absenceplugin/images/absence.png b/plugins/absenceplugin/images/absence.png new file mode 100644 index 0000000000000000000000000000000000000000..4a33f1c5223a28db4e4d344ece90897693645a80 GIT binary patch literal 5690 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 B((eEO literal 0 HcmV?d00001 -- 2.50.1 From 5c7eec85c5d45436fa70c5e7e8c6e5f70b45177d Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Thu, 28 Dec 2017 14:31:41 +0100 Subject: [PATCH 58/78] Added AbsenceWidget --- plugins/absenceplugin/absenceplugin.cpp | 9 ++++++++- plugins/absenceplugin/absenceplugin.pro | 6 ++++-- plugins/absenceplugin/absencewidget.cpp | 8 ++++++++ plugins/absenceplugin/absencewidget.h | 14 ++++++++++++++ 4 files changed, 34 insertions(+), 3 deletions(-) create mode 100644 plugins/absenceplugin/absencewidget.cpp create mode 100644 plugins/absenceplugin/absencewidget.h diff --git a/plugins/absenceplugin/absenceplugin.cpp b/plugins/absenceplugin/absenceplugin.cpp index 2065cc3..ecaa8b0 100644 --- a/plugins/absenceplugin/absenceplugin.cpp +++ b/plugins/absenceplugin/absenceplugin.cpp @@ -4,6 +4,12 @@ #include #include #include +#include + +#include "mainwindow.h" +#include "stripswidget.h" + +#include "absencewidget.h" AbsencePlugin::AbsencePlugin(QObject *parent) : ZeiterfassungPlugin(parent) @@ -27,5 +33,6 @@ AbsencePlugin::AbsencePlugin(QObject *parent) : void AbsencePlugin::attachTo(MainWindow &mainWindow) { - //TODO + for(auto stripsWidget : mainWindow.stripsWidgets()) + stripsWidget->headerLayout()->addWidget(new AbsenceWidget(stripsWidget)); } diff --git a/plugins/absenceplugin/absenceplugin.pro b/plugins/absenceplugin/absenceplugin.pro index 9631d58..8528f50 100644 --- a/plugins/absenceplugin/absenceplugin.pro +++ b/plugins/absenceplugin/absenceplugin.pro @@ -17,10 +17,12 @@ DEPENDPATH += $$PWD/$${PROJECT_ROOT}/zeiterfassungcorelib $$PWD/$${PROJECT_ROOT} DEFINES += QT_DEPRECATED_WARNINGS QT_DISABLE_DEPRECATED_BEFORE=0x060000 QT_MESSAGELOGCONTEXT HEADERS += \ - absenceplugin.h + absenceplugin.h \ + absencewidget.h SOURCES += \ - absenceplugin.cpp + absenceplugin.cpp \ + absencewidget.cpp FORMS += diff --git a/plugins/absenceplugin/absencewidget.cpp b/plugins/absenceplugin/absencewidget.cpp new file mode 100644 index 0000000..6ce81a3 --- /dev/null +++ b/plugins/absenceplugin/absencewidget.cpp @@ -0,0 +1,8 @@ +#include "absencewidget.h" + +AbsenceWidget::AbsenceWidget(QWidget *parent) : + QToolButton(parent) +{ + setIcon(QIcon(QStringLiteral(":/zeiterfassung/plugins/absenceplugin/images/absence.png"))); + setText(tr("Absence")); +} diff --git a/plugins/absenceplugin/absencewidget.h b/plugins/absenceplugin/absencewidget.h new file mode 100644 index 0000000..b3d9579 --- /dev/null +++ b/plugins/absenceplugin/absencewidget.h @@ -0,0 +1,14 @@ +#ifndef ABSENCEWIDGET_H +#define ABSENCEWIDGET_H + +#include + +class AbsenceWidget : public QToolButton +{ + Q_OBJECT + +public: + explicit AbsenceWidget(QWidget *parent = Q_NULLPTR); +}; + +#endif // ABSENCEWIDGET_H -- 2.50.1 From 9f3f320d408a0e0552e5da420c2c0ce6d8c16b1c Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Thu, 28 Dec 2017 14:40:34 +0100 Subject: [PATCH 59/78] Added travis build icons to README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 42a9c60..d8fb519 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,9 @@ # Zeiterfassung This tool helps me assigning my working hours to projects at work. +master: ![Build Status of master](https://travis-ci.org/0xFEEDC0DE64/QtZeiterfassung.svg?branch=master) +devel: ![Build Status of devel](https://travis-ci.org/0xFEEDC0DE64/QtZeiterfassung.svg?branch=devel) + ![Screenshot of the main window](https://raw.githubusercontent.com/0xFEEDC0DE64/QtZeiterfassung/master/screenshot.png) ## Building from source -- 2.50.1 From 1d79851c8efdfebb40ce4419bb8d2aa1e811f835 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Thu, 28 Dec 2017 14:43:16 +0100 Subject: [PATCH 60/78] Added links on travis icons in README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d8fb519..766db01 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ # Zeiterfassung This tool helps me assigning my working hours to projects at work. -master: ![Build Status of master](https://travis-ci.org/0xFEEDC0DE64/QtZeiterfassung.svg?branch=master) -devel: ![Build Status of devel](https://travis-ci.org/0xFEEDC0DE64/QtZeiterfassung.svg?branch=devel) +master: [![Build Status of master](https://travis-ci.org/0xFEEDC0DE64/QtZeiterfassung.svg?branch=master)](https://travis-ci.org/0xFEEDC0DE64/QtZeiterfassung) +devel: [![Build Status of devel](https://travis-ci.org/0xFEEDC0DE64/QtZeiterfassung.svg?branch=devel)](https://travis-ci.org/0xFEEDC0DE64/QtZeiterfassung) ![Screenshot of the main window](https://raw.githubusercontent.com/0xFEEDC0DE64/QtZeiterfassung/master/screenshot.png) -- 2.50.1 From ceb93a2156d7f900baaeb31a9cbabebe7abf79d0 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Thu, 28 Dec 2017 16:36:10 +0100 Subject: [PATCH 61/78] Fixed install names --- installs.pri | 28 ++++++++++++++-------------- installs_win32.pri | 22 +++++++++++----------- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/installs.pri b/installs.pri index 3a7ab5d..df38b05 100644 --- a/installs.pri +++ b/installs.pri @@ -1,14 +1,14 @@ -qtTranslationsInstalls.path = $${OUT_PWD}/bin/translations -qtTranslationsInstalls.files = $$[QT_INSTALL_TRANSLATIONS]/qt_en.qm \ - $$[QT_INSTALL_TRANSLATIONS]/qtbase_en.qm \ - $$[QT_INSTALL_TRANSLATIONS]/qtmultimedia_en.qm \ - $$[QT_INSTALL_TRANSLATIONS]/qtquick1_en.qm \ - $$[QT_INSTALL_TRANSLATIONS]/qtscript_en.qm \ - $$[QT_INSTALL_TRANSLATIONS]/qtxmlpatterns_en.qm \ - $$[QT_INSTALL_TRANSLATIONS]/qt_de.qm \ - $$[QT_INSTALL_TRANSLATIONS]/qtbase_de.qm \ - $$[QT_INSTALL_TRANSLATIONS]/qtmultimedia_de.qm \ - $$[QT_INSTALL_TRANSLATIONS]/qtquick1_de.qm \ - $$[QT_INSTALL_TRANSLATIONS]/qtscript_de.qm \ - $$[QT_INSTALL_TRANSLATIONS]/qtxmlpatterns_de.qm -INSTALLS += qtTranslationsInstalls +qtTranslationsInstall.path = $${OUT_PWD}/bin/translations +qtTranslationsInstall.files = $$[QT_INSTALL_TRANSLATIONS]/qt_en.qm \ + $$[QT_INSTALL_TRANSLATIONS]/qtbase_en.qm \ + $$[QT_INSTALL_TRANSLATIONS]/qtmultimedia_en.qm \ + $$[QT_INSTALL_TRANSLATIONS]/qtquick1_en.qm \ + $$[QT_INSTALL_TRANSLATIONS]/qtscript_en.qm \ + $$[QT_INSTALL_TRANSLATIONS]/qtxmlpatterns_en.qm \ + $$[QT_INSTALL_TRANSLATIONS]/qt_de.qm \ + $$[QT_INSTALL_TRANSLATIONS]/qtbase_de.qm \ + $$[QT_INSTALL_TRANSLATIONS]/qtmultimedia_de.qm \ + $$[QT_INSTALL_TRANSLATIONS]/qtquick1_de.qm \ + $$[QT_INSTALL_TRANSLATIONS]/qtscript_de.qm \ + $$[QT_INSTALL_TRANSLATIONS]/qtxmlpatterns_de.qm +INSTALLS += qtTranslationsInstall diff --git a/installs_win32.pri b/installs_win32.pri index 65ce4a7..da5ead8 100644 --- a/installs_win32.pri +++ b/installs_win32.pri @@ -11,17 +11,17 @@ qtLibsInstall.files = win32/Qt.conf \ $$[QT_INSTALL_BINS]/libwinpthread-1.dll INSTALLS += qtLibsInstall -qtImageFormats.path = $${OUT_PWD}/bin/plugins/imageformats -qtImageFormats.files = $$[QT_INSTALL_PLUGINS]/imageformats/qgif$${DEBUG_SIGN}.dll \ - $$[QT_INSTALL_PLUGINS]/imageformats/qicns$${DEBUG_SIGN}.dll \ - $$[QT_INSTALL_PLUGINS]/imageformats/qico$${DEBUG_SIGN}.dll \ - $$[QT_INSTALL_PLUGINS]/imageformats/qjpeg$${DEBUG_SIGN}.dll \ - $$[QT_INSTALL_PLUGINS]/imageformats/qsvg$${DEBUG_SIGN}.dll \ - $$[QT_INSTALL_PLUGINS]/imageformats/qtga$${DEBUG_SIGN}.dll \ - $$[QT_INSTALL_PLUGINS]/imageformats/qtiff$${DEBUG_SIGN}.dll \ - $$[QT_INSTALL_PLUGINS]/imageformats/qwbmp$${DEBUG_SIGN}.dll \ - $$[QT_INSTALL_PLUGINS]/imageformats/qwebp$${DEBUG_SIGN}.dll -INSTALLS += qtImageFormats +qtImageFormatsInstall.path = $${OUT_PWD}/bin/plugins/imageformats +qtImageFormatsInstall.files = $$[QT_INSTALL_PLUGINS]/imageformats/qgif$${DEBUG_SIGN}.dll \ + $$[QT_INSTALL_PLUGINS]/imageformats/qicns$${DEBUG_SIGN}.dll \ + $$[QT_INSTALL_PLUGINS]/imageformats/qico$${DEBUG_SIGN}.dll \ + $$[QT_INSTALL_PLUGINS]/imageformats/qjpeg$${DEBUG_SIGN}.dll \ + $$[QT_INSTALL_PLUGINS]/imageformats/qsvg$${DEBUG_SIGN}.dll \ + $$[QT_INSTALL_PLUGINS]/imageformats/qtga$${DEBUG_SIGN}.dll \ + $$[QT_INSTALL_PLUGINS]/imageformats/qtiff$${DEBUG_SIGN}.dll \ + $$[QT_INSTALL_PLUGINS]/imageformats/qwbmp$${DEBUG_SIGN}.dll \ + $$[QT_INSTALL_PLUGINS]/imageformats/qwebp$${DEBUG_SIGN}.dll +INSTALLS += qtImageFormatsInstall qtPlatformsInstall.path = $${OUT_PWD}/bin/plugins/platforms qtPlatformsInstall.files = $$[QT_INSTALL_PLUGINS]/platforms/qwindows$${DEBUG_SIGN}.dll -- 2.50.1 From e6abb265361d82ea218cca40f8d315d47bbd2dac Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Thu, 28 Dec 2017 17:00:49 +0100 Subject: [PATCH 62/78] Added AbsenceDialog --- plugins/absenceplugin/absencedialog.cpp | 14 +++++ plugins/absenceplugin/absencedialog.h | 17 ++++++ plugins/absenceplugin/absencedialog.ui | 71 +++++++++++++++++++++++++ plugins/absenceplugin/absenceplugin.pro | 9 ++-- plugins/absenceplugin/absencewidget.cpp | 10 ++++ plugins/absenceplugin/absencewidget.h | 8 +-- 6 files changed, 122 insertions(+), 7 deletions(-) create mode 100644 plugins/absenceplugin/absencedialog.cpp create mode 100644 plugins/absenceplugin/absencedialog.h create mode 100644 plugins/absenceplugin/absencedialog.ui diff --git a/plugins/absenceplugin/absencedialog.cpp b/plugins/absenceplugin/absencedialog.cpp new file mode 100644 index 0000000..0b8faf8 --- /dev/null +++ b/plugins/absenceplugin/absencedialog.cpp @@ -0,0 +1,14 @@ +#include "absencedialog.h" +#include "ui_absencedialog.h" + +AbsenceDialog::AbsenceDialog(QWidget *parent) : + QDialog(parent), + ui(new Ui::AbsenceDialog) +{ + ui->setupUi(this); +} + +AbsenceDialog::~AbsenceDialog() +{ + delete ui; +} diff --git a/plugins/absenceplugin/absencedialog.h b/plugins/absenceplugin/absencedialog.h new file mode 100644 index 0000000..37cdb10 --- /dev/null +++ b/plugins/absenceplugin/absencedialog.h @@ -0,0 +1,17 @@ +#pragma once + +#include + +namespace Ui { class AbsenceDialog; } + +class AbsenceDialog : public QDialog +{ + Q_OBJECT + +public: + explicit AbsenceDialog(QWidget *parent = 0); + ~AbsenceDialog(); + +private: + Ui::AbsenceDialog *ui; +}; diff --git a/plugins/absenceplugin/absencedialog.ui b/plugins/absenceplugin/absencedialog.ui new file mode 100644 index 0000000..4b2e795 --- /dev/null +++ b/plugins/absenceplugin/absencedialog.ui @@ -0,0 +1,71 @@ + + + + + AbsenceDialog + + + + 0 + 0 + 400 + 300 + + + + Dialog + + + + + 30 + 240 + 341 + 32 + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + buttonBox + accepted() + AbsenceDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + AbsenceDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/plugins/absenceplugin/absenceplugin.pro b/plugins/absenceplugin/absenceplugin.pro index 8528f50..4c1eaed 100644 --- a/plugins/absenceplugin/absenceplugin.pro +++ b/plugins/absenceplugin/absenceplugin.pro @@ -18,13 +18,16 @@ DEFINES += QT_DEPRECATED_WARNINGS QT_DISABLE_DEPRECATED_BEFORE=0x060000 QT_MESSA HEADERS += \ absenceplugin.h \ - absencewidget.h + absencewidget.h \ + absencedialog.h SOURCES += \ absenceplugin.cpp \ - absencewidget.cpp + absencewidget.cpp \ + absencedialog.cpp -FORMS += +FORMS += \ + absencedialog.ui RESOURCES += absenceplugin_resources.qrc diff --git a/plugins/absenceplugin/absencewidget.cpp b/plugins/absenceplugin/absencewidget.cpp index 6ce81a3..911e2c4 100644 --- a/plugins/absenceplugin/absencewidget.cpp +++ b/plugins/absenceplugin/absencewidget.cpp @@ -1,8 +1,18 @@ #include "absencewidget.h" +#include "absencedialog.h" + AbsenceWidget::AbsenceWidget(QWidget *parent) : QToolButton(parent) { setIcon(QIcon(QStringLiteral(":/zeiterfassung/plugins/absenceplugin/images/absence.png"))); setText(tr("Absence")); + + connect(this, &QAbstractButton::pressed, this, &AbsenceWidget::pressedSlot); +} + +void AbsenceWidget::pressedSlot() +{ + AbsenceDialog dialog(this); + dialog.exec(); } diff --git a/plugins/absenceplugin/absencewidget.h b/plugins/absenceplugin/absencewidget.h index b3d9579..eaec751 100644 --- a/plugins/absenceplugin/absencewidget.h +++ b/plugins/absenceplugin/absencewidget.h @@ -1,5 +1,4 @@ -#ifndef ABSENCEWIDGET_H -#define ABSENCEWIDGET_H +#pragma once #include @@ -9,6 +8,7 @@ class AbsenceWidget : public QToolButton public: explicit AbsenceWidget(QWidget *parent = Q_NULLPTR); -}; -#endif // ABSENCEWIDGET_H +private Q_SLOTS: + void pressedSlot(); +}; -- 2.50.1 From bae2d3af8ae1b98a5cff3cba7614cc6f66aee928 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Thu, 28 Dec 2017 17:01:58 +0100 Subject: [PATCH 63/78] Replaced old #ifndef's with #pragma once's --- plugins/devtoolsplugin/logdialog.h | 5 +---- plugins/devtoolsplugin/logmodel.h | 5 +---- plugins/webradioplugin/webradiodialog.h | 5 +---- 3 files changed, 3 insertions(+), 12 deletions(-) diff --git a/plugins/devtoolsplugin/logdialog.h b/plugins/devtoolsplugin/logdialog.h index 8f50e2e..1ccd7bf 100644 --- a/plugins/devtoolsplugin/logdialog.h +++ b/plugins/devtoolsplugin/logdialog.h @@ -1,5 +1,4 @@ -#ifndef LOGDIALOG_H -#define LOGDIALOG_H +#pragma once #include @@ -20,5 +19,3 @@ public: private: Ui::LogDialog *ui; }; - -#endif // LOGDIALOG_H diff --git a/plugins/devtoolsplugin/logmodel.h b/plugins/devtoolsplugin/logmodel.h index 75d9eb5..4312fb5 100644 --- a/plugins/devtoolsplugin/logmodel.h +++ b/plugins/devtoolsplugin/logmodel.h @@ -1,5 +1,4 @@ -#ifndef LOGMODEL_H -#define LOGMODEL_H +#pragma once #include #include @@ -35,5 +34,3 @@ private: QList m_entries; }; - -#endif // LOGMODEL_H diff --git a/plugins/webradioplugin/webradiodialog.h b/plugins/webradioplugin/webradiodialog.h index ed40035..5529756 100644 --- a/plugins/webradioplugin/webradiodialog.h +++ b/plugins/webradioplugin/webradiodialog.h @@ -1,5 +1,4 @@ -#ifndef WEBRADIODIALOG_H -#define WEBRADIODIALOG_H +#pragma once #include #include @@ -32,5 +31,3 @@ private: MainWindow &m_mainWindow; QMediaPlayer *m_player; }; - -#endif // WEBRADIODIALOG_H -- 2.50.1 From 7c11cf7d485e2fb84fc9fdf8c14aec4e3f494a9b Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Thu, 28 Dec 2017 17:11:45 +0100 Subject: [PATCH 64/78] Made all reply constructors explicit --- zeiterfassungcorelib/replies/createbookingreply.h | 2 +- zeiterfassungcorelib/replies/createtimeassignmentreply.h | 2 +- zeiterfassungcorelib/replies/deletebookingreply.h | 2 +- zeiterfassungcorelib/replies/deletetimeassignmentreply.h | 2 +- zeiterfassungcorelib/replies/getbookingsreply.h | 2 +- zeiterfassungcorelib/replies/getprojectsreply.h | 2 +- zeiterfassungcorelib/replies/getreportreply.h | 2 +- zeiterfassungcorelib/replies/gettimeassignmentsreply.h | 2 +- zeiterfassungcorelib/replies/getuserinforeply.h | 2 +- zeiterfassungcorelib/replies/loginpagereply.h | 2 +- zeiterfassungcorelib/replies/loginreply.h | 2 +- zeiterfassungcorelib/replies/updatebookingreply.h | 2 +- zeiterfassungcorelib/replies/updatetimeassignmentreply.h | 2 +- 13 files changed, 13 insertions(+), 13 deletions(-) diff --git a/zeiterfassungcorelib/replies/createbookingreply.h b/zeiterfassungcorelib/replies/createbookingreply.h index d3527ad..263f099 100644 --- a/zeiterfassungcorelib/replies/createbookingreply.h +++ b/zeiterfassungcorelib/replies/createbookingreply.h @@ -12,7 +12,7 @@ class ZEITERFASSUNGCORELIBSHARED_EXPORT CreateBookingReply : public Zeiterfassun Q_OBJECT public: - CreateBookingReply(std::unique_ptr &&reply, ZeiterfassungApi *zeiterfassung); + explicit CreateBookingReply(std::unique_ptr &&reply, ZeiterfassungApi *zeiterfassung); private Q_SLOTS: void requestFinished(); diff --git a/zeiterfassungcorelib/replies/createtimeassignmentreply.h b/zeiterfassungcorelib/replies/createtimeassignmentreply.h index 1b50982..f81e1be 100644 --- a/zeiterfassungcorelib/replies/createtimeassignmentreply.h +++ b/zeiterfassungcorelib/replies/createtimeassignmentreply.h @@ -12,7 +12,7 @@ class ZEITERFASSUNGCORELIBSHARED_EXPORT CreateTimeAssignmentReply : public Zeite Q_OBJECT public: - CreateTimeAssignmentReply(std::unique_ptr &&reply, ZeiterfassungApi *zeiterfassung); + explicit CreateTimeAssignmentReply(std::unique_ptr &&reply, ZeiterfassungApi *zeiterfassung); int timeAssignmentId() const; diff --git a/zeiterfassungcorelib/replies/deletebookingreply.h b/zeiterfassungcorelib/replies/deletebookingreply.h index e7bd1a8..6807669 100644 --- a/zeiterfassungcorelib/replies/deletebookingreply.h +++ b/zeiterfassungcorelib/replies/deletebookingreply.h @@ -12,7 +12,7 @@ class ZEITERFASSUNGCORELIBSHARED_EXPORT DeleteBookingReply : public Zeiterfassun Q_OBJECT public: - DeleteBookingReply(std::unique_ptr &&reply, ZeiterfassungApi *zeiterfassung); + explicit DeleteBookingReply(std::unique_ptr &&reply, ZeiterfassungApi *zeiterfassung); private Q_SLOTS: void requestFinished(); diff --git a/zeiterfassungcorelib/replies/deletetimeassignmentreply.h b/zeiterfassungcorelib/replies/deletetimeassignmentreply.h index ff65b86..9353ba6 100644 --- a/zeiterfassungcorelib/replies/deletetimeassignmentreply.h +++ b/zeiterfassungcorelib/replies/deletetimeassignmentreply.h @@ -12,7 +12,7 @@ class ZEITERFASSUNGCORELIBSHARED_EXPORT DeleteTimeAssignmentReply : public Zeite Q_OBJECT public: - DeleteTimeAssignmentReply(std::unique_ptr &&reply, ZeiterfassungApi *zeiterfassung); + explicit DeleteTimeAssignmentReply(std::unique_ptr &&reply, ZeiterfassungApi *zeiterfassung); private Q_SLOTS: void requestFinished(); diff --git a/zeiterfassungcorelib/replies/getbookingsreply.h b/zeiterfassungcorelib/replies/getbookingsreply.h index 2272829..bf3c0ea 100644 --- a/zeiterfassungcorelib/replies/getbookingsreply.h +++ b/zeiterfassungcorelib/replies/getbookingsreply.h @@ -15,7 +15,7 @@ class ZEITERFASSUNGCORELIBSHARED_EXPORT GetBookingsReply : public ZeiterfassungR Q_OBJECT public: - GetBookingsReply(std::unique_ptr &&reply, ZeiterfassungApi *zeiterfassung); + explicit GetBookingsReply(std::unique_ptr &&reply, ZeiterfassungApi *zeiterfassung); struct Booking { diff --git a/zeiterfassungcorelib/replies/getprojectsreply.h b/zeiterfassungcorelib/replies/getprojectsreply.h index 6124d63..293b592 100644 --- a/zeiterfassungcorelib/replies/getprojectsreply.h +++ b/zeiterfassungcorelib/replies/getprojectsreply.h @@ -15,7 +15,7 @@ class ZEITERFASSUNGCORELIBSHARED_EXPORT GetProjectsReply : public ZeiterfassungR Q_OBJECT public: - GetProjectsReply(std::unique_ptr &&reply, ZeiterfassungApi *zeiterfassung); + explicit GetProjectsReply(std::unique_ptr &&reply, ZeiterfassungApi *zeiterfassung); struct Project { diff --git a/zeiterfassungcorelib/replies/getreportreply.h b/zeiterfassungcorelib/replies/getreportreply.h index aea13e3..6b0bc75 100644 --- a/zeiterfassungcorelib/replies/getreportreply.h +++ b/zeiterfassungcorelib/replies/getreportreply.h @@ -13,7 +13,7 @@ class ZEITERFASSUNGCORELIBSHARED_EXPORT GetReportReply : public ZeiterfassungRep Q_OBJECT public: - GetReportReply(std::unique_ptr &&reply, ZeiterfassungApi *zeiterfassung); + explicit GetReportReply(std::unique_ptr &&reply, ZeiterfassungApi *zeiterfassung); const QByteArray &content() const; diff --git a/zeiterfassungcorelib/replies/gettimeassignmentsreply.h b/zeiterfassungcorelib/replies/gettimeassignmentsreply.h index cd97149..2ff63ee 100644 --- a/zeiterfassungcorelib/replies/gettimeassignmentsreply.h +++ b/zeiterfassungcorelib/replies/gettimeassignmentsreply.h @@ -15,7 +15,7 @@ class ZEITERFASSUNGCORELIBSHARED_EXPORT GetTimeAssignmentsReply : public Zeiterf Q_OBJECT public: - GetTimeAssignmentsReply(std::unique_ptr &&reply, ZeiterfassungApi *zeiterfassung); + explicit GetTimeAssignmentsReply(std::unique_ptr &&reply, ZeiterfassungApi *zeiterfassung); struct TimeAssignment { diff --git a/zeiterfassungcorelib/replies/getuserinforeply.h b/zeiterfassungcorelib/replies/getuserinforeply.h index 7003506..17fdee3 100644 --- a/zeiterfassungcorelib/replies/getuserinforeply.h +++ b/zeiterfassungcorelib/replies/getuserinforeply.h @@ -14,7 +14,7 @@ class ZEITERFASSUNGCORELIBSHARED_EXPORT GetUserInfoReply : public ZeiterfassungR Q_OBJECT public: - GetUserInfoReply(std::unique_ptr &&reply0, std::unique_ptr &&reply1, + explicit GetUserInfoReply(std::unique_ptr &&reply0, std::unique_ptr &&reply1, ZeiterfassungApi *zeiterfassung); struct UserInfo diff --git a/zeiterfassungcorelib/replies/loginpagereply.h b/zeiterfassungcorelib/replies/loginpagereply.h index 0777741..d050555 100644 --- a/zeiterfassungcorelib/replies/loginpagereply.h +++ b/zeiterfassungcorelib/replies/loginpagereply.h @@ -12,7 +12,7 @@ class ZEITERFASSUNGCORELIBSHARED_EXPORT LoginPageReply : public ZeiterfassungRep Q_OBJECT public: - LoginPageReply(std::unique_ptr &&reply, ZeiterfassungApi *zeiterfassung); + explicit LoginPageReply(std::unique_ptr &&reply, ZeiterfassungApi *zeiterfassung); private Q_SLOTS: void requestFinished(); diff --git a/zeiterfassungcorelib/replies/loginreply.h b/zeiterfassungcorelib/replies/loginreply.h index f6f76c4..a0a21e2 100644 --- a/zeiterfassungcorelib/replies/loginreply.h +++ b/zeiterfassungcorelib/replies/loginreply.h @@ -12,7 +12,7 @@ class ZEITERFASSUNGCORELIBSHARED_EXPORT LoginReply : public ZeiterfassungReply Q_OBJECT public: - LoginReply(std::unique_ptr &&reply, ZeiterfassungApi *zeiterfassung); + explicit LoginReply(std::unique_ptr &&reply, ZeiterfassungApi *zeiterfassung); private Q_SLOTS: void requestFinished(); diff --git a/zeiterfassungcorelib/replies/updatebookingreply.h b/zeiterfassungcorelib/replies/updatebookingreply.h index 137bd2e..8c37de3 100644 --- a/zeiterfassungcorelib/replies/updatebookingreply.h +++ b/zeiterfassungcorelib/replies/updatebookingreply.h @@ -12,7 +12,7 @@ class ZEITERFASSUNGCORELIBSHARED_EXPORT UpdateBookingReply : public Zeiterfassun Q_OBJECT public: - UpdateBookingReply(std::unique_ptr &&reply, ZeiterfassungApi *zeiterfassung); + explicit UpdateBookingReply(std::unique_ptr &&reply, ZeiterfassungApi *zeiterfassung); private Q_SLOTS: void requestFinished(); diff --git a/zeiterfassungcorelib/replies/updatetimeassignmentreply.h b/zeiterfassungcorelib/replies/updatetimeassignmentreply.h index 3bdb59e..5dd3d32 100644 --- a/zeiterfassungcorelib/replies/updatetimeassignmentreply.h +++ b/zeiterfassungcorelib/replies/updatetimeassignmentreply.h @@ -12,7 +12,7 @@ class ZEITERFASSUNGCORELIBSHARED_EXPORT UpdateTimeAssignmentReply : public Zeite Q_OBJECT public: - UpdateTimeAssignmentReply(std::unique_ptr &&reply, ZeiterfassungApi *zeiterfassung); + explicit UpdateTimeAssignmentReply(std::unique_ptr &&reply, ZeiterfassungApi *zeiterfassung); int timeAssignmentId() const; -- 2.50.1 From 8a04179ba16a633c513a73564e09a0a8e323225c Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Thu, 28 Dec 2017 17:12:08 +0100 Subject: [PATCH 65/78] Fixed dialog parent hirachy --- plugins/advancedviewplugin/advancedviewdialog.cpp | 4 ++-- plugins/advancedviewplugin/advancedviewdialog.h | 2 +- plugins/advancedviewplugin/advancedviewwidget.cpp | 2 +- plugins/lunchmealplugin/lunchmealwidget.cpp | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/plugins/advancedviewplugin/advancedviewdialog.cpp b/plugins/advancedviewplugin/advancedviewdialog.cpp index c258ae4..f147ab5 100644 --- a/plugins/advancedviewplugin/advancedviewdialog.cpp +++ b/plugins/advancedviewplugin/advancedviewdialog.cpp @@ -21,8 +21,8 @@ #include "models/bookingsmodel.h" #include "models/timeassignmentsmodel.h" -AdvancedViewDialog::AdvancedViewDialog(StripsWidget &stripsWidget) : - QDialog(&stripsWidget.mainWindow()), +AdvancedViewDialog::AdvancedViewDialog(StripsWidget &stripsWidget, QWidget *parent) : + QDialog(parent), ui(new Ui::AdvancedViewDialog), m_stripsWidget(stripsWidget), m_bookingsModel(new BookingsModel(stripsWidget, this)), diff --git a/plugins/advancedviewplugin/advancedviewdialog.h b/plugins/advancedviewplugin/advancedviewdialog.h index da5fd89..5f29b89 100644 --- a/plugins/advancedviewplugin/advancedviewdialog.h +++ b/plugins/advancedviewplugin/advancedviewdialog.h @@ -12,7 +12,7 @@ class AdvancedViewDialog : public QDialog Q_OBJECT public: - explicit AdvancedViewDialog(StripsWidget &stripsWidget); + explicit AdvancedViewDialog(StripsWidget &stripsWidget, QWidget *parent = Q_NULLPTR); ~AdvancedViewDialog(); private Q_SLOTS: diff --git a/plugins/advancedviewplugin/advancedviewwidget.cpp b/plugins/advancedviewplugin/advancedviewwidget.cpp index 1c9c56d..be52d8d 100644 --- a/plugins/advancedviewplugin/advancedviewwidget.cpp +++ b/plugins/advancedviewplugin/advancedviewwidget.cpp @@ -25,6 +25,6 @@ void AdvancedViewWidget::dateChanged(const QDate &date) void AdvancedViewWidget::pressedSlot() { - AdvancedViewDialog dialog(m_stripsWidget); + AdvancedViewDialog dialog(m_stripsWidget, this); dialog.exec(); } diff --git a/plugins/lunchmealplugin/lunchmealwidget.cpp b/plugins/lunchmealplugin/lunchmealwidget.cpp index f93b4b5..1e618a1 100644 --- a/plugins/lunchmealplugin/lunchmealwidget.cpp +++ b/plugins/lunchmealplugin/lunchmealwidget.cpp @@ -29,7 +29,7 @@ LunchMealWidget::LunchMealWidget(StripsWidget &stripsWidget) : void LunchMealWidget::pressedSlot() { - LunchMealDialog dialog(m_stripsWidget.date(), m_content, &m_stripsWidget.mainWindow()); + LunchMealDialog dialog(m_stripsWidget.date(), m_content, this); dialog.exec(); } -- 2.50.1 From 24ea0989f5ebbef3e0a4a76197c917f1ee43cde2 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Thu, 28 Dec 2017 17:19:22 +0100 Subject: [PATCH 66/78] Added GetAbsencesReply --- .../replies/getabsencesreply.cpp | 18 ++++++++++ .../replies/getabsencesreply.h | 33 +++++++++++++++++++ zeiterfassungcorelib/zeiterfassungcorelib.pro | 2 ++ 3 files changed, 53 insertions(+) create mode 100644 zeiterfassungcorelib/replies/getabsencesreply.cpp create mode 100644 zeiterfassungcorelib/replies/getabsencesreply.h diff --git a/zeiterfassungcorelib/replies/getabsencesreply.cpp b/zeiterfassungcorelib/replies/getabsencesreply.cpp new file mode 100644 index 0000000..5832afc --- /dev/null +++ b/zeiterfassungcorelib/replies/getabsencesreply.cpp @@ -0,0 +1,18 @@ +#include "getabsencesreply.h" + +GetAbsencesReply::GetAbsencesReply(std::unique_ptr &&reply, ZeiterfassungApi *zeiterfassung) : + ZeiterfassungReply(zeiterfassung), + m_reply(std::move(reply)) +{ + connect(m_reply.get(), &QNetworkReply::finished, this, &GetAbsencesReply::requestFinished); +} + +const QVector &GetAbsencesReply::getAbsences() const +{ + return m_absences; +} + +void GetAbsencesReply::requestFinished() +{ + //TODO +} diff --git a/zeiterfassungcorelib/replies/getabsencesreply.h b/zeiterfassungcorelib/replies/getabsencesreply.h new file mode 100644 index 0000000..09ee07a --- /dev/null +++ b/zeiterfassungcorelib/replies/getabsencesreply.h @@ -0,0 +1,33 @@ +#pragma once + +#include + +#include +#include + +#include "zeiterfassungcorelib_global.h" +#include "zeiterfassungreply.h" + +class ZeiterfassungApi; + +class ZEITERFASSUNGCORELIBSHARED_EXPORT GetAbsencesReply : public ZeiterfassungReply +{ + Q_OBJECT + +public: + explicit GetAbsencesReply(std::unique_ptr &&reply, ZeiterfassungApi *zeiterfassung); + + struct Absence + { + //TODO + }; + + const QVector &getAbsences() const; + +private Q_SLOTS: + void requestFinished(); + +private: + std::unique_ptr m_reply; + QVector m_absences; +}; diff --git a/zeiterfassungcorelib/zeiterfassungcorelib.pro b/zeiterfassungcorelib/zeiterfassungcorelib.pro index 8c0d06f..9ba114a 100644 --- a/zeiterfassungcorelib/zeiterfassungcorelib.pro +++ b/zeiterfassungcorelib/zeiterfassungcorelib.pro @@ -20,6 +20,7 @@ SOURCES += timeutils.cpp \ replies/createtimeassignmentreply.cpp \ replies/deletebookingreply.cpp \ replies/deletetimeassignmentreply.cpp \ + replies/getabsencesreply.cpp \ replies/getbookingsreply.cpp \ replies/getpresencestatusreply.cpp \ replies/getprojectsreply.cpp \ @@ -41,6 +42,7 @@ HEADERS += cpp14polyfills.h \ replies/createtimeassignmentreply.h \ replies/deletebookingreply.h \ replies/deletetimeassignmentreply.h \ + replies/getabsencesreply.h \ replies/getbookingsreply.h \ replies/getpresencestatusreply.h \ replies/getprojectsreply.h \ -- 2.50.1 From 46906b3ac30917cd1eb90a010dc78a282d157a0e Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Thu, 28 Dec 2017 17:25:34 +0100 Subject: [PATCH 67/78] Implemented doGetAbsences() --- zeiterfassungcorelib/zeiterfassungapi.cpp | 35 ++++++++++++++++------- zeiterfassungcorelib/zeiterfassungapi.h | 2 ++ 2 files changed, 26 insertions(+), 11 deletions(-) diff --git a/zeiterfassungcorelib/zeiterfassungapi.cpp b/zeiterfassungcorelib/zeiterfassungapi.cpp index 34b11c2..16d0a02 100644 --- a/zeiterfassungcorelib/zeiterfassungapi.cpp +++ b/zeiterfassungcorelib/zeiterfassungapi.cpp @@ -9,20 +9,21 @@ #include #include -#include "replies/createbookingreply.h" -#include "replies/createtimeassignmentreply.h" -#include "replies/deletebookingreply.h" -#include "replies/deletetimeassignmentreply.h" -#include "replies/getreportreply.h" -#include "replies/getbookingsreply.h" -#include "replies/getpresencestatusreply.h" -#include "replies/getprojectsreply.h" -#include "replies/gettimeassignmentsreply.h" #include "replies/loginpagereply.h" #include "replies/loginreply.h" -#include "replies/updatebookingreply.h" -#include "replies/updatetimeassignmentreply.h" #include "replies/getuserinforeply.h" +#include "replies/getbookingsreply.h" +#include "replies/createbookingreply.h" +#include "replies/updatebookingreply.h" +#include "replies/deletebookingreply.h" +#include "replies/gettimeassignmentsreply.h" +#include "replies/createtimeassignmentreply.h" +#include "replies/updatetimeassignmentreply.h" +#include "replies/deletetimeassignmentreply.h" +#include "replies/getprojectsreply.h" +#include "replies/getreportreply.h" +#include "replies/getpresencestatusreply.h" +#include "replies/getabsencesreply.h" //add support for pre cpp14 compilers #include "cpp14polyfills.h" @@ -286,3 +287,15 @@ std::unique_ptr ZeiterfassungApi::doGetPresenceStatus() return std::make_unique(std::unique_ptr(m_manager->get(request)), this); } + +std::unique_ptr ZeiterfassungApi::doGetAbsences(int userId, const QDate &start, const QDate &end) +{ + QNetworkRequest request(QUrl(QStringLiteral("%0json/fulldayAbsences?start=%1&end=%2&pnrLst=%3") + .arg(m_url) + .arg(start.toString(QStringLiteral("yyyyMMdd"))) + .arg(end.toString(QStringLiteral("yyyyMMdd"))) + .arg(userId))); + request.setRawHeader(QByteArrayLiteral("sisAppName"), QByteArrayLiteral("bookingCalendar")); + + return std::make_unique(std::unique_ptr(m_manager->get(request)), this); +} diff --git a/zeiterfassungcorelib/zeiterfassungapi.h b/zeiterfassungcorelib/zeiterfassungapi.h index b1320ee..8af9b71 100644 --- a/zeiterfassungcorelib/zeiterfassungapi.h +++ b/zeiterfassungcorelib/zeiterfassungapi.h @@ -25,6 +25,7 @@ class DeleteTimeAssignmentReply; class GetProjectsReply; class GetReportReply; class GetPresenceStatusReply; +class GetAbsencesReply; class ZEITERFASSUNGCORELIBSHARED_EXPORT ZeiterfassungApi : public QObject { @@ -63,6 +64,7 @@ public: std::unique_ptr doGetProjects(int userId, const QDate &date); 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); private: QString m_url; -- 2.50.1 From 346b63b168bf3fb3d818504e160112ea8f8bb3e0 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Thu, 28 Dec 2017 17:38:36 +0100 Subject: [PATCH 68/78] Added view to AbsenceDialog and added translations --- plugins/absenceplugin/absencedialog.cpp | 12 ++++- plugins/absenceplugin/absencedialog.h | 4 +- plugins/absenceplugin/absencedialog.ui | 50 +++++++++++-------- plugins/absenceplugin/absenceplugin.cpp | 2 +- plugins/absenceplugin/absenceplugin.pro | 16 +++--- plugins/absenceplugin/absencewidget.cpp | 9 ++-- plugins/absenceplugin/absencewidget.h | 7 ++- .../translations/absenceplugin_de.ts | 30 +++++++++++ .../translations/absenceplugin_en.ts | 30 +++++++++++ 9 files changed, 123 insertions(+), 37 deletions(-) create mode 100644 plugins/absenceplugin/translations/absenceplugin_de.ts create mode 100644 plugins/absenceplugin/translations/absenceplugin_en.ts diff --git a/plugins/absenceplugin/absencedialog.cpp b/plugins/absenceplugin/absencedialog.cpp index 0b8faf8..f80265a 100644 --- a/plugins/absenceplugin/absencedialog.cpp +++ b/plugins/absenceplugin/absencedialog.cpp @@ -1,11 +1,21 @@ #include "absencedialog.h" #include "ui_absencedialog.h" -AbsenceDialog::AbsenceDialog(QWidget *parent) : +#include + +AbsenceDialog::AbsenceDialog(const QDate &date, QWidget *parent) : QDialog(parent), ui(new Ui::AbsenceDialog) { ui->setupUi(this); + +#if (QT_VERSION >= QT_VERSION_CHECK(5, 9, 0)) + setWindowFlag(Qt::WindowContextHelpButtonHint, false); +#else + setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); +#endif + + ui->labelTitle->setText(tr("Absences for %0").arg(date.toString(tr("dd.MM.yyyy")))); } AbsenceDialog::~AbsenceDialog() diff --git a/plugins/absenceplugin/absencedialog.h b/plugins/absenceplugin/absencedialog.h index 37cdb10..ceecb15 100644 --- a/plugins/absenceplugin/absencedialog.h +++ b/plugins/absenceplugin/absencedialog.h @@ -2,6 +2,8 @@ #include +class QDate; + namespace Ui { class AbsenceDialog; } class AbsenceDialog : public QDialog @@ -9,7 +11,7 @@ class AbsenceDialog : public QDialog Q_OBJECT public: - explicit AbsenceDialog(QWidget *parent = 0); + explicit AbsenceDialog(const QDate &date, QWidget *parent = 0); ~AbsenceDialog(); private: diff --git a/plugins/absenceplugin/absencedialog.ui b/plugins/absenceplugin/absencedialog.ui index 4b2e795..41582c0 100644 --- a/plugins/absenceplugin/absencedialog.ui +++ b/plugins/absenceplugin/absencedialog.ui @@ -1,7 +1,5 @@ + - - - AbsenceDialog @@ -13,26 +11,36 @@ - Dialog + Absences - - - - 30 - 240 - 341 - 32 - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - + + + + + + 16 + + + + Absences for + + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Close + + + + - diff --git a/plugins/absenceplugin/absenceplugin.cpp b/plugins/absenceplugin/absenceplugin.cpp index ecaa8b0..2e09928 100644 --- a/plugins/absenceplugin/absenceplugin.cpp +++ b/plugins/absenceplugin/absenceplugin.cpp @@ -34,5 +34,5 @@ AbsencePlugin::AbsencePlugin(QObject *parent) : void AbsencePlugin::attachTo(MainWindow &mainWindow) { for(auto stripsWidget : mainWindow.stripsWidgets()) - stripsWidget->headerLayout()->addWidget(new AbsenceWidget(stripsWidget)); + stripsWidget->headerLayout()->addWidget(new AbsenceWidget(*stripsWidget)); } diff --git a/plugins/absenceplugin/absenceplugin.pro b/plugins/absenceplugin/absenceplugin.pro index 4c1eaed..464f5ed 100644 --- a/plugins/absenceplugin/absenceplugin.pro +++ b/plugins/absenceplugin/absenceplugin.pro @@ -16,22 +16,20 @@ DEPENDPATH += $$PWD/$${PROJECT_ROOT}/zeiterfassungcorelib $$PWD/$${PROJECT_ROOT} DEFINES += QT_DEPRECATED_WARNINGS QT_DISABLE_DEPRECATED_BEFORE=0x060000 QT_MESSAGELOGCONTEXT -HEADERS += \ +HEADERS += absencedialog.h \ absenceplugin.h \ - absencewidget.h \ - absencedialog.h + absencewidget.h -SOURCES += \ +SOURCES += absencedialog.cpp \ absenceplugin.cpp \ - absencewidget.cpp \ - absencedialog.cpp + absencewidget.cpp -FORMS += \ - absencedialog.ui +FORMS += absencedialog.ui RESOURCES += absenceplugin_resources.qrc -TRANSLATIONS += +TRANSLATIONS += translations/absenceplugin_en.ts \ + translations/absenceplugin_de.ts OTHER_FILES += absenceplugin.json diff --git a/plugins/absenceplugin/absencewidget.cpp b/plugins/absenceplugin/absencewidget.cpp index 911e2c4..4e83ec9 100644 --- a/plugins/absenceplugin/absencewidget.cpp +++ b/plugins/absenceplugin/absencewidget.cpp @@ -1,9 +1,12 @@ #include "absencewidget.h" +#include "stripswidget.h" + #include "absencedialog.h" -AbsenceWidget::AbsenceWidget(QWidget *parent) : - QToolButton(parent) +AbsenceWidget::AbsenceWidget(StripsWidget &stripsWidget) : + QToolButton(&stripsWidget), + m_stripsWidget(stripsWidget) { setIcon(QIcon(QStringLiteral(":/zeiterfassung/plugins/absenceplugin/images/absence.png"))); setText(tr("Absence")); @@ -13,6 +16,6 @@ AbsenceWidget::AbsenceWidget(QWidget *parent) : void AbsenceWidget::pressedSlot() { - AbsenceDialog dialog(this); + AbsenceDialog dialog(m_stripsWidget.date(), this); dialog.exec(); } diff --git a/plugins/absenceplugin/absencewidget.h b/plugins/absenceplugin/absencewidget.h index eaec751..a93cc34 100644 --- a/plugins/absenceplugin/absencewidget.h +++ b/plugins/absenceplugin/absencewidget.h @@ -2,13 +2,18 @@ #include +class StripsWidget; + class AbsenceWidget : public QToolButton { Q_OBJECT public: - explicit AbsenceWidget(QWidget *parent = Q_NULLPTR); + explicit AbsenceWidget(StripsWidget &stripsWidget); private Q_SLOTS: void pressedSlot(); + +private: + StripsWidget &m_stripsWidget; }; diff --git a/plugins/absenceplugin/translations/absenceplugin_de.ts b/plugins/absenceplugin/translations/absenceplugin_de.ts new file mode 100644 index 0000000..a2ffce7 --- /dev/null +++ b/plugins/absenceplugin/translations/absenceplugin_de.ts @@ -0,0 +1,30 @@ + + + + + AbsenceDialog + + + Absences + Abwesenheiten + + + + Absences for %0 + Abwesenheiten für %0 + + + + dd.MM.yyyy + dd.MM.yyyy + + + + AbsenceWidget + + + Absence + Abwesenheit + + + diff --git a/plugins/absenceplugin/translations/absenceplugin_en.ts b/plugins/absenceplugin/translations/absenceplugin_en.ts new file mode 100644 index 0000000..a6f27b3 --- /dev/null +++ b/plugins/absenceplugin/translations/absenceplugin_en.ts @@ -0,0 +1,30 @@ + + + + + AbsenceDialog + + + Absences + + + + + Absences for %0 + + + + + dd.MM.yyyy + + + + + AbsenceWidget + + + Absence + + + + -- 2.50.1 From 0a96e22c66ea4d6c0bbc1c7769f4751733e749bd Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Thu, 28 Dec 2017 21:17:51 +0100 Subject: [PATCH 69/78] Fixed crash on app close in webradiodialog --- plugins/webradioplugin/webradiodialog.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/plugins/webradioplugin/webradiodialog.cpp b/plugins/webradioplugin/webradiodialog.cpp index 49d7ce3..0614825 100644 --- a/plugins/webradioplugin/webradiodialog.cpp +++ b/plugins/webradioplugin/webradiodialog.cpp @@ -7,8 +7,7 @@ WebRadioDialog::WebRadioDialog(MainWindow &mainWindow) : QDialog(&mainWindow), ui(new Ui::WebRadioDialog), - m_mainWindow(mainWindow), - m_player(new QMediaPlayer(this)) + m_mainWindow(mainWindow) { ui->setupUi(this); @@ -18,6 +17,7 @@ WebRadioDialog::WebRadioDialog(MainWindow &mainWindow) : setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); #endif + m_player = new QMediaPlayer(this); connect(m_player, &QMediaPlayer::stateChanged, this, &WebRadioDialog::stateChanged); connect(m_player, &QMediaPlayer::stateChanged, this, &WebRadioDialog::updateWidgets); connect(m_player, &QMediaPlayer::mediaStatusChanged, this, &WebRadioDialog::mediaStatusChanged); @@ -65,6 +65,13 @@ WebRadioDialog::WebRadioDialog(MainWindow &mainWindow) : WebRadioDialog::~WebRadioDialog() { + // To avoid crash on app close + disconnect(m_player, &QMediaPlayer::stateChanged, this, &WebRadioDialog::stateChanged); + disconnect(m_player, &QMediaPlayer::stateChanged, this, &WebRadioDialog::updateWidgets); + disconnect(m_player, &QMediaPlayer::mediaStatusChanged, this, &WebRadioDialog::mediaStatusChanged); + disconnect(m_player, &QMediaPlayer::mediaStatusChanged, this, &WebRadioDialog::updateWidgets); + disconnect(m_player, static_cast(&QMediaPlayer::error), this, &WebRadioDialog::error); + delete ui; } -- 2.50.1 From d624ca9719adbf6ce11e78cd875ccf0039a1ab70 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Thu, 28 Dec 2017 23:15:35 +0100 Subject: [PATCH 70/78] Fixed race condition with model not being assigned. --- plugins/devtoolsplugin/devtoolsplugin.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/plugins/devtoolsplugin/devtoolsplugin.cpp b/plugins/devtoolsplugin/devtoolsplugin.cpp index 3174313..58a1555 100644 --- a/plugins/devtoolsplugin/devtoolsplugin.cpp +++ b/plugins/devtoolsplugin/devtoolsplugin.cpp @@ -21,13 +21,12 @@ void myMessageHandler(QtMsgType type, const QMessageLogContext &context, const Q { previousHandler(type, context, message); - if(!model) - model = std::make_shared(); model->log(type, context.file, context.line, context.function, context.category, message); } void registerMessageHandler() { + model = std::make_shared(); previousHandler = qInstallMessageHandler(myMessageHandler); } @@ -58,5 +57,5 @@ void DevToolsPlugin::attachTo(MainWindow &mainWindow) auto dialog = new LogDialog(&mainWindow); dialog->setModel(model.get()); mainWindow.menuTools()->addAction(QIcon(QStringLiteral(":/zeiterfassung/plugins/devtoolsplugin/images/dev-tools.png")), - tr("Show log"), dialog, &QDialog::open); + tr("Show log"), dialog, &QWidget::show); } -- 2.50.1 From ac7ab6639e147ab859f5647f023024f80531d673 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Fri, 29 Dec 2017 01:56:17 +0100 Subject: [PATCH 71/78] Added AbsencesModel --- plugins/absenceplugin/absencedialog.cpp | 6 ++- plugins/absenceplugin/absencedialog.h | 4 +- plugins/absenceplugin/absenceplugin.pro | 2 + plugins/absenceplugin/absencesmodel.cpp | 49 +++++++++++++++++++++++++ plugins/absenceplugin/absencesmodel.h | 42 +++++++++++++++++++++ plugins/absenceplugin/absencewidget.cpp | 4 +- 6 files changed, 104 insertions(+), 3 deletions(-) create mode 100644 plugins/absenceplugin/absencesmodel.cpp create mode 100644 plugins/absenceplugin/absencesmodel.h diff --git a/plugins/absenceplugin/absencedialog.cpp b/plugins/absenceplugin/absencedialog.cpp index f80265a..5b92c91 100644 --- a/plugins/absenceplugin/absencedialog.cpp +++ b/plugins/absenceplugin/absencedialog.cpp @@ -3,7 +3,9 @@ #include -AbsenceDialog::AbsenceDialog(const QDate &date, QWidget *parent) : +#include "absencesmodel.h" + +AbsenceDialog::AbsenceDialog(int userId, const QDate &date, ZeiterfassungApi &erfassung, QWidget *parent) : QDialog(parent), ui(new Ui::AbsenceDialog) { @@ -16,6 +18,8 @@ AbsenceDialog::AbsenceDialog(const QDate &date, QWidget *parent) : #endif ui->labelTitle->setText(tr("Absences for %0").arg(date.toString(tr("dd.MM.yyyy")))); + + ui->treeView->setModel(new AbsencesModel(userId, date, erfassung, this)); } AbsenceDialog::~AbsenceDialog() diff --git a/plugins/absenceplugin/absencedialog.h b/plugins/absenceplugin/absencedialog.h index ceecb15..0f2b51a 100644 --- a/plugins/absenceplugin/absencedialog.h +++ b/plugins/absenceplugin/absencedialog.h @@ -4,6 +4,8 @@ class QDate; +class ZeiterfassungApi; + namespace Ui { class AbsenceDialog; } class AbsenceDialog : public QDialog @@ -11,7 +13,7 @@ class AbsenceDialog : public QDialog Q_OBJECT public: - explicit AbsenceDialog(const QDate &date, QWidget *parent = 0); + explicit AbsenceDialog(int userId, const QDate &date, ZeiterfassungApi &erfassung, QWidget *parent = 0); ~AbsenceDialog(); private: diff --git a/plugins/absenceplugin/absenceplugin.pro b/plugins/absenceplugin/absenceplugin.pro index 464f5ed..d938567 100644 --- a/plugins/absenceplugin/absenceplugin.pro +++ b/plugins/absenceplugin/absenceplugin.pro @@ -17,10 +17,12 @@ DEPENDPATH += $$PWD/$${PROJECT_ROOT}/zeiterfassungcorelib $$PWD/$${PROJECT_ROOT} DEFINES += QT_DEPRECATED_WARNINGS QT_DISABLE_DEPRECATED_BEFORE=0x060000 QT_MESSAGELOGCONTEXT HEADERS += absencedialog.h \ + absencesmodel.h \ absenceplugin.h \ absencewidget.h SOURCES += absencedialog.cpp \ + absencesmodel.cpp \ absenceplugin.cpp \ absencewidget.cpp diff --git a/plugins/absenceplugin/absencesmodel.cpp b/plugins/absenceplugin/absencesmodel.cpp new file mode 100644 index 0000000..f302efc --- /dev/null +++ b/plugins/absenceplugin/absencesmodel.cpp @@ -0,0 +1,49 @@ +#include "absencesmodel.h" + +#include "zeiterfassungapi.h" + +AbsencesModel::AbsencesModel(int userId, const QDate &date, ZeiterfassungApi &erfassung, QObject *parent) : + QAbstractListModel(parent), + m_userId(userId), + m_erfassung(erfassung) +{ + setDate(date); +} + +bool AbsencesModel::enabled() const +{ + return m_reply == Q_NULLPTR; +} + +int AbsencesModel::rowCount(const QModelIndex &parent) const +{ + +} + +int AbsencesModel::columnCount(const QModelIndex &parent) const +{ + +} + +QVariant AbsencesModel::data(const QModelIndex &index, int role) const +{ + +} + +QVariant AbsencesModel::headerData(int section, Qt::Orientation orientation, int role) const +{ + +} + +void AbsencesModel::setDate(const QDate &date) +{ + m_date = date; + + m_reply = m_erfassung.doGetAbsences(m_userId, m_date, m_date); + connect(m_reply.get(), &ZeiterfassungReply::finished, this, &AbsencesModel::finished); +} + +void AbsencesModel::finished() +{ + +} diff --git a/plugins/absenceplugin/absencesmodel.h b/plugins/absenceplugin/absencesmodel.h new file mode 100644 index 0000000..92541a3 --- /dev/null +++ b/plugins/absenceplugin/absencesmodel.h @@ -0,0 +1,42 @@ +#pragma once + +#include + +#include +#include + +#include "replies/getabsencesreply.h" + +class ZeiterfassungApi; + +class AbsencesModel : public QAbstractListModel +{ + Q_OBJECT + Q_PROPERTY(bool enabled READ enabled NOTIFY enabledChanged) + +public: + explicit AbsencesModel(int userId, const QDate &date, ZeiterfassungApi &erfassung, QObject *parent = Q_NULLPTR); + + bool enabled() const; + + // QAbstractItemModel interface + int rowCount(const QModelIndex &parent) const Q_DECL_OVERRIDE; + int columnCount(const QModelIndex &parent) const Q_DECL_OVERRIDE; + QVariant data(const QModelIndex &index, int role) const Q_DECL_OVERRIDE; + QVariant headerData(int section, Qt::Orientation orientation, int role) const Q_DECL_OVERRIDE; + +Q_SIGNALS: + void enabledChanged(bool enabled); + +public Q_SLOTS: + void setDate(const QDate &date); + +private Q_SLOTS: + void finished(); + +private: + int m_userId; + QDate m_date; + ZeiterfassungApi &m_erfassung; + std::unique_ptr m_reply; +}; diff --git a/plugins/absenceplugin/absencewidget.cpp b/plugins/absenceplugin/absencewidget.cpp index 4e83ec9..444f87f 100644 --- a/plugins/absenceplugin/absencewidget.cpp +++ b/plugins/absenceplugin/absencewidget.cpp @@ -1,6 +1,7 @@ #include "absencewidget.h" #include "stripswidget.h" +#include "mainwindow.h" #include "absencedialog.h" @@ -16,6 +17,7 @@ AbsenceWidget::AbsenceWidget(StripsWidget &stripsWidget) : void AbsenceWidget::pressedSlot() { - AbsenceDialog dialog(m_stripsWidget.date(), this); + AbsenceDialog dialog(m_stripsWidget.mainWindow().userInfo().userId, m_stripsWidget.date(), + m_stripsWidget.mainWindow().erfassung(), this); dialog.exec(); } -- 2.50.1 From 5d477e37891ad96609f1fe9c0a75644ecdabcc40 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Fri, 29 Dec 2017 01:58:15 +0100 Subject: [PATCH 72/78] Implemented GetAbsencesReply --- .../replies/getabsencesreply.cpp | 61 ++++++++++++++++++- 1 file changed, 60 insertions(+), 1 deletion(-) diff --git a/zeiterfassungcorelib/replies/getabsencesreply.cpp b/zeiterfassungcorelib/replies/getabsencesreply.cpp index 5832afc..a3340d3 100644 --- a/zeiterfassungcorelib/replies/getabsencesreply.cpp +++ b/zeiterfassungcorelib/replies/getabsencesreply.cpp @@ -1,5 +1,14 @@ #include "getabsencesreply.h" +#include +#include +#include +#include +#include +#include + +#include "zeiterfassungapi.h" + GetAbsencesReply::GetAbsencesReply(std::unique_ptr &&reply, ZeiterfassungApi *zeiterfassung) : ZeiterfassungReply(zeiterfassung), m_reply(std::move(reply)) @@ -14,5 +23,55 @@ const QVector &GetAbsencesReply::getAbsences() const void GetAbsencesReply::requestFinished() { - //TODO + 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_absences.clear(); + m_absences.reserve(arr.count()); + for(const auto &val : arr) + { + auto obj = val.toObject(); + + m_absences.append({ + obj.value(QStringLiteral("altRepresentative")).toInt(), + obj.value(QStringLiteral("compositeId")).toString(), + QDate::fromString(QString::number(obj.value(QStringLiteral("end")).toInt()), QStringLiteral("yyyyMMdd")), + 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")), + obj.value(QStringLiteral("text")).toString() + }); + } + } + + end: + m_reply = Q_NULLPTR; + + Q_EMIT finished(); } -- 2.50.1 From eaee8131cbc0a0472d06f35e58ada0d8bf3f84e4 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Fri, 29 Dec 2017 02:00:36 +0100 Subject: [PATCH 73/78] Fixed various missing includes --- plugins/lunchmealplugin/lunchmealwidget.cpp | 2 -- plugins/presenceplugin/presencewidget.cpp | 3 ++- plugins/reportsplugin/reportswidget.cpp | 1 + plugins/weatherplugin/weatherwidget.cpp | 3 +-- zeiterfassungcorelib/replies/getabsencesreply.h | 12 +++++++++++- zeiterfassungcorelib/replies/getbookingsreply.h | 1 + .../replies/gettimeassignmentsreply.h | 2 ++ zeiterfassungcorelib/replies/getuserinforeply.h | 2 ++ 8 files changed, 20 insertions(+), 6 deletions(-) diff --git a/plugins/lunchmealplugin/lunchmealwidget.cpp b/plugins/lunchmealplugin/lunchmealwidget.cpp index f93b4b5..62efaa9 100644 --- a/plugins/lunchmealplugin/lunchmealwidget.cpp +++ b/plugins/lunchmealplugin/lunchmealwidget.cpp @@ -35,8 +35,6 @@ void LunchMealWidget::pressedSlot() void LunchMealWidget::dateChanged(const QDate &date) { - qDebug() << "called"; - setEnabled(false); setVisible(false); diff --git a/plugins/presenceplugin/presencewidget.cpp b/plugins/presenceplugin/presencewidget.cpp index 190476d..ee7ddbb 100644 --- a/plugins/presenceplugin/presencewidget.cpp +++ b/plugins/presenceplugin/presencewidget.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include @@ -71,7 +72,7 @@ void PresenceWidget::finished() icon = QIcon(QStringLiteral(":zeiterfassung/plugins/presenceplugin/images/not-present.png")); } else - qWarning() << "unknown presence" << status.firstName << status.lastName << status.presence; + qCritical() << "unknown presence" << status.firstName << status.lastName << status.presence; m_menu->addAction(icon, tr("%0 %1").arg(status.firstName).arg(status.lastName)); } diff --git a/plugins/reportsplugin/reportswidget.cpp b/plugins/reportsplugin/reportswidget.cpp index b5292a1..30eba00 100644 --- a/plugins/reportsplugin/reportswidget.cpp +++ b/plugins/reportsplugin/reportswidget.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include diff --git a/plugins/weatherplugin/weatherwidget.cpp b/plugins/weatherplugin/weatherwidget.cpp index 4bdb88d..764bf99 100644 --- a/plugins/weatherplugin/weatherwidget.cpp +++ b/plugins/weatherplugin/weatherwidget.cpp @@ -3,8 +3,7 @@ #include #include #include -#include -#include +#include #include #include #include diff --git a/zeiterfassungcorelib/replies/getabsencesreply.h b/zeiterfassungcorelib/replies/getabsencesreply.h index 09ee07a..349714c 100644 --- a/zeiterfassungcorelib/replies/getabsencesreply.h +++ b/zeiterfassungcorelib/replies/getabsencesreply.h @@ -2,6 +2,8 @@ #include +#include +#include #include #include @@ -19,7 +21,15 @@ public: struct Absence { - //TODO + int altRepresentative; + QString compositeId; + QDate end; + QString hourCategory; + QString openMarking; + int persNr; + int representative; + QDate start; + QString text; }; const QVector &getAbsences() const; diff --git a/zeiterfassungcorelib/replies/getbookingsreply.h b/zeiterfassungcorelib/replies/getbookingsreply.h index 2272829..adb2836 100644 --- a/zeiterfassungcorelib/replies/getbookingsreply.h +++ b/zeiterfassungcorelib/replies/getbookingsreply.h @@ -2,6 +2,7 @@ #include +#include #include #include diff --git a/zeiterfassungcorelib/replies/gettimeassignmentsreply.h b/zeiterfassungcorelib/replies/gettimeassignmentsreply.h index cd97149..46a1cb5 100644 --- a/zeiterfassungcorelib/replies/gettimeassignmentsreply.h +++ b/zeiterfassungcorelib/replies/gettimeassignmentsreply.h @@ -2,6 +2,8 @@ #include +#include +#include #include #include diff --git a/zeiterfassungcorelib/replies/getuserinforeply.h b/zeiterfassungcorelib/replies/getuserinforeply.h index 7003506..0f4ecd5 100644 --- a/zeiterfassungcorelib/replies/getuserinforeply.h +++ b/zeiterfassungcorelib/replies/getuserinforeply.h @@ -2,6 +2,8 @@ #include +#include +#include #include #include "zeiterfassungcorelib_global.h" -- 2.50.1 From 582afff664ffd77b157d70520ca7b4d6455ab76c Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Fri, 29 Dec 2017 02:21:34 +0100 Subject: [PATCH 74/78] Implemented AbsenceModel --- plugins/absenceplugin/absencedialog.ui | 2 +- plugins/absenceplugin/absencesmodel.cpp | 66 +++++++++++++++++++ plugins/absenceplugin/absencesmodel.h | 2 + .../replies/getabsencesreply.cpp | 2 +- .../replies/getabsencesreply.h | 2 +- 5 files changed, 71 insertions(+), 3 deletions(-) diff --git a/plugins/absenceplugin/absencedialog.ui b/plugins/absenceplugin/absencedialog.ui index 41582c0..eb6a823 100644 --- a/plugins/absenceplugin/absencedialog.ui +++ b/plugins/absenceplugin/absencedialog.ui @@ -6,7 +6,7 @@ 0 0 - 400 + 947 300 diff --git a/plugins/absenceplugin/absencesmodel.cpp b/plugins/absenceplugin/absencesmodel.cpp index f302efc..77a0043 100644 --- a/plugins/absenceplugin/absencesmodel.cpp +++ b/plugins/absenceplugin/absencesmodel.cpp @@ -17,33 +17,99 @@ bool AbsencesModel::enabled() const int AbsencesModel::rowCount(const QModelIndex &parent) const { + Q_UNUSED(parent) + return m_absences.count(); } int AbsencesModel::columnCount(const QModelIndex &parent) const { + Q_UNUSED(parent) + return 9; } QVariant AbsencesModel::data(const QModelIndex &index, int role) const { + Q_ASSERT(index.row() < m_absences.count()); + const auto &absence = m_absences.at(index.row()); + switch(role) + { + case Qt::DisplayRole: + case Qt::EditRole: + switch(index.column()) + { + case 0: return absence.altRepresentative; + case 1: return absence.compositeId; + case 2: return absence.end; + case 3: return absence.hourCategory; + case 4: return absence.openMarking; + case 5: return absence.persNr; + case 6: return absence.representative; + case 7: return absence.start; + case 8: return absence.text; + } + } + + return QVariant(); } QVariant AbsencesModel::headerData(int section, Qt::Orientation orientation, int role) const { + switch(orientation) + { + case Qt::Horizontal: + switch(role) + { + case Qt::DisplayRole: + case Qt::EditRole: + switch(section) + { + case 0: return tr("altRepresentative"); + case 1: return tr("compositeId"); + case 2: return tr("end"); + case 3: return tr("hourCategory"); + case 4: return tr("openMarking"); + case 5: return tr("persNr"); + case 6: return tr("representative"); + case 7: return tr("start"); + case 8: return tr("text"); + } + } + default: + qt_noop(); + } + return QVariant(); } void AbsencesModel::setDate(const QDate &date) { m_date = date; + auto oldEnabled = enabled(); + m_reply = m_erfassung.doGetAbsences(m_userId, m_date, m_date); connect(m_reply.get(), &ZeiterfassungReply::finished, this, &AbsencesModel::finished); + + if(oldEnabled != enabled()) + Q_EMIT enabledChanged(enabled()); } void AbsencesModel::finished() { + if(!m_reply->success()) + Q_EMIT errorOccured(m_reply->message()); + beginResetModel(); + m_absences = m_reply->absences(); + endResetModel(); + + auto oldEnabled = enabled(); + + m_reply = Q_NULLPTR; + + if(oldEnabled != enabled()) + Q_EMIT enabledChanged(enabled()); } diff --git a/plugins/absenceplugin/absencesmodel.h b/plugins/absenceplugin/absencesmodel.h index 92541a3..0353e5e 100644 --- a/plugins/absenceplugin/absencesmodel.h +++ b/plugins/absenceplugin/absencesmodel.h @@ -27,6 +27,7 @@ public: Q_SIGNALS: void enabledChanged(bool enabled); + void errorOccured(const QString &message); public Q_SLOTS: void setDate(const QDate &date); @@ -39,4 +40,5 @@ private: QDate m_date; ZeiterfassungApi &m_erfassung; std::unique_ptr m_reply; + QVector m_absences; }; diff --git a/zeiterfassungcorelib/replies/getabsencesreply.cpp b/zeiterfassungcorelib/replies/getabsencesreply.cpp index a3340d3..107adc6 100644 --- a/zeiterfassungcorelib/replies/getabsencesreply.cpp +++ b/zeiterfassungcorelib/replies/getabsencesreply.cpp @@ -16,7 +16,7 @@ GetAbsencesReply::GetAbsencesReply(std::unique_ptr &&reply, Zeite connect(m_reply.get(), &QNetworkReply::finished, this, &GetAbsencesReply::requestFinished); } -const QVector &GetAbsencesReply::getAbsences() const +const QVector &GetAbsencesReply::absences() const { return m_absences; } diff --git a/zeiterfassungcorelib/replies/getabsencesreply.h b/zeiterfassungcorelib/replies/getabsencesreply.h index 349714c..1a8cbf4 100644 --- a/zeiterfassungcorelib/replies/getabsencesreply.h +++ b/zeiterfassungcorelib/replies/getabsencesreply.h @@ -32,7 +32,7 @@ public: QString text; }; - const QVector &getAbsences() const; + const QVector &absences() const; private Q_SLOTS: void requestFinished(); -- 2.50.1 From a5df54c003a3249a0f9c1036e26c2e7c821fd969 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Fri, 29 Dec 2017 02:31:23 +0100 Subject: [PATCH 75/78] Absences view not gets disables while loading --- plugins/absenceplugin/absencedialog.cpp | 14 ++++- plugins/absenceplugin/absencedialog.h | 6 ++ .../translations/absenceplugin_de.ts | 59 ++++++++++++++++++- .../translations/absenceplugin_en.ts | 59 ++++++++++++++++++- 4 files changed, 131 insertions(+), 7 deletions(-) diff --git a/plugins/absenceplugin/absencedialog.cpp b/plugins/absenceplugin/absencedialog.cpp index 5b92c91..a193d00 100644 --- a/plugins/absenceplugin/absencedialog.cpp +++ b/plugins/absenceplugin/absencedialog.cpp @@ -2,6 +2,8 @@ #include "ui_absencedialog.h" #include +#include +#include #include "absencesmodel.h" @@ -19,10 +21,20 @@ AbsenceDialog::AbsenceDialog(int userId, const QDate &date, ZeiterfassungApi &er ui->labelTitle->setText(tr("Absences for %0").arg(date.toString(tr("dd.MM.yyyy")))); - ui->treeView->setModel(new AbsencesModel(userId, date, erfassung, this)); + m_model = new AbsencesModel(userId, date, erfassung, this); + connect(m_model, &AbsencesModel::errorOccured, this, &AbsenceDialog::errorOccured); + + ui->treeView->setModel(m_model); + ui->treeView->setEnabled(m_model->enabled()); + connect(m_model, &AbsencesModel::enabledChanged, ui->treeView, &QWidget::setEnabled); } AbsenceDialog::~AbsenceDialog() { delete ui; } + +void AbsenceDialog::errorOccured(const QString &message) +{ + QMessageBox::warning(this, tr("Could not load absences!"), tr("Could not load absences!") % "\n\n" % message); +} diff --git a/plugins/absenceplugin/absencedialog.h b/plugins/absenceplugin/absencedialog.h index 0f2b51a..b93cbfc 100644 --- a/plugins/absenceplugin/absencedialog.h +++ b/plugins/absenceplugin/absencedialog.h @@ -6,6 +6,7 @@ class QDate; class ZeiterfassungApi; +class AbsencesModel; namespace Ui { class AbsenceDialog; } class AbsenceDialog : public QDialog @@ -16,6 +17,11 @@ public: explicit AbsenceDialog(int userId, const QDate &date, ZeiterfassungApi &erfassung, QWidget *parent = 0); ~AbsenceDialog(); +private Q_SLOTS: + void errorOccured(const QString &message); + private: Ui::AbsenceDialog *ui; + + AbsencesModel *m_model; }; diff --git a/plugins/absenceplugin/translations/absenceplugin_de.ts b/plugins/absenceplugin/translations/absenceplugin_de.ts index a2ffce7..8f0589b 100644 --- a/plugins/absenceplugin/translations/absenceplugin_de.ts +++ b/plugins/absenceplugin/translations/absenceplugin_de.ts @@ -9,22 +9,75 @@ Abwesenheiten - + Absences for %0 Abwesenheiten für %0 - + dd.MM.yyyy dd.MM.yyyy + + + Could not load absences! + Konnte Abwesenheiten nicht laden! + AbsenceWidget - + Absence Abwesenheit + + AbsencesModel + + + altRepresentative + + + + + compositeId + + + + + end + + + + + hourCategory + + + + + openMarking + + + + + persNr + + + + + representative + + + + + start + + + + + text + + + diff --git a/plugins/absenceplugin/translations/absenceplugin_en.ts b/plugins/absenceplugin/translations/absenceplugin_en.ts index a6f27b3..b02f346 100644 --- a/plugins/absenceplugin/translations/absenceplugin_en.ts +++ b/plugins/absenceplugin/translations/absenceplugin_en.ts @@ -9,22 +9,75 @@ - + Absences for %0 - + dd.MM.yyyy + + + Could not load absences! + + AbsenceWidget - + Absence + + AbsencesModel + + + altRepresentative + + + + + compositeId + + + + + end + + + + + hourCategory + + + + + openMarking + + + + + persNr + + + + + representative + + + + + start + + + + + text + + + -- 2.50.1 From 08e1043adfa67aa4c94b3a27a967169627e02085 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Fri, 29 Dec 2017 04:57:35 +0100 Subject: [PATCH 76/78] Added ZeiterfassungDialog --- plugins/absenceplugin/absencedialog.cpp | 8 +------- plugins/absenceplugin/absencedialog.h | 4 ++-- plugins/absenceplugin/absencedialog.ui | 2 +- zeiterfassungguilib/zeiterfassungdialog.cpp | 13 +++++++++++++ zeiterfassungguilib/zeiterfassungdialog.h | 13 +++++++++++++ zeiterfassungguilib/zeiterfassungguilib.pro | 2 ++ 6 files changed, 32 insertions(+), 10 deletions(-) create mode 100644 zeiterfassungguilib/zeiterfassungdialog.cpp create mode 100644 zeiterfassungguilib/zeiterfassungdialog.h diff --git a/plugins/absenceplugin/absencedialog.cpp b/plugins/absenceplugin/absencedialog.cpp index a193d00..e45b41b 100644 --- a/plugins/absenceplugin/absencedialog.cpp +++ b/plugins/absenceplugin/absencedialog.cpp @@ -8,17 +8,11 @@ #include "absencesmodel.h" AbsenceDialog::AbsenceDialog(int userId, const QDate &date, ZeiterfassungApi &erfassung, QWidget *parent) : - QDialog(parent), + ZeiterfassungDialog(parent), ui(new Ui::AbsenceDialog) { ui->setupUi(this); -#if (QT_VERSION >= QT_VERSION_CHECK(5, 9, 0)) - setWindowFlag(Qt::WindowContextHelpButtonHint, false); -#else - setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); -#endif - ui->labelTitle->setText(tr("Absences for %0").arg(date.toString(tr("dd.MM.yyyy")))); m_model = new AbsencesModel(userId, date, erfassung, this); diff --git a/plugins/absenceplugin/absencedialog.h b/plugins/absenceplugin/absencedialog.h index b93cbfc..f8d0721 100644 --- a/plugins/absenceplugin/absencedialog.h +++ b/plugins/absenceplugin/absencedialog.h @@ -1,6 +1,6 @@ #pragma once -#include +#include "zeiterfassungdialog.h" class QDate; @@ -9,7 +9,7 @@ class ZeiterfassungApi; class AbsencesModel; namespace Ui { class AbsenceDialog; } -class AbsenceDialog : public QDialog +class AbsenceDialog : public ZeiterfassungDialog { Q_OBJECT diff --git a/plugins/absenceplugin/absencedialog.ui b/plugins/absenceplugin/absencedialog.ui index eb6a823..718d0b2 100644 --- a/plugins/absenceplugin/absencedialog.ui +++ b/plugins/absenceplugin/absencedialog.ui @@ -1,7 +1,7 @@ AbsenceDialog - + 0 diff --git a/zeiterfassungguilib/zeiterfassungdialog.cpp b/zeiterfassungguilib/zeiterfassungdialog.cpp new file mode 100644 index 0000000..3b68510 --- /dev/null +++ b/zeiterfassungguilib/zeiterfassungdialog.cpp @@ -0,0 +1,13 @@ +#include "zeiterfassungdialog.h" + +#include + +ZeiterfassungDialog::ZeiterfassungDialog(QWidget *parent) : + QDialog(parent) +{ +#if (QT_VERSION >= QT_VERSION_CHECK(5, 9, 0)) + setWindowFlag(Qt::WindowContextHelpButtonHint, false); +#else + setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); +#endif +} diff --git a/zeiterfassungguilib/zeiterfassungdialog.h b/zeiterfassungguilib/zeiterfassungdialog.h new file mode 100644 index 0000000..30132e0 --- /dev/null +++ b/zeiterfassungguilib/zeiterfassungdialog.h @@ -0,0 +1,13 @@ +#pragma once + +#include + +#include "zeiterfassungguilib_global.h" + +class ZEITERFASSUNGGUILIBSHARED_EXPORT ZeiterfassungDialog : public QDialog +{ + Q_OBJECT + +public: + explicit ZeiterfassungDialog(QWidget *parent = Q_NULLPTR); +}; diff --git a/zeiterfassungguilib/zeiterfassungguilib.pro b/zeiterfassungguilib/zeiterfassungguilib.pro index 363bf9d..a3e9a2d 100644 --- a/zeiterfassungguilib/zeiterfassungguilib.pro +++ b/zeiterfassungguilib/zeiterfassungguilib.pro @@ -20,6 +20,7 @@ DEFINES += ZEITERFASSUNGGUILIB_LIBRARY SOURCES += mainwindow.cpp \ stripfactory.cpp \ stripswidget.cpp \ + zeiterfassungdialog.cpp \ zeiterfassungplugin.cpp \ dialogs/authenticationdialog.cpp \ dialogs/languageselectiondialog.cpp \ @@ -29,6 +30,7 @@ HEADERS += mainwindow.h \ stripfactory.h \ stripswidget.h \ zeiterfassungguilib_global.h \ + zeiterfassungdialog.h \ zeiterfassungplugin.h \ dialogs/authenticationdialog.h \ dialogs/languageselectiondialog.h \ -- 2.50.1 From 40323d19f7971bf94f1db2eca08277bd2c578d34 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Fri, 29 Dec 2017 12:37:40 +0100 Subject: [PATCH 77/78] Fixed #53 --- plugins/absenceplugin/absencedialog.ui | 2 +- plugins/advancedviewplugin/advancedviewdialog.cpp | 8 +------- plugins/advancedviewplugin/advancedviewdialog.h | 4 ++-- plugins/advancedviewplugin/dialogs/bookingdialog.cpp | 8 +------- plugins/advancedviewplugin/dialogs/bookingdialog.h | 5 +++-- .../advancedviewplugin/dialogs/timeassignmentdialog.cpp | 8 +------- plugins/advancedviewplugin/dialogs/timeassignmentdialog.h | 5 +++-- plugins/devtoolsplugin/logdialog.cpp | 8 +------- plugins/devtoolsplugin/logdialog.h | 4 ++-- plugins/lunchmealplugin/lunchmealdialog.cpp | 8 +------- plugins/lunchmealplugin/lunchmealdialog.h | 4 ++-- plugins/profileplugin/profiledialog.cpp | 8 +------- plugins/profileplugin/profiledialog.h | 5 ++--- plugins/updaterplugin/updaterdialog.cpp | 8 +------- plugins/updaterplugin/updaterdialog.h | 5 +++-- plugins/webradioplugin/webradiodialog.cpp | 8 +------- plugins/webradioplugin/webradiodialog.h | 5 +++-- zeiterfassungguilib/dialogs/authenticationdialog.cpp | 8 +------- zeiterfassungguilib/dialogs/authenticationdialog.h | 5 ++--- zeiterfassungguilib/dialogs/languageselectiondialog.cpp | 8 +------- zeiterfassungguilib/dialogs/languageselectiondialog.h | 4 ++-- zeiterfassungguilib/dialogs/settingsdialog.cpp | 8 +------- zeiterfassungguilib/dialogs/settingsdialog.h | 5 ++--- 23 files changed, 38 insertions(+), 103 deletions(-) diff --git a/plugins/absenceplugin/absencedialog.ui b/plugins/absenceplugin/absencedialog.ui index 718d0b2..eb6a823 100644 --- a/plugins/absenceplugin/absencedialog.ui +++ b/plugins/absenceplugin/absencedialog.ui @@ -1,7 +1,7 @@ AbsenceDialog - + 0 diff --git a/plugins/advancedviewplugin/advancedviewdialog.cpp b/plugins/advancedviewplugin/advancedviewdialog.cpp index f147ab5..7eb5ef4 100644 --- a/plugins/advancedviewplugin/advancedviewdialog.cpp +++ b/plugins/advancedviewplugin/advancedviewdialog.cpp @@ -22,7 +22,7 @@ #include "models/timeassignmentsmodel.h" AdvancedViewDialog::AdvancedViewDialog(StripsWidget &stripsWidget, QWidget *parent) : - QDialog(parent), + ZeiterfassungDialog(parent), ui(new Ui::AdvancedViewDialog), m_stripsWidget(stripsWidget), m_bookingsModel(new BookingsModel(stripsWidget, this)), @@ -30,12 +30,6 @@ AdvancedViewDialog::AdvancedViewDialog(StripsWidget &stripsWidget, QWidget *pare { ui->setupUi(this); -#if (QT_VERSION >= QT_VERSION_CHECK(5, 9, 0)) - setWindowFlag(Qt::WindowContextHelpButtonHint, false); -#else - setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); -#endif - ui->bookingsView->setModel(m_bookingsModel); ui->bookingsView->setEnabled(m_bookingsModel->enabled()); connect(m_bookingsModel, &BookingsModel::enabledChanged, ui->bookingsView, &QWidget::setEnabled); diff --git a/plugins/advancedviewplugin/advancedviewdialog.h b/plugins/advancedviewplugin/advancedviewdialog.h index 5f29b89..9a0c223 100644 --- a/plugins/advancedviewplugin/advancedviewdialog.h +++ b/plugins/advancedviewplugin/advancedviewdialog.h @@ -1,13 +1,13 @@ #pragma once -#include +#include "zeiterfassungdialog.h" namespace Ui { class AdvancedViewDialog; } class StripsWidget; class BookingsModel; class TimeAssignmentsModel; -class AdvancedViewDialog : public QDialog +class AdvancedViewDialog : public ZeiterfassungDialog { Q_OBJECT diff --git a/plugins/advancedviewplugin/dialogs/bookingdialog.cpp b/plugins/advancedviewplugin/dialogs/bookingdialog.cpp index 556839f..a2d42df 100644 --- a/plugins/advancedviewplugin/dialogs/bookingdialog.cpp +++ b/plugins/advancedviewplugin/dialogs/bookingdialog.cpp @@ -2,16 +2,10 @@ #include "ui_bookingdialog.h" BookingDialog::BookingDialog(QWidget *parent) : - QDialog(parent), + ZeiterfassungDialog(parent), ui(new Ui::BookingDialog) { ui->setupUi(this); - -#if (QT_VERSION >= QT_VERSION_CHECK(5, 9, 0)) - setWindowFlag(Qt::WindowContextHelpButtonHint, false); -#else - setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); -#endif } BookingDialog::~BookingDialog() diff --git a/plugins/advancedviewplugin/dialogs/bookingdialog.h b/plugins/advancedviewplugin/dialogs/bookingdialog.h index 6f16b7d..841a0db 100644 --- a/plugins/advancedviewplugin/dialogs/bookingdialog.h +++ b/plugins/advancedviewplugin/dialogs/bookingdialog.h @@ -1,11 +1,12 @@ #pragma once -#include #include +#include "zeiterfassungdialog.h" + namespace Ui { class BookingDialog; } -class BookingDialog : public QDialog +class BookingDialog : public ZeiterfassungDialog { Q_OBJECT diff --git a/plugins/advancedviewplugin/dialogs/timeassignmentdialog.cpp b/plugins/advancedviewplugin/dialogs/timeassignmentdialog.cpp index 575d2ca..35d074a 100644 --- a/plugins/advancedviewplugin/dialogs/timeassignmentdialog.cpp +++ b/plugins/advancedviewplugin/dialogs/timeassignmentdialog.cpp @@ -9,17 +9,11 @@ TimeAssignmentDialog::TimeAssignmentDialog(const QMap &projects, const ZeiterfassungSettings &settings, QWidget *parent) : - QDialog(parent), + ZeiterfassungDialog(parent), ui(new Ui::TimeAssignmentDialog) { ui->setupUi(this); -#if (QT_VERSION >= QT_VERSION_CHECK(5, 9, 0)) - setWindowFlag(Qt::WindowContextHelpButtonHint, false); -#else - setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); -#endif - { for(const auto &preferedProject : settings.projects()) { diff --git a/plugins/advancedviewplugin/dialogs/timeassignmentdialog.h b/plugins/advancedviewplugin/dialogs/timeassignmentdialog.h index 032a53f..916fd09 100644 --- a/plugins/advancedviewplugin/dialogs/timeassignmentdialog.h +++ b/plugins/advancedviewplugin/dialogs/timeassignmentdialog.h @@ -1,15 +1,16 @@ #pragma once -#include #include +#include "zeiterfassungdialog.h" + template class QMap; class ZeiterfassungSettings; namespace Ui { class TimeAssignmentDialog; } -class TimeAssignmentDialog : public QDialog +class TimeAssignmentDialog : public ZeiterfassungDialog { Q_OBJECT diff --git a/plugins/devtoolsplugin/logdialog.cpp b/plugins/devtoolsplugin/logdialog.cpp index f401579..6c4a34c 100644 --- a/plugins/devtoolsplugin/logdialog.cpp +++ b/plugins/devtoolsplugin/logdialog.cpp @@ -2,16 +2,10 @@ #include "ui_logdialog.h" LogDialog::LogDialog(QWidget *parent) : - QDialog(parent), + ZeiterfassungDialog(parent), ui(new Ui::LogDialog) { ui->setupUi(this); - -#if (QT_VERSION >= QT_VERSION_CHECK(5, 9, 0)) - setWindowFlag(Qt::WindowContextHelpButtonHint, false); -#else - setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); -#endif } LogDialog::~LogDialog() diff --git a/plugins/devtoolsplugin/logdialog.h b/plugins/devtoolsplugin/logdialog.h index 1ccd7bf..aea06e9 100644 --- a/plugins/devtoolsplugin/logdialog.h +++ b/plugins/devtoolsplugin/logdialog.h @@ -1,12 +1,12 @@ #pragma once -#include +#include "zeiterfassungdialog.h" class QAbstractItemModel; namespace Ui { class LogDialog; } -class LogDialog : public QDialog +class LogDialog : public ZeiterfassungDialog { Q_OBJECT diff --git a/plugins/lunchmealplugin/lunchmealdialog.cpp b/plugins/lunchmealplugin/lunchmealdialog.cpp index 2897bc1..972de57 100644 --- a/plugins/lunchmealplugin/lunchmealdialog.cpp +++ b/plugins/lunchmealplugin/lunchmealdialog.cpp @@ -4,17 +4,11 @@ #include LunchMealDialog::LunchMealDialog(const QDate &date, const QString &content, QWidget *parent) : - QDialog(parent), + ZeiterfassungDialog(parent), ui(new Ui::LunchMealDialog) { ui->setupUi(this); -#if (QT_VERSION >= QT_VERSION_CHECK(5, 9, 0)) - setWindowFlag(Qt::WindowContextHelpButtonHint, false); -#else - setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); -#endif - ui->labelTitle->setText(tr("Lunch meal for %0").arg(date.toString(tr("dd.MM.yyyy")))); ui->labelLunchMeal->setText(content); } diff --git a/plugins/lunchmealplugin/lunchmealdialog.h b/plugins/lunchmealplugin/lunchmealdialog.h index c0191ee..f20ceb8 100644 --- a/plugins/lunchmealplugin/lunchmealdialog.h +++ b/plugins/lunchmealplugin/lunchmealdialog.h @@ -1,6 +1,6 @@ #pragma once -#include +#include "zeiterfassungdialog.h" class QDate; @@ -8,7 +8,7 @@ class StripsWidget; namespace Ui { class LunchMealDialog; } -class LunchMealDialog : public QDialog +class LunchMealDialog : public ZeiterfassungDialog { Q_OBJECT diff --git a/plugins/profileplugin/profiledialog.cpp b/plugins/profileplugin/profiledialog.cpp index fae2c94..92bddae 100644 --- a/plugins/profileplugin/profiledialog.cpp +++ b/plugins/profileplugin/profiledialog.cpp @@ -2,17 +2,11 @@ #include "ui_profiledialog.h" ProfileDialog::ProfileDialog(const GetUserInfoReply::UserInfo &userInfo, QWidget *parent) : - QDialog(parent), + ZeiterfassungDialog(parent), ui(new Ui::ProfileDialog) { ui->setupUi(this); -#if (QT_VERSION >= QT_VERSION_CHECK(5, 9, 0)) - setWindowFlag(Qt::WindowContextHelpButtonHint, false); -#else - setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); -#endif - ui->spinBoxUserId->setValue(userInfo.userId); ui->lineEditEmail->setText(userInfo.email); ui->lineEditLongUsername->setText(userInfo.longUsername); diff --git a/plugins/profileplugin/profiledialog.h b/plugins/profileplugin/profiledialog.h index c3ea218..3725fd7 100644 --- a/plugins/profileplugin/profiledialog.h +++ b/plugins/profileplugin/profiledialog.h @@ -1,12 +1,11 @@ #pragma once -#include - +#include "zeiterfassungdialog.h" #include "replies/getuserinforeply.h" namespace Ui { class ProfileDialog; } -class ProfileDialog : public QDialog +class ProfileDialog : public ZeiterfassungDialog { Q_OBJECT diff --git a/plugins/updaterplugin/updaterdialog.cpp b/plugins/updaterplugin/updaterdialog.cpp index b890a90..61b3b62 100644 --- a/plugins/updaterplugin/updaterdialog.cpp +++ b/plugins/updaterplugin/updaterdialog.cpp @@ -19,18 +19,12 @@ #include "zeiterfassungapi.h" UpdaterDialog::UpdaterDialog(MainWindow &mainWindow) : - QDialog(&mainWindow), + ZeiterfassungDialog(&mainWindow), ui(new Ui::UpdaterDialog), m_mainWindow(mainWindow) { ui->setupUi(this); -#if (QT_VERSION >= QT_VERSION_CHECK(5, 9, 0)) - setWindowFlag(Qt::WindowContextHelpButtonHint, false); -#else - setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); -#endif - setAttribute(Qt::WA_DeleteOnClose); connect(ui->buttonBox, &QDialogButtonBox::accepted, this, &UpdaterDialog::acceptedSlot); diff --git a/plugins/updaterplugin/updaterdialog.h b/plugins/updaterplugin/updaterdialog.h index ba3b40a..2ea7560 100644 --- a/plugins/updaterplugin/updaterdialog.h +++ b/plugins/updaterplugin/updaterdialog.h @@ -1,14 +1,15 @@ #pragma once -#include #include +#include "zeiterfassungdialog.h" + class QNetworkReply; namespace Ui { class UpdaterDialog; } class MainWindow; -class UpdaterDialog : public QDialog +class UpdaterDialog : public ZeiterfassungDialog { Q_OBJECT diff --git a/plugins/webradioplugin/webradiodialog.cpp b/plugins/webradioplugin/webradiodialog.cpp index 0614825..fd5e855 100644 --- a/plugins/webradioplugin/webradiodialog.cpp +++ b/plugins/webradioplugin/webradiodialog.cpp @@ -5,18 +5,12 @@ #include "zeiterfassungsettings.h" WebRadioDialog::WebRadioDialog(MainWindow &mainWindow) : - QDialog(&mainWindow), + ZeiterfassungDialog(&mainWindow), ui(new Ui::WebRadioDialog), m_mainWindow(mainWindow) { ui->setupUi(this); -#if (QT_VERSION >= QT_VERSION_CHECK(5, 9, 0)) - setWindowFlag(Qt::WindowContextHelpButtonHint, false); -#else - setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); -#endif - m_player = new QMediaPlayer(this); connect(m_player, &QMediaPlayer::stateChanged, this, &WebRadioDialog::stateChanged); connect(m_player, &QMediaPlayer::stateChanged, this, &WebRadioDialog::updateWidgets); diff --git a/plugins/webradioplugin/webradiodialog.h b/plugins/webradioplugin/webradiodialog.h index 5529756..6dbda8d 100644 --- a/plugins/webradioplugin/webradiodialog.h +++ b/plugins/webradioplugin/webradiodialog.h @@ -1,13 +1,14 @@ #pragma once -#include #include +#include "zeiterfassungdialog.h" + class MainWindow; namespace Ui { class WebRadioDialog; } -class WebRadioDialog : public QDialog +class WebRadioDialog : public ZeiterfassungDialog { Q_OBJECT diff --git a/zeiterfassungguilib/dialogs/authenticationdialog.cpp b/zeiterfassungguilib/dialogs/authenticationdialog.cpp index d705e31..d4dbfd2 100644 --- a/zeiterfassungguilib/dialogs/authenticationdialog.cpp +++ b/zeiterfassungguilib/dialogs/authenticationdialog.cpp @@ -2,16 +2,10 @@ #include "ui_authenticationdialog.h" AuthenticationDialog::AuthenticationDialog(QWidget *parent) : - QDialog(parent), + ZeiterfassungDialog(parent), ui(new Ui::AuthenticationDialog) { ui->setupUi(this); - -#if (QT_VERSION >= QT_VERSION_CHECK(5, 9, 0)) - setWindowFlag(Qt::WindowContextHelpButtonHint, false); -#else - setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); -#endif } AuthenticationDialog::~AuthenticationDialog() diff --git a/zeiterfassungguilib/dialogs/authenticationdialog.h b/zeiterfassungguilib/dialogs/authenticationdialog.h index 128b25b..af0e49f 100644 --- a/zeiterfassungguilib/dialogs/authenticationdialog.h +++ b/zeiterfassungguilib/dialogs/authenticationdialog.h @@ -1,12 +1,11 @@ #pragma once -#include - #include "zeiterfassungguilib_global.h" +#include "zeiterfassungdialog.h" namespace Ui { class AuthenticationDialog; } -class ZEITERFASSUNGGUILIBSHARED_EXPORT AuthenticationDialog : public QDialog +class ZEITERFASSUNGGUILIBSHARED_EXPORT AuthenticationDialog : public ZeiterfassungDialog { Q_OBJECT diff --git a/zeiterfassungguilib/dialogs/languageselectiondialog.cpp b/zeiterfassungguilib/dialogs/languageselectiondialog.cpp index 86a3e6b..c39f5bc 100644 --- a/zeiterfassungguilib/dialogs/languageselectiondialog.cpp +++ b/zeiterfassungguilib/dialogs/languageselectiondialog.cpp @@ -2,17 +2,11 @@ #include "ui_languageselectiondialog.h" LanguageSelectionDialog::LanguageSelectionDialog(QWidget *parent) : - QDialog(parent), + ZeiterfassungDialog(parent), ui(new Ui::LanguageSelectionDialog) { ui->setupUi(this); -#if (QT_VERSION >= QT_VERSION_CHECK(5, 9, 0)) - setWindowFlag(Qt::WindowContextHelpButtonHint, false); -#else - setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); -#endif - ui->comboBoxLanguage->addItem(tr("English"), QLocale::English); ui->comboBoxLanguage->addItem(tr("German"), QLocale::German); } diff --git a/zeiterfassungguilib/dialogs/languageselectiondialog.h b/zeiterfassungguilib/dialogs/languageselectiondialog.h index 121e177..f2d01c9 100644 --- a/zeiterfassungguilib/dialogs/languageselectiondialog.h +++ b/zeiterfassungguilib/dialogs/languageselectiondialog.h @@ -1,13 +1,13 @@ #pragma once -#include #include #include "zeiterfassungguilib_global.h" +#include "zeiterfassungdialog.h" namespace Ui { class LanguageSelectionDialog; } -class ZEITERFASSUNGGUILIBSHARED_EXPORT LanguageSelectionDialog : public QDialog +class ZEITERFASSUNGGUILIBSHARED_EXPORT LanguageSelectionDialog : public ZeiterfassungDialog { Q_OBJECT diff --git a/zeiterfassungguilib/dialogs/settingsdialog.cpp b/zeiterfassungguilib/dialogs/settingsdialog.cpp index f9e5c66..ea84650 100644 --- a/zeiterfassungguilib/dialogs/settingsdialog.cpp +++ b/zeiterfassungguilib/dialogs/settingsdialog.cpp @@ -11,18 +11,12 @@ #include "zeiterfassungsettings.h" SettingsDialog::SettingsDialog(ZeiterfassungSettings &settings, QWidget *parent) : - QDialog(parent), + ZeiterfassungDialog(parent), ui(new Ui::SettingsDialog), m_settings(settings) { ui->setupUi(this); -#if (QT_VERSION >= QT_VERSION_CHECK(5, 9, 0)) - setWindowFlag(Qt::WindowContextHelpButtonHint, false); -#else - setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); -#endif - ui->comboBoxLanguage->addItem(tr("English"), QLocale::English); ui->comboBoxLanguage->addItem(tr("German"), QLocale::German); diff --git a/zeiterfassungguilib/dialogs/settingsdialog.h b/zeiterfassungguilib/dialogs/settingsdialog.h index bec947a..3315276 100644 --- a/zeiterfassungguilib/dialogs/settingsdialog.h +++ b/zeiterfassungguilib/dialogs/settingsdialog.h @@ -1,13 +1,12 @@ #pragma once -#include - #include "zeiterfassungguilib_global.h" +#include "zeiterfassungdialog.h" class ZeiterfassungSettings; namespace Ui { class SettingsDialog; } -class ZEITERFASSUNGGUILIBSHARED_EXPORT SettingsDialog : public QDialog +class ZEITERFASSUNGGUILIBSHARED_EXPORT SettingsDialog : public ZeiterfassungDialog { Q_OBJECT -- 2.50.1 From 4f25c6eea9a538660d80cfaaf99dbb52ccdee12d Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Fri, 29 Dec 2017 12:40:11 +0100 Subject: [PATCH 78/78] Removed devel branch logo from README.md --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 766db01..2e8affb 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,7 @@ # Zeiterfassung This tool helps me assigning my working hours to projects at work. -master: [![Build Status of master](https://travis-ci.org/0xFEEDC0DE64/QtZeiterfassung.svg?branch=master)](https://travis-ci.org/0xFEEDC0DE64/QtZeiterfassung) -devel: [![Build Status of devel](https://travis-ci.org/0xFEEDC0DE64/QtZeiterfassung.svg?branch=devel)](https://travis-ci.org/0xFEEDC0DE64/QtZeiterfassung) +[![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