#ifndef MENU_H #define MENU_H #include "stdint.h" #include "stdbool.h" #include "display.h" typedef void (*menu_callback_t)(void *args); typedef struct _graphical_menu_layout_t graphical_menu_layout_t; typedef struct _graphical_menu_t graphical_menu_t; // TODO // typedef struct { // uint16_t x; // uint16_t y; // uint16_t width; // uint16_t height; // } graphical_menu_position_t; typedef struct { const char *const title; const bool enabled; // not enabled = grayed out, unhighlightable const menu_callback_t highlighted_callback_function; void *const highlighted_callback_function_args; const menu_callback_t selected_callback_function; void *const selected_callback_function_args; } graphical_menu_entry_t; struct _graphical_menu_layout_t { graphical_menu_t *const parent_menu; const uint8_t num_entries; const graphical_menu_entry_t *const entries; }; struct _graphical_menu_t { const graphical_menu_layout_t *const layout; uint8_t selected_entry_idx; }; void draw_menu(volatile pixel_t *const framebuffer, const graphical_menu_t *const menu); void partial_redraw_menu(volatile pixel_t *const framebuffer, graphical_menu_t *const menu, uint8_t old_highlighted_entry_idx, uint8_t new_highlighted_entry_idx); void select_menu_entry(graphical_menu_t *const menu); void set_selected_menu_entry_idx(volatile pixel_t *const framebuffer, graphical_menu_t *const menu, uint8_t idx); void decrement_selected_menu_entry_idx(volatile pixel_t *const framebuffer, graphical_menu_t *const menu); void increment_selected_menu_entry_idx(volatile pixel_t *const framebuffer, graphical_menu_t *const menu); #endif