Menu: item callback function context, event osWaitForever timeouts.

This commit is contained in:
Aleksandr Kutuzov
2020-10-16 15:18:36 +03:00
parent d715767cef
commit e213954d2d
4 changed files with 41 additions and 26 deletions

View File

@@ -10,6 +10,8 @@ struct MenuItem {
void* icon;
MenuItem* parent;
void* data;
MenuItemCallback callback;
void* callback_context;
};
MenuItem* menu_item_alloc() {
@@ -31,27 +33,34 @@ MenuItem* menu_item_alloc_menu(const char* label, void* icon) {
return menu_item;
}
MenuItem* menu_item_alloc_function(const char* label, void* icon, MenuItemCallback function) {
MenuItem* menu_item_alloc_function(const char* label, void* 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->data = function;
menu_item->callback = callback;
menu_item->callback_context = context;
return menu_item;
}
void menu_item_release(MenuItem* menu_item) {
if(menu_item->type == MenuItemTypeMenu) free(menu_item->data);
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) {
assert(menu_item);
return menu_item->parent;
}
void menu_item_subitem_add(MenuItem* menu_item, MenuItem* sub_item) {
assert(menu_item);
assert(menu_item->type == MenuItemTypeMenu);
MenuItemArray_t* items = menu_item->data;
sub_item->parent = menu_item;
@@ -59,31 +68,39 @@ void menu_item_subitem_add(MenuItem* menu_item, MenuItem* sub_item) {
}
uint8_t menu_item_get_type(MenuItem* menu_item) {
assert(menu_item);
return menu_item->type;
}
void menu_item_set_label(MenuItem* menu_item, const char* label) {
assert(menu_item);
menu_item->label = label;
}
const char* menu_item_get_label(MenuItem* menu_item) {
assert(menu_item);
return menu_item->label;
}
void menu_item_set_icon(MenuItem* menu_item, void* icon) {
assert(menu_item);
menu_item->icon = icon;
}
void* menu_item_get_icon(MenuItem* menu_item) {
assert(menu_item);
return menu_item->icon;
}
MenuItemArray_t* menu_item_get_subitems(MenuItem* menu_item) {
assert(menu_item);
assert(menu_item->type == MenuItemTypeMenu);
return menu_item->data;
}
MenuItemCallback menu_item_get_function(MenuItem* menu_item) {
void menu_item_function_call(MenuItem* menu_item) {
assert(menu_item);
assert(menu_item->type == MenuItemTypeFunction);
return menu_item->data;
if(menu_item->callback) menu_item->callback(menu_item->callback_context);
}