From 8fcdbd51146613fe81c39ac160b294bf3bf43fb8 Mon Sep 17 00:00:00 2001 From: Maarten Jacobs Date: Sun, 10 Jan 2021 00:53:40 -0500 Subject: [PATCH] Adding a "play next album" function, in addition to "play next track". Changed shortcut key for Next Album from "space" to F9 Fixed indentation in player.cpp Fixed spacing in player.cpp. Updated player.cpp to ensure while loop takes into consideration the last song on the playlist. Fixed lint formatting error in player.cpp Additional changes to player.cpp to make sure next album search reacts properly to the given repeat mode. Updated player.cpp to address cpplint issues. Fixing formatting issues. Fixing formatting errors. Finished formatting updates. Final formatting... Final formatting Really final formatting... Addressed issues from code review. Added functionality to disable Next Album option when repeat mode is "repeat track". Added commentary to recent changes. Disable Next Album action also when Repeat Mode is Repeat_Album In addition to disabling this action for the Next_Track repeat mode, the same applies to the Next_Album repeat mode. --- src/core/player.cpp | 28 ++++++++++++++++++++++++---- src/core/player.h | 6 ++++-- src/ui/mainwindow.cpp | 36 ++++++++++++++++++++++++++++++++++++ src/ui/mainwindow.h | 1 + src/ui/mainwindow.ui | 22 +++++++++++++++++++++- 5 files changed, 86 insertions(+), 7 deletions(-) diff --git a/src/core/player.cpp b/src/core/player.cpp index 1bdfedc7c..fdc395ed5 100644 --- a/src/core/player.cpp +++ b/src/core/player.cpp @@ -170,7 +170,9 @@ void Player::HandleLoadResult(const UrlHandler::LoadResult& result) { void Player::Next() { NextInternal(Engine::Manual); } -void Player::NextInternal(Engine::TrackChangeFlags change) { +void Player::NextAlbum() { NextInternal(Engine::Manual, true); } + +void Player::NextInternal(Engine::TrackChangeFlags change, bool next_album) { if (HandleStopAfter()) return; if (app_->playlist_manager()->active()->current_item()) { @@ -186,10 +188,10 @@ void Player::NextInternal(Engine::TrackChangeFlags change) { } } - NextItem(change); + NextItem(change, next_album); } -void Player::NextItem(Engine::TrackChangeFlags change) { +void Player::NextItem(Engine::TrackChangeFlags change, bool next_album) { Playlist* active_playlist = app_->playlist_manager()->active(); // If we received too many errors in auto change, with repeat enabled, we stop @@ -213,7 +215,25 @@ void Player::NextItem(Engine::TrackChangeFlags change) { // Manual track changes override "Repeat track" const bool ignore_repeat_track = change & Engine::Manual; - int i = active_playlist->next_row(ignore_repeat_track); + int i = active_playlist->current_row(); + if (next_album && i != -1) { + if (active_playlist->sequence()->repeat_mode() != + PlaylistSequence::Repeat_Track) { + int original_index = i; + QString album = active_playlist->current_item_metadata().album(); + + i = active_playlist->next_row(ignore_repeat_track); + while (i != -1 && + active_playlist->item_at(i)->Metadata().album() == album && + i != original_index) { + active_playlist->set_current_row(i, true); + i = active_playlist->next_row(ignore_repeat_track); + } + } + } else { + i = active_playlist->next_row(ignore_repeat_track); + } + if (i == -1) { app_->playlist_manager()->active()->set_current_row(i); emit PlaylistFinished(); diff --git a/src/core/player.h b/src/core/player.h index a694475a9..04f5860fe 100644 --- a/src/core/player.h +++ b/src/core/player.h @@ -72,6 +72,7 @@ class PlayerInterface : public QObject { // Skips this track. Might load more of the current radio station. virtual void Next() = 0; + virtual void NextAlbum() = 0; virtual void Previous() = 0; virtual void SetVolume(int value) = 0; @@ -150,6 +151,7 @@ class Player : public PlayerInterface { void PlayPause(); void RestartOrPrevious(); void Next(); + void NextAlbum(); void Previous(); void PlayPlaylist(const QString& playlistName); void SetVolume(int value); @@ -177,10 +179,10 @@ class Player : public PlayerInterface { void TrackEnded(); // Play the next item on the playlist - disregarding radio stations like // last.fm that might have more tracks. - void NextItem(Engine::TrackChangeFlags change); + void NextItem(Engine::TrackChangeFlags change, bool next_album = false); void PreviousItem(Engine::TrackChangeFlags change); - void NextInternal(Engine::TrackChangeFlags); + void NextInternal(Engine::TrackChangeFlags, bool next_album = false); void PlayPlaylistInternal(Engine::TrackChangeFlags, const QString& playlistName); diff --git a/src/ui/mainwindow.cpp b/src/ui/mainwindow.cpp index e9a927ef9..d1d90317c 100644 --- a/src/ui/mainwindow.cpp +++ b/src/ui/mainwindow.cpp @@ -356,6 +356,8 @@ MainWindow::MainWindow(Application* app, SystemTrayIcon* tray_icon, OSD* osd, ui_->action_jump->setIcon(IconLoader::Load("go-jump", IconLoader::Base)); ui_->action_next_track->setIcon( IconLoader::Load("media-skip-forward", IconLoader::Base)); + ui_->action_next_album->setIcon( + IconLoader::Load("media-skip-forward", IconLoader::Base)); ui_->action_open_media->setIcon( IconLoader::Load("document-open", IconLoader::Base)); ui_->action_open_cd->setIcon( @@ -417,6 +419,8 @@ MainWindow::MainWindow(Application* app, SystemTrayIcon* tray_icon, OSD* osd, // Action connections connect(ui_->action_next_track, SIGNAL(triggered()), app_->player(), SLOT(Next())); + connect(ui_->action_next_album, SIGNAL(triggered()), app_->player(), + SLOT(NextAlbum())); connect(ui_->action_previous_track, SIGNAL(triggered()), app_->player(), SLOT(Previous())); connect(ui_->action_play_pause, SIGNAL(triggered()), app_->player(), @@ -547,6 +551,12 @@ MainWindow::MainWindow(Application* app, SystemTrayIcon* tray_icon, OSD* osd, ui_->action_shuffle_mode->setMenu(ui_->playlist_sequence->shuffle_menu()); ui_->action_repeat_mode->setMenu(ui_->playlist_sequence->repeat_menu()); + // Next Actions + QMenu* next_menu = new QMenu(this); + next_menu->addAction(ui_->action_next_track); + next_menu->addAction(ui_->action_next_album); + ui_->forward_button->setMenu(next_menu); + // Stop actions QMenu* stop_menu = new QMenu(this); stop_menu->addAction(ui_->action_stop); @@ -971,6 +981,12 @@ MainWindow::MainWindow(Application* app, SystemTrayIcon* tray_icon, OSD* osd, SIGNAL(ShuffleModeChanged(PlaylistSequence::ShuffleMode)), osd_, SLOT(ShuffleModeChanged(PlaylistSequence::ShuffleMode))); + // Connect the RepeatModeChanged signal such that it will dis/enable the + // action_next_album on the UI + connect(app_->playlist_manager()->sequence(), + SIGNAL(RepeatModeChanged(PlaylistSequence::RepeatMode)), + SLOT(SetNextAlbumEnabled(PlaylistSequence::RepeatMode))); + #ifdef HAVE_LIBLASTFM connect(app_->scrobbler(), SIGNAL(CachedToScrobble()), SLOT(CachedToScrobble())); @@ -1070,6 +1086,13 @@ MainWindow::MainWindow(Application* app, SystemTrayIcon* tray_icon, OSD* osd, if (!options.contains_play_options()) LoadPlaybackStatus(); + // Set the state of action_next_album based on the repeat mode. + if (app_->playlist_manager()->current()->sequence()->repeat_mode() == + PlaylistSequence::Repeat_Track || + app_->playlist_manager()->current()->sequence()->repeat_mode() == + PlaylistSequence::Repeat_Album) + ui_->action_next_album->setDisabled(true); + initialized_ = true; qLog(Debug) << "Started"; @@ -3096,3 +3119,16 @@ void MainWindow::keyPressEvent(QKeyEvent* event) { QMainWindow::keyPressEvent(event); } } + +// Change the state of action_next_album based when the repeat mode is +// changed. +void MainWindow::SetNextAlbumEnabled(PlaylistSequence::RepeatMode mode) { + if (mode == PlaylistSequence::Repeat_Track || + mode == PlaylistSequence::Repeat_Album) { + if (ui_->action_next_album->isEnabled()) + ui_->action_next_album->setDisabled(true); + } else { + if (!ui_->action_next_album->isEnabled()) + ui_->action_next_album->setEnabled(true); + } +} diff --git a/src/ui/mainwindow.h b/src/ui/mainwindow.h index c18e00c8a..3a0e5c06e 100644 --- a/src/ui/mainwindow.h +++ b/src/ui/mainwindow.h @@ -155,6 +155,7 @@ class MainWindow : public QMainWindow, public PlatformInterface { void NewDebugConsole(Console* console); private slots: + void SetNextAlbumEnabled(PlaylistSequence::RepeatMode mode); void FilePathChanged(const QString& path); void SaveSettings(QSettings* settings); diff --git a/src/ui/mainwindow.ui b/src/ui/mainwindow.ui index bef7b140e..bf9ce44b6 100644 --- a/src/ui/mainwindow.ui +++ b/src/ui/mainwindow.ui @@ -199,12 +199,21 @@ + + + 42 + 29 + + 22 22 + + QToolButton::MenuButtonPopup + true @@ -477,7 +486,7 @@ 0 0 1131 - 23 + 22 @@ -945,6 +954,17 @@ Show or hide the sidebar + + + Next album + + + Skip to the next album + + + F9 + +