mirror of
https://github.com/libretro/RetroArch
synced 2025-02-20 15:40:44 +00:00
(Filebrowser) Refactor filebrowser - get rid of second filebrowser
instance in rmenu.c
This commit is contained in:
parent
345a9c77e8
commit
f8a040e286
@ -60,7 +60,6 @@ struct texture_image *menu_panel;
|
||||
|
||||
static bool menu_bg_show = true;
|
||||
filebrowser_t *browser;
|
||||
filebrowser_t *tmpBrowser;
|
||||
unsigned currently_selected_controller_menu = 0;
|
||||
|
||||
#ifdef HAVE_SHADER_MANAGER
|
||||
@ -298,12 +297,44 @@ static unsigned stack_idx = 0;
|
||||
|
||||
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)
|
||||
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;
|
||||
stack_idx++;
|
||||
}
|
||||
@ -864,8 +895,6 @@ static void display_menubar(uint8_t menu_type)
|
||||
char msg[128];
|
||||
font_params_t font_parms = {0};
|
||||
|
||||
filebrowser_t *fb = browser;
|
||||
|
||||
font_parms.x = POSITION_X;
|
||||
font_parms.y = CURRENT_PATH_Y_POSITION;
|
||||
font_parms.scale = CURRENT_PATH_FONT_SIZE;
|
||||
@ -1006,9 +1035,8 @@ static void display_menubar(uint8_t menu_type)
|
||||
#endif
|
||||
case PATH_SRAM_DIR_CHOICE:
|
||||
case PATH_SYSTEM_DIR_CHOICE:
|
||||
fb = tmpBrowser;
|
||||
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)
|
||||
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)
|
||||
{
|
||||
filebrowser_t *b = (filebrowser_t*)data;
|
||||
filebrowser_action_t action = FILEBROWSER_ACTION_NOOP;
|
||||
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))
|
||||
{
|
||||
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')
|
||||
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))
|
||||
{
|
||||
action = FILEBROWSER_ACTION_RESET;
|
||||
filebrowser_set_root_and_ext(b, NULL, default_paths.filesystem_root_dir);
|
||||
strlcpy(b->extensions, extensions, sizeof(b->extensions));
|
||||
filebrowser_set_root_and_ext(browser, NULL, default_paths.filesystem_root_dir);
|
||||
strlcpy(browser->current_dir.extensions, extensions,
|
||||
sizeof(browser->current_dir.extensions));
|
||||
}
|
||||
|
||||
if (action != FILEBROWSER_ACTION_NOOP)
|
||||
ret = filebrowser_iterate(b, action);
|
||||
ret = filebrowser_iterate(browser, action);
|
||||
|
||||
if (!ret)
|
||||
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)
|
||||
{
|
||||
filebrowser_t *b = (filebrowser_t*)data;
|
||||
unsigned file_count = b->current_dir.list->size;
|
||||
unsigned file_count = browser->list->size;
|
||||
unsigned current_index = 0;
|
||||
unsigned page_number = 0;
|
||||
unsigned page_base = 0;
|
||||
@ -1094,7 +1121,7 @@ static void browser_render(void *data)
|
||||
float y_increment = POSITION_Y_START;
|
||||
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_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)
|
||||
{
|
||||
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;
|
||||
|
||||
#ifdef HAVE_MENU_PANEL
|
||||
//check if this is the currently selected file
|
||||
const char *current_pathname = b->current_path;
|
||||
if (strcmp(current_pathname, b->current_dir.list->elems[i].data) == 0)
|
||||
if (strcmp(browser->current_dir.path, browser->list->elems[i].data) == 0)
|
||||
{
|
||||
menu_panel->x = 0;
|
||||
menu_panel->y = y_increment;
|
||||
@ -1120,7 +1146,7 @@ static void browser_render(void *data)
|
||||
|
||||
font_parms.x = POSITION_X;
|
||||
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)
|
||||
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 path[PATH_MAX];
|
||||
bool ret = true;
|
||||
bool pop_menu_stack = false;
|
||||
font_params_t font_parms = {0};
|
||||
|
||||
filebrowser_t *filebrowser = tmpBrowser;
|
||||
|
||||
switch(menu_type)
|
||||
{
|
||||
case SHADER_CHOICE:
|
||||
@ -1163,15 +1188,15 @@ static int select_file(uint8_t menu_type, uint64_t input)
|
||||
break;
|
||||
}
|
||||
|
||||
browser_update(filebrowser, input, extensions);
|
||||
browser_update(browser, input, extensions);
|
||||
|
||||
if (input & (1ULL << RMENU_DEVICE_NAV_B))
|
||||
{
|
||||
if (filebrowser_iterate(filebrowser, FILEBROWSER_ACTION_PATH_ISDIR))
|
||||
ret = filebrowser_iterate(filebrowser, FILEBROWSER_ACTION_OK);
|
||||
if (filebrowser_iterate(browser, FILEBROWSER_ACTION_PATH_ISDIR))
|
||||
ret = filebrowser_iterate(browser, FILEBROWSER_ACTION_OK);
|
||||
else
|
||||
{
|
||||
strlcpy(path, filebrowser->current_path, sizeof(path));
|
||||
strlcpy(path, browser->current_dir.path, sizeof(path));
|
||||
|
||||
switch(menu_type)
|
||||
{
|
||||
@ -1246,13 +1271,16 @@ static int select_file(uint8_t menu_type, uint64_t input)
|
||||
break;
|
||||
}
|
||||
|
||||
menu_stack_pop();
|
||||
pop_menu_stack = true;
|
||||
}
|
||||
|
||||
if (!ret)
|
||||
msg_queue_push(g_extern.msg_queue, "INFO - You need to restart RetroArch.", 1, 180);
|
||||
}
|
||||
else if (input & (1ULL << RMENU_DEVICE_NAV_X))
|
||||
pop_menu_stack = true;
|
||||
|
||||
if (pop_menu_stack)
|
||||
menu_stack_pop();
|
||||
|
||||
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)
|
||||
driver.video_poke->set_osd_msg(driver.video_data, comment, &font_parms);
|
||||
|
||||
browser_render(filebrowser);
|
||||
browser_render(browser);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -1299,16 +1327,15 @@ static int select_directory(uint8_t menu_type, uint64_t input)
|
||||
char msg[256];
|
||||
bool ret = true;
|
||||
|
||||
filebrowser_t *filebrowser = tmpBrowser;
|
||||
|
||||
bool is_dir = filebrowser_iterate(filebrowser, FILEBROWSER_ACTION_PATH_ISDIR);
|
||||
browser_update(filebrowser, input, "empty");
|
||||
bool is_dir = filebrowser_iterate(browser, FILEBROWSER_ACTION_PATH_ISDIR);
|
||||
bool pop_menu_stack = false;
|
||||
browser_update(browser, input, "empty");
|
||||
|
||||
if (input & (1ULL << RMENU_DEVICE_NAV_Y))
|
||||
{
|
||||
if (is_dir)
|
||||
{
|
||||
strlcpy(path, filebrowser->current_path, sizeof(path));
|
||||
strlcpy(path, browser->current_dir.path, sizeof(path));
|
||||
|
||||
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));
|
||||
break;
|
||||
}
|
||||
menu_stack_pop();
|
||||
pop_menu_stack = true;
|
||||
}
|
||||
}
|
||||
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));
|
||||
break;
|
||||
}
|
||||
|
||||
menu_stack_pop();
|
||||
pop_menu_stack = true;
|
||||
}
|
||||
else if (input & (1ULL << RMENU_DEVICE_NAV_B))
|
||||
{
|
||||
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)
|
||||
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)
|
||||
driver.video_poke->set_osd_msg(driver.video_data, msg, &font_parms);
|
||||
|
||||
browser_render(filebrowser);
|
||||
browser_render(browser);
|
||||
|
||||
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)
|
||||
{
|
||||
DEVICE_CAST device_ptr = (DEVICE_CAST)driver.video_data;
|
||||
filebrowser_t *filebrowser = tmpBrowser;
|
||||
|
||||
switch (switchvalue)
|
||||
{
|
||||
@ -1595,8 +1623,8 @@ static int set_setting_action(uint8_t menu_type, unsigned switchvalue, uint64_t
|
||||
case SETTING_EMU_SKIN:
|
||||
if ((input & (1ULL << RMENU_DEVICE_NAV_LEFT)) || (input & (1ULL << RMENU_DEVICE_NAV_RIGHT)) || (input & (1ULL << RMENU_DEVICE_NAV_B)))
|
||||
{
|
||||
menu_stack_push(BORDER_CHOICE);
|
||||
filebrowser_set_root_and_ext(filebrowser, EXT_IMAGES, default_paths.border_dir);
|
||||
menu_stack_push(BORDER_CHOICE, true);
|
||||
filebrowser_set_root_and_ext(browser, EXT_IMAGES, default_paths.border_dir);
|
||||
}
|
||||
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:
|
||||
if ((input & (1ULL << RMENU_DEVICE_NAV_LEFT)) || (input & (1ULL << RMENU_DEVICE_NAV_RIGHT)) || (input & (1ULL << RMENU_DEVICE_NAV_B)))
|
||||
{
|
||||
menu_stack_push(LIBRETRO_CHOICE);
|
||||
filebrowser_set_root_and_ext(filebrowser, EXT_EXECUTABLES, default_paths.core_dir);
|
||||
menu_stack_push(LIBRETRO_CHOICE, true);
|
||||
filebrowser_set_root_and_ext(browser, EXT_EXECUTABLES, default_paths.core_dir);
|
||||
set_libretro_core_as_launch = true;
|
||||
}
|
||||
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:
|
||||
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);
|
||||
filebrowser_set_root_and_ext(filebrowser, "empty", default_paths.filesystem_root_dir);
|
||||
menu_stack_push(PATH_DEFAULT_ROM_DIR_CHOICE, true);
|
||||
filebrowser_set_root_and_ext(browser, "empty", default_paths.filesystem_root_dir);
|
||||
}
|
||||
|
||||
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:
|
||||
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);
|
||||
filebrowser_set_root_and_ext(filebrowser, "empty", default_paths.filesystem_root_dir);
|
||||
menu_stack_push(PATH_SAVESTATES_DIR_CHOICE, true);
|
||||
filebrowser_set_root_and_ext(browser, "empty", default_paths.filesystem_root_dir);
|
||||
}
|
||||
|
||||
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:
|
||||
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);
|
||||
filebrowser_set_root_and_ext(filebrowser, "empty", default_paths.filesystem_root_dir);
|
||||
menu_stack_push(PATH_SRAM_DIR_CHOICE, true);
|
||||
filebrowser_set_root_and_ext(browser, "empty", default_paths.filesystem_root_dir);
|
||||
}
|
||||
|
||||
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:
|
||||
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);
|
||||
filebrowser_set_root_and_ext(filebrowser, "empty", default_paths.filesystem_root_dir);
|
||||
menu_stack_push(PATH_CHEATS_DIR_CHOICE, true);
|
||||
filebrowser_set_root_and_ext(browser, "empty", default_paths.filesystem_root_dir);
|
||||
}
|
||||
|
||||
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:
|
||||
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);
|
||||
filebrowser_set_root_and_ext(filebrowser, "empty", default_paths.system_dir);
|
||||
menu_stack_push(PATH_SYSTEM_DIR_CHOICE, true);
|
||||
filebrowser_set_root_and_ext(browser, "empty", default_paths.system_dir);
|
||||
}
|
||||
|
||||
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:
|
||||
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);
|
||||
filebrowser_set_root_and_ext(filebrowser, EXT_INPUT_PRESETS, default_paths.input_presets_dir);
|
||||
menu_stack_push(INPUT_PRESET_CHOICE, true);
|
||||
filebrowser_set_root_and_ext(browser, EXT_INPUT_PRESETS, default_paths.input_presets_dir);
|
||||
}
|
||||
break;
|
||||
case SETTING_CONTROLS_NUMBER:
|
||||
@ -2236,15 +2264,15 @@ static int set_setting_action(uint8_t menu_type, unsigned switchvalue, uint64_t
|
||||
break;
|
||||
case INGAME_MENU_RESIZE_MODE:
|
||||
if (input & (1ULL << RMENU_DEVICE_NAV_B))
|
||||
menu_stack_push(INGAME_MENU_RESIZE);
|
||||
menu_stack_push(INGAME_MENU_RESIZE, false);
|
||||
break;
|
||||
case INGAME_MENU_CORE_OPTIONS_MODE:
|
||||
if (input & (1ULL << RMENU_DEVICE_NAV_B))
|
||||
menu_stack_push(INGAME_MENU_CORE_OPTIONS);
|
||||
menu_stack_push(INGAME_MENU_CORE_OPTIONS, false);
|
||||
break;
|
||||
case INGAME_MENU_SCREENSHOT_MODE:
|
||||
if (input & (1ULL << RMENU_DEVICE_NAV_B))
|
||||
menu_stack_push(INGAME_MENU_SCREENSHOT);
|
||||
menu_stack_push(INGAME_MENU_SCREENSHOT, false);
|
||||
break;
|
||||
case INGAME_MENU_RETURN_TO_GAME:
|
||||
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:
|
||||
if (input & (1ULL << RMENU_DEVICE_NAV_B))
|
||||
{
|
||||
menu_stack_push(LIBRETRO_CHOICE);
|
||||
filebrowser_set_root_and_ext(filebrowser, EXT_EXECUTABLES, default_paths.core_dir);
|
||||
menu_stack_push(LIBRETRO_CHOICE, true);
|
||||
filebrowser_set_root_and_ext(browser, EXT_EXECUTABLES, default_paths.core_dir);
|
||||
set_libretro_core_as_launch = true;
|
||||
}
|
||||
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))
|
||||
{
|
||||
selected = FIRST_SHADERMAN_SETTING;
|
||||
menu_stack_push(INGAME_MENU_SHADER_MANAGER);
|
||||
menu_stack_push(INGAME_MENU_SHADER_MANAGER, false);
|
||||
}
|
||||
break;
|
||||
case SHADERMAN_LOAD_CGP:
|
||||
if ((input & (1ULL << RMENU_DEVICE_NAV_LEFT)) || (input & (1ULL << RMENU_DEVICE_NAV_RIGHT)) || (input & (1ULL << RMENU_DEVICE_NAV_B)))
|
||||
{
|
||||
menu_stack_push(PRESET_CHOICE);
|
||||
filebrowser_set_root_and_ext(filebrowser, EXT_CGP_PRESETS, g_settings.video.shader_dir);
|
||||
menu_stack_push(PRESET_CHOICE, true);
|
||||
filebrowser_set_root_and_ext(browser, EXT_CGP_PRESETS, g_settings.video.shader_dir);
|
||||
}
|
||||
if (input & (1ULL << RMENU_DEVICE_NAV_START))
|
||||
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)))
|
||||
{
|
||||
shader_choice_set_shader_slot = index;
|
||||
menu_stack_push(SHADER_CHOICE);
|
||||
filebrowser_set_root_and_ext(tmpBrowser, EXT_SHADERS, g_settings.video.shader_dir);
|
||||
menu_stack_push(SHADER_CHOICE, true);
|
||||
filebrowser_set_root_and_ext(browser, EXT_SHADERS, g_settings.video.shader_dir);
|
||||
}
|
||||
|
||||
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)
|
||||
selected = FIRST_CONTROLS_SETTING_PAGE_1;
|
||||
|
||||
menu_stack_push(menu_type + 1);
|
||||
menu_stack_push(menu_type + 1, false);
|
||||
page_number = 0;
|
||||
break;
|
||||
case CONTROLS_MENU:
|
||||
@ -2749,7 +2777,6 @@ static int select_rom(uint8_t menu_type, uint64_t input)
|
||||
{
|
||||
font_params_t font_parms = {0};
|
||||
char msg[128];
|
||||
filebrowser_t *filebrowser = browser;
|
||||
|
||||
struct platform_bind key_label_b = {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));
|
||||
}
|
||||
|
||||
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))
|
||||
menu_stack_push(GENERAL_VIDEO_MENU);
|
||||
menu_stack_push(GENERAL_VIDEO_MENU, false);
|
||||
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)
|
||||
msg_queue_push(g_extern.msg_queue, "ERROR - Failed to open directory.", 1, 180);
|
||||
}
|
||||
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);
|
||||
}
|
||||
}
|
||||
@ -2797,8 +2824,8 @@ static int select_rom(uint8_t menu_type, uint64_t input)
|
||||
const char * drive_map = menu_drive_mapping_previous();
|
||||
if (drive_map != NULL)
|
||||
{
|
||||
filebrowser_set_root_and_ext(filebrowser, g_extern.system.valid_extensions, drive_map);
|
||||
browser_update(filebrowser, 1ULL << RMENU_DEVICE_NAV_B, g_extern.system.valid_extensions);
|
||||
filebrowser_set_root_and_ext(browser, g_extern.system.valid_extensions, drive_map);
|
||||
browser_update(browser, 1ULL << RMENU_DEVICE_NAV_B, g_extern.system.valid_extensions);
|
||||
}
|
||||
}
|
||||
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();
|
||||
if (drive_map != NULL)
|
||||
{
|
||||
filebrowser_set_root_and_ext(filebrowser, g_extern.system.valid_extensions, drive_map);
|
||||
browser_update(filebrowser, 1ULL << RMENU_DEVICE_NAV_B, g_extern.system.valid_extensions);
|
||||
filebrowser_set_root_and_ext(browser, g_extern.system.valid_extensions, drive_map);
|
||||
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);
|
||||
else
|
||||
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)
|
||||
driver.video_poke->set_osd_msg(driver.video_data, msg, &font_parms);
|
||||
|
||||
browser_render(filebrowser);
|
||||
browser_render(browser);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -3375,22 +3402,15 @@ static int menu_input_process(uint8_t menu_type, uint64_t old_state)
|
||||
void menu_init(void)
|
||||
{
|
||||
browser = (filebrowser_t*)calloc(1, sizeof(*browser));
|
||||
tmpBrowser = (filebrowser_t*)calloc(1, sizeof(*tmpBrowser));
|
||||
|
||||
strlcpy(browser->extensions, g_extern.system.valid_extensions,
|
||||
sizeof(browser->extensions));
|
||||
strlcpy(browser->root_dir, g_extern.console.main_wrap.default_rom_startup_dir,
|
||||
sizeof(browser->root_dir));
|
||||
|
||||
strlcpy(tmpBrowser->extensions, "",
|
||||
sizeof(tmpBrowser->extensions));
|
||||
strlcpy(tmpBrowser->root_dir, default_paths.filesystem_root_dir,
|
||||
sizeof(tmpBrowser->root_dir));
|
||||
strlcpy(browser->current_dir.extensions, g_extern.system.valid_extensions,
|
||||
sizeof(browser->current_dir.extensions));
|
||||
strlcpy(browser->current_dir.root_dir, g_extern.console.main_wrap.default_rom_startup_dir,
|
||||
sizeof(browser->current_dir.root_dir));
|
||||
|
||||
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();
|
||||
}
|
||||
@ -3401,7 +3421,6 @@ void menu_free(void)
|
||||
rmenu_gfx_free();
|
||||
|
||||
filebrowser_free(browser);
|
||||
filebrowser_free(tmpBrowser);
|
||||
}
|
||||
|
||||
bool menu_iterate(void)
|
||||
@ -3416,7 +3435,7 @@ bool menu_iterate(void)
|
||||
if (g_extern.lifecycle_mode_state & (1ULL << MODE_MENU_INGAME))
|
||||
{
|
||||
selected = FIRST_INGAME_MENU_SETTING;
|
||||
menu_stack_push(INGAME_MENU);
|
||||
menu_stack_push(INGAME_MENU, false);
|
||||
}
|
||||
|
||||
#ifndef __CELLOS_LV2__
|
||||
|
@ -23,19 +23,21 @@ static bool directory_parse(void *data, const char *path)
|
||||
{
|
||||
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)
|
||||
return false;
|
||||
|
||||
dir_list_sort(list, true);
|
||||
|
||||
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)
|
||||
dir_list_free(filebrowser->current_dir.list);
|
||||
if(filebrowser->list)
|
||||
dir_list_free(filebrowser->list);
|
||||
|
||||
filebrowser->current_dir.list = list;
|
||||
filebrowser->list = list;
|
||||
|
||||
return true;
|
||||
|
||||
@ -45,8 +47,8 @@ void filebrowser_free(void *data)
|
||||
{
|
||||
filebrowser_t *filebrowser = (filebrowser_t*)data;
|
||||
|
||||
dir_list_free(filebrowser->current_dir.list);
|
||||
filebrowser->current_dir.list = NULL;
|
||||
dir_list_free(filebrowser->list);
|
||||
filebrowser->list = NULL;
|
||||
filebrowser->current_dir.ptr = 0;
|
||||
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;
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
static inline const char *filebrowser_get_current_path (void *data)
|
||||
{
|
||||
filebrowser_t *filebrowser = (filebrowser_t*)data;
|
||||
return filebrowser->current_dir.list->elems[filebrowser->current_dir.ptr].data;
|
||||
}
|
||||
#define GET_CURRENT_PATH(browser) (browser->list->elems[browser->current_dir.ptr].data)
|
||||
|
||||
bool filebrowser_iterate(void *data, unsigned action)
|
||||
{
|
||||
@ -78,12 +78,12 @@ bool filebrowser_iterate(void *data, unsigned action)
|
||||
{
|
||||
case FILEBROWSER_ACTION_UP:
|
||||
filebrowser->current_dir.ptr--;
|
||||
if (filebrowser->current_dir.ptr >= filebrowser->current_dir.list->size)
|
||||
filebrowser->current_dir.ptr = filebrowser->current_dir.list->size - 1;
|
||||
if (filebrowser->current_dir.ptr >= filebrowser->list->size)
|
||||
filebrowser->current_dir.ptr = filebrowser->list->size - 1;
|
||||
break;
|
||||
case FILEBROWSER_ACTION_DOWN:
|
||||
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;
|
||||
break;
|
||||
case FILEBROWSER_ACTION_LEFT:
|
||||
@ -94,7 +94,7 @@ bool filebrowser_iterate(void *data, unsigned action)
|
||||
break;
|
||||
case FILEBROWSER_ACTION_RIGHT:
|
||||
filebrowser->current_dir.ptr = (min(filebrowser->current_dir.ptr + 5,
|
||||
filebrowser->current_dir.list->size-1));
|
||||
filebrowser->list->size-1));
|
||||
break;
|
||||
case FILEBROWSER_ACTION_SCROLL_UP:
|
||||
if (filebrowser->current_dir.ptr <= entries_to_scroll)
|
||||
@ -104,28 +104,34 @@ bool filebrowser_iterate(void *data, unsigned action)
|
||||
break;
|
||||
case FILEBROWSER_ACTION_SCROLL_DOWN:
|
||||
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;
|
||||
case FILEBROWSER_ACTION_OK:
|
||||
ret = directory_parse(filebrowser, filebrowser_get_current_path(filebrowser));
|
||||
ret = directory_parse(filebrowser, GET_CURRENT_PATH(filebrowser));
|
||||
break;
|
||||
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;
|
||||
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;
|
||||
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;
|
||||
case FILEBROWSER_ACTION_NOOP:
|
||||
default:
|
||||
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;
|
||||
}
|
||||
|
@ -21,14 +21,18 @@
|
||||
|
||||
typedef struct
|
||||
{
|
||||
size_t ptr;
|
||||
char directory_path[PATH_MAX];
|
||||
struct {
|
||||
struct string_list *list;
|
||||
size_t ptr;
|
||||
} current_dir;
|
||||
char current_path[PATH_MAX];
|
||||
char root_dir[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;
|
||||
|
||||
typedef enum
|
||||
@ -42,6 +46,7 @@ typedef enum
|
||||
FILEBROWSER_ACTION_SCROLL_UP,
|
||||
FILEBROWSER_ACTION_SCROLL_DOWN,
|
||||
FILEBROWSER_ACTION_RESET,
|
||||
FILEBROWSER_ACTION_RESET_CURRENT_DIR,
|
||||
FILEBROWSER_ACTION_PATH_ISDIR,
|
||||
FILEBROWSER_ACTION_NOOP
|
||||
} filebrowser_action_t;
|
||||
|
Loading…
x
Reference in New Issue
Block a user