Minor refacto + limit the number of tracks/releases we can put at once in the playqueue
This commit is contained in:
@@ -6,7 +6,7 @@ add_executable(lms
|
||||
ui/LmsApplicationGroup.cpp
|
||||
ui/LmsTheme.cpp
|
||||
ui/MediaPlayer.cpp
|
||||
ui/PlayQueueView.cpp
|
||||
ui/PlayQueue.cpp
|
||||
ui/SettingsView.cpp
|
||||
ui/TrackStringUtils.cpp
|
||||
ui/admin/DatabaseSettingsView.cpp
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
#include "LmsApplicationException.hpp"
|
||||
#include "LmsTheme.hpp"
|
||||
#include "MediaPlayer.hpp"
|
||||
#include "PlayQueueView.hpp"
|
||||
#include "PlayQueue.hpp"
|
||||
#include "SettingsView.hpp"
|
||||
|
||||
|
||||
@@ -485,17 +485,11 @@ LmsApplication::createHome()
|
||||
mainStack->addNew<UserView>();
|
||||
}
|
||||
|
||||
explore->tracksAdd.connect([=] (const std::vector<Database::IdType>& trackIds)
|
||||
explore->tracksAction.connect([playqueue] (PlayQueueAction action, const std::vector<Database::IdType>& trackIds)
|
||||
{
|
||||
playqueue->addTracks(trackIds);
|
||||
playqueue->processTracks(action, trackIds);
|
||||
});
|
||||
|
||||
explore->tracksPlay.connect([=] (const std::vector<Database::IdType>& trackIds)
|
||||
{
|
||||
playqueue->playTracks(trackIds);
|
||||
});
|
||||
|
||||
|
||||
// Events from MediaPlayer
|
||||
_mediaPlayer->playNext.connect([=]
|
||||
{
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
* along with LMS. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "PlayQueueView.hpp"
|
||||
#include "PlayQueue.hpp"
|
||||
|
||||
#include <Wt/WText.h>
|
||||
#include <Wt/WText.h>
|
||||
@@ -327,20 +327,27 @@ PlayQueue::enqueueTrack(Database::IdType trackId)
|
||||
}
|
||||
|
||||
void
|
||||
PlayQueue::addTracks(const std::vector<Database::IdType>& trackIds)
|
||||
PlayQueue::processTracks(PlayQueueAction action, const std::vector<Database::IdType>& trackIds)
|
||||
{
|
||||
enqueueTracks(trackIds);
|
||||
LmsApp->notifyMsg(MsgType::Info, Wt::WString::trn("Lms.PlayQueue.nb-tracks-added", trackIds.size()).arg(trackIds.size()), std::chrono::milliseconds(2000));
|
||||
}
|
||||
switch (action)
|
||||
{
|
||||
case PlayQueueAction::AddLast:
|
||||
enqueueTracks(trackIds);
|
||||
LmsApp->notifyMsg(MsgType::Info, Wt::WString::trn("Lms.PlayQueue.nb-tracks-added", trackIds.size()).arg(trackIds.size()), std::chrono::milliseconds(2000));
|
||||
break;
|
||||
|
||||
void
|
||||
PlayQueue::playTracks(const std::vector<Database::IdType>& trackIds)
|
||||
{
|
||||
clearTracks();
|
||||
enqueueTracks(trackIds);
|
||||
loadTrack(0, true);
|
||||
case PlayQueueAction::AddNext:
|
||||
break;
|
||||
|
||||
LmsApp->notifyMsg(MsgType::Info, Wt::WString::trn("Lms.PlayQueue.nb-tracks-playing", trackIds.size()).arg(trackIds.size()), std::chrono::milliseconds(2000));
|
||||
case PlayQueueAction::Play:
|
||||
clearTracks();
|
||||
enqueueTracks(trackIds);
|
||||
loadTrack(0, true);
|
||||
|
||||
LmsApp->notifyMsg(MsgType::Info, Wt::WString::trn("Lms.PlayQueue.nb-tracks-playing", trackIds.size()).arg(trackIds.size()), std::chrono::milliseconds(2000));
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
@@ -27,6 +27,7 @@
|
||||
#include <Wt/WText.h>
|
||||
|
||||
#include "database/Types.hpp"
|
||||
#include "PlayQueueAction.hpp"
|
||||
|
||||
namespace Similarity {
|
||||
class Finder;
|
||||
@@ -44,8 +45,7 @@ class PlayQueue : public Wt::WTemplate
|
||||
public:
|
||||
PlayQueue();
|
||||
|
||||
void addTracks(const std::vector<Database::IdType>& trackIds);
|
||||
void playTracks(const std::vector<Database::IdType>& trackIds);
|
||||
void processTracks(PlayQueueAction action, const std::vector<Database::IdType>& trackIds);
|
||||
|
||||
// play the next track in the queue
|
||||
void playNext();
|
||||
@@ -0,0 +1,33 @@
|
||||
/*
|
||||
* Copyright (C) 2020 Emeric Poupon
|
||||
*
|
||||
* This file is part of LMS.
|
||||
*
|
||||
* LMS is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* LMS is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with LMS. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
namespace UserInterface
|
||||
{
|
||||
|
||||
enum class PlayQueueAction
|
||||
{
|
||||
Play,
|
||||
AddNext,
|
||||
AddLast,
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -110,7 +110,7 @@ Artist::refreshView()
|
||||
|
||||
playBtn->clicked().connect([=]
|
||||
{
|
||||
artistsPlay.emit({*artistId});
|
||||
artistsAction.emit(PlayQueueAction::Play, {*artistId});
|
||||
});
|
||||
}
|
||||
|
||||
@@ -119,7 +119,7 @@ Artist::refreshView()
|
||||
|
||||
addBtn->clicked().connect([=]
|
||||
{
|
||||
artistsAdd.emit({*artistId});
|
||||
artistsAction.emit(PlayQueueAction::AddLast, {*artistId});
|
||||
});
|
||||
}
|
||||
|
||||
@@ -185,13 +185,13 @@ Artist::createRelease(const Database::Artist::pointer& artist, const Release::po
|
||||
Wt::WText* playBtn = entry->bindNew<Wt::WText>("play-btn", Wt::WString::tr("Lms.Explore.template.play-btn"), Wt::TextFormat::XHTML);
|
||||
playBtn->clicked().connect([=]
|
||||
{
|
||||
releasesPlay.emit({releaseId});
|
||||
releasesAction.emit(PlayQueueAction::Play, {releaseId});
|
||||
});
|
||||
|
||||
Wt::WText* addBtn = entry->bindNew<Wt::WText>("add-btn", Wt::WString::tr("Lms.Explore.template.add-btn"), Wt::TextFormat::XHTML);
|
||||
addBtn->clicked().connect([=]
|
||||
{
|
||||
releasesAdd.emit({releaseId});
|
||||
releasesAction.emit(PlayQueueAction::AddLast, {releaseId});
|
||||
});
|
||||
|
||||
return entry;
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
#include <Wt/WTemplate.h>
|
||||
|
||||
#include "database/Types.hpp"
|
||||
#include "PlayQueueAction.hpp"
|
||||
|
||||
namespace Database
|
||||
{
|
||||
@@ -41,11 +42,8 @@ class Artist : public Wt::WTemplate
|
||||
public:
|
||||
Artist(Filters* filters);
|
||||
|
||||
Wt::Signal<const std::vector<Database::IdType>&> artistsAdd;
|
||||
Wt::Signal<const std::vector<Database::IdType>&> artistsPlay;
|
||||
|
||||
Wt::Signal<const std::vector<Database::IdType>&> releasesAdd;
|
||||
Wt::Signal<const std::vector<Database::IdType>&> releasesPlay;
|
||||
Wt::Signal<PlayQueueAction, const std::vector<Database::IdType>&> artistsAction;
|
||||
Wt::Signal<PlayQueueAction, const std::vector<Database::IdType>&> releasesAction;
|
||||
|
||||
private:
|
||||
void refreshView();
|
||||
|
||||
@@ -69,7 +69,7 @@ class Artists : public Wt::WTemplate
|
||||
{Mode::RecentlyPlayed, batchSize * 4},
|
||||
{Mode::RecentlyAdded, batchSize * 2},
|
||||
{Mode::MostPlayed, batchSize * 2},
|
||||
{Mode::All, std::nullopt},
|
||||
{Mode::All, batchSize * 50},
|
||||
};
|
||||
|
||||
Mode _mode {defaultMode};
|
||||
|
||||
@@ -88,27 +88,21 @@ Explore::Explore(Filters* filters)
|
||||
contentsStack->addWidget(std::move(artists));
|
||||
|
||||
auto artist = std::make_unique<Artist>(_filters);
|
||||
artist->artistsAdd.connect(this, &Explore::handleArtistsAdd);
|
||||
artist->artistsPlay.connect(this, &Explore::handleArtistsPlay);
|
||||
artist->releasesAdd.connect(this, &Explore::handleReleasesAdd);
|
||||
artist->releasesPlay.connect(this, &Explore::handleReleasesPlay);
|
||||
artist->artistsAction.connect(this, &Explore::handleArtistsAction);
|
||||
artist->releasesAction.connect(this, &Explore::handleReleasesAction);
|
||||
contentsStack->addWidget(std::move(artist));
|
||||
|
||||
auto releases = std::make_unique<Releases>(_filters);
|
||||
releases->releasesAdd.connect(this, &Explore::handleReleasesAdd);
|
||||
releases->releasesPlay.connect(this, &Explore::handleReleasesPlay);
|
||||
releases->releasesAction.connect(this, &Explore::handleReleasesAction);
|
||||
contentsStack->addWidget(std::move(releases));
|
||||
|
||||
auto release = std::make_unique<Release>(_filters);
|
||||
release->releasesAdd.connect(this, &Explore::handleReleasesAdd);
|
||||
release->releasesPlay.connect(this, &Explore::handleReleasesPlay);
|
||||
release->tracksAdd.connect(this, &Explore::handleTracksAdd);
|
||||
release->tracksPlay.connect(this, &Explore::handleTracksPlay);
|
||||
release->releasesAction.connect(this, &Explore::handleReleasesAction);
|
||||
release->tracksAction.connect(this, &Explore::handleTracksAction);
|
||||
contentsStack->addWidget(std::move(release));
|
||||
|
||||
auto tracks = std::make_unique<Tracks>(_filters);
|
||||
tracks->tracksAdd.connect(this, &Explore::handleTracksAdd);
|
||||
tracks->tracksPlay.connect(this, &Explore::handleTracksPlay);
|
||||
tracks->tracksAction.connect(this, &Explore::handleTracksAction);
|
||||
contentsStack->addWidget(std::move(tracks));
|
||||
|
||||
wApp->internalPathChanged().connect([=]
|
||||
@@ -167,40 +161,23 @@ getReleasesTracks(Database::Session& session, const std::vector<Database::IdType
|
||||
}
|
||||
|
||||
void
|
||||
Explore::handleArtistsAdd(const std::vector<Database::IdType>& artistsId)
|
||||
Explore::handleArtistsAction(PlayQueueAction action, const std::vector<Database::IdType>& artistsId)
|
||||
{
|
||||
tracksAdd.emit(getArtistsTracks(LmsApp->getDbSession(), artistsId, _filters->getClusterIds()));
|
||||
tracksAction.emit(action, getArtistsTracks(LmsApp->getDbSession(), artistsId, _filters->getClusterIds()));
|
||||
}
|
||||
|
||||
void
|
||||
Explore::handleArtistsPlay(const std::vector<Database::IdType>& artistsId)
|
||||
Explore::handleReleasesAction(PlayQueueAction action, const std::vector<Database::IdType>& releasesId)
|
||||
{
|
||||
tracksPlay.emit(getArtistsTracks(LmsApp->getDbSession(), artistsId, _filters->getClusterIds()));
|
||||
tracksAction.emit(action, getReleasesTracks(LmsApp->getDbSession(), releasesId, _filters->getClusterIds()));
|
||||
}
|
||||
|
||||
void
|
||||
Explore::handleReleasesAdd(const std::vector<Database::IdType>& releasesId)
|
||||
Explore::handleTracksAction(PlayQueueAction action, const std::vector<Database::IdType>& tracksId)
|
||||
{
|
||||
tracksAdd.emit(getReleasesTracks(LmsApp->getDbSession(), releasesId, _filters->getClusterIds()));
|
||||
tracksAction.emit(action, tracksId);
|
||||
}
|
||||
|
||||
void
|
||||
Explore::handleReleasesPlay(const std::vector<Database::IdType>& releasesId)
|
||||
{
|
||||
tracksPlay.emit(getReleasesTracks(LmsApp->getDbSession(), releasesId, _filters->getClusterIds()));
|
||||
}
|
||||
|
||||
void
|
||||
Explore::handleTracksAdd(const std::vector<Database::IdType>& tracksId)
|
||||
{
|
||||
tracksAdd.emit(tracksId);
|
||||
}
|
||||
|
||||
void
|
||||
Explore::handleTracksPlay(const std::vector<Database::IdType>& tracksId)
|
||||
{
|
||||
tracksPlay.emit(tracksId);
|
||||
}
|
||||
|
||||
} // namespace UserInterface
|
||||
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
#include <Wt/WTemplate.h>
|
||||
|
||||
#include "database/Types.hpp"
|
||||
#include "PlayQueueAction.hpp"
|
||||
|
||||
namespace UserInterface {
|
||||
|
||||
@@ -32,17 +33,13 @@ class Explore : public Wt::WTemplate
|
||||
public:
|
||||
Explore(Filters* filters);
|
||||
|
||||
Wt::Signal<std::vector<Database::IdType>> tracksAdd;
|
||||
Wt::Signal<std::vector<Database::IdType>> tracksPlay;
|
||||
Wt::Signal<PlayQueueAction, const std::vector<Database::IdType>&> tracksAction;
|
||||
|
||||
private:
|
||||
|
||||
void handleArtistsAdd(const std::vector<Database::IdType>& artistsId);
|
||||
void handleArtistsPlay(const std::vector<Database::IdType>& artistsId);
|
||||
void handleReleasesAdd(const std::vector<Database::IdType>& releasesId);
|
||||
void handleReleasesPlay(const std::vector<Database::IdType>& releasesId);
|
||||
void handleTracksAdd(const std::vector<Database::IdType>& tracksId);
|
||||
void handleTracksPlay(const std::vector<Database::IdType>& tracksId);
|
||||
void handleArtistsAction(PlayQueueAction action, const std::vector<Database::IdType>& artistsId);
|
||||
void handleReleasesAction(PlayQueueAction action, const std::vector<Database::IdType>& releasesId);
|
||||
void handleTracksAction(PlayQueueAction action, const std::vector<Database::IdType>& tracksId);
|
||||
|
||||
Filters* _filters {};
|
||||
};
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
#include <Wt/WAnchor.h>
|
||||
#include <Wt/WApplication.h>
|
||||
#include <Wt/WImage.h>
|
||||
#include <Wt/WPopupMenu.h>
|
||||
#include <Wt/WTemplate.h>
|
||||
#include <Wt/WText.h>
|
||||
|
||||
@@ -150,7 +151,7 @@ Release::refreshView()
|
||||
Wt::WText* playBtn {bindNew<Wt::WText>("play-btn", Wt::WString::tr("Lms.Explore.template.play-btn"), Wt::TextFormat::XHTML)};
|
||||
playBtn->clicked().connect([=]
|
||||
{
|
||||
releasesPlay.emit({*releaseId});
|
||||
releasesAction.emit(PlayQueueAction::Play, {*releaseId});
|
||||
});
|
||||
}
|
||||
|
||||
@@ -158,7 +159,7 @@ Release::refreshView()
|
||||
Wt::WText* addBtn {bindNew<Wt::WText>("add-btn", Wt::WString::tr("Lms.Explore.template.add-btn"), Wt::TextFormat::XHTML)};
|
||||
addBtn->clicked().connect([=]
|
||||
{
|
||||
releasesAdd.emit({*releaseId});
|
||||
releasesAction.emit(PlayQueueAction::AddLast, {*releaseId});
|
||||
});
|
||||
}
|
||||
|
||||
@@ -232,13 +233,13 @@ Release::refreshView()
|
||||
Wt::WText* playBtn {entry->bindNew<Wt::WText>("play-btn", Wt::WString::tr("Lms.Explore.template.play-btn"), Wt::TextFormat::XHTML)};
|
||||
playBtn->clicked().connect([=]()
|
||||
{
|
||||
tracksPlay.emit({trackId});
|
||||
tracksAction.emit(PlayQueueAction::Play, {trackId});
|
||||
});
|
||||
|
||||
Wt::WText* addBtn {entry->bindNew<Wt::WText>("add-btn", Wt::WString::tr("Lms.Explore.template.add-btn"), Wt::TextFormat::XHTML)};
|
||||
addBtn->clicked().connect([=]()
|
||||
{
|
||||
tracksAdd.emit({trackId});
|
||||
tracksAction.emit(PlayQueueAction::AddLast, {trackId});
|
||||
});
|
||||
|
||||
entry->bindString("duration", trackDurationToString(track->getDuration()), Wt::TextFormat::Plain);
|
||||
@@ -253,6 +254,8 @@ Release::refreshView()
|
||||
if (*trackIdLoaded == trackId)
|
||||
entry->bindString("is-playing", "Lms-entry-playing");
|
||||
}
|
||||
else
|
||||
entry->bindString("is-playing", "");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
#include <Wt/WTemplate.h>
|
||||
|
||||
#include "database/Types.hpp"
|
||||
#include "PlayQueueAction.hpp"
|
||||
|
||||
namespace Database
|
||||
{
|
||||
@@ -38,11 +39,11 @@ namespace UserInterface
|
||||
public:
|
||||
Release(Filters* filters);
|
||||
|
||||
Wt::Signal<const std::vector<Database::IdType>&> releasesAdd;
|
||||
Wt::Signal<const std::vector<Database::IdType>&> releasesPlay;
|
||||
Wt::Signal<PlayQueueAction, const std::vector<Database::IdType>&> releasesAction;
|
||||
Wt::Signal<PlayQueueAction, const std::vector<Database::IdType>&> tracksAction;
|
||||
|
||||
Wt::Signal<const std::vector<Database::IdType>&> tracksAdd;
|
||||
Wt::Signal<const std::vector<Database::IdType>&> tracksPlay;
|
||||
Wt::Signal<Wt::WWidget&, Database::IdType> createReleaseActionMenu;
|
||||
Wt::Signal<Wt::WWidget&, Database::IdType> createTrackActionMenu;
|
||||
|
||||
private:
|
||||
void refreshView();
|
||||
|
||||
@@ -70,12 +70,12 @@ _filters {filters}
|
||||
Wt::WText* playBtn {bindNew<Wt::WText>("play-btn", Wt::WString::tr("Lms.Explore.template.play-btn"), Wt::TextFormat::XHTML)};
|
||||
playBtn->clicked().connect([this]
|
||||
{
|
||||
releasesPlay.emit(getAllReleases());
|
||||
releasesAction.emit(PlayQueueAction::Play, getAllReleases());
|
||||
});
|
||||
Wt::WText* addBtn {bindNew<Wt::WText>("add-btn", Wt::WString::tr("Lms.Explore.template.add-btn"), Wt::TextFormat::XHTML)};
|
||||
addBtn->clicked().connect([this]
|
||||
{
|
||||
releasesAdd.emit(getAllReleases());
|
||||
releasesAction.emit(PlayQueueAction::AddLast, getAllReleases());
|
||||
});
|
||||
|
||||
_container = bindNew<Wt::WContainerWidget>("releases");
|
||||
@@ -140,13 +140,13 @@ Releases::createEntry(const Release::pointer& release)
|
||||
Wt::WText* playBtn = entry->bindNew<Wt::WText>("play-btn", Wt::WString::tr("Lms.Explore.template.play-btn"), Wt::TextFormat::XHTML);
|
||||
playBtn->clicked().connect([=]
|
||||
{
|
||||
releasesPlay.emit({releaseId});
|
||||
releasesAction.emit(PlayQueueAction::Play, {releaseId});
|
||||
});
|
||||
|
||||
Wt::WText* addBtn = entry->bindNew<Wt::WText>("add-btn", Wt::WString::tr("Lms.Explore.template.add-btn"), Wt::TextFormat::XHTML);
|
||||
addBtn->clicked().connect([=]
|
||||
{
|
||||
releasesAdd.emit({releaseId});
|
||||
releasesAction.emit(PlayQueueAction::AddLast, {releaseId});
|
||||
});
|
||||
|
||||
return entry;
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
#include <Wt/WTemplate.h>
|
||||
|
||||
#include "database/Types.hpp"
|
||||
#include "PlayQueueAction.hpp"
|
||||
|
||||
namespace Database
|
||||
{
|
||||
@@ -41,8 +42,7 @@ class Releases : public Wt::WTemplate
|
||||
public:
|
||||
Releases(Filters* filters);
|
||||
|
||||
Wt::Signal<const std::vector<Database::IdType>&> releasesAdd;
|
||||
Wt::Signal<const std::vector<Database::IdType>&> releasesPlay;
|
||||
Wt::Signal<PlayQueueAction, const std::vector<Database::IdType>&> releasesAction;
|
||||
|
||||
private:
|
||||
|
||||
@@ -71,7 +71,7 @@ class Releases : public Wt::WTemplate
|
||||
{Mode::RecentlyPlayed, batchSize * 3},
|
||||
{Mode::RecentlyAdded, batchSize * 2},
|
||||
{Mode::MostPlayed, batchSize * 2},
|
||||
{Mode::All, std::nullopt},
|
||||
{Mode::All, batchSize * 30},
|
||||
};
|
||||
|
||||
Mode _mode {defaultMode};
|
||||
|
||||
@@ -71,13 +71,13 @@ _filters {filters}
|
||||
Wt::WText* playBtn = bindNew<Wt::WText>("play-btn", Wt::WString::tr("Lms.Explore.template.play-btn"), Wt::TextFormat::XHTML);
|
||||
playBtn->clicked().connect([=]
|
||||
{
|
||||
tracksPlay.emit(getAllTracks());
|
||||
tracksAction.emit(PlayQueueAction::Play, getAllTracks());
|
||||
});
|
||||
|
||||
Wt::WText* addBtn = bindNew<Wt::WText>("add-btn", Wt::WString::tr("Lms.Explore.template.add-btn"), Wt::TextFormat::XHTML);
|
||||
addBtn->clicked().connect([=]
|
||||
{
|
||||
tracksAdd.emit(getAllTracks());
|
||||
tracksAction.emit(PlayQueueAction::AddLast, getAllTracks());
|
||||
});
|
||||
|
||||
_tracksContainer = bindNew<Wt::WContainerWidget>("tracks");
|
||||
@@ -245,13 +245,13 @@ Tracks::createEntry(const Track::pointer& track)
|
||||
Wt::WText* playBtn = entry->bindNew<Wt::WText>("play-btn", Wt::WString::tr("Lms.Explore.template.play-btn"), Wt::TextFormat::XHTML);
|
||||
playBtn->clicked().connect([=]
|
||||
{
|
||||
tracksPlay.emit({trackId});
|
||||
tracksAction.emit(PlayQueueAction::Play, {trackId});
|
||||
});
|
||||
|
||||
Wt::WText* addBtn = entry->bindNew<Wt::WText>("add-btn", Wt::WString::tr("Lms.Explore.template.add-btn"), Wt::TextFormat::XHTML);
|
||||
addBtn->clicked().connect([=]
|
||||
{
|
||||
tracksAdd.emit({trackId});
|
||||
tracksAction.emit(PlayQueueAction::AddLast, {trackId});
|
||||
});
|
||||
|
||||
LmsApp->getMediaPlayer()->trackLoaded.connect(entryPtr, [=] (Database::IdType loadedTrackId)
|
||||
@@ -264,6 +264,8 @@ Tracks::createEntry(const Track::pointer& track)
|
||||
if (*trackIdLoaded == trackId)
|
||||
entry->bindString("is-playing", "Lms-entry-playing");
|
||||
}
|
||||
else
|
||||
entry->bindString("is-playing", "");
|
||||
|
||||
return entry;
|
||||
}
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
#include <Wt/WTemplate.h>
|
||||
|
||||
#include "database/Types.hpp"
|
||||
#include "PlayQueueAction.hpp"
|
||||
|
||||
namespace Database
|
||||
{
|
||||
@@ -41,8 +42,7 @@ class Tracks : public Wt::WTemplate
|
||||
public:
|
||||
Tracks(Filters* filters);
|
||||
|
||||
Wt::Signal<const std::vector<Database::IdType>&> tracksAdd;
|
||||
Wt::Signal<const std::vector<Database::IdType>&> tracksPlay;
|
||||
Wt::Signal<PlayQueueAction, const std::vector<Database::IdType>&> tracksAction;
|
||||
|
||||
private:
|
||||
|
||||
@@ -72,7 +72,7 @@ class Tracks : public Wt::WTemplate
|
||||
{Mode::RecentlyPlayed, batchSize * 10},
|
||||
{Mode::RecentlyAdded, batchSize * 10},
|
||||
{Mode::MostPlayed, batchSize * 10},
|
||||
{Mode::All, std::nullopt},
|
||||
{Mode::All, batchSize * 50},
|
||||
};
|
||||
|
||||
Mode _mode {defaultMode};
|
||||
|
||||
Reference in New Issue
Block a user