#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); }