mcu_ab568x/app/platform/gui/components/compo_form.c
2025-05-30 18:03:10 +08:00

356 lines
12 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "include.h"
#define TRACE_EN 0
#if TRACE_EN
#define TRACE(...) printf(__VA_ARGS__)
#else
#define TRACE(...)
#endif
#define MAX_WORD_CNT 32 //标题最多32个字符
#if (GUI_SCREEN_WIDTH == 240 && GUI_SCREEN_HEIGHT == 240)
#define GUI_PAGE_HEAD_HEIGHT (55)
#else
#define GUI_PAGE_HEAD_HEIGHT (GUI_SCREEN_HEIGHT / 8)
#endif
#define GUI_PAGE_BODY_HEIGHT (GUI_SCREEN_HEIGHT - GUI_PAGE_HEAD_HEIGHT)
#define GUI_PAGE_BODY_CENTER_Y (GUI_PAGE_HEAD_HEIGHT + GUI_PAGE_BODY_HEIGHT / 2)
#if (GUI_SCREEN_WIDTH == 240 && GUI_SCREEN_HEIGHT == 296 && FLASH_SIZE >= FSIZE_4M)
#define GUI_PAGE_TITLE_WIDTH (GUI_SCREEN_WIDTH * 2 / 5 - 8)
#define GUI_PAGE_TIME_WIDTH (GUI_SCREEN_WIDTH * 2 / 5 - 8)
#else
#define GUI_PAGE_TITLE_WIDTH (GUI_SCREEN_WIDTH * 2 / 5)
#define GUI_PAGE_TIME_WIDTH (GUI_SCREEN_WIDTH * 2 / 5)
#endif
/**
* @brief 创建窗体
窗体为其他组件的容器
* @param[in] flag_top : 是否放在界面的顶层
false在底层
true在顶层
* @return 返回窗体指针
**/
compo_form_t *compo_form_create(bool flag_top)
{
compo_form_t *frm = compo_pool_create(flag_top);
widget_page_t *page = widget_pool_create(flag_top);
widget_icon_t *icon = widget_icon_create(page, 0);
widget_set_pos(icon, GUI_SCREEN_CENTER_X, GUI_SCREEN_CENTER_Y);
widget_set_size(icon, GUI_SCREEN_WIDTH, GUI_SCREEN_HEIGHT);
widget_page_t *page_body = widget_page_create(page);
#if (GUI_SCREEN_WIDTH == 240 && GUI_SCREEN_HEIGHT == 240)
widget_text_t *time = widget_text_create(page_body, 8);
#else
widget_text_t *time = widget_text_create(page, 8);
#endif
widget_set_location(page, GUI_SCREEN_CENTER_X, GUI_SCREEN_CENTER_Y, GUI_SCREEN_WIDTH, GUI_SCREEN_HEIGHT);
widget_set_location(page_body, GUI_SCREEN_CENTER_X, GUI_SCREEN_CENTER_Y, GUI_SCREEN_WIDTH, GUI_SCREEN_HEIGHT);
// widget_set_align_center(time, false);
#if (GUI_SCREEN_WIDTH == 240 && GUI_SCREEN_HEIGHT == 296 && FLASH_SIZE >= FSIZE_4M)
widget_set_location(time, GUI_SCREEN_WIDTH - GUI_PAGE_TIME_WIDTH + 16, GUI_PAGE_HEAD_HEIGHT - FORM_TITLE_HEIGHT + 10, GUI_PAGE_TIME_WIDTH, FORM_TITLE_HEIGHT);
#elif( GUI_SCREEN_WIDTH == 240 && GUI_SCREEN_HEIGHT == 240)
widget_set_location(time, GUI_SCREEN_CENTER_X, 19, 104, GUI_SCREEN_HEIGHT/12);
#else
widget_set_location(time, GUI_SCREEN_WIDTH - GUI_PAGE_TIME_WIDTH + 8, GUI_PAGE_HEAD_HEIGHT - FORM_TITLE_HEIGHT + 8, GUI_PAGE_TIME_WIDTH, FORM_TITLE_HEIGHT);
#endif
widget_text_set_font(time, UI_BUF_FONT_FORM_TIME);
#if (GUI_SCREEN_WIDTH == 240 && GUI_SCREEN_HEIGHT == 240)
widget_text_set_right_align(time, false);
#else
widget_text_set_right_align(time, true);
#endif
widget_set_visible(time, false);
frm->type = COMPO_TYPE_FORM;
frm->page = page;
frm->icon = icon;
frm->time = time;
#if (GUI_SCREEN_WIDTH == 240 && GUI_SCREEN_HEIGHT == 240)
frm->page_body = page_body;
#else
frm->page_body = page;
#endif
compo_textbox_t *title = compo_textbox_create(frm, MAX_WORD_CNT);
#if (GUI_SCREEN_WIDTH == 240 && GUI_SCREEN_HEIGHT == 240)
#else
frm->page_body = page_body;
#endif
compo_textbox_set_align_center(title, false);
#if (GUI_SCREEN_WIDTH ==128 && GUI_SCREEN_HEIGHT == 160)
compo_textbox_set_location(title, FORM_TITLE_LEFT + 4, GUI_PAGE_HEAD_HEIGHT - FORM_TITLE_HEIGHT, GUI_PAGE_TITLE_WIDTH - 10, FORM_TITLE_HEIGHT);
#elif( GUI_SCREEN_WIDTH == 240 && GUI_SCREEN_HEIGHT == 240)
compo_textbox_set_location(title, GUI_SCREEN_CENTER_X, 42, GUI_SCREEN_WIDTH/3*2, GUI_SCREEN_HEIGHT/10);
#else
compo_textbox_set_location(title, FORM_TITLE_LEFT + 8, GUI_PAGE_HEAD_HEIGHT - FORM_TITLE_HEIGHT, GUI_PAGE_TITLE_WIDTH, FORM_TITLE_HEIGHT);
#endif
compo_textbox_set_multiline(title, false);
compo_textbox_set_autosize(title, false);
#if (GUI_SCREEN_WIDTH == 240 && GUI_SCREEN_HEIGHT == 240)
compo_textbox_set_align_center(title, true);
#else
compo_textbox_set_align_center(title, false);
#endif
compo_textbox_set_autoroll_mode(title, TEXT_AUTOROLL_MODE_NULL);
compo_textbox_set_visible(title, true);
frm->title = title;
#if (GUI_SCREEN_WIDTH == 240 && GUI_SCREEN_HEIGHT == 240)
widget_icon_t *title_icon = widget_icon_create(page_body, 0);
#else
widget_icon_t *title_icon = widget_icon_create(page, 0);
#endif
widget_set_pos(title_icon, FORM_TITLE_LEFT + 10, GUI_PAGE_HEAD_HEIGHT - FORM_TITLE_HEIGHT / 2 - 2);
widget_set_size(title_icon, FORM_TITLE_HEIGHT, FORM_TITLE_HEIGHT);
widget_set_visible(title_icon, false);
frm->title_icon = title_icon;
return frm;
}
/**
* @brief 销毁窗体
* @param[in] frm : 窗体指针
**/
void compo_form_destroy(compo_form_t *frm)
{
if (frm == NULL) {
return;
}
widget_pool_clear(frm->page);
compo_pool_clear(frm);
}
/**
* @brief 设置窗体坐标及大小
注意:该设置默认的坐标是以中心点作为参考点
* @param[in] frm : 窗体指针
* @param[in] x : x轴坐标
* @param[in] y : y轴坐标
* @param[in] width : 窗体宽度
* @param[in] height : 窗体高度
**/
void compo_form_set_location(compo_form_t *frm, s16 x, s16 y, s16 width, s16 height)
{
if (frm == NULL || frm->page == NULL) {
halt(HALT_GUI_COMPO_FORM_PTR);
}
widget_set_location(frm->page, x, y, width, height);
}
/**
* @brief 设置窗体坐标
注意:该设置默认的坐标是以中心点作为参考点
* @param[in] frm : 窗体指针
* @param[in] x : x轴坐标
* @param[in] y : y轴坐标
**/
void compo_form_set_pos(compo_form_t *frm, s16 x, s16 y)
{
if (frm == NULL || frm->page == NULL) {
halt(HALT_GUI_COMPO_FORM_PTR);
}
widget_set_pos(frm->page, x, y);
}
/**
* @brief 窗体缩放
以中心点缩放
* @param[in] frm : 窗体指针
* @param[in] width : 缩放后的窗体宽度
* @param[in] height : 缩放后的窗体高度
**/
void compo_form_scale_to(compo_form_t *frm, s16 width, s16 height)
{
if (frm == NULL || frm->page == NULL) {
halt(HALT_GUI_COMPO_FORM_PTR);
}
widget_page_scale_to(frm->page, width, height);
}
/**
* @brief 窗体设置Alpha
* @param[in] frm : 窗体指针
* @param[in] alpha : 透明度
**/
void compo_form_set_alpha(compo_form_t *frm, u8 alpha)
{
if (frm == NULL || frm->page == NULL) {
halt(HALT_GUI_COMPO_FORM_PTR);
}
widget_set_alpha(frm->page, alpha);
}
/**
* @brief 更新窗体信息
* @param[in] frm : 窗体指针
**/
static void compo_form_page_update(compo_form_t *frm)
{
#if (GUI_SCREEN_WIDTH == 240 && GUI_SCREEN_HEIGHT == 240)
if (frm->mode == 0) {
widget_set_visible(frm->time, false);
widget_set_visible(frm->title_icon, false);
compo_textbox_set_visible(frm->title, false);
} else {
compo_textbox_set_visible(frm->title, (frm->mode & COMPO_FORM_MODE_SHOW_TITLE) != 0);
widget_set_visible(frm->time, (frm->mode & COMPO_FORM_MODE_SHOW_TIME) != 0);
widget_set_visible(frm->title_icon, (frm->mode & COMPO_FORM_MODE_SHOW_ICON) != 0);
}
#else
if (frm->mode == 0) {
widget_set_visible(frm->time, false);
widget_set_visible(frm->title_icon, false);
compo_textbox_set_visible(frm->title, false);
widget_set_location(frm->page_body, GUI_SCREEN_CENTER_X, GUI_SCREEN_CENTER_Y, GUI_SCREEN_WIDTH, GUI_SCREEN_HEIGHT);
widget_page_set_client(frm->page_body, 0, 0);
} else {
compo_textbox_set_visible(frm->title, (frm->mode & COMPO_FORM_MODE_SHOW_TITLE) != 0);
widget_set_visible(frm->time, (frm->mode & COMPO_FORM_MODE_SHOW_TIME) != 0);
widget_set_visible(frm->title_icon, (frm->mode & COMPO_FORM_MODE_SHOW_ICON) != 0);
widget_set_location(frm->page_body, GUI_SCREEN_CENTER_X, GUI_PAGE_BODY_CENTER_Y, GUI_SCREEN_WIDTH, GUI_PAGE_BODY_HEIGHT);
widget_page_set_client(frm->page_body, 0, -GUI_PAGE_HEAD_HEIGHT);
}
#endif
}
/**
* @brief 设置窗体标题栏
通常和compo_form_set_title窗体模式一起调用
* @param[in] frm : 窗体指针
* @param[in] title : 标题文本
**/
void compo_form_set_title(compo_form_t *frm, const char *title)
{
if (title != NULL) {
frm->mode |= COMPO_FORM_MODE_SHOW_TITLE;
compo_textbox_set(frm->title, title);
compo_textbox_t *compo_textbox = frm->title;
area_t text_area = widget_text_get_area(compo_textbox->txt);
rect_t textbox_rect = widget_get_location(compo_textbox->txt);
if (text_area.wid > textbox_rect.wid) {
compo_textbox->roll_cb.mode = TEXT_AUTOROLL_MODE_SROLL_CIRC;
compo_textbox->roll_cb.direction = -1;
}
compo_form_page_update(frm);
}
}
/**
* @brief 设置窗体模式
通常和compo_form_set_title窗体标题栏一起调用
* @param[in] frm : 窗体指针
* @param[in] mode : COMPO_FORM_MODE_SHOW_TITLE BIT(0) 标题栏显示文字
COMPO_FORM_MODE_SHOW_TIME BIT(1) 标题栏显示时间
**/
void compo_form_set_mode(compo_form_t *frm, int mode)
{
frm->mode = mode;
compo_form_page_update(frm);
}
/**
* @brief 设置窗体标题居中
* @param[in] frm : 窗体指针
* @param[in] align_center : 是否居中
**/
void compo_form_set_title_center(compo_form_t *frm, bool align_center)
{
compo_textbox_set_align_center(frm->title, align_center);
compo_textbox_set_location(frm->title, GUI_SCREEN_CENTER_X, GUI_PAGE_HEAD_HEIGHT - (FORM_TITLE_HEIGHT >> 1), GUI_PAGE_TITLE_WIDTH, FORM_TITLE_HEIGHT);
}
/**
* @author gzj
* @brief 设置窗体标题移动[自己瞎加的-如果后续使用过程中出现问题记得排查]
* @param[in] frm : 窗体指针
* @param[in] move_y : 移动的y坐标
**/
void compo_form_set_title_move_y(compo_form_t *frm, s16 move_y)
{
widget_set_pos(frm->time, GUI_SCREEN_CENTER_X, GUI_PAGE_HEAD_HEIGHT + 19 - move_y);
compo_textbox_set_pos(frm->title, GUI_SCREEN_CENTER_X, GUI_PAGE_HEAD_HEIGHT + 40 - move_y);
}
/**
* @brief 窗体中添加图片
注意:该设置默认的坐标是以中心点作为参考点
* @param[in] frm : 窗体指针
* @param[in] res_addr : 图片资源的地址
* @param[in] x : x轴坐标
* @param[in] y : y轴坐标
**/
void compo_form_add_image(compo_form_t *frm, u32 res_addr, s16 x, s16 y)
{
//背景图不需要复杂功能使用widget_icon更省Buffer
widget_icon_t *icon = widget_icon_create(frm->page_body, res_addr);
widget_set_pos(icon, x, y);
}
void compo_form_add_image_page(compo_form_t *frm, u32 res_addr, s16 x, s16 y)
{
//背景图不需要复杂功能使用widget_icon更省Buffer
widget_icon_t *icon = widget_icon_create(frm->page, res_addr);
widget_set_pos(icon, x, y);
}
/**
* @brief 窗体中设置背景
* @param[in] frm : 窗体指针
* @param[in] res_addr : 图片资源的地址
**/
void compo_form_set_bg(compo_form_t *frm, u32 res_addr)
{
widget_icon_set(frm->icon, res_addr);
}
void compo_form_set_bg2(compo_form_t *frm, u32 res_addr, s16 x, s16 y)
{
widget_icon_set(frm->icon, res_addr);
widget_set_pos(frm->icon, x, y);
}
/**
* @brief title的图标
* @param[in] frm : 窗体指针
* @param[in] res_addr : 图片资源的地址
**/
void compo_form_set_title_icon(compo_form_t *frm, u32 res_addr)
{
if (widget_text_get_area(frm->title->txt).wid) {
widget_set_pos(frm->title_icon, FORM_TITLE_LEFT + widget_text_get_area(frm->title->txt).wid +
gui_image_get_size(res_addr).wid / 2 + 5, GUI_PAGE_HEAD_HEIGHT - FORM_TITLE_HEIGHT / 2 - 2);
widget_set_size(frm->title_icon, FORM_TITLE_HEIGHT, FORM_TITLE_HEIGHT);
}
widget_icon_set(frm->title_icon, res_addr);
compo_form_page_update(frm);
}
/**
* @brief 设置窗体标题栏
通常和compo_form_set_title窗体模式一起调用
* @param[in] frm : 窗体指针
* @param[in] color : 标题文本颜色
**/
void compo_form_set_title_color(compo_form_t *frm, u16 color)
{
compo_textbox_set_forecolor(frm->title,color);
}