From 617768ed1f582c22e9585578769b66089aea7134 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Thu, 7 Dec 2017 00:23:20 +0100 Subject: [PATCH 1/7] Added lastUpdateCheck to settings --- zeiterfassungsettings.cpp | 10 ++++++++++ zeiterfassungsettings.h | 6 ++++++ 2 files changed, 16 insertions(+) diff --git a/zeiterfassungsettings.cpp b/zeiterfassungsettings.cpp index ae71a73..73a90f7 100644 --- a/zeiterfassungsettings.cpp +++ b/zeiterfassungsettings.cpp @@ -172,6 +172,16 @@ void ZeiterfassungSettings::setTimeAssignmentBackgroundColor(const QString timeA setValue("timeAssignmentBackgroundColor", timeAssignmentBackgroundColor); } +QDate ZeiterfassungSettings::lastUpdateCheck() const +{ + return value("lastUpdateCheck").toDate(); +} + +void ZeiterfassungSettings::setLastUpdateCheck(const QDate &lastUpdateCheck) +{ + setValue("lastUpdateCheck", lastUpdateCheck); +} + void ZeiterfassungSettings::prepentItem(const QString &name, const QString &item) { if(item.trimmed().isEmpty()) diff --git a/zeiterfassungsettings.h b/zeiterfassungsettings.h index 80793d0..1ea6932 100644 --- a/zeiterfassungsettings.h +++ b/zeiterfassungsettings.h @@ -3,6 +3,9 @@ #include #include +#include +#include +#include class ZeiterfassungSettings : public QSettings { @@ -58,6 +61,9 @@ public: QString timeAssignmentBackgroundColor() const; void setTimeAssignmentBackgroundColor(const QString timeAssignmentBackgroundColor); + QDate lastUpdateCheck() const; + void setLastUpdateCheck(const QDate &lastUpdateCheck); + private: void prepentItem(const QString &name, const QString &item); }; -- 2.50.1 From 6c974cec10b7c78f0655cc69bf9ac799656f5389 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Thu, 7 Dec 2017 00:24:00 +0100 Subject: [PATCH 2/7] Added UpdateDialog --- dialogs/updatedialog.cpp | 14 ++++++++ dialogs/updatedialog.h | 20 +++++++++++ dialogs/updatedialog.ui | 71 ++++++++++++++++++++++++++++++++++++++++ zeiterfassung.pro | 9 +++-- 4 files changed, 111 insertions(+), 3 deletions(-) create mode 100644 dialogs/updatedialog.cpp create mode 100644 dialogs/updatedialog.h create mode 100644 dialogs/updatedialog.ui diff --git a/dialogs/updatedialog.cpp b/dialogs/updatedialog.cpp new file mode 100644 index 0000000..78bad08 --- /dev/null +++ b/dialogs/updatedialog.cpp @@ -0,0 +1,14 @@ +#include "updatedialog.h" +#include "ui_updatedialog.h" + +UpdateDialog::UpdateDialog(QWidget *parent) : + QDialog(parent), + ui(new Ui::UpdateDialog) +{ + ui->setupUi(this); +} + +UpdateDialog::~UpdateDialog() +{ + delete ui; +} diff --git a/dialogs/updatedialog.h b/dialogs/updatedialog.h new file mode 100644 index 0000000..abf3a74 --- /dev/null +++ b/dialogs/updatedialog.h @@ -0,0 +1,20 @@ +#ifndef UPDATEDIALOG_H +#define UPDATEDIALOG_H + +#include + +namespace Ui { class UpdateDialog; } + +class UpdateDialog : public QDialog +{ + Q_OBJECT + +public: + explicit UpdateDialog(QWidget *parent = 0); + ~UpdateDialog(); + +private: + Ui::UpdateDialog *ui; +}; + +#endif // UPDATEDIALOG_H diff --git a/dialogs/updatedialog.ui b/dialogs/updatedialog.ui new file mode 100644 index 0000000..f25d591 --- /dev/null +++ b/dialogs/updatedialog.ui @@ -0,0 +1,71 @@ + + + + + UpdateDialog + + + + 0 + 0 + 400 + 300 + + + + Dialog + + + + + 30 + 240 + 341 + 32 + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + buttonBox + accepted() + UpdateDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + UpdateDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/zeiterfassung.pro b/zeiterfassung.pro index 8225a79..67d3fc7 100755 --- a/zeiterfassung.pro +++ b/zeiterfassung.pro @@ -30,7 +30,8 @@ SOURCES += main.cpp \ strips/timeassignmentstrip.cpp \ dialogs/bookingdialog.cpp \ models/bookingsmodel.cpp \ - strips/bookingstrip.cpp + strips/bookingstrip.cpp \ + dialogs/updatedialog.cpp HEADERS += \ zeiterfassung.h \ @@ -46,7 +47,8 @@ HEADERS += \ strips/timeassignmentstrip.h \ dialogs/bookingdialog.h \ models/bookingsmodel.h \ - strips/bookingstrip.h + strips/bookingstrip.h \ + dialogs/updatedialog.h FORMS += \ mainwindow.ui \ @@ -57,7 +59,8 @@ FORMS += \ dialogs/timeassignmentdialog.ui \ strips/timeassignmentstrip.ui \ dialogs/bookingdialog.ui \ - strips/bookingstrip.ui + strips/bookingstrip.ui \ + dialogs/updatedialog.ui RESOURCES += \ resources.qrc -- 2.50.1 From 5d5ce3a74243ada243579ed4cb3d0853fa36b2cb Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Thu, 7 Dec 2017 00:27:39 +0100 Subject: [PATCH 3/7] MainWindow now instantiates UpdateDialog --- dialogs/updatedialog.cpp | 5 +++-- dialogs/updatedialog.h | 6 +++++- mainwindow.cpp | 4 ++++ zeiterfassung.cpp | 5 +++++ zeiterfassung.h | 2 ++ 5 files changed, 19 insertions(+), 3 deletions(-) diff --git a/dialogs/updatedialog.cpp b/dialogs/updatedialog.cpp index 78bad08..2f10593 100644 --- a/dialogs/updatedialog.cpp +++ b/dialogs/updatedialog.cpp @@ -1,9 +1,10 @@ #include "updatedialog.h" #include "ui_updatedialog.h" -UpdateDialog::UpdateDialog(QWidget *parent) : +UpdateDialog::UpdateDialog(ZeiterfassungSettings &settings, QNetworkAccessManager *manager, QWidget *parent) : QDialog(parent), - ui(new Ui::UpdateDialog) + ui(new Ui::UpdateDialog), + m_settings(settings) { ui->setupUi(this); } diff --git a/dialogs/updatedialog.h b/dialogs/updatedialog.h index abf3a74..1f06229 100644 --- a/dialogs/updatedialog.h +++ b/dialogs/updatedialog.h @@ -3,6 +3,9 @@ #include +class QNetworkAccessManager; + +class ZeiterfassungSettings; namespace Ui { class UpdateDialog; } class UpdateDialog : public QDialog @@ -10,11 +13,12 @@ class UpdateDialog : public QDialog Q_OBJECT public: - explicit UpdateDialog(QWidget *parent = 0); + explicit UpdateDialog(ZeiterfassungSettings &settings, QNetworkAccessManager *manager, QWidget *parent = 0); ~UpdateDialog(); private: Ui::UpdateDialog *ui; + ZeiterfassungSettings &m_settings; }; #endif // UPDATEDIALOG_H diff --git a/mainwindow.cpp b/mainwindow.cpp index ada0553..33ac7ea 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -20,6 +20,7 @@ #include "dialogs/bookingdialog.h" #include "dialogs/timeassignmentdialog.h" #include "dialogs/settingsdialog.h" +#include "dialogs/updatedialog.h" #include "strips/bookingstrip.h" #include "strips/timeassignmentstrip.h" #include "models/bookingsmodel.h" @@ -112,6 +113,9 @@ MainWindow::MainWindow(ZeiterfassungSettings &settings, Zeiterfassung &erfassung m_holidaysLabel->setFrameShadow(QFrame::Sunken); refresh(true); + + if(settings.lastUpdateCheck().isNull() || settings.lastUpdateCheck() < QDate::currentDate()) + new UpdateDialog(settings, erfassung.manager(), this); } MainWindow::~MainWindow() diff --git a/zeiterfassung.cpp b/zeiterfassung.cpp index 97bd4f3..34932df 100644 --- a/zeiterfassung.cpp +++ b/zeiterfassung.cpp @@ -33,6 +33,11 @@ void Zeiterfassung::setUrl(const QString &url) Q_EMIT urlChanged(m_url = url); } +QNetworkAccessManager *Zeiterfassung::manager() const +{ + return m_manager; +} + bool Zeiterfassung::doLoginPage() { if(m_replies.login) diff --git a/zeiterfassung.h b/zeiterfassung.h index 18a23e0..6349414 100644 --- a/zeiterfassung.h +++ b/zeiterfassung.h @@ -21,6 +21,8 @@ public: const QString &url() const; void setUrl(const QString &url); + QNetworkAccessManager *manager() const; + struct UserInfo { int userId; -- 2.50.1 From 5a8d05c565e9710898870e6b1c11ffd6066a0651 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Thu, 7 Dec 2017 00:30:03 +0100 Subject: [PATCH 4/7] UpdateDialog now starts GET request to GitHub API --- dialogs/updatedialog.cpp | 19 +++++++++++++++++++ dialogs/updatedialog.h | 5 +++++ 2 files changed, 24 insertions(+) diff --git a/dialogs/updatedialog.cpp b/dialogs/updatedialog.cpp index 2f10593..1719774 100644 --- a/dialogs/updatedialog.cpp +++ b/dialogs/updatedialog.cpp @@ -1,15 +1,34 @@ #include "updatedialog.h" #include "ui_updatedialog.h" +#include +#include +#include +#include + UpdateDialog::UpdateDialog(ZeiterfassungSettings &settings, QNetworkAccessManager *manager, QWidget *parent) : QDialog(parent), ui(new Ui::UpdateDialog), m_settings(settings) { ui->setupUi(this); + + m_reply = manager->get(QNetworkRequest(QUrl(QStringLiteral("https://api.github.com/repos/0xFEEDC0DE64/QtZeiterfassung/releases")))); + connect(m_reply, &QNetworkReply::finished, this, &UpdateDialog::finished); } UpdateDialog::~UpdateDialog() { delete ui; } + +void UpdateDialog::finished() +{ + if(m_reply->error() != QNetworkReply::NoError) + { + qWarning() << m_reply->error() << m_reply->errorString(); + return; + } + + qDebug() << m_reply->readAll(); +} diff --git a/dialogs/updatedialog.h b/dialogs/updatedialog.h index 1f06229..d162208 100644 --- a/dialogs/updatedialog.h +++ b/dialogs/updatedialog.h @@ -4,6 +4,7 @@ #include class QNetworkAccessManager; +class QNetworkReply; class ZeiterfassungSettings; namespace Ui { class UpdateDialog; } @@ -16,9 +17,13 @@ public: explicit UpdateDialog(ZeiterfassungSettings &settings, QNetworkAccessManager *manager, QWidget *parent = 0); ~UpdateDialog(); +private Q_SLOTS: + void finished(); + private: Ui::UpdateDialog *ui; ZeiterfassungSettings &m_settings; + QNetworkReply *m_reply; }; #endif // UPDATEDIALOG_H -- 2.50.1 From e4d8f61f1924ec99ad4e467259b84fff208f195e Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Thu, 7 Dec 2017 00:32:26 +0100 Subject: [PATCH 5/7] Added json parsing to update dialog --- dialogs/updatedialog.cpp | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/dialogs/updatedialog.cpp b/dialogs/updatedialog.cpp index 1719774..3e24bff 100644 --- a/dialogs/updatedialog.cpp +++ b/dialogs/updatedialog.cpp @@ -5,6 +5,11 @@ #include #include #include +#include +#include +#include +#include +#include UpdateDialog::UpdateDialog(ZeiterfassungSettings &settings, QNetworkAccessManager *manager, QWidget *parent) : QDialog(parent), @@ -26,9 +31,29 @@ void UpdateDialog::finished() { if(m_reply->error() != QNetworkReply::NoError) { - qWarning() << m_reply->error() << m_reply->errorString(); + qWarning() << "request error" << m_reply->error() << m_reply->errorString(); return; } - qDebug() << m_reply->readAll(); + QJsonParseError error; + auto document = QJsonDocument::fromJson(m_reply->readAll(), &error); + + if(error.error != QJsonParseError::NoError) + { + qWarning() << "parse error" << error.error << error.errorString(); + return; + } + + if(!document.isArray()) + { + qWarning() << "document is not an array!"; + return; + } + + auto array = document.array(); + + for(const auto &releaseVal : array) + { + qDebug() << releaseVal; + } } -- 2.50.1 From 78da01e53e9ffbee4d88e264bdc86ccc930affa2 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Thu, 7 Dec 2017 00:34:29 +0100 Subject: [PATCH 6/7] Added version compare --- dialogs/updatedialog.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/dialogs/updatedialog.cpp b/dialogs/updatedialog.cpp index 3e24bff..0e252e7 100644 --- a/dialogs/updatedialog.cpp +++ b/dialogs/updatedialog.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -50,10 +51,15 @@ void UpdateDialog::finished() return; } + auto appVersion = QVersionNumber::fromString(QCoreApplication::applicationVersion()); + auto array = document.array(); for(const auto &releaseVal : array) { - qDebug() << releaseVal; + auto releaseObj = releaseVal.toObject(); + auto version = QVersionNumber::fromString(releaseObj.value("tag_name").toString()); + + qDebug() << version << (appVersion < version); } } -- 2.50.1 From d045466017cffcc8873ad7a2cdba481d91d1d6b0 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Thu, 7 Dec 2017 00:51:45 +0100 Subject: [PATCH 7/7] Implemented UpdateDialog --- dialogs/updatedialog.cpp | 35 ++++++++++- dialogs/updatedialog.h | 4 ++ dialogs/updatedialog.ui | 131 ++++++++++++++++++++++----------------- mainwindow.ui | 4 +- 4 files changed, 115 insertions(+), 59 deletions(-) diff --git a/dialogs/updatedialog.cpp b/dialogs/updatedialog.cpp index 0e252e7..0236d0f 100644 --- a/dialogs/updatedialog.cpp +++ b/dialogs/updatedialog.cpp @@ -11,6 +11,10 @@ #include #include #include +#include +#include + +#include "zeiterfassungsettings.h" UpdateDialog::UpdateDialog(ZeiterfassungSettings &settings, QNetworkAccessManager *manager, QWidget *parent) : QDialog(parent), @@ -19,6 +23,15 @@ UpdateDialog::UpdateDialog(ZeiterfassungSettings &settings, QNetworkAccessManage { ui->setupUi(this); + setAttribute(Qt::WA_DeleteOnClose); + + connect(ui->buttonBox, &QDialogButtonBox::accepted, this, &UpdateDialog::submit); + connect(ui->buttonBox, &QDialogButtonBox::rejected, this, [=](){ + if(ui->checkBoxDontShow->isChecked()) + m_settings.setLastUpdateCheck(QDate::currentDate()); + reject(); + }); + m_reply = manager->get(QNetworkRequest(QUrl(QStringLiteral("https://api.github.com/repos/0xFEEDC0DE64/QtZeiterfassung/releases")))); connect(m_reply, &QNetworkReply::finished, this, &UpdateDialog::finished); } @@ -60,6 +73,26 @@ void UpdateDialog::finished() auto releaseObj = releaseVal.toObject(); auto version = QVersionNumber::fromString(releaseObj.value("tag_name").toString()); - qDebug() << version << (appVersion < version); + if(appVersion < version) + { + m_url = QUrl(releaseObj.value("html_url").toString()); + ui->labelDescription->setText(releaseObj.value("body").toString()); + + show(); + return; + } } + + deleteLater(); +} + +void UpdateDialog::submit() +{ + if(ui->checkBoxDontShow->isChecked()) + m_settings.setLastUpdateCheck(QDate::currentDate()); + + if(!QDesktopServices::openUrl(m_url)) + QMessageBox::warning(this, tr("Could not open default webbrowser!"), tr("Could not open default webbrowser!")); + + accept(); } diff --git a/dialogs/updatedialog.h b/dialogs/updatedialog.h index d162208..7f7b836 100644 --- a/dialogs/updatedialog.h +++ b/dialogs/updatedialog.h @@ -2,6 +2,7 @@ #define UPDATEDIALOG_H #include +#include class QNetworkAccessManager; class QNetworkReply; @@ -19,11 +20,14 @@ public: private Q_SLOTS: void finished(); + void submit(); private: Ui::UpdateDialog *ui; ZeiterfassungSettings &m_settings; QNetworkReply *m_reply; + + QUrl m_url; }; #endif // UPDATEDIALOG_H diff --git a/dialogs/updatedialog.ui b/dialogs/updatedialog.ui index f25d591..a130bde 100644 --- a/dialogs/updatedialog.ui +++ b/dialogs/updatedialog.ui @@ -1,71 +1,90 @@ + - - - UpdateDialog 0 0 - 400 - 300 + 447 + 280 Dialog - - - - 30 - 240 - 341 - 32 - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - + + + + + + 20 + + + + New update available! + + + + + + + There is a new release available to download! + + + + + + + QFrame::WinPanel + + + QFrame::Sunken + + + TextLabel + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Dont show today anymore + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + - - - - buttonBox - accepted() - UpdateDialog - accept() - - - 248 - 254 - - - 157 - 274 - - - - - buttonBox - rejected() - UpdateDialog - reject() - - - 316 - 260 - - - 286 - 274 - - - - + diff --git a/mainwindow.ui b/mainwindow.ui index 9c5f41d..a0f6776 100644 --- a/mainwindow.ui +++ b/mainwindow.ui @@ -196,7 +196,7 @@ 0 0 1220 - 438 + 454 @@ -258,7 +258,7 @@ 0 0 1242 - 26 + 22 -- 2.50.1