size_t menu_entries_get_stack_size(size_t idx) { menu_list_t *menu_list = menu_list_get_ptr(); if (!menu_list) return 0; return menu_list_get_stack_size(menu_list, idx); }
static bool menu_list_pop_stack(menu_list_t *list, size_t idx, size_t *directory_ptr) { menu_ctx_list_t list_info; bool refresh = false; file_list_t *menu_list = NULL; if (!list) return false; menu_list = list->menu_stack[idx]; if (menu_list_get_stack_size(list, idx) <= 1) return false; list_info.type = MENU_LIST_PLAIN; list_info.action = 0; menu_driver_ctl(RARCH_MENU_CTL_LIST_CACHE, &list_info); if (menu_list->size != 0) { menu_ctx_list_t list_info; list_info.list = menu_list; list_info.idx = menu_list->size - 1; list_info.list_size = menu_list->size - 1; menu_driver_ctl(RARCH_MENU_CTL_LIST_FREE, &list_info); } file_list_pop(menu_list, directory_ptr); menu_driver_ctl(RARCH_MENU_CTL_LIST_SET_SELECTION, menu_list); menu_entries_ctl(MENU_ENTRIES_CTL_SET_REFRESH, &refresh); return true; }
static bool menu_list_pop_stack(menu_list_t *list, size_t idx, size_t *directory_ptr, bool animate) { menu_ctx_list_t list_info; bool refresh = false; file_list_t *menu_list = menu_list_get(list, (unsigned)idx); if (menu_list_get_stack_size(list, idx) <= 1) return false; list_info.type = MENU_LIST_PLAIN; list_info.action = 0; if (animate) menu_driver_list_cache(&list_info); if (menu_list->size != 0) { menu_ctx_list_t list_info; list_info.list = menu_list; list_info.idx = menu_list->size - 1; list_info.list_size = menu_list->size - 1; menu_driver_ctl(RARCH_MENU_CTL_LIST_FREE, &list_info); } file_list_pop(menu_list, directory_ptr); menu_driver_list_set_selection(menu_list); if (animate) menu_entries_ctl(MENU_ENTRIES_CTL_SET_REFRESH, &refresh); return true; }
size_t menu_entries_get_stack_size(size_t idx) { menu_list_t *menu_list = NULL; menu_entries_ctl(MENU_ENTRIES_CTL_LIST_GET, &menu_list); if (!menu_list) return 0; return menu_list_get_stack_size(menu_list, idx); }
// Returns true if a Back button should be shown (i.e. we are at least // one level deep in the menu hierarchy) uint32_t menu_entries_show_back(void) { menu_list_t *menu_list = menu_list_get_ptr(); if (!menu_list) return false; return (menu_list_get_stack_size(menu_list) > 1); }
void menu_list_pop_stack(menu_list_t *list) { menu_navigation_t *nav = menu_navigation_get_ptr(); if (!list) return; if (menu_list_get_stack_size(list) <= 1) return; menu_driver_list_cache(MENU_LIST_PLAIN, 0); menu_list_pop(list->menu_stack, &nav->selection_ptr); menu_entries_set_refresh(false); }
static bool menu_list_pop_stack(menu_list_t *list, size_t idx, size_t *directory_ptr) { file_list_t *menu_list = NULL; if (!list) return false; menu_list = list->menu_stack[idx]; if (menu_list_get_stack_size(list, idx) <= 1) return false; menu_driver_list_cache(MENU_LIST_PLAIN, 0); if (menu_list->size != 0) menu_driver_list_free(menu_list, menu_list->size - 1, menu_list->size - 1); file_list_pop(menu_list, directory_ptr); menu_driver_list_set_selection(menu_list); menu_entries_set_refresh(false); return true; }
bool menu_entries_ctl(enum menu_entries_ctl_state state, void *data) { switch (state) { case MENU_ENTRIES_CTL_DEINIT: menu_entries_ctl(MENU_ENTRIES_CTL_SETTINGS_DEINIT, NULL); menu_entries_ctl(MENU_ENTRIES_CTL_LIST_DEINIT, NULL); menu_entries_need_refresh = false; menu_entries_nonblocking_refresh = false; menu_entries_begin = 0; break; case MENU_ENTRIES_CTL_NEEDS_REFRESH: if (menu_entries_nonblocking_refresh) return false; if (!menu_entries_need_refresh) return false; break; case MENU_ENTRIES_CTL_LIST_GET: { menu_list_t **list = (menu_list_t**)data; if (!list) return false; *list = menu_entries_list; } return true; case MENU_ENTRIES_CTL_LIST_DEINIT: if (menu_entries_list) menu_list_free(menu_entries_list); menu_entries_list = NULL; break; case MENU_ENTRIES_CTL_LIST_INIT: if (!(menu_entries_list = (menu_list_t*)menu_list_new())) return false; break; case MENU_ENTRIES_CTL_SETTINGS_GET: { rarch_setting_t **settings = (rarch_setting_t**)data; if (!settings) return false; *settings = menu_entries_list_settings; } break; case MENU_ENTRIES_CTL_SETTINGS_DEINIT: menu_setting_free(menu_entries_list_settings); if (menu_entries_list_settings) free(menu_entries_list_settings); menu_entries_list_settings = NULL; break; case MENU_ENTRIES_CTL_SETTINGS_INIT: menu_setting_ctl(MENU_SETTING_CTL_NEW, &menu_entries_list_settings); if (!menu_entries_list_settings) return false; break; case MENU_ENTRIES_CTL_SET_REFRESH: { bool *nonblocking = (bool*)data; if (*nonblocking) menu_entries_nonblocking_refresh = true; else menu_entries_need_refresh = true; } break; case MENU_ENTRIES_CTL_UNSET_REFRESH: { bool *nonblocking = (bool*)data; if (*nonblocking) menu_entries_nonblocking_refresh = false; else menu_entries_need_refresh = false; } break; case MENU_ENTRIES_CTL_SET_START: { size_t *idx = (size_t*)data; if (idx) menu_entries_begin = *idx; } case MENU_ENTRIES_CTL_START_GET: { size_t *idx = (size_t*)data; if (!idx) return 0; *idx = menu_entries_begin; } break; case MENU_ENTRIES_CTL_REFRESH: if (!data) return false; return menu_entries_refresh((file_list_t*)data); case MENU_ENTRIES_CTL_CLEAR: { unsigned i; file_list_t *list = (file_list_t*)data; if (!list) return false; menu_driver_list_clear(list); for (i = 0; i < list->size; i++) file_list_free_actiondata(list, i); file_list_clear(list); } break; case MENU_ENTRIES_CTL_INIT: return menu_entries_init(); case MENU_ENTRIES_CTL_SHOW_BACK: /* Returns true if a Back button should be shown * (i.e. we are at least * one level deep in the menu hierarchy). */ if (!menu_entries_list) return false; return (menu_list_get_stack_size(menu_entries_list, 0) > 1); case MENU_ENTRIES_CTL_NONE: default: break; } return true; }