(Filebrowser) Refactor filebrowser - get rid of second filebrowser

instance in rmenu.c
This commit is contained in:
twinaphex 2013-04-12 12:25:36 +02:00
parent 345a9c77e8
commit f8a040e286
3 changed files with 151 additions and 121 deletions

View File

@ -60,7 +60,6 @@ struct texture_image *menu_panel;
static bool menu_bg_show = true; static bool menu_bg_show = true;
filebrowser_t *browser; filebrowser_t *browser;
filebrowser_t *tmpBrowser;
unsigned currently_selected_controller_menu = 0; unsigned currently_selected_controller_menu = 0;
#ifdef HAVE_SHADER_MANAGER #ifdef HAVE_SHADER_MANAGER
@ -298,12 +297,44 @@ static unsigned stack_idx = 0;
static void menu_stack_pop(void) static void menu_stack_pop(void)
{ {
if (browser->prev_dir.directory_path[0] != '\0')
{
strlcpy(browser->current_dir.directory_path, browser->prev_dir.directory_path,
sizeof(browser->current_dir.directory_path));
strlcpy(browser->current_dir.extensions, browser->prev_dir.extensions,
sizeof(browser->current_dir.extensions));
strlcpy(browser->current_dir.root_dir, browser->prev_dir.root_dir,
sizeof(browser->current_dir.root_dir));
filebrowser_iterate(browser, FILEBROWSER_ACTION_RESET_CURRENT_DIR);
browser->current_dir.ptr = browser->prev_dir.ptr;
strlcpy(browser->current_dir.path, browser->prev_dir.path,
sizeof(browser->current_dir.path));
browser->prev_dir.ptr = 0;
browser->prev_dir.path[0] = '\0';
browser->prev_dir.directory_path[0] = '\0';
browser->prev_dir.extensions[0] = '\0';
browser->prev_dir.root_dir[0] = '\0';
}
if (stack_idx > 1) if (stack_idx > 1)
stack_idx--; stack_idx--;
} }
static void menu_stack_push(unsigned menu_id) static void menu_stack_push(unsigned menu_id, bool prev_dir)
{ {
if (prev_dir)
{
strlcpy(browser->prev_dir.directory_path, browser->current_dir.directory_path,
sizeof(browser->prev_dir.directory_path));
strlcpy(browser->prev_dir.extensions, browser->current_dir.extensions,
sizeof(browser->prev_dir.extensions));
strlcpy(browser->prev_dir.root_dir, browser->current_dir.root_dir,
sizeof(browser->prev_dir.root_dir));
strlcpy(browser->prev_dir.path, browser->current_dir.path,
sizeof(browser->prev_dir.path));
browser->prev_dir.ptr = browser->current_dir.ptr;
}
menu_stack_enum_array[stack_idx] = menu_id; menu_stack_enum_array[stack_idx] = menu_id;
stack_idx++; stack_idx++;
} }
@ -864,8 +895,6 @@ static void display_menubar(uint8_t menu_type)
char msg[128]; char msg[128];
font_params_t font_parms = {0}; font_params_t font_parms = {0};
filebrowser_t *fb = browser;
font_parms.x = POSITION_X; font_parms.x = POSITION_X;
font_parms.y = CURRENT_PATH_Y_POSITION; font_parms.y = CURRENT_PATH_Y_POSITION;
font_parms.scale = CURRENT_PATH_FONT_SIZE; font_parms.scale = CURRENT_PATH_FONT_SIZE;
@ -1006,9 +1035,8 @@ static void display_menubar(uint8_t menu_type)
#endif #endif
case PATH_SRAM_DIR_CHOICE: case PATH_SRAM_DIR_CHOICE:
case PATH_SYSTEM_DIR_CHOICE: case PATH_SYSTEM_DIR_CHOICE:
fb = tmpBrowser;
case FILE_BROWSER_MENU: case FILE_BROWSER_MENU:
snprintf(msg, sizeof(msg), "PATH: %s", fb->directory_path); snprintf(msg, sizeof(msg), "PATH: %s", browser->current_dir.directory_path);
if (driver.video_poke->set_osd_msg) if (driver.video_poke->set_osd_msg)
driver.video_poke->set_osd_msg(driver.video_data, msg, &font_parms); driver.video_poke->set_osd_msg(driver.video_data, msg, &font_parms);
@ -1045,7 +1073,6 @@ static void display_menubar(uint8_t menu_type)
static void browser_update(void *data, uint64_t input, const char *extensions) static void browser_update(void *data, uint64_t input, const char *extensions)
{ {
filebrowser_t *b = (filebrowser_t*)data;
filebrowser_action_t action = FILEBROWSER_ACTION_NOOP; filebrowser_action_t action = FILEBROWSER_ACTION_NOOP;
bool ret = true; bool ret = true;
@ -1064,7 +1091,7 @@ static void browser_update(void *data, uint64_t input, const char *extensions)
else if (input & (1ULL << RMENU_DEVICE_NAV_A)) else if (input & (1ULL << RMENU_DEVICE_NAV_A))
{ {
char tmp_str[256]; char tmp_str[256];
fill_pathname_parent_dir(tmp_str, b->directory_path, sizeof(tmp_str)); fill_pathname_parent_dir(tmp_str, browser->current_dir.directory_path, sizeof(tmp_str));
if (tmp_str[0] != '\0') if (tmp_str[0] != '\0')
action = FILEBROWSER_ACTION_CANCEL; action = FILEBROWSER_ACTION_CANCEL;
@ -1072,12 +1099,13 @@ static void browser_update(void *data, uint64_t input, const char *extensions)
else if (input & (1ULL << RMENU_DEVICE_NAV_START)) else if (input & (1ULL << RMENU_DEVICE_NAV_START))
{ {
action = FILEBROWSER_ACTION_RESET; action = FILEBROWSER_ACTION_RESET;
filebrowser_set_root_and_ext(b, NULL, default_paths.filesystem_root_dir); filebrowser_set_root_and_ext(browser, NULL, default_paths.filesystem_root_dir);
strlcpy(b->extensions, extensions, sizeof(b->extensions)); strlcpy(browser->current_dir.extensions, extensions,
sizeof(browser->current_dir.extensions));
} }
if (action != FILEBROWSER_ACTION_NOOP) if (action != FILEBROWSER_ACTION_NOOP)
ret = filebrowser_iterate(b, action); ret = filebrowser_iterate(browser, action);
if (!ret) if (!ret)
msg_queue_push(g_extern.msg_queue, "ERROR - Failed to open directory.", 1, 180); msg_queue_push(g_extern.msg_queue, "ERROR - Failed to open directory.", 1, 180);
@ -1085,8 +1113,7 @@ static void browser_update(void *data, uint64_t input, const char *extensions)
static void browser_render(void *data) static void browser_render(void *data)
{ {
filebrowser_t *b = (filebrowser_t*)data; unsigned file_count = browser->list->size;
unsigned file_count = b->current_dir.list->size;
unsigned current_index = 0; unsigned current_index = 0;
unsigned page_number = 0; unsigned page_number = 0;
unsigned page_base = 0; unsigned page_base = 0;
@ -1094,7 +1121,7 @@ static void browser_render(void *data)
float y_increment = POSITION_Y_START; float y_increment = POSITION_Y_START;
font_params_t font_parms = {0}; font_params_t font_parms = {0};
current_index = b->current_dir.ptr; current_index = browser->current_dir.ptr;
page_number = current_index / NUM_ENTRY_PER_PAGE; page_number = current_index / NUM_ENTRY_PER_PAGE;
page_base = page_number * NUM_ENTRY_PER_PAGE; page_base = page_number * NUM_ENTRY_PER_PAGE;
@ -1103,13 +1130,12 @@ static void browser_render(void *data)
for (i = page_base; i < file_count && i < page_base + NUM_ENTRY_PER_PAGE; ++i) for (i = page_base; i < file_count && i < page_base + NUM_ENTRY_PER_PAGE; ++i)
{ {
char fname_tmp[128]; char fname_tmp[128];
fill_pathname_base(fname_tmp, b->current_dir.list->elems[i].data, sizeof(fname_tmp)); fill_pathname_base(fname_tmp, browser->list->elems[i].data, sizeof(fname_tmp));
y_increment += POSITION_Y_INCREMENT; y_increment += POSITION_Y_INCREMENT;
#ifdef HAVE_MENU_PANEL #ifdef HAVE_MENU_PANEL
//check if this is the currently selected file //check if this is the currently selected file
const char *current_pathname = b->current_path; if (strcmp(browser->current_dir.path, browser->list->elems[i].data) == 0)
if (strcmp(current_pathname, b->current_dir.list->elems[i].data) == 0)
{ {
menu_panel->x = 0; menu_panel->x = 0;
menu_panel->y = y_increment; menu_panel->y = y_increment;
@ -1120,7 +1146,7 @@ static void browser_render(void *data)
font_parms.x = POSITION_X; font_parms.x = POSITION_X;
font_parms.y = y_increment; font_parms.y = y_increment;
font_parms.color = i == current_index ? RED : b->current_dir.list->elems[i].attr.b ? GREEN : WHITE; font_parms.color = i == current_index ? RED : browser->list->elems[i].attr.b ? GREEN : WHITE;
if (driver.video_poke->set_osd_msg) if (driver.video_poke->set_osd_msg)
driver.video_poke->set_osd_msg(driver.video_data, fname_tmp, &font_parms); driver.video_poke->set_osd_msg(driver.video_data, fname_tmp, &font_parms);
@ -1135,10 +1161,9 @@ static int select_file(uint8_t menu_type, uint64_t input)
char comment[128]; char comment[128];
char path[PATH_MAX]; char path[PATH_MAX];
bool ret = true; bool ret = true;
bool pop_menu_stack = false;
font_params_t font_parms = {0}; font_params_t font_parms = {0};
filebrowser_t *filebrowser = tmpBrowser;
switch(menu_type) switch(menu_type)
{ {
case SHADER_CHOICE: case SHADER_CHOICE:
@ -1163,15 +1188,15 @@ static int select_file(uint8_t menu_type, uint64_t input)
break; break;
} }
browser_update(filebrowser, input, extensions); browser_update(browser, input, extensions);
if (input & (1ULL << RMENU_DEVICE_NAV_B)) if (input & (1ULL << RMENU_DEVICE_NAV_B))
{ {
if (filebrowser_iterate(filebrowser, FILEBROWSER_ACTION_PATH_ISDIR)) if (filebrowser_iterate(browser, FILEBROWSER_ACTION_PATH_ISDIR))
ret = filebrowser_iterate(filebrowser, FILEBROWSER_ACTION_OK); ret = filebrowser_iterate(browser, FILEBROWSER_ACTION_OK);
else else
{ {
strlcpy(path, filebrowser->current_path, sizeof(path)); strlcpy(path, browser->current_dir.path, sizeof(path));
switch(menu_type) switch(menu_type)
{ {
@ -1246,13 +1271,16 @@ static int select_file(uint8_t menu_type, uint64_t input)
break; break;
} }
menu_stack_pop(); pop_menu_stack = true;
} }
if (!ret) if (!ret)
msg_queue_push(g_extern.msg_queue, "INFO - You need to restart RetroArch.", 1, 180); msg_queue_push(g_extern.msg_queue, "INFO - You need to restart RetroArch.", 1, 180);
} }
else if (input & (1ULL << RMENU_DEVICE_NAV_X)) else if (input & (1ULL << RMENU_DEVICE_NAV_X))
pop_menu_stack = true;
if (pop_menu_stack)
menu_stack_pop(); menu_stack_pop();
display_menubar(menu_type); display_menubar(menu_type);
@ -1286,7 +1314,7 @@ static int select_file(uint8_t menu_type, uint64_t input)
if (driver.video_poke->set_osd_msg) if (driver.video_poke->set_osd_msg)
driver.video_poke->set_osd_msg(driver.video_data, comment, &font_parms); driver.video_poke->set_osd_msg(driver.video_data, comment, &font_parms);
browser_render(filebrowser); browser_render(browser);
return 0; return 0;
} }
@ -1299,16 +1327,15 @@ static int select_directory(uint8_t menu_type, uint64_t input)
char msg[256]; char msg[256];
bool ret = true; bool ret = true;
filebrowser_t *filebrowser = tmpBrowser; bool is_dir = filebrowser_iterate(browser, FILEBROWSER_ACTION_PATH_ISDIR);
bool pop_menu_stack = false;
bool is_dir = filebrowser_iterate(filebrowser, FILEBROWSER_ACTION_PATH_ISDIR); browser_update(browser, input, "empty");
browser_update(filebrowser, input, "empty");
if (input & (1ULL << RMENU_DEVICE_NAV_Y)) if (input & (1ULL << RMENU_DEVICE_NAV_Y))
{ {
if (is_dir) if (is_dir)
{ {
strlcpy(path, filebrowser->current_path, sizeof(path)); strlcpy(path, browser->current_dir.path, sizeof(path));
switch(menu_type) switch(menu_type)
{ {
@ -1330,7 +1357,7 @@ static int select_directory(uint8_t menu_type, uint64_t input)
strlcpy(g_settings.system_directory, path, sizeof(g_settings.system_directory)); strlcpy(g_settings.system_directory, path, sizeof(g_settings.system_directory));
break; break;
} }
menu_stack_pop(); pop_menu_stack = true;
} }
} }
else if (input & (1ULL << RMENU_DEVICE_NAV_X)) else if (input & (1ULL << RMENU_DEVICE_NAV_X))
@ -1356,15 +1383,17 @@ static int select_directory(uint8_t menu_type, uint64_t input)
strlcpy(g_settings.system_directory, path, sizeof(g_settings.system_directory)); strlcpy(g_settings.system_directory, path, sizeof(g_settings.system_directory));
break; break;
} }
pop_menu_stack = true;
menu_stack_pop();
} }
else if (input & (1ULL << RMENU_DEVICE_NAV_B)) else if (input & (1ULL << RMENU_DEVICE_NAV_B))
{ {
if (is_dir) if (is_dir)
ret = filebrowser_iterate(filebrowser, FILEBROWSER_ACTION_OK); ret = filebrowser_iterate(browser, FILEBROWSER_ACTION_OK);
} }
if (pop_menu_stack)
menu_stack_pop();
if (!ret) if (!ret)
msg_queue_push(g_extern.msg_queue, "ERROR - Failed to open directory.", 1, 180); msg_queue_push(g_extern.msg_queue, "ERROR - Failed to open directory.", 1, 180);
@ -1417,7 +1446,7 @@ static int select_directory(uint8_t menu_type, uint64_t input)
if (driver.video_poke->set_osd_msg) if (driver.video_poke->set_osd_msg)
driver.video_poke->set_osd_msg(driver.video_data, msg, &font_parms); driver.video_poke->set_osd_msg(driver.video_data, msg, &font_parms);
browser_render(filebrowser); browser_render(browser);
return 0; return 0;
} }
@ -1534,7 +1563,6 @@ static uint8_t selected = 0;
static int set_setting_action(uint8_t menu_type, unsigned switchvalue, uint64_t input) static int set_setting_action(uint8_t menu_type, unsigned switchvalue, uint64_t input)
{ {
DEVICE_CAST device_ptr = (DEVICE_CAST)driver.video_data; DEVICE_CAST device_ptr = (DEVICE_CAST)driver.video_data;
filebrowser_t *filebrowser = tmpBrowser;
switch (switchvalue) switch (switchvalue)
{ {
@ -1595,8 +1623,8 @@ static int set_setting_action(uint8_t menu_type, unsigned switchvalue, uint64_t
case SETTING_EMU_SKIN: case SETTING_EMU_SKIN:
if ((input & (1ULL << RMENU_DEVICE_NAV_LEFT)) || (input & (1ULL << RMENU_DEVICE_NAV_RIGHT)) || (input & (1ULL << RMENU_DEVICE_NAV_B))) if ((input & (1ULL << RMENU_DEVICE_NAV_LEFT)) || (input & (1ULL << RMENU_DEVICE_NAV_RIGHT)) || (input & (1ULL << RMENU_DEVICE_NAV_B)))
{ {
menu_stack_push(BORDER_CHOICE); menu_stack_push(BORDER_CHOICE, true);
filebrowser_set_root_and_ext(filebrowser, EXT_IMAGES, default_paths.border_dir); filebrowser_set_root_and_ext(browser, EXT_IMAGES, default_paths.border_dir);
} }
if (input & (1ULL << RMENU_DEVICE_NAV_START)) if (input & (1ULL << RMENU_DEVICE_NAV_START))
{ {
@ -1883,8 +1911,8 @@ static int set_setting_action(uint8_t menu_type, unsigned switchvalue, uint64_t
case SETTING_RARCH_DEFAULT_EMU: case SETTING_RARCH_DEFAULT_EMU:
if ((input & (1ULL << RMENU_DEVICE_NAV_LEFT)) || (input & (1ULL << RMENU_DEVICE_NAV_RIGHT)) || (input & (1ULL << RMENU_DEVICE_NAV_B))) if ((input & (1ULL << RMENU_DEVICE_NAV_LEFT)) || (input & (1ULL << RMENU_DEVICE_NAV_RIGHT)) || (input & (1ULL << RMENU_DEVICE_NAV_B)))
{ {
menu_stack_push(LIBRETRO_CHOICE); menu_stack_push(LIBRETRO_CHOICE, true);
filebrowser_set_root_and_ext(filebrowser, EXT_EXECUTABLES, default_paths.core_dir); filebrowser_set_root_and_ext(browser, EXT_EXECUTABLES, default_paths.core_dir);
set_libretro_core_as_launch = true; set_libretro_core_as_launch = true;
} }
if (input & (1ULL << RMENU_DEVICE_NAV_START)) if (input & (1ULL << RMENU_DEVICE_NAV_START))
@ -1952,8 +1980,8 @@ static int set_setting_action(uint8_t menu_type, unsigned switchvalue, uint64_t
case SETTING_PATH_DEFAULT_ROM_DIRECTORY: case SETTING_PATH_DEFAULT_ROM_DIRECTORY:
if ((input & (1ULL << RMENU_DEVICE_NAV_LEFT)) || (input & (1ULL << RMENU_DEVICE_NAV_RIGHT)) || (input & (1ULL << RMENU_DEVICE_NAV_B))) if ((input & (1ULL << RMENU_DEVICE_NAV_LEFT)) || (input & (1ULL << RMENU_DEVICE_NAV_RIGHT)) || (input & (1ULL << RMENU_DEVICE_NAV_B)))
{ {
menu_stack_push(PATH_DEFAULT_ROM_DIR_CHOICE); menu_stack_push(PATH_DEFAULT_ROM_DIR_CHOICE, true);
filebrowser_set_root_and_ext(filebrowser, "empty", default_paths.filesystem_root_dir); filebrowser_set_root_and_ext(browser, "empty", default_paths.filesystem_root_dir);
} }
if (input & (1ULL << RMENU_DEVICE_NAV_START)) if (input & (1ULL << RMENU_DEVICE_NAV_START))
@ -1962,8 +1990,8 @@ static int set_setting_action(uint8_t menu_type, unsigned switchvalue, uint64_t
case SETTING_PATH_SAVESTATES_DIRECTORY: case SETTING_PATH_SAVESTATES_DIRECTORY:
if ((input & (1ULL << RMENU_DEVICE_NAV_LEFT)) || (input & (1ULL << RMENU_DEVICE_NAV_RIGHT)) || (input & (1ULL << RMENU_DEVICE_NAV_B))) if ((input & (1ULL << RMENU_DEVICE_NAV_LEFT)) || (input & (1ULL << RMENU_DEVICE_NAV_RIGHT)) || (input & (1ULL << RMENU_DEVICE_NAV_B)))
{ {
menu_stack_push(PATH_SAVESTATES_DIR_CHOICE); menu_stack_push(PATH_SAVESTATES_DIR_CHOICE, true);
filebrowser_set_root_and_ext(filebrowser, "empty", default_paths.filesystem_root_dir); filebrowser_set_root_and_ext(browser, "empty", default_paths.filesystem_root_dir);
} }
if (input & (1ULL << RMENU_DEVICE_NAV_START)) if (input & (1ULL << RMENU_DEVICE_NAV_START))
@ -1973,8 +2001,8 @@ static int set_setting_action(uint8_t menu_type, unsigned switchvalue, uint64_t
case SETTING_PATH_SRAM_DIRECTORY: case SETTING_PATH_SRAM_DIRECTORY:
if ((input & (1ULL << RMENU_DEVICE_NAV_LEFT)) || (input & (1ULL << RMENU_DEVICE_NAV_RIGHT)) || (input & (1ULL << RMENU_DEVICE_NAV_B))) if ((input & (1ULL << RMENU_DEVICE_NAV_LEFT)) || (input & (1ULL << RMENU_DEVICE_NAV_RIGHT)) || (input & (1ULL << RMENU_DEVICE_NAV_B)))
{ {
menu_stack_push(PATH_SRAM_DIR_CHOICE); menu_stack_push(PATH_SRAM_DIR_CHOICE, true);
filebrowser_set_root_and_ext(filebrowser, "empty", default_paths.filesystem_root_dir); filebrowser_set_root_and_ext(browser, "empty", default_paths.filesystem_root_dir);
} }
if (input & (1ULL << RMENU_DEVICE_NAV_START)) if (input & (1ULL << RMENU_DEVICE_NAV_START))
@ -1984,8 +2012,8 @@ static int set_setting_action(uint8_t menu_type, unsigned switchvalue, uint64_t
case SETTING_PATH_CHEATS: case SETTING_PATH_CHEATS:
if ((input & (1ULL << RMENU_DEVICE_NAV_LEFT)) || (input & (1ULL << RMENU_DEVICE_NAV_RIGHT)) || (input & (1ULL << RMENU_DEVICE_NAV_B))) if ((input & (1ULL << RMENU_DEVICE_NAV_LEFT)) || (input & (1ULL << RMENU_DEVICE_NAV_RIGHT)) || (input & (1ULL << RMENU_DEVICE_NAV_B)))
{ {
menu_stack_push(PATH_CHEATS_DIR_CHOICE); menu_stack_push(PATH_CHEATS_DIR_CHOICE, true);
filebrowser_set_root_and_ext(filebrowser, "empty", default_paths.filesystem_root_dir); filebrowser_set_root_and_ext(browser, "empty", default_paths.filesystem_root_dir);
} }
if (input & (1ULL << RMENU_DEVICE_NAV_START)) if (input & (1ULL << RMENU_DEVICE_NAV_START))
@ -1995,8 +2023,8 @@ static int set_setting_action(uint8_t menu_type, unsigned switchvalue, uint64_t
case SETTING_PATH_SYSTEM: case SETTING_PATH_SYSTEM:
if ((input & (1ULL << RMENU_DEVICE_NAV_LEFT)) || (input & (1ULL << RMENU_DEVICE_NAV_RIGHT)) || (input & (1ULL << RMENU_DEVICE_NAV_B))) if ((input & (1ULL << RMENU_DEVICE_NAV_LEFT)) || (input & (1ULL << RMENU_DEVICE_NAV_RIGHT)) || (input & (1ULL << RMENU_DEVICE_NAV_B)))
{ {
menu_stack_push(PATH_SYSTEM_DIR_CHOICE); menu_stack_push(PATH_SYSTEM_DIR_CHOICE, true);
filebrowser_set_root_and_ext(filebrowser, "empty", default_paths.system_dir); filebrowser_set_root_and_ext(browser, "empty", default_paths.system_dir);
} }
if (input & (1ULL << RMENU_DEVICE_NAV_START)) if (input & (1ULL << RMENU_DEVICE_NAV_START))
@ -2039,8 +2067,8 @@ static int set_setting_action(uint8_t menu_type, unsigned switchvalue, uint64_t
case SETTING_CONTROLS_SCHEME: case SETTING_CONTROLS_SCHEME:
if ((input & (1ULL << RMENU_DEVICE_NAV_LEFT)) || (input & (1ULL << RMENU_DEVICE_NAV_RIGHT)) || (input & (1ULL << RMENU_DEVICE_NAV_B)) || (input & (1ULL << RMENU_DEVICE_NAV_START))) if ((input & (1ULL << RMENU_DEVICE_NAV_LEFT)) || (input & (1ULL << RMENU_DEVICE_NAV_RIGHT)) || (input & (1ULL << RMENU_DEVICE_NAV_B)) || (input & (1ULL << RMENU_DEVICE_NAV_START)))
{ {
menu_stack_push(INPUT_PRESET_CHOICE); menu_stack_push(INPUT_PRESET_CHOICE, true);
filebrowser_set_root_and_ext(filebrowser, EXT_INPUT_PRESETS, default_paths.input_presets_dir); filebrowser_set_root_and_ext(browser, EXT_INPUT_PRESETS, default_paths.input_presets_dir);
} }
break; break;
case SETTING_CONTROLS_NUMBER: case SETTING_CONTROLS_NUMBER:
@ -2236,15 +2264,15 @@ static int set_setting_action(uint8_t menu_type, unsigned switchvalue, uint64_t
break; break;
case INGAME_MENU_RESIZE_MODE: case INGAME_MENU_RESIZE_MODE:
if (input & (1ULL << RMENU_DEVICE_NAV_B)) if (input & (1ULL << RMENU_DEVICE_NAV_B))
menu_stack_push(INGAME_MENU_RESIZE); menu_stack_push(INGAME_MENU_RESIZE, false);
break; break;
case INGAME_MENU_CORE_OPTIONS_MODE: case INGAME_MENU_CORE_OPTIONS_MODE:
if (input & (1ULL << RMENU_DEVICE_NAV_B)) if (input & (1ULL << RMENU_DEVICE_NAV_B))
menu_stack_push(INGAME_MENU_CORE_OPTIONS); menu_stack_push(INGAME_MENU_CORE_OPTIONS, false);
break; break;
case INGAME_MENU_SCREENSHOT_MODE: case INGAME_MENU_SCREENSHOT_MODE:
if (input & (1ULL << RMENU_DEVICE_NAV_B)) if (input & (1ULL << RMENU_DEVICE_NAV_B))
menu_stack_push(INGAME_MENU_SCREENSHOT); menu_stack_push(INGAME_MENU_SCREENSHOT, false);
break; break;
case INGAME_MENU_RETURN_TO_GAME: case INGAME_MENU_RETURN_TO_GAME:
if (input & (1ULL << RMENU_DEVICE_NAV_B)) if (input & (1ULL << RMENU_DEVICE_NAV_B))
@ -2275,8 +2303,8 @@ static int set_setting_action(uint8_t menu_type, unsigned switchvalue, uint64_t
case INGAME_MENU_CHANGE_LIBRETRO_CORE: case INGAME_MENU_CHANGE_LIBRETRO_CORE:
if (input & (1ULL << RMENU_DEVICE_NAV_B)) if (input & (1ULL << RMENU_DEVICE_NAV_B))
{ {
menu_stack_push(LIBRETRO_CHOICE); menu_stack_push(LIBRETRO_CHOICE, true);
filebrowser_set_root_and_ext(filebrowser, EXT_EXECUTABLES, default_paths.core_dir); filebrowser_set_root_and_ext(browser, EXT_EXECUTABLES, default_paths.core_dir);
set_libretro_core_as_launch = true; set_libretro_core_as_launch = true;
} }
break; break;
@ -2307,14 +2335,14 @@ static int set_setting_action(uint8_t menu_type, unsigned switchvalue, uint64_t
if (input & (1ULL << RMENU_DEVICE_NAV_B)) if (input & (1ULL << RMENU_DEVICE_NAV_B))
{ {
selected = FIRST_SHADERMAN_SETTING; selected = FIRST_SHADERMAN_SETTING;
menu_stack_push(INGAME_MENU_SHADER_MANAGER); menu_stack_push(INGAME_MENU_SHADER_MANAGER, false);
} }
break; break;
case SHADERMAN_LOAD_CGP: case SHADERMAN_LOAD_CGP:
if ((input & (1ULL << RMENU_DEVICE_NAV_LEFT)) || (input & (1ULL << RMENU_DEVICE_NAV_RIGHT)) || (input & (1ULL << RMENU_DEVICE_NAV_B))) if ((input & (1ULL << RMENU_DEVICE_NAV_LEFT)) || (input & (1ULL << RMENU_DEVICE_NAV_RIGHT)) || (input & (1ULL << RMENU_DEVICE_NAV_B)))
{ {
menu_stack_push(PRESET_CHOICE); menu_stack_push(PRESET_CHOICE, true);
filebrowser_set_root_and_ext(filebrowser, EXT_CGP_PRESETS, g_settings.video.shader_dir); filebrowser_set_root_and_ext(browser, EXT_CGP_PRESETS, g_settings.video.shader_dir);
} }
if (input & (1ULL << RMENU_DEVICE_NAV_START)) if (input & (1ULL << RMENU_DEVICE_NAV_START))
strlcpy(g_extern.file_state.cgp_path, "", sizeof(g_extern.file_state.cgp_path)); strlcpy(g_extern.file_state.cgp_path, "", sizeof(g_extern.file_state.cgp_path));
@ -2357,8 +2385,8 @@ static int set_setting_action(uint8_t menu_type, unsigned switchvalue, uint64_t
(input & (1ULL << RMENU_DEVICE_NAV_LEFT))) (input & (1ULL << RMENU_DEVICE_NAV_LEFT)))
{ {
shader_choice_set_shader_slot = index; shader_choice_set_shader_slot = index;
menu_stack_push(SHADER_CHOICE); menu_stack_push(SHADER_CHOICE, true);
filebrowser_set_root_and_ext(tmpBrowser, EXT_SHADERS, g_settings.video.shader_dir); filebrowser_set_root_and_ext(browser, EXT_SHADERS, g_settings.video.shader_dir);
} }
if (input & (1ULL << RMENU_DEVICE_NAV_START)) if (input & (1ULL << RMENU_DEVICE_NAV_START))
@ -2689,7 +2717,7 @@ static int select_setting(uint8_t menu_type, uint64_t input)
if (menu_type == PATH_MENU) if (menu_type == PATH_MENU)
selected = FIRST_CONTROLS_SETTING_PAGE_1; selected = FIRST_CONTROLS_SETTING_PAGE_1;
menu_stack_push(menu_type + 1); menu_stack_push(menu_type + 1, false);
page_number = 0; page_number = 0;
break; break;
case CONTROLS_MENU: case CONTROLS_MENU:
@ -2749,7 +2777,6 @@ static int select_rom(uint8_t menu_type, uint64_t input)
{ {
font_params_t font_parms = {0}; font_params_t font_parms = {0};
char msg[128]; char msg[128];
filebrowser_t *filebrowser = browser;
struct platform_bind key_label_b = {0}; struct platform_bind key_label_b = {0};
struct platform_bind key_label_l3 = {0}; struct platform_bind key_label_l3 = {0};
@ -2773,22 +2800,22 @@ static int select_rom(uint8_t menu_type, uint64_t input)
driver.input->set_keybinds(&key_label_b, 0, 0, 0, (1ULL << KEYBINDS_ACTION_GET_BIND_LABEL)); driver.input->set_keybinds(&key_label_b, 0, 0, 0, (1ULL << KEYBINDS_ACTION_GET_BIND_LABEL));
} }
browser_update(filebrowser, input, g_extern.system.valid_extensions); browser_update(browser, input, g_extern.system.valid_extensions);
if (input & (1ULL << RMENU_DEVICE_NAV_SELECT)) if (input & (1ULL << RMENU_DEVICE_NAV_SELECT))
menu_stack_push(GENERAL_VIDEO_MENU); menu_stack_push(GENERAL_VIDEO_MENU, false);
else if (input & (1ULL << RMENU_DEVICE_NAV_B)) else if (input & (1ULL << RMENU_DEVICE_NAV_B))
{ {
if (filebrowser_iterate(filebrowser, FILEBROWSER_ACTION_PATH_ISDIR)) if (filebrowser_iterate(browser, FILEBROWSER_ACTION_PATH_ISDIR))
{ {
bool ret = filebrowser_iterate(filebrowser, FILEBROWSER_ACTION_OK); bool ret = filebrowser_iterate(browser, FILEBROWSER_ACTION_OK);
if (!ret) if (!ret)
msg_queue_push(g_extern.msg_queue, "ERROR - Failed to open directory.", 1, 180); msg_queue_push(g_extern.msg_queue, "ERROR - Failed to open directory.", 1, 180);
} }
else else
{ {
strlcpy(g_extern.fullpath, filebrowser->current_path, sizeof(g_extern.fullpath)); strlcpy(g_extern.fullpath, browser->current_dir.path, sizeof(g_extern.fullpath));
g_extern.lifecycle_mode_state |= (1ULL << MODE_LOAD_GAME); g_extern.lifecycle_mode_state |= (1ULL << MODE_LOAD_GAME);
} }
} }
@ -2797,8 +2824,8 @@ static int select_rom(uint8_t menu_type, uint64_t input)
const char * drive_map = menu_drive_mapping_previous(); const char * drive_map = menu_drive_mapping_previous();
if (drive_map != NULL) if (drive_map != NULL)
{ {
filebrowser_set_root_and_ext(filebrowser, g_extern.system.valid_extensions, drive_map); filebrowser_set_root_and_ext(browser, g_extern.system.valid_extensions, drive_map);
browser_update(filebrowser, 1ULL << RMENU_DEVICE_NAV_B, g_extern.system.valid_extensions); browser_update(browser, 1ULL << RMENU_DEVICE_NAV_B, g_extern.system.valid_extensions);
} }
} }
else if (input & (1ULL << RMENU_DEVICE_NAV_R1)) else if (input & (1ULL << RMENU_DEVICE_NAV_R1))
@ -2806,12 +2833,12 @@ static int select_rom(uint8_t menu_type, uint64_t input)
const char * drive_map = menu_drive_mapping_next(); const char * drive_map = menu_drive_mapping_next();
if (drive_map != NULL) if (drive_map != NULL)
{ {
filebrowser_set_root_and_ext(filebrowser, g_extern.system.valid_extensions, drive_map); filebrowser_set_root_and_ext(browser, g_extern.system.valid_extensions, drive_map);
browser_update(filebrowser, 1ULL << RMENU_DEVICE_NAV_B, g_extern.system.valid_extensions); browser_update(browser, 1ULL << RMENU_DEVICE_NAV_B, g_extern.system.valid_extensions);
} }
} }
if (filebrowser_iterate(filebrowser, FILEBROWSER_ACTION_PATH_ISDIR)) if (filebrowser_iterate(browser, FILEBROWSER_ACTION_PATH_ISDIR))
snprintf(msg, sizeof(msg), "INFO - Press [%s] to enter the directory.", key_label_b.desc); snprintf(msg, sizeof(msg), "INFO - Press [%s] to enter the directory.", key_label_b.desc);
else else
snprintf(msg, sizeof(msg), "INFO - Press [%s] to load the game.", key_label_b.desc); snprintf(msg, sizeof(msg), "INFO - Press [%s] to load the game.", key_label_b.desc);
@ -2841,7 +2868,7 @@ static int select_rom(uint8_t menu_type, uint64_t input)
if (driver.video_poke->set_osd_msg) if (driver.video_poke->set_osd_msg)
driver.video_poke->set_osd_msg(driver.video_data, msg, &font_parms); driver.video_poke->set_osd_msg(driver.video_data, msg, &font_parms);
browser_render(filebrowser); browser_render(browser);
return 0; return 0;
} }
@ -3375,22 +3402,15 @@ static int menu_input_process(uint8_t menu_type, uint64_t old_state)
void menu_init(void) void menu_init(void)
{ {
browser = (filebrowser_t*)calloc(1, sizeof(*browser)); browser = (filebrowser_t*)calloc(1, sizeof(*browser));
tmpBrowser = (filebrowser_t*)calloc(1, sizeof(*tmpBrowser));
strlcpy(browser->extensions, g_extern.system.valid_extensions, strlcpy(browser->current_dir.extensions, g_extern.system.valid_extensions,
sizeof(browser->extensions)); sizeof(browser->current_dir.extensions));
strlcpy(browser->root_dir, g_extern.console.main_wrap.default_rom_startup_dir, strlcpy(browser->current_dir.root_dir, g_extern.console.main_wrap.default_rom_startup_dir,
sizeof(browser->root_dir)); sizeof(browser->current_dir.root_dir));
strlcpy(tmpBrowser->extensions, "",
sizeof(tmpBrowser->extensions));
strlcpy(tmpBrowser->root_dir, default_paths.filesystem_root_dir,
sizeof(tmpBrowser->root_dir));
filebrowser_iterate(browser, FILEBROWSER_ACTION_RESET); filebrowser_iterate(browser, FILEBROWSER_ACTION_RESET);
filebrowser_iterate(tmpBrowser, FILEBROWSER_ACTION_RESET);
menu_stack_push(FILE_BROWSER_MENU); menu_stack_push(FILE_BROWSER_MENU, false);
rmenu_gfx_init(); rmenu_gfx_init();
} }
@ -3401,7 +3421,6 @@ void menu_free(void)
rmenu_gfx_free(); rmenu_gfx_free();
filebrowser_free(browser); filebrowser_free(browser);
filebrowser_free(tmpBrowser);
} }
bool menu_iterate(void) bool menu_iterate(void)
@ -3416,7 +3435,7 @@ bool menu_iterate(void)
if (g_extern.lifecycle_mode_state & (1ULL << MODE_MENU_INGAME)) if (g_extern.lifecycle_mode_state & (1ULL << MODE_MENU_INGAME))
{ {
selected = FIRST_INGAME_MENU_SETTING; selected = FIRST_INGAME_MENU_SETTING;
menu_stack_push(INGAME_MENU); menu_stack_push(INGAME_MENU, false);
} }
#ifndef __CELLOS_LV2__ #ifndef __CELLOS_LV2__

View File

@ -23,19 +23,21 @@ static bool directory_parse(void *data, const char *path)
{ {
filebrowser_t *filebrowser = (filebrowser_t*)data; filebrowser_t *filebrowser = (filebrowser_t*)data;
struct string_list *list = dir_list_new(path, filebrowser->extensions, true); struct string_list *list = dir_list_new(path,
filebrowser->current_dir.extensions, true);
if(!list) if(!list)
return false; return false;
dir_list_sort(list, true); dir_list_sort(list, true);
filebrowser->current_dir.ptr = 0; filebrowser->current_dir.ptr = 0;
strlcpy(filebrowser->directory_path, path, sizeof(filebrowser->directory_path)); strlcpy(filebrowser->current_dir.directory_path,
path, sizeof(filebrowser->current_dir.directory_path));
if(filebrowser->current_dir.list) if(filebrowser->list)
dir_list_free(filebrowser->current_dir.list); dir_list_free(filebrowser->list);
filebrowser->current_dir.list = list; filebrowser->list = list;
return true; return true;
@ -45,8 +47,8 @@ void filebrowser_free(void *data)
{ {
filebrowser_t *filebrowser = (filebrowser_t*)data; filebrowser_t *filebrowser = (filebrowser_t*)data;
dir_list_free(filebrowser->current_dir.list); dir_list_free(filebrowser->list);
filebrowser->current_dir.list = NULL; filebrowser->list = NULL;
filebrowser->current_dir.ptr = 0; filebrowser->current_dir.ptr = 0;
free(filebrowser); free(filebrowser);
} }
@ -56,17 +58,15 @@ void filebrowser_set_root_and_ext(void *data, const char *ext, const char *root_
filebrowser_t *filebrowser = (filebrowser_t*)data; filebrowser_t *filebrowser = (filebrowser_t*)data;
if (ext) if (ext)
strlcpy(filebrowser->extensions, ext, sizeof(filebrowser->extensions)); strlcpy(filebrowser->current_dir.extensions, ext,
sizeof(filebrowser->current_dir.extensions));
strlcpy(filebrowser->root_dir, root_dir, sizeof(filebrowser->root_dir)); strlcpy(filebrowser->current_dir.root_dir,
root_dir, sizeof(filebrowser->current_dir.root_dir));
filebrowser_iterate(filebrowser, FILEBROWSER_ACTION_RESET); filebrowser_iterate(filebrowser, FILEBROWSER_ACTION_RESET);
} }
static inline const char *filebrowser_get_current_path (void *data) #define GET_CURRENT_PATH(browser) (browser->list->elems[browser->current_dir.ptr].data)
{
filebrowser_t *filebrowser = (filebrowser_t*)data;
return filebrowser->current_dir.list->elems[filebrowser->current_dir.ptr].data;
}
bool filebrowser_iterate(void *data, unsigned action) bool filebrowser_iterate(void *data, unsigned action)
{ {
@ -78,12 +78,12 @@ bool filebrowser_iterate(void *data, unsigned action)
{ {
case FILEBROWSER_ACTION_UP: case FILEBROWSER_ACTION_UP:
filebrowser->current_dir.ptr--; filebrowser->current_dir.ptr--;
if (filebrowser->current_dir.ptr >= filebrowser->current_dir.list->size) if (filebrowser->current_dir.ptr >= filebrowser->list->size)
filebrowser->current_dir.ptr = filebrowser->current_dir.list->size - 1; filebrowser->current_dir.ptr = filebrowser->list->size - 1;
break; break;
case FILEBROWSER_ACTION_DOWN: case FILEBROWSER_ACTION_DOWN:
filebrowser->current_dir.ptr++; filebrowser->current_dir.ptr++;
if (filebrowser->current_dir.ptr >= filebrowser->current_dir.list->size) if (filebrowser->current_dir.ptr >= filebrowser->list->size)
filebrowser->current_dir.ptr = 0; filebrowser->current_dir.ptr = 0;
break; break;
case FILEBROWSER_ACTION_LEFT: case FILEBROWSER_ACTION_LEFT:
@ -94,7 +94,7 @@ bool filebrowser_iterate(void *data, unsigned action)
break; break;
case FILEBROWSER_ACTION_RIGHT: case FILEBROWSER_ACTION_RIGHT:
filebrowser->current_dir.ptr = (min(filebrowser->current_dir.ptr + 5, filebrowser->current_dir.ptr = (min(filebrowser->current_dir.ptr + 5,
filebrowser->current_dir.list->size-1)); filebrowser->list->size-1));
break; break;
case FILEBROWSER_ACTION_SCROLL_UP: case FILEBROWSER_ACTION_SCROLL_UP:
if (filebrowser->current_dir.ptr <= entries_to_scroll) if (filebrowser->current_dir.ptr <= entries_to_scroll)
@ -104,28 +104,34 @@ bool filebrowser_iterate(void *data, unsigned action)
break; break;
case FILEBROWSER_ACTION_SCROLL_DOWN: case FILEBROWSER_ACTION_SCROLL_DOWN:
filebrowser->current_dir.ptr = (min(filebrowser->current_dir.ptr + filebrowser->current_dir.ptr = (min(filebrowser->current_dir.ptr +
entries_to_scroll, filebrowser->current_dir.list->size-1)); entries_to_scroll, filebrowser->list->size-1));
break; break;
case FILEBROWSER_ACTION_OK: case FILEBROWSER_ACTION_OK:
ret = directory_parse(filebrowser, filebrowser_get_current_path(filebrowser)); ret = directory_parse(filebrowser, GET_CURRENT_PATH(filebrowser));
break; break;
case FILEBROWSER_ACTION_CANCEL: case FILEBROWSER_ACTION_CANCEL:
fill_pathname_parent_dir(filebrowser->directory_path, filebrowser->directory_path, sizeof(filebrowser->directory_path)); fill_pathname_parent_dir(filebrowser->current_dir.directory_path,
filebrowser->current_dir.directory_path,
sizeof(filebrowser->current_dir.directory_path));
ret = directory_parse(filebrowser, filebrowser->directory_path); ret = directory_parse(filebrowser, filebrowser->current_dir.directory_path);
break; break;
case FILEBROWSER_ACTION_RESET: case FILEBROWSER_ACTION_RESET:
ret = directory_parse(filebrowser, filebrowser->root_dir); ret = directory_parse(filebrowser, filebrowser->current_dir.root_dir);
break;
case FILEBROWSER_ACTION_RESET_CURRENT_DIR:
ret = directory_parse(filebrowser, filebrowser->current_dir.directory_path);
break; break;
case FILEBROWSER_ACTION_PATH_ISDIR: case FILEBROWSER_ACTION_PATH_ISDIR:
ret = filebrowser->current_dir.list->elems[filebrowser->current_dir.ptr].attr.b; ret = filebrowser->list->elems[filebrowser->current_dir.ptr].attr.b;
break; break;
case FILEBROWSER_ACTION_NOOP: case FILEBROWSER_ACTION_NOOP:
default: default:
break; break;
} }
strlcpy(filebrowser->current_path, filebrowser_get_current_path(filebrowser), sizeof(filebrowser->current_path)); strlcpy(filebrowser->current_dir.path, GET_CURRENT_PATH(filebrowser),
sizeof(filebrowser->current_dir.path));
return ret; return ret;
} }

View File

@ -21,14 +21,18 @@
typedef struct typedef struct
{ {
char directory_path[PATH_MAX];
struct {
struct string_list *list;
size_t ptr; size_t ptr;
} current_dir; char directory_path[PATH_MAX];
char current_path[PATH_MAX];
char root_dir[PATH_MAX];
char extensions[PATH_MAX]; char extensions[PATH_MAX];
char root_dir[PATH_MAX];
char path[PATH_MAX];
} filebrowser_dir_type_t;
typedef struct
{
struct string_list *list;
filebrowser_dir_type_t current_dir;
filebrowser_dir_type_t prev_dir;
} filebrowser_t; } filebrowser_t;
typedef enum typedef enum
@ -42,6 +46,7 @@ typedef enum
FILEBROWSER_ACTION_SCROLL_UP, FILEBROWSER_ACTION_SCROLL_UP,
FILEBROWSER_ACTION_SCROLL_DOWN, FILEBROWSER_ACTION_SCROLL_DOWN,
FILEBROWSER_ACTION_RESET, FILEBROWSER_ACTION_RESET,
FILEBROWSER_ACTION_RESET_CURRENT_DIR,
FILEBROWSER_ACTION_PATH_ISDIR, FILEBROWSER_ACTION_PATH_ISDIR,
FILEBROWSER_ACTION_NOOP FILEBROWSER_ACTION_NOOP
} filebrowser_action_t; } filebrowser_action_t;