diff --git a/src/core/lv_obj_property.h b/src/core/lv_obj_property.h index 868540a8b3..313915ff58 100644 --- a/src/core/lv_obj_property.h +++ b/src/core/lv_obj_property.h @@ -67,6 +67,7 @@ enum { LV_PROPERTY_KEYBOARD_START = 0x0400, /* lv_keyboard.c */ LV_PROPERTY_TEXTAREA_START = 0x0500, /* lv_textarea.c */ LV_PROPERTY_ROLLER_START = 0x0600, /* lv_roller.c */ + LV_PROPERTY_DROPDOWN_START = 0x0700, /* lv_dropdown.c */ /*Special ID, use it to extend ID and make sure it's unique and compile time determinant*/ LV_PROPERTY_ID_BUILTIN_LAST = 0xffff, /*ID of 0x10000 ~ 0xfffffff is reserved for user*/ diff --git a/src/widgets/dropdown/lv_dropdown.c b/src/widgets/dropdown/lv_dropdown.c index 38e136c6c3..354ad1aabc 100644 --- a/src/widgets/dropdown/lv_dropdown.c +++ b/src/widgets/dropdown/lv_dropdown.c @@ -62,6 +62,55 @@ static lv_obj_t * get_label(const lv_obj_t * obj); /********************** * STATIC VARIABLES **********************/ +#if LV_USE_OBJ_PROPERTY +static const lv_property_ops_t properties[] = { + { + .id = LV_PROPERTY_DROPDOWN_TEXT, + .setter = lv_dropdown_set_text, + .getter = lv_dropdown_get_text, + }, + { + .id = LV_PROPERTY_DROPDOWN_OPTIONS, + .setter = lv_dropdown_set_options, + .getter = lv_dropdown_get_options, + }, + { + .id = LV_PROPERTY_DROPDOWN_OPTION_COUNT, + .setter = NULL, + .getter = lv_dropdown_get_option_count, + }, + { + .id = LV_PROPERTY_DROPDOWN_SELECTED, + .setter = lv_dropdown_set_selected, + .getter = lv_dropdown_get_selected, + }, + { + .id = LV_PROPERTY_DROPDOWN_DIR, + .setter = lv_dropdown_set_dir, + .getter = lv_dropdown_get_dir, + }, + { + .id = LV_PROPERTY_DROPDOWN_SYMBOL, + .setter = lv_dropdown_set_symbol, + .getter = lv_dropdown_get_symbol, + }, + { + .id = LV_PROPERTY_DROPDOWN_SELECTED_HIGHLIGHT, + .setter = lv_dropdown_set_selected_highlight, + .getter = lv_dropdown_get_selected_highlight, + }, + { + .id = LV_PROPERTY_DROPDOWN_LIST, + .setter = NULL, + .getter = lv_dropdown_get_list, + }, + { + .id = LV_PROPERTY_DROPDOWN_IS_OPEN, + .setter = NULL, + .getter = lv_dropdown_is_open, + }, +}; +#endif const lv_obj_class_t lv_dropdown_class = { .constructor_cb = lv_dropdown_constructor, @@ -74,6 +123,17 @@ const lv_obj_class_t lv_dropdown_class = { .group_def = LV_OBJ_CLASS_GROUP_DEF_TRUE, .base_class = &lv_obj_class, .name = "dropdown", +#if LV_USE_OBJ_PROPERTY + .prop_index_start = LV_PROPERTY_DROPDOWN_START, + .prop_index_end = LV_PROPERTY_DROPDOWN_END, + .properties = properties, + .properties_count = sizeof(properties) / sizeof(properties[0]), + +#if LV_USE_OBJ_PROPERTY_NAME + .property_names = lv_dropdown_property_names, + .names_count = sizeof(lv_dropdown_property_names) / sizeof(lv_property_name_t), +#endif +#endif }; const lv_obj_class_t lv_dropdownlist_class = { diff --git a/src/widgets/dropdown/lv_dropdown.h b/src/widgets/dropdown/lv_dropdown.h index 528a458f20..c9f55be12f 100644 --- a/src/widgets/dropdown/lv_dropdown.h +++ b/src/widgets/dropdown/lv_dropdown.h @@ -31,6 +31,22 @@ extern "C" { #define LV_DROPDOWN_POS_LAST 0xFFFF LV_EXPORT_CONST_INT(LV_DROPDOWN_POS_LAST); +#if LV_USE_OBJ_PROPERTY +enum { + LV_PROPERTY_ID(DROPDOWN, TEXT, LV_PROPERTY_TYPE_TEXT, 0), + LV_PROPERTY_ID(DROPDOWN, OPTIONS, LV_PROPERTY_TYPE_TEXT, 1), + LV_PROPERTY_ID(DROPDOWN, OPTION_COUNT, LV_PROPERTY_TYPE_INT, 2), + LV_PROPERTY_ID(DROPDOWN, SELECTED, LV_PROPERTY_TYPE_INT, 3), + // LV_PROPERTY_ID(DROPDOWN, SELECTED_STR, LV_PROPERTY_TYPE_TEXT, 4), + LV_PROPERTY_ID(DROPDOWN, DIR, LV_PROPERTY_TYPE_INT, 5), + LV_PROPERTY_ID(DROPDOWN, SYMBOL, LV_PROPERTY_TYPE_TEXT, 6), + LV_PROPERTY_ID(DROPDOWN, SELECTED_HIGHLIGHT, LV_PROPERTY_TYPE_INT, 7), + LV_PROPERTY_ID(DROPDOWN, LIST, LV_PROPERTY_TYPE_OBJ, 8), + LV_PROPERTY_ID(DROPDOWN, IS_OPEN, LV_PROPERTY_TYPE_BOOL, 9), + LV_PROPERTY_DROPDOWN_END, +}; +#endif + LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_dropdown_class; LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_dropdownlist_class; diff --git a/src/widgets/property/lv_dropdown_properties.c b/src/widgets/property/lv_dropdown_properties.c new file mode 100644 index 0000000000..9477ca3c83 --- /dev/null +++ b/src/widgets/property/lv_dropdown_properties.c @@ -0,0 +1,31 @@ + +/** + * GENERATED FILE, DO NOT EDIT IT! + * @file lv_dropdown_properties.c + */ + +#include "../dropdown/lv_dropdown.h" + +#if LV_USE_OBJ_PROPERTY && LV_USE_OBJ_PROPERTY_NAME + +#if LV_USE_DROPDOWN +/** + * Dropdown widget property names, name must be in order. + * Generated code from properties.py + */ +/* *INDENT-OFF* */ +const lv_property_name_t lv_dropdown_property_names[9] = { + {"dir", LV_PROPERTY_DROPDOWN_DIR,}, + {"is_open", LV_PROPERTY_DROPDOWN_IS_OPEN,}, + {"list", LV_PROPERTY_DROPDOWN_LIST,}, + {"option_count", LV_PROPERTY_DROPDOWN_OPTION_COUNT,}, + {"options", LV_PROPERTY_DROPDOWN_OPTIONS,}, + {"selected", LV_PROPERTY_DROPDOWN_SELECTED,}, + {"selected_highlight", LV_PROPERTY_DROPDOWN_SELECTED_HIGHLIGHT,}, + {"symbol", LV_PROPERTY_DROPDOWN_SYMBOL,}, + {"text", LV_PROPERTY_DROPDOWN_TEXT,}, +}; +#endif /*LV_USE_DROPDOWN*/ + +/* *INDENT-ON* */ +#endif diff --git a/src/widgets/property/lv_obj_property_names.h b/src/widgets/property/lv_obj_property_names.h index d9415c00f0..4b4ff67aea 100644 --- a/src/widgets/property/lv_obj_property_names.h +++ b/src/widgets/property/lv_obj_property_names.h @@ -10,6 +10,7 @@ #if LV_USE_OBJ_PROPERTY && LV_USE_OBJ_PROPERTY_NAME + extern const lv_property_name_t lv_dropdown_property_names[9]; extern const lv_property_name_t lv_image_property_names[11]; extern const lv_property_name_t lv_keyboard_property_names[4]; extern const lv_property_name_t lv_label_property_names[4]; diff --git a/tests/src/test_cases/widgets/test_dropdown.c b/tests/src/test_cases/widgets/test_dropdown.c index 7d77d9bcd1..7633523c1f 100644 --- a/tests/src/test_cases/widgets/test_dropdown.c +++ b/tests/src/test_cases/widgets/test_dropdown.c @@ -452,4 +452,59 @@ void test_dropdown_get_options_should_check_lengths(void) TEST_ASSERT_EQUAL_INT(-1, lv_dropdown_get_option_index(dd, "Option ")); } +void test_dropdown_properties(void) +{ +#if LV_USE_OBJ_PROPERTY + lv_obj_t * obj = lv_dropdown_create(lv_screen_active()); + lv_property_t prop = { }; + + prop.id = LV_PROPERTY_DROPDOWN_TEXT; + prop.ptr = "Hello"; + TEST_ASSERT_TRUE(lv_obj_set_property(obj, &prop) == LV_RESULT_OK); + TEST_ASSERT_EQUAL_STRING("Hello", lv_dropdown_get_text(obj)); + TEST_ASSERT_EQUAL_STRING("Hello", lv_obj_get_property(obj, LV_PROPERTY_DROPDOWN_TEXT).ptr); + + prop.id = LV_PROPERTY_DROPDOWN_OPTIONS; + prop.ptr = "Option 1\nOption 2"; + TEST_ASSERT_TRUE(lv_obj_set_property(obj, &prop) == LV_RESULT_OK); + TEST_ASSERT_EQUAL_STRING("Option 1\nOption 2", lv_dropdown_get_options(obj)); + TEST_ASSERT_EQUAL_STRING("Option 1\nOption 2", lv_obj_get_property(obj, LV_PROPERTY_DROPDOWN_OPTIONS).ptr); + + TEST_ASSERT_EQUAL(2, lv_dropdown_get_option_count(obj)); + TEST_ASSERT_EQUAL(2, lv_obj_get_property(obj, LV_PROPERTY_DROPDOWN_OPTION_COUNT).num); + + prop.id = LV_PROPERTY_DROPDOWN_SELECTED; + prop.num = 1; + TEST_ASSERT_TRUE(lv_obj_set_property(obj, &prop) == LV_RESULT_OK); + TEST_ASSERT_EQUAL_INT(1, lv_dropdown_get_selected(obj)); + TEST_ASSERT_EQUAL_INT(1, lv_obj_get_property(obj, LV_PROPERTY_DROPDOWN_SELECTED).num); + + prop.id = LV_PROPERTY_DROPDOWN_DIR; + prop.num = LV_DIR_LEFT; + TEST_ASSERT_TRUE(lv_obj_set_property(obj, &prop) == LV_RESULT_OK); + TEST_ASSERT_EQUAL_INT(LV_DIR_LEFT, lv_dropdown_get_dir(obj)); + TEST_ASSERT_EQUAL_INT(LV_DIR_LEFT, lv_obj_get_property(obj, LV_PROPERTY_DROPDOWN_DIR).num); + + prop.id = LV_PROPERTY_DROPDOWN_SYMBOL; + prop.ptr = LV_SYMBOL_DOWN; + TEST_ASSERT_TRUE(lv_obj_set_property(obj, &prop) == LV_RESULT_OK); + TEST_ASSERT_EQUAL_STRING(LV_SYMBOL_DOWN, lv_dropdown_get_symbol(obj)); + TEST_ASSERT_EQUAL_STRING(LV_SYMBOL_DOWN, lv_obj_get_property(obj, LV_PROPERTY_DROPDOWN_SYMBOL).ptr); + + prop.id = LV_PROPERTY_DROPDOWN_SELECTED_HIGHLIGHT; + prop.num = true; + TEST_ASSERT_TRUE(lv_obj_set_property(obj, &prop) == LV_RESULT_OK); + TEST_ASSERT_TRUE(lv_dropdown_get_selected_highlight(obj)); + TEST_ASSERT_TRUE(lv_obj_get_property(obj, LV_PROPERTY_DROPDOWN_SELECTED_HIGHLIGHT).num); + + lv_dropdown_open(obj); + TEST_ASSERT_TRUE(lv_dropdown_is_open(obj)); + TEST_ASSERT_TRUE(lv_obj_get_property(obj, LV_PROPERTY_DROPDOWN_IS_OPEN).enable); + lv_dropdown_close(obj); + TEST_ASSERT_FALSE(lv_dropdown_is_open(obj)); + TEST_ASSERT_FALSE(lv_obj_get_property(obj, LV_PROPERTY_DROPDOWN_IS_OPEN).enable); +#endif +} + + #endif