Fixed display of chats filters strip from forward box in search mode.

This commit is contained in:
23rd 2024-11-07 10:24:43 +03:00
parent a41e9bf67e
commit 4a327ba584
3 changed files with 33 additions and 7 deletions

View file

@ -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<int> 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<PeerData*> 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<PeerListState> PeerListContent::saveState() const {

View file

@ -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<not_null<PeerData*>> collectSelectedRows();
[[nodiscard]] rpl::producer<int> multiSelectHeightValue() const;
void setIgnoreHiddenRowsOnSearch(bool value);
void setSpecialTabMode(bool value);
void peerListSetTitle(rpl::producer<QString> 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;
};

View file

@ -2053,7 +2053,7 @@ QPointer<Ui::BoxContent> ShowForwardMessagesBox(
auto controller = std::make_unique<Controller>(session);
const auto controllerRaw = controller.get();
auto init = [=](not_null<PeerListBox*> box) {
box->setIgnoreHiddenRowsOnSearch(true);
box->setSpecialTabMode(true);
auto applyFilter = [=](FilterId id) {
box->scrollToY(0);
auto &filters = session->data().chatsFilters();
@ -2114,6 +2114,7 @@ QPointer<Ui::BoxContent> ShowForwardMessagesBox(
box,
session,
std::move(applyFilter));
chatsFilters->lower();
chatsFilters->heightValue() | rpl::start_with_next([box](int h) {
box->setAddedTopScrollSkip(h);
}, box->lifetime());