Always keep SessionController in Settings sections.

This commit is contained in:
John Preston
2026-01-10 11:28:21 +04:00
parent 1e5a93249c
commit fdfe1f1cb5
44 changed files with 372 additions and 423 deletions
@@ -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,
@@ -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<UserData*> user) {
| MessageFlag::FakeHistoryItem
| MessageFlag::Local),
.from = _history->peer->id,
}, PreparedServiceText{ { text }});
}, PreparedServiceText{ { text } });
auto owned = AdminLog::OwnedItem(_delegate, item);
owned->overrideMedia(std::make_unique<HistoryView::MediaGeneric>(
@@ -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);
@@ -29,13 +29,9 @@ public:
BusinessSection(
QWidget *parent,
not_null<Window::SessionController*> controller)
: Section<SectionType>(parent)
, _controller(controller) {
: Section<SectionType>(parent, controller) {
}
[[nodiscard]] not_null<Window::SessionController*> controller() const {
return _controller;
}
[[nodiscard]] rpl::producer<> showFinishes() const {
return _showFinished.events();
}
@@ -45,7 +41,6 @@ private:
_showFinished.fire({});
}
const not_null<Window::SessionController*> _controller;
rpl::event_stream<> _showFinished;
};
@@ -330,7 +330,7 @@ ShortcutMessages::ShortcutMessages(
not_null<Ui::ScrollArea*> scroll,
rpl::producer<Container> containerValue,
BusinessShortcutId shortcutId)
: AbstractSection(parent)
: AbstractSection(parent, controller)
, WindowListDelegate(controller)
, _controller(controller)
, _session(&controller->session())
@@ -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;
@@ -25,16 +25,11 @@ namespace Settings::CloudPassword {
AbstractStep::AbstractStep(
QWidget *parent,
not_null<Window::SessionController*> controller)
: AbstractSection(parent)
, _controller(controller) {
}
not_null<Window::SessionController*> 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::Types> AbstractStep::removeTypes() {
@@ -35,7 +35,6 @@ public:
void setStepDataReference(std::any &data) override;
protected:
[[nodiscard]] not_null<Window::SessionController*> controller() const;
[[nodiscard]] Api::CloudPassword &cloudPassword();
[[nodiscard]] virtual rpl::producer<Types> removeTypes();
@@ -53,8 +52,6 @@ protected:
void setStepData(StepData data);
private:
const not_null<Window::SessionController*> _controller;
Fn<void()> _setInnerFocusCallback;
rpl::event_stream<> _showFinished;
@@ -1145,9 +1145,8 @@ namespace Settings {
Sessions::Sessions(
QWidget *parent,
not_null<Window::SessionController*> controller)
: Section(parent)
, _controller(controller) {
setupContent(controller);
: Section(parent, controller) {
setupContent();
}
rpl::producer<QString> Sessions::title() {
@@ -1155,15 +1154,15 @@ rpl::producer<QString> 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<Window::SessionController*> controller) {
void Sessions::setupContent() {
const auto container = Ui::CreateChild<Ui::VerticalLayout>(this);
AddSkip(container, st::settingsPrivacySkip);
const auto content = container->add(
object_ptr<SessionsContent>(container, controller));
object_ptr<SessionsContent>(container, controller()));
content->setupContent();
_terminateAll = content->terminateAllButton();
@@ -25,9 +25,8 @@ public:
void showFinished() override;
private:
void setupContent(not_null<Window::SessionController*> controller);
void setupContent();
const not_null<Window::SessionController*> _controller;
QPointer<Ui::RpWidget> _terminateAll;
QPointer<Ui::RpWidget> _autoTerminate;
@@ -1034,18 +1034,17 @@ void SetupSystemIntegration(
Advanced::Advanced(
QWidget *parent,
not_null<Window::SessionController*> controller)
: Section(parent) {
setupContent(controller);
: Section(parent, controller) {
setupContent();
}
rpl::producer<QString> Advanced::title() {
return tr::lng_settings_advanced();
}
void Advanced::setupContent(not_null<Window::SessionController*> controller) {
void Advanced::setupContent() {
const auto content = Ui::CreateChild<Ui::VerticalLayout>(this);
setController(controller);
build(content, Builder::AdvancedSection);
Ui::ResizeFitChild(this, content);
@@ -58,7 +58,7 @@ public:
[[nodiscard]] rpl::producer<QString> title() override;
private:
void setupContent(not_null<Window::SessionController*> controller);
void setupContent();
};
@@ -32,8 +32,7 @@ namespace Settings {
Blocked::Blocked(
QWidget *parent,
not_null<Window::SessionController*> controller)
: Section(parent)
, _controller(controller)
: Section(parent, controller)
, _container(Ui::CreateChild<Ui::VerticalLayout>(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<QString> Blocked::title() {
return tr::lng_settings_blocked_users();
}
base::weak_qptr<Ui::RpWidget> Blocked::createPinnedToTop(not_null<QWidget*> parent) {
base::weak_qptr<Ui::RpWidget> Blocked::createPinnedToTop(
not_null<QWidget*> parent) {
const auto content = Ui::CreateChild<Ui::VerticalLayout>(parent.get());
Ui::AddSkip(content);
@@ -84,7 +84,7 @@ base::weak_qptr<Ui::RpWidget> Blocked::createPinnedToTop(not_null<QWidget*> 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<PeerListContentDelegateSimple> delegate;
};
auto controller = std::make_unique<BlockedBoxController>(_controller);
auto controller = std::make_unique<BlockedBoxController>(
this->controller());
controller->setStyleOverrides(&st::settingsBlockedList);
const auto content = listWrap->entity()->add(
object_ptr<PeerListContent>(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
@@ -38,7 +38,6 @@ private:
void visibleTopBottomUpdated(int visibleTop, int visibleBottom) override;
const not_null<Window::SessionController*> _controller;
const not_null<Ui::VerticalLayout*> _container;
base::unique_qptr<Ui::RpWidget> _loading;
@@ -353,8 +353,6 @@ private:
void setupContent();
void setupSwipeBack();
const not_null<Window::SessionController*> _controller;
QPointer<Ui::GradientButton> _subscribe;
base::unique_qptr<Ui::FadeWrap<Ui::IconButton>> _back;
base::unique_qptr<Ui::IconButton> _close;
@@ -376,12 +374,11 @@ private:
Business::Business(
QWidget *parent,
not_null<Window::SessionController*> controller)
: Section(parent)
, _controller(controller)
: Section(parent, controller)
, _radioGroup(std::make_shared<Ui::RadiobuttonGroup>()) {
setupContent();
setupSwipeBack();
_controller->session().api().premium().reload();
controller->session().api().premium().reload();
}
rpl::producer<QString> Business::title() {
@@ -450,7 +447,7 @@ void Business::setupSwipeBack() {
void Business::setupContent() {
const auto content = Ui::CreateChild<Ui::VerticalLayout>(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<Ui::DividerLabel>(
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<Ui::RpWidget> Business::createPinnedToTop(
auto title = tr::lng_business_title();
auto about = [&]() -> rpl::producer<TextWithEntities> {
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<Ui::RpWidget> 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<Ui::RpWidget> 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<Ui::RpWidget> Business::createPinnedToBottom(
not_null<Ui::RpWidget*> parent) {
const auto content = Ui::CreateChild<Ui::RpWidget>(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<Ui::RpWidget> 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;
@@ -61,8 +61,7 @@ using namespace Webrtc;
Calls::Calls(
QWidget *parent,
not_null<Window::SessionController*> 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<Ui::SettingsButton>(
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(),
@@ -62,7 +62,6 @@ private:
rpl::producer<QString> resolvedId,
Fn<void(QString)> set);
const not_null<Window::SessionController*> _controller;
rpl::event_stream<QString> _cameraNameStream;
rpl::variable<bool> _testingMicrophone;
+48 -67
View File
@@ -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<Window::SessionController*> controller)
: Section(parent)
, _controller(controller) {
setupContent(controller);
: Section(parent, controller) {
setupContent();
}
rpl::producer<QString> Chat::title() {
@@ -2171,7 +2153,7 @@ rpl::producer<QString> 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<Window::SessionController*> controller) {
void Chat::setupContent() {
const auto content = Ui::CreateChild<Ui::VerticalLayout>(this);
setController(controller);
build(content, Builder::ChatSection);
Ui::ResizeFitChild(this, content);
@@ -99,9 +99,7 @@ public:
const Ui::Menu::MenuCallback &addAction) override;
private:
void setupContent(not_null<Window::SessionController*> controller);
const not_null<Window::SessionController*> _controller;
void setupContent();
};
@@ -290,6 +290,12 @@ HighlightArgs SubsectionTitleHighlight() {
return { .margin = { -radius, 0, -radius, 0 }, .radius = radius };
}
AbstractSection::AbstractSection(
QWidget *parent,
not_null<Window::SessionController*> controller)
: _controller(controller) {
}
void AbstractSection::build(
not_null<Ui::VerticalLayout*> container,
SectionBuilder builder) {
@@ -98,7 +98,13 @@ using SectionBuilder = void(*)(
class AbstractSection : public Ui::RpWidget {
public:
using RpWidget::RpWidget;
AbstractSection(
QWidget *parent,
not_null<Window::SessionController*> controller);
[[nodiscard]] not_null<Window::SessionController*> controller() const {
return _controller;
}
[[nodiscard]] virtual Type id() const = 0;
[[nodiscard]] virtual rpl::producer<Type> sectionShowOther() {
@@ -170,21 +176,14 @@ public:
}
protected:
void setController(not_null<Window::SessionController*> controller) {
_controller = controller;
}
[[nodiscard]] Window::SessionController *controller() const {
return _controller;
}
void build(
not_null<Ui::VerticalLayout*> container,
SectionBuilder builder);
private:
const not_null<Window::SessionController*> _controller;
rpl::event_stream<Type> _showOtherRequests;
rpl::event_stream<> _showFinished;
Window::SessionController *_controller = nullptr;
};
@@ -98,7 +98,6 @@ private:
void setupSwipeBack();
void setupHistory(not_null<Ui::VerticalLayout*> container);
void setupSubscriptions(not_null<Ui::VerticalLayout*> container);
const not_null<Window::SessionController*> _controller;
const CreditsType _creditsType;
QWidget *_parent = nullptr;
@@ -126,8 +125,7 @@ Credits::Credits(
QWidget *parent,
not_null<Window::SessionController*> 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<Ui::VerticalLayout*> container) {
container,
object_ptr<Ui::VerticalLayout>(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<Ui::VerticalLayout*> container) {
inner,
object_ptr<Ui::VerticalLayout>(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<Ui::VerticalLayout*> container) {
container,
object_ptr<Ui::VerticalLayout>(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<Ui::VerticalLayout*> 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<Ui::VerticalLayout*> container) {
true,
true);
Info::Statistics::AddCreditsHistoryList(
controller->uiShow(),
window->uiShow(),
inSlice,
inWrap->entity(),
entryClicked,
@@ -382,7 +380,7 @@ void Credits::setupHistory(not_null<Ui::VerticalLayout*> 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<Ui::VerticalLayout*> container) {
apiIn->request({}, [=](Data::CreditsStatusSlice inSlice) {
apiOut->request({}, [=](Data::CreditsStatusSlice outSlice) {
::Api::PremiumPeerBot(
&_controller->session()
&controller()->session()
) | rpl::on_next([=](not_null<PeerData*> bot) {
fill(bot, fullSlice, inSlice, outSlice);
apiLifetime->destroy();
@@ -420,9 +418,9 @@ void Credits::setupHistory(not_null<Ui::VerticalLayout*> container) {
void Credits::setupSwipeBack() {
using namespace Ui::Controls;
auto swipeBackData = lifetime().make_state<SwipeBackResult>();
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<Ui::SlideWrap<>>(
content,
object_ptr<Ui::FlatLabel>(
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<Ui::SlideWrap<Ui::AbstractButton>>(
@@ -618,11 +616,11 @@ void Credits::setupContent() {
{ &st::menuIconStats })));
_statsButton = static_cast<Button*>(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<Ui::SlideWrap<Ui::VerticalLayout>>(
content,
@@ -794,7 +792,7 @@ base::weak_qptr<Ui::RpWidget> 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<Ui::RpWidget> 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<Ui::RpWidget> 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<Ui::RpWidget> 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 {
@@ -184,19 +184,18 @@ void SetupExperimental(
Experimental::Experimental(
QWidget *parent,
not_null<Window::SessionController*> controller)
: Section(parent) {
setupContent(controller);
: Section(parent, controller) {
setupContent();
}
rpl::producer<QString> Experimental::title() {
return tr::lng_settings_experimental();
}
void Experimental::setupContent(
not_null<Window::SessionController*> controller) {
void Experimental::setupContent() {
const auto content = Ui::CreateChild<Ui::VerticalLayout>(this);
SetupExperimental(&controller->window(), content);
SetupExperimental(&controller()->window(), content);
Ui::ResizeFitChild(this, content);
}
@@ -20,7 +20,7 @@ public:
[[nodiscard]] rpl::producer<QString> title() override;
private:
void setupContent(not_null<Window::SessionController*> controller);
void setupContent();
};
@@ -53,6 +53,7 @@ struct FoldersHighlightTargets {
QPointer<Ui::RpWidget> createButton;
QPointer<Ui::RpWidget> tagsButton;
QPointer<Ui::RpWidget> viewSection;
QPointer<Ui::RpWidget> 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<Window::SessionController*> controller)
: Section(parent)
, _controller(controller) {
setupContent(controller);
: Section(parent, controller) {
setupContent();
}
Folders::~Folders() {
@@ -1045,8 +1050,8 @@ rpl::producer<QString> Folders::title() {
return tr::lng_filters_title();
}
void Folders::setupContent(not_null<Window::SessionController*> controller) {
controller->session().data().chatsFilters().requestSuggested();
void Folders::setupContent() {
controller()->session().data().chatsFilters().requestSuggested();
const auto content = Ui::CreateChild<Ui::VerticalLayout>(this);
const auto tagsButtonEnabled
@@ -1055,17 +1060,22 @@ void Folders::setupContent(not_null<Window::SessionController*> 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<Window::SessionController*> 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
@@ -23,15 +23,15 @@ public:
[[nodiscard]] rpl::producer<QString> title() override;
private:
void setupContent(not_null<Window::SessionController*> controller);
void setupContent();
const not_null<Window::SessionController*> _controller;
Fn<void()> _save;
rpl::event_stream<> _showFinished;
QPointer<Ui::RpWidget> _createButton;
QPointer<Ui::RpWidget> _tagsButton;
QPointer<Ui::RpWidget> _viewSection;
QPointer<Ui::RpWidget> _recommendedTitle;
};
@@ -206,7 +206,6 @@ private:
void request(TimeId ttl) const;
const not_null<Window::SessionController*> _controller;
const std::shared_ptr<Ui::RadiobuttonGroup> _group;
const std::shared_ptr<Main::SessionShow> _show;
@@ -221,8 +220,7 @@ private:
GlobalTTL::GlobalTTL(
QWidget *parent,
not_null<Window::SessionController*> controller)
: Section(parent)
, _controller(controller)
: Section(parent, controller)
, _group(std::make_shared<Ui::RadiobuttonGroup>(0))
, _show(controller->uiShow())
, _buttons(Ui::CreateChild<Ui::VerticalLayout>(this)) {
@@ -234,7 +232,7 @@ rpl::producer<QString> 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<Ui::VerticalLayout>::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<Ui::SettingsButton>(
content,
tr::lng_settings_ttl_after_custom(),
@@ -381,7 +379,8 @@ void GlobalTTL::setupContent() {
tr::marked),
st::boxDividerLabel);
footer->setLink(1, std::make_shared<LambdaClickHandler>([=] {
const auto session = &_controller->session();
const auto window = controller();
const auto session = &window->session();
auto controller = std::make_unique<TTLChatsBoxController>(session);
auto initBox = [=, controller = controller.get()](
not_null<PeerListBox*> box) {
@@ -417,7 +416,7 @@ void GlobalTTL::setupContent() {
}));
box->addButton(tr::lng_cancel(), [=] { box->closeBox(); });
};
_controller->show(
window->show(
Box<PeerListBox>(std::move(controller), std::move(initBox)));
}));
content->add(object_ptr<Ui::DividerLabel>(
@@ -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 });
@@ -1086,9 +1086,8 @@ void AccountsList::rebuild() {
Information::Information(
QWidget *parent,
not_null<Window::SessionController*> controller)
: Section(parent)
, _controller(controller) {
setupContent(controller);
: Section(parent, controller) {
setupContent();
}
rpl::producer<QString> Information::title() {
@@ -1096,33 +1095,32 @@ rpl::producer<QString> 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<Window::SessionController*> controller) {
void Information::setupContent() {
const auto content = Ui::CreateChild<Ui::VerticalLayout>(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;
@@ -32,9 +32,8 @@ public:
void showFinished() override;
private:
void setupContent(not_null<Window::SessionController*> controller);
void setupContent();
const not_null<Window::SessionController*> _controller;
QPointer<Ui::RpWidget> _photo;
QPointer<Ui::RpWidget> _uploadPhoto;
QPointer<Ui::RpWidget> _bio;
@@ -75,9 +75,6 @@ protected:
[[nodiscard]] virtual EnterType enterType() const = 0;
private:
const not_null<Window::SessionController*> _controller;
rpl::event_stream<> _showFinished;
rpl::event_stream<> _setInnerFocus;
rpl::event_stream<Type> _showOther;
@@ -89,8 +86,7 @@ private:
LocalPasscodeEnter::LocalPasscodeEnter(
QWidget *parent,
not_null<Window::SessionController*> controller)
: AbstractSection(parent)
, _controller(controller) {
: AbstractSection(parent, controller) {
}
rpl::producer<QString> 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<Window::SessionController*> _controller;
rpl::variable<bool> _isBottomFillerShown;
rpl::event_stream<> _showFinished;
@@ -422,8 +416,7 @@ private:
LocalPasscodeManage::LocalPasscodeManage(
QWidget *parent,
not_null<Window::SessionController*> 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<AutoLockBox>());
const auto box = controller()->show(Box<AutoLockBox>());
box->boxClosing(
) | rpl::start_to_stream(state->autoLockBoxClosing, box->lifetime());
});
@@ -612,11 +605,11 @@ void LocalPasscodeManage::setupContent() {
base::weak_qptr<Ui::RpWidget> LocalPasscodeManage::createPinnedToBottom(
not_null<Ui::RpWidget*> parent) {
auto callback = [=] {
_controller->show(
controller()->show(
Ui::MakeConfirmBox({
.text = tr::lng_settings_passcode_disable_sure(),
.confirmed = [=](Fn<void()> &&close) {
SetPasscode(_controller, QString());
SetPasscode(controller(), QString());
Core::App().settings().setSystemUnlockEnabled(false);
Core::App().saveSettingsDelayed();
@@ -642,31 +635,16 @@ base::weak_qptr<Ui::RpWidget> 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() {
@@ -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<Window::SessionController*> controller)
: Section(parent) {
setController(controller);
: Section(parent, controller) {
setupContent();
}
@@ -796,8 +796,7 @@ NotifyViewCheckboxes SetupNotifyViewOptions(
Notifications::Notifications(
QWidget *parent,
not_null<Window::SessionController*> controller)
: Section(parent) {
setController(controller);
: Section(parent, controller) {
setupContent();
}
@@ -634,8 +634,7 @@ NotificationsType::NotificationsType(
QWidget *parent,
not_null<Window::SessionController*> controller,
Notify type)
: AbstractSection(parent)
, _controller(controller)
: AbstractSection(parent, controller)
, _type(type) {
setupContent(controller);
}
@@ -650,10 +649,18 @@ rpl::producer<QString> 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) {
@@ -32,7 +32,6 @@ public:
private:
void setupContent(not_null<Window::SessionController*> controller);
const not_null<Window::SessionController*> _controller;
const Data::DefaultNotify _type;
QPointer<Ui::RpWidget> _showToggle;
@@ -63,9 +63,8 @@ public:
private:
void showFinished() override;
void setupContent(not_null<Window::SessionController*> controller);
void setupContent();
const not_null<Window::SessionController*> _controller;
QPointer<Ui::SettingsButton> _addButton;
Ui::RoundRect _bottomSkipRounding;
@@ -236,16 +235,15 @@ void PasskeysNoneBox(
Passkeys::Passkeys(
QWidget *parent,
not_null<Window::SessionController*> 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<QString> Passkeys::title() {
return tr::lng_settings_passkeys_title();
}
void Passkeys::setupContent(
not_null<Window::SessionController*> controller) {
void Passkeys::setupContent() {
const auto content = Ui::CreateChild<Ui::VerticalLayout>(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);
@@ -989,7 +989,6 @@ private:
void setupSwipeBack();
void setupSubscriptionOptions(not_null<Ui::VerticalLayout*> container);
const not_null<Window::SessionController*> _controller;
const QString _ref;
QPointer<Ui::GradientButton> _subscribe;
@@ -1010,13 +1009,12 @@ private:
Premium::Premium(
QWidget *parent,
not_null<Window::SessionController*> controller)
: Section(parent)
, _controller(controller)
: Section(parent, controller)
, _ref(ResolveRef(controller->premiumRef()))
, _radioGroup(std::make_shared<Ui::RadiobuttonGroup>()) {
setupContent();
setupSwipeBack();
_controller->session().api().premium().reload();
controller->session().api().premium().reload();
}
rpl::producer<QString> 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<Ui::RpWidget> Premium::createPinnedToTop(
not_null<QWidget*> 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<TextWithEntities> {
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<Ui::RpWidget> 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<Ui::RpWidget> 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<Ui::RpWidget> 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<Ui::RpWidget> Premium::createPinnedToTop(
if (peerWithPremium) {
return Ui::CreateChild<TopBarWithSticker>(
parent.get(),
_controller,
controller(),
peerWithPremium,
_showFinished.events());
} else if (premiumGift) {
return Ui::CreateChild<TopBarWithSticker>(
parent.get(),
_controller,
controller(),
TopBarWithStickerArgs{
.stickerValue = rpl::single(premiumGift),
.nameValue = tr::lng_gift_premium_title(),
@@ -1250,7 +1248,7 @@ base::weak_qptr<Ui::RpWidget> 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<Ui::RpWidget> 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<Ui::RpWidget> Premium::createPinnedToBottom(
}
const auto emojiStatusData = Ref::EmojiStatus::Parse(_ref);
const auto session = &_controller->session();
const auto session = &controller()->session();
auto buttonText = [&]() -> std::optional<rpl::producer<QString>> {
if (emojiStatusData) {
@@ -1381,7 +1379,7 @@ base::weak_qptr<Ui::RpWidget> Premium::createPinnedToBottom(
}();
_subscribe = CreateSubscribeButton({
_controller,
controller(),
content,
[ref = _ref] { return ref; },
std::move(buttonText),
@@ -1401,15 +1399,15 @@ base::weak_qptr<Ui::RpWidget> 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;
@@ -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<Window::SessionController*> controller)
: Section(parent) {
setupContent(controller);
: Section(parent, controller) {
setupContent();
[[maybe_unused]] auto preload = base::SystemUnlockStatus();
}
@@ -1195,11 +1185,9 @@ rpl::producer<QString> PrivacySecurity::title() {
return tr::lng_settings_section_privacy();
}
void PrivacySecurity::setupContent(
not_null<Window::SessionController*> controller) {
void PrivacySecurity::setupContent() {
const auto content = Ui::CreateChild<Ui::VerticalLayout>(this);
setController(controller);
build(content, Builder::PrivacySecuritySection);
Ui::ResizeFitChild(this, content);
@@ -94,7 +94,7 @@ public:
[[nodiscard]] rpl::producer<QString> title() override;
private:
void setupContent(not_null<Window::SessionController*> controller);
void setupContent();
};
@@ -483,8 +483,8 @@ struct Labeled {
Shortcuts::Shortcuts(
QWidget *parent,
not_null<Window::SessionController*> controller)
: Section(parent) {
setupContent(controller);
: Section(parent, controller) {
setupContent();
}
Shortcuts::~Shortcuts() {
@@ -497,11 +497,10 @@ rpl::producer<QString> Shortcuts::title() {
return tr::lng_settings_shortcuts();
}
void Shortcuts::setupContent(
not_null<Window::SessionController*> controller) {
void Shortcuts::setupContent() {
const auto content = Ui::CreateChild<Ui::VerticalLayout>(this);
_save = SetupShortcutsContent(controller, content);
_save = SetupShortcutsContent(controller(), content);
Ui::ResizeFitChild(this, content);
}
@@ -21,7 +21,7 @@ public:
[[nodiscard]] rpl::producer<QString> title() override;
private:
void setupContent(not_null<Window::SessionController*> controller);
void setupContent();
Fn<void()> _save;
@@ -743,9 +743,8 @@ namespace Settings {
Websites::Websites(
QWidget *parent,
not_null<Window::SessionController*> controller)
: Section(parent)
, _controller(controller) {
setupContent(controller);
: Section(parent, controller) {
setupContent();
}
rpl::producer<QString> Websites::title() {
@@ -753,16 +752,16 @@ rpl::producer<QString> Websites::title() {
}
void Websites::showFinished() {
_controller->checkHighlightControl(
controller()->checkHighlightControl(
u"websites/disconnect-all"_q,
_terminateAll.data());
}
void Websites::setupContent(not_null<Window::SessionController*> controller) {
void Websites::setupContent() {
const auto container = Ui::CreateChild<Ui::VerticalLayout>(this);
Ui::AddSkip(container);
const auto content = container->add(
object_ptr<Content>(container, controller));
object_ptr<Content>(container, controller()));
content->setupContent();
_terminateAll = content->terminateAllButton();
@@ -25,9 +25,8 @@ public:
void showFinished() override;
private:
void setupContent(not_null<Window::SessionController*> controller);
void setupContent();
const not_null<Window::SessionController*> _controller;
QPointer<Ui::RpWidget> _terminateAll;
};
@@ -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);
}
@@ -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;