69f54973cc
* fix 'function cannot return qualified void/bool type' * Fix variable 'consumed' is used uninitialized * Fix format string is not a string literal (potentially insecure) * Fix conflicting types for 'menu_item_get_type' * Fix implicit conversion from enumeration type 'NfcDeviceType' to different enumeration type 'rfalNfcDevType' * Fix hal_gpio_init incorrect arguments order * Fix nfc->dev.dev_name condition will always evaluate to 'true' * Fix explicitly assigning value of variable to itself * Fix furi_hal_bt_wait_startup counter overflow * Fix implicit conversion from 'StorageStatus' to 'SDError' * Remove #include <sys/param.h> * Add FIXME * Fix syntax * Fixup for 'furi_hal_bt_wait_startup counter overflow' * nfc: fix different nfc device types * Drivers: fix incorrect offset in cc1101_read_fifo * Remove obsolete comment Co-authored-by: Tony Freeman <tonyfreeman@users.noreply.github.com> Co-authored-by: gornekich <n.gorbadey@gmail.com> Co-authored-by: あく <alleteam@gmail.com>
136 lines
3.3 KiB
C
136 lines
3.3 KiB
C
#include "menu_item.h"
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <furi.h>
|
|
|
|
struct MenuItem {
|
|
MenuItemType type;
|
|
|
|
const char* label;
|
|
IconAnimation* icon;
|
|
|
|
size_t position;
|
|
size_t window_position;
|
|
MenuItem* parent;
|
|
void* data;
|
|
|
|
// callback related
|
|
MenuItemCallback callback;
|
|
void* callback_context;
|
|
};
|
|
|
|
MenuItem* menu_item_alloc() {
|
|
MenuItem* menu_item = furi_alloc(sizeof(MenuItem));
|
|
return menu_item;
|
|
}
|
|
|
|
MenuItem* menu_item_alloc_menu(const char* label, IconAnimation* icon) {
|
|
MenuItem* menu_item = menu_item_alloc();
|
|
|
|
menu_item->type = MenuItemTypeMenu;
|
|
menu_item->label = label;
|
|
menu_item->icon = icon;
|
|
|
|
MenuItemArray_t* items = furi_alloc(sizeof(MenuItemArray_t));
|
|
MenuItemArray_init(*items);
|
|
menu_item->data = items;
|
|
|
|
return menu_item;
|
|
}
|
|
|
|
MenuItem* menu_item_alloc_function(
|
|
const char* label,
|
|
IconAnimation* icon,
|
|
MenuItemCallback callback,
|
|
void* context) {
|
|
MenuItem* menu_item = menu_item_alloc();
|
|
|
|
menu_item->type = MenuItemTypeFunction;
|
|
menu_item->label = label;
|
|
menu_item->icon = icon;
|
|
menu_item->callback = callback;
|
|
menu_item->callback_context = context;
|
|
menu_item->parent = NULL;
|
|
|
|
return menu_item;
|
|
}
|
|
|
|
void menu_item_release(MenuItem* menu_item) {
|
|
furi_assert(menu_item);
|
|
if(menu_item->type == MenuItemTypeMenu) {
|
|
//TODO: iterate and release
|
|
free(menu_item->data);
|
|
}
|
|
free(menu_item);
|
|
}
|
|
|
|
MenuItem* menu_item_get_parent(MenuItem* menu_item) {
|
|
furi_assert(menu_item);
|
|
return menu_item->parent;
|
|
}
|
|
|
|
void menu_item_subitem_add(MenuItem* menu_item, MenuItem* sub_item) {
|
|
furi_assert(menu_item);
|
|
furi_check(menu_item->type == MenuItemTypeMenu);
|
|
MenuItemArray_t* items = menu_item->data;
|
|
sub_item->parent = menu_item;
|
|
MenuItemArray_push_back(*items, sub_item);
|
|
}
|
|
|
|
MenuItemType menu_item_get_type(MenuItem* menu_item) {
|
|
furi_assert(menu_item);
|
|
return menu_item->type;
|
|
}
|
|
|
|
void menu_item_set_position(MenuItem* menu_item, size_t position) {
|
|
furi_assert(menu_item);
|
|
menu_item->position = position;
|
|
}
|
|
|
|
size_t menu_item_get_position(MenuItem* menu_item) {
|
|
furi_assert(menu_item);
|
|
return menu_item->position;
|
|
}
|
|
|
|
void menu_item_set_window_position(MenuItem* menu_item, size_t window_position) {
|
|
furi_assert(menu_item);
|
|
menu_item->window_position = window_position;
|
|
}
|
|
|
|
size_t menu_item_get_window_position(MenuItem* menu_item) {
|
|
furi_assert(menu_item);
|
|
return menu_item->window_position;
|
|
}
|
|
|
|
void menu_item_set_label(MenuItem* menu_item, const char* label) {
|
|
furi_assert(menu_item);
|
|
menu_item->label = label;
|
|
}
|
|
|
|
const char* menu_item_get_label(MenuItem* menu_item) {
|
|
furi_assert(menu_item);
|
|
return menu_item->label;
|
|
}
|
|
|
|
void menu_item_set_icon(MenuItem* menu_item, IconAnimation* icon) {
|
|
furi_assert(menu_item);
|
|
menu_item->icon = icon;
|
|
}
|
|
|
|
IconAnimation* menu_item_get_icon(MenuItem* menu_item) {
|
|
furi_assert(menu_item);
|
|
return menu_item->icon;
|
|
}
|
|
|
|
MenuItemArray_t* menu_item_get_subitems(MenuItem* menu_item) {
|
|
furi_assert(menu_item);
|
|
furi_check(menu_item->type == MenuItemTypeMenu);
|
|
return menu_item->data;
|
|
}
|
|
|
|
void menu_item_function_call(MenuItem* menu_item) {
|
|
furi_assert(menu_item);
|
|
furi_check(menu_item->type == MenuItemTypeFunction);
|
|
if(menu_item->callback) menu_item->callback(menu_item->callback_context);
|
|
}
|