From 03c08ad95f7849a123784c6b63b842589855be28 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Tue, 1 Nov 2022 10:46:31 +0300 Subject: [PATCH] Added saving of scroll state in dialogs widget between chats filters. --- .../dialogs/dialogs_inner_widget.cpp | 21 +++++++++++++++---- .../dialogs/dialogs_inner_widget.h | 2 ++ 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp b/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp index 89044d133d..2fa7135dec 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp @@ -2954,10 +2954,11 @@ bool InnerWidget::chooseCollapsedRow() { } void InnerWidget::switchToFilter(FilterId filterId) { - const auto found = filterId && ranges::contains( - session().data().chatsFilters().list(), - filterId, - &Data::ChatFilter::id); + const auto &list = session().data().chatsFilters().list(); + const auto filterIt = filterId + ? ranges::find(list, filterId, &Data::ChatFilter::id) + : end(list); + const auto found = (filterIt != end(list)); if (!found) { filterId = 0; } @@ -2965,6 +2966,7 @@ void InnerWidget::switchToFilter(FilterId filterId) { _mustScrollTo.fire({ 0, 0 }); return; } + _chatsFilterScrollStates[_filterId] = -pos().y(); if (_openedFolder) { _filterId = filterId; } else { @@ -2974,6 +2976,17 @@ void InnerWidget::switchToFilter(FilterId filterId) { refreshWithCollapsedRows(true); } refreshEmptyLabel(); + { + const auto it = _chatsFilterScrollStates.find(filterId); + if (it != end(_chatsFilterScrollStates)) { + const auto skip = found + // Don't save a scroll state for very flexible chat filters. + && (filterIt->flags() & (Data::ChatFilter::Flag::NoRead)); + if (!skip) { + _mustScrollTo.fire({ it->second, -1 }); + } + } + } } bool InnerWidget::chooseHashtag() { diff --git a/Telegram/SourceFiles/dialogs/dialogs_inner_widget.h b/Telegram/SourceFiles/dialogs/dialogs_inner_widget.h index e97dbc0926..228c1c8c6e 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_inner_widget.h +++ b/Telegram/SourceFiles/dialogs/dialogs_inner_widget.h @@ -443,6 +443,8 @@ private: not_null, std::unique_ptr> _videoUserpics; + base::flat_map _chatsFilterScrollStates; + Fn _loadMoreCallback; Fn _loadMoreFilteredCallback; rpl::event_stream<> _listBottomReached;