From 97a4c1efa473e40b4dd7287571f3b1c9caaba97d Mon Sep 17 00:00:00 2001 From: Jonathan Gordon Date: Wed, 20 Jul 2011 14:11:15 +0000 Subject: FS#11808 - Major playlist handling changes (on disk playlists) * Playlists are treated similar to directories in the browser, they now open in the viewer when selected instead of automatically starting the playlist. * Make the "Playlists" main menu item useful, it now displays the playlist catalog (and has been renamed accordingly) * Default to storing playlists in the catalog * Add a UI to move the catalog directory (other minor stuff too) git-svn-id: svn://svn.rockbox.org/rockbox/trunk@30177 a1c6a512-1295-4272-9138-f99709370657 --- apps/filetree.c | 12 +++----- apps/lang/english.lang | 46 ++++++++++++++++++++++++++++-- apps/menus/playlist_menu.c | 53 +++++++++++++++++++++++++--------- apps/misc.h | 3 +- apps/onplay.c | 40 ++++++++++++++++++-------- apps/onplay.h | 4 +++ apps/playlist_catalog.c | 41 ++++++++++++++++++++++---- apps/playlist_catalog.h | 6 ++++ apps/playlist_viewer.c | 71 +++++++++++++++++++++++++--------------------- apps/playlist_viewer.h | 1 + apps/root_menu.c | 29 +++++++++++++++---- apps/tree.c | 11 +++++-- 12 files changed, 235 insertions(+), 82 deletions(-) diff --git a/apps/filetree.c b/apps/filetree.c index b7f3c9e981..654d33d347 100644 --- a/apps/filetree.c +++ b/apps/filetree.c @@ -1,4 +1,4 @@ -/*************************************************************************** + /*************************************************************************** * __________ __ ___. * Open \______ \ ____ ____ | | _\_ |__ _______ ___ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / @@ -43,6 +43,7 @@ #include "filetree.h" #include "misc.h" #include "strnatcmp.h" +#include "playlist_viewer.h" #ifdef HAVE_LCD_BITMAP #include "keyboard.h" #endif @@ -445,13 +446,8 @@ int ft_enter(struct tree_context* c) switch ( file->attr & FILE_ATTR_MASK ) { case FILE_ATTR_M3U: - play = ft_play_playlist(buf, c->currdir, file->name); - - if (play) - { - start_index = 0; - } - + if (!bookmark_autoload(buf)) + playlist_viewer_ex(buf); break; case FILE_ATTR_AUDIO: diff --git a/apps/lang/english.lang b/apps/lang/english.lang index e0811fad09..e9d1dbaccc 100644 --- a/apps/lang/english.lang +++ b/apps/lang/english.lang @@ -502,7 +502,7 @@ id: LANG_PLAYLISTS - desc: in the main menu and file view setting + desc: in the file view setting user: core *: "Playlists" @@ -6544,7 +6544,7 @@ id: LANG_CATALOG - desc: in onplay menu + desc: in main menu and onplay menu user: core *: "Playlist Catalog" @@ -12757,3 +12757,45 @@ *: "Rewind on Pause" + + id: LANG_SET_AS_PLAYLISTCAT_DIR + desc: used in the onplay menu to set a playlist catalog dir + user: core + + *: "Set As Playlist Catalog Directory" + + + *: "Set As Playlist Catalog Directory" + + + *: "Set As Playlist Catalog Directory" + + + + id: LANG_RESET_PLAYLISTCAT_DIR + desc: + user: core + + *: "Reset Playlist Catalog Directory" + + + *: "Reset Playlist Catalog Directory" + + + *: "Reset Playlist Catalog Directory" + + + + id: LANG_CURRENT_PLAYLIST + desc: Used when you need to say playlist, also voiced + user: core + + *: "Current Playlist" + + + *: "Current Playlist" + + + *: "Current Playlist" + + diff --git a/apps/menus/playlist_menu.c b/apps/menus/playlist_menu.c index a47c3b15e4..be3ad307c4 100644 --- a/apps/menus/playlist_menu.c +++ b/apps/menus/playlist_menu.c @@ -21,6 +21,7 @@ #include #include +#include #include "config.h" #include "lang.h" #include "action.h" @@ -35,20 +36,28 @@ #include "playlist_viewer.h" #include "talk.h" #include "playlist_catalog.h" +#include "splash.h" int save_playlist_screen(struct playlist_info* playlist) { - char temp[MAX_PATH+1]; + char temp[MAX_PATH+1], *dot; int len; - + playlist_get_name(playlist, temp, sizeof(temp)-1); len = strlen(temp); - if (len > 4 && !strcasecmp(&temp[len-4], ".m3u")) + dot = strrchr(temp, '.'); + if (!dot) + { + /* folder of some type */ + if (temp[1] != '\0') + strcpy(&temp[len-1], ".m3u8"); + else + snprintf(temp, sizeof(temp), "%s%s", + catalog_get_directory(), DEFAULT_DYNAMIC_PLAYLIST_NAME); + } + else if (len > 4 && !strcasecmp(dot, ".m3u")) strcat(temp, "8"); - - if (len <= 5 || strcasecmp(&temp[len-5], ".m3u8")) - strcpy(temp, DEFAULT_DYNAMIC_PLAYLIST_NAME); if (!kbd_input(temp, sizeof(temp))) { @@ -63,27 +72,45 @@ int save_playlist_screen(struct playlist_info* playlist) static int playlist_view_(void) { - return GO_TO_PLAYLIST_VIEWER; + playlist_viewer_ex(NULL); + return 0; } MENUITEM_FUNCTION(create_playlist_item, 0, ID2P(LANG_CREATE_PLAYLIST), (int(*)(void))create_playlist, NULL, NULL, Icon_NOICON); -MENUITEM_FUNCTION(view_cur_playlist, MENU_FUNC_CHECK_RETVAL, +MENUITEM_FUNCTION(view_cur_playlist, 0, ID2P(LANG_VIEW_DYNAMIC_PLAYLIST), (int(*)(void))playlist_view_, NULL, NULL, Icon_NOICON); MENUITEM_FUNCTION(save_playlist, MENU_FUNC_USEPARAM, ID2P(LANG_SAVE_DYNAMIC_PLAYLIST), (int(*)(void*))save_playlist_screen, NULL, NULL, Icon_NOICON); -MENUITEM_FUNCTION(catalog, 0, ID2P(LANG_CATALOG_VIEW), - (int(*)(void))catalog_view_playlists, - NULL, NULL, Icon_NOICON); MENUITEM_SETTING(recursive_dir_insert, &global_settings.recursive_dir_insert, NULL); MENUITEM_SETTING(warn_on_erase, &global_settings.warnon_erase_dynplaylist, NULL); +static int clear_catalog_directory(void) +{ + catalog_set_directory(NULL); + settings_save(); + splash(HZ, ID2P(LANG_RESET_DONE_CLEAR)); + return false; +} +MENUITEM_FUNCTION(clear_catalog_directory_item, 0, ID2P(LANG_RESET_PLAYLISTCAT_DIR), + clear_catalog_directory, NULL, NULL, Icon_file_view_menu); + +/* Playlist viewer settings submenu */ +MENUITEM_SETTING(show_icons, &global_settings.playlist_viewer_icons, NULL); +MENUITEM_SETTING(show_indices, &global_settings.playlist_viewer_indices, NULL); +MENUITEM_SETTING(track_display, + &global_settings.playlist_viewer_track_display, NULL); +MAKE_MENU(viewer_settings_menu, ID2P(LANG_PLAYLISTVIEWER_SETTINGS), + NULL, Icon_Playlist, + &show_icons, &show_indices, &track_display); + MAKE_MENU(playlist_settings, ID2P(LANG_PLAYLISTS), NULL, Icon_Playlist, - &recursive_dir_insert, &warn_on_erase); + &viewer_settings_menu, &recursive_dir_insert, &warn_on_erase); MAKE_MENU(playlist_options, ID2P(LANG_PLAYLISTS), NULL, Icon_Playlist, - &create_playlist_item, &view_cur_playlist, &save_playlist, &catalog); + &create_playlist_item, &view_cur_playlist, + &save_playlist, &clear_catalog_directory_item); diff --git a/apps/misc.h b/apps/misc.h index 7ea5360db5..1e151f0ebc 100644 --- a/apps/misc.h +++ b/apps/misc.h @@ -113,7 +113,8 @@ enum current_activity { ACTIVITY_PLUGINBROWSER, ACTIVITY_QUICKSCREEN, ACTIVITY_PITCHSCREEN, - ACTIVITY_OPTIONSELECT + ACTIVITY_OPTIONSELECT, + ACTIVITY_PLAYLISTBROWSER }; #if CONFIG_CODEC == SWCODEC diff --git a/apps/onplay.c b/apps/onplay.c index a2a3671d3e..da06f937b6 100644 --- a/apps/onplay.c +++ b/apps/onplay.c @@ -315,7 +315,7 @@ MENUITEM_FUNCTION(view_playlist_item, 0, ID2P(LANG_VIEW), view_playlist, NULL, treeplaylist_callback, Icon_Playlist); -MAKE_ONPLAYMENU( tree_playlist_menu, ID2P(LANG_PLAYLIST), +MAKE_ONPLAYMENU( tree_playlist_menu, ID2P(LANG_CURRENT_PLAYLIST), treeplaylist_callback, Icon_Playlist, /* view */ @@ -382,6 +382,12 @@ static int treeplaylist_callback(int action, return action; } +void onplay_show_playlist_menu(char* track_name) +{ + selected_file = track_name; + selected_file_attr = FILE_ATTR_AUDIO; + do_menu(&tree_playlist_menu, NULL, NULL, false); +} /* playlist catalog options */ static bool cat_add_to_a_playlist(void) @@ -395,23 +401,37 @@ static bool cat_add_to_a_new_playlist(void) return catalog_add_to_a_playlist(selected_file, selected_file_attr, true, NULL); } +static int clipboard_callback(int action,const struct menu_item_ex *this_item); +static bool set_catalogdir(void) +{ + catalog_set_directory(selected_file); + settings_save(); + return false; +} +MENUITEM_FUNCTION(set_catalogdir_item, 0, ID2P(LANG_SET_AS_PLAYLISTCAT_DIR), + set_catalogdir, NULL, clipboard_callback, Icon_Playlist); static int cat_playlist_callback(int action, const struct menu_item_ex *this_item); -MENUITEM_FUNCTION(cat_view_lists, 0, ID2P(LANG_CATALOG_VIEW), - catalog_view_playlists, 0, - cat_playlist_callback, Icon_Playlist); MENUITEM_FUNCTION(cat_add_to_list, 0, ID2P(LANG_CATALOG_ADD_TO), cat_add_to_a_playlist, 0, NULL, Icon_Playlist); MENUITEM_FUNCTION(cat_add_to_new, 0, ID2P(LANG_CATALOG_ADD_TO_NEW), cat_add_to_a_new_playlist, 0, NULL, Icon_Playlist); MAKE_ONPLAYMENU(cat_playlist_menu, ID2P(LANG_CATALOG), cat_playlist_callback, Icon_Playlist, - &cat_view_lists, &cat_add_to_list, &cat_add_to_new); + &cat_add_to_list, &cat_add_to_new, &set_catalogdir_item); + +void onplay_show_playlist_cat_menu(char* track_name) +{ + selected_file = track_name; + selected_file_attr = FILE_ATTR_AUDIO; + do_menu(&cat_playlist_menu, NULL, NULL, false); +} static int cat_playlist_callback(int action, const struct menu_item_ex *this_item) { + (void)this_item; if (!selected_file || (((selected_file_attr & FILE_ATTR_MASK) != FILE_ATTR_AUDIO) && ((selected_file_attr & FILE_ATTR_MASK) != FILE_ATTR_M3U) && @@ -430,12 +450,7 @@ static int cat_playlist_callback(int action, switch (action) { case ACTION_REQUEST_MENUITEM: - if (this_item == &cat_view_lists) - { - return action; - } - else if ((audio_status() & AUDIO_STATUS_PLAY) || - context != CONTEXT_WPS) + if ((audio_status() & AUDIO_STATUS_PLAY) || context != CONTEXT_WPS) { return action; } @@ -1100,7 +1115,8 @@ static int clipboard_callback(int action,const struct menu_item_ex *this_item) { /* only for directories */ if (this_item == &delete_dir_item || - this_item == &set_startdir_item + this_item == &set_startdir_item || + this_item == &set_catalogdir_item #ifdef HAVE_RECORDING || this_item == &set_recdir_item #endif diff --git a/apps/onplay.h b/apps/onplay.h index b129296a7b..921303cf57 100644 --- a/apps/onplay.h +++ b/apps/onplay.h @@ -48,4 +48,8 @@ enum hotkey_action { }; #endif +/* needed for the playlist viewer.. eventually clean this up */ +void onplay_show_playlist_cat_menu(char* track_name); +void onplay_show_playlist_menu(char* track_name); + #endif diff --git a/apps/playlist_catalog.c b/apps/playlist_catalog.c index 9d4d707c08..3687681b66 100644 --- a/apps/playlist_catalog.c +++ b/apps/playlist_catalog.c @@ -43,6 +43,8 @@ #include "debug.h" #include "playlist_catalog.h" #include "talk.h" +#include "playlist_viewer.h" +#include "bookmark.h" /* Use for recursive directory search */ struct add_track_context { @@ -59,9 +61,9 @@ static int playlist_dir_length; static bool playlist_dir_exists = false; /* Retrieve playlist directory from config file and verify it exists */ +static bool initialized = false; static int initialize_catalog(void) { - static bool initialized = false; if (!initialized) { @@ -110,6 +112,27 @@ static int initialize_catalog(void) return 0; } +void catalog_set_directory(const char* directory) +{ + if (directory == NULL) + { + global_settings.playlist_catalog_dir[0] = '\0'; + } + else + { + strcpy(global_settings.playlist_catalog_dir, directory); + } + initialized = false; + initialize_catalog(); +} + +const char* catalog_get_directory(void) +{ + if (initialize_catalog() == -1) + return ""; + return playlist_dir; +} + /* Display all playlists in catalog. Selected "playlist" is returned. If "view" mode is set then we're not adding anything into playlist. */ static int display_playlists(char* playlist, bool view) @@ -126,6 +149,8 @@ static int display_playlists(char* playlist, bool view) browse.buf = selected_playlist; browse.bufsize = sizeof(selected_playlist); +restart: + browse.flags &= ~BROWSE_SELECTED; rockbox_browse(&browse); if (browse.flags & BROWSE_SELECTED) @@ -135,9 +160,12 @@ static int display_playlists(char* playlist, bool view) if (view) { - char *filename = strrchr(selected_playlist, '/')+1; - /* In view mode, selecting a playlist starts playback */ - ft_play_playlist(selected_playlist, playlist_dir, filename); + + if (!bookmark_autoload(selected_playlist)) + { + if (playlist_viewer_ex(selected_playlist) == PLAYLIST_VIEWER_CANCEL) + goto restart; + } result = 0; } else @@ -311,8 +339,6 @@ bool catalog_add_to_a_playlist(const char* sel, int sel_attr, snprintf(playlist, MAX_PATH, "%s/%s.m3u8", playlist_dir, (name!=NULL && (sel_attr & ATTR_DIRECTORY))?name+1:""); - if (kbd_input(playlist, MAX_PATH)) - return false; } else strcpy(playlist, m3u8name); @@ -323,6 +349,9 @@ bool catalog_add_to_a_playlist(const char* sel, int sel_attr, strcat(playlist, "8"); else if(len <= 5 || strcasecmp(&playlist[len-5], ".m3u8")) strcat(playlist, ".m3u8"); + + if (kbd_input(playlist, MAX_PATH)) + return false; } else { diff --git a/apps/playlist_catalog.h b/apps/playlist_catalog.h index 2c2a2d4158..2e317128b7 100644 --- a/apps/playlist_catalog.h +++ b/apps/playlist_catalog.h @@ -21,6 +21,12 @@ #ifndef _PLAYLIST_CATALOG_H_ #define _PLAYLIST_CATALOG_H_ +/* Gets the configured playlist catalog dir */ +const char* catalog_get_directory(void); + +/* Set the playlist catalog dir */ +void catalog_set_directory(const char* directory); + /* * View list of playlists in catalog. * ret : true if no error diff --git a/apps/playlist_viewer.c b/apps/playlist_viewer.c index aaa45599b0..17b9cf5e39 100644 --- a/apps/playlist_viewer.c +++ b/apps/playlist_viewer.c @@ -125,7 +125,6 @@ static void format_line(const struct playlist_entry* track, char* str, static bool update_playlist(bool force); static int onplay_menu(int index); -static bool viewer_menu(void); static int save_playlist_func(void); static void playlist_buffer_init(struct playlist_buffer *pb, char *names_buffer, @@ -437,6 +436,9 @@ static bool update_playlist(bool force) return true; } +MENUITEM_FUNCTION(save_playlist_item, 0, ID2P(LANG_SAVE_DYNAMIC_PLAYLIST), + save_playlist_func, 0, NULL, Icon_NOICON); + /* Menu of playlist commands. Invoked via ON+PLAY on main viewer screen. Returns -1 if USB attached, 0 if no playlist change, and 1 if playlist changed. */ @@ -446,9 +448,9 @@ static int onplay_menu(int index) struct playlist_entry * current_track = playlist_buffer_get_track(&viewer.buffer, index); MENUITEM_STRINGLIST(menu_items, ID2P(LANG_PLAYLIST), NULL, + ID2P(LANG_PLAYLIST), ID2P(LANG_CATALOG), ID2P(LANG_REMOVE), ID2P(LANG_MOVE), - ID2P(LANG_CATALOG_ADD_TO), ID2P(LANG_CATALOG_ADD_TO_NEW), - ID2P(LANG_PLAYLISTVIEWER_SETTINGS)); + ID2P(LANG_SAVE_DYNAMIC_PLAYLIST)); bool current = (current_track->index == viewer.current_playing_track); result = do_menu(&menu_items, NULL, NULL, false); @@ -465,6 +467,16 @@ static int onplay_menu(int index) switch (result) { case 0: + /* playlist */ + onplay_show_playlist_menu(current_track->name); + ret = 0; + break; + case 1: + /* add to catalog */ + onplay_show_playlist_cat_menu(current_track->name); + ret = 0; + break; + case 2: /* delete track */ playlist_delete(viewer.playlist, current_track->index); if (current) @@ -490,43 +502,22 @@ static int onplay_menu(int index) } ret = 1; break; - case 1: + case 3: /* move track */ viewer.moving_track = index; viewer.moving_playlist_index = current_track->index; ret = 0; break; - case 2: /* add to catalog */ - case 3: /* add to a new one */ - catalog_add_to_a_playlist(current_track->name, - FILE_ATTR_AUDIO, - result == 3, NULL); + case 4: + /* save playlist */ + save_playlist_screen(viewer.playlist); ret = 0; break; - case 4: /* playlist viewer settings */ - /* true on usb connect */ - ret = viewer_menu() ? -1 : 0; - break; } } return ret; } -/* Menu of viewer options. Invoked via F1(r) or Menu(p). */ -MENUITEM_SETTING(show_icons, &global_settings.playlist_viewer_icons, NULL); -MENUITEM_SETTING(show_indices, &global_settings.playlist_viewer_indices, NULL); -MENUITEM_SETTING(track_display, - &global_settings.playlist_viewer_track_display, NULL); -MENUITEM_FUNCTION(save_playlist_item, 0, ID2P(LANG_SAVE_DYNAMIC_PLAYLIST), - save_playlist_func, 0, NULL, Icon_NOICON); -MAKE_MENU(viewer_settings_menu, ID2P(LANG_PLAYLISTVIEWER_SETTINGS), - NULL, Icon_Playlist, - &show_icons, &show_indices, &track_display, &save_playlist_item); -static bool viewer_menu(void) -{ - return do_menu(&viewer_settings_menu, NULL, NULL, false) == MENU_ATTACHED_USB; -} - /* Save playlist to disk */ static int save_playlist_func(void) { @@ -712,7 +703,10 @@ enum playlist_viewer_result playlist_viewer_ex(const char* filename) gui_synclist_draw(&playlist_lists); } else + { exit = true; + ret = PLAYLIST_VIEWER_CANCEL; + } break; } case ACTION_STD_OK: @@ -739,20 +733,31 @@ enum playlist_viewer_result playlist_viewer_ex(const char* filename) else if (!viewer.playlist) { /* play new track */ - playlist_start(current_track->index, 0); - update_playlist(false); + if (!global_settings.party_mode) + { + playlist_start(current_track->index, 0); + update_playlist(false); + } } - else + else if (!global_settings.party_mode) { + int start_index = current_track->index; + if (!warn_on_pl_erase()) + { + gui_synclist_draw(&playlist_lists); + break; + } /* New playlist */ if (playlist_set_current(viewer.playlist) < 0) goto exit; - - playlist_start(current_track->index, 0); + if (global_settings.playlist_shuffle) + start_index = playlist_shuffle(current_tick, start_index); + playlist_start(start_index, 0); /* Our playlist is now the current list */ if (!playlist_viewer_init(&viewer, NULL, true)) goto exit; + exit = true; } gui_synclist_draw(&playlist_lists); diff --git a/apps/playlist_viewer.h b/apps/playlist_viewer.h index 97f5b0baef..0a54c1b2cd 100644 --- a/apps/playlist_viewer.h +++ b/apps/playlist_viewer.h @@ -29,6 +29,7 @@ bool search_playlist(void); enum playlist_viewer_result { PLAYLIST_VIEWER_OK, + PLAYLIST_VIEWER_CANCEL, PLAYLIST_VIEWER_USB, PLAYLIST_VIEWER_MAINMENU, }; diff --git a/apps/root_menu.c b/apps/root_menu.c index 3e53bd9dc1..573ea9415c 100644 --- a/apps/root_menu.c +++ b/apps/root_menu.c @@ -60,6 +60,7 @@ #include "bookmark.h" #include "playlist.h" #include "playlist_viewer.h" +#include "playlist_catalog.h" #include "menus/exported_menus.h" #ifdef HAVE_RTC_ALARM #include "rtc.h" @@ -335,7 +336,21 @@ static int miscscrn(void * param) return GO_TO_ROOT; } } - + + +static int playlist_view_catalog(void * param) +{ + /* kludge untill catalog_view_playlists() returns something useful */ + int old_playstatus = audio_status(); + (void)param; + push_current_activity(ACTIVITY_PLAYLISTBROWSER); + catalog_view_playlists(); + pop_current_activity(); + if (!old_playstatus && audio_status()) + return GO_TO_WPS; + return GO_TO_PREVIOUS; +} + static int playlist_view(void * param) { (void)param; @@ -397,9 +412,9 @@ static const struct root_items items[] = { [GO_TO_RECENTBMARKS] = { load_bmarks, NULL, &bookmark_settings_menu }, [GO_TO_BROWSEPLUGINS] = { miscscrn, &plugin_menu, NULL }, - [GO_TO_PLAYLISTS_SCREEN] = { miscscrn, &playlist_options, - &playlist_settings }, - [GO_TO_PLAYLIST_VIEWER] = { playlist_view, NULL, NULL }, + [GO_TO_PLAYLISTS_SCREEN] = { playlist_view_catalog, NULL, + &playlist_options }, + [GO_TO_PLAYLIST_VIEWER] = { playlist_view, NULL, &playlist_options }, [GO_TO_SYSTEM_SCREEN] = { miscscrn, &info_menu, &system_menu }, }; @@ -415,6 +430,10 @@ MENUITEM_RETURNVALUE(db_browser, ID2P(LANG_TAGCACHE), GO_TO_DBBROWSER, #endif MENUITEM_RETURNVALUE(rocks_browser, ID2P(LANG_PLUGINS), GO_TO_BROWSEPLUGINS, NULL, Icon_Plugin); + +MENUITEM_RETURNVALUE(playlist_browser, ID2P(LANG_CATALOG), GO_TO_PLAYLIST_VIEWER, + NULL, Icon_Playlist); + static char *get_wps_item_name(int selected_item, void * data, char *buffer) { (void)selected_item; (void)data; (void)buffer; @@ -437,7 +456,7 @@ MENUITEM_RETURNVALUE(menu_, ID2P(LANG_SETTINGS), GO_TO_MAINMENU, MENUITEM_RETURNVALUE(bookmarks, ID2P(LANG_BOOKMARK_MENU_RECENT_BOOKMARKS), GO_TO_RECENTBMARKS, item_callback, Icon_Bookmark); -MENUITEM_RETURNVALUE(playlists, ID2P(LANG_PLAYLISTS), GO_TO_PLAYLISTS_SCREEN, +MENUITEM_RETURNVALUE(playlists, ID2P(LANG_CATALOG), GO_TO_PLAYLISTS_SCREEN, NULL, Icon_Playlist); MENUITEM_RETURNVALUE(system_menu_, ID2P(LANG_SYSTEM), GO_TO_SYSTEM_SCREEN, NULL, Icon_System_menu); diff --git a/apps/tree.c b/apps/tree.c index a9e6a6e840..f38edb2ae6 100644 --- a/apps/tree.c +++ b/apps/tree.c @@ -917,8 +917,15 @@ bool create_playlist(void) { char filename[MAX_PATH]; - snprintf(filename, sizeof filename, "%s.m3u8", - tc.currdir[1] ? tc.currdir : "/root"); + if (tc.currdir[1]) + snprintf(filename, sizeof filename, "%s.m3u8", tc.currdir); + else + snprintf(filename, sizeof filename, "%s/all.m3u8", + catalog_get_directory()); + + + if (kbd_input(filename, MAX_PATH)) + return false; splashf(0, "%s %s", str(LANG_CREATING), filename); trigger_cpu_boost(); -- cgit v1.2.3