ScreenTranslator/src/manager.cpp

294 lines
6.9 KiB
C++
Raw Normal View History

2020-01-27 02:01:08 +07:00
#include "manager.h"
2020-02-21 00:45:53 +07:00
#include "capturer.h"
#include "corrector.h"
#include "debug.h"
#include "recognizer.h"
#include "representer.h"
#include "settingseditor.h"
#include "task.h"
#include "translator.h"
#include "trayicon.h"
2020-03-15 18:10:26 +07:00
#include "updates.h"
2013-11-23 13:48:34 +07:00
#include <QApplication>
2013-11-25 00:23:21 +07:00
#include <QClipboard>
2013-11-24 20:06:19 +07:00
#include <QMessageBox>
2020-03-07 00:53:53 +07:00
#include <QNetworkProxy>
2013-11-23 13:48:34 +07:00
2020-03-15 18:10:26 +07:00
namespace
{
#ifdef DEVELOP
const auto updatesUrl = "http://localhost:8081/updates.json";
#else
const auto updatesUrl =
"https://raw.githubusercontent.com/OneMoreGres/ScreenTranslator/master/"
"updates.json";
#endif
} // namespace
2020-02-21 00:45:53 +07:00
Manager::Manager()
2020-03-15 18:10:26 +07:00
: updater_(std::make_unique<update::Loader>(QUrl(updatesUrl)))
2020-02-21 00:45:53 +07:00
{
tray_ = std::make_unique<TrayIcon>(*this);
capturer_ = std::make_unique<Capturer>(*this);
recognizer_ = std::make_unique<Recognizer>(*this);
translator_ = std::make_unique<Translator>(*this);
corrector_ = std::make_unique<Corrector>(*this);
representer_ = std::make_unique<Representer>(*this, *tray_);
2013-11-23 13:48:34 +07:00
2020-02-21 00:45:53 +07:00
qRegisterMetaType<TaskPtr>();
2013-11-23 13:48:34 +07:00
2020-02-21 00:45:53 +07:00
Settings settings;
settings.load();
updateSettings(settings);
2020-03-09 15:29:51 +07:00
if (settings.showMessageOnStart)
tray_->showInformation(QObject::tr("Screen translator started"));
2020-03-15 18:10:26 +07:00
QObject::connect(updater_.get(), &update::Loader::error, //
tray_.get(), &TrayIcon::showError);
QObject::connect(updater_.get(), &update::Loader::updated, //
tray_.get(), [this] {
tray_->showInformation(QObject::tr("Update completed"));
});
2020-03-17 01:44:33 +07:00
QObject::connect(updater_.get(), &update::Loader::updatesAvailable, //
tray_.get(), [this] {
tray_->showInformation(QObject::tr("Updates available"));
});
2020-03-15 18:10:26 +07:00
#ifdef DEVELOP
updater_->checkForUpdates();
#endif
}
2020-03-18 01:32:36 +07:00
Manager::~Manager()
{
if (updateAutoChecker_ && updateAutoChecker_->isLastCheckDateChanged()) {
Settings settings;
settings.load();
settings.lastUpdateCheck = updateAutoChecker_->lastCheckDate();
settings.save();
}
}
2013-11-24 19:43:37 +07:00
2020-02-21 00:45:53 +07:00
void Manager::updateSettings(const Settings &settings)
{
LTRACE() << "updateSettings";
2020-03-07 00:53:53 +07:00
setupProxy(settings);
2020-03-15 18:10:26 +07:00
updater_->model()->setExpansions({
{"$translators$", settings.translatorsDir},
{"$tessdata$", settings.tessdataPath},
});
2020-03-18 01:32:36 +07:00
if (settings.autoUpdateIntervalDays > 0) {
updateAutoChecker_ = std::make_unique<update::AutoChecker>(*updater_);
updateAutoChecker_->setLastCheckDate(settings.lastUpdateCheck);
updateAutoChecker_->setCheckIntervalDays(settings.autoUpdateIntervalDays);
} else {
updateAutoChecker_.reset();
}
2020-03-15 18:10:26 +07:00
2020-02-21 00:45:53 +07:00
tray_->updateSettings(settings);
capturer_->updateSettings(settings);
recognizer_->updateSettings(settings);
translator_->updateSettings(settings);
corrector_->updateSettings(settings);
representer_->updateSettings(settings);
}
2020-03-07 00:53:53 +07:00
void Manager::setupProxy(const Settings &settings)
{
if (settings.proxyType == ProxyType::System) {
QNetworkProxyFactory::setUseSystemConfiguration(true);
return;
}
QNetworkProxyFactory::setUseSystemConfiguration(false);
if (settings.proxyType == ProxyType::Disabled) {
QNetworkProxy::setApplicationProxy({});
return;
}
QNetworkProxy proxy;
using T = QNetworkProxy::ProxyType;
proxy.setType(settings.proxyType == ProxyType::Socks5 ? T::Socks5Proxy
: T::HttpProxy);
proxy.setHostName(settings.proxyHostName);
proxy.setPort(settings.proxyPort);
proxy.setUser(settings.proxyUser);
proxy.setPassword(settings.proxyPassword);
QNetworkProxy::setApplicationProxy(proxy);
}
2020-02-21 00:45:53 +07:00
void Manager::finishTask(const TaskPtr &task)
{
SOFT_ASSERT(task, return );
LTRACE() << "finishTask" << task->captured << task->error;
2020-02-21 00:45:53 +07:00
--activeTaskCount_;
tray_->setActiveTaskCount(activeTaskCount_);
2020-02-21 00:45:53 +07:00
last_ = task;
tray_->setTaskActionsEnabled(last_->isValid());
2020-02-21 00:45:53 +07:00
if (!task->isValid()) {
tray_->showError(task->error);
return;
2015-10-10 18:45:57 +07:00
}
2020-02-21 00:45:53 +07:00
tray_->showSuccess();
}
2014-04-04 21:39:10 +07:00
2020-02-21 00:45:53 +07:00
void Manager::captured(const TaskPtr &task)
{
tray_->blockActions(false);
2020-02-21 00:45:53 +07:00
SOFT_ASSERT(task, return );
LTRACE() << "captured" << task->captured << task->error;
2020-02-21 00:45:53 +07:00
++activeTaskCount_;
tray_->setActiveTaskCount(activeTaskCount_);
2013-11-24 20:06:19 +07:00
2020-02-21 00:45:53 +07:00
if (!task->isValid()) {
finishTask(task);
return;
}
2020-02-21 00:45:53 +07:00
recognizer_->recognize(task);
}
2020-02-21 00:45:53 +07:00
void Manager::captureCanceled()
{
tray_->blockActions(false);
2013-11-24 19:43:37 +07:00
}
2020-02-21 00:45:53 +07:00
void Manager::recognized(const TaskPtr &task)
{
SOFT_ASSERT(task, return );
LTRACE() << "recognized" << task->recognized << task->error;
2020-02-21 00:45:53 +07:00
if (!task->isValid()) {
finishTask(task);
return;
}
2020-02-21 00:45:53 +07:00
corrector_->correct(task);
}
2020-02-21 00:45:53 +07:00
void Manager::corrected(const TaskPtr &task)
{
SOFT_ASSERT(task, return );
LTRACE() << "corrected" << task->recognized << task->error;
if (!task->isValid()) {
finishTask(task);
return;
}
2013-11-23 13:48:34 +07:00
2020-02-21 00:45:53 +07:00
if (!task->targetLanguage.isEmpty())
translator_->translate(task);
else
translated(task);
2013-11-23 13:48:34 +07:00
}
2020-02-21 00:45:53 +07:00
void Manager::translated(const TaskPtr &task)
{
SOFT_ASSERT(task, return );
LTRACE() << "translated" << task->recognized << task->error;
2013-11-23 13:48:34 +07:00
2020-02-21 00:45:53 +07:00
finishTask(task);
2013-11-24 20:06:19 +07:00
2020-02-21 00:45:53 +07:00
if (!task->isValid())
return;
representer_->represent(task);
}
void Manager::applySettings(const Settings &settings)
{
updateSettings(settings);
settings.save();
}
2020-02-21 00:45:53 +07:00
void Manager::fatalError(const QString &text)
{
tray_->blockActions(false);
tray_->showFatalError(text);
}
2020-02-21 00:45:53 +07:00
void Manager::capture()
{
SOFT_ASSERT(capturer_, return );
tray_->blockActions(true);
capturer_->capture();
tray_->setRepeatCaptureEnabled(true);
}
2020-02-21 00:45:53 +07:00
void Manager::repeatCapture()
{
SOFT_ASSERT(capturer_, return );
tray_->blockActions(true);
capturer_->repeatCapture();
}
2020-02-21 00:45:53 +07:00
void Manager::showLast()
{
if (!last_ || !last_->isValid())
return;
SOFT_ASSERT(representer_, return );
representer_->represent(last_);
}
2020-02-21 00:45:53 +07:00
void Manager::settings()
{
SettingsEditor editor(*this, *updater_);
2020-02-21 00:45:53 +07:00
Settings settings;
settings.load();
editor.setSettings(settings);
tray_->blockActions(true);
auto result = editor.exec();
tray_->blockActions(false);
if (result != QDialog::Accepted)
return;
2020-02-21 00:45:53 +07:00
tray_->resetFatalError();
settings = editor.settings();
settings.save();
updateSettings(settings);
2013-11-24 19:43:37 +07:00
}
2013-11-23 13:48:34 +07:00
2020-02-21 00:45:53 +07:00
void Manager::copyLastToClipboard()
{
if (!last_ || !last_->isValid())
return;
QClipboard *clipboard = QApplication::clipboard();
clipboard->setText(last_->recognized + QLatin1String(" - ") +
last_->translated);
tray_->showInformation(
QObject::tr("The last result was copied to the clipboard."));
2013-11-23 13:48:34 +07:00
}
2020-02-21 00:45:53 +07:00
void Manager::about()
{
auto text =
QObject::tr(R"(Optical character recognition (OCR) and translation tool
Author: Gres (translator@gres.biz)
Version: %1)")
.arg(QApplication::applicationVersion());
QMessageBox message(QMessageBox::Information, QObject::tr("About"), text,
QMessageBox::Ok);
message.setIconPixmap(QIcon(":/icons/app.png").pixmap(QSize(64, 64)));
message.exec();
}
2020-02-21 00:45:53 +07:00
void Manager::quit()
{
QApplication::quit();
}