diff --git a/apps/lang/english.lang b/apps/lang/english.lang
index 80a29601a0..8365e9d265 100644
--- a/apps/lang/english.lang
+++ b/apps/lang/english.lang
@@ -15673,4 +15673,18 @@
*: "In Submenu"
+
+
+ id: LANG_CLEAR_LIST_AND_PLAY_SHUFFLED
+ desc: in onplay menu. Replace current playlist with selected tracks in random order.
+ user: core
+
+
+ *: "Clear List & Play Shuffled"
+
+
+ *: "Clear List & Play Shuffled"
+
\ No newline at end of file
diff --git a/apps/onplay.c b/apps/onplay.c
index be92a2909a..d72f592f2e 100644
--- a/apps/onplay.c
+++ b/apps/onplay.c
@@ -481,13 +481,9 @@ static bool add_to_playlist(int position, bool queue)
bool new_playlist = false;
if (!(audio_status() & AUDIO_STATUS_PLAY))
{
+ new_playlist = true;
if (position == PLAYLIST_REPLACE)
- {
- new_playlist = true;
position = PLAYLIST_INSERT;
- }
- else if (global_status.resume_index == -1 || playlist_resume() == -1)
- new_playlist = true;
}
const char *lines[] = {
@@ -569,7 +565,9 @@ static bool view_playlist(void)
static int playlist_insert_func(void *param)
{
- if (((intptr_t)param == PLAYLIST_REPLACE) && !warn_on_pl_erase())
+ if (((intptr_t)param == PLAYLIST_REPLACE ||
+ ((intptr_t)param == PLAYLIST_INSERT_SHUFFLED && !(audio_status() & AUDIO_STATUS_PLAY))) &&
+ !warn_on_pl_erase())
return 0;
add_to_playlist((intptr_t)param, false);
return 0;
@@ -592,7 +590,7 @@ static int treeplaylist_callback(int action,
/* insert items */
MENUITEM_FUNCTION(i_pl_item, MENU_FUNC_USEPARAM, ID2P(LANG_INSERT),
playlist_insert_func, (intptr_t*)PLAYLIST_INSERT,
- treeplaylist_callback, Icon_Playlist);
+ treeplaylist_wplayback_callback, Icon_Playlist);
MENUITEM_FUNCTION(i_first_pl_item, MENU_FUNC_USEPARAM, ID2P(LANG_INSERT_FIRST),
playlist_insert_func, (intptr_t*)PLAYLIST_INSERT_FIRST,
treeplaylist_wplayback_callback, Icon_Playlist);
@@ -677,6 +675,11 @@ MENUITEM_FUNCTION(replace_pl_item, MENU_FUNC_USEPARAM, ID2P(LANG_CLEAR_LIST_AND_
playlist_insert_func, (intptr_t*)PLAYLIST_REPLACE,
NULL, Icon_Playlist);
+MENUITEM_FUNCTION(replace_shuf_pl_item, MENU_FUNC_USEPARAM,
+ ID2P(LANG_CLEAR_LIST_AND_PLAY_SHUFFLED), playlist_insert_func,
+ (intptr_t*)PLAYLIST_INSERT_SHUFFLED,
+ treeplaylist_callback, Icon_Playlist);
+
MAKE_ONPLAYMENU(tree_playlist_menu, ID2P(LANG_CURRENT_PLAYLIST),
treeplaylist_callback, Icon_Playlist,
@@ -698,7 +701,8 @@ MAKE_ONPLAYMENU(tree_playlist_menu, ID2P(LANG_CURRENT_PLAYLIST),
&queue_menu,
/* replace */
- &replace_pl_item
+ &replace_pl_item,
+ &replace_shuf_pl_item
);
static int treeplaylist_callback(int action,
const struct menu_item_ex *this_item,
@@ -715,11 +719,6 @@ static int treeplaylist_callback(int action,
(selected_file_attr & ATTR_DIRECTORY))
return action;
}
- else if (this_item == &i_pl_item &&
- global_status.resume_index != -1)
- {
- return action;
- }
else if ((this_item == &q_pl_item ||
this_item == &q_first_pl_item ||
this_item == &q_last_pl_item) &&
@@ -731,9 +730,16 @@ static int treeplaylist_callback(int action,
else if (this_item == &i_shuf_pl_item)
{
if (global_settings.show_shuffled_adding_options &&
- (global_status.resume_index != -1) &&
- ((audio_status() & AUDIO_STATUS_PLAY) ||
- (selected_file_attr & ATTR_DIRECTORY) ||
+ (audio_status() & AUDIO_STATUS_PLAY))
+ {
+ return action;
+ }
+ }
+ else if (this_item == &replace_shuf_pl_item)
+ {
+ if (global_settings.show_shuffled_adding_options &&
+ !(audio_status() & AUDIO_STATUS_PLAY) &&
+ ((selected_file_attr & ATTR_DIRECTORY) ||
((selected_file_attr & FILE_ATTR_MASK) == FILE_ATTR_M3U)))
{
return action;
diff --git a/manual/working_with_playlists/main.tex b/manual/working_with_playlists/main.tex
index 8bc233d346..4a8a0174ab 100644
--- a/manual/working_with_playlists/main.tex
+++ b/manual/working_with_playlists/main.tex
@@ -95,8 +95,11 @@ have not been added yet, immediately after the currently playing track.
\item [Insert Last Shuffled.] Add tracks in a random order to the end of the playlist.
-\item [Clear List \& Play Next.] Replaces all tracks in the dynamic playlist.
+\item [Clear List \& Play Next.] Replace all tracks in the dynamic playlist.
If a track is currently playing, it is only removed once it’s finished playing.
+
+\item [Clear List \& Play Shuffled.] Replace dynamic playlist with selected tracks
+in random order. Available, if playback is stopped.
\end{description}
There are also options for adding tracks only temporarily to the dynamic playlist.