From aa7d8cd39cda466f3ccc382fe90290856a9c246e Mon Sep 17 00:00:00 2001 From: AlexeyZavar Date: Thu, 26 Feb 2026 16:37:26 +0300 Subject: [PATCH] fix: highlight buttons in settings --- .../ayu/ui/settings/ayu_builder.cpp | 9 ++++- .../ayu/ui/settings/settings_ayu.cpp | 38 +++++++++++++++---- .../ayu/ui/settings/settings_ayu_utils.cpp | 35 +++++++++-------- .../ayu/ui/settings/settings_ayu_utils.h | 7 +++- 4 files changed, 64 insertions(+), 25 deletions(-) diff --git a/Telegram/SourceFiles/ayu/ui/settings/ayu_builder.cpp b/Telegram/SourceFiles/ayu/ui/settings/ayu_builder.cpp index 3b76f92278..fd90236667 100644 --- a/Telegram/SourceFiles/ayu/ui/settings/ayu_builder.cpp +++ b/Telegram/SourceFiles/ayu/ui/settings/ayu_builder.cpp @@ -103,11 +103,18 @@ Fn AyuSectionBuilder::addCollapsibleToggle( _builder.add([&](const Builder::BuildContext &ctx) { v::match(ctx, [&](const Builder::WidgetContext &wctx) { - result = AddCollapsibleToggle( + auto toggle = AddCollapsibleToggle( wctx.container, std::move(args.title), std::move(checkboxes), toggledWhenAll); + result = std::move(toggle.refresh); + if (!id.isEmpty() && wctx.highlights && toggle.widget) { + wctx.highlights->push_back({ + id, + { toggle.widget, {} }, + }); + } }, [&](const Builder::SearchContext &sctx) { if (!id.isEmpty()) { sctx.entries->push_back({ diff --git a/Telegram/SourceFiles/ayu/ui/settings/settings_ayu.cpp b/Telegram/SourceFiles/ayu/ui/settings/settings_ayu.cpp index 984c9d9f3b..c68c22222e 100644 --- a/Telegram/SourceFiles/ayu/ui/settings/settings_ayu.cpp +++ b/Telegram/SourceFiles/ayu/ui/settings/settings_ayu.cpp @@ -368,14 +368,26 @@ void BuildGhostEssentials(SectionBuilder &builder) { }, }; - state->refreshCheckboxes = AddCollapsibleToggle( + auto collapsible = AddCollapsibleToggle( container, tr::ayu_GhostModeToggle(), std::move(checkboxes), true); + state->refreshCheckboxes = std::move(collapsible.refresh); + if (wctx.highlights && collapsible.widget) { + wctx.highlights->push_back(std::make_pair( + u"ayu/ghostModeToggle"_q, + HighlightEntry{ collapsible.widget, {} })); + } - AddButtonWithIcon( + const auto markReadButton = AddButtonWithIcon( container, tr::ayu_MarkReadAfterAction(), st::settingsButtonNoIcon - )->toggleOn( + ); + if (wctx.highlights) { + wctx.highlights->push_back(std::make_pair( + u"ayu/markReadAfterAction"_q, + HighlightEntry{ markReadButton.get(), {} })); + } + markReadButton->toggleOn( state->selectedUserId.value() | rpl::map([](uint64 id) { return AyuSettings::ghost(id).markReadAfterActionChanges(); @@ -398,11 +410,17 @@ void BuildGhostEssentials(SectionBuilder &builder) { AddDividerText(container, tr::ayu_MarkReadAfterActionDescription()); AddSkip(container); - AddButtonWithIcon( + const auto scheduleButton = AddButtonWithIcon( container, tr::ayu_UseScheduledMessages(), st::settingsButtonNoIcon - )->toggleOn( + ); + if (wctx.highlights) { + wctx.highlights->push_back(std::make_pair( + u"ayu/useScheduledMessages"_q, + HighlightEntry{ scheduleButton.get(), {} })); + } + scheduleButton->toggleOn( state->selectedUserId.value() | rpl::map([](uint64 id) { return AyuSettings::ghost(id).useScheduledMessagesChanges(); @@ -425,11 +443,17 @@ void BuildGhostEssentials(SectionBuilder &builder) { AddDividerText(container, tr::ayu_UseScheduledMessagesDescription()); AddSkip(container); - AddButtonWithIcon( + const auto silentButton = AddButtonWithIcon( container, tr::ayu_SendWithoutSoundByDefault(), st::settingsButtonNoIcon - )->toggleOn( + ); + if (wctx.highlights) { + wctx.highlights->push_back(std::make_pair( + u"ayu/sendWithoutSound"_q, + HighlightEntry{ silentButton.get(), {} })); + } + silentButton->toggleOn( state->selectedUserId.value() | rpl::map([](uint64 id) { return AyuSettings::ghost(id).sendWithoutSoundChanges(); diff --git a/Telegram/SourceFiles/ayu/ui/settings/settings_ayu_utils.cpp b/Telegram/SourceFiles/ayu/ui/settings/settings_ayu_utils.cpp index 5afb5710e4..260a20bf5e 100644 --- a/Telegram/SourceFiles/ayu/ui/settings/settings_ayu_utils.cpp +++ b/Telegram/SourceFiles/ayu/ui/settings/settings_ayu_utils.cpp @@ -308,7 +308,7 @@ not_null AddInnerToggle(not_null container, return button; } -Fn AddCollapsibleToggle(not_null container, +CollapsibleToggleResult AddCollapsibleToggle(not_null container, rpl::producer title, std::vector checkboxes, bool toggledWhenAll) { @@ -438,7 +438,7 @@ Fn AddCollapsibleToggle(not_null container, const auto raw = wrap.data(); raw->hide(anim::type::instant); - AddInnerToggle( + const auto toggleWidget = AddInnerToggle( container, st::powerSavingButtonNoIcon, innerChecks, @@ -455,22 +455,25 @@ Fn AddCollapsibleToggle(not_null container, }, raw->lifetime()); - return [cState] { - for (auto i = 0u; i < cState->entries.size(); ++i) { - cState->entries[i].checkView->setChecked( - cState->checkboxes[i].getter(), anim::type::normal); - // Refresh lock visuals. - const auto &entry = cState->checkboxes[i]; - if (entry.lockGetter) { - if (entry.lockGetter()) { - auto *effect = new QGraphicsOpacityEffect(cState->entries[i].checkbox); - effect->setOpacity(0.4); - cState->entries[i].checkbox->setGraphicsEffect(effect); - } else { - cState->entries[i].checkbox->setGraphicsEffect(nullptr); + return { + .refresh = [cState] { + for (auto i = 0u; i < cState->entries.size(); ++i) { + cState->entries[i].checkView->setChecked( + cState->checkboxes[i].getter(), anim::type::normal); + // Refresh lock visuals. + const auto &entry = cState->checkboxes[i]; + if (entry.lockGetter) { + if (entry.lockGetter()) { + auto *effect = new QGraphicsOpacityEffect(cState->entries[i].checkbox); + effect->setOpacity(0.4); + cState->entries[i].checkbox->setGraphicsEffect(effect); + } else { + cState->entries[i].checkbox->setGraphicsEffect(nullptr); + } } } - } + }, + .widget = toggleWidget, }; } diff --git a/Telegram/SourceFiles/ayu/ui/settings/settings_ayu_utils.h b/Telegram/SourceFiles/ayu/ui/settings/settings_ayu_utils.h index 319bb6564b..92e04dede2 100644 --- a/Telegram/SourceFiles/ayu/ui/settings/settings_ayu_utils.h +++ b/Telegram/SourceFiles/ayu/ui/settings/settings_ayu_utils.h @@ -41,7 +41,12 @@ not_null AddInnerToggle(not_null container, std::vector> lockChecks = {}, rpl::event_stream<> *lockChanges = nullptr); -Fn AddCollapsibleToggle(not_null container, +struct CollapsibleToggleResult { + Fn refresh; + Ui::RpWidget *widget = nullptr; +}; + +CollapsibleToggleResult AddCollapsibleToggle(not_null container, rpl::producer title, std::vector checkboxes, bool toggledWhenAll);