diff --git a/src/lms/CMakeLists.txt b/src/lms/CMakeLists.txt index 6755b1c1..dc4b308f 100644 --- a/src/lms/CMakeLists.txt +++ b/src/lms/CMakeLists.txt @@ -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 diff --git a/src/lms/ui/LmsApplication.cpp b/src/lms/ui/LmsApplication.cpp index 3e144228..501b7ee5 100644 --- a/src/lms/ui/LmsApplication.cpp +++ b/src/lms/ui/LmsApplication.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(); } - explore->tracksAdd.connect([=] (const std::vector& trackIds) + explore->tracksAction.connect([playqueue] (PlayQueueAction action, const std::vector& trackIds) { - playqueue->addTracks(trackIds); + playqueue->processTracks(action, trackIds); }); - explore->tracksPlay.connect([=] (const std::vector& trackIds) - { - playqueue->playTracks(trackIds); - }); - - // Events from MediaPlayer _mediaPlayer->playNext.connect([=] { diff --git a/src/lms/ui/PlayQueueView.cpp b/src/lms/ui/PlayQueue.cpp similarity index 95% rename from src/lms/ui/PlayQueueView.cpp rename to src/lms/ui/PlayQueue.cpp index 34c82186..43ac9079 100644 --- a/src/lms/ui/PlayQueueView.cpp +++ b/src/lms/ui/PlayQueue.cpp @@ -17,7 +17,7 @@ * along with LMS. If not, see . */ -#include "PlayQueueView.hpp" +#include "PlayQueue.hpp" #include #include @@ -327,20 +327,27 @@ PlayQueue::enqueueTrack(Database::IdType trackId) } void -PlayQueue::addTracks(const std::vector& trackIds) +PlayQueue::processTracks(PlayQueueAction action, const std::vector& 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& 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 diff --git a/src/lms/ui/PlayQueueView.hpp b/src/lms/ui/PlayQueue.hpp similarity index 95% rename from src/lms/ui/PlayQueueView.hpp rename to src/lms/ui/PlayQueue.hpp index 4e92c2fe..a2088ecd 100644 --- a/src/lms/ui/PlayQueueView.hpp +++ b/src/lms/ui/PlayQueue.hpp @@ -27,6 +27,7 @@ #include #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& trackIds); - void playTracks(const std::vector& trackIds); + void processTracks(PlayQueueAction action, const std::vector& trackIds); // play the next track in the queue void playNext(); diff --git a/src/lms/ui/PlayQueueAction.hpp b/src/lms/ui/PlayQueueAction.hpp new file mode 100644 index 00000000..2892537b --- /dev/null +++ b/src/lms/ui/PlayQueueAction.hpp @@ -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 . + */ + +#pragma once + +namespace UserInterface +{ + + enum class PlayQueueAction + { + Play, + AddNext, + AddLast, + }; + +} + diff --git a/src/lms/ui/explore/ArtistView.cpp b/src/lms/ui/explore/ArtistView.cpp index 613b1abf..901ec1fb 100644 --- a/src/lms/ui/explore/ArtistView.cpp +++ b/src/lms/ui/explore/ArtistView.cpp @@ -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("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("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; diff --git a/src/lms/ui/explore/ArtistView.hpp b/src/lms/ui/explore/ArtistView.hpp index 465e8f9d..5981d49a 100644 --- a/src/lms/ui/explore/ArtistView.hpp +++ b/src/lms/ui/explore/ArtistView.hpp @@ -25,6 +25,7 @@ #include #include "database/Types.hpp" +#include "PlayQueueAction.hpp" namespace Database { @@ -41,11 +42,8 @@ class Artist : public Wt::WTemplate public: Artist(Filters* filters); - Wt::Signal&> artistsAdd; - Wt::Signal&> artistsPlay; - - Wt::Signal&> releasesAdd; - Wt::Signal&> releasesPlay; + Wt::Signal&> artistsAction; + Wt::Signal&> releasesAction; private: void refreshView(); diff --git a/src/lms/ui/explore/ArtistsView.hpp b/src/lms/ui/explore/ArtistsView.hpp index 8fd173f2..546290eb 100644 --- a/src/lms/ui/explore/ArtistsView.hpp +++ b/src/lms/ui/explore/ArtistsView.hpp @@ -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}; diff --git a/src/lms/ui/explore/Explore.cpp b/src/lms/ui/explore/Explore.cpp index 72c7ca1d..5e438bf8 100644 --- a/src/lms/ui/explore/Explore.cpp +++ b/src/lms/ui/explore/Explore.cpp @@ -88,27 +88,21 @@ Explore::Explore(Filters* filters) contentsStack->addWidget(std::move(artists)); auto artist = std::make_unique(_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(_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(_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(_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& artistsId) +Explore::handleArtistsAction(PlayQueueAction action, const std::vector& artistsId) { - tracksAdd.emit(getArtistsTracks(LmsApp->getDbSession(), artistsId, _filters->getClusterIds())); + tracksAction.emit(action, getArtistsTracks(LmsApp->getDbSession(), artistsId, _filters->getClusterIds())); } void -Explore::handleArtistsPlay(const std::vector& artistsId) +Explore::handleReleasesAction(PlayQueueAction action, const std::vector& releasesId) { - tracksPlay.emit(getArtistsTracks(LmsApp->getDbSession(), artistsId, _filters->getClusterIds())); + tracksAction.emit(action, getReleasesTracks(LmsApp->getDbSession(), releasesId, _filters->getClusterIds())); } void -Explore::handleReleasesAdd(const std::vector& releasesId) +Explore::handleTracksAction(PlayQueueAction action, const std::vector& tracksId) { - tracksAdd.emit(getReleasesTracks(LmsApp->getDbSession(), releasesId, _filters->getClusterIds())); + tracksAction.emit(action, tracksId); } -void -Explore::handleReleasesPlay(const std::vector& releasesId) -{ - tracksPlay.emit(getReleasesTracks(LmsApp->getDbSession(), releasesId, _filters->getClusterIds())); -} - -void -Explore::handleTracksAdd(const std::vector& tracksId) -{ - tracksAdd.emit(tracksId); -} - -void -Explore::handleTracksPlay(const std::vector& tracksId) -{ - tracksPlay.emit(tracksId); -} } // namespace UserInterface diff --git a/src/lms/ui/explore/Explore.hpp b/src/lms/ui/explore/Explore.hpp index 676269f3..7f476f64 100644 --- a/src/lms/ui/explore/Explore.hpp +++ b/src/lms/ui/explore/Explore.hpp @@ -22,6 +22,7 @@ #include #include "database/Types.hpp" +#include "PlayQueueAction.hpp" namespace UserInterface { @@ -32,17 +33,13 @@ class Explore : public Wt::WTemplate public: Explore(Filters* filters); - Wt::Signal> tracksAdd; - Wt::Signal> tracksPlay; + Wt::Signal&> tracksAction; private: - void handleArtistsAdd(const std::vector& artistsId); - void handleArtistsPlay(const std::vector& artistsId); - void handleReleasesAdd(const std::vector& releasesId); - void handleReleasesPlay(const std::vector& releasesId); - void handleTracksAdd(const std::vector& tracksId); - void handleTracksPlay(const std::vector& tracksId); + void handleArtistsAction(PlayQueueAction action, const std::vector& artistsId); + void handleReleasesAction(PlayQueueAction action, const std::vector& releasesId); + void handleTracksAction(PlayQueueAction action, const std::vector& tracksId); Filters* _filters {}; }; diff --git a/src/lms/ui/explore/ReleaseView.cpp b/src/lms/ui/explore/ReleaseView.cpp index dd54043a..d7c7ef78 100644 --- a/src/lms/ui/explore/ReleaseView.cpp +++ b/src/lms/ui/explore/ReleaseView.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include #include @@ -150,7 +151,7 @@ Release::refreshView() Wt::WText* playBtn {bindNew("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("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("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("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", ""); } } diff --git a/src/lms/ui/explore/ReleaseView.hpp b/src/lms/ui/explore/ReleaseView.hpp index ca31408c..5f1db58e 100644 --- a/src/lms/ui/explore/ReleaseView.hpp +++ b/src/lms/ui/explore/ReleaseView.hpp @@ -23,6 +23,7 @@ #include #include "database/Types.hpp" +#include "PlayQueueAction.hpp" namespace Database { @@ -38,11 +39,11 @@ namespace UserInterface public: Release(Filters* filters); - Wt::Signal&> releasesAdd; - Wt::Signal&> releasesPlay; + Wt::Signal&> releasesAction; + Wt::Signal&> tracksAction; - Wt::Signal&> tracksAdd; - Wt::Signal&> tracksPlay; + Wt::Signal createReleaseActionMenu; + Wt::Signal createTrackActionMenu; private: void refreshView(); diff --git a/src/lms/ui/explore/ReleasesView.cpp b/src/lms/ui/explore/ReleasesView.cpp index 80cb9625..2601ac41 100644 --- a/src/lms/ui/explore/ReleasesView.cpp +++ b/src/lms/ui/explore/ReleasesView.cpp @@ -70,12 +70,12 @@ _filters {filters} Wt::WText* playBtn {bindNew("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("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("releases"); @@ -140,13 +140,13 @@ Releases::createEntry(const Release::pointer& release) Wt::WText* playBtn = entry->bindNew("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("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; diff --git a/src/lms/ui/explore/ReleasesView.hpp b/src/lms/ui/explore/ReleasesView.hpp index 2ae8fa9d..05f25cbd 100644 --- a/src/lms/ui/explore/ReleasesView.hpp +++ b/src/lms/ui/explore/ReleasesView.hpp @@ -26,6 +26,7 @@ #include #include "database/Types.hpp" +#include "PlayQueueAction.hpp" namespace Database { @@ -41,8 +42,7 @@ class Releases : public Wt::WTemplate public: Releases(Filters* filters); - Wt::Signal&> releasesAdd; - Wt::Signal&> releasesPlay; + Wt::Signal&> 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}; diff --git a/src/lms/ui/explore/TracksView.cpp b/src/lms/ui/explore/TracksView.cpp index 3aca498e..057df4ea 100644 --- a/src/lms/ui/explore/TracksView.cpp +++ b/src/lms/ui/explore/TracksView.cpp @@ -71,13 +71,13 @@ _filters {filters} Wt::WText* playBtn = bindNew("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("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("tracks"); @@ -245,13 +245,13 @@ Tracks::createEntry(const Track::pointer& track) Wt::WText* playBtn = entry->bindNew("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("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; } diff --git a/src/lms/ui/explore/TracksView.hpp b/src/lms/ui/explore/TracksView.hpp index 75b69fb2..b8fadfce 100644 --- a/src/lms/ui/explore/TracksView.hpp +++ b/src/lms/ui/explore/TracksView.hpp @@ -27,6 +27,7 @@ #include #include "database/Types.hpp" +#include "PlayQueueAction.hpp" namespace Database { @@ -41,8 +42,7 @@ class Tracks : public Wt::WTemplate public: Tracks(Filters* filters); - Wt::Signal&> tracksAdd; - Wt::Signal&> tracksPlay; + Wt::Signal&> 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};