Use only one settings instance

This commit is contained in:
Gres 2020-03-21 13:03:58 +03:00
parent 0da289e16f
commit 705bae636d
18 changed files with 120 additions and 125 deletions

View File

@ -6,8 +6,9 @@
#include <QApplication> #include <QApplication>
Capturer::Capturer(Manager &manager) Capturer::Capturer(Manager &manager, const Settings &settings)
: manager_(manager) : manager_(manager)
, settings_(settings)
{ {
} }
@ -21,12 +22,8 @@ void Capturer::repeatCapture()
showOverlays(false); showOverlays(false);
} }
void Capturer::updateSettings(const Settings &settings) void Capturer::updateSettings()
{ {
sourceLanguage_ = settings.sourceLanguage;
targetLanguage_ = settings.targetLanguage;
translators_ = settings.translators;
doTranslation_ = settings.doTranslation;
} }
void Capturer::captured(const TaskPtr &task) void Capturer::captured(const TaskPtr &task)
@ -34,10 +31,10 @@ void Capturer::captured(const TaskPtr &task)
hideOverlays(); hideOverlays();
// TODO respect more overlay's options // TODO respect more overlay's options
// TODO process modifiers // TODO process modifiers
task->translators = translators_; task->translators = settings_.translators;
task->sourceLanguage = sourceLanguage_; task->sourceLanguage = settings_.sourceLanguage;
if (doTranslation_) if (settings_.doTranslation)
task->targetLanguage = targetLanguage_; task->targetLanguage = settings_.targetLanguage;
manager_.captured(task); manager_.captured(task);
} }

View File

@ -2,8 +2,6 @@
#include "stfwd.h" #include "stfwd.h"
#include <QStringList>
#include <vector> #include <vector>
class CaptureOverlay; class CaptureOverlay;
@ -11,11 +9,11 @@ class CaptureOverlay;
class Capturer class Capturer
{ {
public: public:
explicit Capturer(Manager &manager); Capturer(Manager &manager, const Settings &settings);
void capture(); void capture();
void repeatCapture(); void repeatCapture();
void updateSettings(const Settings &settings); void updateSettings();
void captured(const TaskPtr &task); void captured(const TaskPtr &task);
void canceled(); void canceled();
@ -25,10 +23,6 @@ private:
void hideOverlays(); void hideOverlays();
Manager &manager_; Manager &manager_;
const Settings &settings_;
std::vector<CaptureOverlay *> overlays_; std::vector<CaptureOverlay *> overlays_;
LanguageId sourceLanguage_;
LanguageId targetLanguage_;
QStringList translators_;
bool doTranslation_{false};
}; };

View File

@ -1,10 +1,12 @@
#include "corrector.h" #include "corrector.h"
#include "debug.h" #include "debug.h"
#include "manager.h" #include "manager.h"
#include "settings.h"
#include "task.h" #include "task.h"
Corrector::Corrector(Manager &manager) Corrector::Corrector(Manager &manager, const Settings &settings)
: manager_(manager) : manager_(manager)
, settings_(settings)
{ {
} }
@ -18,15 +20,14 @@ void Corrector::correct(const TaskPtr &task)
return; return;
} }
if (!userSubstitutions_.empty()) if (!settings_.userSubstitutions.empty())
task->corrected = substituteUser(task->recognized, task->sourceLanguage); task->corrected = substituteUser(task->recognized, task->sourceLanguage);
manager_.corrected(task); manager_.corrected(task);
} }
void Corrector::updateSettings(const Settings &settings) void Corrector::updateSettings()
{ {
userSubstitutions_ = settings.userSubstitutions;
} }
QString Corrector::substituteUser(const QString &source, QString Corrector::substituteUser(const QString &source,
@ -34,8 +35,8 @@ QString Corrector::substituteUser(const QString &source,
{ {
auto result = source; auto result = source;
const auto range = userSubstitutions_.equal_range(language); const auto range = settings_.userSubstitutions.equal_range(language);
if (range.first == userSubstitutions_.cend()) if (range.first == settings_.userSubstitutions.cend())
return result; return result;
while (true) { while (true) {

View File

@ -1,20 +1,19 @@
#pragma once #pragma once
#include "settings.h"
#include "stfwd.h" #include "stfwd.h"
class Corrector class Corrector
{ {
public: public:
explicit Corrector(Manager &manager); Corrector(Manager &manager, const Settings &settings);
void correct(const TaskPtr &task); void correct(const TaskPtr &task);
void updateSettings(const Settings &settings); void updateSettings();
private: private:
QString substituteUser(const QString &source, QString substituteUser(const QString &source,
const LanguageId &language) const; const LanguageId &language) const;
Manager &manager_; Manager &manager_;
Substitutions userSubstitutions_; const Settings &settings_;
}; };

View File

@ -27,22 +27,24 @@ const auto updatesUrl =
} // namespace } // namespace
Manager::Manager() Manager::Manager()
: updater_(std::make_unique<update::Loader>(QUrl(updatesUrl))) : settings_(std::make_unique<Settings>())
, updater_(std::make_unique<update::Loader>(QUrl(updatesUrl)))
{ {
tray_ = std::make_unique<TrayIcon>(*this); SOFT_ASSERT(settings_, return );
capturer_ = std::make_unique<Capturer>(*this);
recognizer_ = std::make_unique<Recognizer>(*this); tray_ = std::make_unique<TrayIcon>(*this, *settings_);
translator_ = std::make_unique<Translator>(*this); capturer_ = std::make_unique<Capturer>(*this, *settings_);
corrector_ = std::make_unique<Corrector>(*this); recognizer_ = std::make_unique<Recognizer>(*this, *settings_);
representer_ = std::make_unique<Representer>(*this, *tray_); translator_ = std::make_unique<Translator>(*this, *settings_);
corrector_ = std::make_unique<Corrector>(*this, *settings_);
representer_ = std::make_unique<Representer>(*this, *tray_, *settings_);
qRegisterMetaType<TaskPtr>(); qRegisterMetaType<TaskPtr>();
Settings settings; settings_->load();
settings.load(); updateSettings();
updateSettings(settings);
if (settings.showMessageOnStart) if (settings_->showMessageOnStart)
tray_->showInformation(QObject::tr("Screen translator started")); tray_->showInformation(QObject::tr("Screen translator started"));
QObject::connect(updater_.get(), &update::Loader::error, // QObject::connect(updater_.get(), &update::Loader::error, //
@ -62,33 +64,37 @@ Manager::Manager()
Manager::~Manager() Manager::~Manager()
{ {
if (updateAutoChecker_ && updateAutoChecker_->isLastCheckDateChanged()) SOFT_ASSERT(settings_, return );
Settings::saveLastUpdateCheck(updateAutoChecker_->lastCheckDate()); if (updateAutoChecker_ && updateAutoChecker_->isLastCheckDateChanged()) {
settings_->lastUpdateCheck = updateAutoChecker_->lastCheckDate();
settings_->saveLastUpdateCheck();
}
} }
void Manager::updateSettings(const Settings &settings) void Manager::updateSettings()
{ {
LTRACE() << "updateSettings"; LTRACE() << "updateSettings";
setupProxy(settings); SOFT_ASSERT(settings_, return );
setupProxy(*settings_);
updater_->model()->setExpansions({ updater_->model()->setExpansions({
{"$translators$", settings.translatorsDir}, {"$translators$", settings_->translatorsDir},
{"$tessdata$", settings.tessdataPath}, {"$tessdata$", settings_->tessdataPath},
}); });
if (settings.autoUpdateIntervalDays > 0) { if (settings_->autoUpdateIntervalDays > 0) {
updateAutoChecker_ = std::make_unique<update::AutoChecker>(*updater_); updateAutoChecker_ = std::make_unique<update::AutoChecker>(*updater_);
updateAutoChecker_->setLastCheckDate(settings.lastUpdateCheck); updateAutoChecker_->setLastCheckDate(settings_->lastUpdateCheck);
updateAutoChecker_->setCheckIntervalDays(settings.autoUpdateIntervalDays); updateAutoChecker_->setCheckIntervalDays(settings_->autoUpdateIntervalDays);
} else { } else {
updateAutoChecker_.reset(); updateAutoChecker_.reset();
} }
tray_->updateSettings(settings); tray_->updateSettings();
capturer_->updateSettings(settings); capturer_->updateSettings();
recognizer_->updateSettings(settings); recognizer_->updateSettings();
translator_->updateSettings(settings); translator_->updateSettings();
corrector_->updateSettings(settings); corrector_->updateSettings();
representer_->updateSettings(settings); representer_->updateSettings();
} }
void Manager::setupProxy(const Settings &settings) void Manager::setupProxy(const Settings &settings)
@ -202,8 +208,10 @@ void Manager::translated(const TaskPtr &task)
void Manager::applySettings(const Settings &settings) void Manager::applySettings(const Settings &settings)
{ {
updateSettings(settings); SOFT_ASSERT(settings_, return );
settings.save(); *settings_ = settings;
settings_->save();
updateSettings();
} }
void Manager::fatalError(const QString &text) void Manager::fatalError(const QString &text)
@ -239,9 +247,8 @@ void Manager::settings()
{ {
SettingsEditor editor(*this, *updater_); SettingsEditor editor(*this, *updater_);
Settings settings; SOFT_ASSERT(settings_, return );
settings.load(); editor.setSettings(*settings_);
editor.setSettings(settings);
tray_->blockActions(true); tray_->blockActions(true);
auto result = editor.exec(); auto result = editor.exec();
@ -252,9 +259,8 @@ void Manager::settings()
tray_->resetFatalError(); tray_->resetFatalError();
settings = editor.settings(); const auto edited = editor.settings();
settings.save(); applySettings(edited);
updateSettings(settings);
} }
void Manager::copyLastToClipboard() void Manager::copyLastToClipboard()

View File

@ -27,10 +27,11 @@ public:
void quit(); void quit();
private: private:
void updateSettings(const Settings &settings); void updateSettings();
void setupProxy(const Settings &settings); void setupProxy(const Settings &settings);
void finishTask(const TaskPtr &task); void finishTask(const TaskPtr &task);
std::unique_ptr<Settings> settings_;
std::unique_ptr<TrayIcon> tray_; std::unique_ptr<TrayIcon> tray_;
std::unique_ptr<Capturer> capturer_; std::unique_ptr<Capturer> capturer_;
std::unique_ptr<Recognizer> recognizer_; std::unique_ptr<Recognizer> recognizer_;

View File

@ -6,8 +6,9 @@
#include <QThread> #include <QThread>
Recognizer::Recognizer(Manager &manager) Recognizer::Recognizer(Manager &manager, const Settings &settings)
: manager_(manager) : manager_(manager)
, settings_(settings)
, workerThread_(new QThread(this)) , workerThread_(new QThread(this))
{ {
auto worker = new RecognizeWorker; auto worker = new RecognizeWorker;
@ -37,12 +38,12 @@ Recognizer::~Recognizer()
workerThread_->terminate(); workerThread_->terminate();
} }
void Recognizer::updateSettings(const Settings &settings) void Recognizer::updateSettings()
{ {
if (settings.tessdataPath.isEmpty()) { if (settings_.tessdataPath.isEmpty()) {
manager_.fatalError(tr("Tessdata path is empty")); manager_.fatalError(tr("Tessdata path is empty"));
return; return;
} }
emit reset(settings.tessdataPath); emit reset(settings_.tessdataPath);
} }

View File

@ -8,10 +8,10 @@ class Recognizer : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit Recognizer(Manager &manager); Recognizer(Manager &manager, const Settings &settings);
~Recognizer(); ~Recognizer();
void updateSettings(const Settings &settings); void updateSettings();
signals: signals:
void recognize(const TaskPtr &task); void recognize(const TaskPtr &task);
@ -21,5 +21,6 @@ private:
void recognized(const TaskPtr &task); void recognized(const TaskPtr &task);
Manager &manager_; Manager &manager_;
const Settings &settings_;
QThread *workerThread_; QThread *workerThread_;
}; };

View File

@ -5,10 +5,11 @@
#include "task.h" #include "task.h"
#include "trayicon.h" #include "trayicon.h"
Representer::Representer(Manager &manager, TrayIcon &tray) Representer::Representer(Manager &manager, TrayIcon &tray,
const Settings &settings)
: manager_(manager) : manager_(manager)
, tray_(tray) , tray_(tray)
, mode_{ResultMode::Widget} , settings_(settings)
{ {
} }
@ -16,20 +17,16 @@ Representer::~Representer() = default;
void Representer::represent(const TaskPtr &task) void Representer::represent(const TaskPtr &task)
{ {
if (mode_ == ResultMode::Tooltip) if (settings_.resultShowType == ResultMode::Tooltip)
showTooltip(task); showTooltip(task);
else else
showWidget(task); showWidget(task);
} }
void Representer::updateSettings(const Settings &settings) void Representer::updateSettings()
{ {
mode_ = settings.resultShowType;
font_ = QFont(settings.fontFamily, settings.fontSize);
showRecognized_ = settings.showRecognized;
showCaptured_ = settings.showCaptured;
if (widget_) if (widget_)
widget_->updateSettings(font_, showRecognized_, showCaptured_); widget_->updateSettings();
} }
void Representer::showTooltip(const TaskPtr &task) void Representer::showTooltip(const TaskPtr &task)
@ -40,10 +37,8 @@ void Representer::showTooltip(const TaskPtr &task)
void Representer::showWidget(const TaskPtr &task) void Representer::showWidget(const TaskPtr &task)
{ {
if (!widget_) { if (!widget_)
widget_ = std::make_unique<ResultWidget>(); widget_ = std::make_unique<ResultWidget>(settings_);
widget_->updateSettings(font_, showRecognized_, showCaptured_);
}
widget_->show(task); widget_->show(task);
} }

View File

@ -2,19 +2,17 @@
#include "stfwd.h" #include "stfwd.h"
#include <QFont>
enum class ResultMode; enum class ResultMode;
class ResultWidget; class ResultWidget;
class Representer class Representer
{ {
public: public:
Representer(Manager &manager, TrayIcon &tray); Representer(Manager &manager, TrayIcon &tray, const Settings &settings);
~Representer(); ~Representer();
void represent(const TaskPtr &task); void represent(const TaskPtr &task);
void updateSettings(const Settings &settings); void updateSettings();
private: private:
void showTooltip(const TaskPtr &task); void showTooltip(const TaskPtr &task);
@ -22,9 +20,6 @@ private:
Manager &manager_; Manager &manager_;
TrayIcon &tray_; TrayIcon &tray_;
const Settings &settings_;
std::unique_ptr<ResultWidget> widget_; std::unique_ptr<ResultWidget> widget_;
ResultMode mode_;
QFont font_;
bool showRecognized_{true};
bool showCaptured_{true};
}; };

View File

@ -1,5 +1,6 @@
#include "resultwidget.h" #include "resultwidget.h"
#include "debug.h" #include "debug.h"
#include "settings.h"
#include "task.h" #include "task.h"
#include <QApplication> #include <QApplication>
@ -8,8 +9,9 @@
#include <QLabel> #include <QLabel>
#include <QMouseEvent> #include <QMouseEvent>
ResultWidget::ResultWidget(QWidget *parent) ResultWidget::ResultWidget(const Settings &settings, QWidget *parent)
: QFrame(parent) : QFrame(parent)
, settings_(settings)
, image_(new QLabel(this)) , image_(new QLabel(this))
, recognized_(new QLabel(this)) , recognized_(new QLabel(this))
, translated_(new QLabel(this)) , translated_(new QLabel(this))
@ -66,7 +68,7 @@ void ResultWidget::show(const TaskPtr &task)
const auto gotTranslation = !task->translated.isEmpty(); const auto gotTranslation = !task->translated.isEmpty();
translated_->setVisible(gotTranslation); translated_->setVisible(gotTranslation);
const auto mustShowRecognized = showRecognized_ || !gotTranslation; const auto mustShowRecognized = settings_.showRecognized || !gotTranslation;
recognized_->setVisible(mustShowRecognized); recognized_->setVisible(mustShowRecognized);
show(); show();
@ -86,15 +88,14 @@ void ResultWidget::show(const TaskPtr &task)
activateWindow(); activateWindow();
} }
void ResultWidget::updateSettings(const QFont &font, bool showRecognized, void ResultWidget::updateSettings()
bool showCaptured)
{ {
// explicit font change because of stylesheet // explicit font change because of stylesheet
QFont font(settings_.fontFamily, settings_.fontSize);
recognized_->setFont(font); recognized_->setFont(font);
translated_->setFont(font); translated_->setFont(font);
image_->setVisible(showCaptured); image_->setVisible(settings_.showCaptured);
showRecognized_ = showRecognized;
} }
bool ResultWidget::eventFilter(QObject *watched, QEvent *event) bool ResultWidget::eventFilter(QObject *watched, QEvent *event)

View File

@ -10,18 +10,17 @@ class ResultWidget : public QFrame
{ {
Q_OBJECT Q_OBJECT
public: public:
ResultWidget(QWidget* parent = nullptr); explicit ResultWidget(const Settings& settings, QWidget* parent = nullptr);
void show(const TaskPtr& task); void show(const TaskPtr& task);
using QWidget::show; using QWidget::show;
void updateSettings(const QFont& font, bool showRecognized, void updateSettings();
bool showCaptured);
bool eventFilter(QObject* watched, QEvent* event) override; bool eventFilter(QObject* watched, QEvent* event) override;
private: private:
const Settings& settings_;
QLabel* image_; QLabel* image_;
QLabel* recognized_; QLabel* recognized_;
QLabel* translated_; QLabel* translated_;
bool showRecognized_{true};
}; };

View File

@ -286,7 +286,7 @@ void Settings::load()
settings.endGroup(); settings.endGroup();
} }
void Settings::saveLastUpdateCheck(const QDateTime& dt) void Settings::saveLastUpdateCheck()
{ {
std::unique_ptr<QSettings> ptr; std::unique_ptr<QSettings> ptr;
if (QFile::exists(iniFileName)) { if (QFile::exists(iniFileName)) {
@ -297,7 +297,7 @@ void Settings::saveLastUpdateCheck(const QDateTime& dt)
auto& settings = *ptr; auto& settings = *ptr;
settings.beginGroup(qs_guiGroup); settings.beginGroup(qs_guiGroup);
settings.setValue(qs_lastUpdateCheck, dt); settings.setValue(qs_lastUpdateCheck, lastUpdateCheck);
settings.endGroup(); settings.endGroup();
} }

View File

@ -23,7 +23,7 @@ public:
void save() const; void save() const;
void load(); void load();
static void saveLastUpdateCheck(const QDateTime& dt); void saveLastUpdateCheck();
bool isPortable() const; bool isPortable() const;
void setPortable(bool isPortable); void setPortable(bool isPortable);

View File

@ -32,8 +32,9 @@ static std::map<QString, QString> loadScripts(const QString &dir,
return result; return result;
} }
Translator::Translator(Manager &manager) Translator::Translator(Manager &manager, const Settings &settings)
: manager_(manager) : manager_(manager)
, settings_(settings)
, view_(nullptr) , view_(nullptr)
, url_(new QLineEdit(this)) , url_(new QLineEdit(this))
, loadImages_( , loadImages_(
@ -106,7 +107,7 @@ void Translator::translate(const TaskPtr &task)
processQueue(); processQueue();
} }
void Translator::updateSettings(const Settings &settings) void Translator::updateSettings()
{ {
view_->setPage(nullptr); view_->setPage(nullptr);
pages_.clear(); pages_.clear();
@ -121,11 +122,11 @@ void Translator::updateSettings(const Settings &settings)
tabs_->blockSignals(false); tabs_->blockSignals(false);
const auto loaded = const auto loaded =
loadScripts(settings.translatorsDir, settings.translators); loadScripts(settings_.translatorsDir, settings_.translators);
if (loaded.empty()) { if (loaded.empty()) {
manager_.fatalError( manager_.fatalError(
tr("No translators loaded from %1 (named %2)") tr("No translators loaded from %1 (named %2)")
.arg(settings.translatorsDir, settings.translators.join(", "))); .arg(settings_.translatorsDir, settings_.translators.join(", ")));
return; return;
} }
@ -137,8 +138,8 @@ void Translator::updateSettings(const Settings &settings)
SOFT_ASSERT(pageIt.second, continue); SOFT_ASSERT(pageIt.second, continue);
const auto &page = pageIt.first->second; const auto &page = pageIt.first->second;
page->setIgnoreSslErrors(settings.ignoreSslErrors); page->setIgnoreSslErrors(settings_.ignoreSslErrors);
page->setTimeout(settings.translationTimeout); page->setTimeout(settings_.translationTimeout);
auto log = new QTextEdit(tabs_); auto log = new QTextEdit(tabs_);
tabs_->addTab(log, scriptName); tabs_->addTab(log, scriptName);
@ -152,7 +153,7 @@ void Translator::updateSettings(const Settings &settings)
log->document()->setMaximumBlockCount(1000); log->document()->setMaximumBlockCount(1000);
} }
if (settings.debugMode) { if (settings_.debugMode) {
show(); show();
} else { } else {
hide(); hide();

View File

@ -14,11 +14,11 @@ class Translator : public QWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit Translator(Manager &manager); Translator(Manager &manager, const Settings &settings);
~Translator(); ~Translator();
void translate(const TaskPtr &task); void translate(const TaskPtr &task);
void updateSettings(const Settings &settings); void updateSettings();
void finish(const TaskPtr &task); void finish(const TaskPtr &task);
protected: protected:
@ -34,6 +34,7 @@ private:
void markTranslated(const TaskPtr &task); void markTranslated(const TaskPtr &task);
Manager &manager_; Manager &manager_;
const Settings &settings_;
QWebEngineView *view_; QWebEngineView *view_;
QLineEdit *url_; QLineEdit *url_;
QAction *loadImages_; QAction *loadImages_;

View File

@ -7,8 +7,9 @@
#include <QMenu> #include <QMenu>
#include <QTimer> #include <QTimer>
TrayIcon::TrayIcon(Manager &manager) TrayIcon::TrayIcon(Manager &manager, const Settings &settings)
: manager_(manager) : manager_(manager)
, settings_(settings)
, tray_(std::make_unique<QSystemTrayIcon>()) , tray_(std::make_unique<QSystemTrayIcon>())
, iconUpdateTimer_(std::make_unique<QTimer>()) , iconUpdateTimer_(std::make_unique<QTimer>())
{ {
@ -29,17 +30,18 @@ TrayIcon::TrayIcon(Manager &manager)
TrayIcon::~TrayIcon() = default; TrayIcon::~TrayIcon() = default;
void TrayIcon::updateSettings(const Settings &settings) void TrayIcon::updateSettings()
{ {
QStringList failedActions; QStringList failedActions;
if (!GlobalAction::update(captureAction_, settings.captureHotkey)) if (!GlobalAction::update(captureAction_, settings_.captureHotkey))
failedActions << settings.captureHotkey; failedActions << settings_.captureHotkey;
if (!GlobalAction::update(repeatCaptureAction_, settings.repeatCaptureHotkey)) if (!GlobalAction::update(repeatCaptureAction_,
failedActions << settings.repeatCaptureHotkey; settings_.repeatCaptureHotkey))
if (!GlobalAction::update(showLastAction_, settings.showLastHotkey)) failedActions << settings_.repeatCaptureHotkey;
failedActions << settings.showLastHotkey; if (!GlobalAction::update(showLastAction_, settings_.showLastHotkey))
if (!GlobalAction::update(clipboardAction_, settings.clipboardHotkey)) failedActions << settings_.showLastHotkey;
failedActions << settings.clipboardHotkey; if (!GlobalAction::update(clipboardAction_, settings_.clipboardHotkey))
failedActions << settings_.clipboardHotkey;
if (!failedActions.isEmpty()) { if (!failedActions.isEmpty()) {
showError(tr("Failed to register global shortcuts:\n%1") showError(tr("Failed to register global shortcuts:\n%1")

View File

@ -10,10 +10,10 @@ class TrayIcon : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit TrayIcon(Manager &manager); TrayIcon(Manager &manager, const Settings &settings);
~TrayIcon(); ~TrayIcon();
void updateSettings(const Settings &settings); void updateSettings();
void blockActions(bool block); void blockActions(bool block);
void setTaskActionsEnabled(bool isEnabled); void setTaskActionsEnabled(bool isEnabled);
@ -36,6 +36,7 @@ private:
void updateActions(); void updateActions();
Manager &manager_; Manager &manager_;
const Settings &settings_;
std::unique_ptr<QSystemTrayIcon> tray_; std::unique_ptr<QSystemTrayIcon> tray_;
QAction *captureAction_{nullptr}; QAction *captureAction_{nullptr};