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)
LmsApp->getDbSession().create<Database::TrackListEntry>(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<Database::TrackId>& trackIds)
updateInfo();
addSome();
_entriesContainer->setHasMore();
}
std::vector<Database::TrackId>
@@ -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
@@ -19,6 +19,7 @@
#include "InfiniteScrollingContainer.hpp"
#include <cassert>
#include "LoadingIndicator.hpp"
namespace UserInterface
@@ -28,14 +29,20 @@ namespace UserInterface
, _elements {bindNew<Wt::WContainerWidget>("elements")}
, _loadingIndicator {bindWidget<Wt::WTemplate>("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());
});
}
@@ -19,6 +19,7 @@
#pragma once
#include <memory>
#include <optional>
#include <utility>
@@ -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<Wt::WWidget> result);
@@ -50,14 +53,15 @@ namespace UserInterface
Wt::WWidget* getWidget(std::size_t pos) const;
std::optional<std::size_t> 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;
-14
View File
@@ -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;
}
+1 -4
View File
@@ -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
+1 -4
View File
@@ -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<ReleaseId>
+3 -11
View File
@@ -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<ArtistId> 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<ReleaseId> 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
-4
View File
@@ -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
+1 -5
View File
@@ -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
+1 -4
View File
@@ -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<Database::TrackId>