From fc12170b6f3ee04809b99fbc70b5562e6b9ac538 Mon Sep 17 00:00:00 2001 From: dsc Date: Fri, 14 May 2021 01:44:42 +0200 Subject: [PATCH] Warn when there is a new version available --- src/appcontext.cpp | 8 +++ src/appcontext.h | 4 +- src/assets.qrc | 1 + src/assets/images/pls_update.jpg | Bin 0 -> 47733 bytes src/dialog/updatedialog.cpp | 32 ++++++++++ src/dialog/updatedialog.h | 28 +++++++++ src/dialog/updatedialog.ui | 101 +++++++++++++++++++++++++++++++ src/mainwindow.cpp | 18 ++++++ src/mainwindow.h | 5 ++ src/utils/utils.cpp | 9 +++ src/utils/utils.h | 1 + 11 files changed, 206 insertions(+), 1 deletion(-) create mode 100644 src/assets/images/pls_update.jpg create mode 100644 src/dialog/updatedialog.cpp create mode 100644 src/dialog/updatedialog.h create mode 100644 src/dialog/updatedialog.ui diff --git a/src/appcontext.cpp b/src/appcontext.cpp index 122e5d9..c185181 100644 --- a/src/appcontext.cpp +++ b/src/appcontext.cpp @@ -6,6 +6,7 @@ #include "appcontext.h" #include "globals.h" +#include "config-wowlet.h" // libwalletqt #include "libwalletqt/TransactionHistory.h" @@ -457,6 +458,13 @@ void AppContext::onWSMessage(const QJsonObject &msg) { auto txFiatHistory_data = msg.value("data").toObject(); AppContext::txFiatHistory->onWSData(txFiatHistory_data); } + else if(cmd == "wowlet_releases") { + versionPending = msg.value("data").toObject(); + auto version_str = versionPending.value("version").toString(); + + if(Utils::versionOutdated(WOWLET_VERSION_SEMVER, version_str)) + emit versionOutdated(version_str, versionPending); + } #if defined(HAS_OPENVR) else if(cmd == "requestPIN") { auto pin = msg.value("data").toString(); diff --git a/src/appcontext.h b/src/appcontext.h index 6419c40..b07444a 100644 --- a/src/appcontext.h +++ b/src/appcontext.h @@ -45,6 +45,7 @@ public: bool isMac = false; bool isWindows = false; bool isDebug = false; + static bool isQML; bool androidDebug = false; // Donation config @@ -105,7 +106,7 @@ public: static QMap txDescriptionCache; static QMap txCache; static TxFiatHistory *txFiatHistory; - static bool isQML; + QJsonObject versionPending; // libwalletqt bool refreshed = false; @@ -219,6 +220,7 @@ signals: void initiateTransaction(); void endTransaction(); void setTitle(const QString &title); // set window title + void versionOutdated(QString version_string, QJsonObject data); private: WalletKeysFilesModel *m_walletKeysFilesModel; diff --git a/src/assets.qrc b/src/assets.qrc index 35604ef..54e6be8 100644 --- a/src/assets.qrc +++ b/src/assets.qrc @@ -139,6 +139,7 @@ assets/images/seal.png assets/images/seed.png assets/images/speaker.png + assets/images/pls_update.jpg assets/images/status_connected_fork.png assets/images/status_connected.png assets/images/status_connected_proxy_fork.png diff --git a/src/assets/images/pls_update.jpg b/src/assets/images/pls_update.jpg new file mode 100644 index 0000000000000000000000000000000000000000..570193985cbf10e705c7ae9fd5b0bc770e5a654f GIT binary patch literal 47733 zcmb5VWpo^|(l$88n3;C;M~+fB_%_umCgwCKEF^XK__kMZo_W{;UANIROAm z%>VNGUz7d66Ohd<+{^#~2r@8P%*@%<9gM$%F^`wK^FN#k##m<7CgxyV1IA3Q;0l8A z&wufz|AR07VXOaONH7FoxoWCQf@Q-3V=}A%1DpOI*v#710i1>loQBHW!4aH4r0)M< z^MBayA9k?!0N3q5;h%&^7LHmP;5!xgA_B+)J_D2hssJ*8DZm3@1F#3U1DL^gM{tZA zKpjk%_+R)5{==^d<}w9y*#OMI98v%$fCIqfKm34yZ2(RK4*%7ynl^zrcq1OT8m0f2tT|MEK(0swpu;P}M<#!(dj0H~n=K-=(t z<4iLEfc6Lg0B_CN#MR_KM zN^u4N$jSx)Xsp0_8~!hH!+{z8AHDs5ruo11_pt$x1VBMT{yV_|8hpaQ!N5R6!ytV6 z1Ph0RfP{pIfQX2Uf`NvNf{ucSh=zlPj){ehjg5qgi-&`Shk=ES^)C|$C@>E+3_J`B zJQgw{GS>g^@G%HLhl41FD1m}N2SB1jK%ql?41Ae~AC30w5s462N}?SO*|MK>#4ppwPfw`C0U&ccvzbBKkmEv8#+b25_$@VkP(O z-f~O5H!43XzLd|Q0uQH<5}tB=b`$X3n8l}BKu7E0yX?&T`ElqWd2S>MD)sGlC<;xN?oG9-LgJB& zoz6o4Q?-eg(iU*H^@qO`BJ%6>75#DqN&Ecn!*&KD!GXyLy*%VaC|C~|Xc!pS8k4JI zUzmrMPHvV2esS=O^t^}oi7MUyxa!!fEZzN1}Jl)pA^>qA<%>DX>4xgVCx;cv+f_z|Ld^eOeeA_Ld zdfKEap4pPi-Nddr(SNFaa`D$;(v&I@Q9<0}wL0jE=GlaGML7A4uP5(iQ^ZxL5BMZX z$b0TjD!Oy#dZTzH%w=bQr%a+ zeC&{jp>u{z{+8PxM&Ev3hJSXH1VSzeJ0v^YSMNXT6dxr$VdZ@Y;Hx#YS!I{ zg{l?L6*ewi=0{{SFHdQ^C&mK{_}2!cMpc_3t18-J{n7aCOl+sL<(k`?r_4JSCCC9L z^?AWera)jhCG!A-GBzABrn)Zv38Ph&nY~}1VjF=TlW|(savF;gszHYKljpOQQ^Cbc zhff)1VxYoFw@mia`qMla+(2P^B%zABBtuji!g8^S#MwiYv1zo50JJV=gEXw;K?GH0 zkN87O^h9#dkUAHdMGw2@kL}2rbzv1DcEl-9m5l2FlGxU#);~nVFh@Jv9?ox+^LJ$@ z!RQc2B4!JE+}Kswg{|@%WalU16&WUHxK%tAwHTmnGmI>KJ^d{EGOq=#qUaP50sHQVF7&?B?^@gU$NEb>Z*`~FA7Y{cm3zO51y^-6 zQi`VpU4n5N^$ayH-i9fqZ`^5ou#WvWZaP1%)k|7#er$To%{j࿖YUD6P#rw~}m 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 z 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

kPCZBv~ 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 literal 0 HcmV?d00001 diff --git a/src/dialog/updatedialog.cpp b/src/dialog/updatedialog.cpp new file mode 100644 index 0000000..2d6c6e8 --- /dev/null +++ b/src/dialog/updatedialog.cpp @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020-2021, The Monero Project. + +#include "updatedialog.h" +#include "ui_updatedialog.h" + +#include "config-wowlet.h" + +UpdateDialog::UpdateDialog(AppContext *ctx, QWidget *parent) : + QDialog(parent), + ctx(ctx), + ui(new Ui::UpdateDialog) { + ui->setupUi(this); + this->setWindowIcon(QIcon("://assets/images/appicons/64x64.png")); + + auto version_str = ctx->versionPending.value("version").toString(); + + QPixmap p(":assets/images/pls_update.jpg"); + ui->label_image->setPixmap(p.scaled(420, 420, Qt::KeepAspectRatio, Qt::SmoothTransformation)); + + ui->info_label->setText("Current version: " + QString(WOWLET_VERSION_SEMVER) + "\n" + "New version: " + version_str); + + ui->label_download->setText("Download: https://git.wownero.com/wowlet/wowlet/releases"); + ui->label_download->setTextInteractionFlags(Qt::TextBrowserInteraction); + ui->label_download->setOpenExternalLinks(true); + this->adjustSize(); +} + +UpdateDialog::~UpdateDialog() { + delete ui; +} diff --git a/src/dialog/updatedialog.h b/src/dialog/updatedialog.h new file mode 100644 index 0000000..fa7700b --- /dev/null +++ b/src/dialog/updatedialog.h @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020-2021, The Monero Project. + +#ifndef WOWLET_UPDATEDIALOG_H +#define WOWLET_UPDATEDIALOG_H + +#include +#include "appcontext.h" + +namespace Ui { + class UpdateDialog; +} + +class UpdateDialog : public QDialog +{ +Q_OBJECT + +public: + explicit UpdateDialog(AppContext *ctx, QWidget *parent = nullptr); + ~UpdateDialog() override; + +private: + AppContext *ctx = nullptr; + Ui::UpdateDialog *ui; +}; + + +#endif //WOWLET_UPDATEDIALOG_H diff --git a/src/dialog/updatedialog.ui b/src/dialog/updatedialog.ui new file mode 100644 index 0000000..f8cce0f --- /dev/null +++ b/src/dialog/updatedialog.ui @@ -0,0 +1,101 @@ + + + UpdateDialog + + + + 0 + 0 + 439 + 537 + + + + Pls update + + + + + + image + + + + + + + info_label + + + + + + + download_label + + + Qt::RichText + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Ok + + + + + + + + + buttonBox + accepted() + UpdateDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + UpdateDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index b09b812..fbb255e 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -19,6 +19,7 @@ #include "dialog/viewonlydialog.h" #include "dialog/broadcasttxdialog.h" #include "dialog/tximportdialog.h" +#include "dialog/updatedialog.h" #include "dialog/passworddialog.h" #include "dialog/balancedialog.h" #include "dialog/WalletCacheDebugDialog.h" @@ -337,6 +338,9 @@ MainWindow::MainWindow(AppContext *ctx, QWidget *parent) : // window title connect(m_ctx, &AppContext::setTitle, this, &QMainWindow::setWindowTitle); + // Version warning + connect(m_ctx, &AppContext::versionOutdated, this, &MainWindow::onVersionWarning); + // init touchbar #ifdef Q_OS_MAC m_touchbar = new KDMacTouchBar(this); @@ -428,6 +432,7 @@ void MainWindow::initMenu() { connect(ui->actionSeed, &QAction::triggered, this, &MainWindow::showSeedDialog); connect(ui->actionPassword, &QAction::triggered, this, &MainWindow::showPasswordDialog); connect(ui->actionKeys, &QAction::triggered, this, &MainWindow::showKeysDialog); + connect(this, &MainWindow::updateDialog, this, &MainWindow::showUpdateDialog); connect(ui->actionViewOnly, &QAction::triggered, this, &MainWindow::showViewOnlyDialog); connect(ui->actionStore_wallet, &QAction::triggered, [this]{ m_ctx->currentWallet->store(); @@ -632,6 +637,8 @@ void MainWindow::onWalletOpened(Wallet *wallet) { this->updatePasswordIcon(); m_updateBytes.start(100); + + if(m_showUpdateWarning == 1) emit updateDialog(); } void MainWindow::onBalanceUpdated(quint64 balance, quint64 spendable) { @@ -886,6 +893,11 @@ void MainWindow::updatePasswordIcon() { m_statusBtnPassword->setIcon(icon); } +void MainWindow::onVersionWarning(QString current_string, QJsonObject version_data) { + if(m_showUpdateWarning != -1) + m_showUpdateWarning = 1; +} + void MainWindow::showRestoreHeightDialog() { // settings custom restore height is only available for 25 word seeds auto seed = m_ctx->currentWallet->getCacheAttribute("wowlet.seed"); @@ -911,6 +923,12 @@ void MainWindow::showRestoreHeightDialog() { }); } +void MainWindow::showUpdateDialog() { + auto *dialog = new UpdateDialog(m_ctx, this); + dialog->show(); + m_showUpdateWarning = -1; +} + void MainWindow::showKeysDialog() { auto *dialog = new KeysDialog(m_ctx, this); dialog->exec(); diff --git a/src/mainwindow.h b/src/mainwindow.h index 62e33e0..3e22fac 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -38,6 +38,7 @@ #include "dialog/verifyproofdialog.h" #include "dialog/seeddialog.h" #include "dialog/passwordchangedialog.h" +#include "dialog/updatedialog.h" #include "dialog/keysdialog.h" #include "dialog/aboutdialog.h" #include "dialog/restoredialog.h" @@ -115,6 +116,7 @@ public slots: void showSendScreen(const CCSEntry &entry); void suchDonate(const QString address); void skinChanged(const QString &skinName); + void onVersionWarning(QString current_string, QJsonObject data); void menuTorClicked(); void onBlockchainSync(int height, int target); void onRefreshSync(int height, int target); @@ -158,6 +160,7 @@ public slots: void onUpdateXMRWidget(); signals: + void updateDialog(); void closed(); private: @@ -173,6 +176,7 @@ private: void saveGeo(); void restoreGeo(); void showDebugInfo(); + void showUpdateDialog(); void showNodeExhaustedMessage(); void showWSNodeExhaustedMessage(); void createUnsignedTxDialog(UnsignedTransaction *tx); @@ -236,6 +240,7 @@ private: bool m_constructingTransaction = false; bool m_statusOverrideActive = false; QTimer m_txTimer; + int m_showUpdateWarning = 0; private slots: void menuToggleTabVisible(const QString &key); diff --git a/src/utils/utils.cpp b/src/utils/utils.cpp index ca9aee9..22b7068 100644 --- a/src/utils/utils.cpp +++ b/src/utils/utils.cpp @@ -434,6 +434,15 @@ int Utils::maxLength(const QVector &array) { return maxLength; } +bool Utils::versionOutdated(const QString ¤t_version, const QString &newest_version) { + auto cver = current_version.split('.'); + auto nver = newest_version.split('.'); + int cverlist[] = {cver.at(0).toInt(), cver.at(1).toInt(), cver.at(2).toInt(), cver.at(3).toInt()}; + int nverlist[] = {nver.at(0).toInt(), nver.at(1).toInt(), nver.at(2).toInt(), nver.at(3).toInt()}; + if(cverlist[0] < nverlist[0] || cverlist[1] < nverlist[1] || cverlist[2] < nverlist[2] || cverlist[3] < nverlist[3]) return true; + return false; +} + QString Utils::balanceFormat(quint64 balance) { QString str = QString::number(balance / globals::cdiv, 'f', 4); diff --git a/src/utils/utils.h b/src/utils/utils.h index 444e6f8..a156213 100644 --- a/src/utils/utils.h +++ b/src/utils/utils.h @@ -81,6 +81,7 @@ public: static QMap localeCache; static QString balanceFormat(quint64 balance); static QTextCharFormat addressTextFormat(const SubaddressIndex &index); + static bool versionOutdated(const QString ¤t_version, const QString &newest_version); template static QString QtEnumToString (const QEnum value) {