Added auto update checker
This commit is contained in:
parent
71bb96fe2f
commit
1582bdf294
@ -60,7 +60,15 @@ Manager::Manager()
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
Manager::~Manager() = default;
|
Manager::~Manager()
|
||||||
|
{
|
||||||
|
if (updateAutoChecker_ && updateAutoChecker_->isLastCheckDateChanged()) {
|
||||||
|
Settings settings;
|
||||||
|
settings.load();
|
||||||
|
settings.lastUpdateCheck = updateAutoChecker_->lastCheckDate();
|
||||||
|
settings.save();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Manager::updateSettings(const Settings &settings)
|
void Manager::updateSettings(const Settings &settings)
|
||||||
{
|
{
|
||||||
@ -71,6 +79,13 @@ void Manager::updateSettings(const Settings &settings)
|
|||||||
{"$translators$", settings.translatorsDir},
|
{"$translators$", settings.translatorsDir},
|
||||||
{"$tessdata$", settings.tessdataPath},
|
{"$tessdata$", settings.tessdataPath},
|
||||||
});
|
});
|
||||||
|
if (settings.autoUpdateIntervalDays > 0) {
|
||||||
|
updateAutoChecker_ = std::make_unique<update::AutoChecker>(*updater_);
|
||||||
|
updateAutoChecker_->setLastCheckDate(settings.lastUpdateCheck);
|
||||||
|
updateAutoChecker_->setCheckIntervalDays(settings.autoUpdateIntervalDays);
|
||||||
|
} else {
|
||||||
|
updateAutoChecker_.reset();
|
||||||
|
}
|
||||||
|
|
||||||
tray_->updateSettings(settings);
|
tray_->updateSettings(settings);
|
||||||
capturer_->updateSettings(settings);
|
capturer_->updateSettings(settings);
|
||||||
|
@ -38,6 +38,7 @@ private:
|
|||||||
std::unique_ptr<Translator> translator_;
|
std::unique_ptr<Translator> translator_;
|
||||||
std::unique_ptr<Representer> representer_;
|
std::unique_ptr<Representer> representer_;
|
||||||
std::unique_ptr<update::Loader> updater_;
|
std::unique_ptr<update::Loader> updater_;
|
||||||
|
std::unique_ptr<update::AutoChecker> updateAutoChecker_;
|
||||||
TaskPtr last_;
|
TaskPtr last_;
|
||||||
int activeTaskCount_{0};
|
int activeTaskCount_{0};
|
||||||
};
|
};
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
#include <QJsonObject>
|
#include <QJsonObject>
|
||||||
#include <QNetworkReply>
|
#include <QNetworkReply>
|
||||||
#include <QStandardPaths>
|
#include <QStandardPaths>
|
||||||
|
#include <QTimer>
|
||||||
|
|
||||||
namespace update
|
namespace update
|
||||||
{
|
{
|
||||||
@ -672,4 +673,69 @@ QString Installer::errorString() const
|
|||||||
return errors_.join('\n');
|
return errors_.join('\n');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AutoChecker::AutoChecker(Loader &loader, QObject *parent)
|
||||||
|
: QObject(parent)
|
||||||
|
, loader_(loader)
|
||||||
|
{
|
||||||
|
SOFT_ASSERT(loader.model(), return );
|
||||||
|
connect(loader.model(), &Model::modelReset, //
|
||||||
|
this, &AutoChecker::handleModelReset);
|
||||||
|
}
|
||||||
|
|
||||||
|
AutoChecker::~AutoChecker() = default;
|
||||||
|
|
||||||
|
bool AutoChecker::isLastCheckDateChanged() const
|
||||||
|
{
|
||||||
|
return isLastCheckDateChanged_;
|
||||||
|
}
|
||||||
|
|
||||||
|
QDateTime AutoChecker::lastCheckDate() const
|
||||||
|
{
|
||||||
|
return lastCheckDate_;
|
||||||
|
}
|
||||||
|
|
||||||
|
void AutoChecker::setCheckIntervalDays(int days)
|
||||||
|
{
|
||||||
|
checkIntervalDays_ = days;
|
||||||
|
scheduleNextCheck();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AutoChecker::setLastCheckDate(const QDateTime &dt)
|
||||||
|
{
|
||||||
|
isLastCheckDateChanged_ = false;
|
||||||
|
|
||||||
|
lastCheckDate_ = dt;
|
||||||
|
if (!lastCheckDate_.isValid())
|
||||||
|
lastCheckDate_ = QDateTime::currentDateTime();
|
||||||
|
|
||||||
|
scheduleNextCheck();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AutoChecker::scheduleNextCheck()
|
||||||
|
{
|
||||||
|
if (checkIntervalDays_ < 1 || !lastCheckDate_.isValid())
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!timer_) {
|
||||||
|
timer_ = std::make_unique<QTimer>();
|
||||||
|
timer_->setSingleShot(true);
|
||||||
|
connect(timer_.get(), &QTimer::timeout, //
|
||||||
|
&loader_, &Loader::checkForUpdates);
|
||||||
|
}
|
||||||
|
|
||||||
|
auto nextTime = lastCheckDate_.addDays(checkIntervalDays_);
|
||||||
|
const auto now = QDateTime::currentDateTime();
|
||||||
|
if (nextTime < now)
|
||||||
|
nextTime = now.addSecs(5);
|
||||||
|
|
||||||
|
timer_->start(now.msecsTo(nextTime));
|
||||||
|
}
|
||||||
|
|
||||||
|
void AutoChecker::handleModelReset()
|
||||||
|
{
|
||||||
|
lastCheckDate_ = QDateTime::currentDateTime();
|
||||||
|
isLastCheckDateChanged_ = true;
|
||||||
|
scheduleNextCheck();
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace update
|
} // namespace update
|
||||||
|
@ -133,4 +133,27 @@ private:
|
|||||||
std::unique_ptr<Installer> installer_;
|
std::unique_ptr<Installer> installer_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class AutoChecker : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
explicit AutoChecker(Loader& loader, QObject* parent = nullptr);
|
||||||
|
~AutoChecker();
|
||||||
|
|
||||||
|
bool isLastCheckDateChanged() const;
|
||||||
|
QDateTime lastCheckDate() const;
|
||||||
|
void setCheckIntervalDays(int days);
|
||||||
|
void setLastCheckDate(const QDateTime& dt);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void handleModelReset();
|
||||||
|
void scheduleNextCheck();
|
||||||
|
|
||||||
|
Loader& loader_;
|
||||||
|
bool isLastCheckDateChanged_{false};
|
||||||
|
int checkIntervalDays_{0};
|
||||||
|
QDateTime lastCheckDate_;
|
||||||
|
std::unique_ptr<QTimer> timer_;
|
||||||
|
};
|
||||||
|
|
||||||
} // namespace update
|
} // namespace update
|
||||||
|
@ -150,7 +150,8 @@ void Settings::save() const
|
|||||||
settings.remove(qs_proxyPassword);
|
settings.remove(qs_proxyPassword);
|
||||||
}
|
}
|
||||||
|
|
||||||
settings.setValue(qs_autoUpdateType, int(autoUpdateType));
|
settings.setValue(qs_autoUpdateType, autoUpdateIntervalDays);
|
||||||
|
settings.setValue(qs_lastUpdateCheck, lastUpdateCheck);
|
||||||
|
|
||||||
settings.endGroup();
|
settings.endGroup();
|
||||||
|
|
||||||
@ -215,9 +216,10 @@ void Settings::load()
|
|||||||
settings.value(qs_proxySavePassword, proxySavePassword).toBool();
|
settings.value(qs_proxySavePassword, proxySavePassword).toBool();
|
||||||
proxyPassword = shuffle(settings.value(qs_proxyPassword).toString());
|
proxyPassword = shuffle(settings.value(qs_proxyPassword).toString());
|
||||||
|
|
||||||
autoUpdateType = AutoUpdate(
|
autoUpdateIntervalDays =
|
||||||
std::clamp(settings.value(qs_autoUpdateType, int(autoUpdateType)).toInt(),
|
settings.value(qs_autoUpdateType, autoUpdateIntervalDays).toInt();
|
||||||
int(AutoUpdate::Disabled), int(AutoUpdate::Monthly)));
|
lastUpdateCheck =
|
||||||
|
settings.value(qs_lastUpdateCheck, lastUpdateCheck).toDateTime();
|
||||||
|
|
||||||
settings.endGroup();
|
settings.endGroup();
|
||||||
|
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
#include "stfwd.h"
|
#include "stfwd.h"
|
||||||
|
|
||||||
|
#include <QDateTime>
|
||||||
#include <QStringList>
|
#include <QStringList>
|
||||||
|
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
@ -16,8 +17,6 @@ using Substitutions = std::unordered_multimap<LanguageId, Substitution>;
|
|||||||
|
|
||||||
enum class ProxyType { Disabled, System, Socks5, Http };
|
enum class ProxyType { Disabled, System, Socks5, Http };
|
||||||
|
|
||||||
enum class AutoUpdate { Disabled, Daily, Weekly, Monthly };
|
|
||||||
|
|
||||||
class Settings
|
class Settings
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -41,8 +40,8 @@ public:
|
|||||||
QString proxyPassword;
|
QString proxyPassword;
|
||||||
bool proxySavePassword{false};
|
bool proxySavePassword{false};
|
||||||
|
|
||||||
AutoUpdate autoUpdateType{AutoUpdate::Disabled};
|
int autoUpdateIntervalDays{0};
|
||||||
QString lastUpdateCheck{""};
|
QDateTime lastUpdateCheck;
|
||||||
|
|
||||||
Substitutions userSubstitutions;
|
Substitutions userSubstitutions;
|
||||||
bool useUserSubstitutions{true};
|
bool useUserSubstitutions{true};
|
||||||
|
@ -59,13 +59,6 @@ SettingsEditor::SettingsEditor(Manager &manager, update::Loader &updater)
|
|||||||
updateTranslationLanguages();
|
updateTranslationLanguages();
|
||||||
|
|
||||||
// updates
|
// updates
|
||||||
QMap<AutoUpdate, QString> updateTypes;
|
|
||||||
updateTypes.insert(AutoUpdate::Disabled, tr("Disabled"));
|
|
||||||
updateTypes.insert(AutoUpdate::Daily, tr("Daily"));
|
|
||||||
updateTypes.insert(AutoUpdate::Weekly, tr("Weekly"));
|
|
||||||
updateTypes.insert(AutoUpdate::Monthly, tr("Monthly"));
|
|
||||||
ui->updateCombo->addItems(updateTypes.values());
|
|
||||||
|
|
||||||
auto updatesProxy = new QSortFilterProxyModel(this);
|
auto updatesProxy = new QSortFilterProxyModel(this);
|
||||||
updatesProxy->setSourceModel(updater_.model());
|
updatesProxy->setSourceModel(updater_.model());
|
||||||
ui->updatesView->setModel(updatesProxy);
|
ui->updatesView->setModel(updatesProxy);
|
||||||
@ -136,6 +129,9 @@ Settings SettingsEditor::settings() const
|
|||||||
|
|
||||||
settings.resultShowType =
|
settings.resultShowType =
|
||||||
ui->trayRadio->isChecked() ? ResultMode::Tooltip : ResultMode::Widget;
|
ui->trayRadio->isChecked() ? ResultMode::Tooltip : ResultMode::Widget;
|
||||||
|
|
||||||
|
settings.autoUpdateIntervalDays = ui->autoUpdateInterval->value();
|
||||||
|
|
||||||
return settings;
|
return settings;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -179,6 +175,8 @@ void SettingsEditor::setSettings(const Settings &settings)
|
|||||||
|
|
||||||
ui->trayRadio->setChecked(settings.resultShowType == ResultMode::Tooltip);
|
ui->trayRadio->setChecked(settings.resultShowType == ResultMode::Tooltip);
|
||||||
ui->dialogRadio->setChecked(settings.resultShowType == ResultMode::Widget);
|
ui->dialogRadio->setChecked(settings.resultShowType == ResultMode::Widget);
|
||||||
|
|
||||||
|
ui->autoUpdateInterval->setValue(settings.autoUpdateIntervalDays);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SettingsEditor::updateCurrentPage()
|
void SettingsEditor::updateCurrentPage()
|
||||||
|
@ -485,12 +485,19 @@
|
|||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="label_17">
|
<widget class="QLabel" name="label_17">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Check for updates:</string>
|
<string>Update check interval (days):</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QComboBox" name="updateCombo"/>
|
<widget class="QSpinBox" name="autoUpdateInterval">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>0 - disabled</string>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<number>360</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QPushButton" name="checkUpdates">
|
<widget class="QPushButton" name="checkUpdates">
|
||||||
|
@ -19,7 +19,8 @@ class Recognizer;
|
|||||||
namespace update
|
namespace update
|
||||||
{
|
{
|
||||||
class Loader;
|
class Loader;
|
||||||
}
|
class AutoChecker;
|
||||||
|
} // namespace update
|
||||||
|
|
||||||
using TaskPtr = std::shared_ptr<Task>;
|
using TaskPtr = std::shared_ptr<Task>;
|
||||||
using LanguageId = QString;
|
using LanguageId = QString;
|
||||||
|
Loading…
Reference in New Issue
Block a user