Autosaving of JSON settings

This commit is contained in:
Eric Kotato 2019-10-11 06:54:49 +03:00
parent 4caedcbf49
commit 838b2e8c1a
5 changed files with 128 additions and 23 deletions

View file

@ -18,24 +18,12 @@ https://github.com/kotatogram/kotatogram-desktop/blob/dev/LEGAL
#include <QtCore/QJsonObject>
#include <QtCore/QJsonArray>
#include <QtCore/QJsonValue>
#include <QtCore/QTimer>
namespace KotatoSettings {
namespace {
class Manager {
public:
void fill();
void clear();
const QStringList &errors() const;
private:
void writeDefaultFile();
bool readCustomFile();
QStringList _errors;
};
constexpr auto kWriteJsonTimeout = crl::time(5000);
QString DefaultFilePath() {
return cWorkingDir() + qsl("tdata/kotato-settings-default.json");
@ -78,6 +66,15 @@ void WriteDefaultCustomFile() {
}
}
Manager Data;
} // namespace
Manager::Manager() {
_jsonWriteTimer.setSingleShot(true);
connect(&_jsonWriteTimer, SIGNAL(timeout()), this, SLOT(writeTimeout()));
}
void Manager::fill() {
if (!DefaultFileIsValid()) {
writeDefaultFile();
@ -87,6 +84,14 @@ void Manager::fill() {
}
}
void Manager::write(bool force) {
if (!_jsonWriteTimer.isActive()) {
_jsonWriteTimer.start(kWriteJsonTimeout);
} else if (_jsonWriteTimer.remainingTime() <= 0 || (force && _jsonWriteTimer.isActive())) {
writeTimeout();
}
}
void Manager::clear() {
_errors.clear();
}
@ -261,19 +266,83 @@ void Manager::writeDefaultFile() {
file.write(document.toJson(QJsonDocument::Indented));
}
Manager Data;
void Manager::writeCurrentSettings() {
auto file = QFile(CustomFilePath());
if (!file.open(QIODevice::WriteOnly)) {
return;
}
writing();
const char *customHeader = R"HEADER(
// This file was automatically generated from current settings
// It's better to edit it with app closed, so there will be no rewrites
// You should restart app to see changes
} // namespace
)HEADER";
file.write(customHeader);
auto settings = QJsonObject();
auto settingsFonts = QJsonObject();
if (!cMainFont().isEmpty()) {
settingsFonts.insert(qsl("main"), cMainFont());
}
if (!cSemiboldFont().isEmpty()) {
settingsFonts.insert(qsl("semibold"), cSemiboldFont());
}
if (!cMonospaceFont().isEmpty()) {
settingsFonts.insert(qsl("monospaced"), cMonospaceFont());
}
settingsFonts.insert(qsl("semibold_is_bold"), cSemiboldFontIsBold());
settings.insert(qsl("fonts"), settingsFonts);
settings.insert(qsl("sticker_height"), StickerHeight());
settings.insert(qsl("big_emoji_outline"), BigEmojiOutline());
settings.insert(qsl("always_show_scheduled"), cAlwaysShowScheduled());
settings.insert(qsl("show_chat_id"), cShowChatId());
settings.insert(qsl("net_speed_boost"), cNetSpeedBoost());
settings.insert(qsl("show_phone_in_drawer"), cShowPhoneInDrawer());
auto settingsScales = QJsonArray();
auto currentScales = cInterfaceScales();
for (int i = 0; i < currentScales.size(); i++) {
settingsScales << currentScales[i];
}
settings.insert(qsl("scales"), settingsScales);
auto document = QJsonDocument();
document.setObject(settings);
file.write(document.toJson(QJsonDocument::Indented));
}
void Manager::writeTimeout() {
writeCurrentSettings();
}
void Manager::writing() {
_jsonWriteTimer.stop();
}
void Start() {
Data.fill();
}
void Write() {
Data.write();
}
const QStringList &Errors() {
return Data.errors();
}
void Finish() {
Data.write(true);
Data.clear();
}

View file

@ -7,9 +7,37 @@ https://github.com/kotatogram/kotatogram-desktop/blob/dev/LEGAL
*/
#pragma once
#include <QtCore/QTimer>
namespace KotatoSettings {
class Manager : public QObject {
Q_OBJECT
public:
Manager();
void fill();
void clear();
void write(bool force = false);
const QStringList &errors() const;
public slots:
void writeTimeout();
private:
void writeDefaultFile();
void writeCurrentSettings();
bool readCustomFile();
void writing();
QStringList _errors;
QTimer _jsonWriteTimer;
};
void Start();
void Write();
void Finish();
const QStringList &Errors();

View file

@ -235,6 +235,7 @@ rpl::producer<bool> BigEmojiOutlineChanges() {
bool gAlwaysShowScheduled = true;
bool gShowChatId = true;
int gNetSpeedBoost = 0;
int gNetRequestsCount = 2;
int gNetDownloadSessionsCount = 2;
int gNetUploadSessionsCount = 2;

View file

@ -195,6 +195,7 @@ void SetStickerHeight(int height);
DeclareSetting(bool, AlwaysShowScheduled);
DeclareSetting(bool, ShowChatId);
DeclareSetting(int, NetSpeedBoost);
DeclareSetting(int, NetRequestsCount);
DeclareSetting(int, NetDownloadSessionsCount);
DeclareSetting(int, NetUploadSessionsCount);
@ -203,16 +204,18 @@ DeclareSetting(int, NetUploadRequestInterval);
inline void SetNetworkBoost(int boost) {
if (boost < 0) {
boost = 0;
cSetNetSpeedBoost(0);
} else if (boost > 3) {
boost = 3;
cSetNetSpeedBoost(3);
} else {
cSetNetSpeedBoost(boost);
}
cSetNetRequestsCount(2 + (2 * boost));
cSetNetDownloadSessionsCount(2 + (2 * boost));
cSetNetUploadSessionsCount(2 + (2 * boost));
cSetNetMaxFileQueries(16 + (16 * boost));
cSetNetUploadRequestInterval(500 - (100 * boost));
cSetNetRequestsCount(2 + (2 * cNetSpeedBoost()));
cSetNetDownloadSessionsCount(2 + (2 * cNetSpeedBoost()));
cSetNetUploadSessionsCount(2 + (2 * cNetSpeedBoost()));
cSetNetMaxFileQueries(16 + (16 * cNetSpeedBoost()));
cSetNetUploadRequestInterval(500 - (100 * cNetSpeedBoost()));
}
DeclareSetting(bool, ShowPhoneInDrawer);

View file

@ -24,6 +24,7 @@ https://github.com/kotatogram/kotatogram-desktop/blob/dev/LEGAL
#include "window/window_session_controller.h"
#include "lang/lang_keys.h"
#include "core/update_checker.h"
#include "core/kotato_settings.h"
#include "core/application.h"
#include "storage/localstorage.h"
#include "data/data_session.h"
@ -57,6 +58,7 @@ void SetupKotatoChats(not_null<Ui::VerticalLayout*> container) {
const auto updateStickerHeight = [=](int value) {
updateStickerHeightLabel(value);
SetStickerHeight(value);
KotatoSettings::Write();
};
stickerHeightSlider->resize(st::settingsAudioVolumeSlider.seekSize);
stickerHeightSlider->setPseudoDiscrete(
@ -77,6 +79,7 @@ void SetupKotatoChats(not_null<Ui::VerticalLayout*> container) {
return (enabled != BigEmojiOutline());
}) | rpl::start_with_next([](bool enabled) {
SetBigEmojiOutline(enabled);
KotatoSettings::Write();
}, container->lifetime());
AddButton(
@ -91,6 +94,7 @@ void SetupKotatoChats(not_null<Ui::VerticalLayout*> container) {
}) | rpl::start_with_next([](bool enabled) {
cSetAlwaysShowScheduled(enabled);
Notify::showScheduledButtonChanged();
KotatoSettings::Write();
}, container->lifetime());
AddSkip(container);