feat(obj): add unified obj property set/get API (#4579)

Signed-off-by: Xu Xingliang <xuxingliang@xiaomi.com>
This commit is contained in:
Neo Xu
2023-10-26 15:39:30 +08:00
committed by GitHub
parent ce6f56a742
commit 726620d0fc
14 changed files with 736 additions and 2 deletions

View File

@@ -97,7 +97,7 @@ set(COMPILE_OPTIONS
-Wmissing-prototypes
-Wpointer-arith
-Wmultichar
-Wpedantic
-Wno-pedantic # ignored for now, we convert functions to pointers for propertis table.
-Wreturn-type
-Wshadow
-Wshift-negative-value

View File

@@ -89,3 +89,4 @@
#define LV_USE_OBJ_ID 1
#define LV_USE_OBJ_ID_BUILTIN 1
#define LV_USE_OBJ_PROPERTY 1

View File

@@ -0,0 +1,157 @@
#if LV_BUILD_TEST
#include "../lvgl.h"
#include "unity/unity.h"
void test_obj_property_fail_on_invalid_id(void)
{
lv_obj_t * obj = lv_obj_create(lv_scr_act());
lv_property_t prop = { };
prop.id = LV_PROPERTY_ID_INVALID;
TEST_ASSERT_EQUAL_INT(LV_RESULT_INVALID, lv_obj_set_property(obj, &prop));
prop.id = LV_PROPERTY_ID_BUILTIN_LAST; /* No widget use this ID */
TEST_ASSERT_EQUAL_INT(LV_RESULT_INVALID, lv_obj_set_property(obj, &prop));
prop.id = LV_PROPERTY_OBJ_PARENT + 1; /* Not a valid ID for obj */
TEST_ASSERT_EQUAL_INT(LV_RESULT_INVALID, lv_obj_set_property(obj, &prop));
prop.id = LV_PROPERTY_IMAGE_OFFSET_X; /* Not an ID for obj but for image */
TEST_ASSERT_EQUAL_INT(LV_RESULT_INVALID, lv_obj_set_property(obj, &prop));
prop.id = LV_PROPERTY_OBJ_PARENT; /* Valid ID */
prop.ptr = lv_scr_act();
TEST_ASSERT_EQUAL_INT(LV_RESULT_OK, lv_obj_set_property(obj, &prop));
}
void test_obj_property_set_get_should_match(void)
{
lv_obj_t * obj = lv_obj_create(lv_scr_act());
lv_obj_t * root = lv_obj_create(lv_scr_act());
lv_property_t prop = { };
lv_color_t color = {.red = 0x11, .green = 0x22, .blue = 0x33};
/* Style property should work */
/* int type */
prop.id = LV_STYLE_X;
prop.num = 0xaabb;
TEST_ASSERT_TRUE(lv_obj_set_property(obj, &prop) == LV_RESULT_OK);
TEST_ASSERT_EQUAL_UINT32(0xaabb, lv_obj_get_style_x(obj, 0));
TEST_ASSERT_EQUAL_UINT32(0xaabb, lv_obj_get_property(obj, LV_STYLE_X).num);
/* color type */
prop.id = LV_STYLE_BG_COLOR;
prop.color = color;
TEST_ASSERT_TRUE(lv_obj_set_property(obj, &prop) == LV_RESULT_OK);
TEST_ASSERT_EQUAL_COLOR(color, lv_obj_get_style_bg_color(obj, LV_PART_MAIN));
TEST_ASSERT_EQUAL_COLOR(color, lv_obj_get_property(obj, LV_STYLE_BG_COLOR).color);
/* pointer type */
prop.id = LV_STYLE_TEXT_FONT;
prop.ptr = &lv_font_montserrat_26;
TEST_ASSERT_TRUE(lv_obj_set_property(obj, &prop) == LV_RESULT_OK);
TEST_ASSERT_EQUAL_PTR(&lv_font_montserrat_26, lv_obj_get_style_text_font(obj, LV_PART_MAIN));
TEST_ASSERT_EQUAL_PTR(&lv_font_montserrat_26, lv_obj_get_property(obj, LV_STYLE_TEXT_FONT).ptr);
/* Object flags */
prop.id = LV_PROPERTY_OBJ_FLAG_HIDDEN ;
prop.num = 1;
TEST_ASSERT_TRUE(lv_obj_set_property(obj, &prop) == LV_RESULT_OK);
TEST_ASSERT_TRUE(lv_obj_has_flag(obj, LV_OBJ_FLAG_HIDDEN));
TEST_ASSERT_TRUE(lv_obj_get_property(obj, LV_PROPERTY_OBJ_FLAG_HIDDEN).num);
prop.id = LV_PROPERTY_OBJ_FLAG_CLICKABLE;
prop.num = 0;
TEST_ASSERT_TRUE(lv_obj_set_property(obj, &prop) == LV_RESULT_OK);
TEST_ASSERT_FALSE(lv_obj_has_flag(obj, LV_OBJ_FLAG_CLICKABLE));
TEST_ASSERT_FALSE(lv_obj_get_property(obj, LV_PROPERTY_OBJ_FLAG_CLICKABLE).num);
/* Obj property */
prop.id = LV_PROPERTY_OBJ_PARENT;
prop.ptr = root;
TEST_ASSERT_TRUE(lv_obj_set_property(obj, &prop) == LV_RESULT_OK);
TEST_ASSERT_EQUAL_PTR(root, lv_obj_get_parent(obj));
TEST_ASSERT_EQUAL_PTR(root, lv_obj_get_property(obj, LV_PROPERTY_OBJ_PARENT).ptr);
/* Derived widget could use same property */
lv_obj_t * img = lv_image_create(obj);
prop.id = LV_PROPERTY_OBJ_PARENT;
prop.ptr = root;
TEST_ASSERT_TRUE(lv_obj_set_property(img, &prop) == LV_RESULT_OK);
TEST_ASSERT_EQUAL_PTR(root, lv_obj_get_parent(img));
TEST_ASSERT_EQUAL_PTR(root, lv_obj_get_property(img, LV_PROPERTY_OBJ_PARENT).ptr);
/* Image properties */
prop.id = LV_PROPERTY_IMAGE_OFFSET_X;
prop.num = 0x1234;
TEST_ASSERT_TRUE(lv_obj_set_property(img, &prop) == LV_RESULT_OK);
TEST_ASSERT_EQUAL_UINT16(0x1234, lv_img_get_offset_x(img));
TEST_ASSERT_EQUAL_UINT16(0x1234, lv_obj_get_property(img, LV_PROPERTY_IMAGE_OFFSET_X).num);
}
void test_obj_property_flag(void)
{
const struct {
uint32_t flag;
uint32_t id;
} properties[] = {
{ LV_OBJ_FLAG_HIDDEN, LV_PROPERTY_OBJ_FLAG_HIDDEN },
{ LV_OBJ_FLAG_CLICKABLE, LV_PROPERTY_OBJ_FLAG_CLICKABLE },
{ LV_OBJ_FLAG_CLICK_FOCUSABLE, LV_PROPERTY_OBJ_FLAG_CLICK_FOCUSABLE },
{ LV_OBJ_FLAG_CHECKABLE, LV_PROPERTY_OBJ_FLAG_CHECKABLE },
{ LV_OBJ_FLAG_SCROLLABLE, LV_PROPERTY_OBJ_FLAG_SCROLLABLE },
{ LV_OBJ_FLAG_SCROLL_ELASTIC, LV_PROPERTY_OBJ_FLAG_SCROLL_ELASTIC },
{ LV_OBJ_FLAG_SCROLL_MOMENTUM, LV_PROPERTY_OBJ_FLAG_SCROLL_MOMENTUM },
{ LV_OBJ_FLAG_SCROLL_ONE, LV_PROPERTY_OBJ_FLAG_SCROLL_ONE },
{ LV_OBJ_FLAG_SCROLL_CHAIN_HOR, LV_PROPERTY_OBJ_FLAG_SCROLL_CHAIN_HOR },
{ LV_OBJ_FLAG_SCROLL_CHAIN_VER, LV_PROPERTY_OBJ_FLAG_SCROLL_CHAIN_VER },
{ LV_OBJ_FLAG_SCROLL_ON_FOCUS, LV_PROPERTY_OBJ_FLAG_SCROLL_ON_FOCUS },
{ LV_OBJ_FLAG_SCROLL_WITH_ARROW, LV_PROPERTY_OBJ_FLAG_SCROLL_WITH_ARROW },
{ LV_OBJ_FLAG_SNAPPABLE, LV_PROPERTY_OBJ_FLAG_SNAPPABLE },
{ LV_OBJ_FLAG_PRESS_LOCK, LV_PROPERTY_OBJ_FLAG_PRESS_LOCK },
{ LV_OBJ_FLAG_EVENT_BUBBLE, LV_PROPERTY_OBJ_FLAG_EVENT_BUBBLE },
{ LV_OBJ_FLAG_GESTURE_BUBBLE, LV_PROPERTY_OBJ_FLAG_GESTURE_BUBBLE },
{ LV_OBJ_FLAG_ADV_HITTEST, LV_PROPERTY_OBJ_FLAG_ADV_HITTEST },
{ LV_OBJ_FLAG_IGNORE_LAYOUT, LV_PROPERTY_OBJ_FLAG_IGNORE_LAYOUT },
{ LV_OBJ_FLAG_FLOATING, LV_PROPERTY_OBJ_FLAG_FLOATING },
{ LV_OBJ_FLAG_SEND_DRAW_TASK_EVENTS, LV_PROPERTY_OBJ_FLAG_SEND_DRAW_TASK_EVENTS },
{ LV_OBJ_FLAG_OVERFLOW_VISIBLE, LV_PROPERTY_OBJ_FLAG_OVERFLOW_VISIBLE },
{ LV_OBJ_FLAG_FLEX_IN_NEW_TRACK, LV_PROPERTY_OBJ_FLAG_FLEX_IN_NEW_TRACK },
{ LV_OBJ_FLAG_LAYOUT_1, LV_PROPERTY_OBJ_FLAG_LAYOUT_1 },
{ LV_OBJ_FLAG_LAYOUT_2, LV_PROPERTY_OBJ_FLAG_LAYOUT_2 },
{ LV_OBJ_FLAG_WIDGET_1, LV_PROPERTY_OBJ_FLAG_WIDGET_1 },
{ LV_OBJ_FLAG_WIDGET_2, LV_PROPERTY_OBJ_FLAG_WIDGET_2 },
{ LV_OBJ_FLAG_USER_1, LV_PROPERTY_OBJ_FLAG_USER_1 },
{ LV_OBJ_FLAG_USER_2, LV_PROPERTY_OBJ_FLAG_USER_2 },
{ LV_OBJ_FLAG_USER_3, LV_PROPERTY_OBJ_FLAG_USER_3 },
{ LV_OBJ_FLAG_USER_4, LV_PROPERTY_OBJ_FLAG_USER_4 },
};
lv_obj_t * obj = lv_obj_create(lv_scr_act());
obj->flags = 0;
for(unsigned long i = 0; i < sizeof(properties) / sizeof(properties[0]); i++) {
TEST_ASSERT_FALSE(lv_obj_get_property(obj, properties[i].id).num);
lv_obj_add_flag(obj, properties[i].flag);
TEST_ASSERT_TRUE(lv_obj_get_property(obj, properties[i].id).num);
lv_obj_remove_flag(obj, properties[i].flag);
TEST_ASSERT_FALSE(lv_obj_get_property(obj, properties[i].id).num);
lv_property_t prop = { };
prop.id = properties[i].id;
prop.num = 1;
TEST_ASSERT_TRUE(lv_obj_set_property(obj, &prop) == LV_RESULT_OK);
TEST_ASSERT_TRUE(lv_obj_get_property(obj, properties[i].id).num);
TEST_ASSERT_TRUE(lv_obj_has_flag(obj, properties[i].flag));
prop.id = properties[i].id;
prop.num = 0;
TEST_ASSERT_TRUE(lv_obj_set_property(obj, &prop) == LV_RESULT_OK);
TEST_ASSERT_FALSE(lv_obj_get_property(obj, properties[i].id).num);
TEST_ASSERT_FALSE(lv_obj_has_flag(obj, properties[i].flag));
}
}
#endif