From 21def3473a5a47dbdba5e76412395d3fea178555 Mon Sep 17 00:00:00 2001 From: John Preston Date: Tue, 7 Jul 2026 09:32:13 +0400 Subject: [PATCH] Re-run editor search on edits and field focus --- .../SourceFiles/iv/editor/iv_editor_widget.cpp | 1 + Telegram/SourceFiles/iv/iv_search_bar.cpp | 7 +++++++ Telegram/SourceFiles/iv/iv_search_bar.h | 2 ++ .../SourceFiles/iv/iv_search_controller.cpp | 9 +++++++++ Telegram/SourceFiles/iv/iv_search_controller.h | 1 + .../SourceFiles/ui/widgets/multi_select.cpp | 17 +++++++++++++++++ Telegram/SourceFiles/ui/widgets/multi_select.h | 1 + 7 files changed, 38 insertions(+) diff --git a/Telegram/SourceFiles/iv/editor/iv_editor_widget.cpp b/Telegram/SourceFiles/iv/editor/iv_editor_widget.cpp index dde22c0444..16ebf880c5 100644 --- a/Telegram/SourceFiles/iv/editor/iv_editor_widget.cpp +++ b/Telegram/SourceFiles/iv/editor/iv_editor_widget.cpp @@ -2935,6 +2935,7 @@ void Widget::createSearchController() { }, .expandDetails = [](const QString &) { return false; }, .focusContent = [=] { setFocus(); }, + .fieldFocused = [=] { hideInlineFieldAndRefresh(); }, }; _search = std::make_unique( _outer, diff --git a/Telegram/SourceFiles/iv/iv_search_bar.cpp b/Telegram/SourceFiles/iv/iv_search_bar.cpp index 0a76200ba4..4d99452b37 100644 --- a/Telegram/SourceFiles/iv/iv_search_bar.cpp +++ b/Telegram/SourceFiles/iv/iv_search_bar.cpp @@ -91,6 +91,9 @@ void SearchBar::setup(rpl::producer width) { _select->setCancelledCallback([=] { _closeRequests.fire({}); }); + _select->setFocusedChangedCallback([=](bool focused) { + _focusChanges.fire_copy(focused); + }); setResults(0, 0); } @@ -179,6 +182,10 @@ rpl::producer<> SearchBar::closeRequests() const { _close->clicks() | rpl::to_empty); } +rpl::producer SearchBar::focusChanges() const { + return _focusChanges.events(); +} + rpl::producer SearchBar::heightValue() const { return _wrap.heightValue(); } diff --git a/Telegram/SourceFiles/iv/iv_search_bar.h b/Telegram/SourceFiles/iv/iv_search_bar.h index 21f896b0af..b89155c2d1 100644 --- a/Telegram/SourceFiles/iv/iv_search_bar.h +++ b/Telegram/SourceFiles/iv/iv_search_bar.h @@ -37,6 +37,7 @@ public: [[nodiscard]] rpl::producer queryChanges() const; [[nodiscard]] rpl::producer navigateRequests() const; [[nodiscard]] rpl::producer<> closeRequests() const; + [[nodiscard]] rpl::producer focusChanges() const; [[nodiscard]] rpl::producer heightValue() const; [[nodiscard]] rpl::lifetime &lifetime(); @@ -55,6 +56,7 @@ private: rpl::event_stream _queryChanges; rpl::event_stream _navigates; rpl::event_stream<> _closeRequests; + rpl::event_stream _focusChanges; }; diff --git a/Telegram/SourceFiles/iv/iv_search_controller.cpp b/Telegram/SourceFiles/iv/iv_search_controller.cpp index a88151494d..7f13570730 100644 --- a/Telegram/SourceFiles/iv/iv_search_controller.cpp +++ b/Telegram/SourceFiles/iv/iv_search_controller.cpp @@ -41,6 +41,15 @@ SearchController::SearchController( _searchBar->navigateRequests() | rpl::on_next([=](int delta) { stepSearchResult(delta); }, _searchBar->lifetime()); + _searchBar->focusChanges() | rpl::on_next([=](bool focused) { + if (!focused || !_searchBar->shown()) { + return; + } + if (_host.fieldFocused) { + _host.fieldFocused(); + } + refresh(); + }, _searchBar->lifetime()); } SearchController::~SearchController() = default; diff --git a/Telegram/SourceFiles/iv/iv_search_controller.h b/Telegram/SourceFiles/iv/iv_search_controller.h index ef092cd86a..7000b4b897 100644 --- a/Telegram/SourceFiles/iv/iv_search_controller.h +++ b/Telegram/SourceFiles/iv/iv_search_controller.h @@ -37,6 +37,7 @@ struct SearchHost { Fn scrollToSegment; Fn expandDetails; Fn focusContent; + Fn fieldFocused; }; class SearchController final : public base::has_weak_ptr { diff --git a/Telegram/SourceFiles/ui/widgets/multi_select.cpp b/Telegram/SourceFiles/ui/widgets/multi_select.cpp index 33f4b8e382..95f9255b6f 100644 --- a/Telegram/SourceFiles/ui/widgets/multi_select.cpp +++ b/Telegram/SourceFiles/ui/widgets/multi_select.cpp @@ -427,6 +427,7 @@ public: void setQueryChangedCallback(Fn callback); void setSubmittedCallback(Fn callback); void setCancelledCallback(Fn callback); + void setFocusedChangedCallback(Fn callback); void addItemInBunch(std::unique_ptr item); void finishItemsBunch(AddItemWay way); @@ -504,6 +505,7 @@ private: Fn _queryChangedCallback; Fn _submittedCallback; Fn _cancelledCallback; + Fn _focusedChangedCallback; Fn _itemRemovedCallback; Fn _resizedCallback; @@ -582,6 +584,10 @@ void MultiSelect::setCancelledCallback(Fn callback) { _inner->setCancelledCallback(std::move(callback)); } +void MultiSelect::setFocusedChangedCallback(Fn callback) { + _inner->setFocusedChangedCallback(std::move(callback)); +} + void MultiSelect::setResizedCallback(Fn callback) { _resizedCallback = std::move(callback); } @@ -662,6 +668,12 @@ MultiSelect::Inner::Inner( ) | rpl::filter(rpl::mappers::_1) | rpl::on_next([=] { fieldFocused(); }, _field->lifetime()); + _field->focusedChanges( + ) | rpl::on_next([=](bool focused) { + if (_focusedChangedCallback) { + _focusedChangedCallback(focused); + } + }, _field->lifetime()); _field->changes( ) | rpl::on_next([=] { queryChanged(); @@ -730,6 +742,11 @@ void MultiSelect::Inner::setCancelledCallback(Fn callback) { _cancelledCallback = std::move(callback); } +void MultiSelect::Inner::setFocusedChangedCallback( + Fn callback) { + _focusedChangedCallback = std::move(callback); +} + void MultiSelect::Inner::updateFieldGeometry() { auto fieldFinalWidth = _fieldWidth; if (_cancel->toggled()) { diff --git a/Telegram/SourceFiles/ui/widgets/multi_select.h b/Telegram/SourceFiles/ui/widgets/multi_select.h index cf3fbdb9de..cb714eca95 100644 --- a/Telegram/SourceFiles/ui/widgets/multi_select.h +++ b/Telegram/SourceFiles/ui/widgets/multi_select.h @@ -34,6 +34,7 @@ public: void setQueryChangedCallback(Fn callback); void setSubmittedCallback(Fn callback); void setCancelledCallback(Fn callback); + void setFocusedChangedCallback(Fn callback); void setResizedCallback(Fn callback); enum class AddItemWay {