Files
AC707N/SDK/interface/ui/jlui/control.h
T
2025-12-03 11:12:34 +08:00

582 lines
17 KiB
C

/* 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