From c8eab80b3daf2c42b569f2e2d8cd0dbe10e09dc0 Mon Sep 17 00:00:00 2001 From: Max Trussell Date: Sun, 19 Dec 2021 18:59:28 -0800 Subject: [PATCH] SoundPlayer: Sync startup loop and show playlist settings in GUI This fix syncs up the AudioPlayer's internal state for showing playlist information with the AudioPlayer's GUI. Before, if the AudioPlayer was opened with a playlist file (.m3u or .m3u8) it would automatically show the playlist information in the GUI and set the loop mode to playlist, but the menu options would be unchecked. In order to hide the playlist information, the menu option would then have to be toggled twice -- once on and again off. --- Userland/Applications/SoundPlayer/Player.cpp | 8 +++++++- Userland/Applications/SoundPlayer/Player.h | 1 + Userland/Applications/SoundPlayer/main.cpp | 13 +++++++++---- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/Userland/Applications/SoundPlayer/Player.cpp b/Userland/Applications/SoundPlayer/Player.cpp index d9ffbbb86d..153d7060ac 100644 --- a/Userland/Applications/SoundPlayer/Player.cpp +++ b/Userland/Applications/SoundPlayer/Player.cpp @@ -48,7 +48,7 @@ void Player::play_file_path(String const& path) return; } - if (path.ends_with(".m3u", AK::CaseSensitivity::CaseInsensitive) || path.ends_with(".m3u8", AK::CaseSensitivity::CaseInsensitive)) { + if (is_playlist(path)) { playlist_loaded(path, m_playlist.load(path)); return; } @@ -69,6 +69,12 @@ void Player::play_file_path(String const& path) play(); } +bool Player::is_playlist(String const& path) +{ + return (path.ends_with(".m3u", AK::CaseSensitivity::CaseInsensitive) + || path.ends_with(".m3u8", AK::CaseSensitivity::CaseInsensitive)); +} + void Player::set_play_state(PlayState state) { if (m_play_state != state) { diff --git a/Userland/Applications/SoundPlayer/Player.h b/Userland/Applications/SoundPlayer/Player.h index 1666032384..d215ae6989 100644 --- a/Userland/Applications/SoundPlayer/Player.h +++ b/Userland/Applications/SoundPlayer/Player.h @@ -33,6 +33,7 @@ public: virtual ~Player() { } void play_file_path(String const& path); + bool is_playlist(String const& path); Playlist& playlist() { return m_playlist; } String const& loaded_filename() const { return m_loaded_filename; } diff --git a/Userland/Applications/SoundPlayer/main.cpp b/Userland/Applications/SoundPlayer/main.cpp index 3b0c6b17b1..e7a8a882ba 100644 --- a/Userland/Applications/SoundPlayer/main.cpp +++ b/Userland/Applications/SoundPlayer/main.cpp @@ -43,6 +43,8 @@ ErrorOr serenity_main(Main::Arguments arguments) if (arguments.argc > 1) { StringView path = arguments.strings[1]; player->play_file_path(path); + if (player->is_playlist(path)) + player->set_loop_mode(Player::LoopMode::Playlist); } auto file_menu = TRY(window->try_add_menu("&File")); @@ -61,10 +63,9 @@ ErrorOr serenity_main(Main::Arguments arguments) auto playback_menu = TRY(window->try_add_menu("&Playback")); GUI::ActionGroup loop_actions; loop_actions.set_exclusive(true); - auto loop_none = TRY(GUI::Action::try_create("&No Loop", [&](auto&) { + auto loop_none = GUI::Action::create_checkable("&No Loop", { Mod_Ctrl, Key_N }, [&](auto&) { player->set_loop_mode(Player::LoopMode::None); - })); - loop_none->set_checked(true); + }); loop_actions.add_action(loop_none); TRY(playback_menu->try_add_action(loop_none)); @@ -90,8 +91,12 @@ ErrorOr serenity_main(Main::Arguments arguments) auto playlist_toggle = GUI::Action::create_checkable("&Show Playlist", [&](auto& action) { static_cast(player)->set_playlist_visible(action.is_checked()); }); - if (player->loop_mode() == Player::LoopMode::Playlist) + if (player->loop_mode() == Player::LoopMode::Playlist) { playlist_toggle->set_checked(true); + loop_playlist->set_checked(true); + } else { + loop_none->set_checked(true); + } TRY(playback_menu->try_add_action(playlist_toggle)); auto shuffle_mode = GUI::Action::create_checkable("S&huffle Playlist", [&](auto& action) {