Patch FS#4759 by Jonathan Gordon - searching in playlists.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@8906 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
f0d97ea92d
commit
c2e86cd0d9
4 changed files with 130 additions and 2 deletions
|
@ -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:
|
||||
|
|
|
@ -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++;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -23,5 +23,6 @@
|
|||
|
||||
bool playlist_viewer(void);
|
||||
bool playlist_viewer_ex(char* filename);
|
||||
bool search_playlist(void);
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in a new issue