mirror of
https://github.com/DarkFlippers/unleashed-firmware
synced 2024-11-30 16:29:12 +00:00
77 lines
No EOL
2.2 KiB
C
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); |