/* Copyright(C) 2010- , JIELI TECHNOLOGY, Inc. * All right reserved. */ /* ------------------------------------------------------------------------------------*/ /** * @file ui_core.h * * @brief 杰理UI框架核心 * * @author JIELI TECHNOLOGY ZHUHAI * * @version V1.0.0 * * @date 2024-06-04 * * 注意:本文件修改会影响到UI资源结构,UI工具等内容,禁止随意改动 */ /* ------------------------------------------------------------------------------------*/ #ifndef UI_ELEMENT_CORE_H #define UI_ELEMENT_CORE_H #include "typedef.h" #include "rect.h" #include "system/event.h" #include "res/resfile.h" #include "jlui/ui_effect.h" #include "font/font_all.h" #define UI_CTRL_BUTTON 0 struct element; #define UI_COLOR_RGB555_T0_RGB565(color) (((((color) >> 10) & 0x1f) << 11) | ((((color) >> 5) & 0x1f) << 6) | ((color) & 0x1f)) /* ------------------------------------------------------------------------------------*/ /** * @brief 使能PSRAM标记 */ /* ------------------------------------------------------------------------------------*/ extern const int ENABLE_PSRAM_UI_FRAME; #define COLOR_INVALID_VALUE 0xffff // 无效的颜色 #define COLOR_DEFAULT_VALUE 0x0000 // 默认的颜色 #define COLOR_VALID(c) (((c) & COLOR_INVALID_VALUE) != COLOR_INVALID_VALUE) // 判断颜色是有效的 #define COLOR_INVALID(c) (((c) & COLOR_INVALID_VALUE) == COLOR_INVALID_VALUE) // 判断颜色是无效的 #define IMAGE_INVALID_VALUE 0xffff // 无效的图片 #define IMAGE_DEFAULT_VALUE 0x0000 // 默认的图片 #define IMAGE_VALID(p) (((p) != IMAGE_INVALID_VALUE) && ((p) > 0)) // 判断图片是有效的 #define IMAGE_INVALID(p) (((p) == IMAGE_INVALID_VALUE) || ((p) <= 0)) // 判断图片是无效的 #ifdef offsetof #undef offsetof #endif #ifdef container_of #undef container_of #endif #define offsetof(type, memb) \ ((unsigned long)(&((type *)0)->memb)) #define container_of(ptr, type, memb) \ ((type *)((char *)ptr - offsetof(type, memb))) #define ui_element_for_id(id, type) \ ({ \ struct element *elm = ui_core_get_element_by_id(id); \ elm ? container_of(elm, type, elm) : NULL; \ }) /* ------------------------------------------------------------------------------------*/ /** * @brief UI使用的RAM类型定义 */ /* ------------------------------------------------------------------------------------*/ typedef enum ui_ram_type { UI_RAM_SRAM, UI_RAM_PSRAM, UI_RAM_CACHE, } UI_RamType; #define UI_FRAME_RAM UI_RAM_SRAM // 定义UI框架使用的ram类型 /* ------------------------------------------------------------------------------------*/ /** * @brief UI各模块类型定义 */ /* ------------------------------------------------------------------------------------*/ typedef enum ui_module_type { UI_MODULE_CORE, // UI核心 UI_MODULE_FRAME, // UI框架 UI_MODULE_WIDGET, // UI控件 UI_MODULE_RESOURCE, // RES UI_MODULE_GPU, // GPU UI_MODULE_DBI, // DBI UI_MODULE_FONT, // UI字库 UI_MODULE_BUFFER, // BUFFER管理 UI_MODULE_JPEG, // JPEG UI_MODULE_CACHE, // gpu_cache UI_MODULE_CUSTOM_DRAW, // 自定义绘图 UI_MODULE_MAX = 31,// } UI_ModuleType; enum ui_direction { UI_DIR_UP, UI_DIR_DOWN, UI_DIR_LEFT, UI_DIR_RIGHT, }; #define KEY_LEFT (0x44)//KEY_UI_MINUS #define KEY_RIGHT (0x45)//KEY_UI_PLUS #define KEY_UP (0x46)//KEY_UI_MINUS #define KEY_DOWN (0x47)//KEY_UI_PLUS enum { KEY_EVENT_CLICK, KEY_EVENT_LONG, KEY_EVENT_HOLD, KEY_EVENT_UP, KEY_EVENT_DOUBLE_CLICK, KEY_EVENT_TRIPLE_CLICK, KEY_EVENT_FOURTH_CLICK, KEY_EVENT_FIRTH_CLICK, KEY_EVENT_USER, KEY_EVENT_MAX, }; enum { POSITION_ABSOLUTE = 0, POSITION_RELATIVE = 1, }; /* ------------------------------------------------------------------------------------*/ /** * @brief 触摸事件类型 */ /* ------------------------------------------------------------------------------------*/ enum { ELM_EVENT_TOUCH_DOWN, ELM_EVENT_TOUCH_MOVE, ELM_EVENT_TOUCH_R_MOVE, ELM_EVENT_TOUCH_L_MOVE, ELM_EVENT_TOUCH_D_MOVE, ELM_EVENT_TOUCH_U_MOVE, ELM_EVENT_TOUCH_HOLD, ELM_EVENT_TOUCH_UP, ELM_EVENT_TOUCH_ENERGY, ELM_EVENT_TOUCH_STOP, }; /* ------------------------------------------------------------------------------------*/ /** * @brief 按键事件类型 */ /* ------------------------------------------------------------------------------------*/ enum { ELM_EVENT_KEY_CLICK, ELM_EVENT_KEY_LONG, ELM_EVENT_KEY_HOLD, }; enum { ELM_STA_INITED, ELM_STA_READY, //ELM_STA_SHOW_PROBE, //ELM_STA_SHOW_POST, ELM_STA_HIDE, ELM_STA_SHOW, ELM_STA_PAUSE, }; enum { ELM_FLAG_NORMAL, ELM_FLAG_HEAD, }; enum { DC_DATA_FORMAT_OSD8 = 0, DC_DATA_FORMAT_YUV420 = 1, DC_DATA_FORMAT_OSD16 = 2, DC_DATA_FORMAT_OSD8A = 3, DC_DATA_FORMAT_MONO = 4, }; struct element_touch_event { int event; int xoffset; int yoffset; u8 hold_up; u8 onfocus; u8 move_flag; struct position pos; struct position origin; void *private_data; int has_energy; }; struct element_key_event { u8 event; u8 value; void *private_data; }; #define ELM_KEY_EVENT(e) (0x0000 | (e->event) | (e->value << 8)) #define ELM_TOUCH_EVENT(e) (0x1000 | (e->event)) #define ELM_CHANGE_EVENT(e) (0x2000 | (e->event)) /* ------------------------------------------------------------------------------------*/ /** * @brief ON_CHANGE事件类型 */ /* ------------------------------------------------------------------------------------*/ enum element_change_event { ON_CHANGE_INIT_PROBE, ON_CHANGE_INIT, ON_CHANGE_TRY_OPEN_DC, ON_CHANGE_FIRST_SHOW, ON_CHANGE_SHOW_PROBE, ON_CHANGE_SHOW, ON_CHANGE_SHOW_POST, ON_CHANGE_HIDE, ON_CHANGE_HIGHLIGHT, ON_CHANGE_RELEASE_PROBE, ON_CHANGE_RELEASE, ON_CHANGE_ANIMATION_END, ON_CHANGE_SHOW_COMPLETED, ON_CHANGE_UPDATE_ITEM, }; struct element_event_handler { int id; int (*ontouch)(void *, struct element_touch_event *); int (*onkey)(void *, struct element_key_event *); int (*onchange)(void *, enum element_change_event, void *); }; struct jaction { u32 show; u32 hide; }; enum { ELM_ACTION_HIDE = 0, ELM_ACTION_SHOW, ELM_ACTION_TOGGLE, ELM_ACTION_HIGHLIGHT, }; enum { UI_CUSTOM_COLOR_BIT_IMAGE, UI_CUSTOM_COLOR_BIT_TEXT, //预留1 //预留2 };//max4bit enum { GPU_TASK_MODE_DEFAULT, GPU_TASK_MODE_AFFINE, GPU_TASK_MODE_PERSPECTIVE, }; struct event_action { u16 event; u16 action; int id; u8 argc; char argv[]; }; struct element_event_action { u16 num; struct event_action action[0]; }; struct image_preview { struct flash_file_info *file_info; UI_RESFILE *file; int id; int page; }; struct image { s16 x; s16 y; u16 id; u16 page; u32 en: 1; u32 invert_x_en: 2; u32 invert_y_en: 2; u32 invert_x_dist: 12; u32 invert_y_dist: 12; struct rect rect; }; /* ------------------------------------------------------------------------------------*/ /** * @brief 显示上下文句柄结构 */ /* ------------------------------------------------------------------------------------*/ struct draw_context { u8 ref; // 递归计数,防止嵌套 u8 alpha; // 透明度 u8 hori_align; // 水平对齐 u8 vert_align; // 垂直对齐 u8 prj; // 工程ID,与UI资源对应 u8 page; // 页面ID,与UI资源对应 u8 buf_num; // UI框架支持的单、双buf模式,底层用到 u8 refresh; u32 background_color; // 背景颜色 struct element *elm; // 控件成员指针 struct rect rect; struct rect draw; void *dc; struct image_preview preview; // 预览图结构体 struct rect page_draw; struct rect need_draw; struct rect disp; struct rect rect_orig; struct rect rect_ref;//referance of page rect struct rect lcd_rect; u16 width; // DC绘图宽高 u16 height; u8 *buf; // 显存buf地址 u32 len; // 显存buf长度 u16 lines; // 分块行数 u16 colums; u8 col_align; // 行、列对齐 u8 row_align; u8 index; u8 elm_index; u8 draw_state; // 绘制状态,合成、推屏、合成并推屏 // BR35 GPU 任务 u8 crop_en : 4; // 裁剪使能,替代crop u8 custom_color : 4; // 自定义颜色使能 u32 custom_argb8888; // 自定义颜色值 // u16 custom_rgb565; // 自定义颜色值 void *gpu_task_head; // GPU 任务链 int gpu_task_dont_sort; // GPU 任务不排序 void *gpu_mult_list; // 多链表管理 void *buffer_hdl; // 显存管理句柄 void *buffer_adr; // 当前显存地址 u32 asyn_redraw: 1; // GPU 和 UI 任务异步 u32 gpu_task_mode: 2; // 指定GPU任务大类,默认/仿射/透视,特效使用 struct image draw_img; /*********psram和特效相关变量*************/ //滑动页面时,当新页第一次复制到psram时为1,其他时候为0 //可用于滑动时,特效只需要处理一次的情况 u8 new_copy; u8 new_page; u8 slider; u8 just_record; u8 lr_status;//0:left 1:right u8 copy_to_psram; u16 effect_mode; effect_cb effect_user;//用户自定义特效处理的回调函数 void *effect_priv; //页面特效私有值,可以用来传递特效参数 /********************************************/ float scale_ratio; int scale_mode; int scale_prior; struct rect page_r; struct rect gpu_r; struct rect lcd_r; u8 gpu_free_data; }; // 296byte /* ------------------------------------------------------------------------------------*/ /** * @brief 边框属性 */ /* ------------------------------------------------------------------------------------*/ struct css_border { u16 left: 4; u16 top: 4; u16 right: 4; u16 bottom: 4; u16 color/* : 16 */; }; // 4byte struct css_border1 { u16 left: 4; u16 top: 4; u16 right: 4; u16 bottom: 4; u16 color; }; // 4 bytes /* ------------------------------------------------------------------------------------*/ /** * @brief 旋转属性 */ /* ------------------------------------------------------------------------------------*/ struct css_rotate { s16 cent_x; s16 cent_y; s16 dx; s16 dy; float angle; }; // 12byte /* ------------------------------------------------------------------------------------*/ /** * @brief 缩放属性 */ /* ------------------------------------------------------------------------------------*/ struct css_ratio { float ratio_w; float ratio_h; }; // 8byte struct css_part { // int background_image; // 可以使用u16,这里给int用于对齐,还是应放到css结构体,因所有图片显示是都是通过背景图片传递的ID,如果放到外部,则任何需要显示图片的位置都需额外申请这个buf struct css_border border; // 边框 struct css_rotate rotate; // 旋转 struct css_ratio ratio; // 缩放 }; // 28byte /* ------------------------------------------------------------------------------------*/ /** * @brief 元素属性结构 */ /* ------------------------------------------------------------------------------------*/ struct element_css { u16 invisible : 1; // 默认隐藏 u16 z_order : 3; // 排列顺序 u16 hori_align: 2; // 对齐方式,9种 u16 vert_align: 2; // 对齐方式,9种 u16 alpha: 8; // 透明度 u16 background_color; // 背景颜色 u16 background_image; // 背景图片 u16 change_rect: 1; //修改控件rect,缩放时有效 u16 unused: 15; // 未使用的保留位 s16 left; // 位置坐标 s16 top; s16 width; s16 height; struct css_part *part; // 旋转缩放等参数 }; struct element_css1 { u32 hori_align: 2; //水平对齐 {左中右} u32 vert_align: 2; //垂直对齐 {上中下} u32 invisible: 1; u32 z_order: 3; u32 alpha: 8; u32 background_color: 16; //RGB565 s16 left; s16 top; s16 width; s16 height; struct css_border1 border; //控件边框大小 u16 background_image; } __attribute__((packed)); // 18 bytes struct element_ops { int (*show)(struct element *); int (*redraw)(struct element *, struct rect *); }; /* ------------------------------------------------------------------------------------*/ /** * @brief 元素结构 */ /* ------------------------------------------------------------------------------------*/ struct element { u32 highlight : 1; // 高亮状态 u32 hide_action: 1; // 隐藏时是否刷新 u32 rotate_en: 1; // 旋转使能 u32 ratio_en : 1; // 缩放使能 u32 css_num: 2; // css 属性数量 u32 state: 3; // 控件状态 u32 ref: 5; // 防止重入嵌套 u32 prior: 9; // 优先级,调整GPU混合顺序 u32 page: 9; // 页面ID u32 id; // 控件ID struct element *parent; // 父控件指针 struct list_head sibling; // 兄弟控件列表 struct list_head child; // 子控件列表 struct element *focus; // 聚焦控件,特别是列表等多个控件需决策响应控件时用到。 struct element_css css; // 控件 CSS 属性 struct draw_context *dc; // DC 结构体指针 const struct element_event_handler *handler; // 事件句柄 }; // 80byte struct ui_style { const char *file; u32 version; }; enum { UI_FTYPE_VIDEO = 0, UI_FTYPE_IMAGE, UI_FTYPE_AUDIO, UI_FTYPE_DIR, UI_FTYPE_UNKNOW = 0xff, }; /* ------------------------------------------------------------------------------------*/ /** * @brief UI文件属性 */ /* ------------------------------------------------------------------------------------*/ struct ui_file_attrs { char *format; char fname[128]; struct vfs_attr attr; u8 ftype; u16 file_num; u32 film_len; }; /* ------------------------------------------------------------------------------------*/ /** * @brief UI图片属性 */ /* ------------------------------------------------------------------------------------*/ struct ui_image_attrs { u16 width; u16 height; u8 format; u8 clut_format; u8 compress; u8 has_clut; u8 *tab; u8 *data; u8 *clut_tab; u32 len; u8 gpu_format; }; /* ------------------------------------------------------------------------------------*/ /** * @brief UI文本属性 */ /* ------------------------------------------------------------------------------------*/ struct ui_text_attrs { const char *str; // const char *format; // 改为枚举 u16 format: 3; // 改为枚举,3bit u16 displen: 13; // 显示长度类型改为u16,防止文本长度溢出导致显示异常 // int color; // 文本颜色 u16 color; // 采用RGB565颜色格式 u16 strlen; // 字符串长度 short offset; const char *mulstr; // 多个多国语言词条拼接时使用 const char *font_out_buf; // 字库描点字模的缓存buf指针,给GPU使用,文本控件释放时释放 u16 mulstr_len; u16 default_code; u8 rev: 3; u8 scroll_update : 1; //定时器滚动步进更新标志 u8 scroll_en : 1; //定时器滚动使能标志 u8 endian: 1; // 大小端,兼容蓝牙发过来的数据 u8 encode: 2; // 编码格式 u8 flags; // 显示单行、多行、滚动显示等, 在font_all定义。由于功能可同时开启,1bit作为一个开关 short extra_word_space_for_dep; short word_space; // 词间隔 short line_space; // 行间隔 u16 width; // 文本宽度 u16 height; // 文本高度 short scroll_cnt; //滚动缓冲数 short offsetx; //滚动缓冲内x偏移 u16 last_crc; //记录上一次text->str的校验值 u16 str_width; //当前字符串显示宽度 struct font_new_cb_priv font_priv; u8 charNumInSyllable; //印地语单音节内字符数 u8 x_interval; // 字符间隔 int top_extra_fill : 16; int bottom_extra_fill : 16; const char *copy_mulstr; }; // 64 byte struct ui_file_browser { int file_number; u8 dev_num; void *private_data; }; struct ui_effect_ctrl { u8 has_new_page; void *new_page_elm; u16 effect_mode; void *user_effect_cb; void *effect_priv; int stop_redraw; u8 redraw_page; }; extern struct ui_effect_ctrl ui_core_effcet; #define ELEMENT_ALIVE 0x53547a7b #define element_born(elm) \ elm->alive = ELEMENT_ALIVE #define element_alive(elm) \ (elm->alive == ELEMENT_ALIVE) /* 扫描子控件链表 */ #define list_for_each_child_element(p, elm) \ list_for_each_entry(p, &(elm)->child, sibling) #define list_for_each_child_element_reverse(p, n, elm) \ list_for_each_entry_reverse_safe(p, n, &(elm)->child, sibling) #define list_for_each_child_element_safe(p, n, elm) \ list_for_each_entry_safe(p, n, &(elm)->child, sibling) struct ui_platform_api { void *(*malloc)(int size, u32 ram_type, u32 module_type); void (*free)(void *addr, u32 ram_type, u32 module_type); int (*load_style)(struct ui_style *); void *(*load_window)(int id); void (*unload_window)(void *); int (*open_draw_context)(struct draw_context *); int (*get_draw_context)(struct draw_context *); int (*put_draw_context)(struct draw_context *); int (*set_draw_context)(struct draw_context *); int (*close_draw_context)(struct draw_context *); int (*show_element)(struct draw_context *); int (*hide_element)(struct draw_context *); int (*delete_element)(struct draw_context *); int (*release_element)(struct draw_context *); int (*set_element_prior)(struct draw_context *); int (*fill_rect)(struct draw_context *, u32 color); int (*draw_rect)(struct draw_context *, struct css_border *border); int (*draw_image)(struct draw_context *, u32 src, u8 quadrant, u8 *mask); int (*draw_point)(struct draw_context *, u16 x, u16 y, u32 color); u32(*read_point)(struct draw_context *dc, u16 x, u16 y); int (*invert_rect)(struct draw_context *, u32 color); void *(*load_widget_info)(void *_head, u8 page); void *(*load_css)(u8 page, void *_css); void *(*load_image_list)(u8 page, void *_list); void *(*load_text_list)(u8 page, void *__list); //int (*highlight)(struct draw_context *); int (*show_text)(struct draw_context *, struct ui_text_attrs *); int (*read_image_info)(struct draw_context *, u32, struct ui_image_attrs *); int (*open_device)(struct draw_context *, const char *device); int (*close_device)(int); int (*set_timer)(void *, void (*callback)(void *), u32 msec); int (*del_timer)(int); struct ui_file_browser *(*file_browser_open)(struct rect *r, const char *path, const char *ftype, int show_mode); int (*get_file_attrs)(struct ui_file_browser *, struct ui_file_attrs *attrs); int (*set_file_attrs)(struct ui_file_browser *, struct ui_file_attrs *attrs); int (*clear_file_preview)(struct ui_file_browser *, struct rect *r); int (*show_file_preview)(struct ui_file_browser *, struct rect *r, struct ui_file_attrs *attrs); int (*flush_file_preview)(struct ui_file_browser *); void *(*open_file)(struct ui_file_browser *, struct ui_file_attrs *attrs); int (*delete_file)(struct ui_file_browser *, struct ui_file_attrs *attrs); int (*move_file_preview)(struct ui_file_browser *_bro, struct rect *dst, struct rect *src); void (*file_browser_close)(struct ui_file_browser *); void *(*get_image_list)(); void *(*get_text_list)(); }; extern /* const */ struct ui_platform_api *platform_api; extern /* const */ struct element_event_handler dumy_handler; struct janimation { u8 persent[5]; u8 direction; u8 play_state; u8 iteration_count; u16 delay; u16 duration; struct element_css css[0]; }; extern struct element_event_handler *elm_event_handler_begin; extern struct element_event_handler *elm_event_handler_end; #define ___REGISTER_UI_EVENT_HANDLER(style, _id) \ static const struct element_event_handler element_event_handler_##_id \ sec(.elm_event_handler_##style) __attribute__((used)) = { \ .id = _id, #define __REGISTER_UI_EVENT_HANDLER(style, _id) \ ___REGISTER_UI_EVENT_HANDLER(style, _id) #define REGISTER_UI_EVENT_HANDLER(id) \ __REGISTER_UI_EVENT_HANDLER(STYLE_NAME, id) struct ui_style_info { const char *name; struct element_event_handler *begin; struct element_event_handler *end; }; extern struct ui_style_info ui_style_begin[]; extern struct ui_style_info ui_style_end[]; #define __REGISTER_UI_STYLE(style_name) \ extern struct element_event_handler elm_event_handler_begin_##style_name[]; \ extern struct element_event_handler elm_event_handler_end_##style_name[]; \ static const struct ui_style_info ui_style_##style_name sec(.ui_style) __attribute__((used)) = { \ .name = #style_name, \ .begin = elm_event_handler_begin_##style_name, \ .end = elm_event_handler_end_##style_name, \ }; #define REGISTER_UI_STYLE(style_name) #define REGISTER_UI_GLOBAL_STYLE(style_name) \ __REGISTER_UI_STYLE(style_name) extern struct element_event_handler *element_event_handler_for_id(u32 id); // { // struct element_event_handler *p; // // for (p = elm_event_handler_begin; p < elm_event_handler_end; p++) { // if (p->id == id) { // return p; // } // } // // return NULL; // } /* 获取控件的CSS属性 */ #define ui_core_get_element_css(elm) \ &((struct element *)(elm))->css /* 设置控件的invisible属性 */ #define ui_core_element_invisable(elm, i) \ ((struct element *)(elm))->css.invisible = i /* ------------------------------------------------------------------------------------*/ /** * @brief ui_core_init 杰理UI框架核心初始化 * * @param api UI框架API * @param rect UI显示区域 * * @return 0 正常 */ /* ------------------------------------------------------------------------------------*/ int ui_core_init(const struct ui_platform_api *api, struct rect *rect); /* ------------------------------------------------------------------------------------*/ /** * @brief ui_core_set_style 设置UI风格 * * @param style UI资源路径 * * @return 0 正常, -22 失败 */ /* ------------------------------------------------------------------------------------*/ int ui_core_set_style(const char *style); void ui_core_set_rotate(int _rotate); int ui_core_get_rotate(); /* ------------------------------------------------------------------------------------*/ /** * @brief ui_core_malloc UI内存申请 * * @param size 待申请内存大小 * @param ram_type 预计申请的内存类型 * @param module_type 发出申请请求的模块 * * @return 申请的内存指针 */ /* ------------------------------------------------------------------------------------*/ void *ui_core_malloc(int size, UI_RamType ram_type, UI_ModuleType module_type); /* ------------------------------------------------------------------------------------*/ /** * @brief ui_core_free UI内存释放 * * @param buf 待释放内存指针 * @param buf 待释放的内存类型 * @param buf 发出释放申请的模块 */ /* ------------------------------------------------------------------------------------*/ void ui_core_free(void *p, UI_RamType ram_type, UI_ModuleType module_type); void ui_core_element_init(struct element *, u32 id, u8 page, u8 prj, u8 css_num, struct element_css1 *, const struct element_event_handler * ); /* ------------------------------------------------------------------------------------*/ /** * @brief ui_core_get_element_abs_rect 获取控件绝对位置(UI工具上设置的位置) * * @param elm 控件元素句柄 * @param rect 绝对位置缓存指针(输出) */ /* ------------------------------------------------------------------------------------*/ void ui_core_get_element_abs_rect(struct element *elm, struct rect *rect); #define ui_core_get_element_own_rect(elm, rect) \ { \ (rect)->left = elm->css.left; \ (rect)->top = elm->css.top; \ (rect)->width = elm->css.width; \ (rect)->height = elm->css.height; \ } // 获取控件相对于屏幕的坐标 #define ui_core_get_element_rect_relative_screen(elm, rect) \ ui_core_get_element_abs_rect(elm, rect) // 获取控件相对于容器的坐标 #define ui_core_get_element_rect_relative_parent(elm, rect) \ ui_core_get_element_own_rect(elm, rect) /* ------------------------------------------------------------------------------------*/ /** * @brief ui_core_append_child 添加子元素,按照z_order从小到大排序,也就是从底层往上层排列。 * 重绘时从前往后遍历,onkey和ontouch时从后往前遍历 * * @param _child 待添加的子元素句柄 */ /* ------------------------------------------------------------------------------------*/ void ui_core_append_child(void *_child); /* ------------------------------------------------------------------------------------*/ /** * @brief ui_core_get_first_child 获取第一个子控件元素句柄 * * @return 元素句柄 */ /* ------------------------------------------------------------------------------------*/ struct element *ui_core_get_first_child(); /* ------------------------------------------------------------------------------------*/ /** * @brief ui_core_remove_element 从链表中移除子控件 * * @param _child 待移除的子控件句柄 */ /* ------------------------------------------------------------------------------------*/ void ui_core_remove_element(void *_child); /* ------------------------------------------------------------------------------------*/ /** * @brief ui_core_open_draw_context 打开显示上下文 * * @param dc 显示上下文 * @param elm 控件元素 * * @return 0 正常,其他异常 */ /* ------------------------------------------------------------------------------------*/ int ui_core_open_draw_context(struct draw_context *dc, struct element *elm); /* ------------------------------------------------------------------------------------*/ /** * @brief ui_core_close_draw_context 关闭显示上下文 * * @param dc 显示上下文指针 * * @return 0 正常,其他异常 */ /* ------------------------------------------------------------------------------------*/ int ui_core_close_draw_context(struct draw_context *dc); /* ------------------------------------------------------------------------------------*/ /** * @brief ui_core_show 显示控件元素 * * @param _elm 控件元素 * @param init 是否已经初始化(true 是,false 否) * * @return 0 正常,其他异常 */ /* ------------------------------------------------------------------------------------*/ int ui_core_show(void *_elm, int init); /* ------------------------------------------------------------------------------------*/ /** * @brief ui_core_hide 隐藏控件元素 * * @param _elm 控件元素 * * @return 0 正常,其他异常 */ /* ------------------------------------------------------------------------------------*/ int ui_core_hide(void *_elm); /* ------------------------------------------------------------------------------------*/ /** * @brief get_element_by_id 通过ID获取子控件元素 * * @param elm 父控件元素 * @param id 子控件ID * * @return 子控件元素 */ /* ------------------------------------------------------------------------------------*/ struct element *get_element_by_id(struct element *elm, u32 id); /* ------------------------------------------------------------------------------------*/ /** * @brief ui_core_get_element_nowarning_by_id 通过ID获取控件元素(不提供warning警告) * * @param id 控件ID * * @return 控件元素 */ /* ------------------------------------------------------------------------------------*/ struct element *ui_core_get_element_nowarning_by_id(u32 id); /* ------------------------------------------------------------------------------------*/ /** * @brief ui_core_get_element_by_id 通过ID获取控件元素 * * @param id 控件ID * * @return 控件元素 */ /* ------------------------------------------------------------------------------------*/ struct element *ui_core_get_element_by_id(u32 id); /* ------------------------------------------------------------------------------------*/ /** * @brief ui_core_get_disp_status_by_id 获取指定ID的控件显示状态 * * @param id 控件ID * * @return 0 隐藏,1 显示,其他异常 */ /* ------------------------------------------------------------------------------------*/ int ui_core_get_disp_status_by_id(u32 id); /* ------------------------------------------------------------------------------------*/ /** * @brief ui_core_set_disp_status_by_id 设置指定ID的控件显示状态 * * @param id 控件ID * * @param visiable 0 隐藏,1 显示,其他异常 * * @return 0 成功,其他 异常 */ /* ------------------------------------------------------------------------------------*/ int ui_core_set_disp_status_by_id(u32 id, int visiable); /* ------------------------------------------------------------------------------------*/ /** * @brief ui_core_get_up_element 获取指定元素上方的元素 * * @param elm 指定元素 * * @return 指定元素上方的元素 */ /* ------------------------------------------------------------------------------------*/ struct element *ui_core_get_up_element(struct element *elm); /* ------------------------------------------------------------------------------------*/ /** * @brief ui_core_get_down_element 获取指定元素下方的元素 * * @param elm 指定元素 * * @return 指定元素下方的元素 */ /* ------------------------------------------------------------------------------------*/ struct element *ui_core_get_down_element(struct element *elm); /* ------------------------------------------------------------------------------------*/ /** * @brief ui_core_get_left_element 获取指定元素左边的元素 * * @param elm 指定元素 * * @return 指定元素左边的元素 */ /* ------------------------------------------------------------------------------------*/ struct element *ui_core_get_left_element(struct element *elm); /* ------------------------------------------------------------------------------------*/ /** * @brief ui_core_get_right_element 获取指定元素右边的元素 * * @param elm 指定元素 * * @return 指定元素右边的元素 */ /* ------------------------------------------------------------------------------------*/ struct element *ui_core_get_right_element(struct element *elm); /* ------------------------------------------------------------------------------------*/ /** * @brief ui_core_put_element * * @param elm * * @return */ /* ------------------------------------------------------------------------------------*/ int ui_core_put_element(struct element *elm); /* ------------------------------------------------------------------------------------*/ /** * @brief ui_core_get_element * * @param elm * * @return 其他正常,-22异常 */ /* ------------------------------------------------------------------------------------*/ int ui_core_get_element(struct element *elm); /* ------------------------------------------------------------------------------------*/ /** * @brief ui_core_element_ontouch 触发元素触摸回调 * * @param elm 控件元素 * @param e 触摸事件 * * @return */ /* ------------------------------------------------------------------------------------*/ int ui_core_element_ontouch(struct element *, struct element_touch_event *e); /* ------------------------------------------------------------------------------------*/ /** * @brief ui_core_ontouch 触摸事件分发处理 * * @param e 触摸事件 * * @return */ /* ------------------------------------------------------------------------------------*/ int ui_core_ontouch(struct element_touch_event *e); /* ------------------------------------------------------------------------------------*/ /** * @brief ui_core_element_onkey 元素按键事件响应 * * @param elm 控件元素 * @param e 按键事件 * * @return */ /* ------------------------------------------------------------------------------------*/ int ui_core_element_onkey(struct element *elm, struct element_key_event *e); /* ------------------------------------------------------------------------------------*/ /** * @brief ui_core_onkey 按键事件分发处理 * * @param e 按键事件 * * @return */ /* ------------------------------------------------------------------------------------*/ int ui_core_onkey(struct element_key_event *e); /* ------------------------------------------------------------------------------------*/ /** * @brief ui_core_element_append_child 添加子元素,按照z_order从小到大排序,也就是从底层往上层排列,重绘时从前往后遍历,onkey和ontouch是从后往前遍历 * * @param parent 父控件元素 * @param child 子控件元素 */ /* ------------------------------------------------------------------------------------*/ void ui_core_element_append_child(struct element *parent, struct element *child); /* ------------------------------------------------------------------------------------*/ /** * @brief ui_core_set_element_css 设置控件元素的CSS属性 * * @param _elm 控件元素 * @param css 待设置的CSS属性 * * @return 设置后的CSS属性 */ /* ------------------------------------------------------------------------------------*/ struct element_css *ui_core_set_element_css(void *_elm, const struct element_css1 *css); int ui_core_invert_rect(struct draw_context *dc); /* ------------------------------------------------------------------------------------*/ /** * @brief ui_core_release_child_probe * * @param elm */ /* ------------------------------------------------------------------------------------*/ void ui_core_release_child_probe(struct element *elm); /* ------------------------------------------------------------------------------------*/ /** * @brief ui_core_release_child 释放子控件 * * @param elm 待释放的子控件元素 */ /* ------------------------------------------------------------------------------------*/ void ui_core_release_child(struct element *elm); /* ------------------------------------------------------------------------------------*/ /** * @brief ui_core_redraw 重绘控件元素 * * @param _elm 待重绘的控件元素 * * @return 0 正常,其他异常 */ /* ------------------------------------------------------------------------------------*/ int ui_core_redraw(void *_elm); /* ------------------------------------------------------------------------------------*/ /** * @brief ui_core_highlight_element 设置控件元素的高亮状态 * * @param elm 待高亮的控件元素 * @param yes 是否设置为为高亮状态 * * @return 0 正常,其他异常 */ /* ------------------------------------------------------------------------------------*/ int ui_core_highlight_element(struct element *elm, int yes); /* ------------------------------------------------------------------------------------*/ /** * @brief ui_core_get_focus 获取当前焦点 * * @return 焦点存在返回焦点,焦点不存在返回NULL */ /* ------------------------------------------------------------------------------------*/ struct element *ui_core_get_focus(); /* ------------------------------------------------------------------------------------*/ /** * @brief ui_core_element_on_focus 控件元素焦点设置 * * @param elm 控件元素 * @param yes 是否设置为焦点 */ /* ------------------------------------------------------------------------------------*/ void ui_core_element_on_focus(struct element *elm, int yes); /* ------------------------------------------------------------------------------------*/ /** * @brief ui_core_element_ontouch_focus 控件元素触摸事件聚焦 * * @param level 等级(一般为 int level = 0; &level 进行设置) * @param elm 控件元素 * @param e 触摸事件 * * @return true正常,false异常 */ /* ------------------------------------------------------------------------------------*/ int ui_core_element_ontouch_focus(int level, struct element *elm, struct element_touch_event *e); /* ------------------------------------------------------------------------------------*/ /** * @brief ui_core_ontouch_lose_focus 控件元素失去焦点 * * @param elm 控件元素 */ /* ------------------------------------------------------------------------------------*/ void ui_core_ontouch_lose_focus(struct element *elm); /* ------------------------------------------------------------------------------------*/ /** * @brief ui_core_ontouch_lock 控件触摸事件锁定(如果设置了锁定,触摸事件会发送到该控件) * * @param elm 控件元素 */ /* ------------------------------------------------------------------------------------*/ void ui_core_ontouch_lock(struct element *elm); /* ------------------------------------------------------------------------------------*/ /** * @brief ui_core_ontouch_unlock 控件触摸事件解锁 * * @param elm 控件元素 */ /* ------------------------------------------------------------------------------------*/ void ui_core_ontouch_unlock(struct element *elm); /* ------------------------------------------------------------------------------------*/ /** * @brief ui_core_get_draw_context 获取绘制上下文句柄 * * @param dc 显示上下文 * @param elm 控件元素 * @param draw 绘制区域 * * @return 0 */ /* ------------------------------------------------------------------------------------*/ int ui_core_get_draw_context(struct draw_context *dc, struct element *elm, struct rect *draw); /* ------------------------------------------------------------------------------------*/ /** * @brief ui_core_get_screen_draw_rect 获取屏幕绘制区域 * * @return rect 结构体,表示屏幕绘制区域 */ /* ------------------------------------------------------------------------------------*/ struct rect *ui_core_get_screen_draw_rect(); void ui_core_set_group(struct element *elm, int group, int chile_redo); void *ui_core_load_css(u8 page, void *_css); void *ui_core_load_imagelist(u8 page, void *_list); void *ui_core_load_textlist(u8 page, void *__list); void *ui_core_load_widget_info(void *__head, u8 page); int ui_core_get_dc(struct element *elm); int ui_core_set_element_hide_action(void *_elm, int redraw); int ui_core_set_element_background_image(void *_elm, int background_image); int ui_core_set_element_border(void *_elm, struct css_border *border); /* ------------------------------------------------------------------------------------*/ /** * @brief ui_core_set_element_rotate_en 设置控件elm旋转使能 * * @Params _elm 控件elm * @Params enable 是否使能(true 使能,false 不使能) * * @return false 未使能/控件不存在,ture 已使能 */ /* ------------------------------------------------------------------------------------*/ int ui_core_set_element_rotate_en(void *_elm, u8 enable); /* ------------------------------------------------------------------------------------*/ /** * @brief ui_core_set_element_rotate 设置控件elm旋转参数 * * @Params _elm 控件elm * @Params cx 图片旋转中心X * @Params cy 图片旋转中心Y * @Params dx 屏幕旋转中心X,相对于父控件 * @Params dy 屏幕旋转中心Y,相对于父控件 * @Params angle 旋转角度 * @Params en 是否使能 * * @return true 设置成功,false 未使能/控件不存在,未设置 */ /* ------------------------------------------------------------------------------------*/ int ui_core_set_element_rotate(void *_elm, s16 cx, s16 cy, s16 dx, s16 dy, float angle, u8 en); /* ------------------------------------------------------------------------------------*/ /** * @brief ui_core_set_element_ratio_en 设置控件缩放使能 * * @Params _elm 控件 * @Params enable 是否使能(true 使能,false 不使能) * * @return true 使能,false 未使能/控件不存在 */ /* ------------------------------------------------------------------------------------*/ int ui_core_set_element_ratio_en(void *_elm, u8 enable); /* ------------------------------------------------------------------------------------*/ /** * @brief ui_core_set_element_ratio 设置控件缩放参数 * * @Params _elm 控件 * @Params ratio_w 水平缩放倍率 * @Params ratio_h 垂直缩放倍率 * @Params en 是否使能 * * @return true 设置完成,false 未使能/控件不存在,未设置 */ /* ------------------------------------------------------------------------------------*/ int ui_core_set_element_ratio(void *_elm, float ratio_w, float ratio_h, u8 en); /* ------------------------------------------------------------------------------------*/ /** * @brief ui_core_set_element_ratio_change_rect 缩放的同时按缩放系数修改控件rect * * @param _elm elm 控件 * @param yes 是否修改 * * @return */ /* ------------------------------------------------------------------------------------*/ int ui_core_set_element_ratio_change_rect(void *_elm, int yes); int ui_core_release_element_css(void *_elm); int ui_core_get_rotate_abs_rect(struct element *elm, struct rect *rect); int ui_core_element_hide(struct element *elm); int ui_core_element_show(struct element *elm); int ui_core_put_element(struct element *elm); int ui_get_current_window_id(); int ui_core_element_delete(struct element *elm); u32 *get_ui_mem_id(); u32 get_ui_mem_id_size(); void set_ui_open_flag(u8 flag); u8 get_ui_open_flag(); u8 get_ui_init_status(); void ui_backlight_close(void); void ui_backlight_open(u8 recover_cur_page); /* ------------------------------------------------------------------------------------*/ /** * @brief ui_core_set_effect_redraw_time 设置特效刷新间隔(在跟手刷屏基础上多久插入一次) * * @Params ms_time 以ms为单位 * * @return 无 */ /* ------------------------------------------------------------------------------------*/ void ui_core_set_effect_redraw_time(int ms_time); // ~~~~~~~~~~~ 以下为lua相关接口 // extern int run_lua_string(int len, const char *string); // void *ui_core_load_lua(u8 page, void *_lua); // void ui_core_free_lua(void *_lua); #endif