Files
ui-library-playground/Core/Inc/graphics/menu.h
2026-01-16 16:28:00 -05:00

64 lines
2.4 KiB
C

#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);
/*
* Add a toggle switch to the menu entry
* It is used to draw additional graphics on top of the menu entry
* Arguments:
* - menu_entry_size: the size of the menu entry
* - toggle_switch_value: (bool *) the value of the toggle switch
*
* Can be used as a callback function for the extra_draw_function field in the graphical_menu_entry_t struct
* This is why toggle_switch_value is a void pointer and not a bool pointer
*/
void add_toggle_switch_to_menu_entry(const menu_entry_size_t *const menu_entry_size, void *const toggle_switch_value);
#endif