Added some logic in the playqueue (play next / play previous handling)

This commit is contained in:
emeric
2018-03-19 13:45:09 +01:00
parent 50036c8918
commit 5006a82ce6
8 changed files with 163 additions and 188 deletions
+88 -1
View File
@@ -75,6 +75,8 @@ PlayQueue::PlayQueue(Wt::WContainerWidget* parent)
auto playlist = Database::Playlist::get(DboSession(), currentPlayQueueName, CurrentUser());
if (!playlist)
playlist = Database::Playlist::create(DboSession(), currentPlayQueueName, false, CurrentUser());
_trackPos = CurrentUser()->getCurPlayingTrackPos();
}
_showMore->clicked().connect(std::bind([=]
@@ -86,6 +88,63 @@ PlayQueue::PlayQueue(Wt::WContainerWidget* parent)
addSome();
}
void
PlayQueue::stop()
{
updateCurrentTrack(false);
_trackPos.reset();
}
void
PlayQueue::play(std::size_t pos)
{
updateCurrentTrack(false);
Database::Track::id_type trackId;
{
Wt::Dbo::Transaction transaction(DboSession());
auto playlist = Database::Playlist::get(DboSession(), currentPlayQueueName, CurrentUser());
// If out of range, stop playing
if (pos >= playlist->getCount())
{
stop();
return;
}
_trackPos = pos;
trackId = playlist->getEntry(*_trackPos)->getTrack().id();
updateCurrentTrack(true);
}
playTrack.emit(trackId);
}
void
PlayQueue::playPrevious()
{
if (!_trackPos)
return;
if (*_trackPos == 0)
stop();
else
play(*_trackPos - 1);
}
void
PlayQueue::playNext()
{
if (!_trackPos)
{
play(0);
return;
}
play(*_trackPos + 1);
}
void
PlayQueue::updateInfo()
{
@@ -95,6 +154,22 @@ PlayQueue::updateInfo()
_nbTracks->setText(Wt::WString::tr("Lms.PlayQueue.nb-tracks").arg(playlist->getCount()));
}
void
PlayQueue::updateCurrentTrack(bool selected)
{
if (!_trackPos || *_trackPos >= static_cast<std::size_t>(_entriesContainer->count()))
return;
auto track = _entriesContainer->widget(*_trackPos);
if (track)
{
if (selected)
track->addStyleClass("Lms-playqueue-selected");
else
track->removeStyleClass("Lms-playqueue-selected");
}
}
void
PlayQueue::addTracks(const std::vector<Database::Track::pointer>& tracks)
{
@@ -169,7 +244,12 @@ PlayQueue::addSome()
auto playBtn = new Wt::WText(Wt::WString::tr("Lms.PlayQueue.play"), Wt::XHTMLText);
entry->bindWidget("play-btn", playBtn);
// TODO
playBtn->clicked().connect(std::bind([=]
{
auto pos = _entriesContainer->indexOf(entry);
if (pos >= 0)
play(pos);
}));
auto delBtn = new Wt::WText(Wt::WString::tr("Lms.PlayQueue.delete"), Wt::XHTMLText);
entry->bindWidget("del-btn", delBtn);
@@ -183,6 +263,13 @@ PlayQueue::addSome()
entryToRemove.remove();
}
if (_trackPos)
{
auto pos = _entriesContainer->indexOf(entry);
if (pos > 0 && *_trackPos >= static_cast<std::size_t>(pos))
(*_trackPos)--;
}
_entriesContainer->removeWidget(entry);
updateInfo();