/* Copyright(C) 2010- , JIELI TECHNOLOGY, Inc. * All right reserved. */ /* ------------------------------------------------------------------------------------*/ /** * @file control.h * * @brief 杰理UI控件信息、类型定义 * * @author zhuhaifang@zh-jieli.com * * @version V1.0.0 * * @date 2024-06-05 * * 注意:本文件内容不可擅自改动,需配合UI工具,UI编译工具同步改动,否则影响UI框架运行 */ /* ------------------------------------------------------------------------------------*/ #ifndef UI_CONTROL_H #define UI_CONTROL_H #include "jlui/ui_core.h" union ui_control_info; struct layout_info; #define ENABLE_LUA_VIRTUAL_MACHINE 0 //LUA脚本使能 /***************************************** 控件类型定义 *****************************************/ // 可通过 ui_id2type(ID) 获取,用于通过控件ID区分控件类型 #define CTRL_TYPE_WINDOW 2 #define CTRL_TYPE_LAYOUT 3 #define CTRL_TYPE_LAYER 4 #define CTRL_TYPE_GRID 5 #define CTRL_TYPE_LIST 6 #define CTRL_TYPE_BUTTON 7 #define CTRL_TYPE_PIC 8 #define CTRL_TYPE_BATTERY 9 #define CTRL_TYPE_TIME 10 #define CTRL_TYPE_CAMERA_VIEW 11 #define CTRL_TYPE_TEXT 12 #define CTRL_TYPE_ANIMATION 13 #define CTRL_TYPE_PLAYER 14 #define CTRL_TYPE_NUMBER 15 // 圆环进度条控件 #define CTRL_TYPE_PROGRESS 20 #define CTRL_PROGRESS_CHILD_BEGIN (CTRL_TYPE_PROGRESS + 1) #define CTRL_PROGRESS_CHILD_HIGHLIGHT (CTRL_PROGRESS_CHILD_BEGIN) //21 #define CTRL_PROGRESS_CHILD_END (CTRL_PROGRESS_CHILD_BEGIN + 1) // 多重圆环进度条控件 #define CTRL_TYPE_MULTIPROGRESS 22 #define CTRL_MULTIPROGRESS_CHILD_BEGIN (CTRL_TYPE_MULTIPROGRESS + 1) #define CTRL_MULTIPROGRESS_CHILD_HIGHLIGHT (CTRL_MULTIPROGRESS_CHILD_BEGIN)//23 #define CTRL_MULTIPROGRESS_CHILD_END (CTRL_MULTIPROGRESS_CHILD_BEGIN + 1) // watch(表盘)控件 #define CTRL_TYPE_WATCH 24 #define CTRL_WATCH_CHILD_BEGIN (CTRL_TYPE_WATCH + 1) #define CTRL_WATCH_CHILD_HOUR (CTRL_WATCH_CHILD_BEGIN)//25 #define CTRL_WATCH_CHILD_MIN (CTRL_WATCH_CHILD_BEGIN+1)//26 #define CTRL_WATCH_CHILD_SEC (CTRL_WATCH_CHILD_BEGIN+2)//27 #define CTRL_WATCH_CHILD_END (CTRL_WATCH_CHILD_BEGIN+3) // 水平进度条控件 #define CTRL_TYPE_SLIDER 28 #define SLIDER_CHILD_BEGIN (CTRL_TYPE_SLIDER+1) #define SLIDER_CHILD_UNSELECT_PIC (SLIDER_CHILD_BEGIN)//29 #define SLIDER_CHILD_SELECTED_PIC (SLIDER_CHILD_BEGIN+1)//30 #define SLIDER_CHILD_SLIDER_PIC (SLIDER_CHILD_BEGIN+2)//31 #define SLIDER_CHILD_PERSENT_TEXT (SLIDER_CHILD_BEGIN+3)//32 #define SLIDER_CHILD_END (SLIDER_CHILD_BEGIN+4) // 垂直进度条控件 #define CTRL_TYPE_VSLIDER 33 #define VSLIDER_CHILD_BEGIN (CTRL_TYPE_VSLIDER+1) #define VSLIDER_CHILD_UNSELECT_PIC (VSLIDER_CHILD_BEGIN)//34 #define VSLIDER_CHILD_SELECTED_PIC (VSLIDER_CHILD_BEGIN+1)//35 #define VSLIDER_CHILD_SLIDER_PIC (VSLIDER_CHILD_BEGIN+2)//36 #define VSLIDER_CHILD_PERSENT_TEXT (VSLIDER_CHILD_BEGIN+3)//37 #define VSLIDER_CHILD_END (VSLIDER_CHILD_BEGIN+4) // 指南针控件 #define CTRL_TYPE_COMPASS 38 #define CTRL_COMPASS_CHILD_BEGIN (CTRL_TYPE_COMPASS+1) #define CTRL_COMPASS_CHILD_BKIMG (CTRL_COMPASS_CHILD_BEGIN)//39 #define CTRL_COMPASS_CHILD_INDICATOR (CTRL_COMPASS_CHILD_BEGIN+1)//40 #define CTRL_COMPASS_CHILD_END (CTRL_COMPASS_CHILD_BEGIN+2) // 通过ID号获取控件工程号(模式界面、表盘界面、侧边栏界面属于不同工程号,在UI编译工具上设置) #define ui_id2prj(id) ((((u32)id)>>26) & 0x3f) // 通过ID号获取控件页面号(控件所在页面号) #define ui_id2page(id) ((((u32)id)>>17) & 0x1ff) // 通过ID号获取控件类型 #define ui_id2type(id) ((((u32)id)>>10) & 0x7f) // 通过页面序号转换成页面ID #define ui_page2id(id) (((u32)(id)&0x1ff)<<17|(2<<10)|((u32)(id)&0x3ff)) /***************************************** LUA相关 *****************************************/ // lua功能使能开关。注意:ui控件的属性不关,只是不会自动获取lua代码执行 // extern const int ENABLE_LUA_VIRTUAL_MACHINE; // lua事件类型 enum luascript_event_type { LUA_EVENT_ONLOAD = 0, LUA_EVENT_UNLOAD, LUA_EVENT_TOUCH_DOWN, LUA_EVENT_TOUCH_MOVE, LUA_EVENT_TOUCH_R_MOVE, LUA_EVENT_TOUCH_L_MOVE, LUA_EVENT_TOUCH_D_MOVE, LUA_EVENT_TOUCH_U_MOVE, LUA_EVENT_TOUCH_HOLD, LUA_EVENT_TOUCH_UP, LUA_EVENT_ONSHOW, LUA_EVENT_MAX, }; // lua属性结构 struct luascript_code { u16 type; u16 argc; char argv[0]; }; /***************************************** UI资源相关 *****************************************/ // ui资源结构 struct element_luascript { u16 num; u16 nop; //FFFF struct luascript_code code[0]; }; struct element_luascript_t { u16 num; u16 nop; //FFFF struct luascript_code *code[LUA_EVENT_MAX]; }; // 控件信息头 struct ui_ctrl_info_head { u16 type: 7; //curr max : 40 u16 ctrl_num: 7; //curr max : 73 u16 css_num: 2; //curr max : 2 u16 len: 7; //curr max : 71 u16 page: 9; //curr max : 113 int id; //prj[31..26] page[25..17] ctrlType[16:10] ctrlID[9..0] struct element_css1 *css; }; // 12 bytes // 图片列表结构 struct ui_image_list { u16 num; u16 image_num; u16 image[0]; }; // 文本列表结构 struct ui_text_list { u16 num; u16 str_num; char str[0]; }; #define UI_IMAGE_MAX_INDEX 128 //图片控件的图片索引最大值, 可手动更改 struct ui_image_list_t { u16 num; //控件实际图片数量 u16 image_num; //image数组的数量 u16 image[UI_IMAGE_MAX_INDEX]; }; /* ------------------------------------------------------------------------------------*/ /** * @brief BR28手表部分手表客户开发150种运动功能,需扩大多国语言可读取数量 */ /* ------------------------------------------------------------------------------------*/ #define UI_TEXT_STRPIC_MAX_INDEX 255 #define UI_TEXT_LIST_MAX_NUM 3 struct ui_text_list_t { u16 num; //控件实际str数量 u16 str_num; //str数组的数量 u16 str[UI_TEXT_STRPIC_MAX_INDEX]; }; /* ------------------------------------------------------------------------------------*/ /** * @brief button控件信息 */ /* ------------------------------------------------------------------------------------*/ struct ui_button_info { struct ui_ctrl_info_head head; }; // 12 bytes /* ------------------------------------------------------------------------------------*/ /** * @brief time控件信息 */ /* ------------------------------------------------------------------------------------*/ struct ui_time_info { struct ui_ctrl_info_head head; char source[8]; char format[12]; // Y/M/D h:m:s u16 color; u16 hi_color; u16 number[10]; u16 delimiter[5]; u8 auto_cnt; } __attribute__((packed)); // 67 bytes /* ------------------------------------------------------------------------------------*/ /** * @brief number控件信息 */ /* ------------------------------------------------------------------------------------*/ struct ui_number_info { struct ui_ctrl_info_head head; char source[8]; char format[10]; // %04d/%04d u16 color; //RGB565 u16 hi_color; //RGB565 u16 number[10];// 0~9 u16 delimiter[2]; u16 space[1]; }; // 60 bytes /* ------------------------------------------------------------------------------------*/ /** * @brief pic控件信息 */ /* ------------------------------------------------------------------------------------*/ struct ui_pic_info { struct ui_ctrl_info_head head; char source[8]; u8 highlight; u8 play_mode; u16 play_interval; struct ui_image_list *normal_img; struct ui_image_list *highlight_img; }; // 32 bytes /* ------------------------------------------------------------------------------------*/ /** * @brief battery控件信息 */ /* ------------------------------------------------------------------------------------*/ struct ui_battery_info { struct ui_ctrl_info_head head; struct ui_image_list *normal_image; struct ui_image_list *charge_image; }; // 20bytes /* ------------------------------------------------------------------------------------*/ /** * @brief text控件信息 */ /* ------------------------------------------------------------------------------------*/ enum ENCODE { UI_TEXT_ENCODE_TEXT, UI_TEXT_ENCODE_ASCII, UI_TEXT_ENCODE_STRPIC, UI_TEXT_ENCODE_MULSTR, UI_TEXT_ENCODE_IMAGE, }; enum { UI_TEXT_STRPIC_MODE_IMAGE, UI_TEXT_STRPIC_MODE_INDEX, UI_TEXT_STRPIC_MODE_ENCODE, }; struct ui_text_info { struct ui_ctrl_info_head head; char source[8]; //考虑br28控件结构的转换,不做调整 u16 color; //RGB565 u16 highlight_color; //RGB565 struct ui_text_list *str; u8 code; //编码方式 } __attribute__((packed)); // 29 bytes /* ------------------------------------------------------------------------------------*/ /** * @brief grid控件信息 */ /* ------------------------------------------------------------------------------------*/ struct ui_grid_info { struct ui_ctrl_info_head head; struct layout_info *info; //需要放最后,跟工具绑定 u8 page_mode; char highlight_index; } __attribute__((packed)); // 18 bytes /* ------------------------------------------------------------------------------------*/ /** * @brief slider控件信息 */ /* ------------------------------------------------------------------------------------*/ struct ui_slider_info { struct ui_ctrl_info_head head; struct ui_ctrl_info_head *ctrl; u8 step; } __attribute__((packed)); // 17 bytes /* ------------------------------------------------------------------------------------*/ /** * @brief vslider控件信息 */ /* ------------------------------------------------------------------------------------*/ struct ui_vslider_info { struct ui_ctrl_info_head head; struct ui_ctrl_info_head *ctrl; u8 step; } __attribute__((packed)); // 17 bytes /* ------------------------------------------------------------------------------------*/ /** * @brief watch控件信息 */ /* ------------------------------------------------------------------------------------*/ struct ui_watch_info { struct ui_ctrl_info_head head; char source[8]; struct ui_ctrl_info_head *ctrl; }; // 24 bytes // compass控件信息 struct ui_compass_info { struct ui_ctrl_info_head head; char source[8]; struct ui_ctrl_info_head *ctrl; }; // 24 bytes /* ------------------------------------------------------------------------------------*/ /** * @brief progress控件信息 */ /* ------------------------------------------------------------------------------------*/ struct ui_progress_info { struct ui_ctrl_info_head head; char source[8]; struct ui_ctrl_info_head *ctrl; }; // 24 bytes /* ------------------------------------------------------------------------------------*/ /** * @brief multiprogress控件信息 */ /* ------------------------------------------------------------------------------------*/ struct ui_multiprogress_info { struct ui_ctrl_info_head head; char source[8]; struct ui_ctrl_info_head *ctrl; }; // 24 bytes /* ------------------------------------------------------------------------------------*/ /** * @brief layout控件信息 */ /* ------------------------------------------------------------------------------------*/ struct layout_info { struct ui_ctrl_info_head head; union ui_control_info *ctrl; }; // 16 bytes /* ------------------------------------------------------------------------------------*/ /** * @brief layer控件信息 */ /* ------------------------------------------------------------------------------------*/ struct layer_info { struct ui_ctrl_info_head head; struct layout_info *layout;//需要放最后,跟工具绑定 } __attribute__((packed)); //17 bytes union ui_control_info { struct ui_ctrl_info_head head;//16 bytes struct ui_button_info button;//20 bytes struct ui_time_info time;//84 bytes struct ui_number_info number; struct ui_pic_info pic;//36 bytes struct ui_battery_info battery;//28 bytes struct ui_text_info text;//40 bytes struct ui_grid_info grid;//28 bytes struct layer_info layer; struct layout_info layout; struct ui_watch_info watch; struct ui_progress_info progress; struct ui_multiprogress_info multiprogress; struct ui_slider_info slider; struct ui_vslider_info vslider; };//84 bytes struct rect_s { s16 left; s16 top; s16 width; s16 height; }; struct window_info { u16 type: 7; //curr max : 40 u16 ctrl_num: 7; //curr max : 73 u16 css_num: 2; //curr max : 2 u16 len: 7; //curr max : 71 u16 page: 9; struct rect_s rect; //8 bytes struct layer_info *layer; }; //16 bytes struct control_ops { int type; void *(*new)(const void *, struct element *); /*int (*delete)(void *);*/ }; extern const struct control_ops control_ops_begin[]; extern const struct control_ops control_ops_end[]; #define REGISTER_CONTROL_OPS(_type) \ static const struct control_ops control_ops_##_type sec(.control_ops) __attribute__((used)) = { \ .type = _type, #define get_control_ops_by_type(_type) \ ({ \ const struct control_ops *ops, *ret=NULL; \ for (ops = control_ops_begin; ops < control_ops_end; ops++) { \ if (ops->type == _type) { \ ret = ops; \ break; \ } \ }\ ret; \ }) /* * 通过事件找到对应控件的lua code * */ /* static inline int luascript_code_find(struct element_luascript_t *elm_code, u8 event_type, struct luascript_code **code) */ // { // if (!ENABLE_LUA_VIRTUAL_MACHINE) { // return 0; // } // struct luascript_code *lua_code = NULL; // for (u8 i = 0; i < elm_code->num; i++) { // lua_code = elm_code->code[i]; // if (lua_code->type == event_type) { // // printf("layout luascript_code type:%d\n",lua_code->type); // // printf("layout luascript_code len:%d\n",lua_code->argc); // // printf("layout luascript_code code:\n%s\n",&lua_code->argv); // *code = lua_code; // return 1; // } // // lua_code = (struct luascript_code *)((u32)&lua_code->argv + lua_code->argc); // } // return 0; // } // 默认有lua被执行就将touch消息截断,后续不让继续跑。 // 由run_lua_string函数控制touch消息是否截断,如果没有lua代码被执行则不截断。 /* static inline int lua_touch_event_run(struct element_luascript_t *code, struct element_touch_event *e) */ // { // if (!ENABLE_LUA_VIRTUAL_MACHINE) { // return 0; // } // // printf("======lua_touch_event_run:%d\n", e->event); // struct luascript_code *lua_code = NULL; // int type = -1; // switch (e->event) { // case ELM_EVENT_TOUCH_DOWN: // type = LUA_EVENT_TOUCH_DOWN; // break; // case ELM_EVENT_TOUCH_MOVE: // type = LUA_EVENT_TOUCH_MOVE; // break; // case ELM_EVENT_TOUCH_U_MOVE: // type = LUA_EVENT_TOUCH_U_MOVE; // break; // case ELM_EVENT_TOUCH_D_MOVE: // type = LUA_EVENT_TOUCH_D_MOVE; // break; // case ELM_EVENT_TOUCH_L_MOVE: // type = LUA_EVENT_TOUCH_L_MOVE; // break; // case ELM_EVENT_TOUCH_R_MOVE: // type = LUA_EVENT_TOUCH_R_MOVE; // break; // case ELM_EVENT_TOUCH_HOLD: // type = LUA_EVENT_TOUCH_HOLD; // break; // case ELM_EVENT_TOUCH_UP: // type = LUA_EVENT_TOUCH_UP; // break; // } // if (luascript_code_find(code, type, &lua_code)) { // // printf("func: %s %d find lua code\n",__func__,__LINE__ ); // return run_lua_string(lua_code->argc, (const char *) &lua_code->argv); // } else { // // printf("not find lua code\n"); // return 0; // } // // return 1; //err // } #if 0 struct control_event_header { int id; int len; }; extern struct control_event_header control_event_handler_begin[]; extern struct control_event_header control_event_handler_end[]; #define REGISTER_CONTROL_EVENT_HANDLER(control, _id) \ static const struct control##_event_handler __##control##_event_handler_##_id \ sec(.control_event_handler) = { \ .header = { \ .id = _id, \ .len = sizeof(struct control##_event_handler), \ }, \ static inline void *control_event_handler_for_id(int id) { struct control_event_header *p; for (p = control_event_handler_begin; p < control_event_handler_end;) { if (p->id == id) { return p; } p = (u8 *)p + p->len; } return NULL; } #endif #endif