diff options
author | Christian Soffke <christian.soffke@gmail.com> | 2022-04-18 11:35:20 +0200 |
---|---|---|
committer | Solomon Peachy <pizza@shaftnet.org> | 2022-08-05 11:39:35 -0400 |
commit | cef9fa22ef11511f6d174b1e92f3350e514ef7d7 (patch) | |
tree | 2c86560670f19bfef62800b46066c967d2c111e3 /apps | |
parent | 3edf3ba18d5def6a03f65ccbd878558f98a2d70c (diff) | |
download | rockbox-cef9fa22ef11511f6d174b1e92f3350e514ef7d7.tar.gz rockbox-cef9fa22ef11511f6d174b1e92f3350e514ef7d7.zip |
playlist viewer: enable hotkey
'File Browser' hotkeys can now be used while
browsing a playlist.
The manual has been updated to reflect this and
to say that the File Browser hotkey works in
the context of the database as well (existing
behavior)
Change-Id: I51b23e82e0fb00772efdb8784db966d454fb2560
Diffstat (limited to 'apps')
-rw-r--r-- | apps/playlist_viewer.c | 165 |
1 files changed, 114 insertions, 51 deletions
diff --git a/apps/playlist_viewer.c b/apps/playlist_viewer.c index 8403aea6b6..7e50c42bdc 100644 --- a/apps/playlist_viewer.c +++ b/apps/playlist_viewer.c | |||
@@ -510,6 +510,17 @@ static enum pv_onplay_result show_track_info(const struct playlist_entry *curren | |||
510 | viewer.num_tracks) ? PV_ONPLAY_USB : PV_ONPLAY_UNCHANGED; | 510 | viewer.num_tracks) ? PV_ONPLAY_USB : PV_ONPLAY_UNCHANGED; |
511 | } | 511 | } |
512 | 512 | ||
513 | |||
514 | static enum pv_onplay_result open_with(const struct playlist_entry *current_track) | ||
515 | { | ||
516 | char selected_track[MAX_PATH]; | ||
517 | close_playlist_viewer(); | ||
518 | snprintf(selected_track, sizeof(selected_track), "%s", current_track->name); | ||
519 | |||
520 | return (filetype_list_viewers(selected_track) == | ||
521 | PLUGIN_USB_CONNECTED ? PV_ONPLAY_USB_CLOSED : PV_ONPLAY_CLOSED); | ||
522 | } | ||
523 | |||
513 | #ifdef HAVE_TAGCACHE | 524 | #ifdef HAVE_TAGCACHE |
514 | static enum pv_onplay_result open_pictureflow(const struct playlist_entry *current_track) | 525 | static enum pv_onplay_result open_pictureflow(const struct playlist_entry *current_track) |
515 | { | 526 | { |
@@ -522,6 +533,31 @@ static enum pv_onplay_result open_pictureflow(const struct playlist_entry *curre | |||
522 | } | 533 | } |
523 | #endif | 534 | #endif |
524 | 535 | ||
536 | static enum pv_onplay_result delete_track(int current_track_index, | ||
537 | int index, bool current_was_playing) | ||
538 | { | ||
539 | playlist_delete(viewer.playlist, current_track_index); | ||
540 | if (current_was_playing) | ||
541 | { | ||
542 | if (playlist_amount_ex(viewer.playlist) <= 0) | ||
543 | audio_stop(); | ||
544 | else | ||
545 | { | ||
546 | /* Start playing new track except if it's the lasttrack | ||
547 | track in the playlist and repeat mode is disabled */ | ||
548 | struct playlist_entry *current_track = | ||
549 | playlist_buffer_get_track(&viewer.buffer, index); | ||
550 | if (current_track->display_index != viewer.num_tracks || | ||
551 | global_settings.repeat_mode == REPEAT_ALL) | ||
552 | { | ||
553 | audio_play(0, 0); | ||
554 | viewer.current_playing_track = -1; | ||
555 | } | ||
556 | } | ||
557 | } | ||
558 | return PV_ONPLAY_ITEM_REMOVED; | ||
559 | } | ||
560 | |||
525 | /* Menu of playlist commands. Invoked via ON+PLAY on main viewer screen. */ | 561 | /* Menu of playlist commands. Invoked via ON+PLAY on main viewer screen. */ |
526 | static enum pv_onplay_result onplay_menu(int index) | 562 | static enum pv_onplay_result onplay_menu(int index) |
527 | { | 563 | { |
@@ -539,7 +575,7 @@ static enum pv_onplay_result onplay_menu(int index) | |||
539 | #endif | 575 | #endif |
540 | ); | 576 | ); |
541 | 577 | ||
542 | bool current = (current_track->index == viewer.current_playing_track); | 578 | bool current_was_playing = (current_track->index == viewer.current_playing_track); |
543 | 579 | ||
544 | result = do_menu(&menu_items, NULL, NULL, false); | 580 | result = do_menu(&menu_items, NULL, NULL, false); |
545 | if (result == MENU_ATTACHED_USB) | 581 | if (result == MENU_ATTACHED_USB) |
@@ -565,27 +601,7 @@ static enum pv_onplay_result onplay_menu(int index) | |||
565 | ret = PV_ONPLAY_UNCHANGED; | 601 | ret = PV_ONPLAY_UNCHANGED; |
566 | break; | 602 | break; |
567 | case 2: | 603 | case 2: |
568 | /* delete track */ | 604 | ret = delete_track(current_track->index, index, current_was_playing); |
569 | playlist_delete(viewer.playlist, current_track->index); | ||
570 | if (current) | ||
571 | { | ||
572 | if (playlist_amount_ex(viewer.playlist) <= 0) | ||
573 | audio_stop(); | ||
574 | else | ||
575 | { | ||
576 | /* Start playing new track except if it's the lasttrack | ||
577 | track in the playlist and repeat mode is disabled */ | ||
578 | current_track = | ||
579 | playlist_buffer_get_track(&viewer.buffer, index); | ||
580 | if (current_track->display_index!=viewer.num_tracks || | ||
581 | global_settings.repeat_mode == REPEAT_ALL) | ||
582 | { | ||
583 | audio_play(0, 0); | ||
584 | viewer.current_playing_track = -1; | ||
585 | } | ||
586 | } | ||
587 | } | ||
588 | ret = PV_ONPLAY_ITEM_REMOVED; | ||
589 | break; | 605 | break; |
590 | case 3: | 606 | case 3: |
591 | /* move track */ | 607 | /* move track */ |
@@ -724,6 +740,40 @@ static int playlist_callback_voice(int selected_item, void *data) | |||
724 | return 0; | 740 | return 0; |
725 | } | 741 | } |
726 | 742 | ||
743 | static void update_lists(struct gui_synclist * playlist_lists) | ||
744 | { | ||
745 | gui_synclist_set_voice_callback(playlist_lists, | ||
746 | global_settings.talk_file? | ||
747 | &playlist_callback_voice:NULL); | ||
748 | gui_synclist_set_icon_callback(playlist_lists, | ||
749 | global_settings.playlist_viewer_icons? | ||
750 | &playlist_callback_icons:NULL); | ||
751 | gui_synclist_set_title(playlist_lists, str(LANG_PLAYLIST), Icon_Playlist); | ||
752 | gui_synclist_draw(playlist_lists); | ||
753 | gui_synclist_speak_item(playlist_lists); | ||
754 | } | ||
755 | |||
756 | static bool update_viewer_with_changes(struct gui_synclist *playlist_lists, enum pv_onplay_result res) | ||
757 | { | ||
758 | bool exit = false; | ||
759 | if (res == PV_ONPLAY_CHANGED || | ||
760 | res == PV_ONPLAY_ITEM_REMOVED) | ||
761 | { | ||
762 | if (res == PV_ONPLAY_ITEM_REMOVED) | ||
763 | gui_synclist_del_item(playlist_lists); | ||
764 | update_playlist(true); | ||
765 | if (viewer.num_tracks <= 0) | ||
766 | exit = true; | ||
767 | if (viewer.selected_track >= viewer.num_tracks) | ||
768 | viewer.selected_track = viewer.num_tracks-1; | ||
769 | dirty = true; | ||
770 | } | ||
771 | /* the show_icons option in the playlist viewer settings | ||
772 | * menu might have changed */ | ||
773 | update_lists(playlist_lists); | ||
774 | return exit; | ||
775 | } | ||
776 | |||
727 | static void prepare_lists(struct gui_synclist * playlist_lists) | 777 | static void prepare_lists(struct gui_synclist * playlist_lists) |
728 | { | 778 | { |
729 | gui_synclist_init(playlist_lists, playlist_callback_name, | 779 | gui_synclist_init(playlist_lists, playlist_callback_name, |
@@ -907,26 +957,7 @@ enum playlist_viewer_result playlist_viewer_ex(const char* filename) | |||
907 | goto exit; | 957 | goto exit; |
908 | break; | 958 | break; |
909 | } | 959 | } |
910 | else if (pv_onplay_result == PV_ONPLAY_CHANGED || | 960 | exit = update_viewer_with_changes(&playlist_lists, pv_onplay_result); |
911 | pv_onplay_result == PV_ONPLAY_ITEM_REMOVED) | ||
912 | { | ||
913 | if (pv_onplay_result == PV_ONPLAY_ITEM_REMOVED) | ||
914 | gui_synclist_del_item(&playlist_lists); | ||
915 | update_playlist(true); | ||
916 | if (viewer.num_tracks <= 0) | ||
917 | exit = true; | ||
918 | if (viewer.selected_track >= viewer.num_tracks) | ||
919 | viewer.selected_track = viewer.num_tracks-1; | ||
920 | dirty = true; | ||
921 | } | ||
922 | /* the show_icons option in the playlist viewer settings | ||
923 | * menu might have changed */ | ||
924 | gui_synclist_set_icon_callback(&playlist_lists, | ||
925 | global_settings.playlist_viewer_icons? | ||
926 | &playlist_callback_icons:NULL); | ||
927 | gui_synclist_set_title(&playlist_lists, playlist_lists.title, playlist_lists.title_icon); | ||
928 | gui_synclist_draw(&playlist_lists); | ||
929 | gui_synclist_speak_item(&playlist_lists); | ||
930 | break; | 961 | break; |
931 | } | 962 | } |
932 | case ACTION_STD_MENU: | 963 | case ACTION_STD_MENU: |
@@ -938,18 +969,50 @@ enum playlist_viewer_result playlist_viewer_ex(const char* filename) | |||
938 | { | 969 | { |
939 | quick_screen_quick(button); | 970 | quick_screen_quick(button); |
940 | update_playlist(true); | 971 | update_playlist(true); |
941 | gui_synclist_set_voice_callback(&playlist_lists, | 972 | update_lists(&playlist_lists); |
942 | global_settings.talk_file? | ||
943 | &playlist_callback_voice:NULL); | ||
944 | gui_synclist_set_icon_callback(&playlist_lists, | ||
945 | global_settings.playlist_viewer_icons? | ||
946 | &playlist_callback_icons:NULL); | ||
947 | gui_synclist_set_title(&playlist_lists, str(LANG_PLAYLIST), Icon_Playlist); | ||
948 | gui_synclist_draw(&playlist_lists); | ||
949 | gui_synclist_speak_item(&playlist_lists); | ||
950 | break; | 973 | break; |
951 | } | 974 | } |
952 | #endif | 975 | #endif |
976 | #ifdef HAVE_HOTKEY | ||
977 | case ACTION_TREE_HOTKEY: | ||
978 | { | ||
979 | struct playlist_entry *current_track = playlist_buffer_get_track( | ||
980 | &viewer.buffer, | ||
981 | viewer.selected_track); | ||
982 | enum pv_onplay_result (*do_plugin)(const struct playlist_entry *) = NULL; | ||
983 | #ifdef HAVE_TAGCACHE | ||
984 | if (global_settings.hotkey_tree == HOTKEY_PICTUREFLOW) | ||
985 | do_plugin = &open_pictureflow; | ||
986 | #endif | ||
987 | if (global_settings.hotkey_tree == HOTKEY_OPEN_WITH) | ||
988 | do_plugin = &open_with; | ||
989 | |||
990 | if (do_plugin != NULL) | ||
991 | { | ||
992 | if (do_plugin(current_track) == PV_ONPLAY_USB_CLOSED) | ||
993 | return PLAYLIST_VIEWER_USB; | ||
994 | else if (!open_playlist_viewer(filename, &playlist_lists, true)) | ||
995 | goto exit; | ||
996 | } | ||
997 | else if (global_settings.hotkey_tree == HOTKEY_PROPERTIES) | ||
998 | { | ||
999 | if (show_track_info(current_track) == PV_ONPLAY_USB) | ||
1000 | { | ||
1001 | ret = PLAYLIST_VIEWER_USB; | ||
1002 | goto exit; | ||
1003 | } | ||
1004 | update_lists(&playlist_lists); | ||
1005 | } | ||
1006 | else if (global_settings.hotkey_tree == HOTKEY_DELETE) | ||
1007 | exit = update_viewer_with_changes(&playlist_lists, | ||
1008 | delete_track(current_track->index, | ||
1009 | viewer.selected_track, | ||
1010 | (current_track->index == viewer.current_playing_track))); | ||
1011 | else | ||
1012 | onplay(current_track->name, FILE_ATTR_AUDIO, CONTEXT_STD, true); | ||
1013 | break; | ||
1014 | } | ||
1015 | #endif /* HAVE_HOTKEY */ | ||
953 | default: | 1016 | default: |
954 | if(default_event_handler(button) == SYS_USB_CONNECTED) | 1017 | if(default_event_handler(button) == SYS_USB_CONNECTED) |
955 | { | 1018 | { |