From 4a327ba584817bb65c56f19a7c26fda00b7f7d2f Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Thu, 7 Nov 2024 10:24:43 +0300 Subject: [PATCH] Fixed display of chats filters strip from forward box in search mode. --- Telegram/SourceFiles/boxes/peer_list_box.cpp | 25 ++++++++++++++++--- Telegram/SourceFiles/boxes/peer_list_box.h | 12 +++++++-- .../SourceFiles/window/window_peer_menu.cpp | 3 ++- 3 files changed, 33 insertions(+), 7 deletions(-) diff --git a/Telegram/SourceFiles/boxes/peer_list_box.cpp b/Telegram/SourceFiles/boxes/peer_list_box.cpp index 129eda165..a94b34cc0 100644 --- a/Telegram/SourceFiles/boxes/peer_list_box.cpp +++ b/Telegram/SourceFiles/boxes/peer_list_box.cpp @@ -206,7 +206,9 @@ void PeerListBox::keyPressEvent(QKeyEvent *e) { content()->selectSkipPage(height(), 1); } else if (e->key() == Qt::Key_PageUp) { content()->selectSkipPage(height(), -1); - } else if (e->key() == Qt::Key_Escape && _select && !_select->entity()->getQuery().isEmpty()) { + } else if (e->key() == Qt::Key_Escape + && _select + && !_select->entity()->getQuery().isEmpty()) { _select->entity()->clearQuery(); } else { BoxContent::keyPressEvent(e); @@ -215,7 +217,16 @@ void PeerListBox::keyPressEvent(QKeyEvent *e) { void PeerListBox::searchQueryChanged(const QString &query) { scrollToY(0); - content()->searchQueryChanged(query); + const auto isEmpty = content()->searchQueryChanged(query); + if (_specialTabsMode.enabled) { + _specialTabsMode.searchIsActive = !isEmpty; + if (_specialTabsMode.searchIsActive) { + _specialTabsMode.topSkip = _addedTopScrollSkip; + setAddedTopScrollSkip(0); + } else { + setAddedTopScrollSkip(_specialTabsMode.topSkip); + } + } } void PeerListBox::resizeEvent(QResizeEvent *e) { @@ -547,8 +558,13 @@ rpl::producer PeerListBox::multiSelectHeightValue() const { return _select ? _select->heightValue() : rpl::single(0); } -void PeerListBox::setIgnoreHiddenRowsOnSearch(bool value) { +void PeerListBox::setSpecialTabMode(bool value) { content()->setIgnoreHiddenRowsOnSearch(value); + if (value) { + _specialTabsMode.enabled = true; + } else { + _specialTabsMode = {}; + } } PeerListRow::PeerListRow(not_null peer) @@ -2060,7 +2076,7 @@ void PeerListContent::checkScrollForPreload() { } } -void PeerListContent::searchQueryChanged(QString query) { +PeerListContent::IsEmpty PeerListContent::searchQueryChanged(QString query) { const auto searchWordsList = TextUtilities::PrepareSearchWords(query); const auto normalizedQuery = searchWordsList.join(' '); if (_ignoreHiddenRowsOnSearch && !normalizedQuery.isEmpty()) { @@ -2117,6 +2133,7 @@ void PeerListContent::searchQueryChanged(QString query) { } refreshRows(); } + return _normalizedSearchQuery.isEmpty(); } std::unique_ptr PeerListContent::saveState() const { diff --git a/Telegram/SourceFiles/boxes/peer_list_box.h b/Telegram/SourceFiles/boxes/peer_list_box.h index 31b8f348a..bd71470a7 100644 --- a/Telegram/SourceFiles/boxes/peer_list_box.h +++ b/Telegram/SourceFiles/boxes/peer_list_box.h @@ -652,7 +652,8 @@ public: [[nodiscard]] bool hasPressed() const; void clearSelection(); - void searchQueryChanged(QString query); + using IsEmpty = bool; + IsEmpty searchQueryChanged(QString query); bool submitted(); PeerListRowId updateFromParentDrag(QPoint globalPosition); @@ -1107,7 +1108,7 @@ public: [[nodiscard]] std::vector> collectSelectedRows(); [[nodiscard]] rpl::producer multiSelectHeightValue() const; - void setIgnoreHiddenRowsOnSearch(bool value); + void setSpecialTabMode(bool value); void peerListSetTitle(rpl::producer title) override { setTitle(std::move(title)); @@ -1174,4 +1175,11 @@ private: bool _scrollBottomFixed = false; int _addedTopScrollSkip = 0; + struct SpecialTabsMode final { + bool enabled = false; + bool searchIsActive = false; + int topSkip = 0; + }; + SpecialTabsMode _specialTabsMode; + }; diff --git a/Telegram/SourceFiles/window/window_peer_menu.cpp b/Telegram/SourceFiles/window/window_peer_menu.cpp index 78b3e2a2c..068708c4e 100644 --- a/Telegram/SourceFiles/window/window_peer_menu.cpp +++ b/Telegram/SourceFiles/window/window_peer_menu.cpp @@ -2053,7 +2053,7 @@ QPointer ShowForwardMessagesBox( auto controller = std::make_unique(session); const auto controllerRaw = controller.get(); auto init = [=](not_null box) { - box->setIgnoreHiddenRowsOnSearch(true); + box->setSpecialTabMode(true); auto applyFilter = [=](FilterId id) { box->scrollToY(0); auto &filters = session->data().chatsFilters(); @@ -2114,6 +2114,7 @@ QPointer ShowForwardMessagesBox( box, session, std::move(applyFilter)); + chatsFilters->lower(); chatsFilters->heightValue() | rpl::start_with_next([box](int h) { box->setAddedTopScrollSkip(h); }, box->lifetime());