Deduplicate more main menu input code

This commit is contained in:
Willy-JL
2023-07-29 23:27:36 +02:00
parent 1e64419d9e
commit a562b09aff

View File

@@ -410,7 +410,19 @@ void menu_set_selected_item(Menu* menu, uint32_t index) {
menu->view, menu->view,
MenuModel * model, MenuModel * model,
{ {
if(index < MenuItemArray_size(model->items)) { if(index < MenuItemArray_size(model->items) && index != model->position) {
model->scroll_counter = 0;
MenuItem* item = MenuItemArray_get(model->items, model->position);
if(item && item->icon) {
icon_animation_stop(item->icon);
}
item = MenuItemArray_get(model->items, index);
if(item && item->icon) {
icon_animation_start(item->icon);
}
model->position = index; model->position = index;
} }
}, },
@@ -418,208 +430,178 @@ void menu_set_selected_item(Menu* menu, uint32_t index) {
} }
static void menu_process_up(Menu* menu) { static void menu_process_up(Menu* menu) {
MenuStyle menu_style = XTREME_SETTINGS()->menu_style; size_t position;
if(menu_style == MenuStyleDsi || menu_style == MenuStyleVertical) return;
with_view_model( with_view_model(
menu->view, menu->view,
MenuModel * model, MenuModel * model,
{ {
model->scroll_counter = 0; position = model->position;
size_t count = MenuItemArray_size(model->items); size_t count = MenuItemArray_size(model->items);
MenuItem* item = MenuItemArray_get(model->items, model->position); size_t vertical_offset = model->vertical_offset;
if(item && item->icon) {
icon_animation_stop(item->icon);
}
switch(menu_style) { switch(XTREME_SETTINGS()->menu_style) {
case MenuStyleList: case MenuStyleList:
if(model->position > 0) { if(position > 0) {
model->position--; position--;
if(model->vertical_offset && model->vertical_offset == model->position) { if(vertical_offset && vertical_offset == position) {
model->vertical_offset--; vertical_offset--;
} }
} else { } else {
model->position = count - 1; position = count - 1;
model->vertical_offset = count - 8; vertical_offset = count - 8;
} }
break; break;
case MenuStyleWii: case MenuStyleWii:
if(model->position % 2 || (model->position == count - 1 && count % 2)) { if(position % 2 || (position == count - 1 && count % 2)) {
model->position--; position--;
} else { } else {
model->position++; position++;
} }
model->vertical_offset = vertical_offset = CLAMP(MAX((int)position - 4, 0), MAX((int)count - 8, 0), 0);
CLAMP(MAX((int)model->position - 4, 0), MAX((int)count - 8, 0), 0);
break; break;
default: default:
break; break;
} }
item = MenuItemArray_get(model->items, model->position); model->vertical_offset = vertical_offset;
if(item && item->icon) {
icon_animation_start(item->icon);
}
}, },
true); false);
menu_set_selected_item(menu, position);
} }
static void menu_process_down(Menu* menu) { static void menu_process_down(Menu* menu) {
MenuStyle menu_style = XTREME_SETTINGS()->menu_style; size_t position;
if(menu_style == MenuStyleDsi || menu_style == MenuStyleVertical) return;
with_view_model( with_view_model(
menu->view, menu->view,
MenuModel * model, MenuModel * model,
{ {
model->scroll_counter = 0; position = model->position;
size_t count = MenuItemArray_size(model->items); size_t count = MenuItemArray_size(model->items);
MenuItem* item = MenuItemArray_get(model->items, model->position); size_t vertical_offset = model->vertical_offset;
if(item && item->icon) {
icon_animation_stop(item->icon);
}
switch(menu_style) { switch(XTREME_SETTINGS()->menu_style) {
case MenuStyleList: case MenuStyleList:
if(model->position < count - 1) { if(position < count - 1) {
model->position++; position++;
if(model->vertical_offset < count - 8 && if(vertical_offset < count - 8 && vertical_offset == position - 7) {
model->vertical_offset == model->position - 7) { vertical_offset++;
model->vertical_offset++;
} }
} else { } else {
model->position = 0; position = 0;
model->vertical_offset = 0; vertical_offset = 0;
} }
break; break;
case MenuStyleWii: case MenuStyleWii:
if(model->position % 2 || (model->position == count - 1 && count % 2)) { if(position % 2 || (position == count - 1 && count % 2)) {
model->position--; position--;
} else { } else {
model->position++; position++;
} }
model->vertical_offset = vertical_offset = CLAMP(MAX((int)position - 4, 0), MAX((int)count - 8, 0), 0);
CLAMP(MAX((int)model->position - 4, 0), MAX((int)count - 8, 0), 0);
break; break;
default: default:
break; break;
} }
item = MenuItemArray_get(model->items, model->position); model->vertical_offset = vertical_offset;
if(item && item->icon) {
icon_animation_start(item->icon);
}
}, },
true); false);
menu_set_selected_item(menu, position);
} }
static void menu_process_left(Menu* menu) { static void menu_process_left(Menu* menu) {
MenuStyle menu_style = XTREME_SETTINGS()->menu_style; size_t position;
if(menu_style == MenuStyleList) return;
with_view_model( with_view_model(
menu->view, menu->view,
MenuModel * model, MenuModel * model,
{ {
model->scroll_counter = 0; position = model->position;
size_t count = MenuItemArray_size(model->items); size_t count = MenuItemArray_size(model->items);
MenuItem* item = MenuItemArray_get(model->items, model->position); size_t vertical_offset = model->vertical_offset;
if(item && item->icon) {
icon_animation_stop(item->icon);
}
switch(menu_style) { switch(XTREME_SETTINGS()->menu_style) {
case MenuStyleWii: case MenuStyleWii:
if(model->position < 2) { if(position < 2) {
if(count % 2) { if(count % 2) {
model->position = count - 1; position = count - 1;
} else { } else {
model->position = count - 2 + model->position % 2; position = count - 2 + position % 2;
} }
} else { } else {
model->position -= 2; position -= 2;
} }
model->vertical_offset = vertical_offset = CLAMP(MAX((int)position - 4, 0), MAX((int)count - 8, 0), 0);
CLAMP(MAX((int)model->position - 4, 0), MAX((int)count - 8, 0), 0);
break; break;
case MenuStyleDsi: case MenuStyleDsi:
case MenuStyleVertical: case MenuStyleVertical:
if(model->position > 0) { if(position > 0) {
model->position--; position--;
if(model->vertical_offset && model->vertical_offset == model->position) { if(vertical_offset && vertical_offset == position) {
model->vertical_offset--; vertical_offset--;
} }
} else { } else {
model->position = count - 1; position = count - 1;
model->vertical_offset = count - 8; vertical_offset = count - 8;
} }
break; break;
default: default:
break; break;
} }
item = MenuItemArray_get(model->items, model->position); model->vertical_offset = vertical_offset;
if(item && item->icon) {
icon_animation_start(item->icon);
}
}, },
true); false);
menu_set_selected_item(menu, position);
} }
static void menu_process_right(Menu* menu) { static void menu_process_right(Menu* menu) {
MenuStyle menu_style = XTREME_SETTINGS()->menu_style; size_t position;
if(menu_style == MenuStyleList) return;
with_view_model( with_view_model(
menu->view, menu->view,
MenuModel * model, MenuModel * model,
{ {
model->scroll_counter = 0; position = model->position;
size_t count = MenuItemArray_size(model->items); size_t count = MenuItemArray_size(model->items);
MenuItem* item = MenuItemArray_get(model->items, model->position); size_t vertical_offset = model->vertical_offset;
if(item && item->icon) {
icon_animation_stop(item->icon);
}
switch(menu_style) { switch(XTREME_SETTINGS()->menu_style) {
case MenuStyleWii: case MenuStyleWii:
if(count % 2) { if(count % 2) {
if(model->position == count - 1) { if(position == count - 1) {
model->position = 0; position = 0;
} else if(model->position == count - 2) { } else if(position == count - 2) {
model->position = count - 1; position = count - 1;
} else { } else {
model->position += 2; position += 2;
} }
} else { } else {
model->position += 2; position += 2;
if(model->position >= count) { if(position >= count) {
model->position = model->position % 2; position = position % 2;
} }
} }
model->vertical_offset = vertical_offset = CLAMP(MAX((int)position - 4, 0), MAX((int)count - 8, 0), 0);
CLAMP(MAX((int)model->position - 4, 0), MAX((int)count - 8, 0), 0);
break; break;
case MenuStyleDsi: case MenuStyleDsi:
case MenuStyleVertical: case MenuStyleVertical:
if(model->position < count - 1) { if(position < count - 1) {
model->position++; position++;
if(model->vertical_offset < count - 8 && if(vertical_offset < count - 8 && vertical_offset == position - 7) {
model->vertical_offset == model->position - 7) { vertical_offset++;
model->vertical_offset++;
} }
} else { } else {
model->position = 0; position = 0;
model->vertical_offset = 0; vertical_offset = 0;
} }
break; break;
default: default:
break; break;
} }
item = MenuItemArray_get(model->items, model->position); model->vertical_offset = vertical_offset;
if(item && item->icon) {
icon_animation_start(item->icon);
}
}, },
true); false);
menu_set_selected_item(menu, position);
} }
static void menu_process_ok(Menu* menu) { static void menu_process_ok(Menu* menu) {