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

107 lines
2.9 KiB
C

#include "include.h"
#define TRACE_EN 1
#if TRACE_EN
#define TRACE(...) printf(__VA_ARGS__)
#else
#define TRACE(...)
#endif
//根据数字图像资源创建一个数字, num_cnt表示该数字最大位数
compo_number_t *compo_number_create(compo_form_t *frm, u32 res_addr, int num_cnt)
{
int i;
if (num_cnt <= 0 || num_cnt > MAX_NUMBER_CNT) {
halt(HALT_GUI_COMPO_NUMBER_CNT);
}
compo_number_t *num = compo_create(frm, COMPO_TYPE_NUMBER);
widget_page_t *page = widget_page_create(frm->page);
num->flag_zfill = false;
num->page = page;
num->num_cnt = num_cnt;
num->max_val = 1;
for (i=0; i<num_cnt; i++) {
widget_page_t *page_num = widget_page_create(page);
widget_set_align_center(page_num, false);
widget_image_t *img = widget_image_create(page_num, res_addr);
widget_set_align_center(img, false);
if (num->num_wid == 0) {
area_t area = widget_image_get_size(img);
num->num_wid = area.wid;
num->num_hei = area.hei / 10;
}
widget_set_size(page_num, num->num_wid, num->num_hei);
num->page_num[i] = page_num;
num->max_val *= 10;
}
num->max_val--;
compo_number_set_margin(num, num->num_wid / 8);
return num;
}
//设置数字值
void compo_number_set(compo_number_t *num, int val)
{
int i, znum;
if (val < 0 || val > num->max_val) {
halt(HALT_GUI_COMPO_NUMBER_VALUE);
}
num->value = val;
znum = num->num_cnt - 1;
for (i=znum; i>=0; i--) {
int v = val % 10;
val /= 10;
widget_page_set_client(num->page_num[i], 0, -v * num->num_hei);
widget_set_visible(num->page_num[i], true);
if (v > 0) {
znum = i;
}
}
if (!num->flag_zfill) {
for (i=0; i<znum; i++) {
widget_set_visible(num->page_num[i], false);
}
}
}
//设置坐标及大小
void compo_number_set_location(compo_number_t *num, s16 x, s16 y, s16 width, s16 height)
{
widget_set_location(num->page, x, y, width, height);
}
//设置坐标
void compo_number_set_pos(compo_number_t *num, s16 x, s16 y)
{
widget_set_pos(num->page, x, y);
}
//设置透明度
void compo_number_set_alpha(compo_number_t *num, u8 alpha)
{
widget_set_alpha(num->page, alpha);
}
//设置字间距
void compo_number_set_margin(compo_number_t *num, int margin)
{
int i, x;
x = 0;
for (i=0; i<num->num_cnt; i++) {
if (i != 0) {
x += margin;
}
widget_set_pos(num->page_num[i], x, 0);
x += num->num_wid;
}
widget_set_size(num->page, x, num->num_hei);
}
//设置高位是否填0
void compo_number_set_zfill(compo_number_t *num, bool flag)
{
num->flag_zfill = flag;
compo_number_set(num, num->value);
}