diff --git a/Telegram/SourceFiles/info/profile/info_profile_inner_widget.cpp b/Telegram/SourceFiles/info/profile/info_profile_inner_widget.cpp index 428af781f9..d5ee875169 100644 --- a/Telegram/SourceFiles/info/profile/info_profile_inner_widget.cpp +++ b/Telegram/SourceFiles/info/profile/info_profile_inner_widget.cpp @@ -536,6 +536,14 @@ void InnerWidget::showFinished() { _showFinished.fire({}); } +void InnerWidget::checkBeforeCloseByEscape(Fn close) { + if (const auto top = _topBar.get()) { + top->checkBeforeCloseByEscape(std::move(close)); + } else { + close(); + } +} + bool InnerWidget::hasFlexibleTopBar() const { return true; } @@ -571,6 +579,7 @@ base::weak_qptr InnerWidget::createPinnedToTop( })); } _topBarColor = content->edgeColor(); + _topBar = content; 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 9476d4fa62..768a496544 100644 --- a/Telegram/SourceFiles/info/profile/info_profile_inner_widget.h +++ b/Telegram/SourceFiles/info/profile/info_profile_inner_widget.h @@ -39,6 +39,7 @@ namespace Profile { class Memento; class Members; class TabsHost; +class TopBar; struct Origin; class InnerWidget final : public Ui::RpWidget { @@ -64,6 +65,7 @@ public: void enableBackButton(); void showFinished(); + void checkBeforeCloseByEscape(Fn close); [[nodiscard]] TabsHost *tabsHost() const { return _tabsHost; @@ -116,6 +118,7 @@ private: rpl::variable> _topBarColor; Members *_members = nullptr; + base::weak_qptr _topBar; Ui::SlideWrap *_sharedMediaWrap = nullptr; TabsHost *_tabsHost = nullptr; rpl::variable _tabsDocked = false; diff --git a/Telegram/SourceFiles/info/profile/info_profile_top_bar.cpp b/Telegram/SourceFiles/info/profile/info_profile_top_bar.cpp index c3708dba70..4173441112 100644 --- a/Telegram/SourceFiles/info/profile/info_profile_top_bar.cpp +++ b/Telegram/SourceFiles/info/profile/info_profile_top_bar.cpp @@ -2339,12 +2339,7 @@ void TopBar::showTabSearch() { cancel->setAccessibleName(tr::lng_sr_cancel_search(tr::now)); cancel->show(); cancel->addClickHandler([=] { - if (_tabSearchField->getLastText().isEmpty()) { - hideTabSearch(); - updateTabSwapVisibility(); - } else { - _tabSearchField->setText(QString()); - } + cancelTabSearch(); }); inner->widthValue( ) | rpl::on_next([=](int newWidth) { @@ -2377,6 +2372,24 @@ void TopBar::hideTabSearch() { _tabSearchBar->toggle(false, anim::type::normal); } +bool TopBar::cancelTabSearch() { + if (!_tabSearchShown) { + return false; + } else if (!_tabSearchField->getLastText().isEmpty()) { + _tabSearchField->setText(QString()); + } else { + hideTabSearch(); + updateTabSwapVisibility(); + } + return true; +} + +void TopBar::checkBeforeCloseByEscape(Fn close) { + if (!cancelTabSearch()) { + close(); + } +} + void TopBar::raiseTabSearchOverlay() { if (!_tabSearchBar || !_tabSearchShown) { return; diff --git a/Telegram/SourceFiles/info/profile/info_profile_top_bar.h b/Telegram/SourceFiles/info/profile/info_profile_top_bar.h index 9c6e516e96..3b4dd562a4 100644 --- a/Telegram/SourceFiles/info/profile/info_profile_top_bar.h +++ b/Telegram/SourceFiles/info/profile/info_profile_top_bar.h @@ -131,6 +131,8 @@ public: rpl::producer available, Fn toggle); + void checkBeforeCloseByEscape(Fn close); + void setRoundEdges(bool value); void setLottieSingleLoop(bool value); void setColorProfileIndex(std::optional index); @@ -219,6 +221,7 @@ private: [[nodiscard]] bool tabSelectionMode() const; void showTabSearch(); void hideTabSearch(); + bool cancelTabSearch(); void raiseTabSearchOverlay(); void updateTabSearchGeometry(); [[nodiscard]] int calculateRightButtonsWidth() const; diff --git a/Telegram/SourceFiles/info/profile/info_profile_widget.cpp b/Telegram/SourceFiles/info/profile/info_profile_widget.cpp index 6f7a339bd3..4d09602152 100644 --- a/Telegram/SourceFiles/info/profile/info_profile_widget.cpp +++ b/Telegram/SourceFiles/info/profile/info_profile_widget.cpp @@ -305,6 +305,12 @@ void Widget::showFinished() { _inner->showFinished(); } +void Widget::checkBeforeCloseByEscape(Fn close) { + _inner->checkBeforeCloseByEscape([=] { + ContentWidget::checkBeforeCloseByEscape(close); + }); +} + rpl::producer Widget::title() { if (const auto topic = controller()->key().topic()) { return topic->peer()->isBot() diff --git a/Telegram/SourceFiles/info/profile/info_profile_widget.h b/Telegram/SourceFiles/info/profile/info_profile_widget.h index e22e8cdb2e..8b4bbf945e 100644 --- a/Telegram/SourceFiles/info/profile/info_profile_widget.h +++ b/Telegram/SourceFiles/info/profile/info_profile_widget.h @@ -90,6 +90,7 @@ public: void setInnerFocus() override; void enableBackButton() override; void showFinished() override; + void checkBeforeCloseByEscape(Fn close) override; rpl::producer title() override; rpl::producer titleStories() override;