From 2ba1bb3c794b68c0ba87f64381a869b8566bf64a Mon Sep 17 00:00:00 2001 From: emeric Date: Tue, 11 Aug 2020 13:20:39 +0200 Subject: [PATCH] Fixed crashes during infinite scrolling, ref #83 --- src/lms/ui/PlayQueue.cpp | 39 ++++++++++++++++++++--------- src/lms/ui/PlayQueue.hpp | 2 ++ src/lms/ui/explore/ArtistsView.cpp | 35 ++++++++++++++++++-------- src/lms/ui/explore/ArtistsView.hpp | 2 ++ src/lms/ui/explore/ReleasesView.cpp | 35 ++++++++++++++++++-------- src/lms/ui/explore/ReleasesView.hpp | 2 ++ src/lms/ui/explore/TracksView.cpp | 35 ++++++++++++++++++-------- src/lms/ui/explore/TracksView.hpp | 2 ++ 8 files changed, 110 insertions(+), 42 deletions(-) diff --git a/src/lms/ui/PlayQueue.cpp b/src/lms/ui/PlayQueue.cpp index f7c14424..ccfd5486 100644 --- a/src/lms/ui/PlayQueue.cpp +++ b/src/lms/ui/PlayQueue.cpp @@ -66,16 +66,7 @@ PlayQueue::PlayQueue() }); _entriesContainer = bindNew("entries"); - - _loadingIndicator = bindWidget("loading-indicator", createLoadingIndicator()); - _loadingIndicator->scrollVisibilityChanged().connect([this](bool visible) - { - if (!visible) - return; - - addSome(); - updateCurrentTrack(true); - }); + hideLoadingIndicator(); Wt::WText* shuffleBtn = bindNew("shuffle-btn", Wt::WString::tr("Lms.PlayQueue.template.shuffle-btn"), Wt::TextFormat::XHTML); setToolTip(*shuffleBtn, Wt::WString::tr("Lms.PlayQueue.shuffle")); @@ -191,6 +182,27 @@ PlayQueue::updateRadioBtn() _radioBtn->toggleStyleClass("text-muted", !_radioMode); } +void +PlayQueue::displayLoadingIndicator() +{ + _loadingIndicator = bindWidget("loading-indicator", createLoadingIndicator()); + _loadingIndicator->scrollVisibilityChanged().connect([this](bool visible) + { + if (!visible) + return; + + addSome(); + updateCurrentTrack(true); + }); +} + +void +PlayQueue::hideLoadingIndicator() +{ + _loadingIndicator = nullptr; + bindEmpty("loading-indicator"); +} + Database::TrackList::pointer PlayQueue::getTrackList() const { @@ -205,7 +217,7 @@ PlayQueue::clearTracks() getTrackList().modify()->clear(); } - _loadingIndicator->setHidden(true); + hideLoadingIndicator(); _entriesContainer->clear(); updateInfo(); } @@ -450,7 +462,10 @@ PlayQueue::addSome() } - _loadingIndicator->setHidden(static_cast(_entriesContainer->count()) >= tracklist->getCount()); + if (static_cast(_entriesContainer->count()) < tracklist->getCount()) + displayLoadingIndicator(); + else + hideLoadingIndicator(); } void diff --git a/src/lms/ui/PlayQueue.hpp b/src/lms/ui/PlayQueue.hpp index ed417656..211ef960 100644 --- a/src/lms/ui/PlayQueue.hpp +++ b/src/lms/ui/PlayQueue.hpp @@ -70,6 +70,8 @@ class PlayQueue : public Wt::WTemplate void updateCurrentTrack(bool selected); void updateRepeatBtn(); void updateRadioBtn(); + void displayLoadingIndicator(); + void hideLoadingIndicator(); void loadTrack(std::size_t pos, bool play); void stop(); diff --git a/src/lms/ui/explore/ArtistsView.cpp b/src/lms/ui/explore/ArtistsView.cpp index 5214c142..0084d009 100644 --- a/src/lms/ui/explore/ArtistsView.cpp +++ b/src/lms/ui/explore/ArtistsView.cpp @@ -76,15 +76,7 @@ Artists::Artists(Filters* filters) _linkType->changed().connect([this] { refreshView(); }); _container = bindNew("artists"); - - _loadingIndicator = bindWidget("loading-indicator", createLoadingIndicator()); - _loadingIndicator->scrollVisibilityChanged().connect([this](bool visible) - { - if (!visible) - return; - - addSome(); - }); + hideLoadingIndicator(); refreshView(); @@ -106,6 +98,26 @@ Artists::refreshView(Mode mode) refreshView(); } +void +Artists::displayLoadingIndicator() +{ + _loadingIndicator = bindWidget("loading-indicator", createLoadingIndicator()); + _loadingIndicator->scrollVisibilityChanged().connect([this](bool visible) + { + if (!visible) + return; + + addSome(); + }); +} + +void +Artists::hideLoadingIndicator() +{ + _loadingIndicator = nullptr; + bindEmpty("loading-indicator"); +} + std::vector Artists::getRandomArtists(std::optional range, bool& moreResults) { @@ -207,7 +219,10 @@ Artists::addSome() _container->addWidget(ArtistListHelpers::createEntry(artist)); } - _loadingIndicator->setHidden(!moreResults); + if (moreResults) + displayLoadingIndicator(); + else + hideLoadingIndicator(); } } // namespace UserInterface diff --git a/src/lms/ui/explore/ArtistsView.hpp b/src/lms/ui/explore/ArtistsView.hpp index 4169f74d..1daf80ed 100644 --- a/src/lms/ui/explore/ArtistsView.hpp +++ b/src/lms/ui/explore/ArtistsView.hpp @@ -54,6 +54,8 @@ class Artists : public Wt::WTemplate void refreshView(); void refreshView(Mode mode); + void displayLoadingIndicator(); + void hideLoadingIndicator(); void addSome(); std::vector> getArtists(std::optional range, bool& moreResults); diff --git a/src/lms/ui/explore/ReleasesView.cpp b/src/lms/ui/explore/ReleasesView.cpp index 8489a1f8..e21bb0f5 100644 --- a/src/lms/ui/explore/ReleasesView.cpp +++ b/src/lms/ui/explore/ReleasesView.cpp @@ -79,15 +79,7 @@ _filters {filters} }); _container = bindNew("releases"); - - _loadingIndicator = bindWidget("loading-indicator", createLoadingIndicator()); - _loadingIndicator->scrollVisibilityChanged().connect([this](bool visible) - { - if (!visible) - return; - - addSome(); - }); + hideLoadingIndicator(); refreshView(defaultMode); @@ -109,6 +101,26 @@ Releases::refreshView(Mode mode) refreshView(); } +void +Releases::displayLoadingIndicator() +{ + _loadingIndicator = bindWidget("loading-indicator", createLoadingIndicator()); + _loadingIndicator->scrollVisibilityChanged().connect([this](bool visible) + { + if (!visible) + return; + + addSome(); + }); +} + +void +Releases::hideLoadingIndicator() +{ + _loadingIndicator = nullptr; + bindEmpty("loading-indicator"); +} + void Releases::addSome() { @@ -122,7 +134,10 @@ Releases::addSome() _container->addWidget(ReleaseListHelpers::createEntry(release)); } - _loadingIndicator->setHidden(!moreResults); + if (moreResults) + displayLoadingIndicator(); + else + hideLoadingIndicator(); } std::vector diff --git a/src/lms/ui/explore/ReleasesView.hpp b/src/lms/ui/explore/ReleasesView.hpp index 21f9a5dc..6cc8a67b 100644 --- a/src/lms/ui/explore/ReleasesView.hpp +++ b/src/lms/ui/explore/ReleasesView.hpp @@ -56,6 +56,8 @@ class Releases : public Wt::WTemplate void refreshView(); void refreshView(Mode mode); + void displayLoadingIndicator(); + void hideLoadingIndicator(); void addSome(); std::vector> getReleases(std::optional range, bool& moreResults); diff --git a/src/lms/ui/explore/TracksView.cpp b/src/lms/ui/explore/TracksView.cpp index 701c7ff0..640ab4df 100644 --- a/src/lms/ui/explore/TracksView.cpp +++ b/src/lms/ui/explore/TracksView.cpp @@ -83,15 +83,7 @@ _filters {filters} }); _tracksContainer = bindNew("tracks"); - - _loadingIndicator = bindWidget("loading-indicator", createLoadingIndicator()); - _loadingIndicator->scrollVisibilityChanged().connect([this](bool visible) - { - if (!visible) - return; - - addSome(); - }); + hideLoadingIndicator(); filters->updated().connect([this] { @@ -116,6 +108,26 @@ Tracks::refreshView(Mode mode) refreshView(); } +void +Tracks::displayLoadingIndicator() +{ + _loadingIndicator = bindWidget("loading-indicator", createLoadingIndicator()); + _loadingIndicator->scrollVisibilityChanged().connect([this](bool visible) + { + if (!visible) + return; + + addSome(); + }); +} + +void +Tracks::hideLoadingIndicator() +{ + _loadingIndicator = nullptr; + bindEmpty("loading-indicator"); +} + std::vector Tracks::getRandomTracks(std::optional range, bool& moreResults) { @@ -210,7 +222,10 @@ Tracks::addSome() _tracksContainer->addWidget(TrackListHelpers::createEntry(track)); } - _loadingIndicator->setHidden(!moreResults); + if (moreResults) + displayLoadingIndicator(); + else + hideLoadingIndicator(); } } // namespace UserInterface diff --git a/src/lms/ui/explore/TracksView.hpp b/src/lms/ui/explore/TracksView.hpp index eba94b06..771292d7 100644 --- a/src/lms/ui/explore/TracksView.hpp +++ b/src/lms/ui/explore/TracksView.hpp @@ -55,6 +55,8 @@ class Tracks : public Wt::WTemplate void refreshView(); void refreshView(Mode mode); + void displayLoadingIndicator(); + void hideLoadingIndicator(); void addSome(); std::vector> getRandomTracks(std::optional range, bool& moreResults);