From 39e36af3e52877ebf98b59edfa951fd4aac97c35 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Wed, 22 Jul 2026 17:14:57 +0300 Subject: [PATCH] Fixed members grouping toggle display for off-screen members. --- .../info/profile/info_profile_inner_widget.cpp | 1 + .../info/profile/info_profile_members.cpp | 7 +++++++ .../info/profile/info_profile_members.h | 2 ++ .../info/profile/info_profile_top_bar.cpp | 15 +++++++++------ .../info/profile/info_profile_top_bar.h | 2 ++ 5 files changed, 21 insertions(+), 6 deletions(-) diff --git a/Telegram/SourceFiles/info/profile/info_profile_inner_widget.cpp b/Telegram/SourceFiles/info/profile/info_profile_inner_widget.cpp index 8ced9737a7..2820b5b3cc 100644 --- a/Telegram/SourceFiles/info/profile/info_profile_inner_widget.cpp +++ b/Telegram/SourceFiles/info/profile/info_profile_inner_widget.cpp @@ -585,6 +585,7 @@ base::weak_qptr InnerWidget::createPinnedToTop( content->setupStandaloneGroupControl( members->groupByRoleValue(), members->groupByRoleAvailableValue(), + members->rowsVisibleValue(), crl::guard(members, [=](bool grouped) { members->setGroupByRole(grouped); })); diff --git a/Telegram/SourceFiles/info/profile/info_profile_members.cpp b/Telegram/SourceFiles/info/profile/info_profile_members.cpp index 3b18676ec7..7b818e875f 100644 --- a/Telegram/SourceFiles/info/profile/info_profile_members.cpp +++ b/Telegram/SourceFiles/info/profile/info_profile_members.cpp @@ -105,6 +105,10 @@ rpl::producer Members::groupByRoleAvailableValue() const { return _listController->groupByRoleAvailableValue(); } +rpl::producer Members::rowsVisibleValue() const { + return _rowsVisible.value(); +} + std::unique_ptr Members::saveState() { auto result = std::make_unique(); result->list = _listController->saveState(); @@ -445,6 +449,9 @@ void Members::visibleTopBottomUpdated( int visibleTop, int visibleBottom) { setChildVisibleTopBottom(_list, visibleTop, visibleBottom); + const auto top = _list->y(); + _rowsVisible = (visibleBottom > top) + && (visibleTop < top + _list->height()); } void Members::peerListSetTitle(rpl::producer title) { diff --git a/Telegram/SourceFiles/info/profile/info_profile_members.h b/Telegram/SourceFiles/info/profile/info_profile_members.h index 2da1a2aa51..8eeb4d6fae 100644 --- a/Telegram/SourceFiles/info/profile/info_profile_members.h +++ b/Telegram/SourceFiles/info/profile/info_profile_members.h @@ -55,6 +55,7 @@ public: void setGroupByRole(bool grouped); [[nodiscard]] rpl::producer groupByRoleValue() const; [[nodiscard]] rpl::producer groupByRoleAvailableValue() const; + [[nodiscard]] rpl::producer rowsVisibleValue() const; std::unique_ptr saveState(); void restoreState(std::unique_ptr state); @@ -140,6 +141,7 @@ private: //base::Timer _searchTimer; rpl::event_stream _scrollToRequests; + rpl::variable _rowsVisible = false; }; diff --git a/Telegram/SourceFiles/info/profile/info_profile_top_bar.cpp b/Telegram/SourceFiles/info/profile/info_profile_top_bar.cpp index dd552f51e2..52ac0a76ab 100644 --- a/Telegram/SourceFiles/info/profile/info_profile_top_bar.cpp +++ b/Telegram/SourceFiles/info/profile/info_profile_top_bar.cpp @@ -158,7 +158,6 @@ constexpr auto kMinContrast = 5.5; constexpr auto kStoryOutlineFadeEnd = 0.4; constexpr auto kStoryOutlineFadeRange = 1. - kStoryOutlineFadeEnd; constexpr auto kSwapMoveAmplitude = 0.3; -constexpr auto kStandaloneGroupProgress = 0.5; using AnimatedPatternPoint = TopBar::AnimatedPatternPoint; @@ -2086,11 +2085,13 @@ void TopBar::applyTabBindings(TabTopBarBindings &&bindings) { void TopBar::setupStandaloneGroupControl( rpl::producer state, rpl::producer available, + rpl::producer reached, Fn toggle) { _standaloneGroup = true; _tabSetGroup = std::move(toggle); _tabGroupActive = false; _tabGroupAvailable = false; + _standaloneGroupReached = false; std::move( state ) | rpl::on_next([=](bool grouped) { @@ -2104,8 +2105,10 @@ void TopBar::setupStandaloneGroupControl( _tabGroupAvailable = value; updateTabSwapVisibility(); }, lifetime()); - _progress.changes( - ) | rpl::on_next([=] { + std::move( + reached + ) | rpl::on_next([=](bool value) { + _standaloneGroupReached = value; updateTabSwapVisibility(); }, lifetime()); updateTabGroupActive(); @@ -2509,10 +2512,10 @@ void TopBar::updateTabSwapVisibility() { } } if (_tabGroupToggle) { - const auto collapsed = _standaloneGroup - ? (_progress.current() < kStandaloneGroupProgress) + const auto reached = _standaloneGroup + ? _standaloneGroupReached : swap; - const auto shown = collapsed + const auto shown = reached && !_tabSearchShown && (_tabSetGroup != nullptr) && _tabGroupAvailable; diff --git a/Telegram/SourceFiles/info/profile/info_profile_top_bar.h b/Telegram/SourceFiles/info/profile/info_profile_top_bar.h index b62196b868..b433edfc80 100644 --- a/Telegram/SourceFiles/info/profile/info_profile_top_bar.h +++ b/Telegram/SourceFiles/info/profile/info_profile_top_bar.h @@ -129,6 +129,7 @@ public: void setupStandaloneGroupControl( rpl::producer state, rpl::producer available, + rpl::producer reached, Fn toggle); void checkBeforeCloseByEscape(Fn close); @@ -293,6 +294,7 @@ private: bool _tabGroupActive = false; bool _tabGroupAvailable = false; bool _standaloneGroup = false; + bool _standaloneGroupReached = false; object_ptr _status; std::unique_ptr _statusLabel; rpl::variable _statusShift = 0;