summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAidan MacDonald <amachronic@protonmail.com>2022-04-09 15:55:10 +0100
committerAidan MacDonald <amachronic@protonmail.com>2022-05-14 16:05:45 +0100
commit70087fb9f383af48c5fecb1aa275f4a68cda3298 (patch)
tree59ebc73356039b6f7f072b309eed914adf84572f
parent7363d65f10ac1b14f6e924ea6b78da355efaa936 (diff)
downloadrockbox-70087fb9f383af48c5fecb1aa275f4a68cda3298.tar.gz
rockbox-70087fb9f383af48c5fecb1aa275f4a68cda3298.zip
apps: Change playlist context menu behavior, fix FS#13336
Rename the "Clear List & Play" options to simply Play and Play Shuffled, and change their behavior slightly. Previously they would leave the current song playing, but now they will start playing the first song of the new playlist immediately. Shuffle options are now consistently hidden whenever a single file is selected. Fixes FS#13336 -- Play Shuffled is now always displayed where applicable, regardless of playback state. Change-Id: Idd454b4f9ab2c98cda3ce0389add747a3273fb42
-rw-r--r--apps/lang/english.lang44
-rw-r--r--apps/onplay.c273
-rw-r--r--manual/working_with_playlists/main.tex35
3 files changed, 170 insertions, 182 deletions
diff --git a/apps/lang/english.lang b/apps/lang/english.lang
index c843471831..4689660176 100644
--- a/apps/lang/english.lang
+++ b/apps/lang/english.lang
@@ -15807,16 +15807,16 @@
15807</phrase> 15807</phrase>
15808<phrase> 15808<phrase>
15809 id: LANG_CLEAR_LIST_AND_PLAY_NEXT 15809 id: LANG_CLEAR_LIST_AND_PLAY_NEXT
15810 desc: in onplay menu. Replace current playlist with selected tracks 15810 desc: deprecated
15811 user: core 15811 user: core
15812 <source> 15812 <source>
15813 *: "Clear List & Play Next" 15813 *: ""
15814 </source> 15814 </source>
15815 <dest> 15815 <dest>
15816 *: "Clear List & Play Next" 15816 *: ""
15817 </dest> 15817 </dest>
15818 <voice> 15818 <voice>
15819 *: "Clear List & Play Next" 15819 *: ""
15820 </voice> 15820 </voice>
15821</phrase> 15821</phrase>
15822<phrase> 15822<phrase>
@@ -15877,16 +15877,16 @@
15877</phrase> 15877</phrase>
15878<phrase> 15878<phrase>
15879 id: LANG_CLEAR_LIST_AND_PLAY_SHUFFLED 15879 id: LANG_CLEAR_LIST_AND_PLAY_SHUFFLED
15880 desc: in onplay menu. Replace current playlist with selected tracks in random order. 15880 desc: deprecated
15881 user: core 15881 user: core
15882 <source> 15882 <source>
15883 *: "Clear List & Play Shuffled" 15883 *: ""
15884 </source> 15884 </source>
15885 <dest> 15885 <dest>
15886 *: "Clear List & Play Shuffled" 15886 *: ""
15887 </dest> 15887 </dest>
15888 <voice> 15888 <voice>
15889 *: "Clear List & Play Shuffled" 15889 *: ""
15890 </voice> 15890 </voice>
15891</phrase> 15891</phrase>
15892<phrase> 15892<phrase>
@@ -16326,3 +16326,31 @@
16326 *: "Track Info" 16326 *: "Track Info"
16327 </voice> 16327 </voice>
16328</phrase> 16328</phrase>
16329<phrase>
16330 id: LANG_PLAY
16331 desc: play selected file/directory, in playlist context menu
16332 user: core
16333 <source>
16334 *: "Play"
16335 </source>
16336 <dest>
16337 *: "Play"
16338 </dest>
16339 <voice>
16340 *: "Play"
16341 </voice>
16342</phrase>
16343<phrase>
16344 id: LANG_PLAY_SHUFFLED
16345 desc: play selected files in shuffled order, in playlist context menu
16346 user: core
16347 <source>
16348 *: "Play Shuffled"
16349 </source>
16350 <dest>
16351 *: "Play Shuffled"
16352 </dest>
16353 <voice>
16354 *: "Play Shuffled"
16355 </voice>
16356</phrase>
diff --git a/apps/onplay.c b/apps/onplay.c
index a78cf7ceac..729fe40f0a 100644
--- a/apps/onplay.c
+++ b/apps/onplay.c
@@ -476,16 +476,40 @@ MAKE_ONPLAYMENU( wps_playlist_menu, ID2P(LANG_PLAYLIST),
476 &playlist_save_item, &reshuffle_item, &playing_time_item 476 &playlist_save_item, &reshuffle_item, &playing_time_item
477 ); 477 );
478 478
479/* argument for add_to_playlist (for use by menu callbacks) */
480struct add_to_pl_param
481{
482 int8_t position;
483 unsigned int queue: 1;
484 unsigned int replace: 1;
485};
486
487static struct add_to_pl_param addtopl_insert = {PLAYLIST_INSERT, 0, 0};
488static struct add_to_pl_param addtopl_insert_first = {PLAYLIST_INSERT_FIRST, 0, 0};
489static struct add_to_pl_param addtopl_insert_last = {PLAYLIST_INSERT_LAST, 0, 0};
490static struct add_to_pl_param addtopl_insert_shuf = {PLAYLIST_INSERT_SHUFFLED, 0, 0};
491static struct add_to_pl_param addtopl_insert_last_shuf = {PLAYLIST_INSERT_LAST_SHUFFLED, 0, 0};
492
493static struct add_to_pl_param addtopl_queue = {PLAYLIST_INSERT, 1, 0};
494static struct add_to_pl_param addtopl_queue_first = {PLAYLIST_INSERT_FIRST, 1, 0};
495static struct add_to_pl_param addtopl_queue_last = {PLAYLIST_INSERT_LAST, 1, 0};
496static struct add_to_pl_param addtopl_queue_shuf = {PLAYLIST_INSERT_SHUFFLED, 1, 0};
497static struct add_to_pl_param addtopl_queue_last_shuf = {PLAYLIST_INSERT_LAST_SHUFFLED, 1, 0};
498
499static struct add_to_pl_param addtopl_replace = {PLAYLIST_INSERT, 0, 1};
500static struct add_to_pl_param addtopl_replace_shuffled = {PLAYLIST_INSERT_SHUFFLED, 0, 1};
501
479/* CONTEXT_[TREE|ID3DB|STD] playlist options */ 502/* CONTEXT_[TREE|ID3DB|STD] playlist options */
480static bool add_to_playlist(int position, bool queue) 503static int add_to_playlist(void* arg)
481{ 504{
482 bool new_playlist = false; 505 struct add_to_pl_param* param = arg;
483 if (!(audio_status() & AUDIO_STATUS_PLAY)) 506 int position = param->position;
484 { 507 bool new_playlist = param->replace ? true : false;
485 new_playlist = true; 508 bool queue = param->queue ? true : false;
486 if (position == PLAYLIST_REPLACE) 509
487 position = PLAYLIST_INSERT; 510 /* warn if replacing the playlist */
488 } 511 if (new_playlist && !warn_on_pl_erase())
512 return 0;
489 513
490 const char *lines[] = { 514 const char *lines[] = {
491 ID2P(LANG_RECURSE_DIRECTORY_QUESTION), 515 ID2P(LANG_RECURSE_DIRECTORY_QUESTION),
@@ -568,121 +592,59 @@ static bool view_playlist(void)
568 return result; 592 return result;
569} 593}
570 594
571static int playlist_insert_func(void *param)
572{
573 if (((intptr_t)param == PLAYLIST_REPLACE ||
574 (((intptr_t)param == PLAYLIST_INSERT_SHUFFLED || (intptr_t)param == PLAYLIST_INSERT)
575 && !(audio_status() & AUDIO_STATUS_PLAY))) && !warn_on_pl_erase())
576 return 0;
577 add_to_playlist((intptr_t)param, false);
578 return 0;
579}
580
581static int playlist_queue_func(void *param)
582{
583 add_to_playlist((intptr_t)param, true);
584 return 0;
585}
586
587static int treeplaylist_wplayback_callback(int action,
588 const struct menu_item_ex* this_item,
589 struct gui_synclist *this_list);
590
591static int treeplaylist_callback(int action, 595static int treeplaylist_callback(int action,
592 const struct menu_item_ex *this_item, 596 const struct menu_item_ex *this_item,
593 struct gui_synclist *this_list); 597 struct gui_synclist *this_list);
594 598
595/* insert items */ 599/* insert items */
596MENUITEM_FUNCTION(i_pl_item, MENU_FUNC_USEPARAM, ID2P(LANG_INSERT), 600MENUITEM_FUNCTION(i_pl_item, MENU_FUNC_USEPARAM, ID2P(LANG_INSERT),
597 playlist_insert_func, (intptr_t*)PLAYLIST_INSERT, 601 add_to_playlist, &addtopl_insert,
598 treeplaylist_wplayback_callback, Icon_Playlist); 602 treeplaylist_callback, Icon_Playlist);
599MENUITEM_FUNCTION(i_first_pl_item, MENU_FUNC_USEPARAM, ID2P(LANG_INSERT_FIRST), 603MENUITEM_FUNCTION(i_first_pl_item, MENU_FUNC_USEPARAM, ID2P(LANG_INSERT_FIRST),
600 playlist_insert_func, (intptr_t*)PLAYLIST_INSERT_FIRST, 604 add_to_playlist, &addtopl_insert_first,
601 treeplaylist_wplayback_callback, Icon_Playlist); 605 treeplaylist_callback, Icon_Playlist);
602MENUITEM_FUNCTION(i_last_pl_item, MENU_FUNC_USEPARAM, ID2P(LANG_INSERT_LAST), 606MENUITEM_FUNCTION(i_last_pl_item, MENU_FUNC_USEPARAM, ID2P(LANG_INSERT_LAST),
603 playlist_insert_func, (intptr_t*)PLAYLIST_INSERT_LAST, 607 add_to_playlist, &addtopl_insert_last,
604 treeplaylist_wplayback_callback, Icon_Playlist); 608 treeplaylist_callback, Icon_Playlist);
605MENUITEM_FUNCTION(i_shuf_pl_item, MENU_FUNC_USEPARAM, 609MENUITEM_FUNCTION(i_shuf_pl_item, MENU_FUNC_USEPARAM, ID2P(LANG_INSERT_SHUFFLED),
606 ID2P(LANG_INSERT_SHUFFLED), playlist_insert_func, 610 add_to_playlist, &addtopl_insert_shuf,
607 (intptr_t*)PLAYLIST_INSERT_SHUFFLED,
608 treeplaylist_callback, Icon_Playlist); 611 treeplaylist_callback, Icon_Playlist);
609MENUITEM_FUNCTION(i_last_shuf_pl_item, MENU_FUNC_USEPARAM, 612MENUITEM_FUNCTION(i_last_shuf_pl_item, MENU_FUNC_USEPARAM, ID2P(LANG_INSERT_LAST_SHUFFLED),
610 ID2P(LANG_INSERT_LAST_SHUFFLED), playlist_insert_func, 613 add_to_playlist, &addtopl_insert_last_shuf,
611 (intptr_t*)PLAYLIST_INSERT_LAST_SHUFFLED,
612 treeplaylist_callback, Icon_Playlist); 614 treeplaylist_callback, Icon_Playlist);
613/* queue items */ 615/* queue items */
614MENUITEM_FUNCTION(q_pl_item, MENU_FUNC_USEPARAM, ID2P(LANG_QUEUE), 616MENUITEM_FUNCTION(q_pl_item, MENU_FUNC_USEPARAM, ID2P(LANG_QUEUE),
615 playlist_queue_func, (intptr_t*)PLAYLIST_INSERT, 617 add_to_playlist, &addtopl_queue,
616 treeplaylist_callback, Icon_Playlist); 618 treeplaylist_callback, Icon_Playlist);
617MENUITEM_FUNCTION(q_first_pl_item, MENU_FUNC_USEPARAM, ID2P(LANG_QUEUE_FIRST), 619MENUITEM_FUNCTION(q_first_pl_item, MENU_FUNC_USEPARAM, ID2P(LANG_QUEUE_FIRST),
618 playlist_queue_func, (intptr_t*)PLAYLIST_INSERT_FIRST, 620 add_to_playlist, &addtopl_queue_first,
619 treeplaylist_callback, Icon_Playlist); 621 treeplaylist_callback, Icon_Playlist);
620MENUITEM_FUNCTION(q_last_pl_item, MENU_FUNC_USEPARAM, ID2P(LANG_QUEUE_LAST), 622MENUITEM_FUNCTION(q_last_pl_item, MENU_FUNC_USEPARAM, ID2P(LANG_QUEUE_LAST),
621 playlist_queue_func, (intptr_t*)PLAYLIST_INSERT_LAST, 623 add_to_playlist, &addtopl_queue_last,
622 treeplaylist_callback, Icon_Playlist); 624 treeplaylist_callback, Icon_Playlist);
623MENUITEM_FUNCTION(q_shuf_pl_item, MENU_FUNC_USEPARAM, 625MENUITEM_FUNCTION(q_shuf_pl_item, MENU_FUNC_USEPARAM, ID2P(LANG_QUEUE_SHUFFLED),
624 ID2P(LANG_QUEUE_SHUFFLED), playlist_queue_func, 626 add_to_playlist, &addtopl_queue_shuf,
625 (intptr_t*)PLAYLIST_INSERT_SHUFFLED,
626 treeplaylist_callback, Icon_Playlist); 627 treeplaylist_callback, Icon_Playlist);
627MENUITEM_FUNCTION(q_last_shuf_pl_item, MENU_FUNC_USEPARAM, 628MENUITEM_FUNCTION(q_last_shuf_pl_item, MENU_FUNC_USEPARAM, ID2P(LANG_QUEUE_LAST_SHUFFLED),
628 ID2P(LANG_QUEUE_LAST_SHUFFLED), playlist_queue_func, 629 add_to_playlist, &addtopl_queue_last_shuf,
629 (intptr_t*)PLAYLIST_INSERT_LAST_SHUFFLED,
630 treeplaylist_callback, Icon_Playlist);
631
632/* queue items in submenu */
633MENUITEM_FUNCTION(q_pl_submenu_item, MENU_FUNC_USEPARAM, ID2P(LANG_QUEUE),
634 playlist_queue_func, (intptr_t*)PLAYLIST_INSERT,
635 NULL, Icon_Playlist);
636MENUITEM_FUNCTION(q_first_pl_submenu_item, MENU_FUNC_USEPARAM, ID2P(LANG_QUEUE_FIRST),
637 playlist_queue_func, (intptr_t*)PLAYLIST_INSERT_FIRST,
638 NULL, Icon_Playlist);
639MENUITEM_FUNCTION(q_last_pl_submenu_item, MENU_FUNC_USEPARAM, ID2P(LANG_QUEUE_LAST),
640 playlist_queue_func, (intptr_t*)PLAYLIST_INSERT_LAST,
641 NULL, Icon_Playlist);
642MENUITEM_FUNCTION(q_shuf_pl_submenu_item, MENU_FUNC_USEPARAM,
643 ID2P(LANG_QUEUE_SHUFFLED), playlist_queue_func,
644 (intptr_t*)PLAYLIST_INSERT_SHUFFLED,
645 treeplaylist_callback, Icon_Playlist);
646MENUITEM_FUNCTION(q_last_shuf_pl_submenu_item, MENU_FUNC_USEPARAM,
647 ID2P(LANG_QUEUE_LAST_SHUFFLED), playlist_queue_func,
648 (intptr_t*)PLAYLIST_INSERT_LAST_SHUFFLED,
649 treeplaylist_callback, Icon_Playlist); 630 treeplaylist_callback, Icon_Playlist);
650 631
632/* queue submenu */
651MAKE_ONPLAYMENU(queue_menu, ID2P(LANG_QUEUE_MENU), 633MAKE_ONPLAYMENU(queue_menu, ID2P(LANG_QUEUE_MENU),
652 treeplaylist_wplayback_callback, Icon_Playlist, 634 treeplaylist_callback, Icon_Playlist,
653 &q_pl_submenu_item, 635 &q_pl_item,
654 &q_first_pl_submenu_item, 636 &q_first_pl_item,
655 &q_last_pl_submenu_item, 637 &q_last_pl_item,
656 &q_shuf_pl_submenu_item, 638 &q_shuf_pl_item,
657 &q_last_shuf_pl_submenu_item); 639 &q_last_shuf_pl_item);
658
659static int treeplaylist_wplayback_callback(int action,
660 const struct menu_item_ex* this_item,
661 struct gui_synclist *this_list)
662{
663 (void)this_list;
664 switch (action)
665 {
666 case ACTION_REQUEST_MENUITEM:
667 if ((audio_status() & AUDIO_STATUS_PLAY) &&
668 (this_item != &queue_menu ||
669 global_settings.show_queue_options == QUEUE_SHOW_IN_SUBMENU))
670 return action;
671 else
672 return ACTION_EXIT_MENUITEM;
673 break;
674 }
675 return action;
676}
677 640
678/* replace playlist */ 641/* replace playlist */
679MENUITEM_FUNCTION(replace_pl_item, MENU_FUNC_USEPARAM, ID2P(LANG_CLEAR_LIST_AND_PLAY_NEXT), 642MENUITEM_FUNCTION(replace_pl_item, MENU_FUNC_USEPARAM, ID2P(LANG_PLAY),
680 playlist_insert_func, (intptr_t*)PLAYLIST_REPLACE, 643 add_to_playlist, &addtopl_replace,
681 NULL, Icon_Playlist); 644 treeplaylist_callback, Icon_Playlist);
682 645
683MENUITEM_FUNCTION(replace_shuf_pl_item, MENU_FUNC_USEPARAM, 646MENUITEM_FUNCTION(replace_shuf_pl_item, MENU_FUNC_USEPARAM, ID2P(LANG_PLAY_SHUFFLED),
684 ID2P(LANG_CLEAR_LIST_AND_PLAY_SHUFFLED), playlist_insert_func, 647 add_to_playlist, &addtopl_replace_shuffled,
685 (intptr_t*)PLAYLIST_INSERT_SHUFFLED,
686 treeplaylist_callback, Icon_Playlist); 648 treeplaylist_callback, Icon_Playlist);
687 649
688MAKE_ONPLAYMENU(tree_playlist_menu, ID2P(LANG_CURRENT_PLAYLIST), 650MAKE_ONPLAYMENU(tree_playlist_menu, ID2P(LANG_CURRENT_PLAYLIST),
@@ -713,70 +675,71 @@ static int treeplaylist_callback(int action,
713 const struct menu_item_ex *this_item, 675 const struct menu_item_ex *this_item,
714 struct gui_synclist *this_list) 676 struct gui_synclist *this_list)
715{ 677{
678 static bool in_queue_submenu = false;
679
716 (void)this_list; 680 (void)this_list;
717 switch (action) 681 switch (action)
718 { 682 {
719 case ACTION_REQUEST_MENUITEM: 683 case ACTION_REQUEST_MENUITEM:
720 if (this_item == &tree_playlist_menu) 684 if (this_item == &tree_playlist_menu)
721 { 685 {
722 if ((selected_file_attr & FILE_ATTR_MASK) == FILE_ATTR_AUDIO || 686 if ((selected_file_attr & FILE_ATTR_MASK) != FILE_ATTR_AUDIO &&
723 (selected_file_attr & FILE_ATTR_MASK) == FILE_ATTR_M3U || 687 (selected_file_attr & FILE_ATTR_MASK) != FILE_ATTR_M3U &&
724 (selected_file_attr & ATTR_DIRECTORY)) 688 (selected_file_attr & ATTR_DIRECTORY) == 0)
725 return action; 689 return ACTION_EXIT_MENUITEM;
726 } 690 }
727 else if ((this_item == &q_pl_item || 691 else if (this_item == &queue_menu)
728 this_item == &q_first_pl_item || 692 {
729 this_item == &q_last_pl_item) && 693 if (global_settings.show_queue_options != QUEUE_SHOW_IN_SUBMENU)
730 global_settings.show_queue_options == QUEUE_SHOW_AT_TOPLEVEL && 694 return ACTION_EXIT_MENUITEM;
731 (audio_status() & AUDIO_STATUS_PLAY)) 695
732 { 696 /* queueing options only work during playback */
733 return action; 697 if (!(audio_status() & AUDIO_STATUS_PLAY))
734 } 698 return ACTION_EXIT_MENUITEM;
735 else if (this_item == &i_shuf_pl_item) 699 }
736 { 700 else if ((this_item->flags & MENU_TYPE_MASK) == MT_FUNCTION_CALL &&
737 if (global_settings.show_shuffled_adding_options && 701 this_item->function->function_w_param == add_to_playlist)
738 (audio_status() & AUDIO_STATUS_PLAY)) 702 {
739 { 703 struct add_to_pl_param *param = this_item->function->param;
740 return action; 704
741 } 705 if (param->queue)
742 }
743 else if (this_item == &replace_shuf_pl_item)
744 { 706 {
745 if (global_settings.show_shuffled_adding_options && 707 if (global_settings.show_queue_options != QUEUE_SHOW_AT_TOPLEVEL &&
746 !(audio_status() & AUDIO_STATUS_PLAY) && 708 !in_queue_submenu)
747 ((selected_file_attr & ATTR_DIRECTORY) || 709 return ACTION_EXIT_MENUITEM;
748 ((selected_file_attr & FILE_ATTR_MASK) == FILE_ATTR_M3U)))
749 {
750 return action;
751 }
752 } 710 }
753 else if (this_item == &q_shuf_pl_submenu_item || 711
754 (this_item == &q_shuf_pl_item && 712 if (param->position == PLAYLIST_INSERT_SHUFFLED ||
755 global_settings.show_queue_options == QUEUE_SHOW_AT_TOPLEVEL)) 713 param->position == PLAYLIST_INSERT_LAST_SHUFFLED)
756 { 714 {
757 if (global_settings.show_shuffled_adding_options && 715 if (!global_settings.show_shuffled_adding_options)
758 (audio_status() & AUDIO_STATUS_PLAY)) 716 return ACTION_EXIT_MENUITEM;
759 { 717
760 return action; 718 if ((selected_file_attr & FILE_ATTR_MASK) != FILE_ATTR_M3U &&
761 } 719 (selected_file_attr & ATTR_DIRECTORY) == 0)
720 return ACTION_EXIT_MENUITEM;
762 } 721 }
763 else if (this_item == &i_last_shuf_pl_item || 722
764 this_item == &q_last_shuf_pl_submenu_item || 723 if (!param->replace)
765 (this_item == &q_last_shuf_pl_item &&
766 global_settings.show_queue_options == QUEUE_SHOW_AT_TOPLEVEL))
767 { 724 {
768 if (global_settings.show_shuffled_adding_options && 725 if (!(audio_status() & AUDIO_STATUS_PLAY))
769 (playlist_amount() > 0) && 726 return ACTION_EXIT_MENUITEM;
770 (audio_status() & AUDIO_STATUS_PLAY) &&
771 ((selected_file_attr & ATTR_DIRECTORY) ||
772 ((selected_file_attr & FILE_ATTR_MASK) == FILE_ATTR_M3U)))
773 {
774 return action;
775 }
776 } 727 }
777 return ACTION_EXIT_MENUITEM; 728 }
778 break; 729
730 break;
731
732 case ACTION_ENTER_MENUITEM:
733 if (this_item == &queue_menu)
734 in_queue_submenu = true;
735 break;
736
737 case ACTION_EXIT_MENUITEM:
738 if (this_item == &queue_menu)
739 in_queue_submenu = false;
740 break;
779 } 741 }
742
780 return action; 743 return action;
781} 744}
782 745
@@ -1840,7 +1803,7 @@ static int playlist_insert_shuffled(void)
1840 (selected_file_attr & ATTR_DIRECTORY) || 1803 (selected_file_attr & ATTR_DIRECTORY) ||
1841 ((selected_file_attr & FILE_ATTR_MASK) == FILE_ATTR_M3U)) 1804 ((selected_file_attr & FILE_ATTR_MASK) == FILE_ATTR_M3U))
1842 { 1805 {
1843 playlist_insert_func((intptr_t*)PLAYLIST_INSERT_SHUFFLED); 1806 add_to_playlist(&addtopl_insert_shuf);
1844 return ONPLAY_START_PLAY; 1807 return ONPLAY_START_PLAY;
1845 } 1808 }
1846 1809
@@ -1883,7 +1846,7 @@ static struct hotkey_assignment hotkey_items[] = {
1883 HOTKEY_FUNC(delete_item, NULL), 1846 HOTKEY_FUNC(delete_item, NULL),
1884 ONPLAY_RELOAD_DIR }, 1847 ONPLAY_RELOAD_DIR },
1885 { HOTKEY_INSERT, LANG_INSERT, 1848 { HOTKEY_INSERT, LANG_INSERT,
1886 HOTKEY_FUNC(playlist_insert_func, (intptr_t*)PLAYLIST_INSERT), 1849 HOTKEY_FUNC(add_to_playlist, (intptr_t*)&addtopl_insert),
1887 ONPLAY_RELOAD_DIR }, 1850 ONPLAY_RELOAD_DIR },
1888 { HOTKEY_INSERT_SHUFFLED, LANG_INSERT_SHUFFLED, 1851 { HOTKEY_INSERT_SHUFFLED, LANG_INSERT_SHUFFLED,
1889 HOTKEY_FUNC(playlist_insert_shuffled, NULL), 1852 HOTKEY_FUNC(playlist_insert_shuffled, NULL),
diff --git a/manual/working_with_playlists/main.tex b/manual/working_with_playlists/main.tex
index d478dcd283..0d1ab7ef04 100644
--- a/manual/working_with_playlists/main.tex
+++ b/manual/working_with_playlists/main.tex
@@ -48,11 +48,11 @@ song.
48 rather than erasing the current 48 rather than erasing the current
49 playlist, see the section below on how to add music to a playlist.} 49 playlist, see the section below on how to add music to a playlist.}
50 50
51\subsubsection{By using the Clear List \& Play Next function} 51\subsubsection{By using the Play or Play Shuffled functions}
52The \setting{Clear List \& Play Next} function as described in 52The \setting{Play} function as described in \ref{ref:currentplaylist_submenu}
53\ref{ref:currentplaylist_submenu} will replace the dynamic playlist with the selected 53will replace the dynamic playlist with the selected tracks. The \setting{Play
54tracks. If a track is currently playing, it is only removed once it’s finished 54Shuffled} function is similar, except the selected tracks will be added to the
55playing. 55playlist in a random order.
56 56
57\subsubsection{\label{ref:playlist_catalogue}By using the Playlist catalogue} 57\subsubsection{\label{ref:playlist_catalogue}By using the Playlist catalogue}
58The \setting{Playlist catalogue} makes it possible to modify and create 58The \setting{Playlist catalogue} makes it possible to modify and create
@@ -96,20 +96,6 @@ have not been added yet, immediately after the currently playing track.
96\item [Insert Last Shuffled.] Add tracks in a random order to the end of the playlist. 96\item [Insert Last Shuffled.] Add tracks in a random order to the end of the playlist.
97\end{description} 97\end{description}
98 98
99If you want the existing playlist entries to first be removed before
100selected tracks are inserted, the following two options will achieve that effect.
101They are also available when playback is stopped, whereas the rest of the options
102require music to be playing or paused.
103
104\begin{description}
105\item [Clear List \& Play Next.] Replace all entries in the dynamic playlist with
106selected tracks. If a track is currently playing, it will be removed once it’s
107finished playing.
108
109\item [Clear List \& Play Shuffled.] Similar, except tracks are added in random order.
110Only available when playback is stopped.
111\end{description}
112
113Another possibility is to add tracks \emph{temporarily} to the dynamic playlist. 99Another possibility is to add tracks \emph{temporarily} to the dynamic playlist.
114In Rockbox’s parlance, this is called queuing. Queued tracks are automatically 100In Rockbox’s parlance, this is called queuing. Queued tracks are automatically
115removed from the playlist after they have been played. They are also not saved 101removed from the playlist after they have been played. They are also not saved
@@ -127,6 +113,17 @@ to the playlist file (see \reference{ref:playlistoptions}).
127\item [Queue Last Shuffled.] Corresponds to \setting{Insert Last Shuffled}. 113\item [Queue Last Shuffled.] Corresponds to \setting{Insert Last Shuffled}.
128\end{description} 114\end{description}
129 115
116If you'd like to replace the current playlist with the new selection, the
117following two options will achieve that effect.
118
119\begin{description}
120\item [Play.] Replace all entries in the dynamic playlist with the selected
121 tracks and start playing the new playlist immediately.
122
123\item [Play Shuffled.] Similar, except the tracks will be added to the new
124 playlist in random order.
125\end{description}
126
130\note{You can hide the options to add shuffled tracks or to queue tracks, if you wish. 127\note{You can hide the options to add shuffled tracks or to queue tracks, if you wish.
131The latter can also be put into its own submenu. Simply go to 128The latter can also be put into its own submenu. Simply go to
132\setting{Settings} $\rightarrow$ \setting{General Settings} $\rightarrow$ \setting{Playlists} 129\setting{Settings} $\rightarrow$ \setting{General Settings} $\rightarrow$ \setting{Playlists}