diff --git a/src/settings.cpp b/src/settings.cpp index f2336e3..f62554e 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -1,10 +1,13 @@ #include "settings.h" +#include #include #include namespace { +const QString iniFileName = "settings.ini"; + const QString qs_guiGroup = "GUI"; const QString qs_captureHotkey = "captureHotkey"; const QString qs_repeatCaptureHotkey = "repeatCaptureHotkey"; @@ -95,15 +98,14 @@ void cleanupOutdated(QSettings& settings) void Settings::save() const { - const auto baseDataPath = - QStandardPaths::writableLocation(QStandardPaths::AppDataLocation); - tessdataPath = baseDataPath + "/tessdata"; - translatorsDir = baseDataPath + "/translators"; -} - -void Settings::save() -{ - QSettings settings; + std::unique_ptr ptr; + if (isPortable_) { + ptr = std::make_unique(iniFileName, QSettings::IniFormat); + } else { + ptr = std::make_unique(); + QFile::remove(iniFileName); + } + auto& settings = *ptr; settings.beginGroup(qs_guiGroup); @@ -156,7 +158,15 @@ void Settings::save() void Settings::load() { - QSettings settings; + std::unique_ptr ptr; + if (QFile::exists(iniFileName)) { + ptr = std::make_unique(iniFileName, QSettings::IniFormat); + setPortable(true); + } else { + ptr = std::make_unique(); + setPortable(false); + } + auto& settings = *ptr; settings.beginGroup(qs_guiGroup); @@ -218,3 +228,20 @@ void Settings::load() settings.endGroup(); } + +bool Settings::isPortable() const +{ + return isPortable_; +} + +void Settings::setPortable(bool isPortable) +{ + isPortable_ = isPortable; + + const auto baseDataPath = + isPortable + ? "." + : QStandardPaths::writableLocation(QStandardPaths::AppDataLocation); + tessdataPath = baseDataPath + "/tessdata"; + translatorsDir = baseDataPath + "/translators"; +} diff --git a/src/settings.h b/src/settings.h index a67345c..65f4532 100644 --- a/src/settings.h +++ b/src/settings.h @@ -24,6 +24,9 @@ public: void save() const; void load(); + bool isPortable() const; + void setPortable(bool isPortable); + QString captureHotkey{"Ctrl+Alt+Z"}; QString repeatCaptureHotkey{"Ctrl+Alt+S"}; QString showLastHotkey{"Ctrl+Alt+X"}; @@ -59,4 +62,7 @@ public: QStringList translators{"google.js"}; ResultMode resultShowType{ResultMode::Widget}; // dialog + +private: + bool isPortable_{false}; }; diff --git a/src/settingseditor.cpp b/src/settingseditor.cpp index f38af38..7c4010d 100644 --- a/src/settingseditor.cpp +++ b/src/settingseditor.cpp @@ -1,5 +1,4 @@ #include "settingseditor.h" -#include "debug.h" #include "languagecodes.h" #include "manager.h" #include "ui_settingseditor.h" @@ -21,6 +20,8 @@ SettingsEditor::SettingsEditor(Manager &manager, update::Loader &updater) connect(ui->buttonBox, &QDialogButtonBox::clicked, // this, &SettingsEditor::handleButtonBoxClicked); + connect(ui->portable, &QCheckBox::toggled, // + this, &SettingsEditor::handlePortableChanged); { auto model = new QStringListModel(this); model->setStringList({tr("General"), tr("Recognition"), tr("Correction"), @@ -94,6 +95,8 @@ SettingsEditor::~SettingsEditor() Settings SettingsEditor::settings() const { Settings settings; + settings.setPortable(ui->portable->isChecked()); + settings.captureHotkey = ui->captureEdit->keySequence().toString(); settings.repeatCaptureHotkey = ui->repeatCaptureEdit->keySequence().toString(); @@ -138,6 +141,9 @@ Settings SettingsEditor::settings() const void SettingsEditor::setSettings(const Settings &settings) { + wasPortable_ = settings.isPortable(); + ui->portable->setChecked(settings.isPortable()); + ui->captureEdit->setKeySequence(settings.captureHotkey); ui->repeatCaptureEdit->setKeySequence(settings.repeatCaptureHotkey); ui->repeatEdit->setKeySequence(settings.showLastHotkey); @@ -269,7 +275,28 @@ void SettingsEditor::handleButtonBoxClicked(QAbstractButton *button) return; } if (button == ui->buttonBox->button(QDialogButtonBox::Apply)) { - manager_.applySettings(settings()); + const auto settings = this->settings(); + manager_.applySettings(settings); + if (settings.isPortable() != wasPortable_) { + wasPortable_ = settings.isPortable(); + handlePortableChanged(); + } return; } } + +void SettingsEditor::handlePortableChanged() +{ + Settings settings; + settings.setPortable(ui->portable->isChecked()); + ui->tessdataPath->setText(settings.tessdataPath); + ui->translatorsPath->setText(settings.translatorsDir); + updateTesseractLanguages(); + updateTranslators(); + + const auto portableChanged = wasPortable_ != settings.isPortable(); + ui->pageUpdate->setEnabled(!portableChanged); + ui->pageUpdate->setToolTip(portableChanged + ? tr("Portable changed. Apply settings first") + : QString()); +} diff --git a/src/settingseditor.h b/src/settingseditor.h index 0da6f7e..eb7155a 100644 --- a/src/settingseditor.h +++ b/src/settingseditor.h @@ -28,9 +28,11 @@ private: void updateTranslationLanguages(); void adjustUpdatesView(); void handleButtonBoxClicked(QAbstractButton *button); + void handlePortableChanged(); Ui::SettingsEditor *ui; Manager &manager_; update::Loader &updater_; QStringList enabledTranslators_; + bool wasPortable_{false}; }; diff --git a/src/settingseditor.ui b/src/settingseditor.ui index bda1222..53d283e 100644 --- a/src/settingseditor.ui +++ b/src/settingseditor.ui @@ -179,6 +179,13 @@ + + + + Portable (store data in same folder) + + +