96 lines
2.0 KiB
C
96 lines
2.0 KiB
C
/**
|
|
* Copyright (c) 2021 Dominic Masters
|
|
*
|
|
* This software is released under the MIT License.
|
|
* https://opensource.org/licenses/MIT
|
|
*/
|
|
|
|
#include "menu.h"
|
|
|
|
void menuInit(menu_t *menu) {
|
|
menu->itemCount = 0;
|
|
menu->selected = 0;
|
|
menu->cursorX = 0;
|
|
menu->cursorY = 0;
|
|
menu->user = NULL;
|
|
menu->onSelect = NULL;
|
|
}
|
|
|
|
void menuUpdate(menu_t *menu, engine_t *engine) {
|
|
menuitem_t *current;
|
|
menuitem_t *item;
|
|
uint8_t x, y, i, j;
|
|
|
|
current = menu->items + menu->selected;
|
|
|
|
if(inputIsPressed(&engine->input, INPUT_ACCEPT)) {
|
|
if(menu->onSelect != NULL) {
|
|
menu->onSelect(menu->user, menu->selected);
|
|
}
|
|
return;
|
|
}
|
|
|
|
// Handle press binds.
|
|
if(inputIsPressed(&engine->input, INPUT_DOWN)) {
|
|
x = 0;
|
|
y = 1;
|
|
} else if(inputIsPressed(&engine->input, INPUT_UP)) {
|
|
x = 0;
|
|
y = -1;
|
|
} else if(inputIsPressed(&engine->input, INPUT_LEFT)) {
|
|
x = -1;
|
|
y = 0;
|
|
} else if(inputIsPressed(&engine->input, INPUT_RIGHT)) {
|
|
x = 1;
|
|
y = 0;
|
|
} else {
|
|
x = 0;
|
|
y = 0;
|
|
}
|
|
|
|
// Update cursor positions
|
|
if(x != 0 || y != 0) {
|
|
if(x > 0) {
|
|
menu->cursorX = (current->x + current->width - 1) + x;
|
|
} else if(x < 0) {
|
|
menu->cursorX = current->x + x;
|
|
}
|
|
|
|
if(y > 0) {
|
|
menu->cursorY = (current->y + current->height - 1) + y;
|
|
} else if(y < 0) {
|
|
menu->cursorY = current->y + y;
|
|
}
|
|
|
|
// Get the item selected
|
|
j = MENU_ITEMS_MAX;
|
|
for(i = 0; i < menu->itemCount; i++) {
|
|
if(i == menu->selected) continue;
|
|
item = menu->items + i;
|
|
|
|
if(
|
|
item->x > menu->cursorX || (item->x+item->width-1) < menu->cursorX ||
|
|
item->y > menu->cursorY || (item->y+item->height-1) < menu->cursorY
|
|
) continue;
|
|
|
|
j = i;
|
|
break;
|
|
}
|
|
|
|
// Was a target found?
|
|
if(j == MENU_ITEMS_MAX) return;
|
|
menu->selected = j;
|
|
}
|
|
}
|
|
|
|
menuitem_t * menuAdd(menu_t *menu) {
|
|
menuitem_t *item = menu->items + menu->itemCount;
|
|
|
|
item->x = 0;
|
|
item->y = 0;
|
|
item->width = 1;
|
|
item->height = 1;
|
|
|
|
menu->itemCount++;
|
|
return item;
|
|
} |