menu_item.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  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. IconAnimation* icon;
  9. size_t position;
  10. size_t window_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, IconAnimation* 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* menu_item_alloc_function(
  32. const char* label,
  33. IconAnimation* icon,
  34. MenuItemCallback callback,
  35. void* context) {
  36. MenuItem* menu_item = menu_item_alloc();
  37. menu_item->type = MenuItemTypeFunction;
  38. menu_item->label = label;
  39. menu_item->icon = icon;
  40. menu_item->callback = callback;
  41. menu_item->callback_context = context;
  42. menu_item->parent = NULL;
  43. return menu_item;
  44. }
  45. void menu_item_release(MenuItem* menu_item) {
  46. furi_assert(menu_item);
  47. if(menu_item->type == MenuItemTypeMenu) {
  48. //TODO: iterate and release
  49. free(menu_item->data);
  50. }
  51. free(menu_item);
  52. }
  53. MenuItem* menu_item_get_parent(MenuItem* menu_item) {
  54. furi_assert(menu_item);
  55. return menu_item->parent;
  56. }
  57. void menu_item_subitem_add(MenuItem* menu_item, MenuItem* sub_item) {
  58. furi_assert(menu_item);
  59. furi_check(menu_item->type == MenuItemTypeMenu);
  60. MenuItemArray_t* items = menu_item->data;
  61. sub_item->parent = menu_item;
  62. MenuItemArray_push_back(*items, sub_item);
  63. }
  64. uint8_t menu_item_get_type(MenuItem* menu_item) {
  65. furi_assert(menu_item);
  66. return menu_item->type;
  67. }
  68. void menu_item_set_position(MenuItem* menu_item, size_t position) {
  69. furi_assert(menu_item);
  70. menu_item->position = position;
  71. }
  72. size_t menu_item_get_position(MenuItem* menu_item) {
  73. furi_assert(menu_item);
  74. return menu_item->position;
  75. }
  76. void menu_item_set_window_position(MenuItem* menu_item, size_t window_position) {
  77. furi_assert(menu_item);
  78. menu_item->window_position = window_position;
  79. }
  80. size_t menu_item_get_window_position(MenuItem* menu_item) {
  81. furi_assert(menu_item);
  82. return menu_item->window_position;
  83. }
  84. void menu_item_set_label(MenuItem* menu_item, const char* label) {
  85. furi_assert(menu_item);
  86. menu_item->label = label;
  87. }
  88. const char* menu_item_get_label(MenuItem* menu_item) {
  89. furi_assert(menu_item);
  90. return menu_item->label;
  91. }
  92. void menu_item_set_icon(MenuItem* menu_item, IconAnimation* icon) {
  93. furi_assert(menu_item);
  94. menu_item->icon = icon;
  95. }
  96. IconAnimation* menu_item_get_icon(MenuItem* menu_item) {
  97. furi_assert(menu_item);
  98. return menu_item->icon;
  99. }
  100. MenuItemArray_t* menu_item_get_subitems(MenuItem* menu_item) {
  101. furi_assert(menu_item);
  102. furi_check(menu_item->type == MenuItemTypeMenu);
  103. return menu_item->data;
  104. }
  105. void menu_item_function_call(MenuItem* menu_item) {
  106. furi_assert(menu_item);
  107. furi_check(menu_item->type == MenuItemTypeFunction);
  108. if(menu_item->callback) menu_item->callback(menu_item->callback_context);
  109. }