diff options
Diffstat (limited to 'apps/onplay.c')
| -rw-r--r-- | apps/onplay.c | 266 |
1 files changed, 195 insertions, 71 deletions
diff --git a/apps/onplay.c b/apps/onplay.c index 78562c5..f686533 100644 --- a/apps/onplay.c +++ b/apps/onplay.c @@ -45,11 +45,68 @@ #include "onplay.h" #include "filetypes.h" #include "plugin.h" +#include "bookmark.h" +#include "wps.h" +#include "action.h" +#ifdef HAVE_LCD_BITMAP +#include "icons.h" +#endif +#define DEFAULT_PLAYLIST_NAME "/dynamic.m3u" + +static int context; static char* selected_file = NULL; static int selected_file_attr = 0; static int onplay_result = ONPLAY_OK; +/* For playlist options */ +struct playlist_args { + int position; + bool queue; +}; + +/* ----------------------------------------------------------------------- */ +/* Displays the bookmark menu options for the user to decide. This is an */ +/* interface function. */ +/* ----------------------------------------------------------------------- */ +bool bookmark_menu(void) +{ + int i,m; + bool result; + struct menu_item items[3]; + + i=0; + + if ((audio_status() & AUDIO_STATUS_PLAY)) + { + items[i].desc = ID2P(LANG_BOOKMARK_MENU_CREATE); + items[i].function = bookmark_create_menu; + i++; + + if (bookmark_exist()) + { + items[i].desc = ID2P(LANG_BOOKMARK_MENU_LIST); + items[i].function = bookmark_load_menu; + i++; + } + } + + m=menu_init( items, i, NULL, NULL, NULL, NULL ); + +#ifdef HAVE_LCD_CHARCELLS + status_set_param(true); +#endif + result = menu_run(m); +#ifdef HAVE_LCD_CHARCELLS + status_set_param(false); +#endif + menu_exit(m); + + settings_save(); + + return result; +} + static bool list_viewers(void) { struct menu_item menu[16]; @@ -70,17 +127,28 @@ static bool list_viewers(void) splash(HZ*2, true, "No viewers found"); } - if(ret == PLUGIN_USB_CONNECTED) - onplay_result = ONPLAY_RELOAD_DIR; + if (ret == PLUGIN_USB_CONNECTED) + onplay_result = ONPLAY_RELOAD_DIR; return false; } -/* For playlist options */ -struct playlist_args { - int position; - bool queue; -}; +static bool save_playlist(void) +{ + char filename[MAX_PATH+1]; + + strncpy(filename, DEFAULT_PLAYLIST_NAME, sizeof(filename)); + + if (!kbd_input(filename, sizeof(filename))) + { + playlist_save(NULL, filename); + + /* reload in case playlist was saved to cwd */ + onplay_result = ONPLAY_RELOAD_DIR; + } + + return false; +} static bool add_to_playlist(int position, bool queue) { @@ -168,12 +236,13 @@ static bool view_playlist(void) /* Sub-menu for playlist options */ static bool playlist_options(void) { - struct menu_item items[7]; - struct playlist_args args[7]; /* increase these 2 if you add entries! */ + struct menu_item items[10]; + struct playlist_args args[10]; /* increase these 2 if you add entries! */ int m, i=0, pstart=0, result; bool ret = false; - if ((selected_file_attr & TREE_ATTR_MASK) == TREE_ATTR_M3U) + if ((selected_file_attr & TREE_ATTR_MASK) == TREE_ATTR_M3U && + context == CONTEXT_TREE) { items[i].desc = ID2P(LANG_VIEW); items[i].function = view_playlist; @@ -183,43 +252,64 @@ static bool playlist_options(void) if (audio_status() & AUDIO_STATUS_PLAY) { - items[i].desc = ID2P(LANG_INSERT); - args[i].position = PLAYLIST_INSERT; - args[i].queue = false; - i++; - - items[i].desc = ID2P(LANG_INSERT_FIRST); - args[i].position = PLAYLIST_INSERT_FIRST; - args[i].queue = false; - i++; - - items[i].desc = ID2P(LANG_INSERT_LAST); - args[i].position = PLAYLIST_INSERT_LAST; - args[i].queue = false; - i++; - - items[i].desc = ID2P(LANG_QUEUE); - args[i].position = PLAYLIST_INSERT; - args[i].queue = true; - i++; - - items[i].desc = ID2P(LANG_QUEUE_FIRST); - args[i].position = PLAYLIST_INSERT_FIRST; - args[i].queue = true; + items[i].desc = ID2P(LANG_VIEW_DYNAMIC_PLAYLIST); + items[i].function = playlist_viewer; i++; + pstart++; - items[i].desc = ID2P(LANG_QUEUE_LAST); - args[i].position = PLAYLIST_INSERT_LAST; - args[i].queue = true; + items[i].desc = ID2P(LANG_SAVE_DYNAMIC_PLAYLIST); + items[i].function = save_playlist; i++; + pstart++; } - else if (((selected_file_attr & TREE_ATTR_MASK) == TREE_ATTR_MPA) || - (selected_file_attr & ATTR_DIRECTORY)) + + if (context == CONTEXT_TREE) { - items[i].desc = ID2P(LANG_INSERT); - args[i].position = PLAYLIST_INSERT; - args[i].queue = false; + items[i].desc = ID2P(LANG_CREATE_PLAYLIST); + items[i].function = create_playlist; i++; + pstart++; + + if (audio_status() & AUDIO_STATUS_PLAY) + { + items[i].desc = ID2P(LANG_INSERT); + args[i].position = PLAYLIST_INSERT; + args[i].queue = false; + i++; + + items[i].desc = ID2P(LANG_INSERT_FIRST); + args[i].position = PLAYLIST_INSERT_FIRST; + args[i].queue = false; + i++; + + items[i].desc = ID2P(LANG_INSERT_LAST); + args[i].position = PLAYLIST_INSERT_LAST; + args[i].queue = false; + i++; + + items[i].desc = ID2P(LANG_QUEUE); + args[i].position = PLAYLIST_INSERT; + args[i].queue = true; + i++; + + items[i].desc = ID2P(LANG_QUEUE_FIRST); + args[i].position = PLAYLIST_INSERT_FIRST; + args[i].queue = true; + i++; + + items[i].desc = ID2P(LANG_QUEUE_LAST); + args[i].position = PLAYLIST_INSERT_LAST; + args[i].queue = true; + i++; + } + else if (((selected_file_attr & TREE_ATTR_MASK) == TREE_ATTR_MPA) || + (selected_file_attr & ATTR_DIRECTORY)) + { + items[i].desc = ID2P(LANG_INSERT); + args[i].position = PLAYLIST_INSERT; + args[i].queue = false; + i++; + } } m = menu_init( items, i, NULL, NULL, NULL, NULL ); @@ -385,11 +475,11 @@ bool create_dir(void) pathlen = strlen(dirname); rc = kbd_input(dirname + pathlen, (sizeof dirname)-pathlen); - if(rc < 0) + if (rc < 0) return false; rc = mkdir(dirname, 0); - if(rc < 0) { + if (rc < 0) { splash(HZ, true, "%s %s", str(LANG_CREATE_DIR), str(LANG_FAILED)); } else { onplay_result = ONPLAY_RELOAD_DIR; @@ -398,24 +488,38 @@ bool create_dir(void) return true; } -int onplay(char* file, int attr) +int onplay(char* file, int attr, int from) { - struct menu_item items[6]; /* increase this if you add entries! */ + struct menu_item items[8]; /* increase this if you add entries! */ int m, i=0, result; onplay_result = ONPLAY_OK; + context=from; + selected_file = file; + selected_file_attr = attr; - if(file) + if (context == CONTEXT_WPS || + context == CONTEXT_TREE || + context == CONTEXT_ID3DB) { - selected_file = file; - selected_file_attr = attr; - - if (((attr & TREE_ATTR_MASK) == TREE_ATTR_MPA) || - (attr & ATTR_DIRECTORY) || - ((attr & TREE_ATTR_MASK) == TREE_ATTR_M3U)) + if ((audio_status() & AUDIO_STATUS_PLAY)) + { + items[i].desc = ID2P(LANG_BOOKMARK_MENU); + items[i].function = bookmark_menu; + i++; + } + + items[i].desc = ID2P(LANG_PLAYLIST); + items[i].function = playlist_options; + i++; + } + + if (file) + { + if (context == CONTEXT_WPS) { - items[i].desc = ID2P(LANG_PLAYLIST); - items[i].function = playlist_options; + items[i].desc = ID2P(LANG_MENU_SHOW_ID3_INFO); + items[i].function = browse_id3; i++; } @@ -423,11 +527,14 @@ int onplay(char* file, int attr) if (!(attr & ATTR_VOLUME)) /* no rename+delete for volumes */ #endif { - items[i].desc = ID2P(LANG_RENAME); - items[i].function = rename_file; - i++; - - if (!(attr & ATTR_DIRECTORY)) + if (context == CONTEXT_TREE) + { + items[i].desc = ID2P(LANG_RENAME); + items[i].function = rename_file; + i++; + } + + if (!(attr & ATTR_DIRECTORY) && context == CONTEXT_TREE) { items[i].desc = ID2P(LANG_DELETE); items[i].function = delete_file; @@ -435,13 +542,16 @@ int onplay(char* file, int attr) } else { - items[i].desc = ID2P(LANG_DELETE_DIR); - items[i].function = delete_dir; - i++; + if (context == CONTEXT_TREE) + { + items[i].desc = ID2P(LANG_DELETE_DIR); + items[i].function = delete_dir; + i++; + } } } - if (!(attr & ATTR_DIRECTORY)) + if (!(attr & ATTR_DIRECTORY) && attr) { items[i].desc = ID2P(LANG_ONPLAY_OPEN_WITH); items[i].function = list_viewers; @@ -449,16 +559,30 @@ int onplay(char* file, int attr) } } - items[i].desc = ID2P(LANG_CREATE_DIR); - items[i].function = create_dir; - i++; + if (context == CONTEXT_TREE) + { + items[i].desc = ID2P(LANG_CREATE_DIR); + items[i].function = create_dir; + i++; + } /* DIY menu handling, since we want to exit after selection */ - m = menu_init( items, i, NULL, NULL, NULL, NULL ); - result = menu_show(m); - if (result >= 0) - items[result].function(); - menu_exit(m); + button_clear_queue(); + if (i) + { + m = menu_init( items, i, NULL, NULL, NULL, NULL ); + result = menu_show(m); + if (result >= 0) + items[result].function(); + menu_exit(m); + +#ifdef HAVE_LCD_BITMAP + if (global_settings.statusbar) + lcd_setmargins(0, STATUSBAR_HEIGHT); + else + lcd_setmargins(0, 0); +#endif + } return onplay_result; } |