improve self_layouter_menu_to_string

This commit is contained in:
lixianjing 2024-04-19 18:37:41 +08:00
parent ad6dfc9ce2
commit eb518146c4
3 changed files with 202 additions and 15 deletions

View File

@ -3,6 +3,7 @@
2024/04/19
* 增加函数str\_shrink/wstr\_shrink。
* 修复mledit初始化时最大行数小于实际行数会崩溃的问题(感谢培煌发现问题)。
* 实现self\_layouter\_menu\_t的to_string函数增加测试用例(感谢颖健提供补丁)
2024/04/18
* 添加 EVT\_UI\_LOAD 事件以便UI资源加载完成时可以响应该事件进行初始化(感谢朝泽提供补丁)

View File

@ -33,27 +33,189 @@ typedef enum _layout_position_t {
POSITION_RIGHT = 'r',
POSITION_UP = 'u',
POSITION_DOWN = 'd',
POSITION_UNDEF = '\0'
} layout_position_t;
static ret_t percent_to_string(char* buff, uint32_t size, const char* prefix, double v) {
if (v == floor(v)) {
tk_snprintf(buff, size - 1, "%s%d%%", prefix, (int)(v));
} else {
tk_snprintf(buff, size - 1, "%s%2.2lf%%", prefix, v);
}
return RET_OK;
}
const char* self_layouter_menu_to_string(self_layouter_t* layouter) {
char value[32];
str_t* str = &(layouter->params);
self_layouter_menu_t* layout = (self_layouter_menu_t*)layouter;
return_value_if_fail(layout != NULL, NULL);
str_set(str, "menu(");
memset(value, 0x00, sizeof(value));
switch (layout->position) {
case POSITION_UP: {
tk_snprintf(value, sizeof(value), "up");
break;
}
case POSITION_DOWN: {
tk_snprintf(value, sizeof(value), "down");
break;
}
case POSITION_LEFT: {
tk_snprintf(value, sizeof(value), "left");
break;
}
case POSITION_RIGHT: {
tk_snprintf(value, sizeof(value), "right");
break;
}
case POSITION_POINT: {
tk_snprintf(value, sizeof(value), "point");
break;
}
case POSITION_UNDEF: {
*value = '\0';
}
}
if (*value) {
str_append_more(str, "position=", value, NULL);
}
switch (layout->x_attr) {
case X_ATTR_UNDEF: {
*value = '\0';
break;
}
case X_ATTR_CENTER: {
tk_snprintf(value, sizeof(value), "center");
break;
}
case X_ATTR_RIGHT: {
tk_snprintf(value, sizeof(value), "right");
break;
}
case X_ATTR_DEFAULT: {
tk_snprintf(value, sizeof(value), "left");
break;
}
default: {
tk_snprintf(value, sizeof(value), "%d", (int)layout->x_attr);
break;
}
}
if (*value) {
str_append_more(str, ",x=", value, NULL);
}
switch (layout->y_attr) {
case Y_ATTR_UNDEF: {
*value = '\0';
break;
}
case Y_ATTR_MIDDLE: {
tk_snprintf(value, sizeof(value), "middle");
break;
}
case Y_ATTR_BOTTOM: {
tk_snprintf(value, sizeof(value), "bottom");
break;
}
case Y_ATTR_DEFAULT: {
tk_snprintf(value, sizeof(value), "top");
break;
}
default: {
tk_snprintf(value, sizeof(value), "%d", (int)layout->y_attr);
break;
}
}
if (*value) {
str_append_more(str, ",y=", value, NULL);
}
switch(layout->w_attr) {
case W_ATTR_UNDEF: {
*value = '\0';
break;
}
case W_ATTR_PERCENT: {
percent_to_string(value, sizeof(value), "", layout->w);
break;
}
default: {
tk_snprintf(value, sizeof(value) - 1, "%d", (int)layout->w);
break;
}
}
if (*value) {
str_append_more(str, ",w=", value, NULL);
}
switch (layout->h_attr) {
case H_ATTR_UNDEF: {
*value = '\0';
break;
}
case H_ATTR_PERCENT: {
percent_to_string(value, sizeof(value), "", layout->h);
break;
}
default: {
tk_snprintf(value, sizeof(value) - 1, "%d", (int)layout->h);
break;
}
}
if (*value) {
str_append_more(str, ",h=", value, ")", NULL);
} else {
str_append_char(str, ')');
}
return str->str;
}
ret_t self_layouter_menu_get_param(self_layouter_t* layouter, const char* name, value_t* v) {
self_layouter_menu_t* l = (self_layouter_menu_t*)layouter;
switch (*name) {
case 'x': {
value_set_int(v, l->x_attr);
if (l->x_attr == X_ATTR_UNDEF) {
value_set_int(v, X_ATTR_DEFAULT);
} else {
value_set_int(v, l->x_attr);
}
return RET_OK;
}
case 'y': {
value_set_int(v, l->y_attr);
if (l->y_attr == Y_ATTR_UNDEF) {
value_set_int(v, Y_ATTR_DEFAULT);
} else {
value_set_int(v, l->y_attr);
}
return RET_OK;
}
case 'p': {
value_set_int(v, l->position);
if (l->position == POSITION_UNDEF) {
value_set_int(v, POSITION_POINT);
} else {
value_set_int(v, l->position);
}
return RET_OK;
}
case 'w': {
if (name[1]) {
value_set_int(v, l->w_attr);
if (l->w_attr == W_ATTR_UNDEF) {
value_set_int(v, W_ATTR_PIXEL);
} else {
value_set_int(v, l->w_attr);
}
} else {
value_set_int(v, l->w);
}
@ -62,7 +224,11 @@ ret_t self_layouter_menu_get_param(self_layouter_t* layouter, const char* name,
}
case 'h': {
if (name[1]) {
value_set_int(v, l->h_attr);
if (l->h_attr == H_ATTR_UNDEF) {
value_set_int(v, H_ATTR_PIXEL);
} else {
value_set_int(v, l->h_attr);
}
} else {
value_set_int(v, l->h);
}
@ -87,11 +253,13 @@ ret_t self_layouter_menu_set_param(self_layouter_t* layouter, const char* name,
layout->x_attr = X_ATTR_CENTER;
} else if (x[0] == 'r') {
layout->x_attr = X_ATTR_RIGHT;
} else if (x[0] == 'l') {
layout->x_attr = X_ATTR_DEFAULT;
} else {
if (tk_isdigit(*x)) {
layout->x_attr = tk_atoi(x);
} else {
layout->x_attr = X_ATTR_DEFAULT;
layout->x_attr = X_ATTR_UNDEF;
}
}
break;
@ -102,11 +270,13 @@ ret_t self_layouter_menu_set_param(self_layouter_t* layouter, const char* name,
layout->y_attr = Y_ATTR_MIDDLE;
} else if (y[0] == 'b') {
layout->y_attr = Y_ATTR_BOTTOM;
} else if (y[0] == 't') {
layout->y_attr = X_ATTR_DEFAULT;
} else {
if (tk_isdigit(*y)) {
layout->y_attr = tk_atoi(y);
} else {
layout->y_attr = X_ATTR_DEFAULT;
layout->y_attr = X_ATTR_UNDEF;
}
}
break;
@ -121,8 +291,10 @@ ret_t self_layouter_menu_set_param(self_layouter_t* layouter, const char* name,
layout->position = POSITION_UP;
} else if (p[0] == 'd') {
layout->position = POSITION_DOWN;
} else {
} else if (p[0] == 'p') {
layout->position = POSITION_POINT;
} else {
layout->position = POSITION_UNDEF;
}
break;
}
@ -133,6 +305,8 @@ ret_t self_layouter_menu_set_param(self_layouter_t* layouter, const char* name,
if (w != NULL) {
if (strchr(w, '%') != NULL) {
layout->w_attr = W_ATTR_PERCENT;
} else if (strchr(w, 'n') != NULL) {
layout->w_attr = W_ATTR_UNDEF;
}
}
break;
@ -144,6 +318,8 @@ ret_t self_layouter_menu_set_param(self_layouter_t* layouter, const char* name,
if (h != NULL) {
if (strchr(h, '%') != NULL) {
layout->h_attr = H_ATTR_PERCENT;
} else if (strchr(h, 'n') != NULL) {
layout->w_attr = W_ATTR_UNDEF;
}
}
break;
@ -185,6 +361,7 @@ static ret_t widget_layout_calc(self_layouter_menu_t* layout, rect_t* r, wh_t pa
r->h = h;
switch (layout->position) {
case POSITION_UNDEF:
case POSITION_POINT: {
int32_t px = layout->pressed.x;
int32_t py = layout->pressed.y;
@ -215,10 +392,10 @@ static ret_t widget_layout_calc(self_layouter_menu_t* layout, rect_t* r, wh_t pa
if (layout->position == POSITION_LEFT) {
x = px - r->w;
x -= layout->x_attr;
x -= (layout->x_attr == X_ATTR_UNDEF ? X_ATTR_DEFAULT : layout->x_attr);
} else {
x = px + pw;
x += layout->x_attr;
x += (layout->x_attr == X_ATTR_UNDEF ? X_ATTR_DEFAULT : layout->x_attr);
}
switch (layout->y_attr) {
@ -251,10 +428,10 @@ static ret_t widget_layout_calc(self_layouter_menu_t* layout, rect_t* r, wh_t pa
if (layout->position == POSITION_DOWN) {
y = py + ph;
y -= layout->y_attr;
y -= (layout->y_attr == Y_ATTR_UNDEF ? Y_ATTR_DEFAULT : layout->y_attr);
} else {
y = py - r->h;
y += layout->y_attr;
y += (layout->y_attr == Y_ATTR_UNDEF ? Y_ATTR_DEFAULT : layout->y_attr);
}
switch (layout->x_attr) {
@ -372,6 +549,7 @@ static self_layouter_t* self_layouter_menu_clone(self_layouter_t* layouter) {
static const self_layouter_vtable_t s_self_layouter_menu_vtable = {
.type = "menu",
.clone = self_layouter_menu_clone,
.to_string = self_layouter_menu_to_string,
.get_param = self_layouter_menu_get_param,
.set_param = self_layouter_menu_set_param,
.layout = self_layouter_menu_layout,
@ -390,11 +568,11 @@ self_layouter_t* self_layouter_menu_create(void) {
l = (self_layouter_t*)layouter;
layouter->x_attr = 0;
layouter->y_attr = 0;
layouter->x_attr = X_ATTR_UNDEF;
layouter->y_attr = Y_ATTR_UNDEF;
layouter->w_attr = W_ATTR_UNDEF;
layouter->h_attr = H_ATTR_UNDEF;
layouter->position = POSITION_POINT;
layouter->position = POSITION_UNDEF;
str_init(&(l->params), 0);
l->vt = &s_self_layouter_menu_vtable;

View File

@ -28,6 +28,7 @@ TEST(SelfLayoutMenu, point) {
ASSERT_EQ(w->y, 30);
ASSERT_EQ(w->w, 30);
ASSERT_EQ(w->h, 40);
ASSERT_EQ(string(self_layouter_to_string(layouter)), string(layout_params));
self_layouter_destroy(layouter);
widget_destroy(w);
@ -55,6 +56,7 @@ TEST(SelfLayoutMenu, left_top) {
ASSERT_EQ(w->y, 100);
ASSERT_EQ(w->w, 30);
ASSERT_EQ(w->h, 40);
ASSERT_EQ(string(self_layouter_to_string(layouter)), string(layout_params));
self_layouter_destroy(layouter);
widget_destroy(w);
@ -83,6 +85,7 @@ TEST(SelfLayoutMenu, right_top) {
ASSERT_EQ(w->y, 100);
ASSERT_EQ(w->w, 200);
ASSERT_EQ(w->h, 150);
ASSERT_EQ(string(self_layouter_to_string(layouter)), string(layout_params));
self_layouter_destroy(layouter);
widget_destroy(w);
@ -109,6 +112,7 @@ TEST(SelfLayoutMenu, left_middle) {
ASSERT_EQ(w->y, 105);
ASSERT_EQ(w->w, 30);
ASSERT_EQ(w->h, 40);
ASSERT_EQ(string(self_layouter_to_string(layouter)), string(layout_params));
self_layouter_destroy(layouter);
widget_destroy(w);
@ -135,6 +139,7 @@ TEST(SelfLayoutMenu, left_bottom) {
ASSERT_EQ(w->y, 110);
ASSERT_EQ(w->w, 30);
ASSERT_EQ(w->h, 40);
ASSERT_EQ(string(self_layouter_to_string(layouter)), string(layout_params));
self_layouter_destroy(layouter);
widget_destroy(w);
@ -161,6 +166,7 @@ TEST(SelfLayoutMenu, up_left) {
ASSERT_EQ(w->y, 160);
ASSERT_EQ(w->w, 30);
ASSERT_EQ(w->h, 40);
ASSERT_EQ(string(self_layouter_to_string(layouter)), string(layout_params));
self_layouter_destroy(layouter);
widget_destroy(w);
@ -187,6 +193,7 @@ TEST(SelfLayoutMenu, down_left) {
ASSERT_EQ(w->y, 50);
ASSERT_EQ(w->w, 30);
ASSERT_EQ(w->h, 40);
ASSERT_EQ(string(self_layouter_to_string(layouter)), string(layout_params));
self_layouter_destroy(layouter);
widget_destroy(w);
@ -257,6 +264,7 @@ TEST(SelfLayoutMenu, out_of_area) {
ASSERT_EQ(w->y, 530);
ASSERT_EQ(w->w, 100);
ASSERT_EQ(w->h, 70);
ASSERT_EQ(string(self_layouter_to_string(layouter)), string(layout_params));
self_layouter_destroy(layouter);
widget_destroy(w);