diff --git a/intl/msg_hash_us.c b/intl/msg_hash_us.c index 42f31da853..79a978eae7 100644 --- a/intl/msg_hash_us.c +++ b/intl/msg_hash_us.c @@ -1461,6 +1461,8 @@ static const char *menu_hash_to_str_us_label_enum(enum msg_hash_enums msg) return "deferred_core_content_list"; case MENU_ENUM_LABEL_DEFERRED_CORE_CONTENT_DIRS_LIST: return "deferred_core_content_dirs_list"; + case MENU_ENUM_LABEL_DEFERRED_CORE_CONTENT_DIRS_SUBDIR_LIST: + return "deferred_core_content_dirs_subdir_list"; case MENU_ENUM_LABEL_DEFERRED_LAKKA_LIST: return "deferred_lakka_list"; case MENU_ENUM_LABEL_DOWNLOAD_CORE_CONTENT: diff --git a/menu/cbs/menu_cbs_deferred_push.c b/menu/cbs/menu_cbs_deferred_push.c index c3cf2be72b..73608f34df 100644 --- a/menu/cbs/menu_cbs_deferred_push.c +++ b/menu/cbs/menu_cbs_deferred_push.c @@ -357,6 +357,11 @@ static int deferred_push_core_content_dirs_list(menu_displaylist_info_t *info) return deferred_push_dlist(info, DISPLAYLIST_CORE_CONTENT_DIRS); } +static int deferred_push_core_content_dirs_subdir_list(menu_displaylist_info_t *info) +{ + return deferred_push_dlist(info, DISPLAYLIST_CORE_CONTENT_DIRS_SUBDIR); +} + static int deferred_push_lakka_list(menu_displaylist_info_t *info) { return deferred_push_dlist(info, DISPLAYLIST_LAKKA); @@ -778,6 +783,14 @@ static int menu_cbs_init_bind_deferred_push_compare_label( return 0; } + if (string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_DEFERRED_CORE_CONTENT_DIRS_SUBDIR_LIST))) + { +#ifdef HAVE_NETWORKING + BIND_ACTION_DEFERRED_PUSH(cbs, deferred_push_core_content_dirs_subdir_list); +#endif + return 0; + } + if (strstr(label, msg_hash_to_str(MENU_ENUM_LABEL_DEFERRED_RDB_ENTRY_DETAIL))) { BIND_ACTION_DEFERRED_PUSH(cbs, deferred_push_rdb_entry_detail); @@ -834,6 +847,11 @@ static int menu_cbs_init_bind_deferred_push_compare_label( case MENU_ENUM_LABEL_DEFERRED_CORE_CONTENT_DIRS_LIST: #ifdef HAVE_NETWORKING BIND_ACTION_DEFERRED_PUSH(cbs, deferred_push_core_content_dirs_list); +#endif + break; + case MENU_ENUM_LABEL_DEFERRED_CORE_CONTENT_DIRS_SUBDIR_LIST: +#ifdef HAVE_NETWORKING + BIND_ACTION_DEFERRED_PUSH(cbs, deferred_push_core_content_dirs_subdir_list); #endif break; case MENU_ENUM_LABEL_DEFERRED_CORE_UPDATER_LIST: diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 35e96b8984..55062b42e2 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -81,25 +81,13 @@ static void cb_net_generic_subdir(void *task_data, void *user_data, const char * finish: if (!err && !strstr(subdir_path, file_path_str(FILE_PATH_INDEX_DIRS_URL))) { - char *last = NULL; char parent_dir[PATH_MAX_LENGTH] = {0}; - file_list_t *selection_buf = menu_entries_get_selection_buf_ptr(0); - bool refresh = true; fill_pathname_parent_dir(parent_dir, state->path, sizeof(parent_dir)); - last = (char*)strrchr(parent_dir, '/'); - if (*last) - *last = '\0'; - - menu_entries_prepend(selection_buf, - subdir_path, - parent_dir, - MENU_ENUM_LABEL_URL_ENTRY, - FILE_TYPE_DOWNLOAD_URL, 0 ,0); - menu_entries_ctl(MENU_ENTRIES_CTL_UNSET_REFRESH, &refresh); - /* TODO/FIXME - fix this */ + generic_action_ok_displaylist_push(parent_dir, NULL, + subdir_path, 0, 0, 0, ACTION_OK_DL_CORE_CONTENT_DIRS_SUBDIR_LIST); } if (err) @@ -494,6 +482,19 @@ int generic_action_ok_displaylist_push(const char *path, info.enum_idx = MENU_ENUM_LABEL_DEFERRED_THUMBNAILS_UPDATER_LIST; dl_type = DISPLAYLIST_PENDING_CLEAR; break; + case ACTION_OK_DL_CORE_CONTENT_DIRS_SUBDIR_LIST: + { + char new_path[PATH_MAX_LENGTH]; + snprintf(new_path, sizeof(new_path), "%s;%s", path, label); + info.type = type; + info.directory_ptr = idx; + info_path = new_path; + info_label = msg_hash_to_str( + MENU_ENUM_LABEL_DEFERRED_CORE_CONTENT_DIRS_SUBDIR_LIST); + info.enum_idx = MENU_ENUM_LABEL_DEFERRED_CORE_CONTENT_DIRS_SUBDIR_LIST; + dl_type = DISPLAYLIST_GENERIC; + } + break; case ACTION_OK_DL_CORE_CONTENT_DIRS_LIST: info.type = type; info.directory_ptr = idx; diff --git a/menu/menu_cbs.h b/menu/menu_cbs.h index bce8a9ffec..5926acc188 100644 --- a/menu/menu_cbs.h +++ b/menu/menu_cbs.h @@ -74,6 +74,7 @@ enum ACTION_OK_DL_THUMBNAILS_UPDATER_LIST, ACTION_OK_DL_CORE_CONTENT_LIST, ACTION_OK_DL_CORE_CONTENT_DIRS_LIST, + ACTION_OK_DL_CORE_CONTENT_DIRS_SUBDIR_LIST, ACTION_OK_DL_DEFERRED_CORE_LIST, ACTION_OK_DL_DEFERRED_CORE_LIST_SET, ACTION_OK_DL_ONSCREEN_DISPLAY_SETTINGS_LIST, diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index dbae7c6ffd..d3689cf15d 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -5109,6 +5109,22 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, void *data) info->need_refresh = true; #endif break; + case DISPLAYLIST_CORE_CONTENT_DIRS_SUBDIR: + { +#ifdef HAVE_NETWORKING + struct string_list *str_list = string_split(info->path, ";"); + char new_label[PATH_MAX_LENGTH] = {0}; + strlcpy(new_label, str_list->elems[0].data, sizeof(new_label)); + strlcpy(core_buf, str_list->elems[1].data, core_len); + print_buf_lines(info->list, core_buf, new_label, + core_len, FILE_TYPE_DOWNLOAD_URL); + info->need_push = true; + info->need_refresh = true; + + string_list_free(str_list); +#endif + } + break; case DISPLAYLIST_CORE_CONTENT_DIRS: { #ifdef HAVE_NETWORKING diff --git a/menu/menu_displaylist.h b/menu/menu_displaylist.h index 8eeb7a6b0b..f69a06a539 100644 --- a/menu/menu_displaylist.h +++ b/menu/menu_displaylist.h @@ -145,6 +145,7 @@ enum menu_displaylist_ctl_state DISPLAYLIST_ARCHIVE_ACTION_DETECT_CORE, DISPLAYLIST_CORE_CONTENT, DISPLAYLIST_CORE_CONTENT_DIRS, + DISPLAYLIST_CORE_CONTENT_DIRS_SUBDIR, DISPLAYLIST_PROCESS, DISPLAYLIST_PUSH_ONTO_STACK, DISPLAYLIST_PENDING_CLEAR diff --git a/msg_hash.h b/msg_hash.h index 1f15571cbc..14767a4bbc 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -721,6 +721,7 @@ enum msg_hash_enums MENU_ENUM_LABEL_DEFERRED_ARCHIVE_OPEN, MENU_ENUM_LABEL_DEFERRED_CORE_CONTENT_LIST, MENU_ENUM_LABEL_DEFERRED_CORE_CONTENT_DIRS_LIST, + MENU_ENUM_LABEL_DEFERRED_CORE_CONTENT_DIRS_SUBDIR_LIST, MENU_ENUM_LABEL_DEFERRED_LAKKA_LIST, MENU_ENUM_LABEL_DEFERRED_INPUT_HOTKEY_BINDS_LIST, MENU_ENUM_LABEL_DEFERRED_DATABASE_MANAGER_LIST,