diff --git a/Telegram/SourceFiles/api/api_messages_search_merged.cpp b/Telegram/SourceFiles/api/api_messages_search_merged.cpp index 8451232f6..1990cfd21 100644 --- a/Telegram/SourceFiles/api/api_messages_search_merged.cpp +++ b/Telegram/SourceFiles/api/api_messages_search_merged.cpp @@ -74,12 +74,17 @@ const FoundMessages &MessagesSearchMerged::messages() const { return _concatedFound; } +const MessagesSearch::Request &MessagesSearchMerged::request() const { + return _request; +} + void MessagesSearchMerged::clear() { _concatedFound = {}; _migratedFirstFound = {}; } void MessagesSearchMerged::search(const Request &search) { + _request = search; if (_migratedSearch) { _waitingForTotal = true; _migratedSearch->searchMessages(search); diff --git a/Telegram/SourceFiles/api/api_messages_search_merged.h b/Telegram/SourceFiles/api/api_messages_search_merged.h index d4c6fbc1c..1e7c0493b 100644 --- a/Telegram/SourceFiles/api/api_messages_search_merged.h +++ b/Telegram/SourceFiles/api/api_messages_search_merged.h @@ -31,6 +31,7 @@ public: void searchMore(); [[nodiscard]] const FoundMessages &messages() const; + [[nodiscard]] const Request &request() const; [[nodiscard]] rpl::producer<> newFounds() const; [[nodiscard]] rpl::producer<> nextFounds() const; @@ -39,6 +40,7 @@ private: void addFound(const FoundMessages &data); MessagesSearch _apiSearch; + Request _request; std::optional _migratedSearch; FoundMessages _migratedFirstFound; diff --git a/Telegram/SourceFiles/history/history_widget.cpp b/Telegram/SourceFiles/history/history_widget.cpp index 0c4f1fda0..e1c35aab4 100644 --- a/Telegram/SourceFiles/history/history_widget.cpp +++ b/Telegram/SourceFiles/history/history_widget.cpp @@ -5199,11 +5199,17 @@ void HistoryWidget::switchToSearch(QString query) { update(); setInnerFocus(); + using Activation = HistoryView::ComposeSearch::Activation; _composeSearch->activations( - ) | rpl::start_with_next([=](not_null item) { + ) | rpl::start_with_next([=](Activation activation) { + const auto item = activation.item; + auto params = ::Window::SectionShow( + ::Window::SectionShow::Way::ClearStack); + params.highlightPart = { activation.query }; + params.highlightPartOffsetHint = kSearchQueryOffsetHint; controller()->showPeerHistory( item->history()->peer->id, - ::Window::SectionShow::Way::ClearStack, + params, item->fullId().msg); }, _composeSearch->lifetime()); diff --git a/Telegram/SourceFiles/history/view/controls/history_view_compose_search.cpp b/Telegram/SourceFiles/history/view/controls/history_view_compose_search.cpp index 19bf4bb95..00066a59f 100644 --- a/Telegram/SourceFiles/history/view/controls/history_view_compose_search.cpp +++ b/Telegram/SourceFiles/history/view/controls/history_view_compose_search.cpp @@ -42,6 +42,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL namespace HistoryView { namespace { +using Activation = ComposeSearch::Activation; using SearchRequest = Api::MessagesSearchMerged::Request; [[nodiscard]] inline bool HasChooseFrom(not_null history) { @@ -840,7 +841,7 @@ public: void setInnerFocus(); void setQuery(const QString &query); - [[nodiscard]] rpl::producer> activations() const; + [[nodiscard]] rpl::producer activations() const; [[nodiscard]] rpl::producer<> destroyRequests() const; [[nodiscard]] rpl::lifetime &lifetime(); @@ -864,7 +865,7 @@ private: rpl::event_stream jumps; } _pendingJump; - rpl::event_stream> _activations; + rpl::event_stream _activations; rpl::event_stream<> _destroyRequests; }; @@ -966,7 +967,7 @@ ComposeSearch::Inner::Inner( const auto item = _history->owner().message(messages[index]); if (item) { const auto weak = Ui::MakeWeak(_topBar.get()); - _activations.fire_copy(item); + _activations.fire_copy({ item, _apiSearch.request().query }); if (weak) { hideList(); } @@ -1063,8 +1064,7 @@ void ComposeSearch::Inner::hideList() { } } -auto ComposeSearch::Inner::activations() const --> rpl::producer> { +rpl::producer ComposeSearch::Inner::activations() const { return _activations.events(); } @@ -1103,7 +1103,7 @@ void ComposeSearch::setQuery(const QString &query) { _inner->setQuery(query); } -rpl::producer> ComposeSearch::activations() const { +rpl::producer ComposeSearch::activations() const { return _inner->activations(); } diff --git a/Telegram/SourceFiles/history/view/controls/history_view_compose_search.h b/Telegram/SourceFiles/history/view/controls/history_view_compose_search.h index 67c995ddd..834f82d68 100644 --- a/Telegram/SourceFiles/history/view/controls/history_view_compose_search.h +++ b/Telegram/SourceFiles/history/view/controls/history_view_compose_search.h @@ -33,7 +33,11 @@ public: void setInnerFocus(); void setQuery(const QString &query); - [[nodiscard]] rpl::producer> activations() const; + struct Activation { + not_null item; + QString query; + }; + [[nodiscard]] rpl::producer activations() const; [[nodiscard]] rpl::producer<> destroyRequests() const; [[nodiscard]] rpl::lifetime &lifetime(); diff --git a/Telegram/SourceFiles/history/view/history_view_sublist_section.cpp b/Telegram/SourceFiles/history/view/history_view_sublist_section.cpp index 61215adcf..283e3747a 100644 --- a/Telegram/SourceFiles/history/view/history_view_sublist_section.cpp +++ b/Telegram/SourceFiles/history/view/history_view_sublist_section.cpp @@ -341,7 +341,7 @@ bool SublistWidget::searchInChatEmbedded( _composeSearch->setInnerFocus(); return true; } - _composeSearch = std::make_unique( + _composeSearch = std::make_unique( this, controller(), _history, @@ -352,10 +352,15 @@ bool SublistWidget::searchInChatEmbedded( setInnerFocus(); _composeSearch->activations( - ) | rpl::start_with_next([=](not_null item) { + ) | rpl::start_with_next([=](ComposeSearch::Activation activation) { + const auto item = activation.item; + auto params = ::Window::SectionShow( + ::Window::SectionShow::Way::ClearStack); + params.highlightPart = { activation.query }; + params.highlightPartOffsetHint = kSearchQueryOffsetHint; controller()->showPeerHistory( item->history()->peer->id, - ::Window::SectionShow::Way::ClearStack, + params, item->fullId().msg); }, _composeSearch->lifetime());