summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
Diffstat (limited to 'apps')
-rw-r--r--apps/lang/english.lang56
-rw-r--r--apps/menus/playlist_menu.c22
-rw-r--r--apps/onplay.c154
-rw-r--r--apps/settings.h8
-rw-r--r--apps/settings_list.c9
5 files changed, 194 insertions, 55 deletions
diff --git a/apps/lang/english.lang b/apps/lang/english.lang
index 9b3f6712e4..80a29601a0 100644
--- a/apps/lang/english.lang
+++ b/apps/lang/english.lang
@@ -15618,3 +15618,59 @@
15618 *: "Clear List & Play Next" 15618 *: "Clear List & Play Next"
15619 </voice> 15619 </voice>
15620</phrase> 15620</phrase>
15621<phrase>
15622 id: LANG_QUEUE_MENU
15623 desc: in onplay menu
15624 user: core
15625 <source>
15626 *: "Queue..."
15627 </source>
15628 <dest>
15629 *: "Queue..."
15630 </dest>
15631 <voice>
15632 *: "Queue..."
15633 </voice>
15634</phrase>
15635<phrase>
15636 id: LANG_SHOW_QUEUE_OPTIONS
15637 desc: in Current Playlist settings
15638 user: core
15639 <source>
15640 *: "Show Queue Options"
15641 </source>
15642 <dest>
15643 *: "Show Queue Options"
15644 </dest>
15645 <voice>
15646 *: "Show Queue Options"
15647 </voice>
15648</phrase>
15649<phrase>
15650 id: LANG_SHOW_SHUFFLED_ADDING_OPTIONS
15651 desc: in Current Playlist settings
15652 user: core
15653 <source>
15654 *: "Show Shuffled Adding Options"
15655 </source>
15656 <dest>
15657 *: "Show Shuffled Adding Options"
15658 </dest>
15659 <voice>
15660 *: "Show Shuffled Adding Options"
15661 </voice>
15662</phrase>
15663<phrase>
15664 id: LANG_IN_SUBMENU
15665 desc: in Settings
15666 user: core
15667 <source>
15668 *: "In Submenu"
15669 </source>
15670 <dest>
15671 *: "In Submenu"
15672 </dest>
15673 <voice>
15674 *: "In Submenu"
15675 </voice>
15676</phrase> \ No newline at end of file
diff --git a/apps/menus/playlist_menu.c b/apps/menus/playlist_menu.c
index b0d9a44a9e..dfb9d73d62 100644
--- a/apps/menus/playlist_menu.c
+++ b/apps/menus/playlist_menu.c
@@ -80,15 +80,14 @@ static int playlist_view_(void)
80 playlist_viewer_ex(NULL); 80 playlist_viewer_ex(NULL);
81 return 0; 81 return 0;
82} 82}
83MENUITEM_FUNCTION(create_playlist_item, 0, ID2P(LANG_CREATE_PLAYLIST), 83MENUITEM_FUNCTION(create_playlist_item, 0, ID2P(LANG_CREATE_PLAYLIST),
84 create_playlist, NULL, NULL, Icon_NOICON); 84 create_playlist, NULL, NULL, Icon_NOICON);
85MENUITEM_FUNCTION(view_cur_playlist, 0, 85MENUITEM_FUNCTION(view_cur_playlist, 0,
86 ID2P(LANG_VIEW_DYNAMIC_PLAYLIST), 86 ID2P(LANG_VIEW_DYNAMIC_PLAYLIST),
87 playlist_view_, NULL, NULL, Icon_NOICON); 87 playlist_view_, NULL, NULL, Icon_NOICON);
88MENUITEM_FUNCTION(save_playlist, MENU_FUNC_USEPARAM, ID2P(LANG_SAVE_DYNAMIC_PLAYLIST), 88MENUITEM_FUNCTION(save_playlist, MENU_FUNC_USEPARAM, ID2P(LANG_SAVE_DYNAMIC_PLAYLIST),
89 save_playlist_screen, NULL, NULL, Icon_NOICON); 89 save_playlist_screen, NULL, NULL, Icon_NOICON);
90MENUITEM_SETTING(recursive_dir_insert, &global_settings.recursive_dir_insert, NULL); 90MENUITEM_SETTING(recursive_dir_insert, &global_settings.recursive_dir_insert, NULL);
91MENUITEM_SETTING(warn_on_erase, &global_settings.warnon_erase_dynplaylist, NULL);
92static int clear_catalog_directory(void) 91static int clear_catalog_directory(void)
93{ 92{
94 catalog_set_directory(NULL); 93 catalog_set_directory(NULL);
@@ -96,22 +95,29 @@ static int clear_catalog_directory(void)
96 splash(HZ, ID2P(LANG_RESET_DONE_CLEAR)); 95 splash(HZ, ID2P(LANG_RESET_DONE_CLEAR));
97 return false; 96 return false;
98} 97}
99MENUITEM_FUNCTION(clear_catalog_directory_item, 0, ID2P(LANG_RESET_PLAYLISTCAT_DIR), 98MENUITEM_FUNCTION(clear_catalog_directory_item, 0, ID2P(LANG_RESET_PLAYLISTCAT_DIR),
100 clear_catalog_directory, NULL, NULL, Icon_file_view_menu); 99 clear_catalog_directory, NULL, NULL, Icon_file_view_menu);
101 100
102/* Playlist viewer settings submenu */ 101/* Playlist viewer settings submenu */
103MENUITEM_SETTING(show_icons, &global_settings.playlist_viewer_icons, NULL); 102MENUITEM_SETTING(show_icons, &global_settings.playlist_viewer_icons, NULL);
104MENUITEM_SETTING(show_indices, &global_settings.playlist_viewer_indices, NULL); 103MENUITEM_SETTING(show_indices, &global_settings.playlist_viewer_indices, NULL);
105MENUITEM_SETTING(track_display, 104MENUITEM_SETTING(track_display,
106 &global_settings.playlist_viewer_track_display, NULL); 105 &global_settings.playlist_viewer_track_display, NULL);
107MAKE_MENU(viewer_settings_menu, ID2P(LANG_PLAYLISTVIEWER_SETTINGS), 106MAKE_MENU(viewer_settings_menu, ID2P(LANG_PLAYLISTVIEWER_SETTINGS),
108 NULL, Icon_Playlist, 107 NULL, Icon_Playlist,
109 &show_icons, &show_indices, &track_display); 108 &show_icons, &show_indices, &track_display);
110 109
110/* Current Playlist submenu */
111MENUITEM_SETTING(warn_on_erase, &global_settings.warnon_erase_dynplaylist, NULL);
112MENUITEM_SETTING(show_shuffled_adding_options, &global_settings.show_shuffled_adding_options, NULL);
113MENUITEM_SETTING(show_queue_options, &global_settings.show_queue_options, NULL);
114MAKE_MENU(currentplaylist_settings_menu, ID2P(LANG_CURRENT_PLAYLIST),
115 NULL, Icon_Playlist,
116 &warn_on_erase, &show_shuffled_adding_options, &show_queue_options);
111 117
112MAKE_MENU(playlist_settings, ID2P(LANG_PLAYLISTS), NULL, 118MAKE_MENU(playlist_settings, ID2P(LANG_PLAYLISTS), NULL,
113 Icon_Playlist, 119 Icon_Playlist,
114 &viewer_settings_menu, &recursive_dir_insert, &warn_on_erase); 120 &viewer_settings_menu, &recursive_dir_insert, &currentplaylist_settings_menu);
115MAKE_MENU(playlist_options, ID2P(LANG_PLAYLISTS), NULL, 121MAKE_MENU(playlist_options, ID2P(LANG_PLAYLISTS), NULL,
116 Icon_Playlist, 122 Icon_Playlist,
117 &create_playlist_item, &view_cur_playlist, 123 &create_playlist_item, &view_cur_playlist,
diff --git a/apps/onplay.c b/apps/onplay.c
index 35d9a82bfd..be92a2909a 100644
--- a/apps/onplay.c
+++ b/apps/onplay.c
@@ -582,22 +582,8 @@ static int playlist_queue_func(void *param)
582} 582}
583 583
584static int treeplaylist_wplayback_callback(int action, 584static int treeplaylist_wplayback_callback(int action,
585 const struct menu_item_ex* this_item, 585 const struct menu_item_ex* this_item,
586 struct gui_synclist *this_list) 586 struct gui_synclist *this_list);
587{
588 (void)this_item;
589 (void)this_list;
590 switch (action)
591 {
592 case ACTION_REQUEST_MENUITEM:
593 if (audio_status() & AUDIO_STATUS_PLAY)
594 return action;
595 else
596 return ACTION_EXIT_MENUITEM;
597 break;
598 }
599 return action;
600}
601 587
602static int treeplaylist_callback(int action, 588static int treeplaylist_callback(int action,
603 const struct menu_item_ex *this_item, 589 const struct menu_item_ex *this_item,
@@ -624,40 +610,95 @@ MENUITEM_FUNCTION(i_last_shuf_pl_item, MENU_FUNC_USEPARAM,
624/* queue items */ 610/* queue items */
625MENUITEM_FUNCTION(q_pl_item, MENU_FUNC_USEPARAM, ID2P(LANG_QUEUE), 611MENUITEM_FUNCTION(q_pl_item, MENU_FUNC_USEPARAM, ID2P(LANG_QUEUE),
626 playlist_queue_func, (intptr_t*)PLAYLIST_INSERT, 612 playlist_queue_func, (intptr_t*)PLAYLIST_INSERT,
627 treeplaylist_wplayback_callback, Icon_Playlist); 613 treeplaylist_callback, Icon_Playlist);
628MENUITEM_FUNCTION(q_first_pl_item, MENU_FUNC_USEPARAM, ID2P(LANG_QUEUE_FIRST), 614MENUITEM_FUNCTION(q_first_pl_item, MENU_FUNC_USEPARAM, ID2P(LANG_QUEUE_FIRST),
629 playlist_queue_func, (intptr_t*)PLAYLIST_INSERT_FIRST, 615 playlist_queue_func, (intptr_t*)PLAYLIST_INSERT_FIRST,
630 treeplaylist_wplayback_callback, Icon_Playlist); 616 treeplaylist_callback, Icon_Playlist);
631MENUITEM_FUNCTION(q_last_pl_item, MENU_FUNC_USEPARAM, ID2P(LANG_QUEUE_LAST), 617MENUITEM_FUNCTION(q_last_pl_item, MENU_FUNC_USEPARAM, ID2P(LANG_QUEUE_LAST),
632 playlist_queue_func, (intptr_t*)PLAYLIST_INSERT_LAST, 618 playlist_queue_func, (intptr_t*)PLAYLIST_INSERT_LAST,
633 treeplaylist_wplayback_callback, Icon_Playlist); 619 treeplaylist_callback, Icon_Playlist);
634MENUITEM_FUNCTION(q_shuf_pl_item, MENU_FUNC_USEPARAM, 620MENUITEM_FUNCTION(q_shuf_pl_item, MENU_FUNC_USEPARAM,
635 ID2P(LANG_QUEUE_SHUFFLED), playlist_queue_func, 621 ID2P(LANG_QUEUE_SHUFFLED), playlist_queue_func,
636 (intptr_t*)PLAYLIST_INSERT_SHUFFLED, 622 (intptr_t*)PLAYLIST_INSERT_SHUFFLED,
637 treeplaylist_wplayback_callback, Icon_Playlist); 623 treeplaylist_callback, Icon_Playlist);
638MENUITEM_FUNCTION(q_last_shuf_pl_item, MENU_FUNC_USEPARAM, 624MENUITEM_FUNCTION(q_last_shuf_pl_item, MENU_FUNC_USEPARAM,
639 ID2P(LANG_QUEUE_LAST_SHUFFLED), playlist_queue_func, 625 ID2P(LANG_QUEUE_LAST_SHUFFLED), playlist_queue_func,
640 (intptr_t*)PLAYLIST_INSERT_LAST_SHUFFLED, 626 (intptr_t*)PLAYLIST_INSERT_LAST_SHUFFLED,
641 treeplaylist_callback, Icon_Playlist); 627 treeplaylist_callback, Icon_Playlist);
628
629/* queue items in submenu */
630MENUITEM_FUNCTION(q_pl_submenu_item, MENU_FUNC_USEPARAM, ID2P(LANG_QUEUE),
631 playlist_queue_func, (intptr_t*)PLAYLIST_INSERT,
632 NULL, Icon_Playlist);
633MENUITEM_FUNCTION(q_first_pl_submenu_item, MENU_FUNC_USEPARAM, ID2P(LANG_QUEUE_FIRST),
634 playlist_queue_func, (intptr_t*)PLAYLIST_INSERT_FIRST,
635 NULL, Icon_Playlist);
636MENUITEM_FUNCTION(q_last_pl_submenu_item, MENU_FUNC_USEPARAM, ID2P(LANG_QUEUE_LAST),
637 playlist_queue_func, (intptr_t*)PLAYLIST_INSERT_LAST,
638 NULL, Icon_Playlist);
639MENUITEM_FUNCTION(q_shuf_pl_submenu_item, MENU_FUNC_USEPARAM,
640 ID2P(LANG_QUEUE_SHUFFLED), playlist_queue_func,
641 (intptr_t*)PLAYLIST_INSERT_SHUFFLED,
642 treeplaylist_callback, Icon_Playlist);
643MENUITEM_FUNCTION(q_last_shuf_pl_submenu_item, MENU_FUNC_USEPARAM,
644 ID2P(LANG_QUEUE_LAST_SHUFFLED), playlist_queue_func,
645 (intptr_t*)PLAYLIST_INSERT_LAST_SHUFFLED,
646 treeplaylist_callback, Icon_Playlist);
647
648MAKE_ONPLAYMENU(queue_menu, ID2P(LANG_QUEUE_MENU),
649 treeplaylist_wplayback_callback, Icon_Playlist,
650 &q_pl_submenu_item,
651 &q_first_pl_submenu_item,
652 &q_last_pl_submenu_item,
653 &q_shuf_pl_submenu_item,
654 &q_last_shuf_pl_submenu_item);
655
656static int treeplaylist_wplayback_callback(int action,
657 const struct menu_item_ex* this_item,
658 struct gui_synclist *this_list)
659{
660 (void)this_list;
661 switch (action)
662 {
663 case ACTION_REQUEST_MENUITEM:
664 if ((audio_status() & AUDIO_STATUS_PLAY) &&
665 (this_item != &queue_menu ||
666 global_settings.show_queue_options == QUEUE_SHOW_IN_SUBMENU))
667 return action;
668 else
669 return ACTION_EXIT_MENUITEM;
670 break;
671 }
672 return action;
673}
674
642/* replace playlist */ 675/* replace playlist */
643MENUITEM_FUNCTION(replace_pl_item, MENU_FUNC_USEPARAM, ID2P(LANG_CLEAR_LIST_AND_PLAY_NEXT), 676MENUITEM_FUNCTION(replace_pl_item, MENU_FUNC_USEPARAM, ID2P(LANG_CLEAR_LIST_AND_PLAY_NEXT),
644 playlist_insert_func, (intptr_t*)PLAYLIST_REPLACE, 677 playlist_insert_func, (intptr_t*)PLAYLIST_REPLACE,
645 NULL, Icon_Playlist); 678 NULL, Icon_Playlist);
646 679
680MAKE_ONPLAYMENU(tree_playlist_menu, ID2P(LANG_CURRENT_PLAYLIST),
681 treeplaylist_callback, Icon_Playlist,
647 682
648MAKE_ONPLAYMENU( tree_playlist_menu, ID2P(LANG_CURRENT_PLAYLIST), 683 /* insert */
649 treeplaylist_callback, Icon_Playlist, 684 &i_pl_item,
685 &i_first_pl_item,
686 &i_last_pl_item,
687 &i_shuf_pl_item,
688 &i_last_shuf_pl_item,
650 689
651 /* insert */ 690 /* queue */
652 &i_pl_item, &i_first_pl_item, &i_last_pl_item, 691 &q_pl_item,
653 &i_shuf_pl_item, &i_last_shuf_pl_item, 692 &q_first_pl_item,
654 /* queue */ 693 &q_last_pl_item,
694 &q_shuf_pl_item,
695 &q_last_shuf_pl_item,
655 696
656 &q_pl_item, &q_first_pl_item, &q_last_pl_item, 697 /* Queue submenu */
657 &q_shuf_pl_item, &q_last_shuf_pl_item, 698 &queue_menu,
658 699
659 /* replace */ 700 /* replace */
660 &replace_pl_item 701 &replace_pl_item
661 ); 702 );
662static int treeplaylist_callback(int action, 703static int treeplaylist_callback(int action,
663 const struct menu_item_ex *this_item, 704 const struct menu_item_ex *this_item,
@@ -669,36 +710,55 @@ static int treeplaylist_callback(int action,
669 case ACTION_REQUEST_MENUITEM: 710 case ACTION_REQUEST_MENUITEM:
670 if (this_item == &tree_playlist_menu) 711 if (this_item == &tree_playlist_menu)
671 { 712 {
672 if (((selected_file_attr & FILE_ATTR_MASK) == 713 if ((selected_file_attr & FILE_ATTR_MASK) == FILE_ATTR_AUDIO ||
673 FILE_ATTR_AUDIO) || 714 (selected_file_attr & FILE_ATTR_MASK) == FILE_ATTR_M3U ||
674 ((selected_file_attr & FILE_ATTR_MASK) == FILE_ATTR_M3U)|| 715 (selected_file_attr & ATTR_DIRECTORY))
675 (selected_file_attr & ATTR_DIRECTORY)) 716 return action;
676 {
677 return action;
678 }
679 } 717 }
680 else if (this_item == &i_pl_item) 718 else if (this_item == &i_pl_item &&
719 global_status.resume_index != -1)
681 { 720 {
682 if (global_status.resume_index != -1) 721 return action;
683 return action; 722 }
723 else if ((this_item == &q_pl_item ||
724 this_item == &q_first_pl_item ||
725 this_item == &q_last_pl_item) &&
726 global_settings.show_queue_options == QUEUE_SHOW_AT_TOPLEVEL &&
727 (audio_status() & AUDIO_STATUS_PLAY))
728 {
729 return action;
684 } 730 }
685 else if (this_item == &i_shuf_pl_item) 731 else if (this_item == &i_shuf_pl_item)
686 { 732 {
687 if ((global_status.resume_index != -1) && 733 if (global_settings.show_shuffled_adding_options &&
688 ((audio_status() & AUDIO_STATUS_PLAY) || 734 (global_status.resume_index != -1) &&
689 (selected_file_attr & ATTR_DIRECTORY) || 735 ((audio_status() & AUDIO_STATUS_PLAY) ||
690 ((selected_file_attr & FILE_ATTR_MASK) == FILE_ATTR_M3U))) 736 (selected_file_attr & ATTR_DIRECTORY) ||
737 ((selected_file_attr & FILE_ATTR_MASK) == FILE_ATTR_M3U)))
738 {
739 return action;
740 }
741 }
742 else if (this_item == &q_shuf_pl_submenu_item ||
743 (this_item == &q_shuf_pl_item &&
744 global_settings.show_queue_options == QUEUE_SHOW_AT_TOPLEVEL))
745 {
746 if (global_settings.show_shuffled_adding_options &&
747 (audio_status() & AUDIO_STATUS_PLAY))
691 { 748 {
692 return action; 749 return action;
693 } 750 }
694 } 751 }
695 else if (this_item == &i_last_shuf_pl_item || 752 else if (this_item == &i_last_shuf_pl_item ||
696 this_item == &q_last_shuf_pl_item) 753 this_item == &q_last_shuf_pl_submenu_item ||
754 (this_item == &q_last_shuf_pl_item &&
755 global_settings.show_queue_options == QUEUE_SHOW_AT_TOPLEVEL))
697 { 756 {
698 if ((playlist_amount() > 0) && 757 if (global_settings.show_shuffled_adding_options &&
758 (playlist_amount() > 0) &&
699 (audio_status() & AUDIO_STATUS_PLAY) && 759 (audio_status() & AUDIO_STATUS_PLAY) &&
700 ((selected_file_attr & ATTR_DIRECTORY) || 760 ((selected_file_attr & ATTR_DIRECTORY) ||
701 ((selected_file_attr & FILE_ATTR_MASK) == FILE_ATTR_M3U))) 761 ((selected_file_attr & FILE_ATTR_MASK) == FILE_ATTR_M3U)))
702 { 762 {
703 return action; 763 return action;
704 } 764 }
diff --git a/apps/settings.h b/apps/settings.h
index 60f2b44588..cc60617de4 100644
--- a/apps/settings.h
+++ b/apps/settings.h
@@ -109,6 +109,12 @@ enum
109 NUM_REPEAT_MODES 109 NUM_REPEAT_MODES
110}; 110};
111 111
112enum
113{
114 QUEUE_HIDE = 0,
115 QUEUE_SHOW_AT_TOPLEVEL,
116 QUEUE_SHOW_IN_SUBMENU
117};
112 118
113/* dir filter options */ 119/* dir filter options */
114/* Note: Any new filter modes need to be added before NUM_FILTER_MODES. 120/* Note: Any new filter modes need to be added before NUM_FILTER_MODES.
@@ -574,6 +580,8 @@ struct user_settings
574 bool fade_on_stop; /* fade on pause/unpause/stop */ 580 bool fade_on_stop; /* fade on pause/unpause/stop */
575 bool playlist_shuffle; 581 bool playlist_shuffle;
576 bool warnon_erase_dynplaylist; /* warn when erasing dynamic playlist */ 582 bool warnon_erase_dynplaylist; /* warn when erasing dynamic playlist */
583 bool show_shuffled_adding_options; /* whether to display options for adding shuffled tracks to dynamic playlist */
584 int show_queue_options; /* how and whether to display options to queue tracks */
577 585
578 /* playlist viewer settings */ 586 /* playlist viewer settings */
579 bool playlist_viewer_icons; /* display icons on viewer */ 587 bool playlist_viewer_icons; /* display icons on viewer */
diff --git a/apps/settings_list.c b/apps/settings_list.c
index cf52f26080..e5c02f6bf3 100644
--- a/apps/settings_list.c
+++ b/apps/settings_list.c
@@ -1788,6 +1788,15 @@ const struct settings_list settings[] = {
1788 OFFON_SETTING(0, warnon_erase_dynplaylist, LANG_WARN_ERASEDYNPLAYLIST_MENU, 1788 OFFON_SETTING(0, warnon_erase_dynplaylist, LANG_WARN_ERASEDYNPLAYLIST_MENU,
1789 true, "warn when erasing dynamic playlist",NULL), 1789 true, "warn when erasing dynamic playlist",NULL),
1790 1790
1791 OFFON_SETTING(0, show_shuffled_adding_options, LANG_SHOW_SHUFFLED_ADDING_OPTIONS, true,
1792 "show shuffled adding options", NULL),
1793 CHOICE_SETTING(0, show_queue_options, LANG_SHOW_QUEUE_OPTIONS, 1,
1794 "show queue options", "off,on,in submenu",
1795 NULL, 3,
1796 ID2P(LANG_SET_BOOL_NO),
1797 ID2P(LANG_SET_BOOL_YES),
1798 ID2P(LANG_IN_SUBMENU)),
1799
1791#ifdef HAVE_BACKLIGHT 1800#ifdef HAVE_BACKLIGHT
1792#ifdef HAS_BUTTON_HOLD 1801#ifdef HAS_BUTTON_HOLD
1793 CHOICE_SETTING(0, backlight_on_button_hold, LANG_BACKLIGHT_ON_BUTTON_HOLD, 1802 CHOICE_SETTING(0, backlight_on_button_hold, LANG_BACKLIGHT_ON_BUTTON_HOLD,