Made the delete button work in the play queue

This commit is contained in:
emeric
2018-03-17 18:22:10 +01:00
parent 74e0576d31
commit 7b0231da10
3 changed files with 54 additions and 36 deletions
+16 -13
View File
@@ -42,9 +42,13 @@ Playlist::create(Wt::Dbo::Session& session, std::string name, bool isPublic, Wt:
} }
PlaylistEntry::PlaylistEntry() PlaylistEntry::PlaylistEntry()
: _pos(0)
{ {
}
PlaylistEntry::pointer
PlaylistEntry::getById(Wt::Dbo::Session& session, PlaylistEntry::id_type id)
{
return session.find<PlaylistEntry>().where("id = ?").bind(id);
} }
Playlist::pointer Playlist::pointer
@@ -61,36 +65,35 @@ Playlist::getAll(Wt::Dbo::Session& session, Wt::Dbo::ptr<User> user)
return std::vector<Playlist::pointer>(res.begin(), res.end()); return std::vector<Playlist::pointer>(res.begin(), res.end());
} }
PlaylistEntry::PlaylistEntry(Wt::Dbo::ptr<Track> track, Wt::Dbo::ptr<Playlist> playlist, int pos) PlaylistEntry::PlaylistEntry(Wt::Dbo::ptr<Track> track, Wt::Dbo::ptr<Playlist> playlist)
: _pos(pos), : _track(track),
_track(track),
_playlist(playlist) _playlist(playlist)
{ {
} }
PlaylistEntry::pointer PlaylistEntry::pointer
PlaylistEntry::create(Wt::Dbo::Session& session, Wt::Dbo::ptr<Track> track, Wt::Dbo::ptr<Playlist> playlist, int pos) PlaylistEntry::create(Wt::Dbo::Session& session, Wt::Dbo::ptr<Track> track, Wt::Dbo::ptr<Playlist> playlist)
{ {
return session.add( new PlaylistEntry( track, playlist, pos) ); return session.add( new PlaylistEntry( track, playlist) );
} }
std::vector<Wt::Dbo::ptr<Track>> std::vector<Wt::Dbo::ptr<PlaylistEntry>>
Playlist::getTracks(int offset, int size, bool& moreResults) const Playlist::getEntries(int offset, int size, bool& moreResults) const
{ {
assert(session()); assert(session());
moreResults = false; moreResults = false;
Wt::Dbo::collection<Wt::Dbo::ptr<PlaylistEntry>> entries Wt::Dbo::collection<Wt::Dbo::ptr<PlaylistEntry>> entries =
= session()->find<PlaylistEntry>() session()->find<PlaylistEntry>()
.where("playlist_id = ?").bind(self().id()) .where("playlist_id = ?").bind(self().id())
.orderBy("pos") .orderBy("id")
.limit(size != -1 ? size + 1 : -1) .limit(size != -1 ? size + 1 : -1)
.offset(offset); .offset(offset);
std::vector<Wt::Dbo::ptr<Track>> res; std::vector<Wt::Dbo::ptr<PlaylistEntry>> res;
for (auto entry : entries) for (auto entry : entries)
{ {
@@ -100,7 +103,7 @@ Playlist::getTracks(int offset, int size, bool& moreResults) const
break; break;
} }
res.push_back(entry->getTrack()); res.push_back(entry);
} }
return res; return res;
+9 -8
View File
@@ -33,7 +33,7 @@ class Track;
class Playlist : public Wt::Dbo::Dbo<Playlist> class Playlist : public Wt::Dbo::Dbo<Playlist>
{ {
public: public:
typedef Wt::Dbo::ptr<Playlist> pointer; using pointer = Wt::Dbo::ptr<Playlist>;
Playlist(); Playlist();
Playlist(std::string name, bool isPublic, Wt::Dbo::ptr<User> user); Playlist(std::string name, bool isPublic, Wt::Dbo::ptr<User> user);
@@ -54,7 +54,7 @@ class Playlist : public Wt::Dbo::Dbo<Playlist>
// Get tracks, ordered by position // Get tracks, ordered by position
std::size_t getCount() const; std::size_t getCount() const;
std::vector<Wt::Dbo::ptr<Track>> getTracks(int offset, int size, bool& moreResults) const; std::vector<Wt::Dbo::ptr<PlaylistEntry>> getEntries(int offset, int size, bool& moreResults) const;
template<class Action> template<class Action>
void persist(Action& a) void persist(Action& a)
@@ -78,28 +78,29 @@ class PlaylistEntry
{ {
public: public:
typedef Wt::Dbo::ptr<PlaylistEntry> pointer; using pointer = Wt::Dbo::ptr<PlaylistEntry>;
using id_type = Wt::Dbo::dbo_traits<PlaylistEntry>::IdType;
PlaylistEntry(); PlaylistEntry();
PlaylistEntry(Wt::Dbo::ptr<Track> track, Wt::Dbo::ptr<Playlist> playlist, int position); PlaylistEntry(Wt::Dbo::ptr<Track> track, Wt::Dbo::ptr<Playlist> playlist);
static pointer getById(Wt::Dbo::Session& session, id_type id);
// Create utility // Create utility
static pointer create(Wt::Dbo::Session& session, Wt::Dbo::ptr<Track> track, Wt::Dbo::ptr<Playlist> playlist, int position); static pointer create(Wt::Dbo::Session& session, Wt::Dbo::ptr<Track> track, Wt::Dbo::ptr<Playlist> playlist);
// Accesors // Accessors
Wt::Dbo::ptr<Track> getTrack() const { return _track; } Wt::Dbo::ptr<Track> getTrack() const { return _track; }
template<class Action> template<class Action>
void persist(Action& a) void persist(Action& a)
{ {
Wt::Dbo::field(a, _pos, "pos");
Wt::Dbo::belongsTo(a, _track, "track", Wt::Dbo::OnDeleteCascade); Wt::Dbo::belongsTo(a, _track, "track", Wt::Dbo::OnDeleteCascade);
Wt::Dbo::belongsTo(a, _playlist, "playlist", Wt::Dbo::OnDeleteCascade); Wt::Dbo::belongsTo(a, _playlist, "playlist", Wt::Dbo::OnDeleteCascade);
} }
private: private:
int _pos;
Wt::Dbo::ptr<Track> _track; Wt::Dbo::ptr<Track> _track;
Wt::Dbo::ptr<Playlist> _playlist; Wt::Dbo::ptr<Playlist> _playlist;
}; };
+29 -15
View File
@@ -53,12 +53,21 @@ PlayQueue::PlayQueue(Wt::WContainerWidget* parent)
_showMore->setHidden(true); _showMore->setHidden(true);
container->bindWidget("show-more", _showMore); 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([=] _showMore->clicked().connect(std::bind([=]
{ {
addSome(); addSome();
})); }));
refresh(); refresh();
} }
void void
@@ -70,16 +79,9 @@ PlayQueue::addTracks(const std::vector<Database::Track::pointer>& tracks)
LMS_LOG(UI, DEBUG) << "Adding tracks to the current queue"; LMS_LOG(UI, DEBUG) << "Adding tracks to the current queue";
auto playlist = Database::Playlist::get(DboSession(), currentPlayQueueName, CurrentUser()); 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) for (auto track : tracks)
{ Database::PlaylistEntry::create(DboSession(), track, playlist);
Database::PlaylistEntry::create(DboSession(), track, playlist, pos++);
}
addSome(); addSome();
} }
@@ -116,13 +118,14 @@ PlayQueue::addSome()
Wt::Dbo::Transaction transaction (DboSession()); Wt::Dbo::Transaction transaction (DboSession());
auto playlist = Database::Playlist::get(DboSession(), currentPlayQueueName, CurrentUser()); auto playlist = Database::Playlist::get(DboSession(), currentPlayQueueName, CurrentUser());
if (!playlist)
return;
bool moreResults; bool moreResults;
auto tracks = playlist->getTracks(_entriesContainer->count(), 50, moreResults); auto playlistEntries = playlist->getEntries(_entriesContainer->count(), 50, moreResults);
for (auto track : tracks) 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); Wt::WTemplate* entry = new Wt::WTemplate(Wt::WString::tr("Lms.PlayQueue.template.entry"), _entriesContainer);
entry->bindString("name", Wt::WString::fromUTF8(track->getName()), Wt::PlainText); entry->bindString("name", Wt::WString::fromUTF8(track->getName()), Wt::PlainText);
@@ -150,9 +153,20 @@ PlayQueue::addSome()
entry->bindWidget("play-btn", playBtn); entry->bindWidget("play-btn", playBtn);
// TODO // TODO
auto addBtn = new Wt::WText(Wt::WString::tr("Lms.PlayQueue.delete"), Wt::XHTMLText); auto delBtn = new Wt::WText(Wt::WString::tr("Lms.PlayQueue.delete"), Wt::XHTMLText);
entry->bindWidget("del-btn", addBtn); entry->bindWidget("del-btn", delBtn);
// TODO 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); _showMore->setHidden(!moreResults);