menu.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  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) move_menu(menu, 1);
  21. }
  22. void move_menu(Menu* menu, int8_t direction) {
  23. if(!menu->enabled) return;
  24. int max = menu->menu_count;
  25. for(int8_t i = 0; i < max; i++) {
  26. FURI_LOG_D(
  27. "MENU",
  28. "Iteration %i, current %i, direction %i, state %i",
  29. i,
  30. menu->current_menu,
  31. direction,
  32. menu->items[menu->current_menu].enabled ? 1 : 0);
  33. if(direction < 0 && menu->current_menu == 0) {
  34. menu->current_menu = menu->menu_count - 1;
  35. } else {
  36. menu->current_menu = (menu->current_menu + direction) % menu->menu_count;
  37. }
  38. FURI_LOG_D(
  39. "MENU",
  40. "After process current %i, direction %i, state %i",
  41. menu->current_menu,
  42. direction,
  43. menu->items[menu->current_menu].enabled ? 1 : 0);
  44. if(menu->items[menu->current_menu].enabled) {
  45. FURI_LOG_D("MENU", "Next menu %i", menu->current_menu);
  46. return;
  47. }
  48. }
  49. FURI_LOG_D("MENU", "Not found, setting false");
  50. menu->enabled = false;
  51. }
  52. void activate_menu(Menu* menu, void* state) {
  53. if(!menu->enabled) return;
  54. menu->items[menu->current_menu].callback(state);
  55. }
  56. void render_menu(Menu* menu, Canvas* canvas, uint8_t pos_x, uint8_t pos_y) {
  57. if(!menu->enabled) return;
  58. canvas_set_color(canvas, ColorWhite);
  59. canvas_draw_rbox(canvas, pos_x, pos_y, menu->menu_width + 2, 10, 2);
  60. uint8_t w = pos_x + menu->menu_width;
  61. uint8_t h = pos_y + 10;
  62. uint8_t p1x = pos_x + 2;
  63. uint8_t p2x = pos_x + menu->menu_width - 2;
  64. uint8_t p1y = pos_y + 2;
  65. uint8_t p2y = pos_y + 8;
  66. canvas_set_color(canvas, ColorBlack);
  67. canvas_draw_line(canvas, p1x, pos_y, p2x, pos_y);
  68. canvas_draw_line(canvas, p1x, h, p2x, h);
  69. canvas_draw_line(canvas, pos_x, p1y, pos_x, p2y);
  70. canvas_draw_line(canvas, w, p1y, w, p2y);
  71. canvas_draw_dot(canvas, pos_x + 1, pos_y + 1);
  72. canvas_draw_dot(canvas, w - 1, pos_y + 1);
  73. canvas_draw_dot(canvas, w - 1, h - 1);
  74. canvas_draw_dot(canvas, pos_x + 1, h - 1);
  75. // canvas_draw_rbox(canvas, pos_x, pos_y, menu->menu_width + 2, 10, 2);
  76. canvas_set_font(canvas, FontSecondary);
  77. canvas_draw_str_aligned(
  78. canvas,
  79. pos_x + menu->menu_width / 2,
  80. pos_y + 6,
  81. AlignCenter,
  82. AlignCenter,
  83. menu->items[menu->current_menu].name);
  84. //9*5
  85. int center = pos_x + menu->menu_width / 2;
  86. for(uint8_t i = 0; i < 4; i++) {
  87. for(int8_t j = -i; j <= i; j++) {
  88. canvas_draw_dot(canvas, center + j, pos_y - 4 + i);
  89. canvas_draw_dot(canvas, center + j, pos_y + 14 - i);
  90. }
  91. }
  92. }