Made the delete button work in the play queue
This commit is contained in:
+16
-13
@@ -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;
|
||||||
|
|||||||
@@ -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
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user