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)
|
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;
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user