Dawn/src/ui/menulist.c

87 lines
1.6 KiB
C

/**
* Copyright (c) 2021 Dominic Masters
*
* This software is released under the MIT License.
* https://opensource.org/licenses/MIT
*/
#include "menulist.h"
void menuListInit(menulist_t *ml, texture_t *texture) {
uint8_t i;
ml->x = 0;
ml->y = 0;
ml->count = 0;
frameInit(&ml->frame);
ml->frame.texture = texture;
}
uint8_t menuListAdd(menulist_t *ml, font_t *font, char *text) {
uint8_t i;
label_t *label;
menuitem_t *item;
// Get the variables.
i = ml->count;
label = ml->labels + i;
ml->items[i] = text;
// Initialize the label.
labelInit(label);
labelSetText(label, font, text);
// Reize the frame
frameSetInnerSize(
&ml->frame,
100,
FONT_LINE_HEIGHT * fontGetScale(label->fontSize) * (i+1)
);
// Add Menu Item
item = menuAdd(&ml->menu);
item->width = 1;
item->height = 1;
item->x = 0;
item->y = i;
ml->count++;
return i;
}
void menuListUpdate(menulist_t *ml, engine_t *engine) {
menuUpdate(&ml->menu, engine);
}
void menuListRender(menulist_t *ml, shader_t *shader) {
uint8_t i;
label_t *label;
// Render the frame
ml->frame.x = ml->x;
ml->frame.y = ml->y;
frameRender(&ml->frame, shader);
// Render selection box.
// Render each labels
for(i = 0; i < ml->count; i++) {
label = ml->labels + i;
label->x = FRAME_BORDER_SIZE;
if(ml->menu.selected == i) label->x += 4;
label->y = FRAME_BORDER_SIZE + (
i * FONT_LINE_HEIGHT * fontGetScale(label->fontSize)
);
labelRender(label, shader);
}
}
void menuListDispose(menulist_t *ml) {
uint8_t i;
for(i = 0; i < ml->count; i++) {
labelDispose(ml->labels + i);
}
frameDispose(&ml->frame);
}