summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apps/lang/english.lang12
-rw-r--r--apps/onplay.c9
-rw-r--r--apps/playlist_viewer.c110
-rw-r--r--apps/playlist_viewer.h1
4 files changed, 130 insertions, 2 deletions
diff --git a/apps/lang/english.lang b/apps/lang/english.lang
index efb0a94..bc355f0 100644
--- a/apps/lang/english.lang
+++ b/apps/lang/english.lang
@@ -3784,3 +3784,15 @@ desc: splash when user selects an invalid colour
eng: "Invalid colour"
voice: ""
new:
+
+id: LANG_SEARCH_IN_PLAYLIST
+desc: in playlist menu.
+eng: "Search In Playlist"
+voice:
+new:
+
+id: LANG_PLAYLIST_SEARCH_MSG
+desc: splash number of tracks inserted
+eng: "Searching... %d found (%s)"
+voice: ""
+new:
diff --git a/apps/onplay.c b/apps/onplay.c
index 88607f7..be11b9a 100644
--- a/apps/onplay.c
+++ b/apps/onplay.c
@@ -243,8 +243,8 @@ static bool view_playlist(void)
/* Sub-menu for playlist options */
static bool playlist_options(void)
{
- struct menu_item items[12];
- struct playlist_args args[12]; /* increase these 2 if you add entries! */
+ struct menu_item items[13];
+ struct playlist_args args[13]; /* increase these 2 if you add entries! */
int m, i=0, pstart=0, result;
bool ret = false;
@@ -265,6 +265,11 @@ static bool playlist_options(void)
i++;
pstart++;
+ items[i].desc = ID2P(LANG_SEARCH_IN_PLAYLIST);
+ items[i].function = search_playlist;
+ i++;
+ pstart++;
+
items[i].desc = ID2P(LANG_SAVE_DYNAMIC_PLAYLIST);
items[i].function = save_playlist;
i++;
diff --git a/apps/playlist_viewer.c b/apps/playlist_viewer.c
index ddc238c..422c004 100644
--- a/apps/playlist_viewer.c
+++ b/apps/playlist_viewer.c
@@ -804,3 +804,113 @@ exit:
playlist_close(viewer.playlist);
return ret;
}
+char * playlist_search_callback_name(int selected_item, void * data, char *buffer)
+{
+ int *found_indicies = (int*)data;
+ static struct playlist_track_info track;
+ playlist_get_track_info(viewer.playlist,found_indicies[selected_item],&track);
+ format_name(buffer,track.filename);
+ return(buffer);
+}
+
+
+void playlist_search_callback_icons(int selected_item, void * data, ICON * icon)
+{
+ (void)selected_item;
+ (void)data;
+#ifdef HAVE_LCD_BITMAP
+ *icon=0;
+#else
+ *icon=-1;
+#endif
+}
+bool search_playlist(void)
+{
+ char search_str[32] = "";
+ bool ret = false, exit = false;
+ int i, playlist_count;
+ int found_indicies[MAX_PLAYLIST_ENTRIES],found_indicies_count = 0;
+ int button;
+ struct gui_synclist playlist_lists;
+ struct playlist_track_info track;
+
+ if (!playlist_viewer_init(&viewer, 0, false))
+ return ret;
+ if (kbd_input(search_str,sizeof(search_str)) == -1)
+ return ret;
+ lcd_clear_display();
+ playlist_count = playlist_amount_ex(viewer.playlist);
+ for (i=0;(i<playlist_count)&&(found_indicies_count<MAX_PLAYLIST_ENTRIES);i++)
+ {
+ gui_syncsplash(0, true, str(LANG_PLAYLIST_SEARCH_MSG),found_indicies_count,
+#if CONFIG_KEYPAD == PLAYER_PAD
+ str(LANG_STOP_ABORT)
+#else
+ str(LANG_OFF_ABORT)
+#endif
+ );
+ if (SETTINGS_CANCEL == button_get(false))
+ return ret;
+ playlist_get_track_info(viewer.playlist,i,&track);
+ if (strcasestr(track.filename,search_str))
+ {
+ found_indicies[found_indicies_count++] = track.index;
+ }
+ }
+ if (!found_indicies_count)
+ {
+ return ret;
+ }
+ backlight_on();
+ gui_synclist_init(&playlist_lists, playlist_search_callback_name,
+ found_indicies);
+ gui_synclist_set_icon_callback(&playlist_lists,
+ global_settings.playlist_viewer_icons?
+ &playlist_search_callback_icons:NULL);
+ gui_synclist_set_nb_items(&playlist_lists, found_indicies_count);
+ gui_synclist_select_item(&playlist_lists, 0);
+ gui_synclist_draw(&playlist_lists);
+ while (!exit)
+ {
+ button = button_get(true);
+ if (gui_synclist_do_button(&playlist_lists, button))
+ continue;
+ switch (button)
+ {
+ case TREE_EXIT:
+#ifdef TREE_RC_EXIT
+ case TREE_RC_EXIT:
+#endif
+#ifdef TREE_OFF
+ case TREE_OFF:
+#endif
+ exit = true;
+ break;
+
+#ifdef TREE_ENTER
+ case TREE_ENTER:
+ case TREE_ENTER | BUTTON_REPEAT:
+#endif
+#ifdef TREE_RC_RUN
+ case TREE_RC_RUN:
+#endif
+ case TREE_RUN:
+ playlist_start(
+ found_indicies[gui_synclist_get_sel_pos(&playlist_lists)]
+ ,0);
+ exit = 1;
+ break;
+ case BUTTON_NONE:
+ break;
+ default:
+ if(default_event_handler(button) == SYS_USB_CONNECTED)
+ {
+ ret = true;
+ exit = true;
+ }
+ break;
+ }
+ }
+ return ret;
+}
+
diff --git a/apps/playlist_viewer.h b/apps/playlist_viewer.h
index 69f9d03..27f2e35 100644
--- a/apps/playlist_viewer.h
+++ b/apps/playlist_viewer.h
@@ -23,5 +23,6 @@
bool playlist_viewer(void);
bool playlist_viewer_ex(char* filename);
+bool search_playlist(void);
#endif