From 42f2f3c99f8326a1f3b876fa98dcac262a4d24c8 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Mon, 9 May 2022 20:56:04 +0300 Subject: [PATCH] Slightly improved style of buttons in security and privacy settings. --- .../settings/settings_privacy_security.cpp | 294 +----------------- 1 file changed, 9 insertions(+), 285 deletions(-) diff --git a/Telegram/SourceFiles/settings/settings_privacy_security.cpp b/Telegram/SourceFiles/settings/settings_privacy_security.cpp index 78812bc11c..afeec635f4 100644 --- a/Telegram/SourceFiles/settings/settings_privacy_security.cpp +++ b/Telegram/SourceFiles/settings/settings_privacy_security.cpp @@ -228,26 +228,22 @@ void SetupLocalPasscode( not_null controller, not_null container, Fn showOther) { - AddSkip(container); - AddDivider(container); - AddSkip(container); - AddSubsectionTitle(container, tr::lng_settings_passcode_title()); - auto has = rpl::single(rpl::empty) | rpl::then( controller->session().domain().local().localPasscodeChanged() ) | rpl::map([=] { return controller->session().domain().local().hasLocalPasscode(); }); - auto text = rpl::combine( - tr::lng_passcode_change(), - tr::lng_passcode_turn_on(), + auto label = rpl::combine( + tr::lng_settings_cloud_password_on(), + tr::lng_settings_cloud_password_off(), std::move(has), - [](const QString &change, const QString &create, bool has) { - return has ? change : create; + [](const QString &on, const QString &off, bool has) { + return has ? on : off; }); - AddButton( + AddButtonWithLabel( container, - std::move(text), + tr::lng_settings_passcode_title(), + std::move(label), st::settingsButton, { &st::settingsIconLock, kIconGreen } )->addClickHandler([=] { @@ -266,11 +262,6 @@ void SetupCloudPassword( using namespace rpl::mappers; using State = Core::CloudPasswordState; - AddSkip(container); - AddDivider(container); - AddSkip(container); - AddSubsectionTitle(container, tr::lng_settings_password_title()); - enum class PasswordState { Loading, On, @@ -319,273 +310,6 @@ void SetupCloudPassword( } }); -#if 0 - auto has = rpl::single( - false - ) | rpl::then(controller->session().api().cloudPassword().state( - ) | rpl::map([](const State &state) { - return state.hasPassword; - })) | rpl::distinct_until_changed(); - auto pattern = session->api().cloudPassword().state( - ) | rpl::map([](const State &state) { - return state.unconfirmedPattern; - }); - auto confirmation = rpl::single( - tr::lng_profile_loading(tr::now) - ) | rpl::then(rpl::duplicate( - pattern - ) | rpl::filter([](const QString &pattern) { - return !pattern.isEmpty(); - }) | rpl::map([](const QString &pattern) { - return tr::lng_cloud_password_waiting_code(tr::now, lt_email, pattern); - })); - auto unconfirmed = rpl::duplicate( - pattern - ) | rpl::map([](const QString &pattern) { - return !pattern.isEmpty(); - }); - auto noconfirmed = rpl::single( - true - ) | rpl::then(rpl::duplicate( - unconfirmed - )); - const auto label = container->add( - object_ptr>( - container, - object_ptr( - container, - base::duplicate(confirmation), - st::settingsCloudPasswordLabel), - QMargins( - st::settingsButtonNoIcon.padding.left(), - st::settingsButtonNoIcon.padding.top(), - st::settingsButtonNoIcon.padding.right(), - (st::settingsButtonNoIcon.height - - st::settingsCloudPasswordLabel.style.font->height - + st::settingsButtonNoIcon.padding.bottom())))); - label->toggleOn(base::duplicate(noconfirmed))->setDuration(0); - - std::move( - confirmation - ) | rpl::start_with_next([=] { - container->resizeToWidth(container->width()); - }, label->lifetime()); - - auto text = rpl::combine( - tr::lng_cloud_password_set(), - tr::lng_cloud_password_edit(), - base::duplicate(has) - ) | rpl::map([](const QString &set, const QString &edit, bool has) { - return has ? edit : set; - }); - const auto change = container->add( - object_ptr>( - container, - CreateButton( - container, - std::move(text), - st::settingsButton, - { &st::settingsIconKey, kIconLightBlue }))); - change->toggleOn(rpl::duplicate( - noconfirmed - ) | rpl::map( - !_1 - ))->setDuration(0); - change->entity()->addClickHandler([=] { - if (CheckEditCloudPassword(session)) { - controller->show(EditCloudPasswordBox(session)); - } else { - controller->show(CloudPasswordAppOutdatedBox()); - } - }); - - const auto confirm = container->add( - object_ptr>( - container, - CreateButton( - container, - tr::lng_cloud_password_confirm(), - st::settingsButton, - { &st::settingsIconEmail, kIconLightOrange }))); - confirm->toggleOn(rpl::single( - false - ) | rpl::then(rpl::duplicate( - unconfirmed - )))->setDuration(0); - confirm->entity()->addClickHandler([=] { - const auto state = session->api().cloudPassword().stateCurrent(); - if (!state) { - return; - } - auto validation = ConfirmRecoveryEmail( - &controller->session(), - state->unconfirmedPattern); - - std::move( - validation.reloadRequests - ) | rpl::start_with_next([=] { - session->api().cloudPassword().reload(); - }, validation.box->lifetime()); - - std::move( - validation.cancelRequests - ) | rpl::start_with_next([=] { - session->api().cloudPassword().clearUnconfirmedPassword(); - }, validation.box->lifetime()); - - controller->show(std::move(validation.box)); - }); - - const auto remove = [=] { - if (CheckEditCloudPassword(session)) { - RemoveCloudPassword(controller); - } else { - controller->show(CloudPasswordAppOutdatedBox()); - } - }; - const auto disable = container->add( - object_ptr>( - container, - CreateButton( - container, - tr::lng_settings_password_disable(), - st::settingsButton, - { &st::settingsIconMinus, kIconRed }))); - disable->toggleOn(rpl::combine( - rpl::duplicate(has), - rpl::duplicate(noconfirmed), - _1 && !_2)); - disable->entity()->addClickHandler(remove); - - auto resetAt = session->api().cloudPassword().state( - ) | rpl::map([](const State &state) { - return state.pendingResetDate; - }); - auto resetInSeconds = rpl::duplicate( - resetAt - ) | rpl::filter([](TimeId time) { - return time != 0; - }) | rpl::map([](TimeId time) { - return rpl::single(rpl::empty) | rpl::then(base::timer_each( - 999 - )) | rpl::map([=] { - const auto now = base::unixtime::now(); - return (time - now); - }) | rpl::distinct_until_changed( - ) | rpl::take_while([](TimeId left) { - return left > 0; - }) | rpl::then(rpl::single(TimeId(0))); - }) | rpl::flatten_latest( - ) | rpl::start_spawning(container->lifetime()); - - auto resetText = rpl::duplicate( - resetInSeconds - ) | rpl::map([](TimeId left) { - return (left > 0); - }) | rpl::distinct_until_changed( - ) | rpl::map([](bool waiting) { - return waiting - ? tr::lng_cloud_password_reset_in() - : tr::lng_cloud_password_reset_ready(); - }) | rpl::flatten_latest(); - - constexpr auto kMinute = 60; - constexpr auto kHour = 3600; - constexpr auto kDay = 86400; - auto resetLabel = rpl::duplicate( - resetInSeconds - ) | rpl::map([](TimeId left) { - return (left >= kDay) - ? ((left / kDay) * kDay) - : (left >= kHour) - ? ((left / kHour) * kHour) - : (left >= kMinute) - ? ((left / kMinute) * kMinute) - : left; - }) | rpl::distinct_until_changed( - ) | rpl::map([](TimeId left) { - const auto days = left / kDay; - const auto hours = left / kHour; - const auto minutes = left / kMinute; - return days - ? tr::lng_days(tr::now, lt_count, days) - : hours - ? tr::lng_hours(tr::now, lt_count, hours) - : minutes - ? tr::lng_minutes(tr::now, lt_count, minutes) - : left - ? tr::lng_seconds(tr::now, lt_count, left) - : QString(); - }); - - const auto reset = container->add( - object_ptr>( - container, - CreateButton( - container, - rpl::duplicate(resetText), - st::settingsButton)) - )->setDuration(0); - CreateRightLabel( - reset->entity(), - std::move(resetLabel), - st::settingsButton, - std::move(resetText)); - - reset->toggleOn(rpl::duplicate( - resetAt - ) | rpl::map([](TimeId time) { - return time != 0; - })); - const auto sent = std::make_shared(false); - reset->entity()->addClickHandler([=] { - const auto api = &session->api(); - const auto state = api->cloudPassword().stateCurrent(); - const auto date = state ? state->pendingResetDate : TimeId(0); - if (!date || *sent) { - return; - } else if (base::unixtime::now() >= date) { - *sent = true; - api->cloudPassword().resetPassword( - ) | rpl::start_with_error_done([=](const QString &error) { - *sent = false; - }, [=] { - *sent = false; - }, container->lifetime()); - } else { - const auto cancel = [=] { - Ui::hideLayer(); - *sent = true; - api->cloudPassword().cancelResetPassword( - ) | rpl::start_with_error_done([=](const QString &error) { - *sent = false; - }, [=] { - *sent = false; - }, container->lifetime()); - }; - Ui::show(Ui::MakeConfirmBox({ - .text = tr::lng_cloud_password_reset_cancel_sure(), - .confirmed = cancel, - .confirmText = tr::lng_box_yes(), - .cancelText = tr::lng_box_no(), - })); - } - }); - - const auto abort = container->add( - object_ptr>( - container, - CreateButton( - container, - tr::lng_settings_password_abort(), - st::settingsAttentionButton))); - abort->toggleOn(rpl::combine( - rpl::duplicate(has), - rpl::duplicate(noconfirmed), - _1 && _2)); - abort->entity()->addClickHandler(remove); -#endif - const auto reloadOnActivation = [=](Qt::ApplicationState state) { if (/*label->toggled() && */state == Qt::ApplicationActive) { controller->session().api().cloudPassword().reload(); @@ -599,7 +323,7 @@ void SetupCloudPassword( session->api().cloudPassword().reload(); AddSkip(container); - AddDivider(container); + AddDividerText(container, tr::lng_settings_cloud_password_start_about()); } void SetupSensitiveContent(