#include "menu.h" void add_menu(Menu* menu, const char* name, void (*callback)(void*)) { MenuItem* items = menu->items; menu->items = malloc(sizeof(MenuItem) * (menu->menu_count + 1)); for(uint8_t i = 0; i < menu->menu_count; i++) { menu->items[i] = items[i]; } free(items); menu->items[menu->menu_count] = (MenuItem){name, true, callback}; menu->menu_count++; } void free_menu(Menu* menu) { free(menu->items); free(menu); } void set_menu_state(Menu* menu, uint8_t index, bool state) { if(menu->menu_count > index) { menu->items[index].enabled = state; } if(!state && menu->current_menu == index) move_menu(menu, 1); } void move_menu(Menu* menu, int8_t direction) { if(!menu->enabled) return; int max = menu->menu_count; for(int8_t i = 0; i < max; i++) { FURI_LOG_D( "MENU", "Iteration %i, current %i, direction %i, state %i", i, menu->current_menu, direction, menu->items[menu->current_menu].enabled ? 1 : 0); if(direction < 0 && menu->current_menu == 0) { menu->current_menu = menu->menu_count - 1; } else { menu->current_menu = (menu->current_menu + direction) % menu->menu_count; } FURI_LOG_D( "MENU", "After process current %i, direction %i, state %i", menu->current_menu, direction, menu->items[menu->current_menu].enabled ? 1 : 0); if(menu->items[menu->current_menu].enabled) { FURI_LOG_D("MENU", "Next menu %i", menu->current_menu); return; } } FURI_LOG_D("MENU", "Not found, setting false"); menu->enabled = false; } void activate_menu(Menu* menu, void* state) { if(!menu->enabled) return; menu->items[menu->current_menu].callback(state); } void render_menu(Menu* menu, Canvas* canvas, uint8_t pos_x, uint8_t pos_y) { if(!menu->enabled) return; canvas_set_color(canvas, ColorWhite); canvas_draw_rbox(canvas, pos_x, pos_y, menu->menu_width + 2, 10, 2); uint8_t w = pos_x + menu->menu_width; uint8_t h = pos_y + 10; uint8_t p1x = pos_x + 2; uint8_t p2x = pos_x + menu->menu_width - 2; uint8_t p1y = pos_y + 2; uint8_t p2y = pos_y + 8; canvas_set_color(canvas, ColorBlack); canvas_draw_line(canvas, p1x, pos_y, p2x, pos_y); canvas_draw_line(canvas, p1x, h, p2x, h); canvas_draw_line(canvas, pos_x, p1y, pos_x, p2y); canvas_draw_line(canvas, w, p1y, w, p2y); canvas_draw_dot(canvas, pos_x + 1, pos_y + 1); canvas_draw_dot(canvas, w - 1, pos_y + 1); canvas_draw_dot(canvas, w - 1, h - 1); canvas_draw_dot(canvas, pos_x + 1, h - 1); // canvas_draw_rbox(canvas, pos_x, pos_y, menu->menu_width + 2, 10, 2); canvas_set_font(canvas, FontSecondary); canvas_draw_str_aligned( canvas, pos_x + menu->menu_width / 2, pos_y + 6, AlignCenter, AlignCenter, menu->items[menu->current_menu].name); //9*5 int center = pos_x + menu->menu_width / 2; for(uint8_t i = 0; i < 4; i++) { for(int8_t j = -i; j <= i; j++) { canvas_draw_dot(canvas, center + j, pos_y - 4 + i); canvas_draw_dot(canvas, center + j, pos_y + 14 - i); } } }