From 06d17852f007864752ad284b59cefd744190fe36 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sat, 17 Oct 2015 19:38:33 +0200 Subject: [PATCH] Merge menu_list.c with menu_entries.c --- Makefile.common | 1 - griffin/griffin.c | 1 - menu/drivers/menu_generic.c | 2 +- menu/drivers/rmenu_xui.cpp | 2 +- menu/menu_driver.h | 1 - menu/menu_entries.c | 350 ++++++++++++++++++++++++++++++++++ menu/menu_entries.h | 32 ++++ menu/menu_list.c | 361 ------------------------------------ menu/menu_list.h | 97 ---------- 9 files changed, 384 insertions(+), 463 deletions(-) delete mode 100644 menu/menu_list.c delete mode 100644 menu/menu_list.h diff --git a/Makefile.common b/Makefile.common index 7b4a236754..2e0d14b455 100644 --- a/Makefile.common +++ b/Makefile.common @@ -432,7 +432,6 @@ ifeq ($(HAVE_MENU_COMMON), 1) menu/cbs/menu_cbs_up.o \ menu/cbs/menu_cbs_down.o \ menu/cbs/menu_cbs_contentlist_switch.o \ - menu/menu_list.o \ menu/menu_display.o \ menu/menu_displaylist.o \ menu/menu_animation.o \ diff --git a/griffin/griffin.c b/griffin/griffin.c index fbecb70ab3..efa39ad0a2 100644 --- a/griffin/griffin.c +++ b/griffin/griffin.c @@ -766,7 +766,6 @@ MENU #include "../menu/menu_entry.c" #include "../menu/menu_entries.c" #include "../menu/menu_setting.c" -#include "../menu/menu_list.c" #include "../menu/menu_cbs.c" #include "../menu/menu_video.c" #include "../menu/cbs/menu_cbs_ok.c" diff --git a/menu/drivers/menu_generic.c b/menu/drivers/menu_generic.c index 4cf2d3201e..987340a573 100644 --- a/menu/drivers/menu_generic.c +++ b/menu/drivers/menu_generic.c @@ -24,7 +24,7 @@ #include "../menu_display.h" #include "../menu_displaylist.h" #include "../menu_hash.h" -#include "../menu_list.h" +#include "../menu_entries.h" #include "../../configuration.h" #include "../../performance.h" diff --git a/menu/drivers/rmenu_xui.cpp b/menu/drivers/rmenu_xui.cpp index 7819eb789b..d0140d0180 100644 --- a/menu/drivers/rmenu_xui.cpp +++ b/menu/drivers/rmenu_xui.cpp @@ -32,7 +32,7 @@ #include "../menu_driver.h" #include "../menu.h" #include "../menu_entry.h" -#include "../menu_list.h" +#include "../menu_entries.h" #include "../menu_input.h" #include "../menu_setting.h" #include "../menu_video.h" diff --git a/menu/menu_driver.h b/menu/menu_driver.h index 9c21ccbc0c..5a028633fc 100644 --- a/menu/menu_driver.h +++ b/menu/menu_driver.h @@ -23,7 +23,6 @@ #include #include "menu_displaylist.h" #include "menu_entries.h" -#include "menu_list.h" #include "menu_input.h" #include "menu_navigation.h" #include "menu_setting.h" diff --git a/menu/menu_entries.c b/menu/menu_entries.c index c95c0ab4d3..14163fbd9a 100644 --- a/menu/menu_entries.c +++ b/menu/menu_entries.c @@ -13,11 +13,21 @@ * If not, see . */ +#include + +#include #include "menu.h" +#include "menu_cbs.h" #include "menu_hash.h" #include "../general.h" +struct menu_list +{ + file_list_t *menu_stack; + file_list_t *selection_buf; +}; + struct menu_entries { /* Flagged when menu entries need to be refreshed */ @@ -29,6 +39,346 @@ struct menu_entries rarch_setting_t *list_settings; }; +static size_t menu_list_get_size(menu_list_t *list) +{ + if (!list) + return 0; + return file_list_get_size(list->selection_buf); +} + +static void menu_list_free_list(file_list_t *list) +{ + unsigned i; + + for (i = 0; i < list->size; i++) + menu_driver_list_free(list, i, list->size); + + if (list) + file_list_free(list); +} + +static void menu_list_free(menu_list_t *menu_list) +{ + if (!menu_list) + return; + + menu_list_free_list(menu_list->menu_stack); + menu_list_free_list(menu_list->selection_buf); + + menu_list->menu_stack = NULL; + menu_list->selection_buf = NULL; + + free(menu_list); +} + +static menu_list_t *menu_list_new(void) +{ + menu_list_t *list = (menu_list_t*)calloc(1, sizeof(*list)); + + if (!list) + return NULL; + + list->menu_stack = (file_list_t*)calloc(1, sizeof(file_list_t)); + list->selection_buf = (file_list_t*)calloc(1, sizeof(file_list_t)); + + if (!list->menu_stack || !list->selection_buf) + goto error; + + return list; + +error: + menu_list_free(list); + return NULL; +} + +static size_t menu_list_get_stack_size(menu_list_t *list) +{ + if (!list) + return 0; + return file_list_get_size(list->menu_stack); +} + +void menu_list_get_at_offset(const file_list_t *list, size_t idx, + const char **path, const char **label, unsigned *file_type, + size_t *entry_idx) +{ + file_list_get_at_offset(list, idx, path, label, file_type, entry_idx); +} + +void menu_list_get_last(const file_list_t *list, + const char **path, const char **label, + unsigned *file_type, size_t *entry_idx) +{ + if (list) + file_list_get_last(list, path, label, file_type, entry_idx); +} + +static void menu_list_get_last_stack(const menu_list_t *list, + const char **path, const char **label, + unsigned *file_type, size_t *entry_idx) +{ + menu_list_get_last(list->menu_stack, path, label, file_type, entry_idx); +} + +void *menu_list_get_userdata_at_offset(const file_list_t *list, size_t idx) +{ + if (!list) + return NULL; + return (menu_file_list_cbs_t*)file_list_get_userdata_at_offset(list, idx); +} + +menu_file_list_cbs_t *menu_list_get_actiondata_at_offset( + const file_list_t *list, size_t idx) +{ + if (!list) + return NULL; + return (menu_file_list_cbs_t*) + file_list_get_actiondata_at_offset(list, idx); +} + +static menu_file_list_cbs_t *menu_list_get_last_stack_actiondata(const menu_list_t *list) +{ + if (!list) + return NULL; + return (menu_file_list_cbs_t*)file_list_get_last_actiondata(list->menu_stack); +} + +static INLINE int menu_list_flush_stack_type( + const char *needle, const char *label, + unsigned type, unsigned final_type) +{ + return needle ? strcmp(needle, label) : (type != final_type); +} + +static void menu_list_pop(file_list_t *list, size_t *directory_ptr) +{ + if (list->size != 0) + menu_driver_list_free(list, list->size - 1, list->size - 1); + + file_list_pop(list, directory_ptr); + + menu_driver_list_set_selection(list); +} + +static bool menu_list_pop_stack(menu_list_t *list, size_t *directory_ptr) +{ + if (!list) + return false; + + if (menu_list_get_stack_size(list) <= 1) + return false; + + menu_driver_list_cache(MENU_LIST_PLAIN, 0); + + menu_list_pop(list->menu_stack, directory_ptr); + menu_entries_set_refresh(false); + + return true; +} + +static void menu_list_flush_stack(menu_list_t *list, + const char *needle, unsigned final_type) +{ + const char *path = NULL; + const char *label = NULL; + unsigned type = 0; + size_t entry_idx = 0; + if (!list) + return; + + menu_entries_set_refresh(false); + menu_list_get_last(list->menu_stack, + &path, &label, &type, &entry_idx); + + while (menu_list_flush_stack_type( + needle, label, type, final_type) != 0) + { + size_t new_selection_ptr; + + menu_navigation_ctl(MENU_NAVIGATION_CTL_GET_SELECTION, &new_selection_ptr); + + if (menu_list_pop_stack(list, &new_selection_ptr)) + { + menu_navigation_ctl(MENU_NAVIGATION_CTL_SET_SELECTION, &new_selection_ptr); + + menu_list_get_last(list->menu_stack, + &path, &label, &type, &entry_idx); + } + } +} + + + + +void menu_list_clear(file_list_t *list) +{ + unsigned i; + const menu_ctx_driver_t *driver = menu_ctx_driver_get_ptr(); + + if (driver->list_clear) + driver->list_clear(list); + + for (i = 0; i < list->size; i++) + file_list_free_actiondata(list, i); + + if (list) + file_list_clear(list); +} + +static void menu_list_push(file_list_t *list, + const char *path, const char *label, + unsigned type, size_t directory_ptr, + size_t entry_idx) +{ + size_t idx; + const menu_ctx_driver_t *driver = menu_ctx_driver_get_ptr(); + menu_file_list_cbs_t *cbs = NULL; + if (!list || !label) + return; + + file_list_push(list, path, label, type, directory_ptr, entry_idx); + + idx = list->size - 1; + + if (driver->list_insert) + driver->list_insert(list, path, label, idx); + + file_list_free_actiondata(list, idx); + cbs = (menu_file_list_cbs_t*) + calloc(1, sizeof(menu_file_list_cbs_t)); + + if (!cbs) + return; + + file_list_set_actiondata(list, idx, cbs); + menu_cbs_init(list, path, label, type, idx); +} + +void menu_list_set_alt_at_offset(file_list_t *list, size_t idx, + const char *alt) +{ + file_list_set_alt_at_offset(list, idx, alt); +} + +void menu_list_get_alt_at_offset(const file_list_t *list, size_t idx, + const char **alt) +{ + file_list_get_alt_at_offset(list, idx, alt); +} + +/** + * menu_list_elem_is_dir: + * @list : File list handle. + * @offset : Offset index of element. + * + * Is the current entry at offset @offset a directory? + * + * Returns: true (1) if entry is a directory, otherwise false (0). + **/ +static bool menu_list_elem_is_dir(file_list_t *list, + unsigned offset) +{ + unsigned type = 0; + + menu_list_get_at_offset(list, offset, NULL, NULL, &type, NULL); + + return type == MENU_FILE_DIRECTORY; +} + +/** + * menu_list_elem_get_first_char: + * @list : File list handle. + * @offset : Offset index of element. + * + * Gets the first character of an element in the + * file list. + * + * Returns: first character of element in file list. + **/ +static int menu_list_elem_get_first_char( + file_list_t *list, unsigned offset) +{ + int ret; + const char *path = NULL; + + menu_list_get_alt_at_offset(list, offset, &path); + ret = tolower((int)*path); + + /* "Normalize" non-alphabetical entries so they + * are lumped together for purposes of jumping. */ + if (ret < 'a') + ret = 'a' - 1; + else if (ret > 'z') + ret = 'z' + 1; + return ret; +} + +static void menu_list_build_scroll_indices(file_list_t *list) +{ + int current; + bool current_is_dir; + size_t i, scroll_value = 0; + + if (!list || !list->size) + return; + + menu_navigation_ctl(MENU_NAVIGATION_CTL_CLEAR_SCROLL_INDICES, NULL); + menu_navigation_ctl(MENU_NAVIGATION_CTL_ADD_SCROLL_INDEX, &scroll_value); + + current = menu_list_elem_get_first_char(list, 0); + current_is_dir = menu_list_elem_is_dir(list, 0); + + for (i = 1; i < list->size; i++) + { + int first = menu_list_elem_get_first_char(list, i); + bool is_dir = menu_list_elem_is_dir(list, i); + + if ((current_is_dir && !is_dir) || (first > current)) + menu_navigation_ctl(MENU_NAVIGATION_CTL_ADD_SCROLL_INDEX, &i); + + current = first; + current_is_dir = is_dir; + } + + + scroll_value = list->size - 1; + menu_navigation_ctl(MENU_NAVIGATION_CTL_ADD_SCROLL_INDEX, &scroll_value); +} + +/** + * Before a refresh, we could have deleted a + * file on disk, causing selection_ptr to + * suddendly be out of range. + * + * Ensure it doesn't overflow. + **/ +void menu_list_refresh(file_list_t *list) +{ + size_t list_size, selection; + menu_list_t *menu_list = menu_list_get_ptr(); + if (!menu_list || !list) + return; + if (!menu_navigation_ctl(MENU_NAVIGATION_CTL_GET_SELECTION, &selection)) + return; + + menu_list_build_scroll_indices(list); + + list_size = menu_list_get_size(menu_list); + + if ((selection >= list_size) && list_size) + { + size_t idx = list_size - 1; + bool scroll = true; + menu_navigation_ctl(MENU_NAVIGATION_CTL_SET_SELECTION, &idx); + menu_navigation_ctl(MENU_NAVIGATION_CTL_SET, &scroll); + } + else if (!list_size) + { + bool pending_push = true; + menu_navigation_ctl(MENU_NAVIGATION_CTL_CLEAR, &pending_push); + } +} + static menu_entries_t *menu_entries_get_ptr(void) { menu_handle_t *menu = menu_driver_get_ptr(); diff --git a/menu/menu_entries.h b/menu/menu_entries.h index 54e808d2a1..640aa206fe 100644 --- a/menu/menu_entries.h +++ b/menu/menu_entries.h @@ -28,6 +28,12 @@ extern "C" { #endif +typedef enum +{ + MENU_LIST_PLAIN = 0, + MENU_LIST_HORIZONTAL +} menu_list_type_t; + typedef struct menu_file_list_cbs { rarch_setting_t *setting; @@ -93,6 +99,8 @@ typedef struct menu_file_list_cbs } menu_file_list_cbs_t; +typedef struct menu_list menu_list_t; + typedef struct menu_entries menu_entries_t; void menu_entries_set_start(size_t i); @@ -145,6 +153,30 @@ size_t menu_entries_get_stack_size(void); size_t menu_entries_get_size(void); +void menu_list_get_at_offset(const file_list_t *list, size_t idx, + const char **path, const char **label, unsigned *file_type, + size_t *entry_idx); + +menu_list_t *menu_list_get_ptr(void); + +void *menu_list_get_userdata_at_offset(const file_list_t *list, size_t idx); + +menu_file_list_cbs_t *menu_list_get_actiondata_at_offset(const file_list_t *list, size_t idx); + +void menu_list_get_last(const file_list_t *list, + const char **path, const char **label, + unsigned *file_type, size_t *entry_idx); + +void menu_list_clear(file_list_t *list); + +void menu_list_get_alt_at_offset(const file_list_t *list, size_t idx, + const char **alt); + +void menu_list_set_alt_at_offset(file_list_t *list, size_t idx, + const char *alt); + +void menu_list_refresh(file_list_t *list); + #ifdef __cplusplus } #endif diff --git a/menu/menu_list.c b/menu/menu_list.c deleted file mode 100644 index 0397be3a95..0000000000 --- a/menu/menu_list.c +++ /dev/null @@ -1,361 +0,0 @@ -/* RetroArch - A frontend for libretro. - * Copyright (C) 2011-2015 - Daniel De Matteis - * Copyright (C) 2014-2015 - Jean-André Santoni - * - * RetroArch is free software: you can redistribute it and/or modify it under the terms - * of the GNU General Public License as published by the Free Software Found- - * ation, either version 3 of the License, or (at your option) any later version. - * - * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with RetroArch. - * If not, see . - */ - -#include - -#include - -#include "menu.h" -#include "menu_cbs.h" -#include "menu_list.h" - -size_t menu_list_get_size(menu_list_t *list) -{ - if (!list) - return 0; - return file_list_get_size(list->selection_buf); -} - -static void menu_list_free_list(file_list_t *list) -{ - unsigned i; - - for (i = 0; i < list->size; i++) - menu_driver_list_free(list, i, list->size); - - if (list) - file_list_free(list); -} - -void menu_list_free(menu_list_t *menu_list) -{ - if (!menu_list) - return; - - menu_list_free_list(menu_list->menu_stack); - menu_list_free_list(menu_list->selection_buf); - - menu_list->menu_stack = NULL; - menu_list->selection_buf = NULL; - - free(menu_list); -} - -menu_list_t *menu_list_new(void) -{ - menu_list_t *list = (menu_list_t*)calloc(1, sizeof(*list)); - - if (!list) - return NULL; - - list->menu_stack = (file_list_t*)calloc(1, sizeof(file_list_t)); - list->selection_buf = (file_list_t*)calloc(1, sizeof(file_list_t)); - - if (!list->menu_stack || !list->selection_buf) - goto error; - - return list; - -error: - menu_list_free(list); - return NULL; -} - -size_t menu_list_get_stack_size(menu_list_t *list) -{ - if (!list) - return 0; - return file_list_get_size(list->menu_stack); -} - -void menu_list_get_at_offset(const file_list_t *list, size_t idx, - const char **path, const char **label, unsigned *file_type, - size_t *entry_idx) -{ - file_list_get_at_offset(list, idx, path, label, file_type, entry_idx); -} - -void menu_list_get_last(const file_list_t *list, - const char **path, const char **label, - unsigned *file_type, size_t *entry_idx) -{ - if (list) - file_list_get_last(list, path, label, file_type, entry_idx); -} - -void menu_list_get_last_stack(const menu_list_t *list, - const char **path, const char **label, - unsigned *file_type, size_t *entry_idx) -{ - menu_list_get_last(list->menu_stack, path, label, file_type, entry_idx); -} - -void *menu_list_get_userdata_at_offset(const file_list_t *list, size_t idx) -{ - if (!list) - return NULL; - return (menu_file_list_cbs_t*)file_list_get_userdata_at_offset(list, idx); -} - -menu_file_list_cbs_t *menu_list_get_actiondata_at_offset( - const file_list_t *list, size_t idx) -{ - if (!list) - return NULL; - return (menu_file_list_cbs_t*) - file_list_get_actiondata_at_offset(list, idx); -} - -menu_file_list_cbs_t *menu_list_get_last_stack_actiondata(const menu_list_t *list) -{ - if (!list) - return NULL; - return (menu_file_list_cbs_t*)file_list_get_last_actiondata(list->menu_stack); -} - -static INLINE int menu_list_flush_stack_type( - const char *needle, const char *label, - unsigned type, unsigned final_type) -{ - return needle ? strcmp(needle, label) : (type != final_type); -} - -static void menu_list_pop(file_list_t *list, size_t *directory_ptr) -{ - if (list->size != 0) - menu_driver_list_free(list, list->size - 1, list->size - 1); - - file_list_pop(list, directory_ptr); - - menu_driver_list_set_selection(list); -} - -void menu_list_flush_stack(menu_list_t *list, - const char *needle, unsigned final_type) -{ - const char *path = NULL; - const char *label = NULL; - unsigned type = 0; - size_t entry_idx = 0; - if (!list) - return; - - menu_entries_set_refresh(false); - menu_list_get_last(list->menu_stack, - &path, &label, &type, &entry_idx); - - while (menu_list_flush_stack_type( - needle, label, type, final_type) != 0) - { - size_t new_selection_ptr; - - menu_navigation_ctl(MENU_NAVIGATION_CTL_GET_SELECTION, &new_selection_ptr); - - if (menu_list_pop_stack(list, &new_selection_ptr)) - { - menu_navigation_ctl(MENU_NAVIGATION_CTL_SET_SELECTION, &new_selection_ptr); - - menu_list_get_last(list->menu_stack, - &path, &label, &type, &entry_idx); - } - } -} - -bool menu_list_pop_stack(menu_list_t *list, size_t *directory_ptr) -{ - if (!list) - return false; - - if (menu_list_get_stack_size(list) <= 1) - return false; - - menu_driver_list_cache(MENU_LIST_PLAIN, 0); - - menu_list_pop(list->menu_stack, directory_ptr); - menu_entries_set_refresh(false); - - return true; -} - - -void menu_list_clear(file_list_t *list) -{ - unsigned i; - const menu_ctx_driver_t *driver = menu_ctx_driver_get_ptr(); - - if (driver->list_clear) - driver->list_clear(list); - - for (i = 0; i < list->size; i++) - file_list_free_actiondata(list, i); - - if (list) - file_list_clear(list); -} - -void menu_list_push(file_list_t *list, - const char *path, const char *label, - unsigned type, size_t directory_ptr, - size_t entry_idx) -{ - size_t idx; - const menu_ctx_driver_t *driver = menu_ctx_driver_get_ptr(); - menu_file_list_cbs_t *cbs = NULL; - if (!list || !label) - return; - - file_list_push(list, path, label, type, directory_ptr, entry_idx); - - idx = list->size - 1; - - if (driver->list_insert) - driver->list_insert(list, path, label, idx); - - file_list_free_actiondata(list, idx); - cbs = (menu_file_list_cbs_t*) - calloc(1, sizeof(menu_file_list_cbs_t)); - - if (!cbs) - return; - - file_list_set_actiondata(list, idx, cbs); - menu_cbs_init(list, path, label, type, idx); -} - -void menu_list_set_alt_at_offset(file_list_t *list, size_t idx, - const char *alt) -{ - file_list_set_alt_at_offset(list, idx, alt); -} - -void menu_list_get_alt_at_offset(const file_list_t *list, size_t idx, - const char **alt) -{ - file_list_get_alt_at_offset(list, idx, alt); -} - -/** - * menu_list_elem_is_dir: - * @list : File list handle. - * @offset : Offset index of element. - * - * Is the current entry at offset @offset a directory? - * - * Returns: true (1) if entry is a directory, otherwise false (0). - **/ -static bool menu_list_elem_is_dir(file_list_t *list, - unsigned offset) -{ - unsigned type = 0; - - menu_list_get_at_offset(list, offset, NULL, NULL, &type, NULL); - - return type == MENU_FILE_DIRECTORY; -} - -/** - * menu_list_elem_get_first_char: - * @list : File list handle. - * @offset : Offset index of element. - * - * Gets the first character of an element in the - * file list. - * - * Returns: first character of element in file list. - **/ -static int menu_list_elem_get_first_char( - file_list_t *list, unsigned offset) -{ - int ret; - const char *path = NULL; - - menu_list_get_alt_at_offset(list, offset, &path); - ret = tolower((int)*path); - - /* "Normalize" non-alphabetical entries so they - * are lumped together for purposes of jumping. */ - if (ret < 'a') - ret = 'a' - 1; - else if (ret > 'z') - ret = 'z' + 1; - return ret; -} - -static void menu_list_build_scroll_indices(file_list_t *list) -{ - int current; - bool current_is_dir; - size_t i, scroll_value = 0; - - if (!list || !list->size) - return; - - menu_navigation_ctl(MENU_NAVIGATION_CTL_CLEAR_SCROLL_INDICES, NULL); - menu_navigation_ctl(MENU_NAVIGATION_CTL_ADD_SCROLL_INDEX, &scroll_value); - - current = menu_list_elem_get_first_char(list, 0); - current_is_dir = menu_list_elem_is_dir(list, 0); - - for (i = 1; i < list->size; i++) - { - int first = menu_list_elem_get_first_char(list, i); - bool is_dir = menu_list_elem_is_dir(list, i); - - if ((current_is_dir && !is_dir) || (first > current)) - menu_navigation_ctl(MENU_NAVIGATION_CTL_ADD_SCROLL_INDEX, &i); - - current = first; - current_is_dir = is_dir; - } - - - scroll_value = list->size - 1; - menu_navigation_ctl(MENU_NAVIGATION_CTL_ADD_SCROLL_INDEX, &scroll_value); -} - -/** - * Before a refresh, we could have deleted a - * file on disk, causing selection_ptr to - * suddendly be out of range. - * - * Ensure it doesn't overflow. - **/ -void menu_list_refresh(file_list_t *list) -{ - size_t list_size, selection; - menu_list_t *menu_list = menu_list_get_ptr(); - if (!menu_list || !list) - return; - if (!menu_navigation_ctl(MENU_NAVIGATION_CTL_GET_SELECTION, &selection)) - return; - - menu_list_build_scroll_indices(list); - - list_size = menu_list_get_size(menu_list); - - if ((selection >= list_size) && list_size) - { - size_t idx = list_size - 1; - bool scroll = true; - menu_navigation_ctl(MENU_NAVIGATION_CTL_SET_SELECTION, &idx); - menu_navigation_ctl(MENU_NAVIGATION_CTL_SET, &scroll); - } - else if (!list_size) - { - bool pending_push = true; - menu_navigation_ctl(MENU_NAVIGATION_CTL_CLEAR, &pending_push); - } -} diff --git a/menu/menu_list.h b/menu/menu_list.h deleted file mode 100644 index d8ef2d4e72..0000000000 --- a/menu/menu_list.h +++ /dev/null @@ -1,97 +0,0 @@ -/* RetroArch - A frontend for libretro. - * Copyright (C) 2011-2015 - Daniel De Matteis - * Copyright (C) 2014-2015 - Jean-André Santoni - * - * RetroArch is free software: you can redistribute it and/or modify it under the terms - * of the GNU General Public License as published by the Free Software Found- - * ation, either version 3 of the License, or (at your option) any later version. - * - * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with RetroArch. - * If not, see . - */ - -#ifndef _MENU_LIST_H -#define _MENU_LIST_H - -#include - -#include -#include - -#include "menu_entries.h" -#include "menu_setting.h" - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct menu_list -{ - file_list_t *menu_stack; - file_list_t *selection_buf; -} menu_list_t; - -typedef enum -{ - MENU_LIST_PLAIN = 0, - MENU_LIST_HORIZONTAL -} menu_list_type_t; - - -menu_list_t *menu_list_get_ptr(void); - -void menu_list_free(menu_list_t *menu_list); - -menu_list_t *menu_list_new(void); - -void menu_list_flush_stack(menu_list_t *list, - const char *needle, unsigned final_type); - -bool menu_list_pop_stack(menu_list_t *list, size_t *directory_ptr); - -void menu_list_get_at_offset(const file_list_t *list, size_t idx, - const char **path, const char **label, unsigned *file_type, - size_t *entry_idx); - -void *menu_list_get_userdata_at_offset(const file_list_t *list, size_t idx); - -menu_file_list_cbs_t *menu_list_get_actiondata_at_offset(const file_list_t *list, size_t idx); - -size_t menu_list_get_stack_size(menu_list_t *list); - -size_t menu_list_get_size(menu_list_t *list); - -menu_file_list_cbs_t *menu_list_get_last_stack_actiondata(const menu_list_t *list); - -void menu_list_get_last(const file_list_t *list, - const char **path, const char **label, - unsigned *file_type, size_t *entry_idx); - -void menu_list_get_last_stack(const menu_list_t *list, - const char **path, const char **label, - unsigned *file_type, size_t *entry_idx); - -void menu_list_clear(file_list_t *list); - -void menu_list_push(file_list_t *list, - const char *path, const char *label, - unsigned type, size_t directory_ptr, - size_t entry_idx); - -void menu_list_get_alt_at_offset(const file_list_t *list, size_t idx, - const char **alt); - -void menu_list_set_alt_at_offset(file_list_t *list, size_t idx, - const char *alt); - -void menu_list_refresh(file_list_t *list); - -#ifdef __cplusplus -} -#endif - -#endif