From ba520aadcbed49e1f3eea137da1169d69e40aae2 Mon Sep 17 00:00:00 2001 From: John Preston Date: Wed, 18 Jan 2023 13:35:52 +0400 Subject: [PATCH] Fix hashtags in separate windows. --- Telegram/SourceFiles/core/application.cpp | 2 + Telegram/SourceFiles/core/ui_integration.cpp | 3 +- .../SourceFiles/history/history_widget.cpp | 71 ++++++++++++------- Telegram/SourceFiles/history/history_widget.h | 1 + .../controls/history_view_compose_search.cpp | 38 +++++++--- .../controls/history_view_compose_search.h | 4 +- Telegram/SourceFiles/mainwidget.cpp | 34 ++++++--- .../SourceFiles/ui/widgets/multi_select.cpp | 22 +++++- .../SourceFiles/ui/widgets/multi_select.h | 6 +- 9 files changed, 130 insertions(+), 51 deletions(-) diff --git a/Telegram/SourceFiles/core/application.cpp b/Telegram/SourceFiles/core/application.cpp index ea8102f0f..2f45bbf5a 100644 --- a/Telegram/SourceFiles/core/application.cpp +++ b/Telegram/SourceFiles/core/application.cpp @@ -1304,6 +1304,7 @@ void Application::closeWindow(not_null window) { _lastActiveWindow = next; if (_lastActiveWindow) { _lastActiveWindow->activate(); + _lastActiveWindow->widget()->updateGlobalMenu(); } } _closingAsyncWindows.remove(window); @@ -1362,6 +1363,7 @@ void Application::windowActivated(not_null window) { if (window->isPrimary()) { _lastActivePrimaryWindow = window; } + window->widget()->updateGlobalMenu(); const auto wasSession = was ? was->maybeSession() : nullptr; const auto nowSession = now->maybeSession(); diff --git a/Telegram/SourceFiles/core/ui_integration.cpp b/Telegram/SourceFiles/core/ui_integration.cpp index 858d4a70d..e3ca5248a 100644 --- a/Telegram/SourceFiles/core/ui_integration.cpp +++ b/Telegram/SourceFiles/core/ui_integration.cpp @@ -124,8 +124,7 @@ QString UiIntegration::angleBackendFilePath() { } void UiIntegration::textActionsUpdated() { - // #TODO windows global menu - if (const auto window = Core::App().activePrimaryWindow()) { + if (const auto window = Core::App().activeWindow()) { window->widget()->updateGlobalMenu(); } } diff --git a/Telegram/SourceFiles/history/history_widget.cpp b/Telegram/SourceFiles/history/history_widget.cpp index a4725e9f3..8b731ee0f 100644 --- a/Telegram/SourceFiles/history/history_widget.cpp +++ b/Telegram/SourceFiles/history/history_widget.cpp @@ -4549,35 +4549,52 @@ void HistoryWidget::searchInChat() { return; } else if (controller()->isPrimary()) { controller()->content()->searchInChat(_history); - } else if (!_composeSearch) { - const auto search = [=] { - const auto update = [=] { - updateControlsVisibility(); - updateBotKeyboard(); - updateFieldPlaceholder(); + } else { + searchInChatEmbedded(); + } +} - updateControlsGeometry(); - }; - _composeSearch = std::make_unique( - this, - controller(), - _history); - - update(); - setInnerFocus(); - _composeSearch->destroyRequests( - ) | rpl::take( - 1 - ) | rpl::start_with_next([=] { - _composeSearch = nullptr; - - update(); - setInnerFocus(); - }, _composeSearch->lifetime()); - }; - if (!preventsClose(search)) { - search(); +void HistoryWidget::searchInChatEmbedded(std::optional query) { + if (!_history) { + return; + } else if (_composeSearch) { + if (query) { + _composeSearch->setQuery(*query); } + _composeSearch->setInnerFocus(); + return; + } + const auto search = crl::guard(_list, [=] { + if (!_history) { + return; + } + const auto update = [=] { + updateControlsVisibility(); + updateBotKeyboard(); + updateFieldPlaceholder(); + + updateControlsGeometry(); + }; + _composeSearch = std::make_unique( + this, + controller(), + _history, + query.value_or(QString())); + + update(); + setInnerFocus(); + _composeSearch->destroyRequests( + ) | rpl::take( + 1 + ) | rpl::start_with_next([=] { + _composeSearch = nullptr; + + update(); + setInnerFocus(); + }, _composeSearch->lifetime()); + }); + if (!preventsClose(search)) { + search(); } } diff --git a/Telegram/SourceFiles/history/history_widget.h b/Telegram/SourceFiles/history/history_widget.h index 307679c3d..a00857f60 100644 --- a/Telegram/SourceFiles/history/history_widget.h +++ b/Telegram/SourceFiles/history/history_widget.h @@ -235,6 +235,7 @@ public: [[nodiscard]] rpl::producer<> cancelRequests() const { return _cancelRequests.events(); } + void searchInChatEmbedded(std::optional query = {}); void updateNotifyControls(); 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 be8323f6a..b7024d55d 100644 --- a/Telegram/SourceFiles/history/view/controls/history_view_compose_search.cpp +++ b/Telegram/SourceFiles/history/view/controls/history_view_compose_search.cpp @@ -254,9 +254,10 @@ List CreateList( class TopBar final : public Ui::RpWidget { public: - TopBar(not_null parent); + TopBar(not_null parent, const QString &query); void setInnerFocus(); + void setQuery(const QString &query); [[nodiscard]] rpl::producer searchRequests() const; [[nodiscard]] rpl::producer fromValue() const; @@ -291,13 +292,14 @@ private: rpl::event_stream> _keyEvents; }; -TopBar::TopBar(not_null parent) +TopBar::TopBar(not_null parent, const QString &query) : Ui::RpWidget(parent) , _cancel(base::make_unique_q(this, st::historyTopBarBack)) , _select(base::make_unique_q( this, st::searchInChatMultiSelect, - tr::lng_dlg_filter())) + tr::lng_dlg_filter(), + query)) , _searchTimer([=] { requestSearch(); }) { parent->geometryValue( @@ -352,6 +354,10 @@ void TopBar::setInnerFocus() { _select->setInnerFocus(); } +void TopBar::setQuery(const QString &query) { + _select->setQuery(query); +} + void TopBar::clearItems() { _select->setItemRemovedCallback(nullptr); @@ -647,11 +653,13 @@ public: Inner( not_null parent, not_null window, - not_null history); + not_null history, + const QString &query); ~Inner(); void hideAnimated(); void setInnerFocus(); + void setQuery(const QString &query); [[nodiscard]] rpl::producer<> destroyRequests() const; [[nodiscard]] rpl::lifetime &lifetime(); @@ -683,10 +691,11 @@ private: ComposeSearch::Inner::Inner( not_null parent, not_null window, - not_null history) + not_null history, + const QString &query) : _window(window) , _history(history) -, _topBar(base::make_unique_q(parent)) +, _topBar(base::make_unique_q(parent, query)) , _bottomBar(base::make_unique_q(parent, HasChooseFrom(history))) , _list(CreateList(parent, history)) , _apiSearch(history) { @@ -835,12 +844,20 @@ ComposeSearch::Inner::Inner( ) | rpl::map([=](PeerData *from) { return HasChooseFrom(_history) && !from; })); + + if (!query.isEmpty()) { + _apiSearch.search({ query }); + } } void ComposeSearch::Inner::setInnerFocus() { _topBar->setInnerFocus(); } +void ComposeSearch::Inner::setQuery(const QString &query) { + _topBar->setQuery(query); +} + void ComposeSearch::Inner::showAnimated() { // Don't animate bottom bar. _bottomBar->show(); @@ -874,8 +891,9 @@ ComposeSearch::Inner::~Inner() { ComposeSearch::ComposeSearch( not_null parent, not_null window, - not_null history) -: _inner(std::make_unique(parent, window, history)) { + not_null history, + const QString &query) +: _inner(std::make_unique(parent, window, history, query)) { } ComposeSearch::~ComposeSearch() { @@ -889,6 +907,10 @@ void ComposeSearch::setInnerFocus() { _inner->setInnerFocus(); } +void ComposeSearch::setQuery(const QString &query) { + _inner->setQuery(query); +} + rpl::producer<> ComposeSearch::destroyRequests() const { return _inner->destroyRequests(); } 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 53b2ca790..6ce99dbbb 100644 --- a/Telegram/SourceFiles/history/view/controls/history_view_compose_search.h +++ b/Telegram/SourceFiles/history/view/controls/history_view_compose_search.h @@ -24,11 +24,13 @@ public: ComposeSearch( not_null parent, not_null window, - not_null history); + not_null history, + const QString &query = QString()); ~ComposeSearch(); void hideAnimated(); void setInnerFocus(); + void setQuery(const QString &query); [[nodiscard]] rpl::producer<> destroyRequests() const; diff --git a/Telegram/SourceFiles/mainwidget.cpp b/Telegram/SourceFiles/mainwidget.cpp index 31e75c60e..6a2ea0f78 100644 --- a/Telegram/SourceFiles/mainwidget.cpp +++ b/Telegram/SourceFiles/mainwidget.cpp @@ -731,15 +731,33 @@ void MainWidget::hideSingleUseKeyboard(PeerData *peer, MsgId replyTo) { } void MainWidget::searchMessages(const QString &query, Dialogs::Key inChat) { - // #TODO windows - if (!_dialogs) { - return; - } - _dialogs->searchMessages(query, inChat); - if (isOneColumn()) { - _controller->clearSectionStack(); + if (controller()->isPrimary()) { + _dialogs->searchMessages(query, inChat); + if (isOneColumn()) { + _controller->clearSectionStack(); + } else { + _dialogs->setInnerFocus(); + } } else { - _dialogs->setInnerFocus(); + const auto searchIn = [&](not_null window) { + if (const auto controller = window->sessionController()) { + controller->content()->searchMessages(query, inChat); + controller->widget()->activate(); + } + }; + const auto account = &session().account(); + if (const auto peer = inChat.peer()) { + if (peer == controller()->singlePeer()) { + if (_history->peer() != peer) { + controller()->showPeerHistory(peer); + } + _history->searchInChatEmbedded(query); + } else if (const auto window = Core::App().windowFor(peer)) { + searchIn(window); + } + } else if (const auto window = Core::App().windowFor(account)) { + searchIn(window); + } } } diff --git a/Telegram/SourceFiles/ui/widgets/multi_select.cpp b/Telegram/SourceFiles/ui/widgets/multi_select.cpp index fa8ea97ea..86526e111 100644 --- a/Telegram/SourceFiles/ui/widgets/multi_select.cpp +++ b/Telegram/SourceFiles/ui/widgets/multi_select.cpp @@ -416,9 +416,11 @@ public: QWidget *parent, const style::MultiSelect &st, rpl::producer placeholder, + const QString &query, ScrollCallback callback); - QString getQuery() const; + [[nodiscard]] QString getQuery() const; + void setQuery(const QString &query); bool setInnerFocus(); void clearQuery(); @@ -511,7 +513,8 @@ private: MultiSelect::MultiSelect( QWidget *parent, const style::MultiSelect &st, - rpl::producer placeholder) + rpl::producer placeholder, + const QString &query) : RpWidget(parent) , _st(st) , _scroll(this, _st.scroll) { @@ -522,6 +525,7 @@ MultiSelect::MultiSelect( this, st, std::move(placeholder), + query, scrollCallback)); _scroll->installEventFilter(this); _inner->setResizedCallback([this](int innerHeightDelta) { @@ -597,6 +601,10 @@ QString MultiSelect::getQuery() const { return _inner->getQuery(); } +void MultiSelect::setQuery(const QString &query) { + _inner->setQuery(query); +} + void MultiSelect::addItem(uint64 itemId, const QString &text, style::color color, PaintRoundImage paintRoundImage, AddItemWay way) { addItemInBunch(itemId, text, color, std::move(paintRoundImage)); _inner->finishItemsBunch(way); @@ -643,11 +651,12 @@ MultiSelect::Inner::Inner( QWidget *parent, const style::MultiSelect &st, rpl::producer placeholder, + const QString &query, ScrollCallback callback) : TWidget(parent) , _st(st) , _scrollCallback(std::move(callback)) -, _field(this, _st.field, std::move(placeholder)) +, _field(this, _st.field, std::move(placeholder), query) , _cancel(this, _st.fieldCancel) { _field->customUpDown(true); connect(_field, &Ui::InputField::focused, [=] { fieldFocused(); }); @@ -674,6 +683,13 @@ QString MultiSelect::Inner::getQuery() const { return _field->getLastText().trimmed(); } +void MultiSelect::Inner::setQuery(const QString &query) { + _field->setText(query); + if (const auto last = _field->getLastText(); !last.isEmpty()) { + _field->setCursorPosition(last.size()); + } +} + bool MultiSelect::Inner::setInnerFocus() { if (_active >= 0) { setFocus(); diff --git a/Telegram/SourceFiles/ui/widgets/multi_select.h b/Telegram/SourceFiles/ui/widgets/multi_select.h index b3dc4cdaf..cf3fbdb9d 100644 --- a/Telegram/SourceFiles/ui/widgets/multi_select.h +++ b/Telegram/SourceFiles/ui/widgets/multi_select.h @@ -23,9 +23,11 @@ public: MultiSelect( QWidget *parent, const style::MultiSelect &st, - rpl::producer placeholder = nullptr); + rpl::producer placeholder = nullptr, + const QString &query = QString()); - QString getQuery() const; + [[nodiscard]] QString getQuery() const; + void setQuery(const QString &query); void setInnerFocus(); void clearQuery();