diff --git a/dialogs/updatedialog.cpp b/dialogs/updatedialog.cpp new file mode 100644 index 0000000..0236d0f --- /dev/null +++ b/dialogs/updatedialog.cpp @@ -0,0 +1,98 @@ +#include "updatedialog.h" +#include "ui_updatedialog.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "zeiterfassungsettings.h" + +UpdateDialog::UpdateDialog(ZeiterfassungSettings &settings, QNetworkAccessManager *manager, QWidget *parent) : + QDialog(parent), + ui(new Ui::UpdateDialog), + m_settings(settings) +{ + 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); +} + +UpdateDialog::~UpdateDialog() +{ + delete ui; +} + +void UpdateDialog::finished() +{ + if(m_reply->error() != QNetworkReply::NoError) + { + qWarning() << "request error" << m_reply->error() << m_reply->errorString(); + return; + } + + 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 appVersion = QVersionNumber::fromString(QCoreApplication::applicationVersion()); + + auto array = document.array(); + + for(const auto &releaseVal : array) + { + auto releaseObj = releaseVal.toObject(); + auto version = QVersionNumber::fromString(releaseObj.value("tag_name").toString()); + + 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 new file mode 100644 index 0000000..7f7b836 --- /dev/null +++ b/dialogs/updatedialog.h @@ -0,0 +1,33 @@ +#ifndef UPDATEDIALOG_H +#define UPDATEDIALOG_H + +#include +#include + +class QNetworkAccessManager; +class QNetworkReply; + +class ZeiterfassungSettings; +namespace Ui { class UpdateDialog; } + +class UpdateDialog : public QDialog +{ + Q_OBJECT + +public: + explicit UpdateDialog(ZeiterfassungSettings &settings, QNetworkAccessManager *manager, QWidget *parent = 0); + ~UpdateDialog(); + +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 new file mode 100644 index 0000000..a130bde --- /dev/null +++ b/dialogs/updatedialog.ui @@ -0,0 +1,90 @@ + + + UpdateDialog + + + + 0 + 0 + 447 + 280 + + + + Dialog + + + + + + + 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 + + + + + + + + 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/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 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; 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 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); };