(PS3) menu code/file browser refactoring

This commit is contained in:
Twinaphex 2012-06-19 03:44:17 +02:00
parent 3eddb91750
commit 8e2c3717de
3 changed files with 263 additions and 199 deletions

View File

@ -29,7 +29,7 @@ const char * path, const char * extensions)
dir_list_sort(filebrowser->current_dir.elems, true);
}
void filebrowser_new(filebrowser_t * filebrowser, const char * start_dir,
static void filebrowser_new(filebrowser_t * filebrowser, const char * start_dir,
const char * extensions)
{
filebrowser->directory_stack_size = 0;
@ -38,6 +38,11 @@ const char * extensions)
filebrowser_parse_directory(filebrowser, start_dir, extensions);
}
void filebrowser_set_root(filebrowser_t *filebrowser, const char *root_dir)
{
strlcpy(filebrowser->root_dir, root_dir, sizeof(filebrowser->root_dir));
}
void filebrowser_free(filebrowser_t * filebrowser)
{
dir_list_free(filebrowser->current_dir.elems);
@ -47,7 +52,7 @@ void filebrowser_free(filebrowser_t * filebrowser)
filebrowser->current_dir.ptr = 0;
}
void filebrowser_push_directory(filebrowser_t * filebrowser, const char * path,
static void filebrowser_push_directory(filebrowser_t * filebrowser, const char * path,
bool with_extension)
{
filebrowser->directory_stack_size++;
@ -57,7 +62,7 @@ bool with_extension)
filebrowser_parse_directory(filebrowser, path, "empty");
}
void filebrowser_pop_directory (filebrowser_t * filebrowser)
static void filebrowser_pop_directory (filebrowser_t * filebrowser)
{
if (filebrowser->directory_stack_size > 0)
filebrowser->directory_stack_size--;
@ -86,16 +91,71 @@ void filebrowser_set_current_at (filebrowser_t *filebrowser, size_t pos)
filebrowser->current_dir.ptr = pos;
}
void filebrowser_set_current_increment (filebrowser_t *filebrowser, bool allow_wraparound)
static void filebrowser_set_current_increment (filebrowser_t *filebrowser, bool allow_wraparound)
{
filebrowser->current_dir.ptr++;
if (filebrowser->current_dir.ptr >= filebrowser->current_dir.size && allow_wraparound)
filebrowser->current_dir.ptr = 0;
}
void filebrowser_set_current_decrement (filebrowser_t *filebrowser, bool allow_wraparound)
static void filebrowser_set_current_decrement (filebrowser_t *filebrowser, bool allow_wraparound)
{
filebrowser->current_dir.ptr--;
if (filebrowser->current_dir.ptr >= filebrowser->current_dir.size && allow_wraparound)
filebrowser->current_dir.ptr = filebrowser->current_dir.size - 1;
}
void filebrowser_iterate(filebrowser_t *filebrowser, filebrowser_action_t action)
{
int entries_to_scroll = 19;
switch(action)
{
case FILEBROWSER_ACTION_UP:
filebrowser_set_current_decrement(filebrowser, true);
break;
case FILEBROWSER_ACTION_DOWN:
filebrowser_set_current_increment(filebrowser, true);
break;
case FILEBROWSER_ACTION_LEFT:
if (filebrowser->current_dir.ptr <= 5)
filebrowser->current_dir.ptr = 0;
else
filebrowser->current_dir.ptr -= 5;
break;
case FILEBROWSER_ACTION_RIGHT:
filebrowser->current_dir.ptr = (min(filebrowser->current_dir.ptr + 5,
filebrowser->current_dir.size-1));
break;
case FILEBROWSER_ACTION_SCROLL_UP:
if (filebrowser->current_dir.ptr <= entries_to_scroll)
filebrowser->current_dir.ptr= 0;
else
filebrowser->current_dir.ptr -= entries_to_scroll;
break;
case FILEBROWSER_ACTION_SCROLL_UP_SMOOTH:
if (filebrowser->current_dir.ptr <= 50)
filebrowser->current_dir.ptr= 0;
else
filebrowser->current_dir.ptr -= 50;
break;
case FILEBROWSER_ACTION_SCROLL_DOWN:
filebrowser->current_dir.ptr = (min(filebrowser->current_dir.ptr +
entries_to_scroll, filebrowser->current_dir.size-1));
break;
case FILEBROWSER_ACTION_SCROLL_DOWN_SMOOTH:
filebrowser->current_dir.ptr = (min(filebrowser->current_dir.ptr + 50,
filebrowser->current_dir.size-1));
if(!filebrowser->current_dir.ptr) filebrowser->current_dir.ptr = 0;
break;
case FILEBROWSER_ACTION_OK:
filebrowser_push_directory(filebrowser, filebrowser_get_current_path(filebrowser), true);
break;
case FILEBROWSER_ACTION_CANCEL:
filebrowser_pop_directory(filebrowser);
break;
case FILEBROWSER_ACTION_RESET:
filebrowser_new(filebrowser, filebrowser->root_dir, filebrowser->extensions);
break;
}
}

View File

@ -31,18 +31,32 @@ typedef struct
size_t size;
size_t ptr;
} current_dir;
char root_dir[PATH_MAX];
char extensions[PATH_MAX];
} filebrowser_t;
void filebrowser_new(filebrowser_t *filebrowser, const char * start_dir, const char * extensions);
void filebrowser_free(filebrowser_t *filebrowser);
void filebrowser_push_directory(filebrowser_t * filebrowser, const char * path, bool with_extension);
void filebrowser_pop_directory (filebrowser_t * filebrowser);
typedef enum
{
FILEBROWSER_ACTION_UP,
FILEBROWSER_ACTION_DOWN,
FILEBROWSER_ACTION_LEFT,
FILEBROWSER_ACTION_RIGHT,
FILEBROWSER_ACTION_OK,
FILEBROWSER_ACTION_CANCEL,
FILEBROWSER_ACTION_SCROLL_UP,
FILEBROWSER_ACTION_SCROLL_UP_SMOOTH,
FILEBROWSER_ACTION_SCROLL_DOWN,
FILEBROWSER_ACTION_SCROLL_DOWN_SMOOTH,
FILEBROWSER_ACTION_RESET,
FILEBROWSER_ACTION_NOOP
} filebrowser_action_t;
const char * filebrowser_get_current_dir (filebrowser_t *filebrowser);
const char * filebrowser_get_current_path (filebrowser_t *filebrowser);
size_t filebrowser_get_current_index (filebrowser_t *filebrowser);
void filebrowser_set_root(filebrowser_t *filebrowser, const char *root_dir);
void filebrowser_free(filebrowser_t *filebrowser);
void filebrowser_set_current_at (filebrowser_t *filebrowser, size_t pos);
void filebrowser_set_current_increment (filebrowser_t *filebrowser, bool allow_wraparound);
void filebrowser_set_current_decrement (filebrowser_t *filebrowser, bool allow_wraparound);
void filebrowser_iterate(filebrowser_t *filebrowser, filebrowser_action_t action);
#endif /* FILEBROWSER_H_ */

View File

@ -205,7 +205,7 @@ static void set_delay_speed(unsigned delaymode)
SET_TIMER_EXPIRATION(gl, speed);
}
static void browser_update(filebrowser_t * b)
static void browser_update(filebrowser_t * b, const char *extensions)
{
uint64_t state, diff_state, button_was_pressed;
gl_t * gl = driver.video_data;
@ -217,111 +217,79 @@ static void browser_update(filebrowser_t * b)
if(IS_TIMER_EXPIRED(gl))
{
set_delay = DELAY_NONE;
filebrowser_action_t action = FILEBROWSER_ACTION_NOOP;
if (CTRL_LSTICK_DOWN(state))
{
if(b->current_dir.ptr < b->current_dir.size-1)
{
filebrowser_set_current_increment(b, true);
set_delay = DELAY_SMALLEST;
}
}
if (CTRL_DOWN(state))
{
if(b->current_dir.ptr < b->current_dir.size-1)
{
filebrowser_set_current_increment(b, true);
set_delay = DELAY_SMALLEST;
}
}
if (CTRL_LSTICK_UP(state))
{
if(b->current_dir.ptr > 0)
{
filebrowser_set_current_decrement(b, true);
set_delay = DELAY_SMALLEST;
}
}
if (CTRL_UP(state))
{
if(b->current_dir.ptr > 0)
{
filebrowser_set_current_decrement(b, true);
set_delay = DELAY_SMALLEST;
}
}
if (CTRL_RIGHT(state))
{
b->current_dir.ptr = (MIN(b->current_dir.ptr + 5, b->current_dir.size-1));
set_delay = DELAY_SMALL;
}
if (CTRL_LSTICK_RIGHT(state))
{
b->current_dir.ptr = (MIN(b->current_dir.ptr + 5, b->current_dir.size-1));
action = FILEBROWSER_ACTION_DOWN;
set_delay = DELAY_SMALLEST;
}
if (CTRL_LEFT(state))
else if (CTRL_DOWN(state))
{
if (b->current_dir.ptr <= 5)
b->current_dir.ptr = 0;
else
b->current_dir.ptr -= 5;
set_delay = DELAY_SMALL;
}
if (CTRL_LSTICK_LEFT(state))
{
if (b->current_dir.ptr <= 5)
b->current_dir.ptr = 0;
else
b->current_dir.ptr -= 5;
action = FILEBROWSER_ACTION_DOWN;
set_delay = DELAY_SMALLEST;
}
if (CTRL_R1(state))
else if (CTRL_LSTICK_UP(state))
{
b->current_dir.ptr = (MIN(b->current_dir.ptr + NUM_ENTRY_PER_PAGE, b->current_dir.size-1));
set_delay = DELAY_MEDIUM;
action = FILEBROWSER_ACTION_UP;
set_delay = DELAY_SMALLEST;
}
if (CTRL_R2(state))
else if (CTRL_UP(state))
{
b->current_dir.ptr = (MIN(b->current_dir.ptr + 50, b->current_dir.size-1));
if(!b->current_dir.ptr)
b->current_dir.ptr = 0;
action = FILEBROWSER_ACTION_UP;
set_delay = DELAY_SMALLEST;
}
else if (CTRL_RIGHT(state))
{
action = FILEBROWSER_ACTION_RIGHT;
set_delay = DELAY_SMALL;
}
if (CTRL_L2(state))
else if (CTRL_LSTICK_RIGHT(state))
{
if (b->current_dir.ptr <= 50)
b->current_dir.ptr= 0;
else
b->current_dir.ptr -= 50;
action = FILEBROWSER_ACTION_RIGHT;
set_delay = DELAY_SMALLEST;
}
else if (CTRL_LEFT(state))
{
action = FILEBROWSER_ACTION_LEFT;
set_delay = DELAY_SMALL;
}
if (CTRL_L1(state))
else if (CTRL_LSTICK_LEFT(state))
{
if (b->current_dir.ptr <= NUM_ENTRY_PER_PAGE)
b->current_dir.ptr= 0;
else
b->current_dir.ptr -= NUM_ENTRY_PER_PAGE;
action = FILEBROWSER_ACTION_LEFT;
set_delay = DELAY_SMALLEST;
}
else if (CTRL_R1(state))
{
action = FILEBROWSER_ACTION_SCROLL_DOWN;
set_delay = DELAY_MEDIUM;
}
else if (CTRL_R2(state))
{
action = FILEBROWSER_ACTION_SCROLL_DOWN_SMOOTH;
set_delay = DELAY_SMALL;
}
else if (CTRL_L2(state))
{
action = FILEBROWSER_ACTION_SCROLL_UP_SMOOTH;
set_delay = DELAY_SMALL;
}
else if (CTRL_L1(state))
{
action = FILEBROWSER_ACTION_SCROLL_UP;
set_delay = DELAY_MEDIUM;
}
else if (CTRL_CIRCLE(button_was_pressed))
action = FILEBROWSER_ACTION_CANCEL;
else if (CTRL_START(button_was_pressed))
{
action = FILEBROWSER_ACTION_RESET;
filebrowser_set_root(b, "/");
strlcpy(b->extensions, extensions, sizeof(b->extensions));
}
if (CTRL_CIRCLE(button_was_pressed))
filebrowser_pop_directory(b);
if(action != FILEBROWSER_ACTION_NOOP)
filebrowser_iterate(b, action);
old_state = state;
}
@ -873,16 +841,16 @@ static void select_file(uint32_t menu_id)
if(set_initial_dir_tmpbrowser)
{
filebrowser_new(&tmpBrowser, dir_path, extensions);
strlcpy(tmpBrowser.extensions, extensions, sizeof(tmpBrowser.extensions));
filebrowser_set_root(&tmpBrowser, dir_path);
filebrowser_iterate(&tmpBrowser, FILEBROWSER_ACTION_RESET);
set_initial_dir_tmpbrowser = false;
}
browser_update(&tmpBrowser);
if(IS_TIMER_EXPIRED(gl))
{
if (CTRL_START(button_was_pressed))
filebrowser_new(&tmpBrowser, "/", extensions);
browser_update(&tmpBrowser, extensions);
if (CTRL_CROSS(button_was_pressed))
{
@ -891,12 +859,9 @@ static void select_file(uint32_t menu_id)
/*if 'filename' is in fact '..' - then pop back directory instead of
adding '..' to filename path */
if(tmpBrowser.current_dir.ptr == 0)
filebrowser_pop_directory(&tmpBrowser);
filebrowser_iterate(&tmpBrowser, FILEBROWSER_ACTION_CANCEL);
else
{
snprintf(path, sizeof(path), filebrowser_get_current_path(&tmpBrowser));
filebrowser_push_directory(&tmpBrowser, path, true);
}
filebrowser_iterate(&tmpBrowser, FILEBROWSER_ACTION_OK);
}
else if (path_file_exists(filebrowser_get_current_path(&tmpBrowser)))
{
@ -944,8 +909,7 @@ static void select_file(uint32_t menu_id)
menuStackindex--;
}
}
if (CTRL_TRIANGLE(button_was_pressed))
else if (CTRL_TRIANGLE(button_was_pressed))
menuStackindex--;
}
@ -961,7 +925,7 @@ static void select_file(uint32_t menu_id)
static void select_directory(uint32_t menu_id)
{
char path[1024], newpath[1024];
char path[1024];
uint64_t state, diff_state, button_was_pressed;
gl_t * gl = driver.video_data;
@ -971,16 +935,15 @@ static void select_directory(uint32_t menu_id)
if(set_initial_dir_tmpbrowser)
{
filebrowser_new(&tmpBrowser, "/\0", "empty");
strlcpy(tmpBrowser.extensions, "empty", sizeof(tmpBrowser.extensions));
filebrowser_set_root(&tmpBrowser, "/");
filebrowser_iterate(&tmpBrowser, FILEBROWSER_ACTION_RESET);
set_initial_dir_tmpbrowser = false;
}
browser_update(&tmpBrowser);
if(IS_TIMER_EXPIRED(gl))
{
if (CTRL_START(button_was_pressed))
filebrowser_new(&tmpBrowser, "/","empty");
browser_update(&tmpBrowser, "empty");
if (CTRL_SQUARE(button_was_pressed))
{
@ -1005,8 +968,7 @@ static void select_directory(uint32_t menu_id)
menuStackindex--;
}
}
if (CTRL_TRIANGLE(button_was_pressed))
else if (CTRL_TRIANGLE(button_was_pressed))
{
strlcpy(path, usrDirPath, sizeof(path));
switch(menu_id)
@ -1026,8 +988,7 @@ static void select_directory(uint32_t menu_id)
}
menuStackindex--;
}
if (CTRL_CROSS(button_was_pressed))
else if (CTRL_CROSS(button_was_pressed))
{
if(path_is_directory(filebrowser_get_current_path(&tmpBrowser)))
{
@ -1035,12 +996,9 @@ static void select_directory(uint32_t menu_id)
* adding '..' to filename path */
if(tmpBrowser.current_dir.ptr == 0)
filebrowser_pop_directory(&tmpBrowser);
filebrowser_iterate(&tmpBrowser, FILEBROWSER_ACTION_CANCEL);
else
{
snprintf(newpath, sizeof(newpath), filebrowser_get_current_path(&tmpBrowser));
filebrowser_push_directory(&tmpBrowser, newpath, false);
}
filebrowser_iterate(&tmpBrowser, FILEBROWSER_ACTION_OK);
}
}
}
@ -1788,24 +1746,40 @@ static void producesettingentry(menu * menu_obj, uint64_t switchvalue)
set_setting_label(menu_obj, switchvalue);
}
static void select_setting(menu * menu_obj)
typedef enum {
SETTINGS_ACTION_DOWN,
SETTINGS_ACTION_UP,
SETTINGS_ACTION_TAB_PREVIOUS,
SETTINGS_ACTION_TAB_NEXT,
SETTINGS_ACTION_NOOP
} settings_action_t;
static void settings_iterate(menu * menu_obj, settings_action_t action)
{
uint64_t state, diff_state, button_was_pressed, i;
gl_t * gl = driver.video_data;
state = cell_pad_input_poll_device(0);
diff_state = old_state ^ state;
button_was_pressed = old_state & diff_state;
if(IS_TIMER_EXPIRED(gl))
switch(action)
{
set_delay = DELAY_NONE;
/* back to ROM menu if CIRCLE is pressed */
if (CTRL_L1(button_was_pressed) || CTRL_CIRCLE(button_was_pressed))
menuStackindex--;
case SETTINGS_ACTION_DOWN:
menu_obj->selected++;
if (CTRL_R1(button_was_pressed))
{
if (menu_obj->selected >= menu_obj->max_settings)
menu_obj->selected = menu_obj->first_setting;
if (menu_obj->items[menu_obj->selected].page != menu_obj->page)
menu_obj->page = menu_obj->items[menu_obj->selected].page;
break;
case SETTINGS_ACTION_UP:
if (menu_obj->selected == menu_obj->first_setting)
menu_obj->selected = menu_obj->max_settings-1;
else
menu_obj->selected--;
if (menu_obj->items[menu_obj->selected].page != menu_obj->page)
menu_obj->page = menu_obj->items[menu_obj->selected].page;
break;
case SETTINGS_ACTION_TAB_PREVIOUS:
menuStackindex--;
break;
case SETTINGS_ACTION_TAB_NEXT:
switch(menu_obj->enum_id)
{
case GENERAL_VIDEO_MENU:
@ -1835,37 +1809,42 @@ static void select_setting(menu * menu_obj)
case CONTROLS_MENU:
break;
}
}
break;
}
}
/* down to next setting */
static void select_setting(menu * menu_obj)
{
uint64_t state, diff_state, button_was_pressed, i;
gl_t * gl = driver.video_data;
if (CTRL_DOWN(state) || CTRL_LSTICK_DOWN(state))
state = cell_pad_input_poll_device(0);
diff_state = old_state ^ state;
button_was_pressed = old_state & diff_state;
if(IS_TIMER_EXPIRED(gl))
{
settings_action_t action = SETTINGS_ACTION_NOOP;
set_delay = DELAY_NONE;
/* back to ROM menu if CIRCLE is pressed */
if (CTRL_L1(button_was_pressed) || CTRL_CIRCLE(button_was_pressed))
action = SETTINGS_ACTION_TAB_PREVIOUS;
else if (CTRL_R1(button_was_pressed))
action = SETTINGS_ACTION_TAB_NEXT;
else if (CTRL_DOWN(state) || CTRL_LSTICK_DOWN(state))
{
menu_obj->selected++;
if (menu_obj->selected >= menu_obj->max_settings)
menu_obj->selected = menu_obj->first_setting;
if (menu_obj->items[menu_obj->selected].page != menu_obj->page)
menu_obj->page = menu_obj->items[menu_obj->selected].page;
action = SETTINGS_ACTION_DOWN;
set_delay = DELAY_SMALL;
}
else if (CTRL_UP(state) || CTRL_LSTICK_UP(state))
{
action = SETTINGS_ACTION_UP;
set_delay = DELAY_SMALL;
}
/* up to previous setting */
if (CTRL_UP(state) || CTRL_LSTICK_UP(state))
{
if (menu_obj->selected == menu_obj->first_setting)
menu_obj->selected = menu_obj->max_settings-1;
else
menu_obj->selected--;
if (menu_obj->items[menu_obj->selected].page != menu_obj->page)
menu_obj->page = menu_obj->items[menu_obj->selected].page;
set_delay = DELAY_SMALL;
}
if(action != SETTINGS_ACTION_NOOP)
settings_iterate(menu_obj, action);
producesettingentry(menu_obj, menu_obj->selected);
}
@ -1891,44 +1870,24 @@ static void select_setting(menu * menu_obj)
old_state = state;
}
static void select_rom(void)
typedef enum {
MENU_ROMSELECT_ACTION_OK,
MENU_ROMSELECT_ACTION_GOTO_SETTINGS,
MENU_ROMSELECT_ACTION_NOOP,
} menu_romselect_action_t;
static void menu_romselect_iterate(filebrowser_t *filebrowser, menu_romselect_action_t action)
{
char newpath[1024];
uint64_t state, diff_state, button_was_pressed;
gl_t * gl = driver.video_data;
state = cell_pad_input_poll_device(0);
diff_state = old_state ^ state;
button_was_pressed = old_state & diff_state;
browser_update(&browser);
if(IS_TIMER_EXPIRED(gl))
switch(action)
{
if (CTRL_SELECT(button_was_pressed))
{
menuStackindex++;
menuStack[menuStackindex] = menu_generalvideosettings;
}
if (CTRL_START(button_was_pressed))
filebrowser_new(&browser, "/", rarch_console_get_rom_ext());
if (CTRL_CROSS(button_was_pressed))
{
if(path_is_directory(filebrowser_get_current_path(&browser)))
case MENU_ROMSELECT_ACTION_OK:
if(path_is_directory(filebrowser_get_current_path(filebrowser)))
{
/*if 'filename' is in fact '..' - then pop back directory instead of adding '..' to filename path */
if(browser.current_dir.ptr == 0)
{
filebrowser_pop_directory(&browser);
}
filebrowser_iterate(filebrowser, FILEBROWSER_ACTION_CANCEL);
else
{
snprintf(newpath, sizeof(newpath), filebrowser_get_current_path(&browser));
filebrowser_push_directory(&browser, newpath, true);
}
filebrowser_iterate(filebrowser, FILEBROWSER_ACTION_OK);
}
else if (path_file_exists(filebrowser_get_current_path(&browser)))
{
@ -1937,17 +1896,45 @@ static void select_rom(void)
retro_get_system_info(&info);
bool block_zip_extract = info.block_extract;
snprintf(rom_path_temp, sizeof(rom_path_temp), filebrowser_get_current_path(&browser));
snprintf(rom_path_temp, sizeof(rom_path_temp), filebrowser_get_current_path(filebrowser));
if((strstr(rom_path_temp, ".zip") || strstr(rom_path_temp, ".ZIP")) && !block_zip_extract)
rarch_extract_zipfile(rom_path_temp);
else
{
snprintf(g_console.rom_path, sizeof(g_console.rom_path), filebrowser_get_current_path(&browser));
snprintf(g_console.rom_path, sizeof(g_console.rom_path), filebrowser_get_current_path(filebrowser));
rarch_settings_change(S_START_RARCH);
}
}
}
break;
case MENU_ROMSELECT_ACTION_GOTO_SETTINGS:
menuStackindex++;
menuStack[menuStackindex] = menu_generalvideosettings;
break;
}
}
static void select_rom(void)
{
uint64_t state, diff_state, button_was_pressed;
gl_t * gl = driver.video_data;
state = cell_pad_input_poll_device(0);
diff_state = old_state ^ state;
button_was_pressed = old_state & diff_state;
if(IS_TIMER_EXPIRED(gl))
{
browser_update(&browser, rarch_console_get_rom_ext());
menu_romselect_action_t action = MENU_ROMSELECT_ACTION_NOOP;
if (CTRL_SELECT(button_was_pressed))
action = MENU_ROMSELECT_ACTION_GOTO_SETTINGS;
else if (CTRL_CROSS(button_was_pressed))
action = MENU_ROMSELECT_ACTION_OK;
if (action != MENU_ROMSELECT_ACTION_NOOP)
menu_romselect_iterate(&browser, action);
}
if (path_is_directory(filebrowser_get_current_path(&browser)))
@ -2456,7 +2443,10 @@ static void ingame_menu(uint32_t menu_id)
void menu_init (void)
{
filebrowser_new(&browser, g_console.default_rom_startup_dir, rarch_console_get_rom_ext());
filebrowser_set_root(&browser, "/");
filebrowser_set_root(&tmpBrowser, "/");
strlcpy(browser.extensions, rarch_console_get_rom_ext(), sizeof(browser.extensions));
filebrowser_iterate(&browser, FILEBROWSER_ACTION_RESET);
}
void menu_free (void)