menu_item.c 2.6 KB

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