Don't preload stuff in infinite scrolling containers, wait for them to be displayed (faster connection time)

This commit is contained in:
emeric
2023-05-01 16:48:08 +02:00
parent 3a1ffc17e5
commit 039b92d14d
10 changed files with 36 additions and 58 deletions
+4 -6
View File
@@ -158,7 +158,7 @@ PlayQueue::PlayQueue()
for (const Database::TrackListEntry::pointer& entry : entries) for (const Database::TrackListEntry::pointer& entry : entries)
LmsApp->getDbSession().create<Database::TrackListEntry>(entry->getTrack(), queue); LmsApp->getDbSession().create<Database::TrackListEntry>(entry->getTrack(), queue);
} }
_entriesContainer->clear(); _entriesContainer->reset();
addSome(); addSome();
}); });
@@ -233,7 +233,6 @@ PlayQueue::PlayQueue()
}); });
updateInfo(); updateInfo();
addSome();
} }
bool bool
@@ -269,7 +268,7 @@ PlayQueue::clearTracks()
getQueue().modify()->clear(); getQueue().modify()->clear();
} }
_entriesContainer->clear(); _entriesContainer->reset();
_trackPos.reset(); _trackPos.reset();
updateInfo(); updateInfo();
} }
@@ -436,6 +435,7 @@ PlayQueue::enqueueTracks(const std::vector<Database::TrackId>& trackIds)
updateInfo(); updateInfo();
addSome(); addSome();
_entriesContainer->setHasMore();
} }
std::vector<Database::TrackId> std::vector<Database::TrackId>
@@ -462,7 +462,7 @@ PlayQueue::getAndClearNextTracks()
} }
else else
{ {
_entriesContainer->clear(); _entriesContainer->reset();
} }
return tracks; return tracks;
@@ -517,8 +517,6 @@ PlayQueue::addSome()
const auto tracklistEntries {queue->getEntries(Database::Range {_entriesContainer->getCount(), _batchSize})}; const auto tracklistEntries {queue->getEntries(Database::Range {_entriesContainer->getCount(), _batchSize})};
for (const Database::TrackListEntry::pointer& tracklistEntry : tracklistEntries) for (const Database::TrackListEntry::pointer& tracklistEntry : tracklistEntries)
addEntry(tracklistEntry); addEntry(tracklistEntry);
_entriesContainer->setHasMore(_entriesContainer->getCount() < queue->getCount());
} }
void void
@@ -19,6 +19,7 @@
#include "InfiniteScrollingContainer.hpp" #include "InfiniteScrollingContainer.hpp"
#include <cassert>
#include "LoadingIndicator.hpp" #include "LoadingIndicator.hpp"
namespace UserInterface namespace UserInterface
@@ -28,14 +29,20 @@ namespace UserInterface
, _elements {bindNew<Wt::WContainerWidget>("elements")} , _elements {bindNew<Wt::WContainerWidget>("elements")}
, _loadingIndicator {bindWidget<Wt::WTemplate>("loading-indicator", createLoadingIndicator())} , _loadingIndicator {bindWidget<Wt::WTemplate>("loading-indicator", createLoadingIndicator())}
{ {
hideLoadingIndicator(); reset();
} }
void void
InfiniteScrollingContainer::clear() InfiniteScrollingContainer::clear()
{
assert(false);
}
void
InfiniteScrollingContainer::reset()
{ {
_elements->clear(); _elements->clear();
hideLoadingIndicator(); setHasMore(true);
} }
std::size_t std::size_t
@@ -50,6 +57,12 @@ namespace UserInterface
return _elements->addWidget(std::move(result)); return _elements->addWidget(std::move(result));
} }
void
InfiniteScrollingContainer::setHasMore()
{
setHasMore(true);
}
void void
InfiniteScrollingContainer::setHasMore(bool hasMore) InfiniteScrollingContainer::setHasMore(bool hasMore)
{ {
@@ -103,7 +116,9 @@ namespace UserInterface
if (!visible) if (!visible)
return; return;
const auto previousCount {_elements->count()};
onRequestElements.emit(); onRequestElements.emit();
setHasMore(previousCount != _elements->count());
}); });
} }
@@ -19,6 +19,7 @@
#pragma once #pragma once
#include <memory>
#include <optional> #include <optional>
#include <utility> #include <utility>
@@ -29,13 +30,15 @@
namespace UserInterface 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: public:
// "text" must contain loading-indicator and "elements" // "text" must contain loading-indicator and "elements"
InfiniteScrollingContainer(const Wt::WString& text = Wt::WString::tr("Lms.infinite-scrolling-container.template")); InfiniteScrollingContainer(const Wt::WString& text = Wt::WString::tr("Lms.infinite-scrolling-container.template"));
void clear(); void reset();
std::size_t getCount(); std::size_t getCount();
void add(std::unique_ptr<Wt::WWidget> result); void add(std::unique_ptr<Wt::WWidget> result);
@@ -50,14 +53,15 @@ namespace UserInterface
Wt::WWidget* getWidget(std::size_t pos) const; Wt::WWidget* getWidget(std::size_t pos) const;
std::optional<std::size_t> getIndexOf(Wt::WWidget& widget) const; std::optional<std::size_t> getIndexOf(Wt::WWidget& widget) const;
void setHasMore(); // can be used to add elements afterwards
void setHasMore(bool hasMore);
Wt::Signal<> onRequestElements; Wt::Signal<> onRequestElements;
private: private:
void clear() override;
void displayLoadingIndicator(); void displayLoadingIndicator();
void hideLoadingIndicator(); void hideLoadingIndicator();
void setHasMore(bool hasMore); // can be used to add elements afterwards
Wt::WContainerWidget* _elements; Wt::WContainerWidget* _elements;
Wt::WTemplate* _loadingIndicator; Wt::WTemplate* _loadingIndicator;
-14
View File
@@ -242,7 +242,6 @@ Artist::refreshReleases()
{ {
addSomeReleases(releases); addSomeReleases(releases);
}); });
releases.container->setHasMore(true);
} }
} }
else else
@@ -286,7 +285,6 @@ Artist::refreshAppearsOnReleases()
{ {
addSomeReleases(_appearsOnReleaseContainer); addSomeReleases(_appearsOnReleaseContainer);
}); });
_appearsOnReleaseContainer.container->setHasMore(true);
} }
else else
{ {
@@ -350,11 +348,6 @@ Artist::addSomeReleases(ReleaseContainer& releaseContainer)
const Database::Release::pointer release {Database::Release::find(LmsApp->getDbSession(), releaseContainer.releases[i])}; const Database::Release::pointer release {Database::Release::find(LmsApp->getDbSession(), releaseContainer.releases[i])};
releaseContainer.container->add(ReleaseListHelpers::createEntryForArtist(release, artist)); 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); params.setNonRelease(true);
const auto tracks {Track::find(LmsApp->getDbSession(), params)}; const auto tracks {Track::find(LmsApp->getDbSession(), params)};
bool moreResults {tracks.moreResults};
for (const TrackId trackId : tracks.results) for (const TrackId trackId : tracks.results)
{ {
if (_trackContainer->getCount() == _tracksMaxCount) if (_trackContainer->getCount() == _tracksMaxCount)
{
moreResults = false;
break; break;
}
const Track::pointer track {Track::find(LmsApp->getDbSession(), trackId)}; const Track::pointer track {Track::find(LmsApp->getDbSession(), trackId)};
_trackContainer->add(TrackListHelpers::createEntry(track, _playQueueController, _filters)); _trackContainer->add(TrackListHelpers::createEntry(track, _playQueueController, _filters));
@@ -390,8 +378,6 @@ Artist::addSomeNonReleaseTracks()
areTracksAdded = true; areTracksAdded = true;
} }
_trackContainer->setHasMore(moreResults);
return areTracksAdded; return areTracksAdded;
} }
+1 -4
View File
@@ -102,9 +102,8 @@ Artists::Artists(Filters& filters)
void void
Artists::refreshView() Artists::refreshView()
{ {
_container->clear(); _container->reset();
_artistCollector.reset(); _artistCollector.reset();
addSome();
} }
void void
@@ -171,8 +170,6 @@ Artists::addSome()
_container->add(ArtistListHelpers::createEntry(artist)); _container->add(ArtistListHelpers::createEntry(artist));
} }
} }
_container->setHasMore(artistIds.moreResults);
} }
} // namespace UserInterface } // namespace UserInterface
+1 -4
View File
@@ -107,9 +107,8 @@ Releases::Releases(Filters& filters, PlayQueueController& playQueueController)
void void
Releases::refreshView() Releases::refreshView()
{ {
_container->clear(); _container->reset();
_releaseCollector.reset(); _releaseCollector.reset();
addSome();
} }
void void
@@ -133,8 +132,6 @@ Releases::addSome()
_container->add(ReleaseListHelpers::createEntry(release)); _container->add(ReleaseListHelpers::createEntry(release));
} }
} }
_container->setHasMore(releaseIds.moreResults);
} }
std::vector<ReleaseId> std::vector<ReleaseId>
+3 -11
View File
@@ -88,9 +88,9 @@ namespace UserInterface
void void
SearchView::refreshView() SearchView::refreshView()
{ {
_artists->clear(); _artists->reset();
_releases->clear(); _releases->reset();
_tracks->clear(); _tracks->reset();
addSomeArtists(); addSomeArtists();
addSomeReleases(); addSomeReleases();
@@ -104,7 +104,6 @@ namespace UserInterface
const Range range {_artists->getCount(), getBatchSize(Mode::Artist)}; const Range range {_artists->getCount(), getBatchSize(Mode::Artist)};
const RangeResults<ArtistId> artistIds {_artistCollector.get(range)}; const RangeResults<ArtistId> artistIds {_artistCollector.get(range)};
{ {
auto transaction {LmsApp->getDbSession().createSharedTransaction()}; auto transaction {LmsApp->getDbSession().createSharedTransaction()};
@@ -114,8 +113,6 @@ namespace UserInterface
_artists->add(ArtistListHelpers::createEntry(artist)); _artists->add(ArtistListHelpers::createEntry(artist));
} }
} }
_artists->setHasMore(artistIds.moreResults);
} }
void void
@@ -125,7 +122,6 @@ namespace UserInterface
const Range range {_releases->getCount(), getBatchSize(Mode::Release)}; const Range range {_releases->getCount(), getBatchSize(Mode::Release)};
const RangeResults<ReleaseId> releaseIds {_releaseCollector.get(range)}; const RangeResults<ReleaseId> releaseIds {_releaseCollector.get(range)};
{ {
auto transaction {LmsApp->getDbSession().createSharedTransaction()}; auto transaction {LmsApp->getDbSession().createSharedTransaction()};
@@ -135,8 +131,6 @@ namespace UserInterface
_releases->add(ReleaseListHelpers::createEntry(release)); _releases->add(ReleaseListHelpers::createEntry(release));
} }
} }
_releases->setHasMore(releaseIds.moreResults);
} }
void void
@@ -156,8 +150,6 @@ namespace UserInterface
_tracks->add(TrackListHelpers::createEntry(track, _playQueueController, _filters)); _tracks->add(TrackListHelpers::createEntry(track, _playQueueController, _filters));
} }
} }
_tracks->setHasMore(trackIds.moreResults);
} }
} // namespace UserInterface } // namespace UserInterface
-4
View File
@@ -179,8 +179,6 @@ namespace UserInterface
{ {
addSome(); addSome();
}); });
addSome();
} }
void void
@@ -201,8 +199,6 @@ namespace UserInterface
if (const Track::pointer track {Track::find(LmsApp->getDbSession(), trackId)}) if (const Track::pointer track {Track::find(LmsApp->getDbSession(), trackId)})
_container->add(TrackListHelpers::createEntry(track, _playQueueController, _filters)); _container->add(TrackListHelpers::createEntry(track, _playQueueController, _filters));
} }
_container->setHasMore(trackIds.moreResults && _container->getCount() < _maxCount);
} }
} // namespace UserInterface } // namespace UserInterface
+1 -5
View File
@@ -34,7 +34,6 @@ using namespace Database;
namespace UserInterface namespace UserInterface
{ {
TrackLists::TrackLists(Filters& filters) TrackLists::TrackLists(Filters& filters)
: Template {Wt::WString::tr("Lms.Explore.TrackLists.template")} : Template {Wt::WString::tr("Lms.Explore.TrackLists.template")}
, _filters {filters} , _filters {filters}
@@ -92,9 +91,8 @@ namespace UserInterface
void void
TrackLists::refreshView() TrackLists::refreshView()
{ {
_container->clear(); _container->reset();
_trackListWidgets.clear(); _trackListWidgets.clear();
addSome();
} }
void void
@@ -126,8 +124,6 @@ namespace UserInterface
if (const TrackList::pointer trackList {TrackList::find(LmsApp->getDbSession(), trackListId)}) if (const TrackList::pointer trackList {TrackList::find(LmsApp->getDbSession(), trackListId)})
addTracklist(trackList); addTracklist(trackList);
} }
_container->setHasMore(trackListIds.moreResults && _container->getCount() <= _maxCount);
} }
void void
+1 -4
View File
@@ -108,9 +108,8 @@ Tracks::Tracks(Filters& filters, PlayQueueController& playQueueController)
void void
Tracks::refreshView() Tracks::refreshView()
{ {
_container->clear(); _container->reset();
_trackCollector.reset(); _trackCollector.reset();
addSome();
} }
void void
@@ -132,8 +131,6 @@ Tracks::addSome()
if (const Track::pointer track {Track::find(LmsApp->getDbSession(), trackId)}) if (const Track::pointer track {Track::find(LmsApp->getDbSession(), trackId)})
_container->add(TrackListHelpers::createEntry(track, _playQueueController, _filters)); _container->add(TrackListHelpers::createEntry(track, _playQueueController, _filters));
} }
_container->setHasMore(trackIds.moreResults);
} }
std::vector<Database::TrackId> std::vector<Database::TrackId>