menu_item.c 2.9 KB

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