diff options
author | Christian Soffke <christian.soffke@gmail.com> | 2022-04-16 05:40:42 +0200 |
---|---|---|
committer | Solomon Peachy <pizza@shaftnet.org> | 2022-08-05 11:39:35 -0400 |
commit | 77274864236186fc5ed6fad8e6ea6c41d9426fcf (patch) | |
tree | 92f9ca199148f0807701e38e70d538dac92eeb46 | |
parent | f0a05e099337e88afe99ad0cad561caff96e48aa (diff) | |
download | rockbox-77274864236186fc5ed6fad8e6ea6c41d9426fcf.tar.gz rockbox-77274864236186fc5ed6fad8e6ea6c41d9426fcf.zip |
playlist viewer: add menu option to show songs in pictureflow
(The playlist viewer has to be re-initialized
after returning from PictureFlow, since they
both use the plugin buffer)
Change-Id: Ib3ef0acec65c88363830c59c8c73e9cdf8b528f0
-rw-r--r-- | apps/playlist_viewer.c | 145 |
1 files changed, 103 insertions, 42 deletions
diff --git a/apps/playlist_viewer.c b/apps/playlist_viewer.c index a94e07643e..8403aea6b6 100644 --- a/apps/playlist_viewer.c +++ b/apps/playlist_viewer.c | |||
@@ -73,6 +73,15 @@ enum direction | |||
73 | BACKWARD | 73 | BACKWARD |
74 | }; | 74 | }; |
75 | 75 | ||
76 | enum pv_onplay_result { | ||
77 | PV_ONPLAY_USB, | ||
78 | PV_ONPLAY_USB_CLOSED, | ||
79 | PV_ONPLAY_CLOSED, | ||
80 | PV_ONPLAY_ITEM_REMOVED, | ||
81 | PV_ONPLAY_CHANGED, | ||
82 | PV_ONPLAY_UNCHANGED, | ||
83 | }; | ||
84 | |||
76 | struct playlist_buffer | 85 | struct playlist_buffer |
77 | { | 86 | { |
78 | char *name_buffer; /* Buffer used to store track names */ | 87 | char *name_buffer; /* Buffer used to store track names */ |
@@ -108,6 +117,8 @@ static struct playlist_viewer viewer; | |||
108 | /* Used when viewing playlists on disk */ | 117 | /* Used when viewing playlists on disk */ |
109 | static struct playlist_info temp_playlist; | 118 | static struct playlist_info temp_playlist; |
110 | 119 | ||
120 | static bool dirty = false; | ||
121 | |||
111 | static void playlist_buffer_init(struct playlist_buffer *pb, char *names_buffer, | 122 | static void playlist_buffer_init(struct playlist_buffer *pb, char *names_buffer, |
112 | int names_buffer_size); | 123 | int names_buffer_size); |
113 | static void playlist_buffer_load_entries(struct playlist_buffer * pb, int index, | 124 | static void playlist_buffer_load_entries(struct playlist_buffer * pb, int index, |
@@ -126,7 +137,9 @@ static void format_line(const struct playlist_entry* track, char* str, | |||
126 | int len); | 137 | int len); |
127 | 138 | ||
128 | static bool update_playlist(bool force); | 139 | static bool update_playlist(bool force); |
129 | static int onplay_menu(int index); | 140 | static enum pv_onplay_result onplay_menu(int index); |
141 | |||
142 | static void close_playlist_viewer(void); | ||
130 | 143 | ||
131 | static void playlist_buffer_init(struct playlist_buffer *pb, char *names_buffer, | 144 | static void playlist_buffer_init(struct playlist_buffer *pb, char *names_buffer, |
132 | int names_buffer_size) | 145 | int names_buffer_size) |
@@ -479,7 +492,7 @@ static bool update_playlist(bool force) | |||
479 | return true; | 492 | return true; |
480 | } | 493 | } |
481 | 494 | ||
482 | static int show_track_info(struct playlist_entry *current_track) | 495 | static enum pv_onplay_result show_track_info(const struct playlist_entry *current_track) |
483 | { | 496 | { |
484 | struct mp3entry id3; | 497 | struct mp3entry id3; |
485 | bool id3_retrieval_successful = false; | 498 | bool id3_retrieval_successful = false; |
@@ -494,15 +507,25 @@ static int show_track_info(struct playlist_entry *current_track) | |||
494 | 507 | ||
495 | return id3_retrieval_successful && | 508 | return id3_retrieval_successful && |
496 | browse_id3(&id3, current_track->index + 1, | 509 | browse_id3(&id3, current_track->index + 1, |
497 | viewer.num_tracks) ? -1 : 0; | 510 | viewer.num_tracks) ? PV_ONPLAY_USB : PV_ONPLAY_UNCHANGED; |
511 | } | ||
512 | |||
513 | #ifdef HAVE_TAGCACHE | ||
514 | static enum pv_onplay_result open_pictureflow(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_load_plugin((void *)"pictureflow", selected_track) == | ||
521 | PLUGIN_USB_CONNECTED ? PV_ONPLAY_USB_CLOSED : PV_ONPLAY_CLOSED); | ||
498 | } | 522 | } |
523 | #endif | ||
499 | 524 | ||
500 | /* Menu of playlist commands. Invoked via ON+PLAY on main viewer screen. | 525 | /* Menu of playlist commands. Invoked via ON+PLAY on main viewer screen. */ |
501 | Returns -1 if USB attached, 0 if no playlist change, 1 if playlist | 526 | static enum pv_onplay_result onplay_menu(int index) |
502 | changed, 2 if a track was removed from the playlist */ | ||
503 | static int onplay_menu(int index) | ||
504 | { | 527 | { |
505 | int result, ret = 0; | 528 | int result, ret = PV_ONPLAY_UNCHANGED; |
506 | struct playlist_entry * current_track = | 529 | struct playlist_entry * current_track = |
507 | playlist_buffer_get_track(&viewer.buffer, index); | 530 | playlist_buffer_get_track(&viewer.buffer, index); |
508 | MENUITEM_STRINGLIST(menu_items, ID2P(LANG_PLAYLIST), NULL, | 531 | MENUITEM_STRINGLIST(menu_items, ID2P(LANG_PLAYLIST), NULL, |
@@ -510,13 +533,18 @@ static int onplay_menu(int index) | |||
510 | ID2P(LANG_REMOVE), ID2P(LANG_MOVE), ID2P(LANG_MENU_SHOW_ID3_INFO), | 533 | ID2P(LANG_REMOVE), ID2P(LANG_MOVE), ID2P(LANG_MENU_SHOW_ID3_INFO), |
511 | ID2P(LANG_SHUFFLE), | 534 | ID2P(LANG_SHUFFLE), |
512 | ID2P(LANG_SAVE), | 535 | ID2P(LANG_SAVE), |
513 | ID2P(LANG_PLAYLISTVIEWER_SETTINGS)); | 536 | ID2P(LANG_PLAYLISTVIEWER_SETTINGS) |
537 | #ifdef HAVE_TAGCACHE | ||
538 | ,ID2P(LANG_ONPLAY_PICTUREFLOW) | ||
539 | #endif | ||
540 | ); | ||
541 | |||
514 | bool current = (current_track->index == viewer.current_playing_track); | 542 | bool current = (current_track->index == viewer.current_playing_track); |
515 | 543 | ||
516 | result = do_menu(&menu_items, NULL, NULL, false); | 544 | result = do_menu(&menu_items, NULL, NULL, false); |
517 | if (result == MENU_ATTACHED_USB) | 545 | if (result == MENU_ATTACHED_USB) |
518 | { | 546 | { |
519 | ret = -1; | 547 | ret = PV_ONPLAY_USB; |
520 | } | 548 | } |
521 | else if (result >= 0) | 549 | else if (result >= 0) |
522 | { | 550 | { |
@@ -529,12 +557,12 @@ static int onplay_menu(int index) | |||
529 | case 0: | 557 | case 0: |
530 | /* playlist */ | 558 | /* playlist */ |
531 | onplay_show_playlist_menu(current_track->name, NULL); | 559 | onplay_show_playlist_menu(current_track->name, NULL); |
532 | ret = 0; | 560 | ret = PV_ONPLAY_UNCHANGED; |
533 | break; | 561 | break; |
534 | case 1: | 562 | case 1: |
535 | /* add to catalog */ | 563 | /* add to catalog */ |
536 | onplay_show_playlist_cat_menu(current_track->name); | 564 | onplay_show_playlist_cat_menu(current_track->name); |
537 | ret = 0; | 565 | ret = PV_ONPLAY_UNCHANGED; |
538 | break; | 566 | break; |
539 | case 2: | 567 | case 2: |
540 | /* delete track */ | 568 | /* delete track */ |
@@ -557,13 +585,13 @@ static int onplay_menu(int index) | |||
557 | } | 585 | } |
558 | } | 586 | } |
559 | } | 587 | } |
560 | ret = 2; | 588 | ret = PV_ONPLAY_ITEM_REMOVED; |
561 | break; | 589 | break; |
562 | case 3: | 590 | case 3: |
563 | /* move track */ | 591 | /* move track */ |
564 | viewer.moving_track = index; | 592 | viewer.moving_track = index; |
565 | viewer.moving_playlist_index = current_track->index; | 593 | viewer.moving_playlist_index = current_track->index; |
566 | ret = 0; | 594 | ret = PV_ONPLAY_UNCHANGED; |
567 | break; | 595 | break; |
568 | case 4: | 596 | case 4: |
569 | ret = show_track_info(current_track); | 597 | ret = show_track_info(current_track); |
@@ -571,18 +599,23 @@ static int onplay_menu(int index) | |||
571 | case 5: | 599 | case 5: |
572 | /* shuffle */ | 600 | /* shuffle */ |
573 | playlist_randomise(viewer.playlist, current_tick, false); | 601 | playlist_randomise(viewer.playlist, current_tick, false); |
574 | ret = 1; | 602 | ret = PV_ONPLAY_CHANGED; |
575 | break; | 603 | break; |
576 | case 6: | 604 | case 6: |
577 | /* save playlist */ | 605 | /* save playlist */ |
578 | save_playlist_screen(viewer.playlist); | 606 | save_playlist_screen(viewer.playlist); |
579 | ret = 0; | 607 | ret = PV_ONPLAY_UNCHANGED; |
580 | break; | 608 | break; |
581 | case 7: | 609 | case 7: |
582 | /* playlist viewer settings */ | 610 | /* playlist viewer settings */ |
583 | result = do_menu(&viewer_settings_menu, NULL, NULL, false); | 611 | result = do_menu(&viewer_settings_menu, NULL, NULL, false); |
584 | ret = (result == MENU_ATTACHED_USB) ? -1 : 0; | 612 | ret = (result == MENU_ATTACHED_USB) ? PV_ONPLAY_USB : PV_ONPLAY_UNCHANGED; |
613 | break; | ||
614 | #ifdef HAVE_TAGCACHE | ||
615 | case 8: | ||
616 | ret = open_pictureflow(current_track); | ||
585 | break; | 617 | break; |
618 | #endif | ||
586 | } | 619 | } |
587 | } | 620 | } |
588 | return ret; | 621 | return ret; |
@@ -691,6 +724,37 @@ static int playlist_callback_voice(int selected_item, void *data) | |||
691 | return 0; | 724 | return 0; |
692 | } | 725 | } |
693 | 726 | ||
727 | static void prepare_lists(struct gui_synclist * playlist_lists) | ||
728 | { | ||
729 | gui_synclist_init(playlist_lists, playlist_callback_name, | ||
730 | &viewer, false, 1, NULL); | ||
731 | gui_synclist_set_voice_callback(playlist_lists, | ||
732 | global_settings.talk_file ? | ||
733 | &playlist_callback_voice : NULL); | ||
734 | gui_synclist_set_icon_callback(playlist_lists, | ||
735 | global_settings.playlist_viewer_icons ? | ||
736 | &playlist_callback_icons : NULL); | ||
737 | gui_synclist_set_nb_items(playlist_lists, viewer.num_tracks); | ||
738 | gui_synclist_set_title(playlist_lists, str(LANG_PLAYLIST), Icon_Playlist); | ||
739 | gui_synclist_select_item(playlist_lists, viewer.selected_track); | ||
740 | gui_synclist_draw(playlist_lists); | ||
741 | gui_synclist_speak_item(playlist_lists); | ||
742 | } | ||
743 | |||
744 | static bool open_playlist_viewer(const char* filename, | ||
745 | struct gui_synclist *playlist_lists, | ||
746 | bool reload) | ||
747 | { | ||
748 | push_current_activity(ACTIVITY_PLAYLISTVIEWER); | ||
749 | |||
750 | if (!playlist_viewer_init(&viewer, filename, reload)) | ||
751 | return false; | ||
752 | |||
753 | prepare_lists(playlist_lists); | ||
754 | |||
755 | return true; | ||
756 | } | ||
757 | |||
694 | /* Main viewer function. Filename identifies playlist to be viewed. If NULL, | 758 | /* Main viewer function. Filename identifies playlist to be viewed. If NULL, |
695 | view current playlist. */ | 759 | view current playlist. */ |
696 | enum playlist_viewer_result playlist_viewer_ex(const char* filename) | 760 | enum playlist_viewer_result playlist_viewer_ex(const char* filename) |
@@ -698,25 +762,11 @@ enum playlist_viewer_result playlist_viewer_ex(const char* filename) | |||
698 | enum playlist_viewer_result ret = PLAYLIST_VIEWER_OK; | 762 | enum playlist_viewer_result ret = PLAYLIST_VIEWER_OK; |
699 | bool exit = false; /* exit viewer */ | 763 | bool exit = false; /* exit viewer */ |
700 | int button; | 764 | int button; |
701 | bool dirty = false; | ||
702 | struct gui_synclist playlist_lists; | 765 | struct gui_synclist playlist_lists; |
703 | if (!playlist_viewer_init(&viewer, filename, false)) | 766 | |
767 | if (!open_playlist_viewer(filename, &playlist_lists, false)) | ||
704 | goto exit; | 768 | goto exit; |
705 | 769 | ||
706 | push_current_activity(ACTIVITY_PLAYLISTVIEWER); | ||
707 | gui_synclist_init(&playlist_lists, playlist_callback_name, | ||
708 | &viewer, false, 1, NULL); | ||
709 | gui_synclist_set_voice_callback(&playlist_lists, | ||
710 | global_settings.talk_file? | ||
711 | &playlist_callback_voice:NULL); | ||
712 | gui_synclist_set_icon_callback(&playlist_lists, | ||
713 | global_settings.playlist_viewer_icons? | ||
714 | &playlist_callback_icons:NULL); | ||
715 | gui_synclist_set_nb_items(&playlist_lists, viewer.num_tracks); | ||
716 | gui_synclist_set_title(&playlist_lists, str(LANG_PLAYLIST), Icon_Playlist); | ||
717 | gui_synclist_select_item(&playlist_lists, viewer.selected_track); | ||
718 | gui_synclist_draw(&playlist_lists); | ||
719 | gui_synclist_speak_item(&playlist_lists); | ||
720 | while (!exit) | 770 | while (!exit) |
721 | { | 771 | { |
722 | int track; | 772 | int track; |
@@ -842,20 +892,25 @@ enum playlist_viewer_result playlist_viewer_ex(const char* filename) | |||
842 | } | 892 | } |
843 | case ACTION_STD_CONTEXT: | 893 | case ACTION_STD_CONTEXT: |
844 | { | 894 | { |
845 | /* ON+PLAY menu */ | 895 | int pv_onplay_result = onplay_menu(viewer.selected_track); |
846 | int ret_val; | ||
847 | |||
848 | ret_val = onplay_menu(viewer.selected_track); | ||
849 | 896 | ||
850 | if (ret_val < 0) | 897 | if (pv_onplay_result == PV_ONPLAY_USB) |
851 | { | 898 | { |
852 | ret = PLAYLIST_VIEWER_USB; | 899 | ret = PLAYLIST_VIEWER_USB; |
853 | goto exit; | 900 | goto exit; |
854 | } | 901 | } |
855 | else if (ret_val > 0) | 902 | else if (pv_onplay_result == PV_ONPLAY_USB_CLOSED) |
903 | return PLAYLIST_VIEWER_USB; | ||
904 | else if (pv_onplay_result == PV_ONPLAY_CLOSED) | ||
905 | { | ||
906 | if (!open_playlist_viewer(filename, &playlist_lists, true)) | ||
907 | goto exit; | ||
908 | break; | ||
909 | } | ||
910 | else if (pv_onplay_result == PV_ONPLAY_CHANGED || | ||
911 | pv_onplay_result == PV_ONPLAY_ITEM_REMOVED) | ||
856 | { | 912 | { |
857 | /* Playlist changed */ | 913 | if (pv_onplay_result == PV_ONPLAY_ITEM_REMOVED) |
858 | if (ret_val == 2) | ||
859 | gui_synclist_del_item(&playlist_lists); | 914 | gui_synclist_del_item(&playlist_lists); |
860 | update_playlist(true); | 915 | update_playlist(true); |
861 | if (viewer.num_tracks <= 0) | 916 | if (viewer.num_tracks <= 0) |
@@ -906,6 +961,12 @@ enum playlist_viewer_result playlist_viewer_ex(const char* filename) | |||
906 | } | 961 | } |
907 | 962 | ||
908 | exit: | 963 | exit: |
964 | close_playlist_viewer(); | ||
965 | return ret; | ||
966 | } | ||
967 | |||
968 | static void close_playlist_viewer(void) | ||
969 | { | ||
909 | talk_shutup(); | 970 | talk_shutup(); |
910 | pop_current_activity(); | 971 | pop_current_activity(); |
911 | if (viewer.playlist) | 972 | if (viewer.playlist) |
@@ -914,7 +975,7 @@ exit: | |||
914 | save_playlist_screen(viewer.playlist); | 975 | save_playlist_screen(viewer.playlist); |
915 | playlist_close(viewer.playlist); | 976 | playlist_close(viewer.playlist); |
916 | } | 977 | } |
917 | return ret; | 978 | dirty = false; |
918 | } | 979 | } |
919 | 980 | ||
920 | static const char* playlist_search_callback_name(int selected_item, void * data, | 981 | static const char* playlist_search_callback_name(int selected_item, void * data, |