#ifndef MENU_H #define MENU_H #include "stdint.h" #include "stdbool.h" #include "display.h" typedef struct _graphical_menu_t graphical_menu_t; typedef struct _menu_entry_size_t menu_entry_size_t; typedef void (*menu_callback_t)(void *const args); /* * Extra draw function is called after the menu entry is drawn * It is used to draw additional graphics on top of the menu entry * It is passed the size of the menu entry and the args */ typedef void (*extra_draw_function_t)(const menu_entry_size_t *const menu_entry_size, void *const args); typedef struct { const char *const title; bool disabled; 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; const extra_draw_function_t extra_draw_function; // called after the menu entry is drawn void *const extra_draw_function_args; } graphical_menu_entry_t; struct _graphical_menu_t { graphical_menu_t *const parent_menu; const uint8_t num_children; uint8_t highlighted_child_idx; graphical_menu_entry_t *const children; }; struct _menu_entry_size_t { const uint16_t x; const uint16_t y; const uint16_t width; const uint16_t height; }; 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