diff --git a/Telegram/SourceFiles/core/deep_links/deep_links_settings.cpp b/Telegram/SourceFiles/core/deep_links/deep_links_settings.cpp index 2d42e7e1f4..4cd67a44a1 100644 --- a/Telegram/SourceFiles/core/deep_links/deep_links_settings.cpp +++ b/Telegram/SourceFiles/core/deep_links/deep_links_settings.cpp @@ -460,10 +460,7 @@ void RegisterSettingsHandlers(Router &router) { router.add(u"settings"_q, { .path = u"profile-photo"_q, - .action = SettingsControl{ - ::Settings::Main::Id(), - u"profile-photo"_q, - }, + .action = AliasTo{ u"edit"_q, u"set-photo"_q }, }); router.add(u"settings"_q, { @@ -579,19 +576,7 @@ void RegisterSettingsHandlers(Router &router) { if (!ctx.controller) { return Result::NeedsAuth; } - if (!highlight.isEmpty()) { - ctx.controller->setHighlightControlId(highlight); - } - const auto state = ctx.controller->session().api().cloudPassword().stateCurrent(); - if (!state) { - ctx.controller->showSettings(::Settings::CloudPasswordStartId()); - } else if (!state->unconfirmedPattern.isEmpty()) { - ctx.controller->showSettings(::Settings::CloudPasswordEmailConfirmId()); - } else if (state->hasPassword) { - ctx.controller->showSettings(::Settings::CloudPasswordInputId()); - } else { - ctx.controller->showSettings(::Settings::CloudPasswordStartId()); - } + ctx.controller->showCloudPassword(highlight); return Result::Handled; }; router.add(u"settings"_q, { @@ -801,7 +786,7 @@ void RegisterSettingsHandlers(Router &router) { }); router.add(u"settings"_q, { - .path = u"privacy/bio/never-share"_q, + .path = u"privacy/bio/never"_q, .action = CodeBlock{ [](const Context &ctx) { return ShowPrivacyBox( ctx, @@ -812,7 +797,7 @@ void RegisterSettingsHandlers(Router &router) { }); router.add(u"settings"_q, { - .path = u"privacy/bio/always-share"_q, + .path = u"privacy/bio/always"_q, .action = CodeBlock{ [](const Context &ctx) { return ShowPrivacyBox( ctx, @@ -844,7 +829,7 @@ void RegisterSettingsHandlers(Router &router) { }); router.add(u"settings"_q, { - .path = u"privacy/gifts/never-share"_q, + .path = u"privacy/gifts/never"_q, .action = CodeBlock{ [](const Context &ctx) { return ShowPrivacyBox( ctx, @@ -855,7 +840,7 @@ void RegisterSettingsHandlers(Router &router) { }); router.add(u"settings"_q, { - .path = u"privacy/gifts/always-share"_q, + .path = u"privacy/gifts/always"_q, .action = CodeBlock{ [](const Context &ctx) { return ShowPrivacyBox( ctx, @@ -1712,6 +1697,13 @@ void RegisterSettingsHandlers(Router &router) { }); // Edit profile deep links. + router.add(u"settings"_q, { + .path = u"edit/set-photo"_q, + .action = SettingsControl{ + ::Settings::Main::Id(), + u"profile-photo"_q, + }, + }); router.add(u"settings"_q, { .path = u"edit/first-name"_q, .action = CodeBlock{ [](const Context &ctx) { @@ -1815,7 +1807,10 @@ void RegisterSettingsHandlers(Router &router) { }); router.add(u"settings"_q, { .path = u"folders/add-recommended"_q, - .action = SettingsSection{ ::Settings::Folders::Id() }, + .action = SettingsControl{ + ::Settings::Folders::Id(), + u"folders/add-recommended"_q, + }, }); router.add(u"settings"_q, { .path = u"folders/show-tags"_q, diff --git a/Telegram/SourceFiles/history/view/history_view_about_view.cpp b/Telegram/SourceFiles/history/view/history_view_about_view.cpp index 95ee5294c1..b5d6c869f3 100644 --- a/Telegram/SourceFiles/history/view/history_view_about_view.cpp +++ b/Telegram/SourceFiles/history/view/history_view_about_view.cpp @@ -718,7 +718,7 @@ void AboutView::make(Data::ChatIntro data, bool preview) { | MessageFlag::FakeHistoryItem | MessageFlag::Local), .from = _history->peer->id, - }, PreparedServiceText{ { text }}); + }, PreparedServiceText{ { text } }); if (data.sticker) { _helloChosen = nullptr; @@ -887,7 +887,7 @@ AdminLog::OwnedItem AboutView::makeNewPeerInfo(not_null user) { | MessageFlag::FakeHistoryItem | MessageFlag::Local), .from = _history->peer->id, - }, PreparedServiceText{ { text }}); + }, PreparedServiceText{ { text } }); auto owned = AdminLog::OwnedItem(_delegate, item); owned->overrideMedia(std::make_unique( diff --git a/Telegram/SourceFiles/info/stories/info_stories_inner_widget.cpp b/Telegram/SourceFiles/info/stories/info_stories_inner_widget.cpp index ead9112378..93b61df858 100644 --- a/Telegram/SourceFiles/info/stories/info_stories_inner_widget.cpp +++ b/Telegram/SourceFiles/info/stories/info_stories_inner_widget.cpp @@ -547,16 +547,8 @@ void InnerWidget::showFinished() { _showFinished.fire({}); const auto window = _controller->parentController(); - const auto id = window->highlightControlId(); - if (id.isEmpty()) { - return; - } - if (id == u"my-profile/posts"_q) { - window->setHighlightControlId(QString()); - if (_albumsWrap) { - ::Settings::HighlightWidget(_albumsWrap); - } - } else if (id == u"my-profile/posts/add-album"_q) { + window->checkHighlightControl(u"my-profile/posts"_q, _albumsWrap); + if (window->highlightControlId() == u"my-profile/posts/add-album"_q) { window->setHighlightControlId(QString()); if (_albumsWrap) { ::Settings::HighlightWidget(_albumsWrap); diff --git a/Telegram/SourceFiles/settings/business/settings_recipients_helper.h b/Telegram/SourceFiles/settings/business/settings_recipients_helper.h index bda2026f2e..8e493763c2 100644 --- a/Telegram/SourceFiles/settings/business/settings_recipients_helper.h +++ b/Telegram/SourceFiles/settings/business/settings_recipients_helper.h @@ -29,13 +29,9 @@ public: BusinessSection( QWidget *parent, not_null controller) - : Section(parent) - , _controller(controller) { + : Section(parent, controller) { } - [[nodiscard]] not_null controller() const { - return _controller; - } [[nodiscard]] rpl::producer<> showFinishes() const { return _showFinished.events(); } @@ -45,7 +41,6 @@ private: _showFinished.fire({}); } - const not_null _controller; rpl::event_stream<> _showFinished; }; diff --git a/Telegram/SourceFiles/settings/business/settings_shortcut_messages.cpp b/Telegram/SourceFiles/settings/business/settings_shortcut_messages.cpp index 412d025cc6..49f0cd440b 100644 --- a/Telegram/SourceFiles/settings/business/settings_shortcut_messages.cpp +++ b/Telegram/SourceFiles/settings/business/settings_shortcut_messages.cpp @@ -330,7 +330,7 @@ ShortcutMessages::ShortcutMessages( not_null scroll, rpl::producer containerValue, BusinessShortcutId shortcutId) -: AbstractSection(parent) +: AbstractSection(parent, controller) , WindowListDelegate(controller) , _controller(controller) , _session(&controller->session()) diff --git a/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_manage.cpp b/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_manage.cpp index 50642be7db..b292086e1d 100644 --- a/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_manage.cpp +++ b/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_manage.cpp @@ -166,26 +166,13 @@ void Manage::setupContent() { Ui::AddSkip(content); showFinishes() | rpl::take(1) | rpl::on_next([=] { - const auto id = controller()->highlightControlId(); - if (id.isEmpty()) { - return; - } - if (id == u"2sv/change"_q) { - controller()->setHighlightControlId(QString()); - if (_changePasswordButton) { - HighlightWidget(_changePasswordButton); - } - } else if (id == u"2sv/change-email"_q) { - controller()->setHighlightControlId(QString()); - if (_changeEmailButton) { - HighlightWidget(_changeEmailButton); - } - } else if (id == u"2sv/disable"_q) { - controller()->setHighlightControlId(QString()); - if (_disableButton) { - HighlightWidget(_disableButton); - } - } + controller()->checkHighlightControl( + u"2sv/change"_q, + _changePasswordButton); + controller()->checkHighlightControl( + u"2sv/change-email"_q, + _changeEmailButton); + controller()->checkHighlightControl("2sv/disable"_q, _disableButton); }, lifetime()); using Divider = CloudPassword::OneEdgeBoxContentDivider; diff --git a/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_step.cpp b/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_step.cpp index b9bf6baa19..165c325a85 100644 --- a/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_step.cpp +++ b/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_step.cpp @@ -25,16 +25,11 @@ namespace Settings::CloudPassword { AbstractStep::AbstractStep( QWidget *parent, not_null controller) -: AbstractSection(parent) -, _controller(controller) { -} - -not_null AbstractStep::controller() const { - return _controller; +: AbstractSection(parent, controller) { } Api::CloudPassword &AbstractStep::cloudPassword() { - return _controller->session().api().cloudPassword(); + return controller()->session().api().cloudPassword(); } rpl::producer AbstractStep::removeTypes() { diff --git a/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_step.h b/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_step.h index 2410247852..6fe8332feb 100644 --- a/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_step.h +++ b/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_step.h @@ -35,7 +35,6 @@ public: void setStepDataReference(std::any &data) override; protected: - [[nodiscard]] not_null controller() const; [[nodiscard]] Api::CloudPassword &cloudPassword(); [[nodiscard]] virtual rpl::producer removeTypes(); @@ -53,8 +52,6 @@ protected: void setStepData(StepData data); private: - const not_null _controller; - Fn _setInnerFocusCallback; rpl::event_stream<> _showFinished; diff --git a/Telegram/SourceFiles/settings/settings_active_sessions.cpp b/Telegram/SourceFiles/settings/settings_active_sessions.cpp index 1dc50cde38..a894ae8043 100644 --- a/Telegram/SourceFiles/settings/settings_active_sessions.cpp +++ b/Telegram/SourceFiles/settings/settings_active_sessions.cpp @@ -1145,9 +1145,8 @@ namespace Settings { Sessions::Sessions( QWidget *parent, not_null controller) -: Section(parent) -, _controller(controller) { - setupContent(controller); +: Section(parent, controller) { + setupContent(); } rpl::producer Sessions::title() { @@ -1155,15 +1154,15 @@ rpl::producer Sessions::title() { } void Sessions::showFinished() { - _controller->checkHighlightControl(u"devices/terminate-sessions"_q, _terminateAll); - _controller->checkHighlightControl(u"devices/auto-terminate"_q, _autoTerminate); + controller()->checkHighlightControl(u"devices/terminate-sessions"_q, _terminateAll); + controller()->checkHighlightControl(u"devices/auto-terminate"_q, _autoTerminate); } -void Sessions::setupContent(not_null controller) { +void Sessions::setupContent() { const auto container = Ui::CreateChild(this); AddSkip(container, st::settingsPrivacySkip); const auto content = container->add( - object_ptr(container, controller)); + object_ptr(container, controller())); content->setupContent(); _terminateAll = content->terminateAllButton(); diff --git a/Telegram/SourceFiles/settings/settings_active_sessions.h b/Telegram/SourceFiles/settings/settings_active_sessions.h index 6244116405..4260d054e8 100644 --- a/Telegram/SourceFiles/settings/settings_active_sessions.h +++ b/Telegram/SourceFiles/settings/settings_active_sessions.h @@ -25,9 +25,8 @@ public: void showFinished() override; private: - void setupContent(not_null controller); + void setupContent(); - const not_null _controller; QPointer _terminateAll; QPointer _autoTerminate; diff --git a/Telegram/SourceFiles/settings/settings_advanced.cpp b/Telegram/SourceFiles/settings/settings_advanced.cpp index ef712dfd8c..b7ba133d9b 100644 --- a/Telegram/SourceFiles/settings/settings_advanced.cpp +++ b/Telegram/SourceFiles/settings/settings_advanced.cpp @@ -1034,18 +1034,17 @@ void SetupSystemIntegration( Advanced::Advanced( QWidget *parent, not_null controller) -: Section(parent) { - setupContent(controller); +: Section(parent, controller) { + setupContent(); } rpl::producer Advanced::title() { return tr::lng_settings_advanced(); } -void Advanced::setupContent(not_null controller) { +void Advanced::setupContent() { const auto content = Ui::CreateChild(this); - setController(controller); build(content, Builder::AdvancedSection); Ui::ResizeFitChild(this, content); diff --git a/Telegram/SourceFiles/settings/settings_advanced.h b/Telegram/SourceFiles/settings/settings_advanced.h index b247d44d98..38e44eb174 100644 --- a/Telegram/SourceFiles/settings/settings_advanced.h +++ b/Telegram/SourceFiles/settings/settings_advanced.h @@ -58,7 +58,7 @@ public: [[nodiscard]] rpl::producer title() override; private: - void setupContent(not_null controller); + void setupContent(); }; diff --git a/Telegram/SourceFiles/settings/settings_blocked_peers.cpp b/Telegram/SourceFiles/settings/settings_blocked_peers.cpp index 9978541f2d..b4a6cb269e 100644 --- a/Telegram/SourceFiles/settings/settings_blocked_peers.cpp +++ b/Telegram/SourceFiles/settings/settings_blocked_peers.cpp @@ -32,8 +32,7 @@ namespace Settings { Blocked::Blocked( QWidget *parent, not_null controller) -: Section(parent) -, _controller(controller) +: Section(parent, controller) , _container(Ui::CreateChild(this)) { setupContent(); @@ -54,12 +53,12 @@ Blocked::Blocked( st::settingsBlockedHeightMin); } - _controller->session().api().blockedPeers().slice( + controller->session().api().blockedPeers().slice( ) | rpl::on_next([=](const Api::BlockedPeers::Slice &slice) { checkTotal(slice.total); }, lifetime()); - _controller->session().changes().peerUpdates( + controller->session().changes().peerUpdates( Data::PeerUpdate::Flag::IsBlocked ) | rpl::on_next([=](const Data::PeerUpdate &update) { if (update.peer->isBlocked()) { @@ -72,7 +71,8 @@ rpl::producer Blocked::title() { return tr::lng_settings_blocked_users(); } -base::weak_qptr Blocked::createPinnedToTop(not_null parent) { +base::weak_qptr Blocked::createPinnedToTop( + not_null parent) { const auto content = Ui::CreateChild(parent.get()); Ui::AddSkip(content); @@ -84,7 +84,7 @@ base::weak_qptr Blocked::createPinnedToTop(not_null pare { &st::menuIconBlockSettings }); _blockUserButton = blockButton; blockButton->addClickHandler([=] { - BlockedBoxController::BlockNewPeer(_controller); + BlockedBoxController::BlockNewPeer(controller()); }); Ui::AddSkip(content); @@ -138,7 +138,8 @@ void Blocked::setupContent() { std::unique_ptr delegate; }; - auto controller = std::make_unique(_controller); + auto controller = std::make_unique( + this->controller()); controller->setStyleOverrides(&st::settingsBlockedList); const auto content = listWrap->entity()->add( object_ptr(this, controller.get())); @@ -238,7 +239,9 @@ void Blocked::visibleTopBottomUpdated(int visibleTop, int visibleBottom) { void Blocked::showFinished() { _showFinished.fire({}); - _controller->checkHighlightControl(u"privacy/blocked/block-user"_q, _blockUserButton); + controller()->checkHighlightControl( + u"privacy/blocked/block-user"_q, + _blockUserButton); } } // namespace Settings diff --git a/Telegram/SourceFiles/settings/settings_blocked_peers.h b/Telegram/SourceFiles/settings/settings_blocked_peers.h index ac7e61c4bc..7e910c86e2 100644 --- a/Telegram/SourceFiles/settings/settings_blocked_peers.h +++ b/Telegram/SourceFiles/settings/settings_blocked_peers.h @@ -38,7 +38,6 @@ private: void visibleTopBottomUpdated(int visibleTop, int visibleBottom) override; - const not_null _controller; const not_null _container; base::unique_qptr _loading; diff --git a/Telegram/SourceFiles/settings/settings_business.cpp b/Telegram/SourceFiles/settings/settings_business.cpp index a331f64a50..86f8b11216 100644 --- a/Telegram/SourceFiles/settings/settings_business.cpp +++ b/Telegram/SourceFiles/settings/settings_business.cpp @@ -353,8 +353,6 @@ private: void setupContent(); void setupSwipeBack(); - const not_null _controller; - QPointer _subscribe; base::unique_qptr> _back; base::unique_qptr _close; @@ -376,12 +374,11 @@ private: Business::Business( QWidget *parent, not_null controller) -: Section(parent) -, _controller(controller) +: Section(parent, controller) , _radioGroup(std::make_shared()) { setupContent(); setupSwipeBack(); - _controller->session().api().premium().reload(); + controller->session().api().premium().reload(); } rpl::producer Business::title() { @@ -450,7 +447,7 @@ void Business::setupSwipeBack() { void Business::setupContent() { const auto content = Ui::CreateChild(this); - const auto owner = &_controller->session().data(); + const auto owner = &controller()->session().data(); owner->chatbots().preload(); owner->businessInfo().preload(); owner->shortcutMessages().preloadShortcuts(); @@ -460,7 +457,7 @@ void Business::setupContent() { const auto showFeature = [=](PremiumFeature feature) { if (feature == PremiumFeature::FilterTags) { - ShowPremiumPreviewToBuy(_controller, feature); + ShowPremiumPreviewToBuy(controller(), feature); return; } showOther([&] { @@ -523,12 +520,12 @@ void Business::setupContent() { owner->session().api().chatLinks().loadedUpdates() ) | rpl::on_next(check, content->lifetime()); - AddBusinessSummary(content, _controller, [=](PremiumFeature feature) { - if (!_controller->session().premium()) { + AddBusinessSummary(content, controller(), [=](PremiumFeature feature) { + if (!controller()->session().premium()) { _setPaused(true); const auto hidden = crl::guard(this, [=] { _setPaused(false); }); - ShowPremiumPreviewToBuy(_controller, feature, hidden); + ShowPremiumPreviewToBuy(controller(), feature, hidden); return; } else if (!isReady(feature)) { _waitingToShow = feature; @@ -571,7 +568,7 @@ void Business::setupContent() { _sponsoredButton = button; Ui::AddSkip(inner); - const auto session = &_controller->session(); + const auto session = &controller()->session(); { inner->add(object_ptr( inner, @@ -608,7 +605,7 @@ void Business::setupContent() { api->setToggled( toggled ) | rpl::on_error_done([=](const QString &error) { - _controller->showToast(error); + controller()->showToast(error); }, [] { }, button->lifetime()); }, button->lifetime()); @@ -618,7 +615,7 @@ void Business::setupContent() { sponsoredWrap->entity()->resizeToWidth(content->width()); }; Data::AmPremiumValue( - &_controller->session() + &controller()->session() ) | rpl::on_next([=](bool isPremium) { sponsoredWrap->toggle(isPremium, anim::type::normal); if (isPremium) { @@ -634,13 +631,13 @@ base::weak_qptr Business::createPinnedToTop( auto title = tr::lng_business_title(); auto about = [&]() -> rpl::producer { return rpl::conditional( - Data::AmPremiumValue(&_controller->session()), + Data::AmPremiumValue(&controller()->session()), tr::lng_business_unlocked(tr::marked), tr::lng_business_about(tr::marked)); }(); const auto content = [&]() -> Ui::Premium::TopBarAbstract* { - const auto weak = base::make_weak(_controller); + const auto weak = base::make_weak(controller()); const auto clickContextOther = [=] { return QVariant::fromValue(ClickHandlerContext{ .sessionWindow = weak, @@ -707,8 +704,8 @@ base::weak_qptr Business::createPinnedToTop( content, st::settingsPremiumTopBarClose); _close->addClickHandler([=] { - _controller->parentController()->hideLayer(); - _controller->parentController()->hideSpecialLayer(); + controller()->parentController()->hideLayer(); + controller()->parentController()->hideSpecialLayer(); }); content->widthValue( ) | rpl::on_next([=] { @@ -723,7 +720,7 @@ base::weak_qptr Business::createPinnedToTop( void Business::showFinished() { _showFinished.fire({}); crl::on_main(this, [=] { - _controller->checkHighlightControl( + controller()->checkHighlightControl( u"business/sponsored"_q, _sponsoredButton); }); @@ -733,12 +730,12 @@ base::weak_qptr Business::createPinnedToBottom( not_null parent) { const auto content = Ui::CreateChild(parent.get()); - const auto session = &_controller->session(); + const auto session = &controller()->session(); auto buttonText = _buttonText.value(); _subscribe = CreateSubscribeButton({ - _controller, + controller(), content, [] { return u"business"_q; }, std::move(buttonText), @@ -752,7 +749,7 @@ base::weak_qptr Business::createPinnedToBottom( }); { const auto callback = [=](int value) { - auto &api = _controller->session().api(); + auto &api = controller()->session().api(); const auto options = api.premium().subscriptionOptions(); if (options.empty()) { return; diff --git a/Telegram/SourceFiles/settings/settings_calls.cpp b/Telegram/SourceFiles/settings/settings_calls.cpp index c37d3e271f..c194267dfe 100644 --- a/Telegram/SourceFiles/settings/settings_calls.cpp +++ b/Telegram/SourceFiles/settings/settings_calls.cpp @@ -61,8 +61,7 @@ using namespace Webrtc; Calls::Calls( QWidget *parent, not_null controller) -: Section(parent) -, _controller(controller) { +: Section(parent, controller) { // Request valid value of calls disabled flag. controller->session().api().authorizations().reload(); @@ -283,7 +282,7 @@ void Calls::setupContent() { Webrtc::DeviceType::Camera).isEmpty()) { Ui::AddSkip(content); Ui::AddSubsectionTitle(content, tr::lng_settings_call_camera()); - AddCameraSubsection(_controller->uiShow(), content, true); + AddCameraSubsection(controller()->uiShow(), content, true); Ui::AddSkip(content); Ui::AddDivider(content); } @@ -291,7 +290,7 @@ void Calls::setupContent() { Ui::AddSkip(content); Ui::AddSubsectionTitle(content, tr::lng_settings_call_section_other()); - const auto api = &_controller->session().api(); + const auto api = &controller()->session().api(); content->add(object_ptr( content, tr::lng_settings_call_accept_calls(), @@ -314,7 +313,7 @@ void Calls::setupContent() { using namespace ::Platform; const auto opened = OpenSystemSettings(SystemSettingsType::Audio); if (!opened) { - _controller->show( + controller()->show( Ui::MakeInformBox(tr::lng_linux_no_audio_prefs())); } }); @@ -335,7 +334,7 @@ void Calls::initPlaybackButton( PlaybackDeviceNameValue(rpl::duplicate(resolvedId)), st::settingsButtonNoIcon )->addClickHandler([=] { - _controller->show(ChoosePlaybackDeviceBox( + controller()->show(ChoosePlaybackDeviceBox( rpl::duplicate(resolvedId), [=](const QString &id) { set(id); @@ -356,7 +355,7 @@ void Calls::initCaptureButton( CaptureDeviceNameValue(rpl::duplicate(resolvedId)), st::settingsButtonNoIcon )->addClickHandler([=] { - _controller->show(ChooseCaptureDeviceBox( + controller()->show(ChooseCaptureDeviceBox( rpl::duplicate(resolvedId), [=](const QString &id) { set(id); @@ -424,12 +423,12 @@ void Calls::requestPermissionAndStartTestingMicrophone() { PermissionType::Microphone, startTestingChecked); } else { - const auto showSystemSettings = [controller = _controller] { + const auto showSystemSettings = [controller = controller()] { OpenSystemSettingsForPermission( PermissionType::Microphone); controller->hideLayer(); }; - _controller->show(Ui::MakeConfirmBox({ + controller()->show(Ui::MakeConfirmBox({ .text = tr::lng_no_mic_permission(), .confirmed = showSystemSettings, .confirmText = tr::lng_menu_settings(), diff --git a/Telegram/SourceFiles/settings/settings_calls.h b/Telegram/SourceFiles/settings/settings_calls.h index efdf95f81f..567d833b3d 100644 --- a/Telegram/SourceFiles/settings/settings_calls.h +++ b/Telegram/SourceFiles/settings/settings_calls.h @@ -62,7 +62,6 @@ private: rpl::producer resolvedId, Fn set); - const not_null _controller; rpl::event_stream _cameraNameStream; rpl::variable _testingMicrophone; diff --git a/Telegram/SourceFiles/settings/settings_chat.cpp b/Telegram/SourceFiles/settings/settings_chat.cpp index 1b660b128e..fa95a17c47 100644 --- a/Telegram/SourceFiles/settings/settings_chat.cpp +++ b/Telegram/SourceFiles/settings/settings_chat.cpp @@ -746,12 +746,10 @@ void SetupStickersEmoji( container, tr::lng_settings_stickers_emoji()); if (highlights) { - highlights->push_back({ - u"chat/stickers-emoji"_q, - Builder::HighlightEntry{ - title.get(), - SubsectionTitleHighlight() }, - }); + highlights->push_back({ u"chat/stickers-emoji"_q, { + title.get(), + SubsectionTitleHighlight(), + } }); } const auto session = &controller->session(); @@ -817,10 +815,10 @@ void SetupStickersEmoji( Core::App().saveSettingsDelayed(); }); if (highlights) { - highlights->push_back({ - u"chat/large-emoji"_q, - Builder::HighlightEntry{ largeEmoji, { .radius = st::boxRadius } }, - }); + highlights->push_back({ u"chat/large-emoji"_q, { + largeEmoji, + { .radius = st::boxRadius } + } }); } add( @@ -856,10 +854,10 @@ void SetupStickersEmoji( suggestEmoji->value(), _1 && _2)); if (highlights) { - highlights->push_back({ - u"chat/suggest-animated-emoji"_q, - Builder::HighlightEntry{ suggestAnimated, { .radius = st::boxRadius } }, - }); + highlights->push_back({ u"chat/suggest-animated-emoji"_q, { + suggestAnimated, + { .radius = st::boxRadius } + } }); } const auto suggestByEmoji = addWithReturn( @@ -870,10 +868,10 @@ void SetupStickersEmoji( Core::App().saveSettingsDelayed(); }); if (highlights) { - highlights->push_back({ - u"chat/suggest-by-emoji"_q, - Builder::HighlightEntry{ suggestByEmoji, { .radius = st::boxRadius } }, - }); + highlights->push_back({ u"chat/suggest-by-emoji"_q, { + suggestByEmoji, + { .radius = st::boxRadius }, + } }); } add( @@ -973,10 +971,10 @@ void SetupMessages( Quick::React, tr::lng_settings_chat_quick_action_react(tr::now)); if (highlights) { - highlights->push_back({ - u"chat/quick-reaction"_q, - Builder::HighlightEntry{ react, { .radius = st::boxRadius } }, - }); + highlights->push_back({ u"chat/quick-reaction"_q, { + react, + { .radius = st::boxRadius }, + } }); } const auto buttonRight = Ui::CreateSimpleCircleButton( @@ -1071,12 +1069,10 @@ void SetupMessages( show->showBox(Box(ReactionsSettingsBox, controller)); }); if (highlights) { - highlights->push_back({ - u"chat/quick-reaction-choose"_q, - Builder::HighlightEntry{ - buttonRight.get(), - { .shape = HighlightShape::Ellipse } }, - }); + highlights->push_back({ u"chat/quick-reaction-choose"_q, { + buttonRight.get(), + { .shape = HighlightShape::Ellipse }, + } }); } Ui::AddSkip(inner, st::settingsSendTypeSkip); @@ -1302,27 +1298,18 @@ void SetupChatBackground( st::settingsBackgroundPadding); if (highlights) { - highlights->push_back({ - u"chat/wallpapers"_q, - Builder::HighlightEntry{ - title.get(), - SubsectionTitleHighlight(), - }, - }); - highlights->push_back({ - u"chat/wallpapers-set"_q, - Builder::HighlightEntry{ - row->chooseFromGallery(), - SubsectionTitleHighlight(), - }, - }); - highlights->push_back({ - u"chat/wallpapers-choose-photo"_q, - Builder::HighlightEntry{ - row->chooseFromFile(), - SubsectionTitleHighlight(), - }, - }); + highlights->push_back({ u"chat/wallpapers"_q, { + title.get(), + SubsectionTitleHighlight(), + } }); + highlights->push_back({ u"chat/wallpapers-set"_q, { + row->chooseFromGallery(), + SubsectionTitleHighlight(), + } }); + highlights->push_back({ u"chat/wallpapers-choose-photo"_q, { + row->chooseFromFile(), + SubsectionTitleHighlight(), + } }); } const auto skipTop = st::settingsCheckbox.margin.top(); @@ -1745,7 +1732,7 @@ void SetupDefaultThemes( .margin = { -add, -add, -add, -add }, .shape = HighlightShape::Ellipse, }, - }}); + } }); } Background()->updates( @@ -1831,13 +1818,10 @@ void SetupThemeOptions( container, tr::lng_settings_themes()); if (highlights) { - highlights->push_back({ - u"chat/themes"_q, - Builder::HighlightEntry{ - title.get(), - SubsectionTitleHighlight(), - }, - }); + highlights->push_back({ u"chat/themes"_q, { + title.get(), + SubsectionTitleHighlight(), + } }); } Ui::AddSkip(container, st::settingsThemesTopSkip); @@ -1978,10 +1962,9 @@ void SetupThemeSettings( } }); if (highlights) { - highlights->push_back({ - u"chat/auto-night-mode"_q, - Builder::HighlightEntry{ button.get(), {} }, - }); + highlights->push_back({ u"chat/auto-night-mode"_q, { + button.get() + } }); } } @@ -2161,9 +2144,8 @@ void SetupSupport( } Chat::Chat(QWidget *parent, not_null controller) -: Section(parent) -, _controller(controller) { - setupContent(controller); +: Section(parent, controller) { + setupContent(); } rpl::producer Chat::title() { @@ -2171,7 +2153,7 @@ rpl::producer Chat::title() { } void Chat::fillTopBarMenu(const Ui::Menu::MenuCallback &addAction) { - const auto window = &_controller->window(); + const auto window = &controller()->window(); const auto createTheme = addAction( tr::lng_settings_bg_theme_create(tr::now), [=] { window->show(Box(Window::Theme::CreateBox, window)); }, @@ -2181,10 +2163,9 @@ void Chat::fillTopBarMenu(const Ui::Menu::MenuCallback &addAction) { u"chat/themes-create"_q); } -void Chat::setupContent(not_null controller) { +void Chat::setupContent() { const auto content = Ui::CreateChild(this); - setController(controller); build(content, Builder::ChatSection); Ui::ResizeFitChild(this, content); diff --git a/Telegram/SourceFiles/settings/settings_chat.h b/Telegram/SourceFiles/settings/settings_chat.h index c3c8911535..3b9c8fc888 100644 --- a/Telegram/SourceFiles/settings/settings_chat.h +++ b/Telegram/SourceFiles/settings/settings_chat.h @@ -99,9 +99,7 @@ public: const Ui::Menu::MenuCallback &addAction) override; private: - void setupContent(not_null controller); - - const not_null _controller; + void setupContent(); }; diff --git a/Telegram/SourceFiles/settings/settings_common.cpp b/Telegram/SourceFiles/settings/settings_common.cpp index 38f0acf9b7..b08456602f 100644 --- a/Telegram/SourceFiles/settings/settings_common.cpp +++ b/Telegram/SourceFiles/settings/settings_common.cpp @@ -290,6 +290,12 @@ HighlightArgs SubsectionTitleHighlight() { return { .margin = { -radius, 0, -radius, 0 }, .radius = radius }; } +AbstractSection::AbstractSection( + QWidget *parent, + not_null controller) +: _controller(controller) { +} + void AbstractSection::build( not_null container, SectionBuilder builder) { diff --git a/Telegram/SourceFiles/settings/settings_common.h b/Telegram/SourceFiles/settings/settings_common.h index 83ea8c4057..ceb1f0d662 100644 --- a/Telegram/SourceFiles/settings/settings_common.h +++ b/Telegram/SourceFiles/settings/settings_common.h @@ -98,7 +98,13 @@ using SectionBuilder = void(*)( class AbstractSection : public Ui::RpWidget { public: - using RpWidget::RpWidget; + AbstractSection( + QWidget *parent, + not_null controller); + + [[nodiscard]] not_null controller() const { + return _controller; + } [[nodiscard]] virtual Type id() const = 0; [[nodiscard]] virtual rpl::producer sectionShowOther() { @@ -170,21 +176,14 @@ public: } protected: - void setController(not_null controller) { - _controller = controller; - } - [[nodiscard]] Window::SessionController *controller() const { - return _controller; - } - void build( not_null container, SectionBuilder builder); private: + const not_null _controller; rpl::event_stream _showOtherRequests; rpl::event_stream<> _showFinished; - Window::SessionController *_controller = nullptr; }; diff --git a/Telegram/SourceFiles/settings/settings_credits.cpp b/Telegram/SourceFiles/settings/settings_credits.cpp index a454da2800..b633840a4c 100644 --- a/Telegram/SourceFiles/settings/settings_credits.cpp +++ b/Telegram/SourceFiles/settings/settings_credits.cpp @@ -98,7 +98,6 @@ private: void setupSwipeBack(); void setupHistory(not_null container); void setupSubscriptions(not_null container); - const not_null _controller; const CreditsType _creditsType; QWidget *_parent = nullptr; @@ -126,8 +125,7 @@ Credits::Credits( QWidget *parent, not_null controller, CreditsType type) -: Section(parent) -, _controller(controller) +: Section(parent, controller) , _creditsType(type) , _star(Ui::GenerateStars(st::creditsTopupButton.height, 1)) , _balanceStar((_creditsType == CreditsType::Ton) @@ -135,11 +133,11 @@ Credits::Credits( st::tonFieldIconSize, st::currencyFg->c) : Ui::GenerateStars(st::creditsBalanceStarHeight, 1)) { - _controller->session().giftBoxStickersPacks().tonLoad(); + controller->session().giftBoxStickersPacks().tonLoad(); setupContent(); setupSwipeBack(); - _controller->session().premiumPossibleValue( + controller->session().premiumPossibleValue( ) | rpl::on_next([=](bool premiumPossible) { if (!premiumPossible) { _showBack.fire({}); @@ -179,7 +177,7 @@ void Credits::setupSubscriptions(not_null container) { container, object_ptr(container))); const auto content = history->entity(); - const auto self = _controller->session().user(); + const auto self = controller()->session().user(); const auto fill = [=](const Data::CreditsStatusSlice &fullSlice) { const auto inner = content; @@ -197,16 +195,16 @@ void Credits::setupSubscriptions(not_null container) { inner, object_ptr(inner))); - const auto controller = _controller->parentController(); + const auto window = controller()->parentController(); const auto entryClicked = [=]( const Data::CreditsHistoryEntry &e, const Data::SubscriptionEntry &s) { - controller->uiShow()->show( - Box(ReceiptCreditsBox, controller, e, s)); + window->uiShow()->show( + Box(ReceiptCreditsBox, window, e, s)); }; Info::Statistics::AddCreditsHistoryList( - controller->uiShow(), + window->uiShow(), fullSlice, fullWrap->entity(), entryClicked, @@ -251,7 +249,7 @@ void Credits::setupHistory(not_null container) { container, object_ptr(container))); const auto content = history->entity(); - const auto self = _controller->session().user(); + const auto self = controller()->session().user(); Ui::AddSkip(content, st::lineWidth * 6); @@ -354,19 +352,19 @@ void Credits::setupHistory(not_null container) { } }, inner->lifetime()); - const auto controller = _controller->parentController(); + const auto window = controller()->parentController(); const auto entryClicked = [=]( const Data::CreditsHistoryEntry &e, const Data::SubscriptionEntry &s) { - controller->uiShow()->show(Box( + window->uiShow()->show(Box( ReceiptCreditsBox, - controller, + window, e, s)); }; Info::Statistics::AddCreditsHistoryList( - controller->uiShow(), + window->uiShow(), fullSlice, fullWrap->entity(), entryClicked, @@ -374,7 +372,7 @@ void Credits::setupHistory(not_null container) { true, true); Info::Statistics::AddCreditsHistoryList( - controller->uiShow(), + window->uiShow(), inSlice, inWrap->entity(), entryClicked, @@ -382,7 +380,7 @@ void Credits::setupHistory(not_null container) { true, false); Info::Statistics::AddCreditsHistoryList( - controller->uiShow(), + window->uiShow(), outSlice, outWrap->entity(), std::move(entryClicked), @@ -407,7 +405,7 @@ void Credits::setupHistory(not_null container) { apiIn->request({}, [=](Data::CreditsStatusSlice inSlice) { apiOut->request({}, [=](Data::CreditsStatusSlice outSlice) { ::Api::PremiumPeerBot( - &_controller->session() + &controller()->session() ) | rpl::on_next([=](not_null bot) { fill(bot, fullSlice, inSlice, outSlice); apiLifetime->destroy(); @@ -420,9 +418,9 @@ void Credits::setupHistory(not_null container) { void Credits::setupSwipeBack() { using namespace Ui::Controls; - + auto swipeBackData = lifetime().make_state(); - + auto update = [=](SwipeContextData data) { if (data.translation > 0) { if (!swipeBackData->callback) { @@ -441,7 +439,7 @@ void Credits::setupSwipeBack() { (*swipeBackData) = {}; } }; - + auto init = [=](int, Qt::LayoutDirection direction) { return (direction == Qt::RightToLeft) ? DefaultSwipeBackHandlerFinishData([=] { @@ -449,7 +447,7 @@ void Credits::setupSwipeBack() { }) : SwipeHandlerFinishData(); }; - + SetupSwipeHandler({ .widget = this, .scroll = v::null, @@ -516,7 +514,7 @@ void Credits::setupContent() { rpl::single(Ui::Text::SingleCustomEmoji(u"+"_q)), tr::marked))); button->setTextTransform(Ui::RoundButton::TextTransform::NoTransform); - const auto show = _controller->uiShow(); + const auto show = controller()->uiShow(); if (isCurrency) { const auto url = tr::lng_suggest_low_ton_fragment_url(tr::now); button->setClickedCallback([=] { UrlClickHandler::Open(url); }); @@ -563,8 +561,8 @@ void Credits::setupContent() { rpl::single(Ui::MakeCreditsIconEntity()), lt_amount, (isCurrency - ? _controller->session().credits().tonBalanceValue() - : _controller->session().credits().balanceValue() + ? controller()->session().credits().tonBalanceValue() + : controller()->session().credits().balanceValue() ) | rpl::map( Lang::FormatCreditsAmountDecimal ) | rpl::map(tr::bold), @@ -574,20 +572,20 @@ void Credits::setupContent() { std::move(context)), style::al_top); if (isCurrency) { - const auto rate = _controller->session().credits().usdRate(); + const auto rate = controller()->session().credits().usdRate(); const auto wrap = content->add( object_ptr>( content, object_ptr( content, - _controller->session().credits().tonBalanceValue( + controller()->session().credits().tonBalanceValue( ) | rpl::map([=](CreditsAmount value) { using namespace Info::ChannelEarn; return value ? ToUsd(value, rate, 3) : QString(); }), st::channelEarnOverviewSubMinorLabel)), style::al_top); - wrap->toggleOn(_controller->session().credits().tonBalanceValue( + wrap->toggleOn(controller()->session().credits().tonBalanceValue( ) | rpl::map(rpl::mappers::_1 > CreditsAmount(0))); wrap->finishAnimating(); } @@ -605,8 +603,8 @@ void Credits::setupContent() { } Ui::AddSkip(content, st::lineWidth * 4); - const auto controller = _controller->parentController(); - const auto self = _controller->session().user(); + const auto window = controller()->parentController(); + const auto self = window->session().user(); if (!isCurrency) { const auto wrap = content->add( object_ptr>( @@ -618,11 +616,11 @@ void Credits::setupContent() { { &st::menuIconStats }))); _statsButton = static_cast(wrap->entity()); wrap->entity()->setClickedCallback([=] { - controller->showSection(Info::BotEarn::Make(self)); + window->showSection(Info::BotEarn::Make(self)); }); - wrap->toggleOn(_controller->session().credits().loadedValue( + wrap->toggleOn(window->session().credits().loadedValue( ) | rpl::map([=] { - return _controller->session().credits().statsEnabled(); + return window->session().credits().statsEnabled(); })); } if (!isCurrency) { @@ -632,7 +630,7 @@ void Credits::setupContent() { st::settingsCreditsButton, { &st::settingsButtonIconGift }); _giftButton->setClickedCallback([=] { - Ui::ShowGiftCreditsBox(controller, paid); + Ui::ShowGiftCreditsBox(window, paid); }); } @@ -643,7 +641,7 @@ void Credits::setupContent() { st::settingsCreditsButton, { &st::settingsButtonIconEarn }); _earnButton->setClickedCallback([=] { - controller->showSection(Info::BotStarRef::Join::Make(self)); + window->showSection(Info::BotStarRef::Join::Make(self)); }); } if (isCurrency) { @@ -744,7 +742,7 @@ void Credits::setupContent() { Api::HandleWithdrawalButton( { .currencyReceiver = self }, button, - _controller->uiShow()); + controller()->uiShow()); Ui::ToggleChildrenVisibility(button, true); Ui::AddSkip(container); @@ -756,7 +754,7 @@ void Credits::setupContent() { Ui::AddSkip(container); }; - const auto self = _controller->session().user(); + const auto self = controller()->session().user(); const auto wrap = content->add( object_ptr>( content, @@ -794,7 +792,7 @@ base::weak_qptr Credits::createPinnedToTop( const auto isCurrency = _creditsType == CreditsType::Ton; const auto content = [&]() -> Ui::Premium::TopBarAbstract* { - const auto weak = base::make_weak(_controller); + const auto weak = base::make_weak(controller()); const auto clickContextOther = [=] { return QVariant::fromValue(ClickHandlerContext{ .sessionWindow = weak, @@ -842,17 +840,17 @@ base::weak_qptr Credits::createPinnedToTop( { const auto balance = AddBalanceWidget( content, - &_controller->session(), + &controller()->session(), isCurrency - ? _controller->session().credits().tonBalanceValue() - : _controller->session().credits().balanceValue(), + ? controller()->session().credits().tonBalanceValue() + : controller()->session().credits().balanceValue(), true, content->heightValue() | rpl::map([=](int height) { const auto ratio = float64(height - content->minimumHeight()) / (content->maximumHeight() - content->minimumHeight()); return (1. - ratio / 0.35); })); - _controller->session().credits().load(true); + controller()->session().credits().load(true); rpl::combine( balance->sizeValue(), content->sizeValue() @@ -897,8 +895,8 @@ base::weak_qptr Credits::createPinnedToTop( content, st::infoTopBarClose); _close->addClickHandler([=] { - _controller->parentController()->hideLayer(); - _controller->parentController()->hideSpecialLayer(); + controller()->parentController()->hideLayer(); + controller()->parentController()->hideSpecialLayer(); }); content->widthValue( ) | rpl::on_next([=] { @@ -912,9 +910,9 @@ base::weak_qptr Credits::createPinnedToTop( void Credits::showFinished() { _showFinished.fire({}); - _controller->checkHighlightControl(u"stars/stats"_q, _statsButton); - _controller->checkHighlightControl(u"stars/gift"_q, _giftButton); - _controller->checkHighlightControl(u"stars/earn"_q, _earnButton); + controller()->checkHighlightControl(u"stars/stats"_q, _statsButton); + controller()->checkHighlightControl(u"stars/gift"_q, _giftButton); + controller()->checkHighlightControl(u"stars/earn"_q, _earnButton); } class Currency { diff --git a/Telegram/SourceFiles/settings/settings_experimental.cpp b/Telegram/SourceFiles/settings/settings_experimental.cpp index 6a23ef9dd6..800d462a60 100644 --- a/Telegram/SourceFiles/settings/settings_experimental.cpp +++ b/Telegram/SourceFiles/settings/settings_experimental.cpp @@ -184,19 +184,18 @@ void SetupExperimental( Experimental::Experimental( QWidget *parent, not_null controller) -: Section(parent) { - setupContent(controller); +: Section(parent, controller) { + setupContent(); } rpl::producer Experimental::title() { return tr::lng_settings_experimental(); } -void Experimental::setupContent( - not_null controller) { +void Experimental::setupContent() { const auto content = Ui::CreateChild(this); - SetupExperimental(&controller->window(), content); + SetupExperimental(&controller()->window(), content); Ui::ResizeFitChild(this, content); } diff --git a/Telegram/SourceFiles/settings/settings_experimental.h b/Telegram/SourceFiles/settings/settings_experimental.h index bb43a42e5d..58032b5cca 100644 --- a/Telegram/SourceFiles/settings/settings_experimental.h +++ b/Telegram/SourceFiles/settings/settings_experimental.h @@ -20,7 +20,7 @@ public: [[nodiscard]] rpl::producer title() override; private: - void setupContent(not_null controller); + void setupContent(); }; diff --git a/Telegram/SourceFiles/settings/settings_folders.cpp b/Telegram/SourceFiles/settings/settings_folders.cpp index 26c95d165b..595e20cebc 100644 --- a/Telegram/SourceFiles/settings/settings_folders.cpp +++ b/Telegram/SourceFiles/settings/settings_folders.cpp @@ -53,6 +53,7 @@ struct FoldersHighlightTargets { QPointer createButton; QPointer tagsButton; QPointer viewSection; + QPointer recommendedTitle; }; namespace { @@ -607,7 +608,12 @@ void FilterRowButton::paintEvent(QPaintEvent *e) { const auto aboutRows = nonEmptyAbout->entity(); Ui::AddDivider(aboutRows); Ui::AddSkip(aboutRows); - Ui::AddSubsectionTitle(aboutRows, tr::lng_filters_recommended()); + const auto recommendedTitle = Ui::AddSubsectionTitle( + aboutRows, + tr::lng_filters_recommended()); + if (targets) { + targets->recommendedTitle = recommendedTitle; + } const auto setTagsProgress = [=](float64 value) { for (const auto &row : state->rows) { @@ -1030,9 +1036,8 @@ void SetupView( Folders::Folders( QWidget *parent, not_null controller) -: Section(parent) -, _controller(controller) { - setupContent(controller); +: Section(parent, controller) { + setupContent(); } Folders::~Folders() { @@ -1045,8 +1050,8 @@ rpl::producer Folders::title() { return tr::lng_filters_title(); } -void Folders::setupContent(not_null controller) { - controller->session().data().chatsFilters().requestSuggested(); +void Folders::setupContent() { + controller()->session().data().chatsFilters().requestSuggested(); const auto content = Ui::CreateChild(this); const auto tagsButtonEnabled @@ -1055,17 +1060,22 @@ void Folders::setupContent(not_null controller) { SetupTopContent(content, _showFinished.events()); auto targets = FoldersHighlightTargets(); - _save = SetupFoldersContent(controller, content, tagsButtonEnabled, &targets); + _save = SetupFoldersContent( + controller(), + content, + tagsButtonEnabled, + &targets); _createButton = targets.createButton; + _recommendedTitle = targets.recommendedTitle; auto dividerNeeded = true; - if (controller->session().premiumPossible()) { - SetupTagContent(controller, content, tagsButtonEnabled, &targets); + if (controller()->session().premiumPossible()) { + SetupTagContent(controller(), content, tagsButtonEnabled, &targets); _tagsButton = targets.tagsButton; dividerNeeded = false; } - SetupView(controller, content, dividerNeeded, &targets); + SetupView(controller(), content, dividerNeeded, &targets); _viewSection = targets.viewSection; Ui::ResizeFitChild(this, content); @@ -1074,9 +1084,13 @@ void Folders::setupContent(not_null controller) { void Folders::showFinished() { _showFinished.fire({}); - _controller->checkHighlightControl(u"folders/create"_q, _createButton); - _controller->checkHighlightControl(u"folders/show-tags"_q, _tagsButton); - _controller->checkHighlightControl(u"folders/tab-view"_q, _viewSection); + controller()->checkHighlightControl(u"folders/create"_q, _createButton); + controller()->checkHighlightControl(u"folders/show-tags"_q, _tagsButton); + controller()->checkHighlightControl(u"folders/tab-view"_q, _viewSection); + controller()->checkHighlightControl( + u"folders/add-recommended"_q, + _recommendedTitle, + SubsectionTitleHighlight()); } } // namespace Settings diff --git a/Telegram/SourceFiles/settings/settings_folders.h b/Telegram/SourceFiles/settings/settings_folders.h index c1cf93fe3a..f983893388 100644 --- a/Telegram/SourceFiles/settings/settings_folders.h +++ b/Telegram/SourceFiles/settings/settings_folders.h @@ -23,15 +23,15 @@ public: [[nodiscard]] rpl::producer title() override; private: - void setupContent(not_null controller); + void setupContent(); - const not_null _controller; Fn _save; rpl::event_stream<> _showFinished; QPointer _createButton; QPointer _tagsButton; QPointer _viewSection; + QPointer _recommendedTitle; }; diff --git a/Telegram/SourceFiles/settings/settings_global_ttl.cpp b/Telegram/SourceFiles/settings/settings_global_ttl.cpp index 657dfdfd9f..c35d133987 100644 --- a/Telegram/SourceFiles/settings/settings_global_ttl.cpp +++ b/Telegram/SourceFiles/settings/settings_global_ttl.cpp @@ -206,7 +206,6 @@ private: void request(TimeId ttl) const; - const not_null _controller; const std::shared_ptr _group; const std::shared_ptr _show; @@ -221,8 +220,7 @@ private: GlobalTTL::GlobalTTL( QWidget *parent, not_null controller) -: Section(parent) -, _controller(controller) +: Section(parent, controller) , _group(std::make_shared(0)) , _show(controller->uiShow()) , _buttons(Ui::CreateChild(this)) { @@ -234,7 +232,7 @@ rpl::producer GlobalTTL::title() { } void GlobalTTL::request(TimeId ttl) const { - _controller->session().api().selfDestruct().updateDefaultHistoryTTL(ttl); + controller()->session().api().selfDestruct().updateDefaultHistoryTTL(ttl); } void GlobalTTL::showSure(TimeId ttl, bool rebuild) const { @@ -339,7 +337,7 @@ void GlobalTTL::setupContent() { content->add(object_ptr::fromRaw(_buttons)); { - const auto &apiTTL = _controller->session().api().selfDestruct(); + const auto &apiTTL = controller()->session().api().selfDestruct(); const auto rebuild = [=](TimeId period) { rebuildButtons(period); _group->setValue(period); @@ -349,7 +347,7 @@ void GlobalTTL::setupContent() { ) | rpl::on_next(rebuild, content->lifetime()); } - const auto show = _controller->uiShow(); + const auto show = controller()->uiShow(); _customButton = content->add(object_ptr( content, tr::lng_settings_ttl_after_custom(), @@ -381,7 +379,8 @@ void GlobalTTL::setupContent() { tr::marked), st::boxDividerLabel); footer->setLink(1, std::make_shared([=] { - const auto session = &_controller->session(); + const auto window = controller(); + const auto session = &window->session(); auto controller = std::make_unique(session); auto initBox = [=, controller = controller.get()]( not_null box) { @@ -417,7 +416,7 @@ void GlobalTTL::setupContent() { })); box->addButton(tr::lng_cancel(), [=] { box->closeBox(); }); }; - _controller->show( + window->show( Box(std::move(controller), std::move(initBox))); })); content->add(object_ptr( @@ -431,7 +430,7 @@ void GlobalTTL::setupContent() { void GlobalTTL::showFinished() { _showFinished.fire({}); if (_customButton) { - _controller->checkHighlightControl( + controller()->checkHighlightControl( u"auto-delete/set-custom"_q, _customButton, { .rippleShape = true }); diff --git a/Telegram/SourceFiles/settings/settings_information.cpp b/Telegram/SourceFiles/settings/settings_information.cpp index b45729d033..ad90a2cd3f 100644 --- a/Telegram/SourceFiles/settings/settings_information.cpp +++ b/Telegram/SourceFiles/settings/settings_information.cpp @@ -1086,9 +1086,8 @@ void AccountsList::rebuild() { Information::Information( QWidget *parent, not_null controller) -: Section(parent) -, _controller(controller) { - setupContent(controller); +: Section(parent, controller) { + setupContent(); } rpl::producer Information::title() { @@ -1096,33 +1095,32 @@ rpl::producer Information::title() { } void Information::showFinished() { - _controller->checkHighlightControl(u"profile-photo"_q, _photo, { + controller()->checkHighlightControl(u"profile-photo"_q, _photo, { .shape = HighlightShape::Ellipse, }); - _controller->checkHighlightControl(u"profile-photo/use-emoji"_q, _uploadPhoto, { + controller()->checkHighlightControl(u"profile-photo/use-emoji"_q, _uploadPhoto, { .shape = HighlightShape::Ellipse, }); - _controller->checkHighlightControl(u"edit/bio"_q, _bio, { + controller()->checkHighlightControl(u"edit/bio"_q, _bio, { .margin = st::settingsBioHighlightMargin, }); - _controller->checkHighlightControl(u"edit/your-color"_q, _colorButton); - _controller->checkHighlightControl(u"edit/channel"_q, _channelButton); - _controller->checkHighlightControl(u"edit/add-account"_q, _addAccount); + controller()->checkHighlightControl(u"edit/your-color"_q, _colorButton); + controller()->checkHighlightControl(u"edit/channel"_q, _channelButton); + controller()->checkHighlightControl(u"edit/add-account"_q, _addAccount); } -void Information::setupContent( - not_null controller) { +void Information::setupContent() { const auto content = Ui::CreateChild(this); - const auto self = controller->session().user(); + const auto self = controller()->session().user(); auto targets = InformationHighlightTargets(); - SetupPhoto(content, controller, self, &targets); + SetupPhoto(content, controller(), self, &targets); SetupBio(content, self, &targets); - SetupRows(content, controller, self); - SetupPersonalChannel(content, controller, self, &targets); - SetupBirthday(content, controller, self); - SetupAccountsWrap(content, controller, &targets); + SetupRows(content, controller(), self); + SetupPersonalChannel(content, controller(), self, &targets); + SetupBirthday(content, controller(), self); + SetupAccountsWrap(content, controller(), &targets); _photo = targets.photo; _uploadPhoto = targets.uploadPhoto; diff --git a/Telegram/SourceFiles/settings/settings_information.h b/Telegram/SourceFiles/settings/settings_information.h index b73ba0c8b7..44ea4cfc41 100644 --- a/Telegram/SourceFiles/settings/settings_information.h +++ b/Telegram/SourceFiles/settings/settings_information.h @@ -32,9 +32,8 @@ public: void showFinished() override; private: - void setupContent(not_null controller); + void setupContent(); - const not_null _controller; QPointer _photo; QPointer _uploadPhoto; QPointer _bio; diff --git a/Telegram/SourceFiles/settings/settings_local_passcode.cpp b/Telegram/SourceFiles/settings/settings_local_passcode.cpp index 510c899e81..24798f064b 100644 --- a/Telegram/SourceFiles/settings/settings_local_passcode.cpp +++ b/Telegram/SourceFiles/settings/settings_local_passcode.cpp @@ -75,9 +75,6 @@ protected: [[nodiscard]] virtual EnterType enterType() const = 0; private: - - const not_null _controller; - rpl::event_stream<> _showFinished; rpl::event_stream<> _setInnerFocus; rpl::event_stream _showOther; @@ -89,8 +86,7 @@ private: LocalPasscodeEnter::LocalPasscodeEnter( QWidget *parent, not_null controller) -: AbstractSection(parent) -, _controller(controller) { +: AbstractSection(parent, controller) { } rpl::producer LocalPasscodeEnter::title() { @@ -235,7 +231,7 @@ void LocalPasscodeEnter::setupContent() { error->setText(tr::lng_passcode_differ(tr::now)); } else { if (isChange) { - const auto &domain = _controller->session().domain(); + const auto &domain = controller()->session().domain(); if (domain.local().checkPasscode(newText.toUtf8())) { newPasscode->setFocus(); newPasscode->showError(); @@ -245,7 +241,7 @@ void LocalPasscodeEnter::setupContent() { return; } } - SetPasscode(_controller, newText); + SetPasscode(controller(), newText); if (isCreate) { if (Platform::IsWindows() || _systemUnlockWithBiometric) { Core::App().settings().setSystemUnlockEnabled(true); @@ -264,7 +260,7 @@ void LocalPasscodeEnter::setupContent() { error->setText(tr::lng_flood_error(tr::now)); return; } - const auto &domain = _controller->session().domain(); + const auto &domain = controller()->session().domain(); if (domain.local().checkPasscode(newText.toUtf8())) { cSetPasscodeBadTries(0); _showOther.fire(LocalPasscodeManageId()); @@ -405,8 +401,6 @@ public: private: void setupContent(); - const not_null _controller; - rpl::variable _isBottomFillerShown; rpl::event_stream<> _showFinished; @@ -422,8 +416,7 @@ private: LocalPasscodeManage::LocalPasscodeManage( QWidget *parent, not_null controller) -: Section(parent) -, _controller(controller) { +: Section(parent, controller) { setupContent(); } @@ -494,7 +487,7 @@ void LocalPasscodeManage::setupContent() { { &st::menuIconTimer }); _autoLockButton = autoLockButton; autoLockButton->addClickHandler([=] { - const auto box = _controller->show(Box()); + const auto box = controller()->show(Box()); box->boxClosing( ) | rpl::start_to_stream(state->autoLockBoxClosing, box->lifetime()); }); @@ -612,11 +605,11 @@ void LocalPasscodeManage::setupContent() { base::weak_qptr LocalPasscodeManage::createPinnedToBottom( not_null parent) { auto callback = [=] { - _controller->show( + controller()->show( Ui::MakeConfirmBox({ .text = tr::lng_settings_passcode_disable_sure(), .confirmed = [=](Fn &&close) { - SetPasscode(_controller, QString()); + SetPasscode(controller(), QString()); Core::App().settings().setSystemUnlockEnabled(false); Core::App().saveSettingsDelayed(); @@ -642,31 +635,16 @@ base::weak_qptr LocalPasscodeManage::createPinnedToBottom( void LocalPasscodeManage::showFinished() { _showFinished.fire({}); - const auto id = _controller->highlightControlId(); - if (id.isEmpty()) { - return; - } - if (id == u"passcode/change"_q) { - _controller->setHighlightControlId(QString()); - if (_changeButton) { - HighlightWidget(_changeButton); - } - } else if (id == u"passcode/auto-lock"_q) { - _controller->setHighlightControlId(QString()); - if (_autoLockButton) { - HighlightWidget(_autoLockButton); - } - } else if (id == u"passcode/biometrics"_q) { - _controller->setHighlightControlId(QString()); - if (_biometricsButton) { - HighlightWidget(_biometricsButton); - } - } else if (id == u"passcode/disable"_q) { - _controller->setHighlightControlId(QString()); - if (_disableButton) { - HighlightWidget(_disableButton); - } - } + controller()->checkHighlightControl(u"passcode/change"_q, _changeButton); + controller()->checkHighlightControl( + u"passcode/auto-lock"_q, + _autoLockButton); + controller()->checkHighlightControl( + u"passcode/biometrics"_q, + _biometricsButton); + controller()->checkHighlightControl( + u"passcode/disable"_q, + _disableButton); } rpl::producer<> LocalPasscodeManage::sectionShowBack() { diff --git a/Telegram/SourceFiles/settings/settings_main.cpp b/Telegram/SourceFiles/settings/settings_main.cpp index 1f10f7638c..877f899005 100644 --- a/Telegram/SourceFiles/settings/settings_main.cpp +++ b/Telegram/SourceFiles/settings/settings_main.cpp @@ -83,7 +83,6 @@ public: private: void setupChildGeometry(); void initViewers(); - void refreshStatusText(); void refreshNameGeometry(int newWidth); void refreshPhoneGeometry(int newWidth); void refreshUsernameGeometry(int newWidth); @@ -676,8 +675,7 @@ void SetupInterfaceScale( Main::Main( QWidget *parent, not_null controller) -: Section(parent) { - setController(controller); +: Section(parent, controller) { setupContent(); } diff --git a/Telegram/SourceFiles/settings/settings_notifications.cpp b/Telegram/SourceFiles/settings/settings_notifications.cpp index eb816ef4af..c688403790 100644 --- a/Telegram/SourceFiles/settings/settings_notifications.cpp +++ b/Telegram/SourceFiles/settings/settings_notifications.cpp @@ -796,8 +796,7 @@ NotifyViewCheckboxes SetupNotifyViewOptions( Notifications::Notifications( QWidget *parent, not_null controller) -: Section(parent) { - setController(controller); +: Section(parent, controller) { setupContent(); } diff --git a/Telegram/SourceFiles/settings/settings_notifications_type.cpp b/Telegram/SourceFiles/settings/settings_notifications_type.cpp index a11b980c55..a144fd03b4 100644 --- a/Telegram/SourceFiles/settings/settings_notifications_type.cpp +++ b/Telegram/SourceFiles/settings/settings_notifications_type.cpp @@ -634,8 +634,7 @@ NotificationsType::NotificationsType( QWidget *parent, not_null controller, Notify type) -: AbstractSection(parent) -, _controller(controller) +: AbstractSection(parent, controller) , _type(type) { setupContent(controller); } @@ -650,10 +649,18 @@ rpl::producer NotificationsType::title() { } void NotificationsType::showFinished() { - _controller->checkHighlightControl(u"notifications/type/show"_q, _showToggle); - _controller->checkHighlightControl(u"notifications/type/sound"_q, _soundToggle); - _controller->checkHighlightControl(u"notifications/type/add-exception"_q, _addException); - _controller->checkHighlightControl(u"notifications/type/delete-exceptions"_q, _deleteExceptions); + controller()->checkHighlightControl( + u"notifications/type/show"_q, + _showToggle); + controller()->checkHighlightControl( + u"notifications/type/sound"_q, + _soundToggle); + controller()->checkHighlightControl( + u"notifications/type/add-exception"_q, + _addException); + controller()->checkHighlightControl( + u"notifications/type/delete-exceptions"_q, + _deleteExceptions); } Type NotificationsType::Id(Notify type) { diff --git a/Telegram/SourceFiles/settings/settings_notifications_type.h b/Telegram/SourceFiles/settings/settings_notifications_type.h index c1fc4fc16c..3e815108a9 100644 --- a/Telegram/SourceFiles/settings/settings_notifications_type.h +++ b/Telegram/SourceFiles/settings/settings_notifications_type.h @@ -32,7 +32,6 @@ public: private: void setupContent(not_null controller); - const not_null _controller; const Data::DefaultNotify _type; QPointer _showToggle; diff --git a/Telegram/SourceFiles/settings/settings_passkeys.cpp b/Telegram/SourceFiles/settings/settings_passkeys.cpp index 6d526d9a53..c62796b81a 100644 --- a/Telegram/SourceFiles/settings/settings_passkeys.cpp +++ b/Telegram/SourceFiles/settings/settings_passkeys.cpp @@ -63,9 +63,8 @@ public: private: void showFinished() override; - void setupContent(not_null controller); + void setupContent(); - const not_null _controller; QPointer _addButton; Ui::RoundRect _bottomSkipRounding; @@ -236,16 +235,15 @@ void PasskeysNoneBox( Passkeys::Passkeys( QWidget *parent, not_null controller) -: Section(parent) -, _controller(controller) +: Section(parent, controller) , _bottomSkipRounding(st::boxRadius, st::boxDividerBg) { - setupContent(controller); + setupContent(); } void Passkeys::showFinished() { _showFinished.fire({}); if (_addButton) { - _controller->checkHighlightControl( + controller()->checkHighlightControl( u"passkeys/create"_q, _addButton, { .rippleShape = true }); @@ -256,10 +254,9 @@ rpl::producer Passkeys::title() { return tr::lng_settings_passkeys_title(); } -void Passkeys::setupContent( - not_null controller) { +void Passkeys::setupContent() { const auto content = Ui::CreateChild(this); - const auto session = &controller->session(); + const auto session = &controller()->session(); CloudPassword::SetupHeader( content, @@ -291,7 +288,7 @@ void Passkeys::setupContent( menu, st::popupMenuWithIcons); const auto handler = [=, id = passkey.id] { - controller->show(Ui::MakeConfirmBox({ + controller()->show(Ui::MakeConfirmBox({ .text = rpl::combine( tr::lng_settings_passkeys_delete_sure_about(), tr::lng_settings_passkeys_delete_sure_about2() @@ -408,7 +405,7 @@ void Passkeys::setupContent( { &st::settingsIconPasskeys }))); _addButton = buttonWrap->entity(); _addButton->setClickedCallback([=] { - controller->show(Box(PasskeysNoneBox, session)); + controller()->show(Box(PasskeysNoneBox, session)); }); buttonWrap->toggleOn(session->passkeys().requestList( ) | rpl::map([=] { return session->passkeys().canRegister(); })); @@ -433,7 +430,7 @@ void Passkeys::setupContent( tr::rich )); label->setClickHandlerFilter([=](const auto &...) { - controller->show(Box(PasskeysNoneBox, session)); + controller()->show(Box(PasskeysNoneBox, session)); return false; }); Ui::ResizeFitChild(this, content); diff --git a/Telegram/SourceFiles/settings/settings_premium.cpp b/Telegram/SourceFiles/settings/settings_premium.cpp index 91104ddaf8..76629fc607 100644 --- a/Telegram/SourceFiles/settings/settings_premium.cpp +++ b/Telegram/SourceFiles/settings/settings_premium.cpp @@ -989,7 +989,6 @@ private: void setupSwipeBack(); void setupSubscriptionOptions(not_null container); - const not_null _controller; const QString _ref; QPointer _subscribe; @@ -1010,13 +1009,12 @@ private: Premium::Premium( QWidget *parent, not_null controller) -: Section(parent) -, _controller(controller) +: Section(parent, controller) , _ref(ResolveRef(controller->premiumRef())) , _radioGroup(std::make_shared()) { setupContent(); setupSwipeBack(); - _controller->session().api().premium().reload(); + controller->session().api().premium().reload(); } rpl::producer Premium::title() { @@ -1058,7 +1056,7 @@ void Premium::setupSubscriptionOptions( Ui::AddSkip(content, st::settingsPremiumOptionsPadding.top()); - const auto apiPremium = &_controller->session().api().premium(); + const auto apiPremium = &controller()->session().api().premium(); Ui::Premium::AddGiftOptions( content, _radioGroup, @@ -1080,7 +1078,7 @@ void Premium::setupSubscriptionOptions( return; } auto toggleOn = rpl::combine( - Data::AmPremiumValue(&_controller->session()), + Data::AmPremiumValue(&controller()->session()), apiPremium->statusTextValue( ) | rpl::map([=] { return apiPremium->subscriptionOptions().size() < 2; @@ -1143,9 +1141,9 @@ void Premium::setupContent() { _setPaused(true); const auto hidden = crl::guard(this, [=] { _setPaused(false); }); - ShowPremiumPreviewToBuy(_controller, section, hidden); + ShowPremiumPreviewToBuy(controller(), section, hidden); }; - AddSummaryPremium(content, _controller, _ref, std::move(buttonCallback)); + AddSummaryPremium(content, controller(), _ref, std::move(buttonCallback)); #if 0 Ui::AddSkip(content); Ui::AddDivider(content); @@ -1174,16 +1172,16 @@ void Premium::setupContent() { base::weak_qptr Premium::createPinnedToTop( not_null parent) { - auto title = _controller->session().premium() + auto title = controller()->session().premium() ? tr::lng_premium_summary_title() : rpl::conditional( - Data::AmPremiumValue(&_controller->session()), + Data::AmPremiumValue(&controller()->session()), tr::lng_premium_summary_title_subscribed(), tr::lng_premium_summary_title()); auto about = [&]() -> rpl::producer { const auto gift = Ref::Gift::Parse(_ref); if (gift) { - auto &data = _controller->session().data(); + auto &data = controller()->session().data(); if (const auto peer = data.peer(gift.peerId)) { const auto months = gift.days / 30; return (gift.me @@ -1201,8 +1199,8 @@ base::weak_qptr Premium::createPinnedToTop( } } return rpl::conditional( - Data::AmPremiumValue(&_controller->session()), - _controller->session().api().premium().statusTextValue(), + Data::AmPremiumValue(&controller()->session()), + controller()->session().api().premium().statusTextValue(), tr::lng_premium_summary_top_about(tr::rich)); }(); @@ -1213,7 +1211,7 @@ base::weak_qptr Premium::createPinnedToTop( auto peerWithPremium = [&]() -> PeerData* { if (isEmojiStatus) { - auto &data = _controller->session().data(); + auto &data = controller()->session().data(); if (const auto peer = data.peer(emojiStatusData.peerId)) { return peer; } @@ -1222,7 +1220,7 @@ base::weak_qptr Premium::createPinnedToTop( }(); auto premiumGift = [&]() -> DocumentData* { if (isPremiumGift) { - auto &data = _controller->session().data(); + auto &data = controller()->session().data(); return data.document(premiumGiftData.documentId); } return nullptr; @@ -1232,13 +1230,13 @@ base::weak_qptr Premium::createPinnedToTop( if (peerWithPremium) { return Ui::CreateChild( parent.get(), - _controller, + controller(), peerWithPremium, _showFinished.events()); } else if (premiumGift) { return Ui::CreateChild( parent.get(), - _controller, + controller(), TopBarWithStickerArgs{ .stickerValue = rpl::single(premiumGift), .nameValue = tr::lng_gift_premium_title(), @@ -1250,7 +1248,7 @@ base::weak_qptr Premium::createPinnedToTop( }, _showFinished.events()); } - const auto weak = base::make_weak(_controller); + const auto weak = base::make_weak(controller()); const auto clickContextOther = [=] { return QVariant::fromValue(ClickHandlerContext{ .sessionWindow = weak, @@ -1335,8 +1333,8 @@ base::weak_qptr Premium::createPinnedToTop( ? st::infoTopBarClose : st::settingsPremiumTopBarClose); _close->addClickHandler([=] { - _controller->parentController()->hideLayer(); - _controller->parentController()->hideSpecialLayer(); + controller()->parentController()->hideLayer(); + controller()->parentController()->hideSpecialLayer(); }); content->widthValue( ) | rpl::on_next([=] { @@ -1361,7 +1359,7 @@ base::weak_qptr Premium::createPinnedToBottom( } const auto emojiStatusData = Ref::EmojiStatus::Parse(_ref); - const auto session = &_controller->session(); + const auto session = &controller()->session(); auto buttonText = [&]() -> std::optional> { if (emojiStatusData) { @@ -1381,7 +1379,7 @@ base::weak_qptr Premium::createPinnedToBottom( }(); _subscribe = CreateSubscribeButton({ - _controller, + controller(), content, [ref = _ref] { return ref; }, std::move(buttonText), @@ -1401,15 +1399,15 @@ base::weak_qptr Premium::createPinnedToBottom( // we should replace the ref explicitly. _subscribe->setClickedCallback([=] { const auto ref = _ref; - const auto controller = _controller; - ShowPremium(controller, QString()); - controller->setPremiumRef(ref); + const auto window = controller(); + ShowPremium(window, QString()); + window->setPremiumRef(ref); }); } else { #endif { const auto callback = [=](int value) { - auto &api = _controller->session().api(); + auto &api = controller()->session().api(); const auto options = api.premium().subscriptionOptions(); if (options.empty()) { return; diff --git a/Telegram/SourceFiles/settings/settings_privacy_security.cpp b/Telegram/SourceFiles/settings/settings_privacy_security.cpp index 4cfc0f3eca..d2de3de311 100644 --- a/Telegram/SourceFiles/settings/settings_privacy_security.cpp +++ b/Telegram/SourceFiles/settings/settings_privacy_security.cpp @@ -759,10 +759,7 @@ void SetupBotsAndWebsites( }); if (highlights) { - highlights->push_back({ - u"privacy/bots_payment"_q, - Builder::HighlightEntry{ button }, - }); + highlights->push_back({ u"privacy/bots_payment"_q, { button } }); } Ui::AddSkip(container); @@ -999,10 +996,7 @@ void SetupSensitiveContent( }, container->lifetime()); if (highlights) { - highlights->push_back({ - u"chat/show-18-content"_q, - Builder::HighlightEntry{ button }, - }); + highlights->push_back({ u"chat/show-18-content"_q, { button } }); } Ui::AddSkip(inner); @@ -1160,10 +1154,7 @@ void SetupArchiveAndMute( }, container->lifetime()); if (highlights) { - highlights->push_back({ - u"privacy/archive_and_mute"_q, - Builder::HighlightEntry{ button }, - }); + highlights->push_back({ u"privacy/archive_and_mute"_q, { button } }); } Ui::AddSkip(inner); @@ -1185,9 +1176,8 @@ void SetupArchiveAndMute( PrivacySecurity::PrivacySecurity( QWidget *parent, not_null controller) -: Section(parent) { - setupContent(controller); - +: Section(parent, controller) { + setupContent(); [[maybe_unused]] auto preload = base::SystemUnlockStatus(); } @@ -1195,11 +1185,9 @@ rpl::producer PrivacySecurity::title() { return tr::lng_settings_section_privacy(); } -void PrivacySecurity::setupContent( - not_null controller) { +void PrivacySecurity::setupContent() { const auto content = Ui::CreateChild(this); - setController(controller); build(content, Builder::PrivacySecuritySection); Ui::ResizeFitChild(this, content); diff --git a/Telegram/SourceFiles/settings/settings_privacy_security.h b/Telegram/SourceFiles/settings/settings_privacy_security.h index 0a0c4a4f23..c0696354dc 100644 --- a/Telegram/SourceFiles/settings/settings_privacy_security.h +++ b/Telegram/SourceFiles/settings/settings_privacy_security.h @@ -94,7 +94,7 @@ public: [[nodiscard]] rpl::producer title() override; private: - void setupContent(not_null controller); + void setupContent(); }; diff --git a/Telegram/SourceFiles/settings/settings_shortcuts.cpp b/Telegram/SourceFiles/settings/settings_shortcuts.cpp index 6a38f972e8..8da5a65f1f 100644 --- a/Telegram/SourceFiles/settings/settings_shortcuts.cpp +++ b/Telegram/SourceFiles/settings/settings_shortcuts.cpp @@ -483,8 +483,8 @@ struct Labeled { Shortcuts::Shortcuts( QWidget *parent, not_null controller) -: Section(parent) { - setupContent(controller); +: Section(parent, controller) { + setupContent(); } Shortcuts::~Shortcuts() { @@ -497,11 +497,10 @@ rpl::producer Shortcuts::title() { return tr::lng_settings_shortcuts(); } -void Shortcuts::setupContent( - not_null controller) { +void Shortcuts::setupContent() { const auto content = Ui::CreateChild(this); - _save = SetupShortcutsContent(controller, content); + _save = SetupShortcutsContent(controller(), content); Ui::ResizeFitChild(this, content); } diff --git a/Telegram/SourceFiles/settings/settings_shortcuts.h b/Telegram/SourceFiles/settings/settings_shortcuts.h index c59d0fdd84..d23e8bb5bd 100644 --- a/Telegram/SourceFiles/settings/settings_shortcuts.h +++ b/Telegram/SourceFiles/settings/settings_shortcuts.h @@ -21,7 +21,7 @@ public: [[nodiscard]] rpl::producer title() override; private: - void setupContent(not_null controller); + void setupContent(); Fn _save; diff --git a/Telegram/SourceFiles/settings/settings_websites.cpp b/Telegram/SourceFiles/settings/settings_websites.cpp index 0dfdd0321c..6ec93eab26 100644 --- a/Telegram/SourceFiles/settings/settings_websites.cpp +++ b/Telegram/SourceFiles/settings/settings_websites.cpp @@ -743,9 +743,8 @@ namespace Settings { Websites::Websites( QWidget *parent, not_null controller) -: Section(parent) -, _controller(controller) { - setupContent(controller); +: Section(parent, controller) { + setupContent(); } rpl::producer Websites::title() { @@ -753,16 +752,16 @@ rpl::producer Websites::title() { } void Websites::showFinished() { - _controller->checkHighlightControl( + controller()->checkHighlightControl( u"websites/disconnect-all"_q, _terminateAll.data()); } -void Websites::setupContent(not_null controller) { +void Websites::setupContent() { const auto container = Ui::CreateChild(this); Ui::AddSkip(container); const auto content = container->add( - object_ptr(container, controller)); + object_ptr(container, controller())); content->setupContent(); _terminateAll = content->terminateAllButton(); diff --git a/Telegram/SourceFiles/settings/settings_websites.h b/Telegram/SourceFiles/settings/settings_websites.h index 9a309daf47..cb21ae6631 100644 --- a/Telegram/SourceFiles/settings/settings_websites.h +++ b/Telegram/SourceFiles/settings/settings_websites.h @@ -25,9 +25,8 @@ public: void showFinished() override; private: - void setupContent(not_null controller); + void setupContent(); - const not_null _controller; QPointer _terminateAll; }; diff --git a/Telegram/SourceFiles/window/window_session_controller.cpp b/Telegram/SourceFiles/window/window_session_controller.cpp index f210de4663..310e35743d 100644 --- a/Telegram/SourceFiles/window/window_session_controller.cpp +++ b/Telegram/SourceFiles/window/window_session_controller.cpp @@ -7,6 +7,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #include "window/window_session_controller.h" +#include "apiwrap.h" +#include "api/api_cloud_password.h" #include "api/api_text_entities.h" #include "boxes/peers/add_bot_to_chat_box.h" #include "boxes/peers/edit_peer_info_box.h" @@ -105,6 +107,9 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "window/themes/window_theme.h" #include "window/window_peer_menu.h" #include "window/window_session_controller_link_info.h" +#include "settings/cloud_password/settings_cloud_password_input.h" +#include "settings/cloud_password/settings_cloud_password_start.h" +#include "settings/cloud_password/settings_cloud_password_email_confirm.h" #include "settings/settings_main.h" #include "settings/settings_premium.h" #include "settings/settings_privacy_security.h" @@ -3680,6 +3685,40 @@ void SessionController::showStarGiftAuction(uint64 giftId) { [=] { _starGiftAuctionLifetime.destroy(); }); } +void SessionController::showCloudPassword(const QString &highlight) { + if (!highlight.isEmpty()) { + setHighlightControlId(highlight); + } + session().api().cloudPassword().reload(); + + enum class PasswordState { + Loading, + On, + Off, + Unconfirmed, + }; + _showCloudPasswordLifetime = rpl::single( + PasswordState::Loading + ) | rpl::then(session().api().cloudPassword().state( + ) | rpl::map([](const Core::CloudPasswordState &state) { + return (!state.unconfirmedPattern.isEmpty()) + ? PasswordState::Unconfirmed + : state.hasPassword + ? PasswordState::On + : PasswordState::Off; + })) | rpl::distinct_until_changed() | rpl::filter( + rpl::mappers::_1 != PasswordState::Loading + ) | rpl::take(1) | rpl::on_next([=](PasswordState state) { + if (state == PasswordState::On) { + showSettings(Settings::CloudPasswordInputId()); + } else if (state == PasswordState::Off) { + showSettings(Settings::CloudPasswordStartId()); + } else if (state == PasswordState::Unconfirmed) { + showSettings(Settings::CloudPasswordEmailConfirmId()); + } + }); +} + void SessionController::setHighlightControlId(const QString &id) { _window->setHighlightControlId(id); } diff --git a/Telegram/SourceFiles/window/window_session_controller.h b/Telegram/SourceFiles/window/window_session_controller.h index 3853d1ebdc..1e6376da2a 100644 --- a/Telegram/SourceFiles/window/window_session_controller.h +++ b/Telegram/SourceFiles/window/window_session_controller.h @@ -704,6 +704,8 @@ public: void showStarGiftAuction(const QString &slug); void showStarGiftAuction(uint64 giftId); + void showCloudPassword(const QString &highlightId = QString()); + void setHighlightControlId(const QString &id); [[nodiscard]] QString highlightControlId() const; [[nodiscard]] bool takeHighlightControlId(const QString &id); @@ -833,6 +835,7 @@ private: rpl::lifetime _savedSubsectionTabsLifetime; rpl::lifetime _starGiftAuctionLifetime; + rpl::lifetime _showCloudPasswordLifetime; rpl::lifetime _lifetime;