From f8cb16954bf1ff497497f939186d02044e9be005 Mon Sep 17 00:00:00 2001 From: emeric Date: Tue, 6 Aug 2019 13:55:43 +0200 Subject: [PATCH] Added Play/Queue buttons in the releases view --- approot/releases.xml | 1 + src/ui/explore/ArtistView.cpp | 16 ++--- src/ui/explore/ArtistView.hpp | 8 +-- src/ui/explore/ArtistsView.hpp | 4 +- src/ui/explore/Explore.cpp | 119 ++++++++++++++------------------ src/ui/explore/Explore.hpp | 14 ++-- src/ui/explore/ReleaseView.cpp | 8 +-- src/ui/explore/ReleaseView.hpp | 8 +-- src/ui/explore/ReleasesView.cpp | 55 +++++++++++---- src/ui/explore/ReleasesView.hpp | 9 ++- src/ui/explore/TracksView.cpp | 8 +-- src/ui/explore/TracksView.hpp | 7 +- 12 files changed, 135 insertions(+), 122 deletions(-) diff --git a/approot/releases.xml b/approot/releases.xml index e459cf8b..a23648dd 100644 --- a/approot/releases.xml +++ b/approot/releases.xml @@ -5,6 +5,7 @@
diff --git a/src/ui/explore/ArtistView.cpp b/src/ui/explore/ArtistView.cpp index 489c5ca6..7c927357 100644 --- a/src/ui/explore/ArtistView.cpp +++ b/src/ui/explore/ArtistView.cpp @@ -102,19 +102,19 @@ Artist::refresh() { Wt::WText* playBtn = t->bindNew("play-btn", Wt::WString::tr("Lms.Explore.template.play-btn"), Wt::TextFormat::XHTML); - playBtn->clicked().connect(std::bind([=] + playBtn->clicked().connect([=] { - artistPlay.emit(*artistId); - })); + artistsPlay.emit({*artistId}); + }); } { Wt::WText* addBtn = t->bindNew("add-btn", Wt::WString::tr("Lms.Explore.template.add-btn"), Wt::TextFormat::XHTML); - addBtn->clicked().connect(std::bind([=] + addBtn->clicked().connect([=] { - artistAdd.emit(*artistId); - })); + artistsAdd.emit({*artistId}); + }); } Wt::WContainerWidget* releasesContainer = t->bindNew("releases"); @@ -179,13 +179,13 @@ Artist::refresh() Wt::WText* playBtn = entry->bindNew("play-btn", Wt::WString::tr("Lms.Explore.template.play-btn"), Wt::TextFormat::XHTML); playBtn->clicked().connect(std::bind([=] { - releasePlay.emit(releaseId); + releasesPlay.emit({releaseId}); })); Wt::WText* addBtn = entry->bindNew("add-btn", Wt::WString::tr("Lms.Explore.template.add-btn"), Wt::TextFormat::XHTML); addBtn->clicked().connect(std::bind([=] { - releaseAdd.emit(releaseId); + releasesAdd.emit({releaseId}); })); } } diff --git a/src/ui/explore/ArtistView.hpp b/src/ui/explore/ArtistView.hpp index 8c3aed93..abfb30d6 100644 --- a/src/ui/explore/ArtistView.hpp +++ b/src/ui/explore/ArtistView.hpp @@ -33,11 +33,11 @@ class Artist : public Wt::WContainerWidget public: Artist(Filters* filters); - Wt::Signal artistAdd; - Wt::Signal artistPlay; + Wt::Signal&> artistsAdd; + Wt::Signal&> artistsPlay; - Wt::Signal releaseAdd; - Wt::Signal releasePlay; + Wt::Signal&> releasesAdd; + Wt::Signal&> releasesPlay; private: void refresh(); diff --git a/src/ui/explore/ArtistsView.hpp b/src/ui/explore/ArtistsView.hpp index afb965bc..03f33e10 100644 --- a/src/ui/explore/ArtistsView.hpp +++ b/src/ui/explore/ArtistsView.hpp @@ -36,8 +36,8 @@ class Artists : public Wt::WTemplate public: Artists(Filters* filters); - Wt::Signal artistAdd; - Wt::Signal artistPlay; + Wt::Signal&> artistsAdd; + Wt::Signal&> artistsPlay; private: void refresh(); diff --git a/src/ui/explore/Explore.cpp b/src/ui/explore/Explore.cpp index 3c4d0d8b..d44129da 100644 --- a/src/ui/explore/Explore.cpp +++ b/src/ui/explore/Explore.cpp @@ -121,32 +121,30 @@ Explore::Explore() Wt::WStackedWidget* contentsStack = bindNew("contents"); auto artists = std::make_unique(_filters); - artists->artistAdd.connect(this, &Explore::handleArtistAdd); - artists->artistPlay.connect(this, &Explore::handleArtistPlay); + artists->artistsAdd.connect(this, &Explore::handleArtistsAdd); + artists->artistsPlay.connect(this, &Explore::handleArtistsPlay); contentsStack->addWidget(std::move(artists)); auto artist = std::make_unique(_filters); - artist->artistAdd.connect(this, &Explore::handleArtistAdd); - artist->artistPlay.connect(this, &Explore::handleArtistPlay); - artist->releaseAdd.connect(this, &Explore::handleReleaseAdd); - artist->releasePlay.connect(this, &Explore::handleReleasePlay); + artist->artistsAdd.connect(this, &Explore::handleArtistsAdd); + artist->artistsPlay.connect(this, &Explore::handleArtistsPlay); + artist->releasesAdd.connect(this, &Explore::handleReleasesAdd); + artist->releasesPlay.connect(this, &Explore::handleReleasesPlay); contentsStack->addWidget(std::move(artist)); auto releases = std::make_unique(_filters); - releases->releaseAdd.connect(this, &Explore::handleReleaseAdd); - releases->releasePlay.connect(this, &Explore::handleReleasePlay); + releases->releasesAdd.connect(this, &Explore::handleReleasesAdd); + releases->releasesPlay.connect(this, &Explore::handleReleasesPlay); contentsStack->addWidget(std::move(releases)); auto release = std::make_unique(_filters); - release->releaseAdd.connect(this, &Explore::handleReleaseAdd); - release->releasePlay.connect(this, &Explore::handleReleasePlay); - release->trackAdd.connect(this, &Explore::handleTrackAdd); - release->trackPlay.connect(this, &Explore::handleTrackPlay); + release->releasesAdd.connect(this, &Explore::handleReleasesAdd); + release->releasesPlay.connect(this, &Explore::handleReleasesPlay); + release->tracksAdd.connect(this, &Explore::handleTracksAdd); + release->tracksPlay.connect(this, &Explore::handleTracksPlay); contentsStack->addWidget(std::move(release)); auto tracks = std::make_unique(_filters); - tracks->trackAdd.connect(this, &Explore::handleTrackAdd); - tracks->trackPlay.connect(this, &Explore::handleTrackPlay); tracks->tracksAdd.connect(this, &Explore::handleTracksAdd); tracks->tracksPlay.connect(this, &Explore::handleTracksPlay); contentsStack->addWidget(std::move(tracks)); @@ -181,102 +179,85 @@ Explore::Explore() static std::vector -getArtistTracks(Database::Session& session, Database::IdType artistId, const std::set& clusters) +getArtistsTracks(Database::Session& session, const std::vector& artistsId, const std::set& clusters) { + std::vector res; + auto transaction {LmsApp->getDbSession().createSharedTransaction()}; - Database::Artist::pointer artist {Database::Artist::getById(session, artistId)}; - if (!artist) - return {}; + for (Database::IdType artistId : artistsId) + { + Database::Artist::pointer artist {Database::Artist::getById(session, artistId)}; + if (!artist) + continue; - // TODO handle clusters here - const std::vector tracks {artist->getTracks()}; + // TODO handle clusters here + const std::vector tracks {artist->getTracks()}; - std::vector res; - res.reserve(tracks.size()); + res.reserve(res.size() + tracks.size()); + std::transform(std::cbegin(tracks), std::cend(tracks), std::back_inserter(res), [](const Database::Track::pointer& track) { return track.id(); }); + } - std::transform(std::cbegin(tracks), std::cend(tracks), std::back_inserter(res), [](const Database::Track::pointer& track) { return track.id(); }); return res; } static std::vector -getReleaseTracks(Database::Session& session, Database::IdType releaseId, std::set clusters) +getReleasesTracks(Database::Session& session, const std::vector& releasesId, const std::set& clusters) { + std::vector res; + auto transaction {LmsApp->getDbSession().createSharedTransaction()}; - Database::Release::pointer release {Database::Release::getById(session, releaseId)}; - if (!release) - return {}; + for (Database::IdType releaseId : releasesId) + { + Database::Release::pointer release {Database::Release::getById(session, releaseId)}; + if (!release) + continue; - const std::vector tracks {release->getTracks(clusters)}; + const std::vector tracks {release->getTracks(clusters)}; - std::vector res; - res.reserve(tracks.size()); + res.reserve(res.size() + tracks.size()); + std::transform(std::cbegin(tracks), std::cend(tracks), std::back_inserter(res), [](const Database::Track::pointer& track) { return track.id(); }); + } - std::transform(std::cbegin(tracks), std::cend(tracks), std::back_inserter(res), [](const Database::Track::pointer& track) { return track.id(); }); return res; } -static -std::vector -getTrack(Database::Session& session, Database::IdType trackId) +void +Explore::handleArtistsAdd(const std::vector& artistsId) { - auto transaction {LmsApp->getDbSession().createSharedTransaction()}; - - Database::Track::pointer track {Database::Track::getById(session, trackId)}; - if (!track) - return {}; - - return {track.id()}; + tracksAdd.emit(getArtistsTracks(LmsApp->getDbSession(), artistsId, _filters->getClusterIds())); } void -Explore::handleArtistAdd(Database::IdType id) +Explore::handleArtistsPlay(const std::vector& artistsId) { - tracksAdd.emit(getArtistTracks(LmsApp->getDbSession(), id, _filters->getClusterIds())); + tracksPlay.emit(getArtistsTracks(LmsApp->getDbSession(), artistsId, _filters->getClusterIds())); } void -Explore::handleArtistPlay(Database::IdType id) +Explore::handleReleasesAdd(const std::vector& releasesId) { - tracksPlay.emit(getArtistTracks(LmsApp->getDbSession(), id, _filters->getClusterIds())); + tracksAdd.emit(getReleasesTracks(LmsApp->getDbSession(), releasesId, _filters->getClusterIds())); } void -Explore::handleReleaseAdd(Database::IdType id) +Explore::handleReleasesPlay(const std::vector& releasesId) { - tracksAdd.emit(getReleaseTracks(LmsApp->getDbSession(), id, _filters->getClusterIds())); + tracksPlay.emit(getReleasesTracks(LmsApp->getDbSession(), releasesId, _filters->getClusterIds())); } void -Explore::handleReleasePlay(Database::IdType id) +Explore::handleTracksAdd(const std::vector& tracksId) { - tracksPlay.emit(getReleaseTracks(LmsApp->getDbSession(), id, _filters->getClusterIds())); + tracksAdd.emit(tracksId); } void -Explore::handleTrackAdd(Database::IdType id) +Explore::handleTracksPlay(const std::vector& tracksId) { - tracksAdd.emit(getTrack(LmsApp->getDbSession(), id)); -} - -void -Explore::handleTrackPlay(Database::IdType id) -{ - tracksPlay.emit(getTrack(LmsApp->getDbSession(), id)); -} - -void -Explore::handleTracksAdd(const std::vector& trackIds) -{ - tracksAdd.emit(trackIds); -} - -void -Explore::handleTracksPlay(const std::vector& trackIds) -{ - tracksPlay.emit(trackIds); + tracksPlay.emit(tracksId); } } // namespace UserInterface diff --git a/src/ui/explore/Explore.hpp b/src/ui/explore/Explore.hpp index 8f84de3d..d6cf934e 100644 --- a/src/ui/explore/Explore.hpp +++ b/src/ui/explore/Explore.hpp @@ -37,14 +37,12 @@ class Explore : public Wt::WTemplate private: - void handleArtistAdd(Database::IdType artistId); - void handleArtistPlay(Database::IdType artistId); - void handleReleaseAdd(Database::IdType releaseId); - void handleReleasePlay(Database::IdType releaseId); - void handleTrackAdd(Database::IdType trackId); - void handleTrackPlay(Database::IdType trackId); - void handleTracksAdd(const std::vector& trackIds); - void handleTracksPlay(const std::vector& trackIds); + void handleArtistsAdd(const std::vector& artistsId); + void handleArtistsPlay(const std::vector& artistsId); + void handleReleasesAdd(const std::vector& releasesId); + void handleReleasesPlay(const std::vector& releasesId); + void handleTracksAdd(const std::vector& tracksId); + void handleTracksPlay(const std::vector& tracksId); Filters* _filters; }; diff --git a/src/ui/explore/ReleaseView.cpp b/src/ui/explore/ReleaseView.cpp index 7f8c6024..10a530b5 100644 --- a/src/ui/explore/ReleaseView.cpp +++ b/src/ui/explore/ReleaseView.cpp @@ -139,7 +139,7 @@ Release::refresh() Wt::WText* playBtn {t->bindNew("play-btn", Wt::WString::tr("Lms.Explore.template.play-btn"), Wt::TextFormat::XHTML)}; playBtn->clicked().connect([=] { - releasePlay.emit(*releaseId); + releasesPlay.emit({*releaseId}); }); } @@ -147,7 +147,7 @@ Release::refresh() Wt::WText* addBtn {t->bindNew("add-btn", Wt::WString::tr("Lms.Explore.template.add-btn"), Wt::TextFormat::XHTML)}; addBtn->clicked().connect([=] { - releaseAdd.emit(*releaseId); + releasesAdd.emit({*releaseId}); }); } @@ -196,13 +196,13 @@ Release::refresh() Wt::WText* playBtn {entry->bindNew("play-btn", Wt::WString::tr("Lms.Explore.template.play-btn"), Wt::TextFormat::XHTML)}; playBtn->clicked().connect(std::bind([=] { - trackPlay.emit(trackId); + tracksPlay.emit({trackId}); })); Wt::WText* addBtn {entry->bindNew("add-btn", Wt::WString::tr("Lms.Explore.template.add-btn"), Wt::TextFormat::XHTML)}; addBtn->clicked().connect(std::bind([=] { - trackAdd.emit(trackId); + tracksAdd.emit({trackId}); })); LmsApp->getEvents().trackLoaded.connect(entry, [=] (Database::IdType loadedTrackId, bool /*play*/) diff --git a/src/ui/explore/ReleaseView.hpp b/src/ui/explore/ReleaseView.hpp index 6423ce3c..0b5da712 100644 --- a/src/ui/explore/ReleaseView.hpp +++ b/src/ui/explore/ReleaseView.hpp @@ -32,11 +32,11 @@ class Release : public Wt::WContainerWidget public: Release(Filters* filters); - Wt::Signal releaseAdd; - Wt::Signal releasePlay; + Wt::Signal&> releasesAdd; + Wt::Signal&> releasesPlay; - Wt::Signal trackAdd; - Wt::Signal trackPlay; + Wt::Signal&> tracksAdd; + Wt::Signal&> tracksPlay; private: void refresh(); diff --git a/src/ui/explore/ReleasesView.cpp b/src/ui/explore/ReleasesView.cpp index 8d68c620..2d7fb179 100644 --- a/src/ui/explore/ReleasesView.cpp +++ b/src/ui/explore/ReleasesView.cpp @@ -48,10 +48,21 @@ _filters(filters) _search->setPlaceholderText(Wt::WString::tr("Lms.Explore.search-placeholder")); _search->textInput().connect(this, &Releases::refresh); + Wt::WText* playBtn {bindNew("play-btn", Wt::WString::tr("Lms.Explore.template.play-btn"), Wt::TextFormat::XHTML)}; + playBtn->clicked().connect([this] + { + releasesPlay.emit(getReleases()); + }); + Wt::WText* addBtn {bindNew("add-btn", Wt::WString::tr("Lms.Explore.template.add-btn"), Wt::TextFormat::XHTML)}; + addBtn->clicked().connect([this] + { + releasesAdd.emit(getReleases()); + }); + _container = bindNew("releases"); _showMore = bindNew("show-more", Wt::WString::tr("Lms.Explore.show-more")); - _showMore->clicked().connect([=] + _showMore->clicked().connect([this] { addSome(); }); @@ -71,17 +82,14 @@ Releases::refresh() void Releases::addSome() { - const auto searchKeywords {splitString(_search->text().toUTF8(), " ")}; - const auto clusterIds {_filters->getClusterIds()}; + bool moreResults {}; - auto transaction {LmsApp->getDbSession().createSharedTransaction()}; - - bool moreResults; - const auto releases {Release::getByFilter(LmsApp->getDbSession(), clusterIds, searchKeywords, _container->count(), 20, moreResults)}; - - for (const Database::Release::pointer& release : releases) + const auto releasesId {getReleases(_container->count(), 20, moreResults)}; + for (const Database::IdType releaseId : releasesId ) { - const Database::IdType releaseId {release.id()}; + auto transaction {LmsApp->getDbSession().createSharedTransaction()}; + + const Database::Release::pointer release {Database::Release::getById(LmsApp->getDbSession(), releaseId)}; Wt::WTemplate* entry = _container->addNew(Wt::WString::tr("Lms.Explore.Releases.template.entry")); entry->addFunction("tr", Wt::WTemplate::Functions::tr); @@ -113,18 +121,41 @@ Releases::addSome() Wt::WText* playBtn = entry->bindNew("play-btn", Wt::WString::tr("Lms.Explore.template.play-btn"), Wt::TextFormat::XHTML); playBtn->clicked().connect([=] { - releasePlay.emit(releaseId); + releasesPlay.emit({releaseId}); }); Wt::WText* addBtn = entry->bindNew("add-btn", Wt::WString::tr("Lms.Explore.template.add-btn"), Wt::TextFormat::XHTML); addBtn->clicked().connect([=] { - releaseAdd.emit(releaseId); + releasesAdd.emit({releaseId}); }); } _showMore->setHidden(!moreResults); } +std::vector +Releases::getReleases(boost::optional offset, boost::optional limit, bool& moreResults) const +{ + const auto searchKeywords {splitString(_search->text().toUTF8(), " ")}; + + auto transaction {LmsApp->getDbSession().createSharedTransaction()}; + + const auto releases {Release::getByFilter(LmsApp->getDbSession(), _filters->getClusterIds(), searchKeywords, offset, limit, moreResults)}; + + std::vector res; + for (const Database::Release::pointer& release : releases) + res.push_back(release.id()); + + return res; +} + +std::vector +Releases::getReleases() const +{ + bool moreResults; + return getReleases({}, {}, moreResults); +} + } // namespace UserInterface diff --git a/src/ui/explore/ReleasesView.hpp b/src/ui/explore/ReleasesView.hpp index b1cc979b..7868649f 100644 --- a/src/ui/explore/ReleasesView.hpp +++ b/src/ui/explore/ReleasesView.hpp @@ -19,6 +19,8 @@ #pragma once +#include + #include #include #include @@ -35,13 +37,16 @@ class Releases : public Wt::WTemplate public: Releases(Filters* filters); - Wt::Signal releaseAdd; - Wt::Signal releasePlay; + Wt::Signal&> releasesAdd; + Wt::Signal&> releasesPlay; private: void refresh(); void addSome(); + std::vector getReleases(boost::optional offset, boost::optional limit, bool& moreResults) const; + std::vector getReleases() const; + Filters* _filters; Wt::WPushButton* _showMore; Wt::WLineEdit* _search; diff --git a/src/ui/explore/TracksView.cpp b/src/ui/explore/TracksView.cpp index 04ef4d6b..cc30af6d 100644 --- a/src/ui/explore/TracksView.cpp +++ b/src/ui/explore/TracksView.cpp @@ -50,10 +50,10 @@ _filters(filters) _search->textInput().connect(this, &Tracks::refresh); Wt::WText* playBtn = bindNew("play-btn", Wt::WString::tr("Lms.Explore.template.play-btn"), Wt::TextFormat::XHTML); - playBtn->clicked().connect(std::bind([=] + playBtn->clicked().connect([=] { tracksPlay.emit(getTracks()); - })); + }); Wt::WText* addBtn = bindNew("add-btn", Wt::WString::tr("Lms.Explore.template.add-btn"), Wt::TextFormat::XHTML); addBtn->clicked().connect(std::bind([=] @@ -148,13 +148,13 @@ Tracks::addSome() Wt::WText* playBtn = entry->bindNew("play-btn", Wt::WString::tr("Lms.Explore.template.play-btn"), Wt::TextFormat::XHTML); playBtn->clicked().connect(std::bind([=] { - trackPlay.emit(trackId); + tracksPlay.emit({trackId}); })); Wt::WText* addBtn = entry->bindNew("add-btn", Wt::WString::tr("Lms.Explore.template.add-btn"), Wt::TextFormat::XHTML); addBtn->clicked().connect(std::bind([=] { - trackAdd.emit(trackId); + tracksAdd.emit({trackId}); })); } diff --git a/src/ui/explore/TracksView.hpp b/src/ui/explore/TracksView.hpp index 0efffec2..26345954 100644 --- a/src/ui/explore/TracksView.hpp +++ b/src/ui/explore/TracksView.hpp @@ -36,11 +36,8 @@ class Tracks : public Wt::WTemplate public: Tracks(Filters* filters); - Wt::Signal trackAdd; - Wt::Signal trackPlay; - - Wt::Signal> tracksAdd; - Wt::Signal> tracksPlay; + Wt::Signal&> tracksAdd; + Wt::Signal&> tracksPlay; private: void refresh();