From f009fa9e47b3d33c23357d3e4ab90ea0210f2d1b Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Thu, 30 Oct 2025 17:40:45 +0300 Subject: [PATCH] Fixed callback of back button in profile top bar. --- .../info/profile/info_profile_inner_widget.cpp | 6 ++++++ .../info/profile/info_profile_inner_widget.h | 3 +++ .../SourceFiles/info/profile/info_profile_top_bar.cpp | 10 +++++++--- .../SourceFiles/info/profile/info_profile_top_bar.h | 4 ++++ .../SourceFiles/info/profile/info_profile_widget.cpp | 4 ++++ .../info/stories/info_stories_inner_widget.cpp | 6 ++++++ .../info/stories/info_stories_inner_widget.h | 3 +++ .../SourceFiles/info/stories/info_stories_widget.cpp | 4 ++++ 8 files changed, 37 insertions(+), 3 deletions(-) diff --git a/Telegram/SourceFiles/info/profile/info_profile_inner_widget.cpp b/Telegram/SourceFiles/info/profile/info_profile_inner_widget.cpp index f8c7fec3b0..19db5ed720 100644 --- a/Telegram/SourceFiles/info/profile/info_profile_inner_widget.cpp +++ b/Telegram/SourceFiles/info/profile/info_profile_inner_widget.cpp @@ -97,6 +97,10 @@ InnerWidget::InnerWidget( }, lifetime()); } +rpl::producer<> InnerWidget::backRequest() const { + return _backClicks.events(); +} + object_ptr InnerWidget::setupContent( not_null parent, Origin origin) { @@ -435,6 +439,8 @@ base::weak_qptr InnerWidget::createPinnedToTop( .backToggles = _backToggles.value(), .showFinished = _showFinished.events(), }); + content->backRequest( + ) | rpl::start_to_stream(_backClicks, content->lifetime()); content->setOnlineCount(_onlineCount.events()); _topBarColor = content->edgeColor(); return base::make_weak(not_null{ content }); diff --git a/Telegram/SourceFiles/info/profile/info_profile_inner_widget.h b/Telegram/SourceFiles/info/profile/info_profile_inner_widget.h index 6620160fe4..789409ebdb 100644 --- a/Telegram/SourceFiles/info/profile/info_profile_inner_widget.h +++ b/Telegram/SourceFiles/info/profile/info_profile_inner_widget.h @@ -46,6 +46,8 @@ public: not_null controller, Origin origin); + [[nodiscard]] rpl::producer<> backRequest() const; + void saveState(not_null memento); void restoreState(not_null memento); @@ -93,6 +95,7 @@ private: rpl::event_stream _desiredHeight; rpl::variable _backToggles; + rpl::event_stream<> _backClicks; rpl::event_stream _onlineCount; rpl::event_stream<> _showFinished; diff --git a/Telegram/SourceFiles/info/profile/info_profile_top_bar.cpp b/Telegram/SourceFiles/info/profile/info_profile_top_bar.cpp index 763367f36d..19373ffa13 100644 --- a/Telegram/SourceFiles/info/profile/info_profile_top_bar.cpp +++ b/Telegram/SourceFiles/info/profile/info_profile_top_bar.cpp @@ -930,6 +930,10 @@ TopBar::~TopBar() { base::take(_badgeOldTooltips); } +rpl::producer<> TopBar::backRequest() const { + return _backClicks.events(); +} + void TopBar::setOnlineCount(rpl::producer &&count) { std::move(count) | rpl::start_with_next([=](int v) { if (_statusLabel) { @@ -1370,9 +1374,9 @@ void TopBar::setupButtons( _back->toggleOn(isLayer || isSide ? rpl::duplicate(backToggles) : rpl::single(wrap == Wrap::Narrow)); - _back->entity()->setClickedCallback([=] { - controller->showBackFromStack(); - }); + _back->entity()->clicks() | rpl::to_empty | rpl::start_to_stream( + _backClicks, + _back->lifetime()); if (!isLayer && !isSide) { _close = nullptr; diff --git a/Telegram/SourceFiles/info/profile/info_profile_top_bar.h b/Telegram/SourceFiles/info/profile/info_profile_top_bar.h index bbdeafb724..8fd2c3539d 100644 --- a/Telegram/SourceFiles/info/profile/info_profile_top_bar.h +++ b/Telegram/SourceFiles/info/profile/info_profile_top_bar.h @@ -110,6 +110,8 @@ public: TopBar(not_null parent, Descriptor descriptor); ~TopBar(); + [[nodiscard]] rpl::producer<> backRequest() const; + void setOnlineCount(rpl::producer &&count); void setRoundEdges(bool value); @@ -250,6 +252,8 @@ private: base::unique_qptr _close; base::unique_qptr> _back; + rpl::event_stream<> _backClicks; + base::unique_qptr _topBarButton; base::unique_qptr _peerMenu; diff --git a/Telegram/SourceFiles/info/profile/info_profile_widget.cpp b/Telegram/SourceFiles/info/profile/info_profile_widget.cpp index e6d4a71e71..5460adec45 100644 --- a/Telegram/SourceFiles/info/profile/info_profile_widget.cpp +++ b/Telegram/SourceFiles/info/profile/info_profile_widget.cpp @@ -115,6 +115,10 @@ Widget::Widget( } }, lifetime()); + _inner->backRequest() | rpl::start_with_next([=] { + checkBeforeClose([=] { controller->showBackFromStack(); }); + }, _inner->lifetime()); + if (_pinnedToTop) { _inner->widthValue( ) | rpl::start_with_next([=](int w) { diff --git a/Telegram/SourceFiles/info/stories/info_stories_inner_widget.cpp b/Telegram/SourceFiles/info/stories/info_stories_inner_widget.cpp index 9dc02fec12..305f12ad3e 100644 --- a/Telegram/SourceFiles/info/stories/info_stories_inner_widget.cpp +++ b/Telegram/SourceFiles/info/stories/info_stories_inner_widget.cpp @@ -263,6 +263,10 @@ void InnerWidget::setupAlbums() { InnerWidget::~InnerWidget() = default; +rpl::producer<> InnerWidget::backRequest() const { + return _backClicks.events(); +} + void InnerWidget::setupTop() { const auto albumId = _albumId.current(); if (_addingToAlbumId) { @@ -504,6 +508,8 @@ base::weak_qptr InnerWidget::createPinnedToTop( .backToggles = _backToggles.value(), .showFinished = _showFinished.events(), }); + content->backRequest( + ) | rpl::start_to_stream(_backClicks, content->lifetime()); _topBarColor = content->edgeColor(); return base::make_weak(not_null{ content }); } diff --git a/Telegram/SourceFiles/info/stories/info_stories_inner_widget.h b/Telegram/SourceFiles/info/stories/info_stories_inner_widget.h index da229c9898..a9e20f53ef 100644 --- a/Telegram/SourceFiles/info/stories/info_stories_inner_widget.h +++ b/Telegram/SourceFiles/info/stories/info_stories_inner_widget.h @@ -57,6 +57,8 @@ public: int addingToAlbumId = 0); ~InnerWidget(); + [[nodiscard]] rpl::producer<> backRequest() const; + bool showInternal(not_null memento); void setIsStackBottom(bool isStackBottom) { _isStackBottom = isStackBottom; @@ -162,6 +164,7 @@ private: rpl::variable _albumEmpty; rpl::variable _backToggles; + rpl::event_stream<> _backClicks; rpl::event_stream<> _showFinished; rpl::variable> _topBarColor; diff --git a/Telegram/SourceFiles/info/stories/info_stories_widget.cpp b/Telegram/SourceFiles/info/stories/info_stories_widget.cpp index 7feb5ec01a..891d28da37 100644 --- a/Telegram/SourceFiles/info/stories/info_stories_widget.cpp +++ b/Telegram/SourceFiles/info/stories/info_stories_widget.cpp @@ -124,6 +124,10 @@ Widget::Widget( ) | rpl::start_with_next([=] { refreshBottom(); }, _inner->lifetime()); + + _inner->backRequest() | rpl::start_with_next([=] { + checkBeforeClose([=] { controller->showBackFromStack(); }); + }, _inner->lifetime()); } void Widget::setInnerFocus() {