menu_item.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. #include "menu_item.h"
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <flipper.h>
  5. #include <flipper_v2.h>
  6. struct MenuItem {
  7. MenuItemType type;
  8. const char* label;
  9. Icon* icon;
  10. size_t position;
  11. MenuItem* parent;
  12. void* data;
  13. // callback related
  14. MenuItemCallback callback;
  15. void* callback_context;
  16. };
  17. MenuItem* menu_item_alloc() {
  18. MenuItem* menu_item = furi_alloc(sizeof(MenuItem));
  19. return menu_item;
  20. }
  21. MenuItem* menu_item_alloc_menu(const char* label, Icon* icon) {
  22. MenuItem* menu_item = menu_item_alloc();
  23. menu_item->type = MenuItemTypeMenu;
  24. menu_item->label = label;
  25. menu_item->icon = icon;
  26. MenuItemArray_t* items = furi_alloc(sizeof(MenuItemArray_t));
  27. MenuItemArray_init(*items);
  28. menu_item->data = items;
  29. return menu_item;
  30. }
  31. MenuItem*
  32. menu_item_alloc_function(const char* label, Icon* icon, MenuItemCallback callback, void* context) {
  33. MenuItem* menu_item = menu_item_alloc();
  34. menu_item->type = MenuItemTypeFunction;
  35. menu_item->label = label;
  36. menu_item->icon = icon;
  37. menu_item->callback = callback;
  38. menu_item->callback_context = context;
  39. return menu_item;
  40. }
  41. void menu_item_release(MenuItem* menu_item) {
  42. furi_assert(menu_item);
  43. if(menu_item->type == MenuItemTypeMenu) {
  44. //TODO: iterate and release
  45. free(menu_item->data);
  46. }
  47. free(menu_item);
  48. }
  49. MenuItem* menu_item_get_parent(MenuItem* menu_item) {
  50. furi_assert(menu_item);
  51. return menu_item->parent;
  52. }
  53. void menu_item_subitem_add(MenuItem* menu_item, MenuItem* sub_item) {
  54. furi_assert(menu_item);
  55. furi_check(menu_item->type == MenuItemTypeMenu);
  56. MenuItemArray_t* items = menu_item->data;
  57. sub_item->parent = menu_item;
  58. MenuItemArray_push_back(*items, sub_item);
  59. }
  60. uint8_t menu_item_get_type(MenuItem* menu_item) {
  61. furi_assert(menu_item);
  62. return menu_item->type;
  63. }
  64. void menu_item_set_position(MenuItem* menu_item, size_t position) {
  65. furi_assert(menu_item);
  66. menu_item->position = position;
  67. }
  68. size_t menu_item_get_position(MenuItem* menu_item) {
  69. furi_assert(menu_item);
  70. return menu_item->position;
  71. }
  72. void menu_item_set_label(MenuItem* menu_item, const char* label) {
  73. furi_assert(menu_item);
  74. menu_item->label = label;
  75. }
  76. const char* menu_item_get_label(MenuItem* menu_item) {
  77. furi_assert(menu_item);
  78. return menu_item->label;
  79. }
  80. void menu_item_set_icon(MenuItem* menu_item, Icon* icon) {
  81. furi_assert(menu_item);
  82. menu_item->icon = icon;
  83. }
  84. Icon* menu_item_get_icon(MenuItem* menu_item) {
  85. furi_assert(menu_item);
  86. return menu_item->icon;
  87. }
  88. MenuItemArray_t* menu_item_get_subitems(MenuItem* menu_item) {
  89. furi_assert(menu_item);
  90. furi_check(menu_item->type == MenuItemTypeMenu);
  91. return menu_item->data;
  92. }
  93. void menu_item_function_call(MenuItem* menu_item) {
  94. furi_assert(menu_item);
  95. furi_check(menu_item->type == MenuItemTypeFunction);
  96. if(menu_item->callback) menu_item->callback(menu_item->callback_context);
  97. }