diff options
| author | Tomas Salfischberger <tomas@rockbox.org> | 2006-03-04 23:53:09 +0000 |
|---|---|---|
| committer | Tomas Salfischberger <tomas@rockbox.org> | 2006-03-04 23:53:09 +0000 |
| commit | c2e86cd0d919a5ec93014359ebf1340593fdc84a (patch) | |
| tree | 768e40da2d35d1be9dac0ec3915da4d018d5bfe3 | |
| parent | f0d97ea92df70425c5cb385c2bb69013f5538abd (diff) | |
| download | rockbox-c2e86cd0d919a5ec93014359ebf1340593fdc84a.zip rockbox-c2e86cd0d919a5ec93014359ebf1340593fdc84a.tar.gz rockbox-c2e86cd0d919a5ec93014359ebf1340593fdc84a.tar.bz2 rockbox-c2e86cd0d919a5ec93014359ebf1340593fdc84a.tar.xz | |
Patch FS#4759 by Jonathan Gordon - searching in playlists.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@8906 a1c6a512-1295-4272-9138-f99709370657
| -rw-r--r-- | apps/lang/english.lang | 12 | ||||
| -rw-r--r-- | apps/onplay.c | 9 | ||||
| -rw-r--r-- | apps/playlist_viewer.c | 110 | ||||
| -rw-r--r-- | apps/playlist_viewer.h | 1 |
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 |