From 039b92d14d9882c2794b7113feab7bf4056ad5b6 Mon Sep 17 00:00:00 2001 From: emeric Date: Mon, 1 May 2023 16:48:08 +0200 Subject: [PATCH] Don't preload stuff in infinite scrolling containers, wait for them to be displayed (faster connection time) --- src/lms/ui/PlayQueue.cpp | 10 ++++------ .../ui/common/InfiniteScrollingContainer.cpp | 19 +++++++++++++++++-- .../ui/common/InfiniteScrollingContainer.hpp | 12 ++++++++---- src/lms/ui/explore/ArtistView.cpp | 14 -------------- src/lms/ui/explore/ArtistsView.cpp | 5 +---- src/lms/ui/explore/ReleasesView.cpp | 5 +---- src/lms/ui/explore/SearchView.cpp | 14 +++----------- src/lms/ui/explore/TrackListView.cpp | 4 ---- src/lms/ui/explore/TrackListsView.cpp | 6 +----- src/lms/ui/explore/TracksView.cpp | 5 +---- 10 files changed, 36 insertions(+), 58 deletions(-) diff --git a/src/lms/ui/PlayQueue.cpp b/src/lms/ui/PlayQueue.cpp index c1dc45c0..e1e5d946 100644 --- a/src/lms/ui/PlayQueue.cpp +++ b/src/lms/ui/PlayQueue.cpp @@ -158,7 +158,7 @@ PlayQueue::PlayQueue() for (const Database::TrackListEntry::pointer& entry : entries) LmsApp->getDbSession().create(entry->getTrack(), queue); } - _entriesContainer->clear(); + _entriesContainer->reset(); addSome(); }); @@ -233,7 +233,6 @@ PlayQueue::PlayQueue() }); updateInfo(); - addSome(); } bool @@ -269,7 +268,7 @@ PlayQueue::clearTracks() getQueue().modify()->clear(); } - _entriesContainer->clear(); + _entriesContainer->reset(); _trackPos.reset(); updateInfo(); } @@ -436,6 +435,7 @@ PlayQueue::enqueueTracks(const std::vector& trackIds) updateInfo(); addSome(); + _entriesContainer->setHasMore(); } std::vector @@ -462,7 +462,7 @@ PlayQueue::getAndClearNextTracks() } else { - _entriesContainer->clear(); + _entriesContainer->reset(); } return tracks; @@ -517,8 +517,6 @@ PlayQueue::addSome() const auto tracklistEntries {queue->getEntries(Database::Range {_entriesContainer->getCount(), _batchSize})}; for (const Database::TrackListEntry::pointer& tracklistEntry : tracklistEntries) addEntry(tracklistEntry); - - _entriesContainer->setHasMore(_entriesContainer->getCount() < queue->getCount()); } void diff --git a/src/lms/ui/common/InfiniteScrollingContainer.cpp b/src/lms/ui/common/InfiniteScrollingContainer.cpp index 3fbb47b4..68109f5b 100644 --- a/src/lms/ui/common/InfiniteScrollingContainer.cpp +++ b/src/lms/ui/common/InfiniteScrollingContainer.cpp @@ -19,6 +19,7 @@ #include "InfiniteScrollingContainer.hpp" +#include #include "LoadingIndicator.hpp" namespace UserInterface @@ -28,14 +29,20 @@ namespace UserInterface , _elements {bindNew("elements")} , _loadingIndicator {bindWidget("loading-indicator", createLoadingIndicator())} { - hideLoadingIndicator(); + reset(); } void InfiniteScrollingContainer::clear() + { + assert(false); + } + + void + InfiniteScrollingContainer::reset() { _elements->clear(); - hideLoadingIndicator(); + setHasMore(true); } std::size_t @@ -50,6 +57,12 @@ namespace UserInterface return _elements->addWidget(std::move(result)); } + void + InfiniteScrollingContainer::setHasMore() + { + setHasMore(true); + } + void InfiniteScrollingContainer::setHasMore(bool hasMore) { @@ -103,7 +116,9 @@ namespace UserInterface if (!visible) return; + const auto previousCount {_elements->count()}; onRequestElements.emit(); + setHasMore(previousCount != _elements->count()); }); } diff --git a/src/lms/ui/common/InfiniteScrollingContainer.hpp b/src/lms/ui/common/InfiniteScrollingContainer.hpp index 58d872f0..0decadf3 100644 --- a/src/lms/ui/common/InfiniteScrollingContainer.hpp +++ b/src/lms/ui/common/InfiniteScrollingContainer.hpp @@ -19,6 +19,7 @@ #pragma once +#include #include #include @@ -29,13 +30,15 @@ namespace UserInterface { - class InfiniteScrollingContainer : public Wt::WTemplate + // Atomatically raises onRequestElements signal when the sentinel is displayed + // can add elements afterwards by calling setHasMoreElements() + class InfiniteScrollingContainer final : public Wt::WTemplate { public: // "text" must contain loading-indicator and "elements" InfiniteScrollingContainer(const Wt::WString& text = Wt::WString::tr("Lms.infinite-scrolling-container.template")); - void clear(); + void reset(); std::size_t getCount(); void add(std::unique_ptr result); @@ -50,14 +53,15 @@ namespace UserInterface Wt::WWidget* getWidget(std::size_t pos) const; std::optional getIndexOf(Wt::WWidget& widget) const; - - void setHasMore(bool hasMore); + void setHasMore(); // can be used to add elements afterwards Wt::Signal<> onRequestElements; private: + void clear() override; void displayLoadingIndicator(); void hideLoadingIndicator(); + void setHasMore(bool hasMore); // can be used to add elements afterwards Wt::WContainerWidget* _elements; Wt::WTemplate* _loadingIndicator; diff --git a/src/lms/ui/explore/ArtistView.cpp b/src/lms/ui/explore/ArtistView.cpp index 672ddeb6..cd1f6323 100644 --- a/src/lms/ui/explore/ArtistView.cpp +++ b/src/lms/ui/explore/ArtistView.cpp @@ -242,7 +242,6 @@ Artist::refreshReleases() { addSomeReleases(releases); }); - releases.container->setHasMore(true); } } else @@ -286,7 +285,6 @@ Artist::refreshAppearsOnReleases() { addSomeReleases(_appearsOnReleaseContainer); }); - _appearsOnReleaseContainer.container->setHasMore(true); } else { @@ -350,11 +348,6 @@ Artist::addSomeReleases(ReleaseContainer& releaseContainer) const Database::Release::pointer release {Database::Release::find(LmsApp->getDbSession(), releaseContainer.releases[i])}; releaseContainer.container->add(ReleaseListHelpers::createEntryForArtist(release, artist)); } - releaseContainer.container->setHasMore(releaseContainer.container->getCount() < releaseContainer.releases.size()); - } - else - { - releaseContainer.container->setHasMore(false); } } @@ -374,15 +367,10 @@ Artist::addSomeNonReleaseTracks() params.setNonRelease(true); const auto tracks {Track::find(LmsApp->getDbSession(), params)}; - bool moreResults {tracks.moreResults}; - for (const TrackId trackId : tracks.results) { if (_trackContainer->getCount() == _tracksMaxCount) - { - moreResults = false; break; - } const Track::pointer track {Track::find(LmsApp->getDbSession(), trackId)}; _trackContainer->add(TrackListHelpers::createEntry(track, _playQueueController, _filters)); @@ -390,8 +378,6 @@ Artist::addSomeNonReleaseTracks() areTracksAdded = true; } - _trackContainer->setHasMore(moreResults); - return areTracksAdded; } diff --git a/src/lms/ui/explore/ArtistsView.cpp b/src/lms/ui/explore/ArtistsView.cpp index 36af77ae..990d4dd5 100644 --- a/src/lms/ui/explore/ArtistsView.cpp +++ b/src/lms/ui/explore/ArtistsView.cpp @@ -102,9 +102,8 @@ Artists::Artists(Filters& filters) void Artists::refreshView() { - _container->clear(); + _container->reset(); _artistCollector.reset(); - addSome(); } void @@ -171,8 +170,6 @@ Artists::addSome() _container->add(ArtistListHelpers::createEntry(artist)); } } - - _container->setHasMore(artistIds.moreResults); } } // namespace UserInterface diff --git a/src/lms/ui/explore/ReleasesView.cpp b/src/lms/ui/explore/ReleasesView.cpp index e6eba137..31741737 100644 --- a/src/lms/ui/explore/ReleasesView.cpp +++ b/src/lms/ui/explore/ReleasesView.cpp @@ -107,9 +107,8 @@ Releases::Releases(Filters& filters, PlayQueueController& playQueueController) void Releases::refreshView() { - _container->clear(); + _container->reset(); _releaseCollector.reset(); - addSome(); } void @@ -133,8 +132,6 @@ Releases::addSome() _container->add(ReleaseListHelpers::createEntry(release)); } } - - _container->setHasMore(releaseIds.moreResults); } std::vector diff --git a/src/lms/ui/explore/SearchView.cpp b/src/lms/ui/explore/SearchView.cpp index 4ff459c6..c8fca22b 100644 --- a/src/lms/ui/explore/SearchView.cpp +++ b/src/lms/ui/explore/SearchView.cpp @@ -88,9 +88,9 @@ namespace UserInterface void SearchView::refreshView() { - _artists->clear(); - _releases->clear(); - _tracks->clear(); + _artists->reset(); + _releases->reset(); + _tracks->reset(); addSomeArtists(); addSomeReleases(); @@ -104,7 +104,6 @@ namespace UserInterface const Range range {_artists->getCount(), getBatchSize(Mode::Artist)}; const RangeResults artistIds {_artistCollector.get(range)}; - { auto transaction {LmsApp->getDbSession().createSharedTransaction()}; @@ -114,8 +113,6 @@ namespace UserInterface _artists->add(ArtistListHelpers::createEntry(artist)); } } - - _artists->setHasMore(artistIds.moreResults); } void @@ -125,7 +122,6 @@ namespace UserInterface const Range range {_releases->getCount(), getBatchSize(Mode::Release)}; const RangeResults releaseIds {_releaseCollector.get(range)}; - { auto transaction {LmsApp->getDbSession().createSharedTransaction()}; @@ -135,8 +131,6 @@ namespace UserInterface _releases->add(ReleaseListHelpers::createEntry(release)); } } - - _releases->setHasMore(releaseIds.moreResults); } void @@ -156,8 +150,6 @@ namespace UserInterface _tracks->add(TrackListHelpers::createEntry(track, _playQueueController, _filters)); } } - - _tracks->setHasMore(trackIds.moreResults); } } // namespace UserInterface diff --git a/src/lms/ui/explore/TrackListView.cpp b/src/lms/ui/explore/TrackListView.cpp index 7bf42501..f7beb4bd 100644 --- a/src/lms/ui/explore/TrackListView.cpp +++ b/src/lms/ui/explore/TrackListView.cpp @@ -179,8 +179,6 @@ namespace UserInterface { addSome(); }); - - addSome(); } void @@ -201,8 +199,6 @@ namespace UserInterface if (const Track::pointer track {Track::find(LmsApp->getDbSession(), trackId)}) _container->add(TrackListHelpers::createEntry(track, _playQueueController, _filters)); } - - _container->setHasMore(trackIds.moreResults && _container->getCount() < _maxCount); } } // namespace UserInterface diff --git a/src/lms/ui/explore/TrackListsView.cpp b/src/lms/ui/explore/TrackListsView.cpp index 81a6168e..01cade9e 100644 --- a/src/lms/ui/explore/TrackListsView.cpp +++ b/src/lms/ui/explore/TrackListsView.cpp @@ -34,7 +34,6 @@ using namespace Database; namespace UserInterface { - TrackLists::TrackLists(Filters& filters) : Template {Wt::WString::tr("Lms.Explore.TrackLists.template")} , _filters {filters} @@ -92,9 +91,8 @@ namespace UserInterface void TrackLists::refreshView() { - _container->clear(); + _container->reset(); _trackListWidgets.clear(); - addSome(); } void @@ -126,8 +124,6 @@ namespace UserInterface if (const TrackList::pointer trackList {TrackList::find(LmsApp->getDbSession(), trackListId)}) addTracklist(trackList); } - - _container->setHasMore(trackListIds.moreResults && _container->getCount() <= _maxCount); } void diff --git a/src/lms/ui/explore/TracksView.cpp b/src/lms/ui/explore/TracksView.cpp index fe76e396..a73cb706 100644 --- a/src/lms/ui/explore/TracksView.cpp +++ b/src/lms/ui/explore/TracksView.cpp @@ -108,9 +108,8 @@ Tracks::Tracks(Filters& filters, PlayQueueController& playQueueController) void Tracks::refreshView() { - _container->clear(); + _container->reset(); _trackCollector.reset(); - addSome(); } void @@ -132,8 +131,6 @@ Tracks::addSome() if (const Track::pointer track {Track::find(LmsApp->getDbSession(), trackId)}) _container->add(TrackListHelpers::createEntry(track, _playQueueController, _filters)); } - - _container->setHasMore(trackIds.moreResults); } std::vector