menu_item.c 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  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. };
  13. MenuItem* menu_item_alloc() {
  14. MenuItem* menu_item = furi_alloc(sizeof(MenuItem));
  15. return menu_item;
  16. }
  17. MenuItem* menu_item_alloc_menu(const char* label, void* icon) {
  18. MenuItem* menu_item = menu_item_alloc();
  19. menu_item->type = MenuItemTypeMenu;
  20. menu_item->label = label;
  21. menu_item->icon = icon;
  22. MenuItemArray_t* items = furi_alloc(sizeof(MenuItemArray_t));
  23. MenuItemArray_init(*items);
  24. menu_item->data = items;
  25. return menu_item;
  26. }
  27. MenuItem* menu_item_alloc_function(const char* label, void* icon, MenuItemCallback function) {
  28. MenuItem* menu_item = menu_item_alloc();
  29. menu_item->type = MenuItemTypeFunction;
  30. menu_item->label = label;
  31. menu_item->icon = icon;
  32. menu_item->data = function;
  33. return menu_item;
  34. }
  35. void menu_item_release(MenuItem* menu_item) {
  36. if(menu_item->type == MenuItemTypeMenu) free(menu_item->data);
  37. free(menu_item);
  38. }
  39. MenuItem* menu_item_get_parent(MenuItem* menu_item) {
  40. return menu_item->parent;
  41. }
  42. void menu_item_subitem_add(MenuItem* menu_item, MenuItem* sub_item) {
  43. assert(menu_item->type == MenuItemTypeMenu);
  44. MenuItemArray_t* items = menu_item->data;
  45. sub_item->parent = menu_item;
  46. MenuItemArray_push_back(*items, sub_item);
  47. }
  48. uint8_t menu_item_get_type(MenuItem* menu_item) {
  49. return menu_item->type;
  50. }
  51. void menu_item_set_label(MenuItem* menu_item, const char* label) {
  52. menu_item->label = label;
  53. }
  54. const char* menu_item_get_label(MenuItem* menu_item) {
  55. return menu_item->label;
  56. }
  57. void menu_item_set_icon(MenuItem* menu_item, void* icon) {
  58. menu_item->icon = icon;
  59. }
  60. void* menu_item_get_icon(MenuItem* menu_item) {
  61. return menu_item->icon;
  62. }
  63. MenuItemArray_t* menu_item_get_subitems(MenuItem* menu_item) {
  64. assert(menu_item->type == MenuItemTypeMenu);
  65. return menu_item->data;
  66. }
  67. MenuItemCallback menu_item_get_function(MenuItem* menu_item) {
  68. assert(menu_item->type == MenuItemTypeFunction);
  69. return menu_item->data;
  70. }