Refactors

This commit is contained in:
twinaphex 2015-08-18 03:51:44 +02:00
parent 6bbc2dd83d
commit f190230f85
2 changed files with 56 additions and 44 deletions

View File

@ -86,6 +86,17 @@ typedef struct
char scratch_buf[PATH_MAX_LENGTH];
char scratch2_buf[PATH_MAX_LENGTH];
struct
{
bool fb_is_dirty;
bool do_messagebox;
bool do_pop_stack;
bool do_post_iterate;
bool do_render;
size_t *pop_selected;
char msg[PATH_MAX_LENGTH];
} state;
/* Menu display */
menu_display_t display;

View File

@ -415,16 +415,9 @@ static enum action_iterate_type action_iterate_type(uint32_t hash)
int menu_iterate_main(unsigned action)
{
menu_entry_t entry;
char msg[PATH_MAX_LENGTH] = {0};
enum action_iterate_type iterate_type;
size_t selected;
size_t *pop_selected = NULL;
const char *label = NULL;
bool fb_is_dirty = false;
bool do_messagebox = false;
bool do_pop_stack = false;
bool do_post_iterate = false;
bool do_render = false;
int ret = 0;
uint32_t hash = 0;
const menu_ctx_driver_t *driver = menu_ctx_driver_get_ptr();
@ -437,50 +430,58 @@ int menu_iterate_main(unsigned action)
if (!menu || !menu_list)
return 0;
menu->state.fb_is_dirty = false;
menu->state.do_messagebox = false;
menu->state.do_render = false;
menu->state.do_pop_stack = false;
menu->state.do_post_iterate = false;
menu->state.pop_selected = NULL;
menu->state.msg[0] = '\0';
hash = menu_hash_calculate(label);
iterate_type = action_iterate_type(hash);
if (action != MENU_ACTION_NOOP || menu_entries_needs_refresh() || menu_display_update_pending())
fb_is_dirty = true;
menu->state.fb_is_dirty = true;
switch (iterate_type)
{
case ITERATE_TYPE_HELP:
ret = action_iterate_help(msg, sizeof(msg), label);
do_render = true;
pop_selected = NULL;
do_messagebox = true;
do_pop_stack = true;
do_post_iterate = true;
ret = action_iterate_help(menu->state.msg, sizeof(menu->state.msg), label);
menu->state.do_render = true;
menu->state.pop_selected = NULL;
menu->state.do_messagebox = true;
menu->state.do_pop_stack = true;
menu->state.do_post_iterate = true;
if (ret == 1)
action = MENU_ACTION_OK;
break;
case ITERATE_TYPE_BIND:
if (menu_input_bind_iterate(msg, sizeof(msg)))
if (menu_input_bind_iterate(menu->state.msg, sizeof(menu->state.msg)))
menu_list_pop_stack(menu_list);
else
do_messagebox = true;
do_render = true;
menu->state.do_messagebox = true;
menu->state.do_render = true;
break;
case ITERATE_TYPE_VIEWPORT:
ret = action_iterate_menu_viewport(msg, sizeof(msg), label, action, hash);
do_render = true;
do_messagebox = true;
ret = action_iterate_menu_viewport(menu->state.msg, sizeof(menu->state.msg), label, action, hash);
menu->state.do_render = true;
menu->state.do_messagebox = true;
break;
case ITERATE_TYPE_INFO:
ret = action_iterate_info(msg, sizeof(msg), label);
pop_selected = &nav->selection_ptr;
do_render = true;
do_messagebox = true;
do_pop_stack = true;
do_post_iterate = true;
ret = action_iterate_info(menu->state.msg, sizeof(menu->state.msg), label);
menu->state.pop_selected = &nav->selection_ptr;
menu->state.do_render = true;
menu->state.do_messagebox = true;
menu->state.do_pop_stack = true;
menu->state.do_post_iterate = true;
break;
case ITERATE_TYPE_MESSAGE:
strlcpy(msg, disp->message_contents, sizeof(msg));
pop_selected = &nav->selection_ptr;
do_messagebox = true;
do_pop_stack = true;
strlcpy(menu->state.msg, disp->message_contents, sizeof(menu->state.msg));
menu->state.pop_selected = &nav->selection_ptr;
menu->state.do_messagebox = true;
menu->state.do_pop_stack = true;
break;
case ITERATE_TYPE_DEFAULT:
selected = menu_navigation_get_current_selection();
@ -493,8 +494,8 @@ int menu_iterate_main(unsigned action)
if (ret)
return ret;
do_post_iterate = true;
do_render = true;
menu->state.do_post_iterate = true;
menu->state.do_render = true;
/* Have to defer it so we let settings refresh. */
if (menu->push_help_screen)
@ -511,28 +512,28 @@ int menu_iterate_main(unsigned action)
break;
}
if (fb_is_dirty != do_messagebox)
fb_is_dirty = true;
if (menu->state.fb_is_dirty != menu->state.do_messagebox)
menu->state.fb_is_dirty = true;
if (fb_is_dirty)
if (menu->state.fb_is_dirty)
menu_display_fb_set_dirty();
if (do_messagebox && msg[0] != '\0')
if (menu->state.do_messagebox && menu->state.msg[0] != '\0')
{
const ui_companion_driver_t *ui = ui_companion_get_ptr();
if (driver->render_messagebox && msg[0] != '\0')
driver->render_messagebox(msg);
if (ui->render_messagebox && msg[0] != '\0')
ui->render_messagebox(msg);
if (driver->render_messagebox && menu->state.msg[0] != '\0')
driver->render_messagebox(menu->state.msg);
if (ui->render_messagebox && menu->state.msg[0] != '\0')
ui->render_messagebox(menu->state.msg);
}
if (do_pop_stack && action == MENU_ACTION_OK)
menu_list_pop(menu_list->menu_stack, pop_selected);
if (menu->state.do_pop_stack && action == MENU_ACTION_OK)
menu_list_pop(menu_list->menu_stack, menu->state.pop_selected);
if (do_post_iterate)
if (menu->state.do_post_iterate)
menu_input_post_iterate(&ret, action);
if (do_render)
if (menu->state.do_render)
{
if (driver->render)
driver->render();