diff --git a/input/input_driver.c b/input/input_driver.c index d88516a0e7..b607604d68 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -7210,6 +7210,7 @@ void input_driver_collect_system_input(input_driver_state_t *input_st, switch (entry.type) { case FILE_TYPE_RPL_ENTRY: + case FILE_TYPE_DESCENDANT_ENTRY: case FILE_TYPE_PLAYLIST_ENTRY: case FILE_TYPE_PLAIN: case FILE_TYPE_RDB: diff --git a/intl/msg_hash_lbl.h b/intl/msg_hash_lbl.h index b83177539e..8956fcca59 100644 --- a/intl/msg_hash_lbl.h +++ b/intl/msg_hash_lbl.h @@ -2956,6 +2956,10 @@ MSG_HASH( MENU_ENUM_LABEL_PLAYLIST_ENTRY, "playlist_entry" ) +MSG_HASH( + MENU_ENUM_LABEL_DESCENDANT_ENTRY, + "descendant_entry" + ) MSG_HASH( MENU_ENUM_LABEL_PLAYLIST_SETTINGS, "playlist_settings" diff --git a/menu/cbs/menu_cbs_cancel.c b/menu/cbs/menu_cbs_cancel.c index e73389ae49..91ab82e4a1 100644 --- a/menu/cbs/menu_cbs_cancel.c +++ b/menu/cbs/menu_cbs_cancel.c @@ -79,6 +79,11 @@ int action_cancel_pop_default(const char *path, filebrowser_clear_type(); } + if (menu_type == FILE_TYPE_DESCENDANT_ENTRY + && menu_st->driver_ctx + && menu_st->driver_ctx->refresh_thumbnail_image) + menu_st->driver_ctx->refresh_thumbnail_image(menu_st->userdata, menu_st->selection_ptr); + new_selection_ptr = menu_st->selection_ptr; menu_entries_pop_stack(&new_selection_ptr, 0, 1); menu_st->selection_ptr = new_selection_ptr; diff --git a/menu/cbs/menu_cbs_deferred_push.c b/menu/cbs/menu_cbs_deferred_push.c index 1371102e07..171052dbcc 100644 --- a/menu/cbs/menu_cbs_deferred_push.c +++ b/menu/cbs/menu_cbs_deferred_push.c @@ -621,6 +621,7 @@ GENERIC_DEFERRED_PUSH_GENERAL(deferred_push_default, PUSH_DEFAULT, DISPLAYLIST_D GENERIC_DEFERRED_PUSH_GENERAL(deferred_push_favorites_list, PUSH_DEFAULT, DISPLAYLIST_FAVORITES) GENERIC_DEFERRED_PUSH_GENERAL(deferred_playlist_list, PUSH_DEFAULT, DISPLAYLIST_PLAYLIST) +GENERIC_DEFERRED_PUSH_GENERAL(deferred_descendant_list, PUSH_DEFAULT, DISPLAYLIST_DESCENDANT_LIST) GENERIC_DEFERRED_PUSH_GENERAL(deferred_music_history_list, PUSH_DEFAULT, DISPLAYLIST_MUSIC_HISTORY) GENERIC_DEFERRED_PUSH_GENERAL(deferred_image_history_list, PUSH_DEFAULT, DISPLAYLIST_IMAGES_HISTORY) GENERIC_DEFERRED_PUSH_GENERAL(deferred_video_history_list, PUSH_DEFAULT, DISPLAYLIST_VIDEO_HISTORY) @@ -776,6 +777,7 @@ static int menu_cbs_init_bind_deferred_push_compare_label( {MENU_ENUM_LABEL_DEFERRED_MUSIC, deferred_music_list}, {MENU_ENUM_LABEL_DEFERRED_MUSIC_LIST, deferred_music_history_list}, {MENU_ENUM_LABEL_DEFERRED_PLAYLIST_LIST, deferred_playlist_list}, + {MENU_ENUM_LABEL_DESCENDANT_ENTRY, deferred_descendant_list}, {MENU_ENUM_LABEL_DEFERRED_IMAGES_LIST, deferred_image_history_list}, {MENU_ENUM_LABEL_DEFERRED_VIDEO_LIST, deferred_video_history_list}, {MENU_ENUM_LABEL_DEFERRED_EXPLORE_LIST, deferred_explore_list}, diff --git a/menu/cbs/menu_cbs_left.c b/menu/cbs/menu_cbs_left.c index cc92325927..a2f201ab74 100644 --- a/menu/cbs/menu_cbs_left.c +++ b/menu/cbs/menu_cbs_left.c @@ -1181,6 +1181,7 @@ static int menu_cbs_init_bind_left_compare_type(menu_file_list_cbs_t *cbs, case FILE_TYPE_RDB: case FILE_TYPE_RDB_ENTRY: case FILE_TYPE_RPL_ENTRY: + case FILE_TYPE_DESCENDANT_ENTRY: case FILE_TYPE_SHADER: case FILE_TYPE_SHADER_PRESET: case FILE_TYPE_IMAGE: diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index d4c0a8b8a3..2ff6930898 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -1076,6 +1076,16 @@ int generic_action_ok_displaylist_push( menu->rpl_entry_selection_ptr = (unsigned)entry_idx; dl_type = DISPLAYLIST_GENERIC; break; + case ACTION_OK_DL_DESCENDANT_ENTRY: + fill_pathname_expand_special(menu->deferred_path, label, sizeof(menu->deferred_path)); + info_label = msg_hash_to_str(MENU_ENUM_LABEL_DESCENDANT_ENTRY); + info_path = menu->deferred_path; + info.enum_idx = MENU_ENUM_LABEL_DESCENDANT_ENTRY; + info.directory_ptr = idx; + menu->rpl_entry_selection_ptr = (unsigned)entry_idx; + dl_type = DISPLAYLIST_DESCENDANT; + info.type = type; + break; case ACTION_OK_DL_AUDIO_DSP_PLUGIN: filebrowser_clear_type(); info.directory_ptr = idx; @@ -6587,6 +6597,7 @@ STATIC_DEFAULT_ACTION_OK_FUNC(action_ok_overlay_preset, ACTION_OK_DL_OVERLAY_PRE STATIC_DEFAULT_ACTION_OK_FUNC(action_ok_osk_overlay_preset, ACTION_OK_DL_OSK_OVERLAY_PRESET) STATIC_DEFAULT_ACTION_OK_FUNC(action_ok_video_font, ACTION_OK_DL_VIDEO_FONT) STATIC_DEFAULT_ACTION_OK_FUNC(action_ok_rpl_entry, ACTION_OK_DL_RPL_ENTRY) +STATIC_DEFAULT_ACTION_OK_FUNC(action_ok_descendant_entry, ACTION_OK_DL_DESCENDANT_ENTRY) STATIC_DEFAULT_ACTION_OK_FUNC(action_ok_open_archive, ACTION_OK_DL_OPEN_ARCHIVE) STATIC_DEFAULT_ACTION_OK_FUNC(action_ok_open_archive_detect_core, ACTION_OK_DL_OPEN_ARCHIVE_DETECT_CORE) STATIC_DEFAULT_ACTION_OK_FUNC(action_ok_file_load_music, ACTION_OK_DL_MUSIC) @@ -9637,6 +9648,9 @@ static int menu_cbs_init_bind_ok_compare_type(menu_file_list_cbs_t *cbs, case FILE_TYPE_RPL_ENTRY: BIND_ACTION_OK(cbs, action_ok_rpl_entry); break; + case FILE_TYPE_DESCENDANT_ENTRY: + BIND_ACTION_OK(cbs, action_ok_descendant_entry); + break; case FILE_TYPE_PLAYLIST_COLLECTION: BIND_ACTION_OK(cbs, action_ok_playlist_collection); break; diff --git a/menu/cbs/menu_cbs_right.c b/menu/cbs/menu_cbs_right.c index e00f651e2c..2da6ef00c9 100644 --- a/menu/cbs/menu_cbs_right.c +++ b/menu/cbs/menu_cbs_right.c @@ -1035,6 +1035,7 @@ static int menu_cbs_init_bind_right_compare_type(menu_file_list_cbs_t *cbs, case FILE_TYPE_RDB: case FILE_TYPE_RDB_ENTRY: case FILE_TYPE_RPL_ENTRY: + case FILE_TYPE_DESCENDANT_ENTRY: case FILE_TYPE_SHADER: case FILE_TYPE_SHADER_PRESET: case FILE_TYPE_IMAGE: diff --git a/menu/cbs/menu_cbs_scan.c b/menu/cbs/menu_cbs_scan.c index 614d9fda32..4bb6baba4e 100644 --- a/menu/cbs/menu_cbs_scan.c +++ b/menu/cbs/menu_cbs_scan.c @@ -271,6 +271,7 @@ static int menu_cbs_init_bind_scan_compare_type(menu_file_list_cbs_t *cbs, return 0; #endif case FILE_TYPE_RPL_ENTRY: + case FILE_TYPE_DESCENDANT_ENTRY: BIND_ACTION_SCAN(cbs, action_switch_thumbnail); return 0; diff --git a/menu/cbs/menu_cbs_title.c b/menu/cbs/menu_cbs_title.c index 8506531488..91a4372493 100644 --- a/menu/cbs/menu_cbs_title.c +++ b/menu/cbs/menu_cbs_title.c @@ -1856,6 +1856,7 @@ int menu_cbs_init_bind_title(menu_file_list_cbs_t *cbs, {MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_NETPLAY_MITM_SERVER, action_get_title_dropdown_item}, #endif {MENU_ENUM_LABEL_DEFERRED_RPL_ENTRY_ACTIONS, action_get_quick_menu_views_settings_list}, + {MENU_ENUM_LABEL_DESCENDANT_ENTRY, action_get_title_deferred_playlist_list}, {MENU_ENUM_LABEL_DEFERRED_PLAYLIST_LIST, action_get_title_deferred_playlist_list}, {MENU_ENUM_LABEL_DEFERRED_PLAYLIST_MANAGER_SETTINGS, action_get_title_deferred_playlist_list}, {MENU_ENUM_LABEL_PLAYLISTS_TAB, action_get_title_collection}, @@ -1869,6 +1870,7 @@ int menu_cbs_init_bind_title(menu_file_list_cbs_t *cbs, if (cbs->enum_idx != MENU_ENUM_LABEL_PLAYLIST_ENTRY && cbs->enum_idx != MENU_ENUM_LABEL_EXPLORE_ITEM && + cbs->enum_idx != MENU_ENUM_LABEL_DESCENDANT_ENTRY && menu_cbs_init_bind_title_compare_label(cbs, label) == 0) return 0; diff --git a/menu/drivers/materialui.c b/menu/drivers/materialui.c index 2c0c2d5cf0..a5e8f66f90 100644 --- a/menu/drivers/materialui.c +++ b/menu/drivers/materialui.c @@ -9506,6 +9506,7 @@ static void materialui_populate_entries(void *data, const char *path, | MUI_FLAG_IS_DROPDOWN_LIST); if ( string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_DEFERRED_PLAYLIST_LIST)) + || string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_DESCENDANT_ENTRY)) || string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_LOAD_CONTENT_HISTORY)) || string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_DEFERRED_FAVORITES_LIST)) || string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_DEFERRED_IMAGES_LIST)) @@ -9587,7 +9588,8 @@ static void materialui_populate_entries(void *data, const char *path, if ( (list) && (list_size > 0) - && (list->list[0].type == FILE_TYPE_RPL_ENTRY)) + && ((list->list[0].type == FILE_TYPE_RPL_ENTRY) + || (list->list[0].type == FILE_TYPE_DESCENDANT_ENTRY))) mui->playlist = playlist_get_cached(); } @@ -11508,6 +11510,7 @@ static void materialui_list_insert(void *userdata, node->icon_type = MUI_ICON_TYPE_NONE; break; case FILE_TYPE_RPL_ENTRY: + case FILE_TYPE_DESCENDANT_ENTRY: case MENU_SETTING_DROPDOWN_ITEM: case MENU_SETTING_DROPDOWN_ITEM_RESOLUTION: case MENU_SETTING_DROPDOWN_ITEM_VIDEO_SHADER_PARAM: diff --git a/menu/drivers/ozone.c b/menu/drivers/ozone.c index 6857a6e361..ffa79ad286 100644 --- a/menu/drivers/ozone.c +++ b/menu/drivers/ozone.c @@ -2321,6 +2321,7 @@ static uintptr_t ozone_entries_icon_get_texture( case FILE_TYPE_IN_CARCHIVE: return ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_FILE]; case FILE_TYPE_RPL_ENTRY: + case FILE_TYPE_DESCENDANT_ENTRY: case FILE_TYPE_PLAYLIST_COLLECTION: switch (ozone->tabs[ozone->categories_selection_ptr]) { @@ -3728,14 +3729,19 @@ static bool ozone_is_main_menu_playlist(void *userdata) { ozone_handle_t *ozone = (ozone_handle_t*)userdata; menu_entry_t entry; + MENU_ENTRY_INITIALIZE(entry); + menu_entry_get(&entry, 0, 0, NULL, true); + + if (entry.type == FILE_TYPE_DESCENDANT_ENTRY) + return true; + + if ( (ozone->depth != 3) || (ozone->flags & OZONE_FLAG_IS_DB_MANAGER_LIST) || (ozone->flags & OZONE_FLAG_IS_FILE_LIST)) return false; - MENU_ENTRY_INITIALIZE(entry); - menu_entry_get(&entry, 0, 0, NULL, true); return entry.type == FILE_TYPE_RPL_ENTRY; } @@ -4176,7 +4182,7 @@ static void ozone_update_content_metadata(ozone_handle_t *ozone) if (!string_is_empty(menu_st->thumbnail_path_data->content_core_name)) { - if ( string_is_equal( + if ( (string_is_equal( menu_st->thumbnail_path_data->content_core_name, "imageviewer") || string_is_equal( @@ -4185,6 +4191,8 @@ static void ozone_update_content_metadata(ozone_handle_t *ozone) || string_is_equal( menu_st->thumbnail_path_data->content_core_name, "movieplayer")) + && (( !(ozone->flags & OZONE_FLAG_IS_PLAYLIST)) + && ( !(ozone->flags2 & OZONE_FLAG2_IS_QUICK_MENU)))) ozone->flags2 |= OZONE_FLAG2_SELECTION_CORE_IS_VIEWER; else ozone->flags2 &= ~OZONE_FLAG2_SELECTION_CORE_IS_VIEWER; @@ -4242,7 +4250,8 @@ static void ozone_update_content_metadata(ozone_handle_t *ozone) * to the selected entry */ else if (list && (selection < list_size) - && (list->list[selection].type == FILE_TYPE_RPL_ENTRY)) + && ((list->list[selection].type == FILE_TYPE_RPL_ENTRY) + || (list->list[selection].type == FILE_TYPE_DESCENDANT_ENTRY))) { playlist_index = list->list[selection].entry_idx; @@ -5947,7 +5956,7 @@ border_iterate: if (texture) { /* Console specific icons */ - if ( entry.type == FILE_TYPE_RPL_ENTRY + if ( (entry.type == FILE_TYPE_RPL_ENTRY) && ozone->categories_selection_ptr > ozone->system_tab_end) { ozone_node_t *sidebar_node = (ozone_node_t*) @@ -6021,7 +6030,7 @@ border_iterate: } } /* History/Favorite console specific content icons */ - else if ( entry.type == FILE_TYPE_RPL_ENTRY + else if ( (entry.type == FILE_TYPE_RPL_ENTRY) && show_history_icons != PLAYLIST_SHOW_HISTORY_ICONS_DEFAULT) { switch (ozone->tabs[ozone->categories_selection_ptr]) @@ -7723,7 +7732,8 @@ static void ozone_set_thumbnail_content(void *data, const char *s) * to the selected entry */ if ( list && (selection < list_size) - && (list->list[selection].type == FILE_TYPE_RPL_ENTRY)) + && ((list->list[selection].type == FILE_TYPE_RPL_ENTRY) + || (list->list[selection].type == FILE_TYPE_DESCENDANT_ENTRY))) { selection = list->list[selection].entry_idx; pl = playlist_get_cached(); @@ -8001,6 +8011,7 @@ static bool ozone_manage_available(ozone_handle_t *ozone, size_t current_selecti { case FILE_TYPE_PLAYLIST_COLLECTION: case FILE_TYPE_RPL_ENTRY: + case FILE_TYPE_DESCENDANT_ENTRY: return true; default: break; @@ -11749,8 +11760,7 @@ static void ozone_selection_changed(ozone_handle_t *ozone, bool allow_animation) bool update_thumbnails = false; /* Playlist updates */ - if ( (ozone->flags & OZONE_FLAG_IS_PLAYLIST) - && (ozone->depth == 1 || ozone->depth == 3)) + if (ozone->flags & OZONE_FLAG_IS_PLAYLIST) { ozone_set_thumbnail_content(ozone, ""); update_thumbnails = true; @@ -12425,7 +12435,7 @@ static void ozone_populate_entries( if (!list || (list->size < 1)) goto_sidebar = true; - else if ((list->list[0].type != FILE_TYPE_RPL_ENTRY)) + else if (list->list[0].type != FILE_TYPE_RPL_ENTRY) goto_sidebar = true; if (goto_sidebar) @@ -12502,7 +12512,8 @@ static void ozone_populate_entries( else ozone->flags &= ~OZONE_FLAG_IS_STATE_SLOT; - if (ozone_is_playlist(ozone, true)) + if (ozone_is_playlist(ozone, true) + || string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_DESCENDANT_ENTRY))) ozone->flags |= OZONE_FLAG_IS_PLAYLIST; else ozone->flags &= ~OZONE_FLAG_IS_PLAYLIST; @@ -12642,7 +12653,7 @@ static void ozone_populate_entries( * and savestate slots */ if ( ( (ozone->flags & OZONE_FLAG_WANT_THUMBNAIL_BAR)) - && ( ((ozone->flags & OZONE_FLAG_IS_PLAYLIST) && (ozone->depth == 1 || ozone->depth == 3)) + && ( ((ozone->flags & OZONE_FLAG_IS_PLAYLIST)) || ((ozone->flags & OZONE_FLAG_IS_DB_MANAGER_LIST) && (ozone->depth >= 4)) || (ozone->flags & OZONE_FLAG_IS_EXPLORE_LIST) || (ozone->flags & OZONE_FLAG_IS_FILE_LIST) diff --git a/menu/drivers/rgui.c b/menu/drivers/rgui.c index 429212493b..1b469c6ed3 100644 --- a/menu/drivers/rgui.c +++ b/menu/drivers/rgui.c @@ -7027,7 +7027,8 @@ static void rgui_scan_selected_entry_thumbnail(rgui_t *rgui, bool force_load) * to the selected entry */ if ( (list) && (selection < list_size) - && (list->list[selection].type == FILE_TYPE_RPL_ENTRY)) + && ((list->list[selection].type == FILE_TYPE_RPL_ENTRY) + || (list->list[selection].type == FILE_TYPE_DESCENDANT_ENTRY))) { playlist_valid = true; playlist_index = list->list[selection].entry_idx; @@ -7385,6 +7386,7 @@ static void rgui_populate_entries( /* Check whether we are currently viewing a playlist */ if ( string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_DEFERRED_PLAYLIST_LIST)) + || string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_DESCENDANT_ENTRY)) || string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_LOAD_CONTENT_HISTORY)) || string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_DEFERRED_FAVORITES_LIST)) || string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_DEFERRED_IMAGES_LIST)) diff --git a/menu/drivers/xmb.c b/menu/drivers/xmb.c index d39d51b5e7..82153c821c 100644 --- a/menu/drivers/xmb.c +++ b/menu/drivers/xmb.c @@ -1473,7 +1473,8 @@ static void xmb_set_thumbnail_content(void *data, const char *s) * to the selected entry */ if ( list && (selection < list_size) - && (list->list[selection].type == FILE_TYPE_RPL_ENTRY)) + && ((list->list[selection].type == FILE_TYPE_RPL_ENTRY) + || (list->list[selection].type == FILE_TYPE_DESCENDANT_ENTRY))) { playlist_valid = true; playlist_index = list->list[selection].entry_idx; @@ -1722,7 +1723,8 @@ static void xmb_set_dynamic_icon_content( * to the selected entry */ if ( list && (selection < list_size) - && (list->list[selection].type == FILE_TYPE_RPL_ENTRY)) + && ((list->list[selection].type == FILE_TYPE_RPL_ENTRY) + || (list->list[selection].type == FILE_TYPE_DESCENDANT_ENTRY))) { playlist_valid = true; playlist_index = list->list[selection].entry_idx; @@ -3101,7 +3103,8 @@ static void xmb_populate_entries(void *data, || string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_DEFERRED_FAVORITES_LIST)) || string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_DEFERRED_IMAGES_LIST)) || string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_DEFERRED_MUSIC_LIST)) - || string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_DEFERRED_VIDEO_LIST)); + || string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_DEFERRED_VIDEO_LIST)) + || string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_DESCENDANT_ENTRY)); xmb->is_playlist |= (xmb_horizontal_type == FILE_TYPE_PLAYLIST_COLLECTION) @@ -3152,6 +3155,8 @@ static void xmb_populate_entries(void *data, xmb->is_quick_menu = string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_DEFERRED_RPL_ENTRY_ACTIONS)) + || string_is_equal(label, + msg_hash_to_str(MENU_ENUM_LABEL_DESCENDANT_ENTRY)) || string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_CONTENT_SETTINGS)) || string_is_equal(label, @@ -3839,6 +3844,7 @@ static uintptr_t xmb_icon_get_id(xmb_handle_t *xmb, case FILE_TYPE_IN_CARCHIVE: return xmb->textures.list[XMB_TEXTURE_FILE]; case FILE_TYPE_RPL_ENTRY: + case FILE_TYPE_DESCENDANT_ENTRY: case FILE_TYPE_PLAYLIST_COLLECTION: if (core_node) return core_node->content_icon; @@ -3859,6 +3865,7 @@ static uintptr_t xmb_icon_get_id(xmb_handle_t *xmb, switch (type) { case FILE_TYPE_RPL_ENTRY: + case FILE_TYPE_DESCENDANT_ENTRY: return db_node->content_icon; case FILE_TYPE_PLAYLIST_COLLECTION: return db_node->icon; @@ -5250,7 +5257,7 @@ static int xmb_draw_item( texture = sidebar_node->icon; } /* History/Favorite console specific content icons */ - else if (entry_type == FILE_TYPE_RPL_ENTRY + else if ((entry_type == FILE_TYPE_RPL_ENTRY) && show_history_icons != PLAYLIST_SHOW_HISTORY_ICONS_DEFAULT) { switch (xmb_get_system_tab(xmb, (unsigned)xmb->categories_selection_ptr)) diff --git a/menu/menu_cbs.h b/menu/menu_cbs.h index da1e19aad1..1fd70abf26 100644 --- a/menu/menu_cbs.h +++ b/menu/menu_cbs.h @@ -74,6 +74,7 @@ enum ACTION_OK_DL_MANUAL_SCAN_DIR_LIST, ACTION_OK_DL_HELP, ACTION_OK_DL_RPL_ENTRY, + ACTION_OK_DL_DESCENDANT_ENTRY, ACTION_OK_DL_RDB_ENTRY, ACTION_OK_DL_RDB_ENTRY_SUBMENU, ACTION_OK_DL_CDROM_INFO_LIST, diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index 1019c944b1..4581ee9e9c 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -2503,6 +2503,8 @@ static int menu_displaylist_parse_playlist( bool pl_show_sublabels = settings->bools.playlist_show_sublabels; void (*sanitization)(char*) = NULL; unsigned count = 0; + enum msg_file_type type_target = FILE_TYPE_RPL_ENTRY; + enum msg_hash_enums enum_idx = MENU_ENUM_LABEL_PLAYLIST_ENTRY; if (list_size == 0) return 0; @@ -2667,10 +2669,17 @@ static int menu_displaylist_parse_playlist( } } + if (entry && string_is_equal(entry->core_path, "virtual") + && string_is_equal(entry->core_name, "playlist")) + { + type_target = FILE_TYPE_DESCENDANT_ENTRY; + enum_idx = MENU_ENUM_LABEL_DESCENDANT_ENTRY; + } + /* Add menu entry */ if (entry_valid && menu_entries_append(info_list, menu_entry_lbl, entry_path, - MENU_ENUM_LABEL_PLAYLIST_ENTRY, FILE_TYPE_RPL_ENTRY, 0, i, NULL)) + enum_idx, type_target, 0, i, NULL)) count++; } @@ -15539,6 +15548,7 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, case DISPLAYLIST_FILE_BROWSER_SELECT_CORE: case DISPLAYLIST_FILE_BROWSER_SELECT_COLLECTION: case DISPLAYLIST_GENERIC: + case DISPLAYLIST_DESCENDANT: info->flags |= MD_FLAG_NEED_NAVIGATION_CLEAR; /* fall-through */ case DISPLAYLIST_PENDING_CLEAR: @@ -15717,6 +15727,7 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, use_filebrowser = true; break; case DISPLAYLIST_PLAYLIST: + case DISPLAYLIST_DESCENDANT_LIST: { const char *_msg = path_basename_nocompression(info->path); menu_entries_clear(info->list); diff --git a/menu/menu_displaylist.h b/menu/menu_displaylist.h index 5be81f0442..5dca644106 100644 --- a/menu/menu_displaylist.h +++ b/menu/menu_displaylist.h @@ -101,6 +101,8 @@ enum menu_displaylist_ctl_state DISPLAYLIST_CONTENTLESS_CORES, DISPLAYLIST_FAVORITES, DISPLAYLIST_PLAYLIST, + DISPLAYLIST_DESCENDANT, + DISPLAYLIST_DESCENDANT_LIST, DISPLAYLIST_VIDEO_HISTORY, DISPLAYLIST_MUSIC_HISTORY, DISPLAYLIST_IMAGES_HISTORY, diff --git a/menu/menu_driver.c b/menu/menu_driver.c index 4bc5318aa4..dd81721941 100644 --- a/menu/menu_driver.c +++ b/menu/menu_driver.c @@ -3330,6 +3330,7 @@ bool menu_driver_search_filter_enabled(const char *label, unsigned type) || (type == MENU_IMAGES_TAB) || (type == MENU_MUSIC_TAB) || (type == MENU_VIDEO_TAB) + || (type == FILE_TYPE_DESCENDANT_ENTRY) || (type == FILE_TYPE_PLAYLIST_COLLECTION); if (!filter_enabled && !string_is_empty(label)) @@ -7914,6 +7915,16 @@ int generic_menu_entry_action( flush_target = msg_hash_to_str(MENU_ENUM_LABEL_DEFERRED_RPL_ENTRY_ACTIONS); break; } + else if ( string_is_equal(parent_label, + msg_hash_to_str(MENU_ENUM_LABEL_DESCENDANT_ENTRY)) + && (!string_is_empty(deferred_path) + && !string_is_empty(content_path) + && string_is_equal(deferred_path, content_path)) + ) + { + flush_target = msg_hash_to_str(MENU_ENUM_LABEL_DESCENDANT_ENTRY); + break; + } /* If core was launched via 'Contentless Cores' menu, * flush to 'Contentless Cores' menu */ else if ( string_is_equal(parent_label, diff --git a/msg_hash.h b/msg_hash.h index 11a8ade127..e9e96ced27 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -82,6 +82,7 @@ enum msg_file_type FILE_TYPE_RDB, FILE_TYPE_RDB_ENTRY, FILE_TYPE_RPL_ENTRY, + FILE_TYPE_DESCENDANT_ENTRY, FILE_TYPE_BOOL_ON, FILE_TYPE_BOOL_OFF, FILE_TYPE_RECORD_CONFIG, @@ -876,6 +877,7 @@ enum msg_hash_enums #endif MENU_ENUM_LABEL_PLAYLIST_COLLECTION_ENTRY, MENU_ENUM_LABEL_PLAYLIST_ENTRY, + MENU_ENUM_LABEL_DESCENDANT_ENTRY, MENU_LABEL(START_VIDEO_PROCESSOR), MENU_LABEL(START_NET_RETROPAD),