Don't preload stuff in infinite scrolling containers, wait for them to be displayed (faster connection time)
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user