diff --git a/Telegram/SourceFiles/info/info_content_widget.cpp b/Telegram/SourceFiles/info/info_content_widget.cpp index 444b50358..764efc200 100644 --- a/Telegram/SourceFiles/info/info_content_widget.cpp +++ b/Telegram/SourceFiles/info/info_content_widget.cpp @@ -289,6 +289,18 @@ void ContentWidget::fillTopBarMenu(const Ui::Menu::MenuCallback &addAction) { addAction); } +void ContentWidget::checkBeforeCloseByEscape(Fn close) { + if (_searchField) { + if (!_searchField->empty()) { + _searchField->setText({}); + } else { + close(); + } + } else { + close(); + } +} + rpl::producer ContentWidget::selectedListValue() const { return rpl::single(SelectedItems(Storage::SharedMediaType::Photo)); } diff --git a/Telegram/SourceFiles/info/info_content_widget.h b/Telegram/SourceFiles/info/info_content_widget.h index 57c95b09f..6cd6d45e9 100644 --- a/Telegram/SourceFiles/info/info_content_widget.h +++ b/Telegram/SourceFiles/info/info_content_widget.h @@ -115,6 +115,7 @@ public: virtual void checkBeforeClose(Fn close) { close(); } + virtual void checkBeforeCloseByEscape(Fn close); [[nodiscard]] virtual rpl::producer title() = 0; [[nodiscard]] virtual rpl::producer subtitle() { return nullptr; diff --git a/Telegram/SourceFiles/info/info_top_bar.cpp b/Telegram/SourceFiles/info/info_top_bar.cpp index c08303b3b..0b4d4b354 100644 --- a/Telegram/SourceFiles/info/info_top_bar.cpp +++ b/Telegram/SourceFiles/info/info_top_bar.cpp @@ -216,6 +216,19 @@ void TopBar::clearSearchField() { _searchView = nullptr; } +void TopBar::checkBeforeCloseByEscape(Fn close) { + if (_searchModeEnabled) { + if (_searchField && !_searchField->empty()) { + _searchField->setText({}); + } else { + _searchModeEnabled = false; + updateControlsVisibility(anim::type::normal); + } + } else { + close(); + } +} + void TopBar::createSearchView( not_null field, rpl::producer &&shown, @@ -269,18 +282,14 @@ void TopBar::createSearchView( return !selectionMode() && searchMode(); }); - auto cancelSearch = [=] { + cancel->addClickHandler([=] { if (!field->getLastText().isEmpty()) { field->setText(QString()); } else { _searchModeEnabled = false; updateControlsVisibility(anim::type::normal); } - }; - - cancel->addClickHandler(cancelSearch); - field->cancelled( - ) | rpl::start_with_next(cancelSearch, field->lifetime()); + }); wrap->widthValue( ) | rpl::start_with_next([=](int newWidth) { diff --git a/Telegram/SourceFiles/info/info_top_bar.h b/Telegram/SourceFiles/info/info_top_bar.h index 2aa1093de..71cbaa1a3 100644 --- a/Telegram/SourceFiles/info/info_top_bar.h +++ b/Telegram/SourceFiles/info/info_top_bar.h @@ -103,6 +103,8 @@ public: void showSearch(); + void checkBeforeCloseByEscape(Fn close); + protected: int resizeGetHeight(int newWidth) override; void paintEvent(QPaintEvent *e) override; diff --git a/Telegram/SourceFiles/info/info_wrap_widget.cpp b/Telegram/SourceFiles/info/info_wrap_widget.cpp index 7713574f2..2c4f06482 100644 --- a/Telegram/SourceFiles/info/info_wrap_widget.cpp +++ b/Telegram/SourceFiles/info/info_wrap_widget.cpp @@ -439,6 +439,20 @@ void WrapWidget::checkBeforeClose(Fn close) { })); } +void WrapWidget::checkBeforeCloseByEscape(Fn close) { + if (_topBar) { + _topBar->checkBeforeCloseByEscape([&] { + _content->checkBeforeCloseByEscape(crl::guard(this, [=] { + WrapWidget::checkBeforeClose(close); + })); + }); + } else { + _content->checkBeforeCloseByEscape(crl::guard(this, [=] { + WrapWidget::checkBeforeClose(close); + })); + } +} + void WrapWidget::addTopBarMenuButton() { Expects(_topBar != nullptr); Expects(_content != nullptr); @@ -895,13 +909,11 @@ void WrapWidget::resizeEvent(QResizeEvent *e) { void WrapWidget::keyPressEvent(QKeyEvent *e) { if (e->key() == Qt::Key_Escape || e->key() == Qt::Key_Back) { - if (hasStackHistory() || wrap() != Wrap::Layer) { - checkBeforeClose([=] { _controller->showBackFromStack(); }); - } else { - checkBeforeClose([=] { + checkBeforeCloseByEscape((hasStackHistory() || wrap() != Wrap::Layer) + ? Fn([=] { _controller->showBackFromStack(); }) + : Fn([=] { _controller->parentController()->hideSpecialLayer(); - }); - } + })); return; } SectionWidget::keyPressEvent(e); diff --git a/Telegram/SourceFiles/info/info_wrap_widget.h b/Telegram/SourceFiles/info/info_wrap_widget.h index 5feb502f7..424fe56e5 100644 --- a/Telegram/SourceFiles/info/info_wrap_widget.h +++ b/Telegram/SourceFiles/info/info_wrap_widget.h @@ -161,6 +161,7 @@ private: void injectActiveProfileMemento( std::shared_ptr memento); void checkBeforeClose(Fn close); + void checkBeforeCloseByEscape(Fn close); void restoreHistoryStack( std::vector> stack); bool hasStackHistory() const { diff --git a/Telegram/SourceFiles/info/settings/info_settings_widget.cpp b/Telegram/SourceFiles/info/settings/info_settings_widget.cpp index bbc0ca717..90b4523a6 100644 --- a/Telegram/SourceFiles/info/settings/info_settings_widget.cpp +++ b/Telegram/SourceFiles/info/settings/info_settings_widget.cpp @@ -240,6 +240,12 @@ void Widget::checkBeforeClose(Fn close) { _inner->checkBeforeClose(std::move(close)); } +void Widget::checkBeforeCloseByEscape(Fn close) { + ContentWidget::checkBeforeCloseByEscape([&] { + _inner->checkBeforeClose(std::move(close)); + }); +} + rpl::producer Widget::title() { return _inner->title(); } diff --git a/Telegram/SourceFiles/info/settings/info_settings_widget.h b/Telegram/SourceFiles/info/settings/info_settings_widget.h index 23b4e7c93..e1aef6b78 100644 --- a/Telegram/SourceFiles/info/settings/info_settings_widget.h +++ b/Telegram/SourceFiles/info/settings/info_settings_widget.h @@ -78,6 +78,7 @@ public: bool closeByOutsideClick() const override; void checkBeforeClose(Fn close) override; + void checkBeforeCloseByEscape(Fn close) override; rpl::producer title() override; void enableBackButton() override; diff --git a/Telegram/SourceFiles/ui/search_field_controller.cpp b/Telegram/SourceFiles/ui/search_field_controller.cpp index a26c59bbe..9c94190c0 100644 --- a/Telegram/SourceFiles/ui/search_field_controller.cpp +++ b/Telegram/SourceFiles/ui/search_field_controller.cpp @@ -30,10 +30,6 @@ auto SearchFieldController::createRowView( auto field = createField(wrap, st.field).release(); field->show(); - field->cancelled( - ) | rpl::start_with_next([=] { - field->setText(QString()); - }, field->lifetime()); auto cancel = CreateChild( wrap,