Minor refacto + limit the number of tracks/releases we can put at once in the playqueue

This commit is contained in:
emeric
2020-05-16 19:24:18 +02:00
parent 381075d49d
commit 6b9bbb2788
16 changed files with 111 additions and 99 deletions
+1 -1
View File
@@ -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
+3 -9
View File
@@ -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();
+33
View File
@@ -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,
};
}
+4 -4
View File
@@ -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;
+3 -5
View File
@@ -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();
+1 -1
View File
@@ -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};
+12 -35
View File
@@ -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
+5 -8
View File
@@ -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 {};
};
+7 -4
View File
@@ -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", "");
}
}
+5 -4
View File
@@ -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();
+4 -4
View File
@@ -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;
+3 -3
View File
@@ -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};
+6 -4
View File
@@ -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;
}
+3 -3
View File
@@ -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};