menu.c 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. #include "menu.h"
  2. void add_menu(Menu *menu, const char *name, void (*callback)(void *)) {
  3. MenuItem *items = menu->items;
  4. menu->items = malloc(sizeof(MenuItem) * (menu->menu_count + 1));
  5. for (uint8_t i = 0; i < menu->menu_count; i++) {
  6. menu->items[i] = items[i];
  7. }
  8. free(items);
  9. menu->items[menu->menu_count] = (MenuItem) {name, true, callback};
  10. menu->menu_count++;
  11. }
  12. void free_menu(Menu *menu) {
  13. free(menu->items);
  14. free(menu);
  15. }
  16. void set_menu_state(Menu *menu, uint8_t index, bool state) {
  17. if (menu->menu_count > index) {
  18. menu->items[index].enabled = state;
  19. }
  20. if(!state && menu->current_menu==index)
  21. move_menu(menu, 1);
  22. }
  23. void move_menu(Menu *menu, int8_t direction) {
  24. if (!menu->enabled) return;
  25. int max = menu->menu_count;
  26. for (int8_t i = 0; i < max; i++) {
  27. 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);
  28. if (direction < 0 && menu->current_menu == 0) {
  29. menu->current_menu = menu->menu_count - 1;
  30. } else {
  31. menu->current_menu = (menu->current_menu + direction) % menu->menu_count;
  32. }
  33. FURI_LOG_D("MENU", "After process current %i, direction %i, state %i", menu->current_menu,direction,menu->items[menu->current_menu].enabled?1:0);
  34. if (menu->items[menu->current_menu].enabled) {
  35. FURI_LOG_D("MENU", "Next menu %i", menu->current_menu);
  36. return;
  37. }
  38. }
  39. FURI_LOG_D("MENU", "Not found, setting false");
  40. menu->enabled = false;
  41. }
  42. void activate_menu(Menu *menu, void *state) {
  43. if (!menu->enabled) return;
  44. menu->items[menu->current_menu].callback(state);
  45. }
  46. void render_menu(Menu *menu, Canvas *canvas, uint8_t pos_x, uint8_t pos_y) {
  47. if (!menu->enabled) return;
  48. canvas_set_color(canvas, ColorWhite);
  49. canvas_draw_rbox(canvas, pos_x, pos_y, menu->menu_width + 2, 10, 2);
  50. uint8_t w = pos_x+menu->menu_width;
  51. uint8_t h = pos_y+10;
  52. uint8_t p1x = pos_x+2;
  53. uint8_t p2x = pos_x+menu->menu_width-2;
  54. uint8_t p1y = pos_y+2;
  55. uint8_t p2y = pos_y+8;
  56. canvas_set_color(canvas, ColorBlack);
  57. canvas_draw_line(canvas, p1x, pos_y, p2x, pos_y);
  58. canvas_draw_line(canvas, p1x, h, p2x, h);
  59. canvas_draw_line(canvas, pos_x, p1y, pos_x, p2y);
  60. canvas_draw_line(canvas, w, p1y, w, p2y);
  61. canvas_draw_dot(canvas, pos_x+1, pos_y+1);
  62. canvas_draw_dot(canvas, w-1, pos_y+1);
  63. canvas_draw_dot(canvas, w-1, h-1);
  64. canvas_draw_dot(canvas, pos_x+1, h-1);
  65. // canvas_draw_rbox(canvas, pos_x, pos_y, menu->menu_width + 2, 10, 2);
  66. canvas_set_font(canvas, FontSecondary);
  67. canvas_draw_str_aligned(canvas, pos_x + menu->menu_width / 2, pos_y + 6, AlignCenter, AlignCenter,
  68. menu->items[menu->current_menu].name);
  69. //9*5
  70. int center = pos_x + menu->menu_width / 2;
  71. for(uint8_t i=0;i<4;i++){
  72. for(int8_t j = -i; j<=i;j++){
  73. canvas_draw_dot(canvas, center+j, pos_y-4+i);
  74. canvas_draw_dot(canvas, center+j, pos_y+14-i);
  75. }
  76. }
  77. }