Files
ui-library-playground/Core/Src/graphics/menu.c
Dylan Smith b48cb11197 Menu work
2026-01-15 15:53:02 -05:00

99 lines
3.2 KiB
C

#include "menu.h"
#include "graphics.h"
#include "fonts/font.h"
#include "display.h"
#include "ui.h"
void draw_menu(const graphical_menu_t *const menu)
{
const uint16_t entry_height = 40;
const uint16_t padding_x = 10;
const uint16_t padding_y = 0;
const pixel_t enabled_text_color = MAKE_PIXEL(0, 0, 0);
const pixel_t disabled_text_color = MAKE_PIXEL(128, 128, 128);
const pixel_t entry_bg_color = MAKE_PIXEL(255, 255, 255);
const pixel_t highlighted_bg_color = MAKE_PIXEL(0, 0, 0);
const pixel_t highlighted_text_color = MAKE_PIXEL(255, 255, 0);
DrawBox(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, entry_bg_color);
for (uint8_t i = 0; i < menu->layout->num_entries; i++)
{
const uint16_t y_pos = i * entry_height;
const graphical_menu_entry_t *entry = &menu->layout->entries[i];
const bool is_highlighted = (i == menu->selected_entry_idx) && entry->enabled;
// Draw entry background - use highlighted color if this is the selected entry
pixel_t bg_color = is_highlighted ? highlighted_bg_color : entry_bg_color;
DrawBox(0, y_pos, DISPLAY_WIDTH, entry_height, bg_color);
// Draw entry text - use highlighted color if selected, otherwise use enabled/disabled color
pixel_t text_color;
if (is_highlighted)
{
text_color = highlighted_text_color;
}
else
{
text_color = entry->enabled ? enabled_text_color : disabled_text_color;
}
// Calculate baseline from top position: baseline = top + (line_height - base_line)
const uint16_t text_baseline_y = y_pos + padding_y + (roboto_bold_font.line_height - roboto_bold_font.base_line);
draw_string((pixel_t *)framebuffer, &runescape_font,
padding_x, text_baseline_y,
entry->title, text_color);
}
}
void select_menu_entry(graphical_menu_t *const menu)
{
// Ensure selected_entry_idx is within bounds
if (menu->selected_entry_idx >= menu->layout->num_entries)
{
return;
}
const graphical_menu_entry_t *entry = &menu->layout->entries[menu->selected_entry_idx];
// Only select if the entry is enabled
if (entry->enabled && entry->selected_callback_function != NULL)
{
entry->selected_callback_function(entry->selected_callback_function_args);
}
}
void set_selected_menu_entry_idx(graphical_menu_t *const menu, int8_t idx)
{
// Only allow selecting enabled entries
while (!menu->layout->entries[idx].enabled)
{
if (idx >menu->selected_entry_idx)
{
idx--;
}
else
{
idx++;
}
}
// Clamp the index to valid range
if (idx < 0 || idx >= menu->layout->num_entries)
{
idx = menu->layout->num_entries > 0 ? menu->layout->num_entries - 1 : 0;
}
menu->selected_entry_idx = idx;
ui_request_redraw();
}
void decrement_selected_menu_entry_idx(graphical_menu_t *const menu)
{
set_selected_menu_entry_idx(menu, menu->selected_entry_idx - 1);
}
void increment_selected_menu_entry_idx(graphical_menu_t *const menu)
{
set_selected_menu_entry_idx(menu, menu->selected_entry_idx + 1);
}