diff --git a/Telegram/SourceFiles/dialogs/dialogs_inner_widget.h b/Telegram/SourceFiles/dialogs/dialogs_inner_widget.h index 2ece12357..dc842c77a 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_inner_widget.h +++ b/Telegram/SourceFiles/dialogs/dialogs_inner_widget.h @@ -123,7 +123,7 @@ public: [[nodiscard]] MsgId lastSearchMigratedId() const; [[nodiscard]] WidgetState state() const; - [[nodiscard]] const style::DialogRow *st() const { + [[nodiscard]] not_null st() const { return _st; } [[nodiscard]] bool waitingForSearch() const { diff --git a/Telegram/SourceFiles/dialogs/dialogs_widget.cpp b/Telegram/SourceFiles/dialogs/dialogs_widget.cpp index 85b9deb44..f4b2d6972 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_widget.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_widget.cpp @@ -208,8 +208,19 @@ Widget::Widget( session().changes().historyUpdates( Data::HistoryUpdate::Flag::MessageSent - ) | rpl::start_with_next([=] { - jumpToTop(); + ) | rpl::filter([=](const Data::HistoryUpdate &update) { + if (_openedForum) { + return (update.history->peer == _openedForum); + } else if (_openedFolder) { + return (update.history->folder() == _openedFolder) + && !update.history->isPinnedDialog(FilterId()); + } else { + return !update.history->folder() + && !update.history->isPinnedDialog( + controller->activeChatsFilterCurrent()); + } + }) | rpl::start_with_next([=](const Data::HistoryUpdate &update) { + jumpToTop(true); }, lifetime()); fullSearchRefreshOn(session().settings().skipArchiveInSearchChanges( @@ -764,13 +775,31 @@ void Widget::setInnerFocus() { } } -void Widget::jumpToTop() { +void Widget::jumpToTop(bool belowPinned) { if (session().supportMode()) { return; } if ((_filter->getLastText().trimmed().isEmpty() && !_searchInChat)) { + auto to = 0; + if (belowPinned) { + const auto list = _openedForum + ? _openedForum->forum()->topicsList() + : controller()->activeChatsFilterCurrent() + ? session().data().chatsFilters().chatsList( + controller()->activeChatsFilterCurrent()) + : session().data().chatsList(_openedFolder); + const auto count = int(list->pinned()->order().size()); + const auto now = _scroll->scrollTop(); + const auto row = _inner->st()->height; + const auto min = (row * (count * 2 + 1) - _scroll->height()) / 2; + if (_scroll->scrollTop() <= min) { + return; + } + // Don't jump too high up, below the pinned chats. + to = std::max(min, to); + } _scrollToAnimation.stop(); - _scroll->scrollToY(0); + _scroll->scrollToY(to); } } diff --git a/Telegram/SourceFiles/dialogs/dialogs_widget.h b/Telegram/SourceFiles/dialogs/dialogs_widget.h index 72334ba63..a9b0c2f29 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_widget.h +++ b/Telegram/SourceFiles/dialogs/dialogs_widget.h @@ -70,7 +70,7 @@ public: void searchInChat(Key chat); void setInnerFocus(); - void jumpToTop(); + void jumpToTop(bool belowPinned = false); void startWidthAnimation(); void stopWidthAnimation();