功能优化
This commit is contained in:
101
api/menu_api.c
101
api/menu_api.c
@ -58,6 +58,36 @@ MenuNodeId menu_register_node_ex(
|
||||
return 0;
|
||||
}
|
||||
|
||||
MenuErrCode menu_register_nodes(
|
||||
const MenuNode* nodes,
|
||||
size_t count,
|
||||
MenuNodeId* out_ids
|
||||
) {
|
||||
if (!nodes || count == 0) return MENU_ERR_INVALID_PARAM;
|
||||
|
||||
for (size_t i = 0; i < count; i++) {
|
||||
MenuNode node = nodes[i];
|
||||
MenuNodeId new_id = 0;
|
||||
|
||||
node.flags.is_enabled = true;
|
||||
node.flags.is_visible = true;
|
||||
node.flags.is_registered = false;
|
||||
node.param_id = node.param_id ? node.param_id : 0;
|
||||
node.permission_level = node.permission_level ? node.permission_level : 0;
|
||||
|
||||
MenuErrCode err = menu_core_register_node(&g_menu_ctx, &node, &new_id);
|
||||
if (err != MENU_ERR_OK) {
|
||||
return err;
|
||||
}
|
||||
|
||||
if (out_ids) {
|
||||
out_ids[i] = new_id;
|
||||
}
|
||||
}
|
||||
|
||||
return MENU_ERR_OK;
|
||||
}
|
||||
|
||||
MenuErrCode menu_post_event(MenuEventType type, uint32_t param) {
|
||||
return menu_event_post(&g_menu_ctx.event_queue, type, param);
|
||||
}
|
||||
@ -113,3 +143,74 @@ MenuErrCode menu_node_bind_param(MenuNodeId node_id, uint16_t param_id) {
|
||||
node->param_id = param_id;
|
||||
return MENU_ERR_OK;
|
||||
}
|
||||
|
||||
// Permission management functions
|
||||
MenuErrCode menu_permission_register_role(uint8_t role_id, const char* name, MenuPermissionLevel level) {
|
||||
if (!name) return MENU_ERR_INVALID_PARAM;
|
||||
if (g_menu_ctx.permission.role_count >= 8) return MENU_ERR_NO_MEM;
|
||||
|
||||
for (uint8_t i = 0; i < g_menu_ctx.permission.role_count; i++) {
|
||||
if (g_menu_ctx.permission.roles[i].id == role_id) {
|
||||
return MENU_ERR_FAIL;
|
||||
}
|
||||
}
|
||||
|
||||
MenuRole* role = &g_menu_ctx.permission.roles[g_menu_ctx.permission.role_count];
|
||||
role->id = role_id;
|
||||
role->name = name;
|
||||
role->level = level;
|
||||
g_menu_ctx.permission.role_count++;
|
||||
|
||||
return MENU_ERR_OK;
|
||||
}
|
||||
|
||||
MenuErrCode menu_permission_set_current_role(uint8_t role_id) {
|
||||
g_menu_ctx.permission.current_role_id = role_id;
|
||||
return MENU_ERR_OK;
|
||||
}
|
||||
|
||||
MenuErrCode menu_permission_update_node_level(MenuNodeId node_id, MenuPermissionLevel level) {
|
||||
MenuNode* node = menu_core_get_node(&g_menu_ctx, node_id);
|
||||
if (!node) return MENU_ERR_NOT_FOUND;
|
||||
|
||||
node->permission_level = level;
|
||||
return MENU_ERR_OK;
|
||||
}
|
||||
|
||||
bool menu_permission_check_node_access(MenuNodeId node_id) {
|
||||
MenuNode* node = menu_core_get_node(&g_menu_ctx, node_id);
|
||||
if (!node) return false;
|
||||
|
||||
#if MENU_CONFIG_ENABLE_PERMISSION
|
||||
MenuRole* role_node = NULL;
|
||||
for (uint8_t i = 0; i < g_menu_ctx.permission.role_count; i++) {
|
||||
if (g_menu_ctx.permission.roles[i].id == g_menu_ctx.permission.current_role_id) {
|
||||
role_node = &g_menu_ctx.permission.roles[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!role_node || role_node->level < node->permission_level) {
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// Persistence functions
|
||||
MenuErrCode menu_persistence_save(void) {
|
||||
return menu_core_save_state(&g_menu_ctx);
|
||||
}
|
||||
|
||||
MenuErrCode menu_persistence_load(void) {
|
||||
return menu_core_load_state(&g_menu_ctx);
|
||||
}
|
||||
|
||||
MenuErrCode menu_refresh(void) {
|
||||
MenuErrCode err = menu_post_event(MENU_EVENT_RENDER, 0);
|
||||
if (err != MENU_ERR_OK) {
|
||||
return err;
|
||||
}
|
||||
return MENU_ERR_OK;
|
||||
}
|
||||
|
||||
@ -34,6 +34,13 @@ MenuNodeId menu_register_node_ex(
|
||||
void* user_data
|
||||
);
|
||||
|
||||
// Batch node registration
|
||||
MenuErrCode menu_register_nodes(
|
||||
const MenuNode* nodes,
|
||||
size_t count,
|
||||
MenuNodeId* out_ids
|
||||
);
|
||||
|
||||
// Event Handling
|
||||
MenuErrCode menu_post_event(MenuEventType type, uint32_t param);
|
||||
|
||||
@ -44,6 +51,19 @@ MenuErrCode menu_back(void);
|
||||
// Parameter Binding
|
||||
MenuErrCode menu_node_bind_param(MenuNodeId node_id, uint16_t param_id);
|
||||
|
||||
// Permission Management
|
||||
MenuErrCode menu_permission_register_role(uint8_t role_id, const char* name, MenuPermissionLevel level);
|
||||
MenuErrCode menu_permission_set_current_role(uint8_t role_id);
|
||||
MenuErrCode menu_permission_update_node_level(MenuNodeId node_id, MenuPermissionLevel level);
|
||||
bool menu_permission_check_node_access(MenuNodeId node_id);
|
||||
|
||||
// Persistence Management
|
||||
MenuErrCode menu_persistence_save(void);
|
||||
MenuErrCode menu_persistence_load(void);
|
||||
|
||||
// Dynamic menu updates
|
||||
MenuErrCode menu_refresh(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user