diff --git a/frontend/menu/rmenu.c b/frontend/menu/rmenu.c index 3a27b4e9ff..618ebac3c3 100644 --- a/frontend/menu/rmenu.c +++ b/frontend/menu/rmenu.c @@ -774,7 +774,7 @@ static void browser_update(void *data, uint64_t input, const char *extensions) else if (input & (1ULL << RMENU_DEVICE_NAV_START)) { action = FILEBROWSER_ACTION_RESET; - filebrowser_set_root(b, default_paths.filesystem_root_dir); + filebrowser_set_root_and_ext(b, NULL, default_paths.filesystem_root_dir); strlcpy(b->extensions, extensions, sizeof(b->extensions)); } @@ -870,8 +870,7 @@ int select_file(void *data, void *state) if (input & (1ULL << RMENU_DEVICE_NAV_B)) { - bool is_dir = filebrowser_get_current_path_isdir(filebrowser); - if(is_dir) + if (filebrowser_iterate(filebrowser, FILEBROWSER_ACTION_PATH_ISDIR)) ret = filebrowser_iterate(filebrowser, FILEBROWSER_ACTION_OK); else { @@ -1004,7 +1003,7 @@ int select_directory(void *data, void *state) menu_set_default_pos(&default_pos); - bool is_dir = filebrowser_get_current_path_isdir(filebrowser); + bool is_dir = filebrowser_iterate(filebrowser, FILEBROWSER_ACTION_PATH_ISDIR); browser_update(filebrowser, input, "empty"); if (input & (1ULL << RMENU_DEVICE_NAV_Y)) @@ -2215,7 +2214,7 @@ int select_rom(void *data, void *state) menu_stack_push(GENERAL_VIDEO_MENU); else if (input & (1ULL << RMENU_DEVICE_NAV_B)) { - if(filebrowser_get_current_path_isdir(filebrowser)) + if (filebrowser_iterate(filebrowser, FILEBROWSER_ACTION_PATH_ISDIR)) { bool ret = filebrowser_iterate(filebrowser, FILEBROWSER_ACTION_OK); @@ -2247,9 +2246,7 @@ int select_rom(void *data, void *state) } } - bool is_dir = filebrowser_get_current_path_isdir(filebrowser); - - if (is_dir) + if (filebrowser_iterate(filebrowser, FILEBROWSER_ACTION_PATH_ISDIR)) { const char *current_path = filebrowser_get_current_path(filebrowser); snprintf(msg, sizeof(msg), "INFO - Press [%s] to enter the directory.", rarch_input_find_platform_key_label(1ULL << RETRO_DEVICE_ID_JOYPAD_B)); @@ -3067,12 +3064,12 @@ void init_filebrowser(void *data) { (void)data; - browser = filebrowser_init(g_extern.console.main_wrap.default_rom_startup_dir, g_extern.system.valid_extensions); - tmpBrowser = filebrowser_init(default_paths.filesystem_root_dir, ""); + browser = (filebrowser_t*)filebrowser_init(g_extern.console.main_wrap.default_rom_startup_dir, g_extern.system.valid_extensions); + tmpBrowser = (filebrowser_t*)filebrowser_init(default_paths.filesystem_root_dir, ""); menu_stack_push(FILE_BROWSER_MENU); filebrowser_set_root_and_ext(browser, g_extern.system.valid_extensions, g_extern.console.main_wrap.default_rom_startup_dir); - filebrowser_set_root(tmpBrowser, default_paths.filesystem_root_dir); + filebrowser_set_root_and_ext(tmpBrowser, NULL, default_paths.filesystem_root_dir); } void free_filebrowser(void *data) diff --git a/frontend/menu/utils/file_browser.c b/frontend/menu/utils/file_browser.c index ec0a54b7f3..b1870f171b 100644 --- a/frontend/menu/utils/file_browser.c +++ b/frontend/menu/utils/file_browser.c @@ -46,34 +46,13 @@ const char *path, const char * extensions) return false; } -filebrowser_t *filebrowser_init(const char *start_dir, const char *extensions) +void *filebrowser_init(const char *start_dir, const char *extensions) { filebrowser_t *filebrowser = (filebrowser_t*)calloc(1, sizeof(*filebrowser)); directory_parse(filebrowser, 0, start_dir, extensions); return filebrowser; } -static bool filebrowser_reset(void *data, const char *start_dir, const char *extensions) -{ - filebrowser_t *filebrowser = (filebrowser_t*)data; - bool ret = directory_parse(filebrowser, 0, start_dir, extensions); - return ret; -} - -void filebrowser_set_root(void *data, const char *root_dir) -{ - filebrowser_t *filebrowser = (filebrowser_t*)data; - strlcpy(filebrowser->root_dir, root_dir, sizeof(filebrowser->root_dir)); -} - -void filebrowser_set_root_and_ext(void *data, const char *ext, const char *root_dir) -{ - filebrowser_t *browser = (filebrowser_t*)data; - strlcpy(browser->extensions, ext, sizeof(browser->extensions)); - filebrowser_set_root(browser, root_dir); - filebrowser_iterate(browser, FILEBROWSER_ACTION_RESET); -} - void filebrowser_free(void *data) { filebrowser_t *filebrowser = (filebrowser_t*)data; @@ -84,24 +63,18 @@ void filebrowser_free(void *data) free(filebrowser); } -static bool filebrowser_push_directory(void *data, const char * path, -bool with_extension) +void filebrowser_set_root_and_ext(void *data, const char *ext, const char *root_dir) { filebrowser_t *filebrowser = (filebrowser_t*)data; - bool ret = true; - char extensions[256]; - unsigned push_dir = filebrowser->directory_stack_size + 1; + + if (ext) + strlcpy(filebrowser->extensions, ext, sizeof(filebrowser->extensions)); - if(with_extension) - snprintf(extensions, sizeof(extensions), filebrowser->extensions); - else - snprintf(extensions, sizeof(extensions), "empty"); - - ret = directory_parse(filebrowser, push_dir, path, extensions); - - return ret; + strlcpy(filebrowser->root_dir, root_dir, sizeof(filebrowser->root_dir)); + filebrowser_iterate(filebrowser, FILEBROWSER_ACTION_RESET); } + static bool filebrowser_pop_directory (void *data) { filebrowser_t *filebrowser = (filebrowser_t*)data; @@ -142,40 +115,6 @@ const char *filebrowser_get_current_path (void *data) return filebrowser->current_dir.list->elems[filebrowser->current_dir.ptr].data; } -bool filebrowser_get_current_path_isdir (void *data) -{ - filebrowser_t *filebrowser = (filebrowser_t*)data; - return filebrowser->current_dir.list->elems[filebrowser->current_dir.ptr].attr.b; -} - -size_t filebrowser_get_current_index (void *data) -{ - filebrowser_t *filebrowser = (filebrowser_t*)data; - return filebrowser->current_dir.ptr; -} - -void filebrowser_set_current_at (void *data, size_t pos) -{ - filebrowser_t *filebrowser = (filebrowser_t*)data; - filebrowser->current_dir.ptr = pos; -} - -static void filebrowser_set_current_increment (void *data) -{ - filebrowser_t *filebrowser = (filebrowser_t*)data; - filebrowser->current_dir.ptr++; - if (filebrowser->current_dir.ptr >= filebrowser->current_dir.list->size) - filebrowser->current_dir.ptr = 0; -} - -static void filebrowser_set_current_decrement (void *data) -{ - filebrowser_t *filebrowser = (filebrowser_t*)data; - filebrowser->current_dir.ptr--; - if (filebrowser->current_dir.ptr >= filebrowser->current_dir.list->size) - filebrowser->current_dir.ptr = filebrowser->current_dir.list->size - 1; -} - bool filebrowser_iterate(void *data, unsigned action) { filebrowser_t *filebrowser = (filebrowser_t*)data; @@ -185,10 +124,14 @@ bool filebrowser_iterate(void *data, unsigned action) switch(action) { case FILEBROWSER_ACTION_UP: - filebrowser_set_current_decrement(filebrowser); + filebrowser->current_dir.ptr--; + if (filebrowser->current_dir.ptr >= filebrowser->current_dir.list->size) + filebrowser->current_dir.ptr = filebrowser->current_dir.list->size - 1; break; case FILEBROWSER_ACTION_DOWN: - filebrowser_set_current_increment(filebrowser); + filebrowser->current_dir.ptr++; + if (filebrowser->current_dir.ptr >= filebrowser->current_dir.list->size) + filebrowser->current_dir.ptr = 0; break; case FILEBROWSER_ACTION_LEFT: if (filebrowser->current_dir.ptr <= 5) @@ -211,13 +154,17 @@ bool filebrowser_iterate(void *data, unsigned action) entries_to_scroll, filebrowser->current_dir.list->size-1)); break; case FILEBROWSER_ACTION_OK: - ret = filebrowser_push_directory(filebrowser, filebrowser_get_current_path(filebrowser), true); + ret = directory_parse(filebrowser, filebrowser->directory_stack_size + 1, + filebrowser_get_current_path(filebrowser), filebrowser->extensions); break; case FILEBROWSER_ACTION_CANCEL: ret = filebrowser_pop_directory(filebrowser); break; case FILEBROWSER_ACTION_RESET: - ret = filebrowser_reset(filebrowser, filebrowser->root_dir, filebrowser->extensions); + ret = directory_parse(filebrowser, 0, filebrowser->root_dir, filebrowser->extensions); + break; + case FILEBROWSER_ACTION_PATH_ISDIR: + ret = filebrowser->current_dir.list->elems[filebrowser->current_dir.ptr].attr.b; break; case FILEBROWSER_ACTION_NOOP: default: diff --git a/frontend/menu/utils/file_browser.h b/frontend/menu/utils/file_browser.h index 0e9644d0d5..40786cce4a 100644 --- a/frontend/menu/utils/file_browser.h +++ b/frontend/menu/utils/file_browser.h @@ -42,19 +42,16 @@ typedef enum FILEBROWSER_ACTION_SCROLL_UP, FILEBROWSER_ACTION_SCROLL_DOWN, FILEBROWSER_ACTION_RESET, + FILEBROWSER_ACTION_PATH_ISDIR, FILEBROWSER_ACTION_NOOP } filebrowser_action_t; const char * filebrowser_get_current_dir (void *data); const char * filebrowser_get_current_path (void *data); -bool filebrowser_get_current_path_isdir (void *data); -size_t filebrowser_get_current_index (void *data); -void filebrowser_set_root(void *data, const char *root_dir); void filebrowser_set_root_and_ext(void *data, const char *ext, const char *root_dir); void filebrowser_free(void *data); -void filebrowser_set_current_at (void *dat, size_t pos); bool filebrowser_iterate(void *data, unsigned action); -filebrowser_t *filebrowser_init(const char *start_dir, const char *extensions); +void *filebrowser_init(const char *start_dir, const char *extensions); #endif /* FILEBROWSER_H_ */