feat(textarea): add properties

Signed-off-by: Neo Xu <neo.xu1990@gmail.com>
This commit is contained in:
Neo Xu
2024-07-28 12:11:08 +08:00
committed by Gabor Kiss-Vamosi
parent cd48c3c8d6
commit 357d5b7ff9
6 changed files with 231 additions and 0 deletions

View File

@@ -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*/

View File

@@ -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

View File

@@ -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

View File

@@ -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;

View File

@@ -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 {

View File

@@ -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