476 lines
15 KiB
C
476 lines
15 KiB
C
#include "include.h"
|
||
|
||
#define TRACE_EN 0
|
||
|
||
#if TRACE_EN
|
||
#define TRACE(...) printf(__VA_ARGS__)
|
||
#else
|
||
#define TRACE(...)
|
||
#endif
|
||
|
||
/**
|
||
* @brief 创建一个卡片控件
|
||
* @param[in] frm : 窗体指针
|
||
* @param[in] rect_num : 卡片包含的矩形背景数量
|
||
* @param[in] icon_num : 卡片包含的图片数量
|
||
* @param[in] text_num : 卡片包含的文本数量
|
||
* @param[in] org_wid, org_hei : 卡片原始宽高
|
||
* @return 返回卡片指针
|
||
**/
|
||
compo_cardbox_t *compo_cardbox_create(compo_form_t *frm, u8 rect_num, u8 icon_num, u8 text_num, u16 org_wid, u16 org_hei)
|
||
{
|
||
int i;
|
||
compo_cardbox_t *cardbox = compo_create(frm, COMPO_TYPE_CARDBOX);
|
||
widget_page_t *page = widget_page_create(frm->page_body);
|
||
widget_set_size(page, org_wid, org_hei);
|
||
widget_page_set_client(page, org_wid / 2, org_hei / 2); //卡片内控件参考坐标:卡片中心
|
||
cardbox->page = page;
|
||
rect_num = MIN(rect_num, CARD_RECT_MAX);
|
||
for (i=0; i<rect_num; i++) {
|
||
cardbox->rect[i] = widget_rect_create(page);
|
||
}
|
||
icon_num = MIN(icon_num, CARD_ICON_MAX);
|
||
for (i=0; i<icon_num; i++) {
|
||
cardbox->icon[i] = widget_image_create(page, 0);
|
||
}
|
||
text_num = MIN(text_num, CARD_TEXT_MAX);
|
||
for (i=0; i<text_num; i++) {
|
||
cardbox->text[i] = widget_text_create(page, CARD_MAX_WORD_CNT);
|
||
widget_text_set_autosize(cardbox->text[i], false);
|
||
}
|
||
|
||
return cardbox;
|
||
}
|
||
|
||
|
||
/**
|
||
* @author gzj[慎用,容易蓝屏]
|
||
* @brief 创建一个卡片控件
|
||
* @param[in] frm : 窗体指针
|
||
* @param[in] rect_num : 卡片包含的矩形背景数量
|
||
* @param[in] icon_num : 卡片包含的图片数量
|
||
* @param[in] text_num : 卡片包含的文本数量
|
||
* @param[in] org_wid, org_hei : 卡片原始宽高
|
||
* @return 返回卡片指针
|
||
**/
|
||
compo_cardbox_t *compo_cardbox_create_set_strlen(compo_form_t *frm, u8 rect_num, u8 icon_num, u8 text_num, u16 org_wid, u16 org_hei,u8 strlen)
|
||
{
|
||
int i;
|
||
compo_cardbox_t *cardbox = compo_create(frm, COMPO_TYPE_CARDBOX);
|
||
widget_page_t *page = widget_page_create(frm->page_body);
|
||
widget_set_size(page, org_wid, org_hei);
|
||
widget_page_set_client(page, org_wid / 2, org_hei / 2); //卡片内控件参考坐标:卡片中心
|
||
cardbox->page = page;
|
||
rect_num = MIN(rect_num, CARD_RECT_MAX);
|
||
for (i=0; i<rect_num; i++) {
|
||
cardbox->rect[i] = widget_rect_create(page);
|
||
}
|
||
icon_num = MIN(icon_num, CARD_ICON_MAX);
|
||
for (i=0; i<icon_num; i++) {
|
||
cardbox->icon[i] = widget_image_create(page, 0);
|
||
}
|
||
text_num = MIN(text_num, CARD_TEXT_MAX);
|
||
for (i=0; i<text_num; i++) {
|
||
cardbox->text[i] = widget_text_create(page, strlen);
|
||
widget_text_set_autosize(cardbox->text[i], false);
|
||
}
|
||
|
||
return cardbox;
|
||
}
|
||
|
||
/**
|
||
* @brief 设置卡片(圆角)矩形背景颜色
|
||
* @param[in] cardbox : 卡片指针
|
||
* @param[in] idx : 矩形指针存储序号
|
||
* @param[in] color : 色值
|
||
**/
|
||
void compo_cardbox_rect_set_color(compo_cardbox_t *cardbox, u8 idx, u16 color)
|
||
{
|
||
if (cardbox->rect[idx] && idx < CARD_RECT_MAX) {
|
||
widget_rect_set_color(cardbox->rect[idx], color);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @brief 设置卡片(圆角)矩形背景尺寸
|
||
* @param[in] cardbox : 卡片指针
|
||
* @param[in] idx : 矩形指针存储序号
|
||
* @param[in] x,y,wid,hei,r : 位置、宽、高、圆角半径
|
||
**/
|
||
void compo_cardbox_rect_set_location(compo_cardbox_t *cardbox, u8 idx, s16 x, s16 y, u16 wid, u16 hei, u16 r)
|
||
{
|
||
if (cardbox->rect[idx] && idx < CARD_RECT_MAX) {
|
||
widget_set_location(cardbox->rect[idx], x, y, wid, hei);
|
||
widget_rect_set_radius(cardbox->rect[idx], r);
|
||
}
|
||
}
|
||
|
||
|
||
/**
|
||
* @brief 设置卡片控件的图片裁剪
|
||
* @param[in] cardbox : 卡片指针
|
||
* @param[in] idx : 图片指针存储序号
|
||
* @param[in] index : 裁剪序号
|
||
* @param[in] total_cnt : 分割总数
|
||
**/
|
||
void compo_cardbox_icon_cut(compo_cardbox_t *cardbox, u8 idx, u8 index, u8 total_cnt)
|
||
{
|
||
widget_image_t *img = cardbox->icon[idx] ;
|
||
if (img && idx < CARD_ICON_MAX && total_cnt && index < total_cnt) {
|
||
rect_t rect = widget_get_location(img);
|
||
area_t area = widget_image_get_size(img);
|
||
widget_image_cut(img, 0, index * (area.hei / total_cnt), area.wid, area.hei / total_cnt);
|
||
widget_set_size(img, rect.wid, rect.hei);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @brief 设置卡片控件的图片
|
||
* @param[in] cardbox : 卡片指针
|
||
* @param[in] idx : 图片指针存储序号
|
||
* @param[in] x,y,wid,hei : 位置和大小
|
||
**/
|
||
void compo_cardbox_icon_set_location(compo_cardbox_t *cardbox, u8 idx, s16 x, s16 y, u16 wid, u16 hei)
|
||
{
|
||
if (cardbox->icon[idx] && idx < CARD_ICON_MAX) {
|
||
widget_set_location(cardbox->icon[idx], x, y, wid, hei);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @brief 设置卡片控件的图片
|
||
* @param[in] cardbox : 卡片指针
|
||
* @param[in] idx : 图片指针存储序号
|
||
* @param[in] x,y,wid,hei : 位置和大小
|
||
**/
|
||
void compo_cardbox_icon_set_pos(compo_cardbox_t *cardbox, u8 idx, s16 x, s16 y)
|
||
{
|
||
if (cardbox->icon[idx] && idx < CARD_ICON_MAX) {
|
||
widget_set_pos(cardbox->icon[idx], x, y);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @brief 更改卡片控件的图片
|
||
* @param[in] cardbox : 卡片指针
|
||
* @param[in] idx : 图片指针存储序号
|
||
* @param[in] res_addr : 资源地址
|
||
**/
|
||
void compo_cardbox_icon_set(compo_cardbox_t *cardbox, u8 idx, u32 res_addr)
|
||
{
|
||
if (cardbox->icon[idx] && idx < CARD_ICON_MAX) {
|
||
widget_image_set(cardbox->icon[idx], res_addr);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @brief 设置卡片控件的文本
|
||
* @param[in] cardbox : 卡片指针
|
||
* @param[in] idx : 文本指针存储序号
|
||
* @param[in] x,y,wid,hei : 位置和大小(默认非autosize)
|
||
**/
|
||
void compo_cardbox_text_set_location(compo_cardbox_t *cardbox, u8 idx, s16 x, s16 y, u16 wid, u16 hei)
|
||
{
|
||
if (cardbox->text[idx] && idx < CARD_TEXT_MAX) {
|
||
widget_set_location(cardbox->text[idx], x, y, wid, hei);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @brief 更新卡片控件的文本内容
|
||
* @param[in] cardbox : 卡片指针
|
||
* @param[in] idx : 文本指针存储序号
|
||
* @param[in] str : 文本字符串指针
|
||
**/
|
||
void compo_cardbox_text_set(compo_cardbox_t *cardbox, u8 idx, const char *str)
|
||
{
|
||
if (cardbox->text[idx] && idx < CARD_TEXT_MAX) {
|
||
widget_text_set(cardbox->text[idx], str);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @brief 更换卡片控件的文本字库
|
||
* @param[in] cardbox : 卡片指针
|
||
* @param[in] idx : 文本指针存储序号
|
||
* @param[in] font_res_addr : 设置字库资源地址
|
||
**/
|
||
void compo_cardbox_text_set_font(compo_cardbox_t *cardbox, u8 idx, u32 font_res_addr)
|
||
{
|
||
if (cardbox->text[idx] && idx < CARD_TEXT_MAX) {
|
||
widget_text_set_font(cardbox->text[idx], font_res_addr);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @brief 更改卡片控件的文本颜色
|
||
* @param[in] cardbox : 卡片指针
|
||
* @param[in] idx : 文本指针存储序号
|
||
* @param[in] color : 颜色
|
||
**/
|
||
void compo_cardbox_text_set_color(compo_cardbox_t *cardbox, u8 idx, u16 color)
|
||
{
|
||
if (cardbox->text[idx] && idx < CARD_TEXT_MAX) {
|
||
widget_text_set_color(cardbox->text[idx], color);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @brief 设置卡片控件文本是否中心点对齐
|
||
* @param[in] cardbox : 卡片指针
|
||
* @param[in] idx : 文本指针存储序号
|
||
* @param[in] align_center : 是否中心点对齐
|
||
**/
|
||
void compo_cardbox_text_set_align_center(compo_cardbox_t *cardbox, u8 idx, bool align_center)
|
||
{
|
||
if (cardbox->text[idx] && idx < CARD_TEXT_MAX) {
|
||
widget_set_align_center(cardbox->text[idx], align_center);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @brief 设置卡片内文本框是否自适应尺寸
|
||
* @param[in] cardbox : 卡片指针
|
||
* @param[in] idx : 文本指针存储序号
|
||
* @param[in] autosize : 是否自适应尺寸
|
||
**/
|
||
void compo_cardbox_text_set_autosize(compo_cardbox_t *cardbox, u8 idx, bool autosize)
|
||
{
|
||
if (cardbox->text[idx] && idx < CARD_TEXT_MAX) {
|
||
widget_text_set_autosize(cardbox->text[idx], autosize);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @brief 获取卡片内文本字体区域
|
||
* @param[in] cardbox : 卡片指针
|
||
* @param[in] idx : 文本指针存储序号
|
||
* @return 文本内容的宽度和高度
|
||
**/
|
||
area_t compo_cardbox_text_get_area(compo_cardbox_t *cardbox, u8 idx)
|
||
{
|
||
area_t area = {0};
|
||
if (cardbox->text[idx] && idx < CARD_TEXT_MAX) {
|
||
area = widget_text_get_area(cardbox->text[idx]);
|
||
}
|
||
return area;
|
||
}
|
||
|
||
/**
|
||
* @brief 卡片控件文本0滚动刷新
|
||
注意:1.文本需要set_align_center为false,否则初始状态无法保证左对齐;
|
||
2.界面文本控件较多时可能出现C203蓝屏,需减小MAX_WORD_CNT或增大GUI_ELE_BUF_SIZE
|
||
* @param[in] cardbox : 卡片指针
|
||
* @return 无
|
||
**/
|
||
void compo_cardbox_text0_scroll_process(compo_cardbox_t *cardbox)
|
||
{
|
||
widget_text_t *txt = cardbox->text[0];
|
||
if (txt) {
|
||
rect_t rect_card = widget_get_location(cardbox->page);
|
||
if (rect_card.y < (-rect_card.hei / 2) || rect_card.y > (GUI_SCREEN_HEIGHT + rect_card.hei / 2)) { //卡片超出屏幕,滚动重置
|
||
cardbox->roll_cb.mode = TEXT_AUTOROLL_MODE_NULL;
|
||
widget_text_set_client(txt, 0, 0);
|
||
return;
|
||
}
|
||
if (cardbox->roll_cb.mode == TEXT_AUTOROLL_MODE_NULL) { //重置
|
||
if (widget_get_visble(txt)) {
|
||
area_t text_area = widget_text_get_area(txt);
|
||
rect_t textbox_rect = widget_get_location(txt);
|
||
if (text_area.wid > textbox_rect.wid) {
|
||
memset(&cardbox->roll_cb, 0, sizeof(compo_roll_cb_t));
|
||
cardbox->roll_cb.tick = tick_get();
|
||
cardbox->roll_cb.mode = TEXT_AUTOROLL_MODE_SROLL_CIRC;
|
||
cardbox->roll_cb.direction = -1;
|
||
if (widget_get_align_center(txt)) {
|
||
cardbox->roll_cb.offset = (text_area.wid - textbox_rect.wid) / 2;
|
||
}
|
||
widget_text_set_autoroll_mode(txt, TEXT_AUTOROLL_MODE_SROLL_CIRC);
|
||
} else {
|
||
widget_text_set_autoroll_mode(txt, TEXT_AUTOROLL_MODE_NULL);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
/**
|
||
* @brief 卡片控件文本0滚动暂停/继续
|
||
* @param[in] cardbox : 卡片指针
|
||
* @param[in] pause : true暂停,false继续
|
||
* @return 无
|
||
**/
|
||
void compo_cardbox_text0_scroll_pause(compo_cardbox_t *cardbox, bool pause)
|
||
{
|
||
if (cardbox->text[0]) {
|
||
cardbox->roll_cb.direction = pause ? 0 : -1;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @brief 卡片控件文本0滚动重置(赋值后需要重新计算)
|
||
* @param[in] cardbox : 卡片指针
|
||
* @return 无
|
||
**/
|
||
void compo_cardbox_text0_scroll_reset(compo_cardbox_t *cardbox)
|
||
{
|
||
if (cardbox->text[0]) {
|
||
cardbox->roll_cb.mode = TEXT_AUTOROLL_MODE_NULL;
|
||
widget_text_set_client(cardbox->text[0], 0, 0);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @brief 设置卡片控件的位置和缩放大小
|
||
* @param[in] cardbox : 卡片指针
|
||
* @param[in] x,y,wid,hei : 位置和缩放大小
|
||
**/
|
||
void compo_cardbox_set_location(compo_cardbox_t *cardbox, s16 x, s16 y, u16 wid, u16 hei)
|
||
{
|
||
widget_page_scale_to(cardbox->page, wid, hei);
|
||
widget_set_pos(cardbox->page, x, y);
|
||
}
|
||
|
||
/**
|
||
* @brief 设置卡片控件的位置
|
||
* @param[in] cardbox : 卡片指针
|
||
* @param[in] x,y : 位置
|
||
**/
|
||
void compo_cardbox_set_pos(compo_cardbox_t *cardbox, s16 x, s16 y)
|
||
{
|
||
widget_set_pos(cardbox->page, x, y);
|
||
}
|
||
|
||
/**
|
||
* @brief 获取卡片控件的位置和缩放大小
|
||
* @param[in] cardbox : 卡片指针
|
||
* @param[in] x,y,wid,hei : 位置和缩放大小
|
||
**/
|
||
rect_t compo_cardbox_get_location(compo_cardbox_t *cardbox)
|
||
{
|
||
rect_t rect = {0};
|
||
rect = widget_get_location(cardbox->page);
|
||
|
||
return rect;
|
||
}
|
||
|
||
/**
|
||
* @brief 获取卡片绝对位置和大小
|
||
* @param[in] cardbox : 卡片指针
|
||
* @return 返回卡片page绝对位置和大小
|
||
**/
|
||
rect_t compo_cardbox_get_absolute(compo_cardbox_t *cardbox)
|
||
{
|
||
return widget_get_absolute(cardbox->page);
|
||
}
|
||
|
||
/**
|
||
* @brief 获取卡片内矩形的绝对位置和大小
|
||
* @param[in] cardbox : 卡片指针
|
||
* @param[in] idx : 矩形指针存储序号
|
||
* @return 返回相应序号图片的绝对位置和大小
|
||
**/
|
||
rect_t compo_cardbox_get_rect_absolute(compo_cardbox_t *cardbox, u8 idx)
|
||
{
|
||
rect_t rect = {0};
|
||
if (cardbox->rect[idx] && idx < CARD_RECT_MAX) {
|
||
rect = widget_get_absolute(cardbox->rect[idx]);
|
||
}
|
||
return rect;
|
||
}
|
||
|
||
/**
|
||
* @brief 获取卡片内图片的绝对位置和大小
|
||
* @param[in] cardbox : 卡片指针
|
||
* @param[in] idx : 图片指针存储序号
|
||
* @return 返回相应序号图片的绝对位置和大小
|
||
**/
|
||
rect_t compo_cardbox_get_icon_absolute(compo_cardbox_t *cardbox, u8 idx)
|
||
{
|
||
rect_t rect = {0};
|
||
if (cardbox->icon[idx] && idx < CARD_ICON_MAX) {
|
||
rect = widget_get_absolute(cardbox->icon[idx]);
|
||
}
|
||
return rect;
|
||
}
|
||
|
||
/**
|
||
* @brief 设置卡片中图片可见性
|
||
* @param[in] cardbox : 卡片指针
|
||
**/
|
||
void compo_cardbox_icon_set_visible(compo_cardbox_t *cardbox, u8 idx, bool visible)
|
||
{
|
||
if (cardbox->icon[idx] && idx < CARD_ICON_MAX) {
|
||
widget_set_visible(cardbox->icon[idx], visible);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @brief 设置卡片中文字可见性
|
||
* @param[in] cardbox : 卡片指针
|
||
**/
|
||
void compo_cardbox_text_set_visible(compo_cardbox_t *cardbox, u8 idx, bool visible)
|
||
{
|
||
if (cardbox->text[idx] && idx < CARD_TEXT_MAX) {
|
||
widget_set_visible(cardbox->text[idx], visible);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @brief 设置卡片可见性
|
||
* @param[in] cardbox : 卡片指针
|
||
**/
|
||
void compo_cardbox_set_visible(compo_cardbox_t *cardbox, bool visible)
|
||
{
|
||
widget_set_visible(cardbox->page, visible);
|
||
}
|
||
|
||
/**
|
||
* @brief 获取卡片可见性
|
||
* @param[in] cardbox : 卡片指针
|
||
**/
|
||
bool compo_cardbox_get_visible(compo_cardbox_t *cardbox)
|
||
{
|
||
return widget_get_visble(cardbox->page);
|
||
}
|
||
|
||
|
||
/**
|
||
* @brief 设置相对坐标
|
||
* @param[in] cardbox : 卡片指针
|
||
**/
|
||
void compo_cardbox_set_client(compo_cardbox_t *cardbox, s16 x, s16 y)
|
||
{
|
||
widget_page_set_client(cardbox->page, x, y);
|
||
}
|
||
|
||
|
||
/**
|
||
* @brief 判断点击区域是否在卡片内
|
||
* @param[in] cardbox : 卡片指针
|
||
* @param[in] pt : 点击区域
|
||
* @return true or false
|
||
**/
|
||
bool compo_cardbox_btn_is(compo_cardbox_t *cardbox, point_t pt)
|
||
{
|
||
rect_t rect = compo_cardbox_get_absolute(cardbox);
|
||
|
||
if (abs_s(pt.x - rect.x) * 2 <= rect.wid && abs_s(pt.y - rect.y) * 2 <= rect.hei) {
|
||
return true;
|
||
}
|
||
|
||
return false;
|
||
}
|
||
|
||
|
||
/**
|
||
* @brief 设置透明度
|
||
* @param[in] cardbox : 卡片指针
|
||
* @param[in] alpha : 透明度(0 ~ 0xff)
|
||
**/
|
||
void compo_cardbox_set_alpha(compo_cardbox_t *cardbox, u8 alpha)
|
||
{
|
||
widget_set_alpha(cardbox->page, alpha);
|
||
}
|