ScreenTranslator/src/settings.cpp

332 lines
11 KiB
C++
Raw Normal View History

2020-02-21 00:45:53 +07:00
#include "settings.h"
2020-03-20 02:35:42 +07:00
#include "runatsystemstart.h"
2020-02-21 00:45:53 +07:00
2020-03-22 15:39:59 +07:00
#include <QApplication>
2020-03-15 19:30:24 +07:00
#include <QFile>
2020-03-22 15:39:59 +07:00
#include <QFont>
2020-02-21 00:45:53 +07:00
#include <QSettings>
#include <QStandardPaths>
2020-02-21 00:45:53 +07:00
namespace
{
2020-03-15 19:30:24 +07:00
const QString iniFileName = "settings.ini";
2020-02-21 00:45:53 +07:00
const QString qs_guiGroup = "GUI";
const QString qs_captureHotkey = "captureHotkey";
const QString qs_repeatCaptureHotkey = "repeatCaptureHotkey";
const QString qs_repeatHotkey = "repeatHotkey";
const QString qs_clipboardHotkey = "clipboardHotkey";
const QString qs_captureLockedHotkey = "captureLockedHotkey";
2020-02-21 00:45:53 +07:00
const QString qs_resultShowType = "resultShowType";
const QString qs_proxyType = "proxyType";
const QString qs_proxyHostName = "proxyHostName";
const QString qs_proxyPort = "proxyPort";
const QString qs_proxyUser = "proxyUser";
const QString qs_proxyPassword = "proxyPassword";
const QString qs_proxySavePassword = "proxySavePassword";
const QString qs_autoUpdateType = "autoUpdateType";
const QString qs_lastUpdateCheck = "lastUpdateCheck";
2020-03-09 15:29:51 +07:00
const QString qs_showMessageOnStart = "showMessageOnStart";
2020-02-21 00:45:53 +07:00
const QString qs_recogntionGroup = "Recognition";
const QString qs_ocrLanguage = "language";
2020-03-08 17:49:15 +07:00
const QString qs_correctionGroup = "Correction";
const QString qs_userSubstitutions = "userSubstitutions";
const QString qs_useUserSubstitutions = "useUserSubstitutions";
2020-02-21 00:45:53 +07:00
const QString qs_translationGroup = "Translation";
const QString qs_doTranslation = "doTranslation";
const QString qs_ignoreSslErrors = "ignoreSslErrors";
const QString qs_translationLanguage = "translation_language";
const QString qs_translationTimeout = "translation_timeout";
const QString qs_translators = "translators";
2020-03-20 01:47:46 +07:00
const QString qs_representationGroup = "Representation";
const QString qs_fontFamily = "fontFamily";
const QString qs_fontSize = "fontSize";
const QString qs_fontColor = "fontColor";
const QString qs_backgroundColor = "backgroundColor";
const QString qs_showRecognized = "showRecognized";
const QString qs_showCaptured = "showCaptured";
2020-03-20 01:47:46 +07:00
2020-03-08 17:49:15 +07:00
QString shuffle(const QString& source)
2020-02-21 00:45:53 +07:00
{
if (source.isEmpty()) {
return source;
}
char encKeys[] = {14, 26, 99, 43};
std::string result = source.toStdString();
for (size_t i = 0, end = result.size(); i < end; ++i) {
result[i] = result[i] ^ encKeys[i % sizeof(encKeys)];
}
return QString::fromUtf8(result.data());
}
2020-03-08 17:49:15 +07:00
QStringList packSubstitutions(const Substitutions& source)
{
QStringList result;
for (const auto& i : source) {
result << i.first << i.second.source << i.second.target;
}
return result;
}
Substitutions unpackSubstitutions(const QStringList& raw)
{
const auto count = raw.size();
if (count < 3)
return {};
Substitutions result;
for (auto i = 0, end = raw.size(); i < end; i += 3) {
result.emplace(raw[i], Substitution{raw[i + 1], raw[i + 2]});
}
return result;
}
2020-03-18 00:43:32 +07:00
Substitutions loadLegacySubstitutions()
{
Substitutions result;
QFile f("st_subs.csv");
if (!f.open(QFile::ReadOnly))
return result;
const auto data = f.readAll();
const auto lines =
QString::fromUtf8(data).split('\n', QString::SkipEmptyParts);
for (const auto& line : lines) {
const auto parts = line.mid(1, line.size() - 2).split("\",\""); // remove "
if (parts.size() < 3)
continue;
result.emplace(parts[0], Substitution{parts[1], parts[2]});
}
return result;
}
2020-03-09 16:20:36 +07:00
void cleanupOutdated(QSettings& settings)
{
if (!settings.contains(qs_recogntionGroup + "/image_scale"))
return;
settings.beginGroup(qs_guiGroup);
settings.remove("geometry");
settings.endGroup();
settings.beginGroup(qs_recogntionGroup);
settings.remove("image_scale");
settings.remove("tessdata_dir");
2020-03-09 16:20:36 +07:00
settings.endGroup();
settings.beginGroup(qs_translationGroup);
settings.remove("source_language");
settings.remove("forceRotateTranslators");
2020-04-04 00:47:49 +07:00
settings.remove("translation_debug");
2020-03-09 16:20:36 +07:00
settings.endGroup();
}
2020-02-21 00:45:53 +07:00
} // namespace
void Settings::save() const
{
2020-03-15 19:30:24 +07:00
std::unique_ptr<QSettings> ptr;
if (isPortable_) {
ptr = std::make_unique<QSettings>(iniFileName, QSettings::IniFormat);
} else {
ptr = std::make_unique<QSettings>();
QFile::remove(iniFileName);
}
auto& settings = *ptr;
2020-02-21 00:45:53 +07:00
settings.beginGroup(qs_guiGroup);
settings.setValue(qs_captureHotkey, captureHotkey);
settings.setValue(qs_repeatCaptureHotkey, repeatCaptureHotkey);
settings.setValue(qs_repeatHotkey, showLastHotkey);
settings.setValue(qs_clipboardHotkey, clipboardHotkey);
settings.setValue(qs_captureLockedHotkey, captureLockedHotkey);
2020-02-21 00:45:53 +07:00
2020-03-09 15:29:51 +07:00
settings.setValue(qs_showMessageOnStart, showMessageOnStart);
2020-02-21 00:45:53 +07:00
settings.setValue(qs_resultShowType, int(resultShowType));
2020-03-07 00:53:53 +07:00
settings.setValue(qs_proxyType, int(proxyType));
2020-02-21 00:45:53 +07:00
settings.setValue(qs_proxyHostName, proxyHostName);
settings.setValue(qs_proxyPort, proxyPort);
settings.setValue(qs_proxyUser, proxyUser);
settings.setValue(qs_proxySavePassword, proxySavePassword);
if (proxySavePassword) {
settings.setValue(qs_proxyPassword, shuffle(proxyPassword));
} else {
settings.remove(qs_proxyPassword);
}
2020-03-18 01:32:36 +07:00
settings.setValue(qs_autoUpdateType, autoUpdateIntervalDays);
settings.setValue(qs_lastUpdateCheck, lastUpdateCheck);
2020-02-21 00:45:53 +07:00
settings.endGroup();
settings.beginGroup(qs_recogntionGroup);
settings.setValue(qs_ocrLanguage, sourceLanguage);
2020-03-08 17:49:15 +07:00
settings.endGroup();
2020-02-21 00:45:53 +07:00
2020-03-08 17:49:15 +07:00
settings.beginGroup(qs_correctionGroup);
settings.setValue(qs_useUserSubstitutions, useUserSubstitutions);
settings.setValue(qs_userSubstitutions, packSubstitutions(userSubstitutions));
2020-02-21 00:45:53 +07:00
settings.endGroup();
settings.beginGroup(qs_translationGroup);
settings.setValue(qs_doTranslation, doTranslation);
settings.setValue(qs_ignoreSslErrors, ignoreSslErrors);
settings.setValue(qs_translationLanguage, targetLanguage);
settings.setValue(qs_translationTimeout, int(translationTimeout.count()));
settings.setValue(qs_translators, translators);
settings.endGroup();
2020-03-09 16:20:36 +07:00
2020-03-20 01:47:46 +07:00
settings.beginGroup(qs_representationGroup);
settings.setValue(qs_fontFamily, fontFamily);
settings.setValue(qs_fontSize, fontSize);
settings.setValue(qs_fontColor, fontColor.name());
settings.setValue(qs_backgroundColor, backgroundColor.name());
settings.setValue(qs_showRecognized, showRecognized);
settings.setValue(qs_showCaptured, showCaptured);
2020-03-20 01:47:46 +07:00
settings.endGroup();
2020-03-20 02:35:42 +07:00
if (service::RunAtSystemStart::isAvailable()) {
if (runAtSystemStart != service::RunAtSystemStart::isEnabled())
service::RunAtSystemStart::setEnabled(runAtSystemStart);
}
2020-03-09 16:20:36 +07:00
cleanupOutdated(settings);
2020-02-21 00:45:53 +07:00
}
void Settings::load()
{
2020-03-15 19:30:24 +07:00
std::unique_ptr<QSettings> ptr;
if (QFile::exists(iniFileName)) {
ptr = std::make_unique<QSettings>(iniFileName, QSettings::IniFormat);
setPortable(true);
} else {
ptr = std::make_unique<QSettings>();
setPortable(false);
}
auto& settings = *ptr;
2020-02-21 00:45:53 +07:00
settings.beginGroup(qs_guiGroup);
captureHotkey = settings.value(qs_captureHotkey, captureHotkey).toString();
repeatCaptureHotkey =
settings.value(qs_repeatCaptureHotkey, repeatCaptureHotkey).toString();
showLastHotkey = settings.value(qs_repeatHotkey, showLastHotkey).toString();
clipboardHotkey =
settings.value(qs_clipboardHotkey, clipboardHotkey).toString();
captureLockedHotkey =
settings.value(qs_captureLockedHotkey, captureLockedHotkey).toString();
2020-02-21 00:45:53 +07:00
2020-03-09 15:29:51 +07:00
showMessageOnStart =
settings.value(qs_showMessageOnStart, showMessageOnStart).toBool();
2020-03-07 00:27:38 +07:00
resultShowType = ResultMode(
std::clamp(settings.value(qs_resultShowType, int(resultShowType)).toInt(),
int(ResultMode::Widget), int(ResultMode::Tooltip)));
2020-02-21 00:45:53 +07:00
2020-03-07 00:53:53 +07:00
proxyType =
ProxyType(std::clamp(settings.value(qs_proxyType, int(proxyType)).toInt(),
int(ProxyType::Disabled), int(ProxyType::Http)));
2020-02-21 00:45:53 +07:00
proxyHostName = settings.value(qs_proxyHostName, proxyHostName).toString();
proxyPort = settings.value(qs_proxyPort, proxyPort).toInt();
proxyUser = settings.value(qs_proxyUser, proxyUser).toString();
proxySavePassword =
settings.value(qs_proxySavePassword, proxySavePassword).toBool();
proxyPassword = shuffle(settings.value(qs_proxyPassword).toString());
2020-03-18 01:32:36 +07:00
autoUpdateIntervalDays =
settings.value(qs_autoUpdateType, autoUpdateIntervalDays).toInt();
lastUpdateCheck =
settings.value(qs_lastUpdateCheck, lastUpdateCheck).toDateTime();
2020-02-21 00:45:53 +07:00
settings.endGroup();
settings.beginGroup(qs_recogntionGroup);
sourceLanguage = settings.value(qs_ocrLanguage, sourceLanguage).toString();
settings.endGroup();
2020-03-08 17:49:15 +07:00
settings.beginGroup(qs_correctionGroup);
useUserSubstitutions =
settings.value(qs_useUserSubstitutions, useUserSubstitutions).toBool();
userSubstitutions =
unpackSubstitutions(settings.value(qs_userSubstitutions).toStringList());
2020-03-18 00:43:32 +07:00
if (userSubstitutions.empty())
userSubstitutions = loadLegacySubstitutions();
2020-03-08 17:49:15 +07:00
settings.endGroup();
2020-02-21 00:45:53 +07:00
settings.beginGroup(qs_translationGroup);
doTranslation = settings.value(qs_doTranslation, doTranslation).toBool();
ignoreSslErrors =
settings.value(qs_ignoreSslErrors, ignoreSslErrors).toBool();
targetLanguage =
settings.value(qs_translationLanguage, targetLanguage).toString();
translationTimeout = std::chrono::seconds(
settings.value(qs_translationTimeout, int(translationTimeout.count()))
.toInt());
translators = settings.value(qs_translators, translators).toStringList();
if (translators.size() == 1 && translators.first().contains('|')) // legacy
translators = translators.first().split('|');
settings.endGroup();
2020-03-20 01:47:46 +07:00
settings.beginGroup(qs_representationGroup);
2020-03-22 15:39:59 +07:00
const auto defaultFont = QApplication::font().family();
fontFamily = settings.value(qs_fontFamily, defaultFont).toString();
2020-03-20 01:47:46 +07:00
fontSize = std::clamp(settings.value(qs_fontSize, fontSize).toInt(), 6, 24);
fontColor = QColor(settings.value(qs_fontColor, fontColor.name()).toString());
backgroundColor = QColor(
settings.value(qs_backgroundColor, backgroundColor.name()).toString());
showRecognized = settings.value(qs_showRecognized, showRecognized).toBool();
showCaptured = settings.value(qs_showCaptured, showCaptured).toBool();
2020-03-20 01:47:46 +07:00
2020-03-20 02:35:42 +07:00
runAtSystemStart = service::RunAtSystemStart::isEnabled();
2020-03-20 01:47:46 +07:00
settings.endGroup();
2020-02-21 00:45:53 +07:00
}
2020-03-15 19:30:24 +07:00
2020-03-21 17:03:58 +07:00
void Settings::saveLastUpdateCheck()
{
std::unique_ptr<QSettings> ptr;
if (QFile::exists(iniFileName)) {
ptr = std::make_unique<QSettings>(iniFileName, QSettings::IniFormat);
} else {
ptr = std::make_unique<QSettings>();
}
auto& settings = *ptr;
settings.beginGroup(qs_guiGroup);
2020-03-21 17:03:58 +07:00
settings.setValue(qs_lastUpdateCheck, lastUpdateCheck);
settings.endGroup();
}
2020-03-15 19:30:24 +07:00
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";
}