diff --git a/src/capture/capturer.cpp b/src/capture/capturer.cpp index 13c7007..b58716a 100644 --- a/src/capture/capturer.cpp +++ b/src/capture/capturer.cpp @@ -6,8 +6,9 @@ #include -Capturer::Capturer(Manager &manager) +Capturer::Capturer(Manager &manager, const Settings &settings) : manager_(manager) + , settings_(settings) { } @@ -21,12 +22,8 @@ void Capturer::repeatCapture() 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) @@ -34,10 +31,10 @@ void Capturer::captured(const TaskPtr &task) hideOverlays(); // TODO respect more overlay's options // TODO process modifiers - task->translators = translators_; - task->sourceLanguage = sourceLanguage_; - if (doTranslation_) - task->targetLanguage = targetLanguage_; + task->translators = settings_.translators; + task->sourceLanguage = settings_.sourceLanguage; + if (settings_.doTranslation) + task->targetLanguage = settings_.targetLanguage; manager_.captured(task); } diff --git a/src/capture/capturer.h b/src/capture/capturer.h index d5b5547..013666c 100644 --- a/src/capture/capturer.h +++ b/src/capture/capturer.h @@ -2,8 +2,6 @@ #include "stfwd.h" -#include - #include class CaptureOverlay; @@ -11,11 +9,11 @@ class CaptureOverlay; class Capturer { public: - explicit Capturer(Manager &manager); + Capturer(Manager &manager, const Settings &settings); void capture(); void repeatCapture(); - void updateSettings(const Settings &settings); + void updateSettings(); void captured(const TaskPtr &task); void canceled(); @@ -25,10 +23,6 @@ private: void hideOverlays(); Manager &manager_; + const Settings &settings_; std::vector overlays_; - - LanguageId sourceLanguage_; - LanguageId targetLanguage_; - QStringList translators_; - bool doTranslation_{false}; }; diff --git a/src/correct/corrector.cpp b/src/correct/corrector.cpp index 7725803..197db88 100644 --- a/src/correct/corrector.cpp +++ b/src/correct/corrector.cpp @@ -1,10 +1,12 @@ #include "corrector.h" #include "debug.h" #include "manager.h" +#include "settings.h" #include "task.h" -Corrector::Corrector(Manager &manager) +Corrector::Corrector(Manager &manager, const Settings &settings) : manager_(manager) + , settings_(settings) { } @@ -18,15 +20,14 @@ void Corrector::correct(const TaskPtr &task) return; } - if (!userSubstitutions_.empty()) + if (!settings_.userSubstitutions.empty()) task->corrected = substituteUser(task->recognized, task->sourceLanguage); manager_.corrected(task); } -void Corrector::updateSettings(const Settings &settings) +void Corrector::updateSettings() { - userSubstitutions_ = settings.userSubstitutions; } QString Corrector::substituteUser(const QString &source, @@ -34,8 +35,8 @@ QString Corrector::substituteUser(const QString &source, { auto result = source; - const auto range = userSubstitutions_.equal_range(language); - if (range.first == userSubstitutions_.cend()) + const auto range = settings_.userSubstitutions.equal_range(language); + if (range.first == settings_.userSubstitutions.cend()) return result; while (true) { diff --git a/src/correct/corrector.h b/src/correct/corrector.h index a74a494..a0d819e 100644 --- a/src/correct/corrector.h +++ b/src/correct/corrector.h @@ -1,20 +1,19 @@ #pragma once -#include "settings.h" #include "stfwd.h" class Corrector { public: - explicit Corrector(Manager &manager); + Corrector(Manager &manager, const Settings &settings); void correct(const TaskPtr &task); - void updateSettings(const Settings &settings); + void updateSettings(); private: QString substituteUser(const QString &source, const LanguageId &language) const; Manager &manager_; - Substitutions userSubstitutions_; + const Settings &settings_; }; diff --git a/src/manager.cpp b/src/manager.cpp index 930c2ed..1265b2d 100644 --- a/src/manager.cpp +++ b/src/manager.cpp @@ -27,22 +27,24 @@ const auto updatesUrl = } // namespace Manager::Manager() - : updater_(std::make_unique(QUrl(updatesUrl))) + : settings_(std::make_unique()) + , updater_(std::make_unique(QUrl(updatesUrl))) { - tray_ = std::make_unique(*this); - capturer_ = std::make_unique(*this); - recognizer_ = std::make_unique(*this); - translator_ = std::make_unique(*this); - corrector_ = std::make_unique(*this); - representer_ = std::make_unique(*this, *tray_); + SOFT_ASSERT(settings_, return ); + + tray_ = std::make_unique(*this, *settings_); + capturer_ = std::make_unique(*this, *settings_); + recognizer_ = std::make_unique(*this, *settings_); + translator_ = std::make_unique(*this, *settings_); + corrector_ = std::make_unique(*this, *settings_); + representer_ = std::make_unique(*this, *tray_, *settings_); qRegisterMetaType(); - Settings settings; - settings.load(); - updateSettings(settings); + settings_->load(); + updateSettings(); - if (settings.showMessageOnStart) + if (settings_->showMessageOnStart) tray_->showInformation(QObject::tr("Screen translator started")); QObject::connect(updater_.get(), &update::Loader::error, // @@ -62,33 +64,37 @@ Manager::Manager() Manager::~Manager() { - if (updateAutoChecker_ && updateAutoChecker_->isLastCheckDateChanged()) - Settings::saveLastUpdateCheck(updateAutoChecker_->lastCheckDate()); + SOFT_ASSERT(settings_, return ); + if (updateAutoChecker_ && updateAutoChecker_->isLastCheckDateChanged()) { + settings_->lastUpdateCheck = updateAutoChecker_->lastCheckDate(); + settings_->saveLastUpdateCheck(); + } } -void Manager::updateSettings(const Settings &settings) +void Manager::updateSettings() { LTRACE() << "updateSettings"; - setupProxy(settings); + SOFT_ASSERT(settings_, return ); + setupProxy(*settings_); updater_->model()->setExpansions({ - {"$translators$", settings.translatorsDir}, - {"$tessdata$", settings.tessdataPath}, + {"$translators$", settings_->translatorsDir}, + {"$tessdata$", settings_->tessdataPath}, }); - if (settings.autoUpdateIntervalDays > 0) { + if (settings_->autoUpdateIntervalDays > 0) { updateAutoChecker_ = std::make_unique(*updater_); - updateAutoChecker_->setLastCheckDate(settings.lastUpdateCheck); - updateAutoChecker_->setCheckIntervalDays(settings.autoUpdateIntervalDays); + updateAutoChecker_->setLastCheckDate(settings_->lastUpdateCheck); + updateAutoChecker_->setCheckIntervalDays(settings_->autoUpdateIntervalDays); } else { updateAutoChecker_.reset(); } - tray_->updateSettings(settings); - capturer_->updateSettings(settings); - recognizer_->updateSettings(settings); - translator_->updateSettings(settings); - corrector_->updateSettings(settings); - representer_->updateSettings(settings); + tray_->updateSettings(); + capturer_->updateSettings(); + recognizer_->updateSettings(); + translator_->updateSettings(); + corrector_->updateSettings(); + representer_->updateSettings(); } void Manager::setupProxy(const Settings &settings) @@ -202,8 +208,10 @@ void Manager::translated(const TaskPtr &task) void Manager::applySettings(const Settings &settings) { - updateSettings(settings); - settings.save(); + SOFT_ASSERT(settings_, return ); + *settings_ = settings; + settings_->save(); + updateSettings(); } void Manager::fatalError(const QString &text) @@ -239,9 +247,8 @@ void Manager::settings() { SettingsEditor editor(*this, *updater_); - Settings settings; - settings.load(); - editor.setSettings(settings); + SOFT_ASSERT(settings_, return ); + editor.setSettings(*settings_); tray_->blockActions(true); auto result = editor.exec(); @@ -252,9 +259,8 @@ void Manager::settings() tray_->resetFatalError(); - settings = editor.settings(); - settings.save(); - updateSettings(settings); + const auto edited = editor.settings(); + applySettings(edited); } void Manager::copyLastToClipboard() diff --git a/src/manager.h b/src/manager.h index f0d7fd7..27f18e4 100644 --- a/src/manager.h +++ b/src/manager.h @@ -27,10 +27,11 @@ public: void quit(); private: - void updateSettings(const Settings &settings); + void updateSettings(); void setupProxy(const Settings &settings); void finishTask(const TaskPtr &task); + std::unique_ptr settings_; std::unique_ptr tray_; std::unique_ptr capturer_; std::unique_ptr recognizer_; diff --git a/src/ocr/recognizer.cpp b/src/ocr/recognizer.cpp index f757ad6..a367558 100644 --- a/src/ocr/recognizer.cpp +++ b/src/ocr/recognizer.cpp @@ -6,8 +6,9 @@ #include -Recognizer::Recognizer(Manager &manager) +Recognizer::Recognizer(Manager &manager, const Settings &settings) : manager_(manager) + , settings_(settings) , workerThread_(new QThread(this)) { auto worker = new RecognizeWorker; @@ -37,12 +38,12 @@ Recognizer::~Recognizer() 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")); return; } - emit reset(settings.tessdataPath); + emit reset(settings_.tessdataPath); } diff --git a/src/ocr/recognizer.h b/src/ocr/recognizer.h index 3d66c5b..1eed33b 100644 --- a/src/ocr/recognizer.h +++ b/src/ocr/recognizer.h @@ -8,10 +8,10 @@ class Recognizer : public QObject { Q_OBJECT public: - explicit Recognizer(Manager &manager); + Recognizer(Manager &manager, const Settings &settings); ~Recognizer(); - void updateSettings(const Settings &settings); + void updateSettings(); signals: void recognize(const TaskPtr &task); @@ -21,5 +21,6 @@ private: void recognized(const TaskPtr &task); Manager &manager_; + const Settings &settings_; QThread *workerThread_; }; diff --git a/src/represent/representer.cpp b/src/represent/representer.cpp index ab6efaa..e39b40e 100644 --- a/src/represent/representer.cpp +++ b/src/represent/representer.cpp @@ -5,10 +5,11 @@ #include "task.h" #include "trayicon.h" -Representer::Representer(Manager &manager, TrayIcon &tray) +Representer::Representer(Manager &manager, TrayIcon &tray, + const Settings &settings) : manager_(manager) , tray_(tray) - , mode_{ResultMode::Widget} + , settings_(settings) { } @@ -16,20 +17,16 @@ Representer::~Representer() = default; void Representer::represent(const TaskPtr &task) { - if (mode_ == ResultMode::Tooltip) + if (settings_.resultShowType == ResultMode::Tooltip) showTooltip(task); else 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_) - widget_->updateSettings(font_, showRecognized_, showCaptured_); + widget_->updateSettings(); } void Representer::showTooltip(const TaskPtr &task) @@ -40,10 +37,8 @@ void Representer::showTooltip(const TaskPtr &task) void Representer::showWidget(const TaskPtr &task) { - if (!widget_) { - widget_ = std::make_unique(); - widget_->updateSettings(font_, showRecognized_, showCaptured_); - } + if (!widget_) + widget_ = std::make_unique(settings_); widget_->show(task); } diff --git a/src/represent/representer.h b/src/represent/representer.h index ded9aac..56b5fa0 100644 --- a/src/represent/representer.h +++ b/src/represent/representer.h @@ -2,19 +2,17 @@ #include "stfwd.h" -#include - enum class ResultMode; class ResultWidget; class Representer { public: - Representer(Manager &manager, TrayIcon &tray); + Representer(Manager &manager, TrayIcon &tray, const Settings &settings); ~Representer(); void represent(const TaskPtr &task); - void updateSettings(const Settings &settings); + void updateSettings(); private: void showTooltip(const TaskPtr &task); @@ -22,9 +20,6 @@ private: Manager &manager_; TrayIcon &tray_; + const Settings &settings_; std::unique_ptr widget_; - ResultMode mode_; - QFont font_; - bool showRecognized_{true}; - bool showCaptured_{true}; }; diff --git a/src/represent/resultwidget.cpp b/src/represent/resultwidget.cpp index 2eec5f1..25c9b51 100644 --- a/src/represent/resultwidget.cpp +++ b/src/represent/resultwidget.cpp @@ -1,5 +1,6 @@ #include "resultwidget.h" #include "debug.h" +#include "settings.h" #include "task.h" #include @@ -8,8 +9,9 @@ #include #include -ResultWidget::ResultWidget(QWidget *parent) +ResultWidget::ResultWidget(const Settings &settings, QWidget *parent) : QFrame(parent) + , settings_(settings) , image_(new QLabel(this)) , recognized_(new QLabel(this)) , translated_(new QLabel(this)) @@ -66,7 +68,7 @@ void ResultWidget::show(const TaskPtr &task) const auto gotTranslation = !task->translated.isEmpty(); translated_->setVisible(gotTranslation); - const auto mustShowRecognized = showRecognized_ || !gotTranslation; + const auto mustShowRecognized = settings_.showRecognized || !gotTranslation; recognized_->setVisible(mustShowRecognized); show(); @@ -86,15 +88,14 @@ void ResultWidget::show(const TaskPtr &task) activateWindow(); } -void ResultWidget::updateSettings(const QFont &font, bool showRecognized, - bool showCaptured) +void ResultWidget::updateSettings() { // explicit font change because of stylesheet + QFont font(settings_.fontFamily, settings_.fontSize); recognized_->setFont(font); translated_->setFont(font); - image_->setVisible(showCaptured); - showRecognized_ = showRecognized; + image_->setVisible(settings_.showCaptured); } bool ResultWidget::eventFilter(QObject *watched, QEvent *event) diff --git a/src/represent/resultwidget.h b/src/represent/resultwidget.h index a5b5768..1d1e044 100644 --- a/src/represent/resultwidget.h +++ b/src/represent/resultwidget.h @@ -10,18 +10,17 @@ class ResultWidget : public QFrame { Q_OBJECT public: - ResultWidget(QWidget* parent = nullptr); + explicit ResultWidget(const Settings& settings, QWidget* parent = nullptr); void show(const TaskPtr& task); using QWidget::show; - void updateSettings(const QFont& font, bool showRecognized, - bool showCaptured); + void updateSettings(); bool eventFilter(QObject* watched, QEvent* event) override; private: + const Settings& settings_; QLabel* image_; QLabel* recognized_; QLabel* translated_; - bool showRecognized_{true}; }; diff --git a/src/settings.cpp b/src/settings.cpp index 2cd869b..23125ac 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -286,7 +286,7 @@ void Settings::load() settings.endGroup(); } -void Settings::saveLastUpdateCheck(const QDateTime& dt) +void Settings::saveLastUpdateCheck() { std::unique_ptr ptr; if (QFile::exists(iniFileName)) { @@ -297,7 +297,7 @@ void Settings::saveLastUpdateCheck(const QDateTime& dt) auto& settings = *ptr; settings.beginGroup(qs_guiGroup); - settings.setValue(qs_lastUpdateCheck, dt); + settings.setValue(qs_lastUpdateCheck, lastUpdateCheck); settings.endGroup(); } diff --git a/src/settings.h b/src/settings.h index 15b40a7..c1005bb 100644 --- a/src/settings.h +++ b/src/settings.h @@ -23,7 +23,7 @@ public: void save() const; void load(); - static void saveLastUpdateCheck(const QDateTime& dt); + void saveLastUpdateCheck(); bool isPortable() const; void setPortable(bool isPortable); diff --git a/src/translate/translator.cpp b/src/translate/translator.cpp index fcca56f..5c64f92 100644 --- a/src/translate/translator.cpp +++ b/src/translate/translator.cpp @@ -32,8 +32,9 @@ static std::map loadScripts(const QString &dir, return result; } -Translator::Translator(Manager &manager) +Translator::Translator(Manager &manager, const Settings &settings) : manager_(manager) + , settings_(settings) , view_(nullptr) , url_(new QLineEdit(this)) , loadImages_( @@ -106,7 +107,7 @@ void Translator::translate(const TaskPtr &task) processQueue(); } -void Translator::updateSettings(const Settings &settings) +void Translator::updateSettings() { view_->setPage(nullptr); pages_.clear(); @@ -121,11 +122,11 @@ void Translator::updateSettings(const Settings &settings) tabs_->blockSignals(false); const auto loaded = - loadScripts(settings.translatorsDir, settings.translators); + loadScripts(settings_.translatorsDir, settings_.translators); if (loaded.empty()) { manager_.fatalError( tr("No translators loaded from %1 (named %2)") - .arg(settings.translatorsDir, settings.translators.join(", "))); + .arg(settings_.translatorsDir, settings_.translators.join(", "))); return; } @@ -137,8 +138,8 @@ void Translator::updateSettings(const Settings &settings) SOFT_ASSERT(pageIt.second, continue); const auto &page = pageIt.first->second; - page->setIgnoreSslErrors(settings.ignoreSslErrors); - page->setTimeout(settings.translationTimeout); + page->setIgnoreSslErrors(settings_.ignoreSslErrors); + page->setTimeout(settings_.translationTimeout); auto log = new QTextEdit(tabs_); tabs_->addTab(log, scriptName); @@ -152,7 +153,7 @@ void Translator::updateSettings(const Settings &settings) log->document()->setMaximumBlockCount(1000); } - if (settings.debugMode) { + if (settings_.debugMode) { show(); } else { hide(); diff --git a/src/translate/translator.h b/src/translate/translator.h index f8b397b..df0fe49 100644 --- a/src/translate/translator.h +++ b/src/translate/translator.h @@ -14,11 +14,11 @@ class Translator : public QWidget { Q_OBJECT public: - explicit Translator(Manager &manager); + Translator(Manager &manager, const Settings &settings); ~Translator(); void translate(const TaskPtr &task); - void updateSettings(const Settings &settings); + void updateSettings(); void finish(const TaskPtr &task); protected: @@ -34,6 +34,7 @@ private: void markTranslated(const TaskPtr &task); Manager &manager_; + const Settings &settings_; QWebEngineView *view_; QLineEdit *url_; QAction *loadImages_; diff --git a/src/trayicon.cpp b/src/trayicon.cpp index bdb6560..4b8a356 100644 --- a/src/trayicon.cpp +++ b/src/trayicon.cpp @@ -7,8 +7,9 @@ #include #include -TrayIcon::TrayIcon(Manager &manager) +TrayIcon::TrayIcon(Manager &manager, const Settings &settings) : manager_(manager) + , settings_(settings) , tray_(std::make_unique()) , iconUpdateTimer_(std::make_unique()) { @@ -29,17 +30,18 @@ TrayIcon::TrayIcon(Manager &manager) TrayIcon::~TrayIcon() = default; -void TrayIcon::updateSettings(const Settings &settings) +void TrayIcon::updateSettings() { QStringList failedActions; - if (!GlobalAction::update(captureAction_, settings.captureHotkey)) - failedActions << settings.captureHotkey; - if (!GlobalAction::update(repeatCaptureAction_, settings.repeatCaptureHotkey)) - failedActions << settings.repeatCaptureHotkey; - if (!GlobalAction::update(showLastAction_, settings.showLastHotkey)) - failedActions << settings.showLastHotkey; - if (!GlobalAction::update(clipboardAction_, settings.clipboardHotkey)) - failedActions << settings.clipboardHotkey; + if (!GlobalAction::update(captureAction_, settings_.captureHotkey)) + failedActions << settings_.captureHotkey; + if (!GlobalAction::update(repeatCaptureAction_, + settings_.repeatCaptureHotkey)) + failedActions << settings_.repeatCaptureHotkey; + if (!GlobalAction::update(showLastAction_, settings_.showLastHotkey)) + failedActions << settings_.showLastHotkey; + if (!GlobalAction::update(clipboardAction_, settings_.clipboardHotkey)) + failedActions << settings_.clipboardHotkey; if (!failedActions.isEmpty()) { showError(tr("Failed to register global shortcuts:\n%1") diff --git a/src/trayicon.h b/src/trayicon.h index f47a406..35cb176 100644 --- a/src/trayicon.h +++ b/src/trayicon.h @@ -10,10 +10,10 @@ class TrayIcon : public QObject { Q_OBJECT public: - explicit TrayIcon(Manager &manager); + TrayIcon(Manager &manager, const Settings &settings); ~TrayIcon(); - void updateSettings(const Settings &settings); + void updateSettings(); void blockActions(bool block); void setTaskActionsEnabled(bool isEnabled); @@ -36,6 +36,7 @@ private: void updateActions(); Manager &manager_; + const Settings &settings_; std::unique_ptr tray_; QAction *captureAction_{nullptr};