diff --git a/Telegram/SourceFiles/settings/settings_privacy_security.cpp b/Telegram/SourceFiles/settings/settings_privacy_security.cpp index d2458479f..47ebd033d 100644 --- a/Telegram/SourceFiles/settings/settings_privacy_security.cpp +++ b/Telegram/SourceFiles/settings/settings_privacy_security.cpp @@ -19,6 +19,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "settings/settings_blocked_peers.h" #include "settings/settings_common.h" #include "settings/settings_local_passcode.h" +#include "settings/settings_premium.h" // Settings::ShowPremium. #include "settings/settings_privacy_controllers.h" #include "base/timer_rpl.h" #include "boxes/edit_privacy_box.h" @@ -53,6 +54,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "window/window_session_controller.h" #include "apiwrap.h" #include "facades.h" +#include "styles/style_chat_helpers.h" // stickersPremiumLock. #include "styles/style_settings.h" #include "styles/style_layers.h" #include "styles/style_boxes.h" @@ -113,6 +115,67 @@ rpl::producer PrivacyString( }); } +void AddPremiumPrivacyButton( + not_null controller, + not_null container, + rpl::producer label, + IconDescriptor &&descriptor, + Privacy::Key key, + Fn()> controllerFactory) { + const auto shower = Ui::CreateChild(container.get()); + const auto session = &controller->session(); + const auto button = AddButtonWithLabel( + container, + std::move(label), + PrivacyString(session, key), + st::settingsButton, + std::move(descriptor)); + button->addClickHandler([=] { + if (!session->premium()) { + Settings::ShowPremium(controller, QString()); + return; + } + *shower = session->api().userPrivacy().value( + key + ) | rpl::take( + 1 + ) | rpl::start_with_next([=](const Privacy::Rule &value) { + controller->show( + Box(controller, controllerFactory(), value), + Ui::LayerOption::KeepOther); + }); + }); + + const auto lock = Ui::CreateChild(button.get()); + const auto icon = lock->lifetime().make_state(IconDescriptor{ + &st::stickersPremiumLock, + kIconGray, + IconType::Round, + }); + lock->resize(icon->size()); + lock->paintRequest( + ) | rpl::start_with_next([=] { + Painter p(lock); + + icon->paint(p, 0, 0); + }, lock->lifetime()); + button->sizeValue( + ) | rpl::start_with_next([=, + left = st::settingsButton.iconLeft, + offset = (icon->size() / 3 * 2 * -1), + iconSize = descriptor.icon->size()](const QSize &s) { + lock->moveToLeft( + left + iconSize.width() + offset.width(), + (s.height() + iconSize.height()) / 2 + offset.height()); + }, lock->lifetime()); + + Data::AmPremiumValue( + session + ) | rpl::start_with_next([=](bool premium) { + lock->setVisible(!premium); + }, lock->lifetime()); +} + rpl::producer BlockedPeersCount(not_null<::Main::Session*> session) { return session->api().blockedPeers().slice( ) | rpl::map([](const Api::BlockedPeers::Slice &data) { @@ -170,16 +233,18 @@ void SetupPrivacy( { &st::settingsIconVideoCalls, kIconGreen }, Key::Calls, [] { return std::make_unique(); }); + AddPremiumPrivacyButton( + controller, + container, + tr::lng_settings_voices_privacy(), + { &st::settingsPremiumIconVoice, kIconRed }, + Key::Voices, + [=] { return std::make_unique(session); }); add( tr::lng_settings_groups_invite(), { &st::settingsIconGroup, kIconDarkBlue }, Key::Invites, [] { return std::make_unique(); }); - add( - tr::lng_settings_voices_privacy(), - { &st::settingsPremiumIconVoice, kIconRed }, - Key::Voices, - [=] { return std::make_unique(session); }); session->api().userPrivacy().reload(Api::UserPrivacy::Key::AddedByPhone);