diff --git a/src/music_gui.cpp b/src/music_gui.cpp --- a/src/music_gui.cpp +++ b/src/music_gui.cpp @@ -87,6 +87,7 @@ struct MusicSystem { void PlaylistClear(); private: + void SetPositionBySetIndex(uint set_index); void ChangePlaylistPosition(int ofs); int playlist_position; @@ -184,30 +185,45 @@ void MusicSystem::ChangeMusicSet(const s InvalidateWindowData(WC_MUSIC_WINDOW, 0, 1, true); } -/** Enable shuffle mode and restart playback */ +/** + * Set playlist position by set index. + * @param set_index Set index to select. + */ +void MusicSystem::SetPositionBySetIndex(uint set_index) +{ + auto it = std::find_if(std::begin(this->active_playlist), std::end(this->active_playlist), [&set_index](const PlaylistEntry &ple) { return ple.set_index == set_index; }); + if (it != std::end(this->active_playlist)) this->playlist_position = std::distance(std::begin(this->active_playlist), it); +} + +/** + * Enable shuffle mode. + */ void MusicSystem::Shuffle() { _settings_client.music.shuffle = true; + uint set_index = this->active_playlist[this->playlist_position].set_index; this->active_playlist = this->displayed_playlist; for (size_t i = 0; i < this->active_playlist.size(); i++) { size_t shuffle_index = InteractiveRandom() % (this->active_playlist.size() - i); std::swap(this->active_playlist[i], this->active_playlist[i + shuffle_index]); } - - if (_settings_client.music.playing) this->Play(); + this->SetPositionBySetIndex(set_index); InvalidateWindowData(WC_MUSIC_TRACK_SELECTION, 0); InvalidateWindowData(WC_MUSIC_WINDOW, 0); } -/** Disable shuffle and restart playback */ +/** + * Disable shuffle mode. + */ void MusicSystem::Unshuffle() { _settings_client.music.shuffle = false; + + uint set_index = this->active_playlist[this->playlist_position].set_index; this->active_playlist = this->displayed_playlist; - - if (_settings_client.music.playing) this->Play(); + this->SetPositionBySetIndex(set_index); InvalidateWindowData(WC_MUSIC_TRACK_SELECTION, 0); InvalidateWindowData(WC_MUSIC_WINDOW, 0);