From 85ab7d1e96cc986c8babe7916871c83af686e4ac Mon Sep 17 00:00:00 2001 From: Eberhard Graether Date: Wed, 11 Oct 2017 13:39:00 +0200 Subject: [PATCH] logic: Moved update check setting to preferences and enable automatic update check by default --- bin/app/data/gui/startscreen/startscreen.css | 4 +- bin/app/user/ApplicationSettings_template.xml | 1 + src/lib/settings/ApplicationSettings.cpp | 12 ++- src/lib/settings/ApplicationSettings.h | 3 + src/lib_gui/CMakeLists.txt | 2 + .../qt/element/QtUpdateCheckerWidget.cpp | 94 +++++++++++++++++++ .../qt/element/QtUpdateCheckerWidget.h | 21 +++++ src/lib_gui/qt/network/QtUpdateChecker.cpp | 35 +++++-- src/lib_gui/qt/network/QtUpdateChecker.h | 9 +- src/lib_gui/qt/window/QtStartScreen.cpp | 31 +----- .../QtProjectWizzardContentPreferences.cpp | 38 +++++--- .../QtProjectWizzardContentPreferences.h | 2 + 12 files changed, 198 insertions(+), 54 deletions(-) create mode 100644 src/lib_gui/qt/element/QtUpdateCheckerWidget.cpp create mode 100644 src/lib_gui/qt/element/QtUpdateCheckerWidget.h diff --git a/bin/app/data/gui/startscreen/startscreen.css b/bin/app/data/gui/startscreen/startscreen.css index 0516322c..7a7acc6b 100644 --- a/bin/app/data/gui/startscreen/startscreen.css +++ b/bin/app/data/gui/startscreen/startscreen.css @@ -53,9 +53,9 @@ text-decoration: underline; } -#updateCheckbox { +#updateButton:disabled { color: black; - font-size: 12px; + text-decoration: none; } #licenseHeaderLabel { diff --git a/bin/app/user/ApplicationSettings_template.xml b/bin/app/user/ApplicationSettings_template.xml index 280bf12e..6655d633 100644 --- a/bin/app/user/ApplicationSettings_template.xml +++ b/bin/app/user/ApplicationSettings_template.xml @@ -86,6 +86,7 @@ + diff --git a/src/lib/settings/ApplicationSettings.cpp b/src/lib/settings/ApplicationSettings.cpp index 973fef42..a433db53 100644 --- a/src/lib/settings/ApplicationSettings.cpp +++ b/src/lib/settings/ApplicationSettings.cpp @@ -419,7 +419,7 @@ void ApplicationSettings::setUserToken(std::string token) bool ApplicationSettings::getAutomaticUpdateCheck() const { - return getValue("user/update_check/automatic", false); + return getValue("user/update_check/automatic", true); } void ApplicationSettings::setAutomaticUpdateCheck(bool automaticUpdates) @@ -450,6 +450,16 @@ void ApplicationSettings::setSkipUpdateForVersion(const Version& version) } } +std::string ApplicationSettings::getUpdateDownloadUrl() const +{ + return getValue("user/update_check/url", ""); +} + +void ApplicationSettings::setUpdateDownloadUrl(const std::string& url) +{ + setValue("user/update_check/url", url); +} + int ApplicationSettings::getPluginPort() const { return getValue("network/plugin_port", 6666); diff --git a/src/lib/settings/ApplicationSettings.h b/src/lib/settings/ApplicationSettings.h index 3cb9a63f..979e01b0 100644 --- a/src/lib/settings/ApplicationSettings.h +++ b/src/lib/settings/ApplicationSettings.h @@ -132,6 +132,9 @@ public: Version getSkipUpdateForVersion() const; void setSkipUpdateForVersion(const Version& version); + std::string getUpdateDownloadUrl() const; + void setUpdateDownloadUrl(const std::string& url); + // network int getPluginPort() const; void setPluginPort(const int pluginPort); diff --git a/src/lib_gui/CMakeLists.txt b/src/lib_gui/CMakeLists.txt index adf7fd90..d2732210 100644 --- a/src/lib_gui/CMakeLists.txt +++ b/src/lib_gui/CMakeLists.txt @@ -62,6 +62,8 @@ add_files( qt/element/QtTooltip.h qt/element/QtUndoRedo.cpp qt/element/QtUndoRedo.h + qt/element/QtUpdateCheckerWidget.cpp + qt/element/QtUpdateCheckerWidget.h qt/graphics/QtCountCircleItem.cpp qt/graphics/QtCountCircleItem.h diff --git a/src/lib_gui/qt/element/QtUpdateCheckerWidget.cpp b/src/lib_gui/qt/element/QtUpdateCheckerWidget.cpp new file mode 100644 index 00000000..b637d65d --- /dev/null +++ b/src/lib_gui/qt/element/QtUpdateCheckerWidget.cpp @@ -0,0 +1,94 @@ +#include "qt/element/QtUpdateCheckerWidget.h" + +#include +#include +#include +#include + +#include "qt/network/QtUpdateChecker.h" +#include "settings/ApplicationSettings.h" +#include "utility/TimeStamp.h" + +QtUpdateCheckerWidget::QtUpdateCheckerWidget(QWidget* parent) + : QWidget(parent) +{ + ApplicationSettings* appSettings = ApplicationSettings::getInstance().get(); + + QHBoxLayout* layout = new QHBoxLayout(this); + layout->setContentsMargins(0, 0, 0, 0); + layout->setSpacing(0); + + m_button = new QPushButton("check for new version"); + m_button->setObjectName("updateButton"); + m_button->setCursor(Qt::PointingHandCursor); + layout->addWidget(m_button); + + if (appSettings->getAutomaticUpdateCheck()) + { + if (QtUpdateChecker::needsAutomaticCheck()) + { + checkUpdate(false); + } + else + { + QString url = QString::fromStdString(appSettings->getUpdateDownloadUrl()); + if (!url.isEmpty()) + { + setDownloadUrl(url); + } + else + { + m_button->setText("up-to-date"); + m_button->setEnabled(false); + } + } + } + else + { + connect(m_button, &QPushButton::clicked, [this](){ checkUpdate(true); }); + } +} + +void QtUpdateCheckerWidget::checkUpdate(bool force) +{ + ApplicationSettings* appSettings = ApplicationSettings::getInstance().get(); + appSettings->setUpdateDownloadUrl(""); + appSettings->save(); + + m_button->setText("checking for update..."); + m_button->setEnabled(false); + + QtUpdateChecker::check(force, + [this, appSettings](QtUpdateChecker::Result result) + { + if (!result.success) + { + m_button->setText("update check failed"); + } + else if (result.url.isEmpty()) + { + m_button->setText("up-to-date"); + } + else + { + setDownloadUrl(result.url); + + appSettings->setUpdateDownloadUrl(result.url.toStdString()); + appSettings->save(); + } + } + ); +} + +void QtUpdateCheckerWidget::setDownloadUrl(QString url) +{ + m_button->setText("new version available"); + m_button->disconnect(); + connect(m_button, &QPushButton::clicked, this, + [url]() + { + QDesktopServices::openUrl(QUrl(url, QUrl::TolerantMode)); + } + ); + m_button->setEnabled(true); +} diff --git a/src/lib_gui/qt/element/QtUpdateCheckerWidget.h b/src/lib_gui/qt/element/QtUpdateCheckerWidget.h new file mode 100644 index 00000000..0874a800 --- /dev/null +++ b/src/lib_gui/qt/element/QtUpdateCheckerWidget.h @@ -0,0 +1,21 @@ +#ifndef QT_UPDATE_CHECKER_WIDGET_H +#define QT_UPDATE_CHECKER_WIDGET_H + +#include + +class QPushButton; + +class QtUpdateCheckerWidget + : public QWidget +{ +public: + QtUpdateCheckerWidget(QWidget* parent = nullptr); + +private: + void checkUpdate(bool force); + void setDownloadUrl(QString url); + + QPushButton* m_button; +}; + +#endif // QT_UPDATE_CHECKER_WIDGET_H diff --git a/src/lib_gui/qt/network/QtUpdateChecker.cpp b/src/lib_gui/qt/network/QtUpdateChecker.cpp index 4b46d009..e88a1277 100644 --- a/src/lib_gui/qt/network/QtUpdateChecker.cpp +++ b/src/lib_gui/qt/network/QtUpdateChecker.cpp @@ -14,15 +14,23 @@ #include "utility/utilityApp.h" #include "utility/utilityUuid.h" -void QtUpdateChecker::check(bool force) +bool QtUpdateChecker::needsAutomaticCheck() { ApplicationSettings* appSettings = ApplicationSettings::getInstance().get(); + return TimeStamp::now().deltaHours(appSettings->getLastUpdateCheck()) >= 24; +} - if (!force && TimeStamp::now().deltaHours(appSettings->getLastUpdateCheck()) < 24) +void QtUpdateChecker::check(bool force, std::function callback) +{ + Result result; + + if (!force && !needsAutomaticCheck()) { + callback(result); return; } + ApplicationSettings* appSettings = ApplicationSettings::getInstance().get(); appSettings->setLastUpdateCheck(TimeStamp::now()); appSettings->save(); @@ -43,6 +51,7 @@ void QtUpdateChecker::check(bool force) osString = "linux"; break; default: + callback(result); return; } @@ -90,8 +99,10 @@ void QtUpdateChecker::check(bool force) // send request QtRequest* request = new QtRequest(); QObject::connect(request, &QtRequest::receivedData, - [force, request](QByteArray bytes) + [force, callback, request](QByteArray bytes) { + Result result; + do { QJsonDocument doc = QJsonDocument::fromJson(bytes); @@ -111,14 +122,18 @@ void QtUpdateChecker::check(bool force) break; } - ApplicationSettings* appSettings = ApplicationSettings::getInstance().get(); - if (!force && appSettings->getSkipUpdateForVersion() == updateVersion) - { - break; - } + result.success = true; if (updateVersion > Version::getApplicationVersion()) { + result.url = url; + + ApplicationSettings* appSettings = ApplicationSettings::getInstance().get(); + if (!force && appSettings->getSkipUpdateForVersion() == updateVersion) + { + break; + } + QMessageBox msgBox; msgBox.setText("Update Check"); msgBox.setInformativeText( @@ -154,6 +169,8 @@ void QtUpdateChecker::check(bool force) while (false); request->deleteLater(); + + callback(result); } ); @@ -165,7 +182,7 @@ void QtUpdateChecker::checkUpdate() m_onQtThread( [this]() { - check(); + check(false, [](Result){}); } ); } diff --git a/src/lib_gui/qt/network/QtUpdateChecker.h b/src/lib_gui/qt/network/QtUpdateChecker.h index f77fc0e8..c613419a 100644 --- a/src/lib_gui/qt/network/QtUpdateChecker.h +++ b/src/lib_gui/qt/network/QtUpdateChecker.h @@ -8,7 +8,14 @@ class QtUpdateChecker : public UpdateChecker { public: - static void check(bool force = false); + struct Result + { + bool success = false; + QString url; + }; + + static bool needsAutomaticCheck(); + static void check(bool force, std::function callback); virtual void checkUpdate() override; diff --git a/src/lib_gui/qt/window/QtStartScreen.cpp b/src/lib_gui/qt/window/QtStartScreen.cpp index 0ffdc75d..48d13b18 100644 --- a/src/lib_gui/qt/window/QtStartScreen.cpp +++ b/src/lib_gui/qt/window/QtStartScreen.cpp @@ -14,7 +14,7 @@ #include "License.h" #include "PublicKey.h" -#include "qt/network/QtUpdateChecker.h" +#include "qt/element/QtUpdateCheckerWidget.h" #include "qt/utility/utilityQt.h" #include "settings/ApplicationSettings.h" #include "settings/ProjectSettings.h" @@ -163,33 +163,8 @@ void QtStartScreen::setupStartScreen() versionLabel->setObjectName("versionLabel"); col->addWidget(versionLabel); - QPushButton* updateButton = new QPushButton("check for new version", this); - updateButton->setObjectName("updateButton"); - updateButton->setCursor(Qt::PointingHandCursor); - connect(updateButton, &QPushButton::clicked, - []() - { - QtUpdateChecker::check(true); - } - ); - col->addWidget(updateButton); - - QCheckBox* updateCheckbox = new QCheckBox("automatic update check"); - updateCheckbox->setObjectName("updateCheckbox"); - updateCheckbox->setChecked(ApplicationSettings::getInstance()->getAutomaticUpdateCheck()); - connect(updateCheckbox, &QCheckBox::stateChanged, - [updateCheckbox]() - { - ApplicationSettings::getInstance()->setAutomaticUpdateCheck(updateCheckbox->isChecked()); - ApplicationSettings::getInstance()->save(); - - if (updateCheckbox->isChecked()) - { - QtUpdateChecker::check(); - } - } - ); - col->addWidget(updateCheckbox); + QtUpdateCheckerWidget* checker = new QtUpdateCheckerWidget(this); + col->addWidget(checker); if (!licenseValid) { diff --git a/src/lib_gui/qt/window/project_wizzard/QtProjectWizzardContentPreferences.cpp b/src/lib_gui/qt/window/project_wizzard/QtProjectWizzardContentPreferences.cpp index 2c1d76ea..268f704f 100644 --- a/src/lib_gui/qt/window/project_wizzard/QtProjectWizzardContentPreferences.cpp +++ b/src/lib_gui/qt/window/project_wizzard/QtProjectWizzardContentPreferences.cpp @@ -91,13 +91,33 @@ void QtProjectWizzardContentPreferences::populate(QGridLayout* layout, int& row) QString modifierName =utility::getOsType() == OS_MAC ? "Cmd" : "Ctrl"; m_graphZooming = addCheckBox( "Graph Zoom", - "Zoom on mouse wheel", + "Zoom graph on mouse wheel", "

Enable graph zoom using mouse wheel only, instead of using " + modifierName + " + Mouse Wheel.

", layout, row ); addGap(layout, row); + // Network + addTitle("NETWORK", layout, row); + + // Update check + m_automaticUpdateCheck = addCheckBox("Automatic
Update Check", "Check automatically for updates", + "

Check automatically for a new releases once a day.

", layout, row); + addGap(layout, row); + + // Plugins + addTitle("PLUGIN", layout, row); + + // Sourcetrail port + m_sourcetrailPort = addLineEdit("Sourcetrail Port", + "

Port number that Sourcetrail uses to listen for incoming messages from plugins.

", layout, row); + + // Sourcetrail port + m_pluginPort = addLineEdit("Plugin Port", "

Port number that Sourcetrail uses to sends outgoing messages to plugins.

", layout, row); + + addGap(layout, row); + // indexing addTitle("INDEXING", layout, row); @@ -140,18 +160,6 @@ void QtProjectWizzardContentPreferences::populate(QGridLayout* layout, int& row) addGap(layout, row); - // Plugins - addTitle("PLUGIN", layout, row); - - // Sourcetrail port - m_sourcetrailPort = addLineEdit("Sourcetrail Port", - "

Port number that Sourcetrail uses to listen for incoming messages from plugins.

", layout, row); - - // Sourcetrail port - m_pluginPort = addLineEdit("Plugin Port", "

Port number that Sourcetrail uses to sends outgoing messages to plugins.

", layout, row); - - addGap(layout, row); - // Java addTitle("JAVA", layout, row); @@ -301,6 +309,8 @@ void QtProjectWizzardContentPreferences::load() m_scrollSpeed->setText(QString::number(appSettings->getScrollSpeed(), 'f', 1)); m_graphZooming->setChecked(appSettings->getControlsGraphZoomOnMouseWheel()); + m_automaticUpdateCheck->setChecked(appSettings->getAutomaticUpdateCheck()); + m_sourcetrailPort->setText(QString::number(appSettings->getSourcetrailPort())); m_pluginPort->setText(QString::number(appSettings->getPluginPort())); @@ -345,6 +355,8 @@ void QtProjectWizzardContentPreferences::save() appSettings->setControlsGraphZoomOnMouseWheel(m_graphZooming->isChecked()); + appSettings->setAutomaticUpdateCheck(m_automaticUpdateCheck->isChecked()); + int sourcetrailPort = m_sourcetrailPort->text().toInt(); if (sourcetrailPort) appSettings->setSourcetrailPort(sourcetrailPort); diff --git a/src/lib_gui/qt/window/project_wizzard/QtProjectWizzardContentPreferences.h b/src/lib_gui/qt/window/project_wizzard/QtProjectWizzardContentPreferences.h index cfb399cc..2d07cf90 100644 --- a/src/lib_gui/qt/window/project_wizzard/QtProjectWizzardContentPreferences.h +++ b/src/lib_gui/qt/window/project_wizzard/QtProjectWizzardContentPreferences.h @@ -66,6 +66,8 @@ private: QLineEdit* m_scrollSpeed; QCheckBox* m_graphZooming; + QCheckBox* m_automaticUpdateCheck; + QLineEdit* m_sourcetrailPort; QLineEdit* m_pluginPort;