From 4a676414605bb9861908e65034b97f8d90397d9a Mon Sep 17 00:00:00 2001 From: John Preston Date: Mon, 29 May 2023 12:06:21 +0400 Subject: [PATCH] Load more story users on demand. --- Telegram/SourceFiles/data/data_stories.cpp | 4 +++- .../SourceFiles/dialogs/dialogs_inner_widget.cpp | 5 +++++ .../dialogs/ui/dialogs_stories_list.cpp | 14 ++++++++++++++ .../SourceFiles/dialogs/ui/dialogs_stories_list.h | 3 +++ .../media/stories/media_stories_controller.cpp | 5 +++++ 5 files changed, 30 insertions(+), 1 deletion(-) diff --git a/Telegram/SourceFiles/data/data_stories.cpp b/Telegram/SourceFiles/data/data_stories.cpp index 149125377..e86c395f3 100644 --- a/Telegram/SourceFiles/data/data_stories.cpp +++ b/Telegram/SourceFiles/data/data_stories.cpp @@ -299,7 +299,9 @@ void Stories::loadMore() { const auto api = &_owner->session().api(); using Flag = MTPstories_GetAllStories::Flag; _loadMoreRequestId = api->request(MTPstories_GetAllStories( - MTP_flags(_state.isEmpty() ? Flag(0) : Flag::f_next), + MTP_flags(_state.isEmpty() + ? Flag(0) + : (Flag::f_next | Flag::f_state)), MTP_string(_state) )).done([=](const MTPstories_AllStories &result) { _loadMoreRequestId = 0; diff --git a/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp b/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp index 484b840bc..1b354b377 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp @@ -342,6 +342,11 @@ InnerWidget::InnerWidget( _controller->openPeerStories(PeerId(int64(id))); }, lifetime()); + _stories->loadMoreRequests( + ) | rpl::start_with_next([=] { + session().data().stories().loadMore(); + }, lifetime()); + handleChatListEntryRefreshes(); refreshWithCollapsedRows(true); diff --git a/Telegram/SourceFiles/dialogs/ui/dialogs_stories_list.cpp b/Telegram/SourceFiles/dialogs/ui/dialogs_stories_list.cpp index 3a8cdfd0a..9e7370466 100644 --- a/Telegram/SourceFiles/dialogs/ui/dialogs_stories_list.cpp +++ b/Telegram/SourceFiles/dialogs/ui/dialogs_stories_list.cpp @@ -19,6 +19,7 @@ namespace { constexpr auto kSmallUserpicsShown = 3; constexpr auto kSmallReadOpacity = 0.6; constexpr auto kSummaryExpandLeft = 1.5; +constexpr auto kPreloadPages = 2; [[nodiscard]] int AvailableNameWidth() { const auto &full = st::dialogsStoriesFull; @@ -206,6 +207,7 @@ void List::updateScrollMax() { const auto widthFull = full.left + int(_data.items.size()) * singleFull; _scrollLeftMax = std::max(widthFull - width(), 0); _scrollLeft = std::clamp(_scrollLeft, 0, _scrollLeftMax); + checkLoadMore(); update(); } @@ -221,6 +223,10 @@ rpl::producer<> List::entered() const { return _entered.events(); } +rpl::producer<> List::loadMoreRequests() const { + return _loadMoreRequests.events(); +} + void List::enterEventHook(QEnterEvent *e) { _entered.fire({}); } @@ -597,6 +603,7 @@ void List::wheelEvent(QWheelEvent *e) { _expandRequests.fire({}); _scrollLeft = next; updateSelected(); + checkLoadMore(); update(); } e->accept(); @@ -640,11 +647,18 @@ void List::checkDragging() { _scrollLeftMax); if (newLeft != _scrollLeft) { _scrollLeft = newLeft; + checkLoadMore(); update(); } } } +void List::checkLoadMore() { + if (_scrollLeftMax - _scrollLeft < width() * kPreloadPages) { + _loadMoreRequests.fire({}); + } +} + void List::mouseReleaseEvent(QMouseEvent *e) { _lastMousePosition = e->globalPos(); const auto guard = gsl::finally([&] { diff --git a/Telegram/SourceFiles/dialogs/ui/dialogs_stories_list.h b/Telegram/SourceFiles/dialogs/ui/dialogs_stories_list.h index 1286db93e..06a0fc286 100644 --- a/Telegram/SourceFiles/dialogs/ui/dialogs_stories_list.h +++ b/Telegram/SourceFiles/dialogs/ui/dialogs_stories_list.h @@ -47,6 +47,7 @@ public: [[nodiscard]] rpl::producer clicks() const; [[nodiscard]] rpl::producer<> expandRequests() const; [[nodiscard]] rpl::producer<> entered() const; + [[nodiscard]] rpl::producer<> loadMoreRequests() const; private: struct Layout; @@ -110,6 +111,7 @@ private: void updateSelected(); void checkDragging(); bool finishDragging(); + void checkLoadMore(); void updateHeight(); void toggleAnimated(bool shown); @@ -128,6 +130,7 @@ private: rpl::event_stream _clicks; rpl::event_stream<> _expandRequests; rpl::event_stream<> _entered; + rpl::event_stream<> _loadMoreRequests; Ui::Animations::Simple _shownAnimation; diff --git a/Telegram/SourceFiles/media/stories/media_stories_controller.cpp b/Telegram/SourceFiles/media/stories/media_stories_controller.cpp index 0edb1baec..c0eb8153a 100644 --- a/Telegram/SourceFiles/media/stories/media_stories_controller.cpp +++ b/Telegram/SourceFiles/media/stories/media_stories_controller.cpp @@ -40,6 +40,7 @@ constexpr auto kSiblingMultiplierMax = 0.72; constexpr auto kSiblingOutsidePart = 0.24; constexpr auto kSiblingUserpicSize = 0.3; constexpr auto kInnerHeightMultiplier = 1.6; +constexpr auto kPreloadUsersCount = 3; } // namespace @@ -381,6 +382,10 @@ void Controller::show( } _index = subindex; + if (int(lists.size()) - index < kPreloadUsersCount) { + story->peer()->owner().stories().loadMore(); + } + const auto storyId = FullStoryId{ .peer = list.user->id, .story = id,