diff options
| author | Stanislaw Halik <sthalik@misaki.pl> | 2023-02-27 14:26:43 +0100 | 
|---|---|---|
| committer | Stanislaw Halik <sthalik@misaki.pl> | 2023-02-27 15:46:03 +0100 | 
| commit | b05464749c618b83167e23f8b7046c1d29cbd9a3 (patch) | |
| tree | 737854fac27c84595a53d97dce7ddbee862f3574 /opentrack | |
| parent | d7fb4b69ef543c8201b043424b9f24bfe8e050d1 (diff) | |
opentrack: add back the updater
Diffstat (limited to 'opentrack')
| -rw-r--r-- | opentrack/main-window.cpp | 5 | ||||
| -rw-r--r-- | opentrack/main-window.hpp | 4 | ||||
| -rw-r--r-- | opentrack/software-update-dialog.cpp | 66 | ||||
| -rw-r--r-- | opentrack/software-update-dialog.hpp | 34 | ||||
| -rw-r--r-- | opentrack/software-update.ui | 118 | 
5 files changed, 227 insertions, 0 deletions
diff --git a/opentrack/main-window.cpp b/opentrack/main-window.cpp index ab8255a8..896247c4 100644 --- a/opentrack/main-window.cpp +++ b/opentrack/main-window.cpp @@ -18,6 +18,7 @@  #include "compat/math.hpp"  #include "compat/sysexits.hpp"  #include "opentrack/defs.hpp" +#include "software-update-dialog.hpp"  #include <cstring>  #include <utility> @@ -76,6 +77,10 @@ main_window::main_window() : State(OPENTRACK_BASE_PATH + OPENTRACK_LIBRARY_PATH)  #elif defined UI_COMPACT_VIDEO_FEED      connect(ui.preview_checkbox, &QCheckBox::toggled, this, &main_window::toggle_video_preview);  #endif + +    updater = std::make_unique<update_query>(this); +    updater->maybe_show_dialog(); +  }  void main_window::init_shortcuts() diff --git a/opentrack/main-window.hpp b/opentrack/main-window.hpp index 322c74c5..c0724a35 100644 --- a/opentrack/main-window.hpp +++ b/opentrack/main-window.hpp @@ -35,6 +35,8 @@  #include "ui_main-window.h" +class update_query; +  class main_window final : public QMainWindow, private State  {      Q_DECLARE_TR_FUNCTIONS(main_window) @@ -84,6 +86,8 @@ class main_window final : public QMainWindow, private State      qt_signal<void> toggle_tracker { this, &main_window::toggle_tracker_, Qt::QueuedConnection };      qt_signal<void> restart_tracker { this, &main_window::restart_tracker_, Qt::QueuedConnection }; +    std::unique_ptr<update_query> updater; +  public:      void init_dylibs();      void init_tray_menu(); diff --git a/opentrack/software-update-dialog.cpp b/opentrack/software-update-dialog.cpp new file mode 100644 index 00000000..778814c3 --- /dev/null +++ b/opentrack/software-update-dialog.cpp @@ -0,0 +1,66 @@ +#include "software-update-dialog.hpp" +#include "opentrack-org.hxx" + +update_dialog::update_dialog(QWidget* parent, update_query& q, const QString& new_version) +    : QDialog(parent), q(q) +{ +    ui.setupUi(this); +    ui.ver_current->setText(const_cast<const char*>(opentrack_version)); +    ui.ver_new->setTextFormat(Qt::RichText); +    ui.ver_new->setText("<a href='https://www.trackhat.org/trackhat-opentrack'>" + new_version + "</a>"); +    ui.ver_new->setOpenExternalLinks(true); +    connect(ui.buttonBox, &QDialogButtonBox::clicked, this, &update_dialog::close); +} + +void update_query::on_finished() +{ +    if (!t.isActive()) +        return; +    t.stop(); +    if (r->error() != QNetworkReply::NoError) +    { +        qDebug() << "updater: error" << r->error() << r->errorString(); +        return; +    } +    QString str(buf); +    QRegExp re("SOFTWARE-UPDATE-V3: ([a-zA-Z0-9_.-+]+)"); +    int idx = re.indexIn(str); +    if (idx != -1) +    { +        str = re.cap(1); +        QSettings s(OPENTRACK_ORG); +        QString quiet_version = s.value("quiet-update-version").toString(); + +        if (!str.isEmpty() && str != opentrack_version && str != quiet_version) +        { +            qDebug() << "updater: new version" << str; +            update_dialog dlg(qobject_cast<QWidget*>(parent()), *this, str); +            dlg.show(); +            dlg.raise(); +            dlg.exec(); +            if (dlg.ui.disable_reminder->isChecked()) +                s.setValue("quiet-update-version", str); +        } +    } +    else +    { +        if (buf.isEmpty()) +            qDebug() << "updater: empty response"; +        else +            qDebug() << "updater: can't parse response"; +    } +    buf.clear(); +    r->deleteLater(); +} + +void update_query::maybe_show_dialog() +{ +    t.stop(); +    t.setSingleShot(true); +    t.start(1000 * 10); + +    r = qnam.get(QNetworkRequest(QStringLiteral("https://www.trackhat.org/thotv3-version"))); + +    QObject::connect(r, &QIODevice::readyRead, this, &update_query::on_ready); +    QObject::connect(r, &QNetworkReply::finished, this, &update_query::on_finished); +} diff --git a/opentrack/software-update-dialog.hpp b/opentrack/software-update-dialog.hpp new file mode 100644 index 00000000..1e150e62 --- /dev/null +++ b/opentrack/software-update-dialog.hpp @@ -0,0 +1,34 @@ +#pragma once + +#include <QtNetwork> +#include <QDialog> +#include <QTimer> +#include "ui_software-update.h" + +extern "C" const char* const opentrack_version; + +class update_query final : public QObject +{ +    Q_OBJECT +public: +    explicit update_query(QWidget* parent) : QObject{parent} {} + +    QNetworkReply* r = nullptr; +    QNetworkAccessManager qnam{this}; +    QByteArray buf; +    QTimer t{this}; + +    void on_finished(); +    void on_ready() { buf.append(r->readAll()); } +    void maybe_show_dialog(); +}; + +class update_dialog : QDialog +{ +    Q_OBJECT +    friend class update_query; +private: +    Ui::UpdateDialog ui; +    update_query& q; +    update_dialog(QWidget* parent, update_query& q, const QString& new_version); +}; diff --git a/opentrack/software-update.ui b/opentrack/software-update.ui new file mode 100644 index 00000000..07edf66c --- /dev/null +++ b/opentrack/software-update.ui @@ -0,0 +1,118 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>UpdateDialog</class> + <widget class="QDialog" name="UpdateDialog"> +  <property name="geometry"> +   <rect> +    <x>0</x> +    <y>0</y> +    <width>385</width> +    <height>187</height> +   </rect> +  </property> +  <property name="windowTitle"> +   <string>Dialog</string> +  </property> +  <layout class="QVBoxLayout"> +   <item> +    <widget class="QLabel" name="label"> +     <property name="font"> +      <font> +       <pointsize>16</pointsize> +      </font> +     </property> +     <property name="text"> +      <string>Software update released</string> +     </property> +     <property name="alignment"> +      <set>Qt::AlignCenter</set> +     </property> +    </widget> +   </item> +   <item> +    <widget class="Line" name="line"> +     <property name="orientation"> +      <enum>Qt::Horizontal</enum> +     </property> +    </widget> +   </item> +   <item> +    <widget class="QFrame" name="frame"> +     <property name="frameShape"> +      <enum>QFrame::NoFrame</enum> +     </property> +     <property name="frameShadow"> +      <enum>QFrame::Raised</enum> +     </property> +     <property name="lineWidth"> +      <number>0</number> +     </property> +     <layout class="QGridLayout" name="gridLayout"> +      <property name="leftMargin"> +       <number>12</number> +      </property> +      <property name="topMargin"> +       <number>12</number> +      </property> +      <property name="rightMargin"> +       <number>12</number> +      </property> +      <property name="bottomMargin"> +       <number>12</number> +      </property> +      <property name="spacing"> +       <number>12</number> +      </property> +      <item row="0" column="0"> +       <widget class="QLabel" name="label_2"> +        <property name="text"> +         <string>Current version:</string> +        </property> +       </widget> +      </item> +      <item row="0" column="1"> +       <widget class="QLabel" name="ver_current"> +        <property name="text"> +         <string>TextLabel</string> +        </property> +        <property name="openExternalLinks"> +         <bool>true</bool> +        </property> +       </widget> +      </item> +      <item row="1" column="0"> +       <widget class="QLabel" name="label_3"> +        <property name="text"> +         <string>Released version:</string> +        </property> +       </widget> +      </item> +      <item row="1" column="1"> +       <widget class="QLabel" name="ver_new"> +        <property name="text"> +         <string>TextLabel</string> +        </property> +       </widget> +      </item> +      <item row="2" column="0" colspan="2"> +       <widget class="QCheckBox" name="disable_reminder"> +        <property name="text"> +         <string>Don't remind me again about this version</string> +        </property> +       </widget> +      </item> +     </layout> +    </widget> +   </item> +   <item> +    <widget class="QDialogButtonBox" name="buttonBox"> +     <property name="standardButtons"> +      <set>QDialogButtonBox::Close</set> +     </property> +    </widget> +   </item> +  </layout> + </widget> + <resources/> + <connections/> +</ui>  | 
