menu_item.c 2.6 KB

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