From 3421b656db46f94dec2d1e7105907b1038e0a544 Mon Sep 17 00:00:00 2001 From: John Preston Date: Tue, 30 Jan 2024 13:04:46 +0400 Subject: [PATCH] Fix saved tag click in separate window messages. --- .../dialogs/dialogs_inner_widget.cpp | 8 +- .../dialogs/dialogs_inner_widget.h | 2 +- .../dialogs/dialogs_search_tags.cpp | 2 +- .../SourceFiles/dialogs/dialogs_search_tags.h | 2 +- .../SourceFiles/dialogs/dialogs_widget.cpp | 2 +- .../controls/history_view_compose_search.cpp | 74 ++++++++++++------- Telegram/SourceFiles/mainwidget.cpp | 4 + 7 files changed, 61 insertions(+), 33 deletions(-) diff --git a/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp b/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp index 54a9c84d0..3cb7f0dc8 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp @@ -3000,7 +3000,7 @@ void InnerWidget::searchInChat( reactions->myTagsValue(sublist), tags); - _searchTags->selectedValue( + _searchTags->selectedChanges( ) | rpl::start_with_next([=](std::vector &&list) { _searchTagsSelected = std::move(list); }, _searchTags->lifetime()); @@ -3055,11 +3055,11 @@ void InnerWidget::searchInChat( _searchInChat || !_filter.isEmpty()); } -auto InnerWidget::searchTagsValue() const +auto InnerWidget::searchTagsChanges() const -> rpl::producer> { return _searchTags - ? _searchTags->selectedValue() - : rpl::single(std::vector()); + ? _searchTags->selectedChanges() + : rpl::never>(); } void InnerWidget::refreshSearchInChatLabel() { diff --git a/Telegram/SourceFiles/dialogs/dialogs_inner_widget.h b/Telegram/SourceFiles/dialogs/dialogs_inner_widget.h index 0f12e7211..7699576c8 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_inner_widget.h +++ b/Telegram/SourceFiles/dialogs/dialogs_inner_widget.h @@ -143,7 +143,7 @@ public: Key key, PeerData *from, std::vector tags); - [[nodiscard]] auto searchTagsValue() const + [[nodiscard]] auto searchTagsChanges() const -> rpl::producer>; void applyFilterUpdate(QString newFilter, bool force = false); diff --git a/Telegram/SourceFiles/dialogs/dialogs_search_tags.cpp b/Telegram/SourceFiles/dialogs/dialogs_search_tags.cpp index d6a243e48..ce3bcb927 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_search_tags.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_search_tags.cpp @@ -271,7 +271,7 @@ ClickHandlerPtr SearchTags::lookupHandler(QPoint point) const { return nullptr; } -auto SearchTags::selectedValue() const +auto SearchTags::selectedChanges() const -> rpl::producer> { return _selectedChanges.events() | rpl::map([=] { return collectSelected(); diff --git a/Telegram/SourceFiles/dialogs/dialogs_search_tags.h b/Telegram/SourceFiles/dialogs/dialogs_search_tags.h index d1a63fbf1..489e23cd4 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_search_tags.h +++ b/Telegram/SourceFiles/dialogs/dialogs_search_tags.h @@ -37,7 +37,7 @@ public: [[nodiscard]] rpl::producer<> repaintRequests() const; [[nodiscard]] ClickHandlerPtr lookupHandler(QPoint point) const; - [[nodiscard]] auto selectedValue() const + [[nodiscard]] auto selectedChanges() const -> rpl::producer>; void paint( diff --git a/Telegram/SourceFiles/dialogs/dialogs_widget.cpp b/Telegram/SourceFiles/dialogs/dialogs_widget.cpp index 2a16376cc..77d02b8ed 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_widget.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_widget.cpp @@ -2666,7 +2666,7 @@ bool Widget::setSearchInChat( } _searchTags = std::move(tags); _inner->searchInChat(_searchInChat, _searchFromAuthor, _searchTags); - _searchTagsLifetime = _inner->searchTagsValue( + _searchTagsLifetime = _inner->searchTagsChanges( ) | rpl::start_with_next([=](std::vector &&list) { if (_searchTags != list) { clearSearchCache(); 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 36c22e4d6..930e4c369 100644 --- a/Telegram/SourceFiles/history/view/controls/history_view_compose_search.cpp +++ b/Telegram/SourceFiles/history/view/controls/history_view_compose_search.cpp @@ -287,10 +287,8 @@ protected: private: void clearItems(); - void setupTags( - not_null window, - not_null history, - PeerData *from); + void refreshTags(); + void updateSize(); void requestSearch(bool cache = true); void requestSearchDelayed(); @@ -299,6 +297,8 @@ private: base::unique_qptr _select; std::unique_ptr _searchTags; + const not_null _window; + const not_null _history; rpl::variable _from = nullptr; base::Timer _searchTimer; @@ -325,15 +325,16 @@ TopBar::TopBar( st::searchInChatMultiSelect, tr::lng_dlg_filter(), _searchTagsSelected.empty() ? query : QString())) +, _window(window) +, _history(history) , _searchTimer([=] { requestSearch(); }) { - setupTags(window, history, from); + refreshTags(); - rpl::combine( - parent->geometryValue(), - _searchTags ? _searchTags->heightValue() : rpl::single(0) - ) | rpl::start_with_next([=](const QRect &r, int tagsHeight) { - moveToLeft(0, 0); - resize(r.width(), st::topBarHeight + tagsHeight); + moveToLeft(0, 0); + + parent->geometryValue( + ) | rpl::start_with_next([=] { + updateSize(); }, lifetime()); sizeValue( @@ -387,8 +388,22 @@ void TopBar::setInnerFocus() { _select->setInnerFocus(); } +void TopBar::updateSize() { + const auto height = st::topBarHeight + + (_searchTags ? _searchTags->height() : 0); + resize(parentWidget()->width(), height); +} + void TopBar::setQuery(const QString &query) { - _select->setQuery(query); + if (auto tags = Data::SearchTagsFromQuery(query); !tags.empty()) { + if (_searchTagsSelected != tags) { + _searchTagsSelected = std::move(tags); + refreshTags(); + } + _select->setQuery(QString()); + } else { + _select->setQuery(query); + } } void TopBar::clearItems() { @@ -404,32 +419,41 @@ void TopBar::clearItems() { }); } -void TopBar::setupTags( - not_null window, - not_null history, - PeerData *from) { - if (!_searchTagsSelected.empty()) { - history = history->owner().history(history->session().user()); - } else if (!history->peer->isSelf()) { +void TopBar::refreshTags() { + if (!_history->peer->isSelf()) { _searchTags = nullptr; return; } - const auto reactions = &history->owner().reactions(); + const auto from = _from.current(); + const auto reactions = &_history->owner().reactions(); const auto sublist = from - ? history->owner().savedMessages().sublist(from).get() + ? _history->owner().savedMessages().sublist(from).get() : nullptr; _searchTags = std::make_unique( - &history->owner(), + &_history->owner(), reactions->myTagsValue(sublist), _searchTagsSelected); + _searchTags->heightValue( + ) | rpl::start_with_next([=] { + updateSize(); + }, _searchTags->lifetime()); - _searchTags->selectedValue( + _searchTags->selectedChanges( ) | rpl::start_with_next([=](std::vector &&list) { _searchTagsSelected = std::move(list); requestSearch(false); }, _searchTags->lifetime()); - const auto parent = Ui::CreateChild(this); + if (!_searchTagsSelected.empty()) { + crl::on_main(this, [=] { + requestSearch(false); + }); + } + + const auto parent = _searchTags->lifetime().make_state( + this); + parent->show(); + const auto padding = st::searchInChatTagsPadding; const auto position = QPoint(padding.left(), padding.top()); @@ -478,7 +502,7 @@ void TopBar::setupTags( ActivateClickHandler(parent, handler, ClickContext{ .button = mouse->button(), .other = QVariant::fromValue(ClickHandlerContext{ - .sessionWindow = window, + .sessionWindow = _window, }), }); } diff --git a/Telegram/SourceFiles/mainwidget.cpp b/Telegram/SourceFiles/mainwidget.cpp index fef1fb39c..8431c90ac 100644 --- a/Telegram/SourceFiles/mainwidget.cpp +++ b/Telegram/SourceFiles/mainwidget.cpp @@ -727,6 +727,10 @@ void MainWidget::searchMessages(const QString &query, Dialogs::Key inChat) { _dialogs->setInnerFocus(); } } else { + if (!Data::SearchTagsFromQuery(query).empty()) { + inChat = controller()->session().data().history( + controller()->session().user()); + } const auto searchIn = [&](not_null window) { if (const auto controller = window->sessionController()) { controller->content()->searchMessages(query, inChat);