From 7b0231da106cd8f99c9294e3a0b592b54f8d4b38 Mon Sep 17 00:00:00 2001 From: emeric Date: Sat, 17 Mar 2018 18:22:10 +0100 Subject: [PATCH] Made the delete button work in the play queue --- src/database/Playlist.cpp | 29 ++++++++++++++------------ src/database/Playlist.hpp | 17 ++++++++------- src/ui/PlayQueueView.cpp | 44 ++++++++++++++++++++++++++------------- 3 files changed, 54 insertions(+), 36 deletions(-) diff --git a/src/database/Playlist.cpp b/src/database/Playlist.cpp index c5b2e125..d22e3ff2 100644 --- a/src/database/Playlist.cpp +++ b/src/database/Playlist.cpp @@ -42,9 +42,13 @@ Playlist::create(Wt::Dbo::Session& session, std::string name, bool isPublic, Wt: } PlaylistEntry::PlaylistEntry() -: _pos(0) { +} +PlaylistEntry::pointer +PlaylistEntry::getById(Wt::Dbo::Session& session, PlaylistEntry::id_type id) +{ + return session.find().where("id = ?").bind(id); } Playlist::pointer @@ -61,36 +65,35 @@ Playlist::getAll(Wt::Dbo::Session& session, Wt::Dbo::ptr user) return std::vector(res.begin(), res.end()); } -PlaylistEntry::PlaylistEntry(Wt::Dbo::ptr track, Wt::Dbo::ptr playlist, int pos) -: _pos(pos), - _track(track), +PlaylistEntry::PlaylistEntry(Wt::Dbo::ptr track, Wt::Dbo::ptr playlist) +: _track(track), _playlist(playlist) { } PlaylistEntry::pointer -PlaylistEntry::create(Wt::Dbo::Session& session, Wt::Dbo::ptr track, Wt::Dbo::ptr playlist, int pos) +PlaylistEntry::create(Wt::Dbo::Session& session, Wt::Dbo::ptr track, Wt::Dbo::ptr playlist) { - return session.add( new PlaylistEntry( track, playlist, pos) ); + return session.add( new PlaylistEntry( track, playlist) ); } -std::vector> -Playlist::getTracks(int offset, int size, bool& moreResults) const +std::vector> +Playlist::getEntries(int offset, int size, bool& moreResults) const { assert(session()); moreResults = false; - Wt::Dbo::collection> entries - = session()->find() + Wt::Dbo::collection> entries = + session()->find() .where("playlist_id = ?").bind(self().id()) - .orderBy("pos") + .orderBy("id") .limit(size != -1 ? size + 1 : -1) .offset(offset); - std::vector> res; + std::vector> res; for (auto entry : entries) { @@ -100,7 +103,7 @@ Playlist::getTracks(int offset, int size, bool& moreResults) const break; } - res.push_back(entry->getTrack()); + res.push_back(entry); } return res; diff --git a/src/database/Playlist.hpp b/src/database/Playlist.hpp index 0acc41b8..1c43cde8 100644 --- a/src/database/Playlist.hpp +++ b/src/database/Playlist.hpp @@ -33,7 +33,7 @@ class Track; class Playlist : public Wt::Dbo::Dbo { public: - typedef Wt::Dbo::ptr pointer; + using pointer = Wt::Dbo::ptr; Playlist(); Playlist(std::string name, bool isPublic, Wt::Dbo::ptr user); @@ -54,7 +54,7 @@ class Playlist : public Wt::Dbo::Dbo // Get tracks, ordered by position std::size_t getCount() const; - std::vector> getTracks(int offset, int size, bool& moreResults) const; + std::vector> getEntries(int offset, int size, bool& moreResults) const; template void persist(Action& a) @@ -78,28 +78,29 @@ class PlaylistEntry { public: - typedef Wt::Dbo::ptr pointer; + using pointer = Wt::Dbo::ptr; + using id_type = Wt::Dbo::dbo_traits::IdType; PlaylistEntry(); - PlaylistEntry(Wt::Dbo::ptr track, Wt::Dbo::ptr playlist, int position); + PlaylistEntry(Wt::Dbo::ptr track, Wt::Dbo::ptr playlist); + + static pointer getById(Wt::Dbo::Session& session, id_type id); // Create utility - static pointer create(Wt::Dbo::Session& session, Wt::Dbo::ptr track, Wt::Dbo::ptr playlist, int position); + static pointer create(Wt::Dbo::Session& session, Wt::Dbo::ptr track, Wt::Dbo::ptr playlist); - // Accesors + // Accessors Wt::Dbo::ptr getTrack() const { return _track; } template void persist(Action& a) { - Wt::Dbo::field(a, _pos, "pos"); Wt::Dbo::belongsTo(a, _track, "track", Wt::Dbo::OnDeleteCascade); Wt::Dbo::belongsTo(a, _playlist, "playlist", Wt::Dbo::OnDeleteCascade); } private: - int _pos; Wt::Dbo::ptr _track; Wt::Dbo::ptr _playlist; }; diff --git a/src/ui/PlayQueueView.cpp b/src/ui/PlayQueueView.cpp index 754e2c67..9991b056 100644 --- a/src/ui/PlayQueueView.cpp +++ b/src/ui/PlayQueueView.cpp @@ -53,12 +53,21 @@ PlayQueue::PlayQueue(Wt::WContainerWidget* parent) _showMore->setHidden(true); container->bindWidget("show-more", _showMore); + { + Wt::Dbo::Transaction transaction (DboSession()); + + auto playlist = Database::Playlist::get(DboSession(), currentPlayQueueName, CurrentUser()); + if (!playlist) + playlist = Database::Playlist::create(DboSession(), currentPlayQueueName, false, CurrentUser()); + } + _showMore->clicked().connect(std::bind([=] { addSome(); })); refresh(); + } void @@ -70,16 +79,9 @@ PlayQueue::addTracks(const std::vector& tracks) LMS_LOG(UI, DEBUG) << "Adding tracks to the current queue"; auto playlist = Database::Playlist::get(DboSession(), currentPlayQueueName, CurrentUser()); - if (!playlist) - { - playlist = Database::Playlist::create(DboSession(), currentPlayQueueName, false, CurrentUser()); - } - std::size_t pos = playlist->getCount(); for (auto track : tracks) - { - Database::PlaylistEntry::create(DboSession(), track, playlist, pos++); - } + Database::PlaylistEntry::create(DboSession(), track, playlist); addSome(); } @@ -116,13 +118,14 @@ PlayQueue::addSome() Wt::Dbo::Transaction transaction (DboSession()); auto playlist = Database::Playlist::get(DboSession(), currentPlayQueueName, CurrentUser()); - if (!playlist) - return; bool moreResults; - auto tracks = playlist->getTracks(_entriesContainer->count(), 50, moreResults); - for (auto track : tracks) + auto playlistEntries = playlist->getEntries(_entriesContainer->count(), 50, moreResults); + for (auto playlistEntry : playlistEntries) { + auto playlistEntryId = playlistEntry.id(); + auto track = playlistEntry->getTrack(); + Wt::WTemplate* entry = new Wt::WTemplate(Wt::WString::tr("Lms.PlayQueue.template.entry"), _entriesContainer); entry->bindString("name", Wt::WString::fromUTF8(track->getName()), Wt::PlainText); @@ -150,9 +153,20 @@ PlayQueue::addSome() entry->bindWidget("play-btn", playBtn); // TODO - auto addBtn = new Wt::WText(Wt::WString::tr("Lms.PlayQueue.delete"), Wt::XHTMLText); - entry->bindWidget("del-btn", addBtn); - // TODO + auto delBtn = new Wt::WText(Wt::WString::tr("Lms.PlayQueue.delete"), Wt::XHTMLText); + entry->bindWidget("del-btn", delBtn); + delBtn->clicked().connect(std::bind([=] + { + // Remove the entry n both the widget tree and the playqueue + { + Wt::Dbo::Transaction transaction (DboSession()); + + auto entryToRemove = Database::PlaylistEntry::getById(DboSession(), playlistEntryId); + entryToRemove.remove(); + } + + _entriesContainer->removeWidget(entry); + })); } _showMore->setHidden(!moreResults);