From 6e3c3a8dd22d0ceb94830c0834c94f0049ce9875 Mon Sep 17 00:00:00 2001 From: John Preston Date: Thu, 20 Jul 2023 21:42:22 +0400 Subject: [PATCH] Collapse stories on archive open/close. --- .../SourceFiles/dialogs/dialogs_widget.cpp | 47 ++++++++++++++++--- Telegram/SourceFiles/dialogs/dialogs_widget.h | 6 +++ .../dialogs/ui/dialogs_stories_list.cpp | 1 + Telegram/lib_base | 2 +- Telegram/lib_ui | 2 +- Telegram/lib_webview | 2 +- 6 files changed, 50 insertions(+), 10 deletions(-) diff --git a/Telegram/SourceFiles/dialogs/dialogs_widget.cpp b/Telegram/SourceFiles/dialogs/dialogs_widget.cpp index 90722d7ea8..9ff80e9fd5 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_widget.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_widget.cpp @@ -1075,19 +1075,52 @@ void Widget::changeOpenedFolder(Data::Folder *folder, anim::type animated) { cancelSearch(); closeChildList(anim::type::instant); controller()->closeForum(); - const auto was = (_openedFolder != nullptr); _openedFolder = folder; _inner->changeOpenedFolder(folder); - storiesToggleExplicitExpand(false); - if (was != (_openedFolder != nullptr)) { - using List = Data::StorySourcesList; - _storiesContents.fire(Stories::ContentForSession( - &controller()->session(), - folder ? List::Hidden : List::NotHidden)); + if (_stories) { + storiesExplicitCollapse(); } }, (folder != nullptr), animated); } +void Widget::storiesExplicitCollapse() { + if (_storiesExplicitExpand) { + storiesToggleExplicitExpand(false); + } else if (_stories) { + using Type = Ui::ElasticScroll::OverscrollType; + _scroll->setOverscrollDefaults(0, 0); + _scroll->setOverscrollTypes(Type::None, Type::Real); + _scroll->setOverscrollTypes( + _stories->isHidden() ? Type::Real : Type::Virtual, + Type::Real); + } + _storiesExplicitExpandAnimation.stop(); + _storiesExplicitExpandValue = 0; + + using List = Data::StorySourcesList; + collectStoriesUserpicsViews(_openedFolder + ? List::NotHidden + : List::Hidden); + _storiesContents.fire(Stories::ContentForSession( + &session(), + _openedFolder ? List::Hidden : List::NotHidden)); +} + +void Widget::collectStoriesUserpicsViews(Data::StorySourcesList list) { + auto &map = (list == Data::StorySourcesList::Hidden) + ? _storiesUserpicsViewsHidden + : _storiesUserpicsViewsShown; + map.clear(); + auto &owner = session().data(); + for (const auto &source : owner.stories().sources(list)) { + if (const auto peer = owner.peerLoaded(source.id)) { + if (auto view = peer->activeUserpicView(); view.cloud) { + map.emplace(source.id, std::move(view)); + } + } + } +} + void Widget::changeOpenedForum(Data::Forum *forum, anim::type animated) { if (_openedForum == forum) { return; diff --git a/Telegram/SourceFiles/dialogs/dialogs_widget.h b/Telegram/SourceFiles/dialogs/dialogs_widget.h index 83a8d70e64..9473ac3485 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_widget.h +++ b/Telegram/SourceFiles/dialogs/dialogs_widget.h @@ -11,6 +11,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "dialogs/dialogs_key.h" #include "window/section_widget.h" #include "ui/effects/animations.h" +#include "ui/userpic_view.h" #include "mtproto/sender.h" #include "api/api_single_message_search.h" @@ -20,6 +21,7 @@ class Error; namespace Data { class Forum; +enum class StorySourcesList : uchar; } // namespace Data namespace Main { @@ -168,6 +170,8 @@ private: void setupDownloadBar(); void setupShortcuts(); void setupStories(); + void storiesExplicitCollapse(); + void collectStoriesUserpicsViews(Data::StorySourcesList list); void storiesToggleExplicitExpand(bool expand); void trackScroll(not_null widget); [[nodiscard]] bool searchForPeersRequired(const QString &query) const; @@ -281,6 +285,8 @@ private: QString _lastFilterText; rpl::event_stream> _storiesContents; + base::flat_map _storiesUserpicsViewsHidden; + base::flat_map _storiesUserpicsViewsShown; Fn _updateScrollGeometryCached; std::unique_ptr _stories; Ui::Animations::Simple _storiesExplicitExpandAnimation; diff --git a/Telegram/SourceFiles/dialogs/ui/dialogs_stories_list.cpp b/Telegram/SourceFiles/dialogs/ui/dialogs_stories_list.cpp index b09083ed76..1703c29d4c 100644 --- a/Telegram/SourceFiles/dialogs/ui/dialogs_stories_list.cpp +++ b/Telegram/SourceFiles/dialogs/ui/dialogs_stories_list.cpp @@ -622,6 +622,7 @@ void List::mousePressEvent(QMouseEvent *e) { return; } else if (_state == State::Small) { requestExpanded(true); + return; } else if (_state != State::Full) { return; } diff --git a/Telegram/lib_base b/Telegram/lib_base index 74be75339d..2669a04579 160000 --- a/Telegram/lib_base +++ b/Telegram/lib_base @@ -1 +1 @@ -Subproject commit 74be75339d474df1a2863028ec146744597bd0bb +Subproject commit 2669a04579069942b6208a18abe93c26adfddf2a diff --git a/Telegram/lib_ui b/Telegram/lib_ui index 8f03125ec1..288bec7157 160000 --- a/Telegram/lib_ui +++ b/Telegram/lib_ui @@ -1 +1 @@ -Subproject commit 8f03125ec1d6b0f4a3f0fe6b6849aa57a1006063 +Subproject commit 288bec7157bf654d121ebfd2828801b49beb34ec diff --git a/Telegram/lib_webview b/Telegram/lib_webview index ec24c7a960..ebb8b8b91f 160000 --- a/Telegram/lib_webview +++ b/Telegram/lib_webview @@ -1 +1 @@ -Subproject commit ec24c7a96036268b2024ca9765a66c63e6b8396a +Subproject commit ebb8b8b91fe357b2c397a3eb98655c585b8c856e