From 357d5b7ff9d827c62aff520183b418585ee76054 Mon Sep 17 00:00:00 2001 From: Neo Xu Date: Sun, 28 Jul 2024 12:11:08 +0800 Subject: [PATCH] feat(textarea): add properties Signed-off-by: Neo Xu --- src/core/lv_obj_property.h | 1 + src/widgets/property/lv_obj_property_names.h | 1 + src/widgets/property/lv_textarea_properties.c | 37 ++++++++ src/widgets/textarea/lv_textarea.c | 92 +++++++++++++++++++ src/widgets/textarea/lv_textarea.h | 21 +++++ tests/src/test_cases/widgets/test_textarea.c | 79 ++++++++++++++++ 6 files changed, 231 insertions(+) create mode 100644 src/widgets/property/lv_textarea_properties.c diff --git a/src/core/lv_obj_property.h b/src/core/lv_obj_property.h index 0b282d821..31bae5676 100644 --- a/src/core/lv_obj_property.h +++ b/src/core/lv_obj_property.h @@ -65,6 +65,7 @@ enum { LV_PROPERTY_IMAGE_START = 0x0200, /* lv_image.c */ LV_PROPERTY_LABEL_START = 0x0300, /* lv_label.c */ LV_PROPERTY_KEYBOARD_START = 0x0400, /* lv_keyboard.c */ + LV_PROPERTY_TEXTAREA_START = 0x0500, /* lv_textarea.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/property/lv_obj_property_names.h b/src/widgets/property/lv_obj_property_names.h index fa5c6cce6..f593bcb15 100644 --- a/src/widgets/property/lv_obj_property_names.h +++ b/src/widgets/property/lv_obj_property_names.h @@ -15,5 +15,6 @@ extern const lv_property_name_t lv_label_property_names[4]; extern const lv_property_name_t lv_obj_property_names[73]; extern const lv_property_name_t lv_style_property_names[112]; + extern const lv_property_name_t lv_textarea_property_names[15]; #endif #endif diff --git a/src/widgets/property/lv_textarea_properties.c b/src/widgets/property/lv_textarea_properties.c new file mode 100644 index 000000000..7bed65eab --- /dev/null +++ b/src/widgets/property/lv_textarea_properties.c @@ -0,0 +1,37 @@ + +/** + * GENERATED FILE, DO NOT EDIT IT! + * @file lv_textarea_properties.c + */ + +#include "../textarea/lv_textarea.h" + +#if LV_USE_OBJ_PROPERTY && LV_USE_OBJ_PROPERTY_NAME + +#if LV_USE_TEXTAREA +/** + * Textarea widget property names, name must be in order. + * Generated code from properties.py + */ +/* *INDENT-OFF* */ +const lv_property_name_t lv_textarea_property_names[15] = { + {"accepted_chars", LV_PROPERTY_TEXTAREA_ACCEPTED_CHARS,}, + {"current_char", LV_PROPERTY_TEXTAREA_CURRENT_CHAR,}, + {"cursor_click_pos", LV_PROPERTY_TEXTAREA_CURSOR_CLICK_POS,}, + {"cursor_pos", LV_PROPERTY_TEXTAREA_CURSOR_POS,}, + {"insert_replace", LV_PROPERTY_TEXTAREA_INSERT_REPLACE,}, + {"label", LV_PROPERTY_TEXTAREA_LABEL,}, + {"max_length", LV_PROPERTY_TEXTAREA_MAX_LENGTH,}, + {"one_line", LV_PROPERTY_TEXTAREA_ONE_LINE,}, + {"password_bullet", LV_PROPERTY_TEXTAREA_PASSWORD_BULLET,}, + {"password_mode", LV_PROPERTY_TEXTAREA_PASSWORD_MODE,}, + {"password_show_time", LV_PROPERTY_TEXTAREA_PASSWORD_SHOW_TIME,}, + {"placeholder_text", LV_PROPERTY_TEXTAREA_PLACEHOLDER_TEXT,}, + {"text", LV_PROPERTY_TEXTAREA_TEXT,}, + {"text_is_selected", LV_PROPERTY_TEXTAREA_TEXT_IS_SELECTED,}, + {"text_selection", LV_PROPERTY_TEXTAREA_TEXT_SELECTION,}, +}; +#endif /*LV_USE_TEXTAREA*/ + +/* *INDENT-ON* */ +#endif diff --git a/src/widgets/textarea/lv_textarea.c b/src/widgets/textarea/lv_textarea.c index 2aa64501e..6a8600deb 100644 --- a/src/widgets/textarea/lv_textarea.c +++ b/src/widgets/textarea/lv_textarea.c @@ -67,6 +67,86 @@ static inline bool is_valid_but_non_printable_char(const uint32_t letter); /********************** * STATIC VARIABLES **********************/ +#if LV_USE_OBJ_PROPERTY +static const lv_property_ops_t properties[] = { + { + .id = LV_PROPERTY_TEXTAREA_TEXT, + .setter = lv_textarea_set_text, + .getter = lv_textarea_get_text, + }, + { + .id = LV_PROPERTY_TEXTAREA_PLACEHOLDER_TEXT, + .setter = lv_textarea_set_placeholder_text, + .getter = lv_textarea_get_placeholder_text, + }, + { + .id = LV_PROPERTY_TEXTAREA_CURSOR_POS, + .setter = lv_textarea_set_cursor_pos, + .getter = lv_textarea_get_cursor_pos, + }, + { + .id = LV_PROPERTY_TEXTAREA_CURSOR_CLICK_POS, + .setter = lv_textarea_set_cursor_click_pos, + .getter = lv_textarea_get_cursor_click_pos, + }, + { + .id = LV_PROPERTY_TEXTAREA_PASSWORD_MODE, + .setter = lv_textarea_set_password_mode, + .getter = lv_textarea_get_password_mode, + }, + { + .id = LV_PROPERTY_TEXTAREA_PASSWORD_BULLET, + .setter = lv_textarea_set_password_bullet, + .getter = lv_textarea_get_password_bullet, + }, + { + .id = LV_PROPERTY_TEXTAREA_ONE_LINE, + .setter = lv_textarea_set_one_line, + .getter = lv_textarea_get_one_line, + }, + { + .id = LV_PROPERTY_TEXTAREA_ACCEPTED_CHARS, + .setter = lv_textarea_set_accepted_chars, + .getter = lv_textarea_get_accepted_chars, + }, + { + .id = LV_PROPERTY_TEXTAREA_MAX_LENGTH, + .setter = lv_textarea_set_max_length, + .getter = lv_textarea_get_max_length, + }, + { + .id = LV_PROPERTY_TEXTAREA_INSERT_REPLACE, + .setter = lv_textarea_set_insert_replace, + .getter = NULL, + }, + { + .id = LV_PROPERTY_TEXTAREA_TEXT_SELECTION, + .setter = lv_textarea_set_text_selection, + .getter = lv_textarea_get_text_selection, + }, + { + .id = LV_PROPERTY_TEXTAREA_PASSWORD_SHOW_TIME, + .setter = lv_textarea_set_password_show_time, + .getter = lv_textarea_get_password_show_time, + }, + { + .id = LV_PROPERTY_TEXTAREA_LABEL, + .setter = NULL, + .getter = lv_textarea_get_label, + }, + { + .id = LV_PROPERTY_TEXTAREA_TEXT_IS_SELECTED, + .setter = NULL, + .getter = lv_textarea_text_is_selected, + }, + { + .id = LV_PROPERTY_TEXTAREA_CURRENT_CHAR, + .setter = NULL, + .getter = lv_textarea_get_current_char, + }, +}; +#endif + const lv_obj_class_t lv_textarea_class = { .constructor_cb = lv_textarea_constructor, .destructor_cb = lv_textarea_destructor, @@ -78,6 +158,18 @@ const lv_obj_class_t lv_textarea_class = { .instance_size = sizeof(lv_textarea_t), .base_class = &lv_obj_class, .name = "textarea", +#if LV_USE_OBJ_PROPERTY + .prop_index_start = LV_PROPERTY_TEXTAREA_START, + .prop_index_end = LV_PROPERTY_TEXTAREA_END, + .properties = properties, + .properties_count = sizeof(properties) / sizeof(properties[0]), + +#if LV_USE_OBJ_PROPERTY_NAME + .property_names = lv_textarea_property_names, + .names_count = sizeof(lv_textarea_property_names) / sizeof(lv_property_name_t), +#endif + +#endif }; static const char * ta_insert_replace; diff --git a/src/widgets/textarea/lv_textarea.h b/src/widgets/textarea/lv_textarea.h index b3007a1a5..0804029d1 100644 --- a/src/widgets/textarea/lv_textarea.h +++ b/src/widgets/textarea/lv_textarea.h @@ -33,6 +33,27 @@ LV_EXPORT_CONST_INT(LV_TEXTAREA_CURSOR_LAST); * TYPEDEFS **********************/ +#if LV_USE_OBJ_PROPERTY +enum { + LV_PROPERTY_ID(TEXTAREA, TEXT, LV_PROPERTY_TYPE_TEXT, 0), + LV_PROPERTY_ID(TEXTAREA, PLACEHOLDER_TEXT, LV_PROPERTY_TYPE_TEXT, 1), + LV_PROPERTY_ID(TEXTAREA, CURSOR_POS, LV_PROPERTY_TYPE_INT, 2), + LV_PROPERTY_ID(TEXTAREA, CURSOR_CLICK_POS, LV_PROPERTY_TYPE_INT, 3), + LV_PROPERTY_ID(TEXTAREA, PASSWORD_MODE, LV_PROPERTY_TYPE_INT, 4), + LV_PROPERTY_ID(TEXTAREA, PASSWORD_BULLET, LV_PROPERTY_TYPE_TEXT, 5), + LV_PROPERTY_ID(TEXTAREA, ONE_LINE, LV_PROPERTY_TYPE_BOOL, 6), + LV_PROPERTY_ID(TEXTAREA, ACCEPTED_CHARS, LV_PROPERTY_TYPE_TEXT, 7), + LV_PROPERTY_ID(TEXTAREA, MAX_LENGTH, LV_PROPERTY_TYPE_INT, 8), + LV_PROPERTY_ID(TEXTAREA, INSERT_REPLACE, LV_PROPERTY_TYPE_TEXT, 9), + LV_PROPERTY_ID(TEXTAREA, TEXT_SELECTION, LV_PROPERTY_TYPE_BOOL, 10), + LV_PROPERTY_ID(TEXTAREA, PASSWORD_SHOW_TIME, LV_PROPERTY_TYPE_INT, 11), + LV_PROPERTY_ID(TEXTAREA, LABEL, LV_PROPERTY_TYPE_OBJ, 12), + LV_PROPERTY_ID(TEXTAREA, TEXT_IS_SELECTED, LV_PROPERTY_TYPE_INT, 13), + LV_PROPERTY_ID(TEXTAREA, CURRENT_CHAR, LV_PROPERTY_TYPE_INT, 14), + LV_PROPERTY_TEXTAREA_END, +}; +#endif + LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_textarea_class; enum { diff --git a/tests/src/test_cases/widgets/test_textarea.c b/tests/src/test_cases/widgets/test_textarea.c index 739d7d490..11ab8d8fc 100644 --- a/tests/src/test_cases/widgets/test_textarea.c +++ b/tests/src/test_cases/widgets/test_textarea.c @@ -134,4 +134,83 @@ void test_textarea_should_hide_password_characters(void) TEST_ASSERT_EQUAL_STRING("OO", lv_label_get_text(lv_textarea_get_label(textarea))); } +void test_textarea_properties(void) +{ +#if LV_USE_OBJ_PROPERTY + lv_property_t prop = { }; + lv_obj_t * obj = lv_textarea_create(lv_screen_active()); + + prop.id = LV_PROPERTY_TEXTAREA_TEXT; + prop.ptr = "Hello World!"; + TEST_ASSERT_TRUE(lv_obj_set_property(obj, &prop) == LV_RES_OK); + TEST_ASSERT_EQUAL_STRING("Hello World!", lv_textarea_get_text(obj)); + TEST_ASSERT_EQUAL_STRING("Hello World!", lv_obj_get_property(obj, LV_PROPERTY_TEXTAREA_TEXT).ptr); + + prop.id = LV_PROPERTY_TEXTAREA_PLACEHOLDER_TEXT; + prop.ptr = "Hello!"; + TEST_ASSERT_TRUE(lv_obj_set_property(obj, &prop) == LV_RES_OK); + TEST_ASSERT_EQUAL_STRING("Hello!", lv_textarea_get_placeholder_text(obj)); + TEST_ASSERT_EQUAL_STRING("Hello!", lv_obj_get_property(obj, LV_PROPERTY_TEXTAREA_PLACEHOLDER_TEXT).ptr); + + prop.id = LV_PROPERTY_TEXTAREA_CURSOR_POS; + prop.num = 5; + TEST_ASSERT_TRUE(lv_obj_set_property(obj, &prop) == LV_RES_OK); + TEST_ASSERT_EQUAL_INT(5, lv_textarea_get_cursor_pos(obj)); + TEST_ASSERT_EQUAL_INT(5, lv_obj_get_property(obj, LV_PROPERTY_TEXTAREA_CURSOR_POS).num); + + prop.id = LV_PROPERTY_TEXTAREA_CURSOR_CLICK_POS; + prop.num = 1; + TEST_ASSERT_TRUE(lv_obj_set_property(obj, &prop) == LV_RES_OK); + TEST_ASSERT_EQUAL_INT(1, lv_textarea_get_cursor_click_pos(obj)); + TEST_ASSERT_EQUAL_INT(1, lv_obj_get_property(obj, LV_PROPERTY_TEXTAREA_CURSOR_CLICK_POS).num); + + prop.id = LV_PROPERTY_TEXTAREA_PASSWORD_MODE; + prop.num = true; + TEST_ASSERT_TRUE(lv_obj_set_property(obj, &prop) == LV_RES_OK); + TEST_ASSERT_TRUE(lv_textarea_get_password_mode(obj)); + TEST_ASSERT_TRUE(lv_obj_get_property(obj, LV_PROPERTY_TEXTAREA_PASSWORD_MODE).num); + + prop.id = LV_PROPERTY_TEXTAREA_PASSWORD_BULLET; + prop.ptr = "password bullet"; + TEST_ASSERT_TRUE(lv_obj_set_property(obj, &prop) == LV_RES_OK); + TEST_ASSERT_EQUAL_STRING("password bullet", lv_textarea_get_password_bullet(obj)); + TEST_ASSERT_EQUAL_STRING("password bullet", lv_obj_get_property(obj, LV_PROPERTY_TEXTAREA_PASSWORD_BULLET).ptr); + + prop.id = LV_PROPERTY_TEXTAREA_ONE_LINE; + prop.enable = true; + TEST_ASSERT_TRUE(lv_obj_set_property(obj, &prop) == LV_RES_OK); + TEST_ASSERT_EQUAL_INT(true, lv_textarea_get_one_line(obj)); + TEST_ASSERT_EQUAL_INT(true, lv_obj_get_property(obj, LV_PROPERTY_TEXTAREA_ONE_LINE).enable); + + prop.id = LV_PROPERTY_TEXTAREA_ACCEPTED_CHARS; + prop.ptr = "ABCDEF"; + TEST_ASSERT_TRUE(lv_obj_set_property(obj, &prop) == LV_RES_OK); + TEST_ASSERT_EQUAL_STRING("ABCDEF", lv_textarea_get_accepted_chars(obj)); + TEST_ASSERT_EQUAL_STRING("ABCDEF", lv_obj_get_property(obj, LV_PROPERTY_TEXTAREA_ACCEPTED_CHARS).ptr); + + prop.id = LV_PROPERTY_TEXTAREA_MAX_LENGTH; + prop.num = 10; + TEST_ASSERT_TRUE(lv_obj_set_property(obj, &prop) == LV_RES_OK); + TEST_ASSERT_EQUAL_INT(10, lv_textarea_get_max_length(obj)); + TEST_ASSERT_EQUAL_INT(10, lv_obj_get_property(obj, LV_PROPERTY_TEXTAREA_MAX_LENGTH).num); + + prop.id = LV_PROPERTY_TEXTAREA_INSERT_REPLACE; + prop.ptr = "abcdef"; + /*No getter function for this property*/ + TEST_ASSERT_TRUE(lv_obj_set_property(obj, &prop) == LV_RES_OK); + + prop.id = LV_PROPERTY_TEXTAREA_TEXT_SELECTION; + prop.num = true; + TEST_ASSERT_TRUE(lv_obj_set_property(obj, &prop) == LV_RES_OK); + TEST_ASSERT_EQUAL_INT(true, lv_textarea_get_text_selection(obj)); + TEST_ASSERT_EQUAL_INT(true, lv_obj_get_property(obj, LV_PROPERTY_TEXTAREA_TEXT_SELECTION).enable); + + prop.id = LV_PROPERTY_TEXTAREA_PASSWORD_SHOW_TIME; + prop.num = 10; + TEST_ASSERT_TRUE(lv_obj_set_property(obj, &prop) == LV_RES_OK); + TEST_ASSERT_EQUAL_INT(10, lv_textarea_get_password_show_time(obj)); + TEST_ASSERT_EQUAL_INT(10, lv_obj_get_property(obj, LV_PROPERTY_TEXTAREA_PASSWORD_SHOW_TIME).num); +#endif +} + #endif