From 7c376c3a0ba12de8d9e7c2450133a4bee7f73aa9 Mon Sep 17 00:00:00 2001 From: RadRussianRus Date: Thu, 17 Feb 2022 07:34:44 +0300 Subject: [PATCH] Make restarts optional for Kotatogram settings --- .../kotato/boxes/kotato_fonts_box.cpp | 55 ++++++------- .../kotato/boxes/kotato_radio_box.cpp | 12 +-- .../SourceFiles/kotato/kotato_settings.cpp | 27 +++---- Telegram/SourceFiles/kotato/kotato_settings.h | 5 +- .../kotato/kotato_settings_menu.cpp | 77 ++++++++++++------- .../SourceFiles/settings/settings_common.cpp | 2 +- 6 files changed, 91 insertions(+), 87 deletions(-) diff --git a/Telegram/SourceFiles/kotato/boxes/kotato_fonts_box.cpp b/Telegram/SourceFiles/kotato/boxes/kotato_fonts_box.cpp index a8f0e0280..76e33bc01 100644 --- a/Telegram/SourceFiles/kotato/boxes/kotato_fonts_box.cpp +++ b/Telegram/SourceFiles/kotato/boxes/kotato_fonts_box.cpp @@ -257,24 +257,14 @@ void FontsBox::setInnerFocus() { } void FontsBox::save() { - const auto useSystemFont = _useSystemFont->checked(); - const auto useOriginalMetrics = _useOriginalMetrics->checked(); - const auto mainFont = _mainFontName->getLastText().trimmed(); - const auto semiboldFont = _semiboldFontName->getLastText().trimmed(); - const auto semiboldIsBold = _semiboldIsBold->checked(); - const auto monospacedFont = _monospacedFontName->getLastText().trimmed(); - - const auto changeFonts = [=] { - ::Kotato::JsonSettings::SetAfterRestart("fonts/main", mainFont); - ::Kotato::JsonSettings::SetAfterRestart("fonts/semibold", semiboldFont); - ::Kotato::JsonSettings::SetAfterRestart("fonts/monospaced", monospacedFont); - ::Kotato::JsonSettings::SetAfterRestart("fonts/semibold_is_bold", semiboldIsBold); - ::Kotato::JsonSettings::SetAfterRestart("fonts/use_system_font", useSystemFont); - ::Kotato::JsonSettings::SetAfterRestart("fonts/use_original_metrics", useOriginalMetrics); - ::Kotato::JsonSettings::SetAfterRestart("fonts/size", _fontSize); - ::Kotato::JsonSettings::Write(); - Core::Restart(); - }; + ::Kotato::JsonSettings::SetAfterRestart("fonts/main", _mainFontName->getLastText().trimmed()); + ::Kotato::JsonSettings::SetAfterRestart("fonts/semibold", _semiboldFontName->getLastText().trimmed()); + ::Kotato::JsonSettings::SetAfterRestart("fonts/monospaced", _monospacedFontName->getLastText().trimmed()); + ::Kotato::JsonSettings::SetAfterRestart("fonts/semibold_is_bold", _semiboldIsBold->checked()); + ::Kotato::JsonSettings::SetAfterRestart("fonts/use_system_font", _useSystemFont->checked()); + ::Kotato::JsonSettings::SetAfterRestart("fonts/use_original_metrics", _useOriginalMetrics->checked()); + ::Kotato::JsonSettings::SetAfterRestart("fonts/size", _fontSize); + ::Kotato::JsonSettings::Write(); const auto box = std::make_shared>(); @@ -282,22 +272,20 @@ void FontsBox::save() { Box( tr::lng_settings_need_restart(tr::now), tr::lng_settings_restart_now(tr::now), - tr::lng_cancel(tr::now), - changeFonts)); + tr::lng_settings_restart_later(tr::now), + [] { Core::Restart(); }, + [=] { closeBox(); })); } void FontsBox::resetToDefault() { - const auto resetFonts = [=] { - ::Kotato::JsonSettings::ResetAfterRestart("fonts/main"); - ::Kotato::JsonSettings::ResetAfterRestart("fonts/semibold"); - ::Kotato::JsonSettings::ResetAfterRestart("fonts/monospaced"); - ::Kotato::JsonSettings::ResetAfterRestart("fonts/semibold_is_bold"); - ::Kotato::JsonSettings::ResetAfterRestart("fonts/size"); - ::Kotato::JsonSettings::ResetAfterRestart("fonts/use_system_font"); - ::Kotato::JsonSettings::ResetAfterRestart("fonts/use_original_metrics"); - ::Kotato::JsonSettings::Write(); - Core::Restart(); - }; + ::Kotato::JsonSettings::ResetAfterRestart("fonts/main"); + ::Kotato::JsonSettings::ResetAfterRestart("fonts/semibold"); + ::Kotato::JsonSettings::ResetAfterRestart("fonts/monospaced"); + ::Kotato::JsonSettings::ResetAfterRestart("fonts/semibold_is_bold"); + ::Kotato::JsonSettings::ResetAfterRestart("fonts/size"); + ::Kotato::JsonSettings::ResetAfterRestart("fonts/use_system_font"); + ::Kotato::JsonSettings::ResetAfterRestart("fonts/use_original_metrics"); + ::Kotato::JsonSettings::Write(); const auto box = std::make_shared>(); @@ -305,6 +293,7 @@ void FontsBox::resetToDefault() { Box( tr::lng_settings_need_restart(tr::now), tr::lng_settings_restart_now(tr::now), - tr::lng_cancel(tr::now), - resetFonts)); + tr::lng_settings_restart_later(tr::now), + [] { Core::Restart(); }, + [=] { closeBox(); })); } diff --git a/Telegram/SourceFiles/kotato/boxes/kotato_radio_box.cpp b/Telegram/SourceFiles/kotato/boxes/kotato_radio_box.cpp index d664c5574..0f1c77f7b 100644 --- a/Telegram/SourceFiles/kotato/boxes/kotato_radio_box.cpp +++ b/Telegram/SourceFiles/kotato/boxes/kotato_radio_box.cpp @@ -157,22 +157,18 @@ void RadioBox::prepare() { } void RadioBox::save() { + _saveCallback(_group->value()); if (_warnRestart) { - const auto saveAfterWarn = [=] { - _saveCallback(_group->value()); - Core::Restart(); - }; - const auto box = std::make_shared>(); *box = getDelegate()->show( Box( tr::lng_settings_need_restart(tr::now), tr::lng_settings_restart_now(tr::now), - tr::lng_cancel(tr::now), - saveAfterWarn)); + tr::lng_settings_restart_later(tr::now), + [] { Core::Restart(); }, + [=] { closeBox(); })); } else { - _saveCallback(_group->value()); closeBox(); } } diff --git a/Telegram/SourceFiles/kotato/kotato_settings.cpp b/Telegram/SourceFiles/kotato/kotato_settings.cpp index b7d74b4ee..9b0513d82 100644 --- a/Telegram/SourceFiles/kotato/kotato_settings.cpp +++ b/Telegram/SourceFiles/kotato/kotato_settings.cpp @@ -51,7 +51,10 @@ public: const QString &key, uint64 accountId = 0, bool isTestAccount = false); - [[nodiscard]] rpl::producer restartEvents(); + [[nodiscard]] rpl::producer eventsWithPending( + const QString &key, + uint64 accountId = 0, + bool isTestAccount = false); void set( const QString &key, QVariant value, @@ -71,7 +74,6 @@ public: uint64 accountId = 0, bool isTestAccount = false); void writeTimeout(); - bool needRestart(); private: [[nodiscard]] QVariant getDefault(const QString &key); @@ -84,7 +86,7 @@ private: base::Timer _jsonWriteTimer; rpl::event_stream _eventStream; - rpl::event_stream _restartEventStream; + rpl::event_stream _pendingEventStream; QHash _settingsHashMap; QHash _defaultSettingsHashMap; @@ -785,8 +787,9 @@ rpl::producer Manager::events(const QString &key, uint64 accountId, boo return _eventStream.events() | rpl::filter(rpl::mappers::_1 == mapKey); } -rpl::producer Manager::restartEvents() { - return _restartEventStream.events(); +rpl::producer Manager::eventsWithPending(const QString &key, uint64 accountId, bool isTestAccount) { + const auto mapKey = MakeMapKey(key, accountId, isTestAccount); + return _pendingEventStream.events() | rpl::filter(rpl::mappers::_1 == mapKey); } void Manager::set(const QString &key, QVariant value, uint64 accountId, bool isTestAccount) { @@ -797,7 +800,6 @@ void Manager::set(const QString &key, QVariant value, uint64 accountId, bool isT void Manager::setAfterRestart(const QString &key, QVariant value, uint64 accountId, bool isTestAccount) { const auto mapKey = MakeMapKey(key, accountId, isTestAccount); - const auto oldNeedRestart = needRestart(); if (!_settingsHashMap.contains(mapKey) || _settingsHashMap.value(mapKey) != value) { _defaultSettingsHashMap.insert(mapKey, value); @@ -805,10 +807,7 @@ void Manager::setAfterRestart(const QString &key, QVariant value, uint64 account && _settingsHashMap.value(mapKey) == value) { _defaultSettingsHashMap.remove(mapKey); } - const auto newNeedRestart = needRestart(); - if (oldNeedRestart != newNeedRestart) { - _restartEventStream.fire_copy(newNeedRestart); - } + _pendingEventStream.fire_copy(mapKey); } void Manager::reset(const QString &key, uint64 accountId, bool isTestAccount) { @@ -1003,10 +1002,6 @@ void Manager::writeTimeout() { writeCurrentSettings(); } -bool Manager::needRestart() { - return _defaultSettingsHashMap.size() > 0; -} - void Manager::writing() { _jsonWriteTimer.cancel(); } @@ -1048,8 +1043,8 @@ rpl::producer Events(const QString &key, uint64 accountId, bool isTestA return (Data) ? Data->events(key, accountId, isTestAccount) : rpl::single(QString()); } -rpl::producer RestartEvents() { - return (Data) ? Data->restartEvents() : rpl::single(false); +rpl::producer EventsWithPending(const QString &key, uint64 accountId, bool isTestAccount) { + return (Data) ? Data->eventsWithPending(key, accountId, isTestAccount) : rpl::single(QString()); } void Set(const QString &key, QVariant value, uint64 accountId, bool isTestAccount) { diff --git a/Telegram/SourceFiles/kotato/kotato_settings.h b/Telegram/SourceFiles/kotato/kotato_settings.h index d85fffa16..c5dacb3ea 100644 --- a/Telegram/SourceFiles/kotato/kotato_settings.h +++ b/Telegram/SourceFiles/kotato/kotato_settings.h @@ -32,7 +32,10 @@ void Finish(); const QString &key, uint64 accountId = 0, bool isTestAccount = false); -[[nodiscard]] rpl::producer RestartEvents(); +[[nodiscard]] rpl::producer EventsWithPending( + const QString &key, + uint64 accountId = 0, + bool isTestAccount = false); void Set( const QString &key, QVariant value, diff --git a/Telegram/SourceFiles/kotato/kotato_settings_menu.cpp b/Telegram/SourceFiles/kotato/kotato_settings_menu.cpp index 82699df29..88249d0d3 100644 --- a/Telegram/SourceFiles/kotato/kotato_settings_menu.cpp +++ b/Telegram/SourceFiles/kotato/kotato_settings_menu.cpp @@ -305,20 +305,34 @@ void SetupKotatoChats( Ui::show(Box()); }); - AddButtonWithLabel( - container, - rktr("ktg_settings_userpic_rounding"), - rpl::single(UserpicRoundingLabel(::Kotato::JsonSettings::GetInt("userpic_corner_type"))), - st::settingsButton - )->addClickHandler([=] { + const auto userpicCornerButton = container->add( + object_ptr