mirror of
https://gitee.com/vnotex/vnote.git
synced 2025-07-05 22:09:52 +08:00
add check for updates
This commit is contained in:
parent
bcec79fe17
commit
0f1be2883a
@ -1 +1 @@
|
|||||||
Subproject commit f17e9bf898d86c2990b5831dea45673c3269030b
|
Subproject commit 392c0e218f5981b4fc6566512103b6149f714931
|
@ -57,6 +57,8 @@ void CoreConfig::init(const QJsonObject &p_app,
|
|||||||
|
|
||||||
m_recoverLastSessionOnStartEnabled = READBOOL(QStringLiteral("recover_last_session_on_start"));
|
m_recoverLastSessionOnStartEnabled = READBOOL(QStringLiteral("recover_last_session_on_start"));
|
||||||
|
|
||||||
|
m_checkForUpdatesOnStartEnabled = READBOOL(QStringLiteral("check_for_updates_on_start"));
|
||||||
|
|
||||||
m_historyMaxCount = READINT(QStringLiteral("history_max_count"));
|
m_historyMaxCount = READINT(QStringLiteral("history_max_count"));
|
||||||
if (m_historyMaxCount < 0) {
|
if (m_historyMaxCount < 0) {
|
||||||
m_historyMaxCount = 100;
|
m_historyMaxCount = 100;
|
||||||
@ -72,6 +74,7 @@ QJsonObject CoreConfig::toJson() const
|
|||||||
obj[QStringLiteral("toolbar_icon_size")] = m_toolBarIconSize;
|
obj[QStringLiteral("toolbar_icon_size")] = m_toolBarIconSize;
|
||||||
obj[QStringLiteral("docks_tabbar_icon_size")] = m_docksTabBarIconSize;
|
obj[QStringLiteral("docks_tabbar_icon_size")] = m_docksTabBarIconSize;
|
||||||
obj[QStringLiteral("recover_last_session_on_start")] = m_recoverLastSessionOnStartEnabled;
|
obj[QStringLiteral("recover_last_session_on_start")] = m_recoverLastSessionOnStartEnabled;
|
||||||
|
obj[QStringLiteral("check_for_updates_on_start")] = m_checkForUpdatesOnStartEnabled;
|
||||||
obj[QStringLiteral("history_max_count")] = m_historyMaxCount;
|
obj[QStringLiteral("history_max_count")] = m_historyMaxCount;
|
||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
@ -186,6 +189,16 @@ void CoreConfig::setRecoverLastSessionOnStartEnabled(bool p_enabled)
|
|||||||
updateConfig(m_recoverLastSessionOnStartEnabled, p_enabled, this);
|
updateConfig(m_recoverLastSessionOnStartEnabled, p_enabled, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CoreConfig::isCheckForUpdatesOnStartEnabled() const
|
||||||
|
{
|
||||||
|
return m_checkForUpdatesOnStartEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CoreConfig::setCheckForUpdatesOnStartEnabled(bool p_enabled)
|
||||||
|
{
|
||||||
|
updateConfig(m_checkForUpdatesOnStartEnabled, p_enabled, this);
|
||||||
|
}
|
||||||
|
|
||||||
int CoreConfig::getHistoryMaxCount() const
|
int CoreConfig::getHistoryMaxCount() const
|
||||||
{
|
{
|
||||||
return m_historyMaxCount;
|
return m_historyMaxCount;
|
||||||
|
@ -97,6 +97,9 @@ namespace vnotex
|
|||||||
bool isRecoverLastSessionOnStartEnabled() const;
|
bool isRecoverLastSessionOnStartEnabled() const;
|
||||||
void setRecoverLastSessionOnStartEnabled(bool p_enabled);
|
void setRecoverLastSessionOnStartEnabled(bool p_enabled);
|
||||||
|
|
||||||
|
bool isCheckForUpdatesOnStartEnabled() const;
|
||||||
|
void setCheckForUpdatesOnStartEnabled(bool p_enabled);
|
||||||
|
|
||||||
int getHistoryMaxCount() const;
|
int getHistoryMaxCount() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -128,6 +131,8 @@ namespace vnotex
|
|||||||
// Whether recover last session on start.
|
// Whether recover last session on start.
|
||||||
bool m_recoverLastSessionOnStartEnabled = true;
|
bool m_recoverLastSessionOnStartEnabled = true;
|
||||||
|
|
||||||
|
bool m_checkForUpdatesOnStartEnabled = true;
|
||||||
|
|
||||||
// Max count of the history items for each notebook and session config.
|
// Max count of the history items for each notebook and session config.
|
||||||
int m_historyMaxCount = 100;
|
int m_historyMaxCount = 100;
|
||||||
|
|
||||||
|
@ -70,6 +70,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"recover_last_session_on_start" : true,
|
"recover_last_session_on_start" : true,
|
||||||
|
"check_for_updates_on_start" : true,
|
||||||
"//comment" : "Max count of the history items for each notebook and session config",
|
"//comment" : "Max count of the history items for each notebook and session config",
|
||||||
"history_max_count" : 100
|
"history_max_count" : 100
|
||||||
},
|
},
|
||||||
|
@ -79,6 +79,16 @@ void GeneralPage::setupUI()
|
|||||||
connect(m_recoverLastSessionCheckBox, &QCheckBox::stateChanged,
|
connect(m_recoverLastSessionCheckBox, &QCheckBox::stateChanged,
|
||||||
this, &GeneralPage::pageIsChanged);
|
this, &GeneralPage::pageIsChanged);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
const QString label(tr("Check for updates on start"));
|
||||||
|
m_checkForUpdatesCheckBox = WidgetsFactory::createCheckBox(label, this);
|
||||||
|
m_checkForUpdatesCheckBox->setToolTip(tr("Check for updates on start of VNote"));
|
||||||
|
mainLayout->addRow(m_checkForUpdatesCheckBox);
|
||||||
|
addSearchItem(label, m_checkForUpdatesCheckBox->toolTip(), m_checkForUpdatesCheckBox);
|
||||||
|
connect(m_checkForUpdatesCheckBox, &QCheckBox::stateChanged,
|
||||||
|
this, &GeneralPage::pageIsChanged);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void GeneralPage::loadInternal()
|
void GeneralPage::loadInternal()
|
||||||
@ -104,6 +114,8 @@ void GeneralPage::loadInternal()
|
|||||||
}
|
}
|
||||||
|
|
||||||
m_recoverLastSessionCheckBox->setChecked(coreConfig.isRecoverLastSessionOnStartEnabled());
|
m_recoverLastSessionCheckBox->setChecked(coreConfig.isRecoverLastSessionOnStartEnabled());
|
||||||
|
|
||||||
|
m_checkForUpdatesCheckBox->setChecked(coreConfig.isCheckForUpdatesOnStartEnabled());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool GeneralPage::saveInternal()
|
bool GeneralPage::saveInternal()
|
||||||
@ -128,6 +140,8 @@ bool GeneralPage::saveInternal()
|
|||||||
|
|
||||||
coreConfig.setRecoverLastSessionOnStartEnabled(m_recoverLastSessionCheckBox->isChecked());
|
coreConfig.setRecoverLastSessionOnStartEnabled(m_recoverLastSessionCheckBox->isChecked());
|
||||||
|
|
||||||
|
coreConfig.setCheckForUpdatesOnStartEnabled(m_checkForUpdatesCheckBox->isChecked());
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -31,6 +31,8 @@ namespace vnotex
|
|||||||
QCheckBox *m_systemTrayCheckBox = nullptr;
|
QCheckBox *m_systemTrayCheckBox = nullptr;
|
||||||
|
|
||||||
QCheckBox *m_recoverLastSessionCheckBox = nullptr;
|
QCheckBox *m_recoverLastSessionCheckBox = nullptr;
|
||||||
|
|
||||||
|
QCheckBox *m_checkForUpdatesCheckBox = nullptr;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
104
src/widgets/dialogs/updater.cpp
Normal file
104
src/widgets/dialogs/updater.cpp
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
#include "updater.h"
|
||||||
|
|
||||||
|
#include <QHBoxLayout>
|
||||||
|
#include <QFormLayout>
|
||||||
|
#include <QTimer>
|
||||||
|
#include <QLabel>
|
||||||
|
#include <QApplication>
|
||||||
|
#include <QPushButton>
|
||||||
|
#include <QNetworkAccessManager>
|
||||||
|
#include <QNetworkReply>
|
||||||
|
#include <QJsonObject>
|
||||||
|
#include <QPointer>
|
||||||
|
|
||||||
|
#include <widgets/widgetsfactory.h>
|
||||||
|
#include <utils/widgetutils.h>
|
||||||
|
#include <utils/utils.h>
|
||||||
|
#include <vtextedit/networkutils.h>
|
||||||
|
|
||||||
|
using namespace vnotex;
|
||||||
|
|
||||||
|
Updater::Updater(QWidget *p_parent)
|
||||||
|
: Dialog(p_parent)
|
||||||
|
{
|
||||||
|
setupUI();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Updater::setupUI()
|
||||||
|
{
|
||||||
|
auto mainWidget = new QWidget(this);
|
||||||
|
setCentralWidget(mainWidget);
|
||||||
|
|
||||||
|
auto mainLayout = WidgetsFactory::createFormLayout(mainWidget);
|
||||||
|
|
||||||
|
mainLayout->addRow(tr("Version:"), new QLabel(qApp->applicationVersion(), mainWidget));
|
||||||
|
|
||||||
|
m_latestVersionLabel = new QLabel(tr("Fetching information..."), mainWidget);
|
||||||
|
mainLayout->addRow(tr("Latest version:"), m_latestVersionLabel);
|
||||||
|
|
||||||
|
setDialogButtonBox(QDialogButtonBox::Ok);
|
||||||
|
|
||||||
|
{
|
||||||
|
auto btnBox = getDialogButtonBox();
|
||||||
|
auto viewBtn = btnBox->addButton(tr("View Releases"), QDialogButtonBox::AcceptRole);
|
||||||
|
connect(viewBtn, &QPushButton::clicked,
|
||||||
|
this, [this]() {
|
||||||
|
WidgetUtils::openUrlByDesktop(QUrl("https://github.com/vnotex/vnote/releases"));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
setWindowTitle(tr("Check for Updates"));
|
||||||
|
}
|
||||||
|
|
||||||
|
void Updater::showEvent(QShowEvent *p_event)
|
||||||
|
{
|
||||||
|
Dialog::showEvent(p_event);
|
||||||
|
|
||||||
|
QTimer::singleShot(1000, this, &Updater::start);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Updater::start()
|
||||||
|
{
|
||||||
|
checkForUpdates(this, [this](bool p_hasUpdate, const QString &p_version, const QString &p_errMsg) {
|
||||||
|
Q_UNUSED(p_hasUpdate);
|
||||||
|
if (p_version.isEmpty()) {
|
||||||
|
setInformationText(tr("Failed to fetch information (%1).").arg(p_errMsg), InformationLevel::Warning);
|
||||||
|
m_latestVersionLabel->setText("");
|
||||||
|
} else {
|
||||||
|
clearInformationText();
|
||||||
|
m_latestVersionLabel->setText(p_version);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void Updater::checkForUpdates(QObject *p_receiver, const std::function<void(bool, const QString &, const QString &)> &p_callback)
|
||||||
|
{
|
||||||
|
QPointer<QObject> receiver(p_receiver);
|
||||||
|
|
||||||
|
// Will delete it in the callback.
|
||||||
|
auto mgr = new QNetworkAccessManager();
|
||||||
|
connect(mgr, &QNetworkAccessManager::finished,
|
||||||
|
mgr, [mgr, receiver, p_callback](QNetworkReply *p_reply) {
|
||||||
|
bool hasUpdate = false;
|
||||||
|
QString version;
|
||||||
|
QString errMsg;
|
||||||
|
if (p_reply->error() != QNetworkReply::NoError) {
|
||||||
|
errMsg = vte::NetworkUtils::networkErrorStr(p_reply->error());
|
||||||
|
} else {
|
||||||
|
auto obj = Utils::fromJsonString(p_reply->readAll());
|
||||||
|
version = obj["tag_name"].toString();
|
||||||
|
if (version.startsWith('v')) {
|
||||||
|
version = version.mid(1);
|
||||||
|
}
|
||||||
|
hasUpdate = version != qApp->applicationVersion();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (receiver) {
|
||||||
|
p_callback(hasUpdate, version, errMsg);
|
||||||
|
}
|
||||||
|
p_reply->deleteLater();
|
||||||
|
mgr->deleteLater();
|
||||||
|
});
|
||||||
|
|
||||||
|
mgr->get(vte::NetworkUtils::networkRequest(QUrl("https://api.github.com/repos/vnotex/vnote/releases/latest")));
|
||||||
|
}
|
34
src/widgets/dialogs/updater.h
Normal file
34
src/widgets/dialogs/updater.h
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
#ifndef UPDATER_H
|
||||||
|
#define UPDATER_H
|
||||||
|
|
||||||
|
#include "dialog.h"
|
||||||
|
|
||||||
|
#include <functional>
|
||||||
|
|
||||||
|
class QLabel;
|
||||||
|
|
||||||
|
namespace vnotex
|
||||||
|
{
|
||||||
|
class Updater : public Dialog
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
explicit Updater(QWidget *p_parent = nullptr);
|
||||||
|
|
||||||
|
// Callback(hasUpdate, VersionOnSuccess, errMsg).
|
||||||
|
static void checkForUpdates(QObject *p_receiver, const std::function<void(bool, const QString &, const QString &)> &p_callback);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void showEvent(QShowEvent *p_event) Q_DECL_OVERRIDE;
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void start();
|
||||||
|
|
||||||
|
private:
|
||||||
|
void setupUI();
|
||||||
|
|
||||||
|
QLabel *m_latestVersionLabel = nullptr;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // UPDATER_H
|
@ -51,6 +51,7 @@
|
|||||||
#include <utils/docsutils.h>
|
#include <utils/docsutils.h>
|
||||||
#include <utils/iconutils.h>
|
#include <utils/iconutils.h>
|
||||||
#include <core/thememgr.h>
|
#include <core/thememgr.h>
|
||||||
|
#include "dialogs/updater.h"
|
||||||
|
|
||||||
using namespace vnotex;
|
using namespace vnotex;
|
||||||
|
|
||||||
@ -122,6 +123,10 @@ void MainWindow::kickOffOnStart(const QStringList &p_paths)
|
|||||||
emit VNoteX::getInst().openFileRequested(file, paras);
|
emit VNoteX::getInst().openFileRequested(file, paras);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ConfigMgr::getInst().getCoreConfig().isCheckForUpdatesOnStartEnabled()) {
|
||||||
|
QTimer::singleShot(5 * 60 * 1000, this, &MainWindow::checkForUpdates);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -937,3 +942,14 @@ QDockWidget *MainWindow::createDockWidget(DockIndex p_dockIndex, const QString &
|
|||||||
m_docks.push_back(dock);
|
m_docks.push_back(dock);
|
||||||
return dock;
|
return dock;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MainWindow::checkForUpdates()
|
||||||
|
{
|
||||||
|
Updater::checkForUpdates(this, [this](bool p_hasUpdate, const QString &p_version, const QString &p_errMsg) {
|
||||||
|
if (p_version.isEmpty()) {
|
||||||
|
statusBar()->showMessage(tr("Failed to check for updates (%1)").arg(p_errMsg), 3000);
|
||||||
|
} else if (p_hasUpdate) {
|
||||||
|
statusBar()->showMessage(tr("Updates available: %1").arg(p_version));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
@ -169,6 +169,8 @@ namespace vnotex
|
|||||||
|
|
||||||
QDockWidget *createDockWidget(DockIndex p_dockIndex, const QString &p_title, QWidget *p_parent);
|
QDockWidget *createDockWidget(DockIndex p_dockIndex, const QString &p_title, QWidget *p_parent);
|
||||||
|
|
||||||
|
void checkForUpdates();
|
||||||
|
|
||||||
ToolBarHelper m_toolBarHelper;
|
ToolBarHelper m_toolBarHelper;
|
||||||
|
|
||||||
StatusBarHelper m_statusBarHelper;
|
StatusBarHelper m_statusBarHelper;
|
||||||
|
@ -25,6 +25,7 @@
|
|||||||
#include "propertydefs.h"
|
#include "propertydefs.h"
|
||||||
#include "dialogs/settings/settingsdialog.h"
|
#include "dialogs/settings/settingsdialog.h"
|
||||||
#include "messageboxhelper.h"
|
#include "messageboxhelper.h"
|
||||||
|
#include "dialogs/updater.h"
|
||||||
|
|
||||||
using namespace vnotex;
|
using namespace vnotex;
|
||||||
|
|
||||||
@ -511,7 +512,7 @@ QToolBar *ToolBarHelper::setupSettingsToolBar(MainWindow *p_win, QToolBar *p_too
|
|||||||
WidgetUtils::openUrlByDesktop(QUrl("https://vnotex.github.io/vnote"));
|
WidgetUtils::openUrlByDesktop(QUrl("https://vnotex.github.io/vnote"));
|
||||||
});
|
});
|
||||||
|
|
||||||
menu->addAction(MainWindow::tr("Feedback And Discussions"),
|
menu->addAction(MainWindow::tr("Feedback and Discussions"),
|
||||||
menu,
|
menu,
|
||||||
[]() {
|
[]() {
|
||||||
WidgetUtils::openUrlByDesktop(QUrl("https://github.com/vnotex/vnote/discussions"));
|
WidgetUtils::openUrlByDesktop(QUrl("https://github.com/vnotex/vnote/discussions"));
|
||||||
@ -519,6 +520,13 @@ QToolBar *ToolBarHelper::setupSettingsToolBar(MainWindow *p_win, QToolBar *p_too
|
|||||||
|
|
||||||
menu->addSeparator();
|
menu->addSeparator();
|
||||||
|
|
||||||
|
menu->addAction(MainWindow::tr("Check for Updates"),
|
||||||
|
menu,
|
||||||
|
[p_win]() {
|
||||||
|
Updater updater(p_win);
|
||||||
|
updater.exec();
|
||||||
|
});
|
||||||
|
|
||||||
menu->addAction(MainWindow::tr("About"),
|
menu->addAction(MainWindow::tr("About"),
|
||||||
menu,
|
menu,
|
||||||
[p_win]() {
|
[p_win]() {
|
||||||
|
@ -33,6 +33,7 @@ SOURCES += \
|
|||||||
$$PWD/dialogs/snippetpropertiesdialog.cpp \
|
$$PWD/dialogs/snippetpropertiesdialog.cpp \
|
||||||
$$PWD/dialogs/sortdialog.cpp \
|
$$PWD/dialogs/sortdialog.cpp \
|
||||||
$$PWD/dialogs/tableinsertdialog.cpp \
|
$$PWD/dialogs/tableinsertdialog.cpp \
|
||||||
|
$$PWD/dialogs/updater.cpp \
|
||||||
$$PWD/dragdropareaindicator.cpp \
|
$$PWD/dragdropareaindicator.cpp \
|
||||||
$$PWD/editors/editormarkdownvieweradapter.cpp \
|
$$PWD/editors/editormarkdownvieweradapter.cpp \
|
||||||
$$PWD/editors/graphhelper.cpp \
|
$$PWD/editors/graphhelper.cpp \
|
||||||
@ -147,6 +148,7 @@ HEADERS += \
|
|||||||
$$PWD/dialogs/snippetpropertiesdialog.h \
|
$$PWD/dialogs/snippetpropertiesdialog.h \
|
||||||
$$PWD/dialogs/sortdialog.h \
|
$$PWD/dialogs/sortdialog.h \
|
||||||
$$PWD/dialogs/tableinsertdialog.h \
|
$$PWD/dialogs/tableinsertdialog.h \
|
||||||
|
$$PWD/dialogs/updater.h \
|
||||||
$$PWD/dragdropareaindicator.h \
|
$$PWD/dragdropareaindicator.h \
|
||||||
$$PWD/editors/editormarkdownvieweradapter.h \
|
$$PWD/editors/editormarkdownvieweradapter.h \
|
||||||
$$PWD/editors/graphhelper.h \
|
$$PWD/editors/graphhelper.h \
|
||||||
|
Loading…
x
Reference in New Issue
Block a user