unleashed-firmware/applications/external/solitaire/common/menu.h
2023-03-15 01:25:18 +03:00

77 lines
No EOL
2.2 KiB
C

#pragma once
#include <furi.h>
#include <gui/gui.h>
typedef struct {
const char* name; //Name of the menu
bool enabled; //Is the menu item enabled (it will not render, you cannot select it)
void (*callback)(
void* state); //Callback for when the activate_menu is called while this menu is selected
} MenuItem;
typedef struct {
MenuItem* items; //list of menu items
uint8_t menu_count; //count of menu items (do not change)
uint8_t current_menu; //currently selected menu item
uint8_t menu_width; //width of the menu
bool enabled; //is the menu enabled (it will not render and accept events when disabled)
} Menu;
/**
* Cleans up the pointers used by the menu
*
* @param menu Pointer of the menu to clean up
*/
void free_menu(Menu* menu);
/**
* Add a new menu item
*
* @param menu Pointer of the menu
* @param name Name of the menu item
* @param callback Callback called on activation
*/
void add_menu(Menu* menu, const char* name, void (*callback)(void*));
/**
* Setting menu item to be enabled/disabled
*
* @param menu Pointer of the menu
* @param index Menu index to set
* @param state Enabled (true), Disabled(false)
*/
void set_menu_state(Menu* menu, uint8_t index, bool state);
/**
* Moves selection up or down
*
* @param menu Pointer of the menu
* @param direction Direction to move -1 down, 1 up
*/
void move_menu(Menu* menu, int8_t direction);
/**
* Triggers the current menu callback
*
* @param menu Pointer of the menu
* @param state Usually your application state
*/
void activate_menu(Menu* menu, void* state);
/**
* Renders the menu at a coordinate (call it in your render function).
*
* Keep in mind that Flipper has a 128x64 pixel screen resolution and the coordinate
* you give is the menu's rectangle top-left corner (arrows not included).
* The rectangle height is 10 px, the arrows have a 4 pixel height. Space needed is 18px.
* The width of the menu can be configured in the menu object.
*
*
* @param menu Pointer of the menu
* @param canvas Flippers Canvas pointer
* @param pos_x X position to draw
* @param pos_y Y position to draw
*/
void render_menu(Menu* menu, Canvas* canvas, uint8_t pos_x, uint8_t pos_y);