From aa54b5b5993df89c7b6dcfbef34da6e624199230 Mon Sep 17 00:00:00 2001 From: emeric Date: Sun, 25 Feb 2018 08:57:05 +0100 Subject: [PATCH] Added a play/add all on tracks view --- approot/tracks.xml | 1 + src/database/DbArtist.cpp | 4 +++- src/database/Playlist.cpp | 12 ++++++------ src/database/Playlist.hpp | 2 +- src/database/Release.cpp | 4 +++- src/database/Track.cpp | 13 ++++++++++++- src/database/Track.hpp | 2 ++ src/ui/Explore.cpp | 14 ++++++++++++++ src/ui/Explore.hpp | 2 ++ src/ui/PlaylistView.cpp | 4 ++-- src/ui/TracksView.cpp | 38 ++++++++++++++++++++++++++++++++------ src/ui/TracksView.hpp | 6 ++++++ 12 files changed, 84 insertions(+), 18 deletions(-) diff --git a/approot/tracks.xml b/approot/tracks.xml index 823e6fb9..ef3d7320 100644 --- a/approot/tracks.xml +++ b/approot/tracks.xml @@ -6,6 +6,7 @@
diff --git a/src/database/DbArtist.cpp b/src/database/DbArtist.cpp index bce519e2..32654f5e 100644 --- a/src/database/DbArtist.cpp +++ b/src/database/DbArtist.cpp @@ -120,7 +120,9 @@ Artist::getByFilter(Wt::Dbo::Session& session, const std::vector keywords, int offset, int size, bool& moreResults) { - Wt::Dbo::collection collection = getQuery(session, clusters, keywords).limit(size + 1).offset(offset); + Wt::Dbo::collection collection = getQuery(session, clusters, keywords) + .limit(size != -1 ? size + 1 : -1) + .offset(offset); auto res = std::vector(collection.begin(), collection.end()); diff --git a/src/database/Playlist.cpp b/src/database/Playlist.cpp index 24e8e68b..47e259b3 100644 --- a/src/database/Playlist.cpp +++ b/src/database/Playlist.cpp @@ -61,12 +61,6 @@ Playlist::getAll(Wt::Dbo::Session& session, Wt::Dbo::ptr user) return std::vector(res.begin(), res.end()); } -void -Playlist::addTrack(Wt::Dbo::ptr track) -{ - _entries.insert( PlaylistEntry::create(*session(), track, self(), _entries.size()) ); -} - PlaylistEntry::PlaylistEntry(Wt::Dbo::ptr track, Wt::Dbo::ptr playlist, int pos) : _pos(pos), _track(track), @@ -107,4 +101,10 @@ Playlist::getTracks(int offset, int size, bool& moreResults) const return res; } +std::size_t +Playlist::getCount() const +{ + return _entries.size(); +} + } // namespace Database diff --git a/src/database/Playlist.hpp b/src/database/Playlist.hpp index 816e4098..0acc41b8 100644 --- a/src/database/Playlist.hpp +++ b/src/database/Playlist.hpp @@ -50,10 +50,10 @@ class Playlist : public Wt::Dbo::Dbo bool isPublic() const { return _isPublic; } // Modifiers - void addTrack(Wt::Dbo::ptr track); void clear() { _entries.clear(); } // Get tracks, ordered by position + std::size_t getCount() const; std::vector> getTracks(int offset, int size, bool& moreResults) const; template diff --git a/src/database/Release.cpp b/src/database/Release.cpp index 0e902da8..134db031 100644 --- a/src/database/Release.cpp +++ b/src/database/Release.cpp @@ -118,7 +118,9 @@ Release::getByFilter(Wt::Dbo::Session& session, const std::vector keywords, int offset, int size, bool& moreResults) { - Wt::Dbo::collection collection = getQuery(session, clusterIds, keywords).limit(size + 1).offset(offset); + Wt::Dbo::collection collection = getQuery(session, clusterIds, keywords) + .limit(size != -1 ? size + 1 : -1) + .offset(offset); auto res = std::vector(collection.begin(), collection.end()); diff --git a/src/database/Track.cpp b/src/database/Track.cpp index efd5944a..5853a293 100644 --- a/src/database/Track.cpp +++ b/src/database/Track.cpp @@ -169,7 +169,9 @@ Track::getByFilter(Wt::Dbo::Session& session, const std::vector keywords, int offset, int size, bool& moreResults) { - Wt::Dbo::collection collection = getQuery(session, clusterIds, keywords).limit(size + 1).offset(offset); + Wt::Dbo::collection collection = getQuery(session, clusterIds, keywords) + .limit(size != -1 ? size + 1 : -1) + .offset(offset); auto res = std::vector(collection.begin(), collection.end()); @@ -184,6 +186,15 @@ Track::getByFilter(Wt::Dbo::Session& session, return res; } +std::vector +Track::getByFilter(Wt::Dbo::Session& session, + const std::set& clusters) +{ + bool moreResults; + + return getByFilter(session, clusters, std::vector(), -1, -1, moreResults); +} + boost::optional Track::getTrackNumber(void) const { diff --git a/src/database/Track.hpp b/src/database/Track.hpp index 01a1566c..7c0f1bc2 100644 --- a/src/database/Track.hpp +++ b/src/database/Track.hpp @@ -118,6 +118,8 @@ class Track static pointer getByPath(Wt::Dbo::Session& session, const boost::filesystem::path& p); static pointer getById(Wt::Dbo::Session& session, id_type id); static pointer getByMBID(Wt::Dbo::Session& session, const std::string& MBID); + static std::vector getByFilter(Wt::Dbo::Session& session, + const std::set& clusters); // tracks that belong to these clusters static std::vector getByFilter(Wt::Dbo::Session& session, const std::set& clusters, // tracks that belong to these clusters const std::vector keywords, // name must match all of these keywords diff --git a/src/ui/Explore.cpp b/src/ui/Explore.cpp index fcd41278..7a8d463c 100644 --- a/src/ui/Explore.cpp +++ b/src/ui/Explore.cpp @@ -115,6 +115,8 @@ Explore::Explore(Wt::WContainerWidget* parent) tracks->trackAdd.connect(this, &Explore::handleTrackAdd); tracks->trackPlay.connect(this, &Explore::handleTrackPlay); + tracks->tracksAdd.connect(this, &Explore::handleTracksAdd); + tracks->tracksPlay.connect(this, &Explore::handleTracksPlay); wApp->internalPathChanged().connect(std::bind([=] @@ -218,5 +220,17 @@ Explore::handleTrackPlay(Database::id_type id) tracksPlay.emit(getTrack(DboSession(), id)); } +void +Explore::handleTracksAdd(std::vector tracks) +{ + tracksAdd.emit(tracks); +} + +void +Explore::handleTracksPlay(std::vector tracks) +{ + tracksPlay.emit(tracks); +} + } // namespace UserInterface diff --git a/src/ui/Explore.hpp b/src/ui/Explore.hpp index 0e04a967..3c0dd136 100644 --- a/src/ui/Explore.hpp +++ b/src/ui/Explore.hpp @@ -43,6 +43,8 @@ class Explore : public Wt::WContainerWidget void handleReleasePlay(Database::id_type id); void handleTrackAdd(Database::id_type id); void handleTrackPlay(Database::id_type id); + void handleTracksAdd(std::vector tracks); + void handleTracksPlay(std::vector tracks); Filters* _filters; }; diff --git a/src/ui/PlaylistView.cpp b/src/ui/PlaylistView.cpp index a5fef657..b7a74384 100644 --- a/src/ui/PlaylistView.cpp +++ b/src/ui/PlaylistView.cpp @@ -70,9 +70,10 @@ Playlist::addTracks(const std::vector& tracks) playlist = Database::Playlist::create(DboSession(), currentPlaylistName, false, CurrentUser()); } + std::size_t pos = playlist->getCount(); for (auto track : tracks) { - playlist.modify()->addTrack(track); + Database::PlaylistEntry::create(DboSession(), track, playlist, pos++); } addSome(); @@ -133,7 +134,6 @@ Playlist::addSome() if (release) { entry->setCondition("if-has-release", true); - // TODO anchor Wt::WAnchor *releaseAnchor = new Wt::WAnchor(Wt::WLink(Wt::WLink::InternalPath, "/release/" + std::to_string(track->getRelease().id()))); Wt::WText *releaseText = new Wt::WText(releaseAnchor); releaseText->setText(Wt::WString::fromUTF8(release->getName(), Wt::PlainText)); diff --git a/src/ui/TracksView.cpp b/src/ui/TracksView.cpp index cbfd45a8..8240986d 100644 --- a/src/ui/TracksView.cpp +++ b/src/ui/TracksView.cpp @@ -47,6 +47,20 @@ Tracks::Tracks(Filters* filters, Wt::WContainerWidget* parent) _search->setPlaceholderText(Wt::WString::tr("msg-search-placeholder")); _search->textInput().connect(this, &Tracks::refresh); + auto playBtn = new Wt::WText(Wt::WString::tr("btn-tracks-play-btn"), Wt::XHTMLText); + container->bindWidget("play-btn", playBtn); + playBtn->clicked().connect(std::bind([=] + { + tracksPlay.emit(getTracks()); + })); + + auto addBtn = new Wt::WText(Wt::WString::tr("btn-tracks-add-btn"), Wt::XHTMLText); + container->bindWidget("add-btn", addBtn); + addBtn->clicked().connect(std::bind([=] + { + tracksAdd.emit(getTracks()); + })); + _tracksContainer = new Wt::WContainerWidget(); container->bindWidget("tracks", _tracksContainer); @@ -64,6 +78,23 @@ Tracks::Tracks(Filters* filters, Wt::WContainerWidget* parent) filters->updated().connect(this, &Tracks::refresh); } +std::vector +Tracks::getTracks(int offset, int size, bool& moreResults) +{ + auto searchKeywords = splitString(_search->text().toUTF8(), " "); + auto clusterIds = _filters->getClusterIds(); + + Wt::Dbo::Transaction transaction(DboSession()); + + return Track::getByFilter(DboSession(), clusterIds, searchKeywords, offset, size, moreResults); +} + +std::vector +Tracks::getTracks() +{ + bool moreResults; + return getTracks(-1, -1, moreResults); +} void Tracks::refresh() @@ -75,14 +106,10 @@ Tracks::refresh() void Tracks::addSome() { - auto searchKeywords = splitString(_search->text().toUTF8(), " "); - - auto clusterIds = _filters->getClusterIds(); - Wt::Dbo::Transaction transaction(DboSession()); bool moreResults; - auto tracks = Track::getByFilter(DboSession(), clusterIds, searchKeywords, _tracksContainer->count(), 20, moreResults); + auto tracks = getTracks(_tracksContainer->count(), 20, moreResults); for (auto track : tracks) { @@ -105,7 +132,6 @@ Tracks::addSome() if (release) { entry->setCondition("if-has-release", true); - // TODO anchor Wt::WAnchor *releaseAnchor = new Wt::WAnchor(Wt::WLink(Wt::WLink::InternalPath, "/release/" + std::to_string(track->getRelease().id()))); Wt::WText *releaseText = new Wt::WText(releaseAnchor); releaseText->setText(Wt::WString::fromUTF8(release->getName(), Wt::PlainText)); diff --git a/src/ui/TracksView.hpp b/src/ui/TracksView.hpp index 3f949770..9b7e1c5c 100644 --- a/src/ui/TracksView.hpp +++ b/src/ui/TracksView.hpp @@ -34,10 +34,16 @@ class Tracks : public Wt::WContainerWidget Wt::Signal trackAdd; Wt::Signal trackPlay; + Wt::Signal> tracksAdd; + Wt::Signal> tracksPlay; + private: void refresh(); void addSome(); + std::vector getTracks(int offset, int size, bool& moreResults); + std::vector getTracks(); + Wt::WContainerWidget* _tracksContainer; Wt::WTemplate* _showMore; Wt::WLineEdit* _search;