356 lines
12 KiB
C
356 lines
12 KiB
C
#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);
|
||
|
||
}
|