menu_item.c 2.9 KB

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