From 465fa2ce8711243f32ded24c4e0744034ebfae91 Mon Sep 17 00:00:00 2001 From: vaterlangen Date: Wed, 13 Jun 2018 22:03:23 +0200 Subject: [PATCH] Clicking on songs in playlists via remote control now respecting behavioural settings from GUI (either direct changes it or enques it) --- src/networkremote/incomingdataparser.cpp | 32 ++++++++++++++++++++++-- src/networkremote/incomingdataparser.h | 4 +++ src/playlist/playlistmanager.cpp | 12 ++++++++- src/playlist/playlistmanager.h | 4 +++ 4 files changed, 49 insertions(+), 3 deletions(-) diff --git a/src/networkremote/incomingdataparser.cpp b/src/networkremote/incomingdataparser.cpp index fbaa84d62..8a0c8a1ec 100644 --- a/src/networkremote/incomingdataparser.cpp +++ b/src/networkremote/incomingdataparser.cpp @@ -32,6 +32,11 @@ #endif IncomingDataParser::IncomingDataParser(Application* app) : app_(app) { + // load settings initaily and sign up for updates + ReloadSettings(); + connect(app_, SIGNAL(SettingsChanged()), SLOT(ReloadSettings())); + + // Connect all the signals // due the player is in a different thread, we cannot access these functions // directly @@ -47,6 +52,7 @@ IncomingDataParser::IncomingDataParser(Application* app) : app_(app) { connect(this, SIGNAL(PlayAt(int, Engine::TrackChangeFlags, bool)), app_->player(), SLOT(PlayAt(int, Engine::TrackChangeFlags, bool))); connect(this, SIGNAL(SeekTo(int)), app_->player(), SLOT(SeekTo(int))); + connect(this, SIGNAL(Enque(int,int)), app_->playlist_manager(), SLOT(Enque(int,int))); connect(this, SIGNAL(SetActivePlaylist(int)), app_->playlist_manager(), SLOT(SetActivePlaylist(int))); @@ -80,6 +86,12 @@ IncomingDataParser::IncomingDataParser(Application* app) : app_(app) { IncomingDataParser::~IncomingDataParser() {} +void IncomingDataParser::ReloadSettings() { + QSettings s; + s.beginGroup(MainWindow::kSettingsGroup); + doubleclick_playlist_addmode_ = MainWindow::PlaylistAddBehaviour(s.value("doubleclick_playlist_addmode", MainWindow::PlaylistAddBehaviour_Enqueue).toInt()); +} + bool IncomingDataParser::close_connection() { return close_connection_; } void IncomingDataParser::Parse(const pb::remote::Message& msg) { @@ -194,8 +206,24 @@ void IncomingDataParser::ChangeSong(const pb::remote::Message& msg) { emit SetActivePlaylist(request.playlist_id()); } - // Play the selected song - emit PlayAt(request.song_index(), Engine::Manual, false); + switch (doubleclick_playlist_addmode_) + { + // Play the selected song + case MainWindow::PlaylistAddBehaviour_Play: + emit PlayAt(request.song_index(), Engine::Manual, false); + break; + + // Enque the selected song + case MainWindow::PlaylistAddBehaviour_Enqueue: + emit Enque(request.playlist_id(), request.song_index()); + if (app_->player()->GetState() != Engine::Playing) + { + emit PlayAt(request.song_index(), Engine::Manual, false); + } + + break; + } + } void IncomingDataParser::SetRepeatMode(const pb::remote::Repeat& repeat) { diff --git a/src/networkremote/incomingdataparser.h b/src/networkremote/incomingdataparser.h index 2f2bb0f7c..ba8cd4db1 100644 --- a/src/networkremote/incomingdataparser.h +++ b/src/networkremote/incomingdataparser.h @@ -5,6 +5,7 @@ #include "core/application.h" #include "remotecontrolmessages.pb.h" #include "remoteclient.h" +#include "ui/mainwindow.h" class IncomingDataParser : public QObject { Q_OBJECT @@ -16,6 +17,7 @@ class IncomingDataParser : public QObject { public slots: void Parse(const pb::remote::Message& msg); + void ReloadSettings(); signals: void SendClementineInfo(); @@ -38,6 +40,7 @@ signals: void Previous(); void SetVolume(int volume); void PlayAt(int i, Engine::TrackChangeFlags change, bool reshuffle); + void Enque(int id, int i); void SetActivePlaylist(int id); void ShuffleCurrent(); void SetRepeatMode(PlaylistSequence::RepeatMode mode); @@ -56,6 +59,7 @@ signals: private: Application* app_; bool close_connection_; + MainWindow::PlaylistAddBehaviour doubleclick_playlist_addmode_; void GetPlaylistSongs(const pb::remote::Message& msg); void ChangeSong(const pb::remote::Message& msg); diff --git a/src/playlist/playlistmanager.cpp b/src/playlist/playlistmanager.cpp index efd3917d5..a447f19fa 100644 --- a/src/playlist/playlistmanager.cpp +++ b/src/playlist/playlistmanager.cpp @@ -29,6 +29,7 @@ #include "library/libraryplaylistitem.h" #include "playlistparsers/playlistparser.h" #include "smartplaylists/generator.h" +#include "queue.h" #include #include @@ -63,7 +64,7 @@ PlaylistManager::~PlaylistManager() { void PlaylistManager::Init(LibraryBackend* library_backend, PlaylistBackend* playlist_backend, PlaylistSequence* sequence, - PlaylistContainer* playlist_container) { + PlaylistContainer* playlist_container) { library_backend_ = library_backend; playlist_backend_ = playlist_backend; sequence_ = sequence; @@ -397,6 +398,15 @@ void PlaylistManager::ChangePlaylistOrder(const QList& ids) { playlist_backend_->SetPlaylistOrder(ids); } +void PlaylistManager::Enque(int id, int i) { + QModelIndexList dummyIndexList; + + Q_ASSERT(playlists_.contains(id)); + + dummyIndexList.append(playlist(id)->index(i, 0)); + playlist(id)->queue()->ToggleTracks(dummyIndexList); +} + void PlaylistManager::UpdateSummaryText() { int tracks = current()->rowCount(); quint64 nanoseconds = 0; diff --git a/src/playlist/playlistmanager.h b/src/playlist/playlistmanager.h index 8c8f66d10..e674393d1 100644 --- a/src/playlist/playlistmanager.h +++ b/src/playlist/playlistmanager.h @@ -84,6 +84,8 @@ class PlaylistManagerInterface : public QObject { virtual void Open(int id) = 0; virtual void ChangePlaylistOrder(const QList& ids) = 0; + virtual void Enque(int id, int index) = 0; + virtual void SongChangeRequestProcessed(const QUrl& url, bool valid) = 0; virtual void SetCurrentPlaylist(int id) = 0; @@ -192,6 +194,8 @@ class PlaylistManager : public PlaylistManagerInterface { void Open(int id); void ChangePlaylistOrder(const QList& ids); + void Enque(int id, int index); + void SetCurrentPlaylist(int id); void SetActivePlaylist(int id); void SetActiveToCurrent();