feat(xml): add support for textarea and keyboard

This commit is contained in:
Gabor Kiss-Vamosi
2025-03-06 17:13:11 +01:00
parent 4dfdd18434
commit b63472dc01
12 changed files with 343 additions and 0 deletions
@@ -0,0 +1,85 @@
/**
* @file lv_xml_keyboard_parser.c
*
*/
/*********************
* INCLUDES
*********************/
#include "lv_xml_keyboard_parser.h"
#if LV_USE_XML
#include "../../../lvgl.h"
#include "../../../lvgl_private.h"
/*********************
* DEFINES
*********************/
/**********************
* TYPEDEFS
**********************/
/**********************
* STATIC PROTOTYPES
**********************/
static lv_keyboard_mode_t mode_text_to_enum_value(const char * txt);
/**********************
* STATIC VARIABLES
**********************/
/**********************
* MACROS
**********************/
/**********************
* GLOBAL FUNCTIONS
**********************/
void * lv_xml_keyboard_create(lv_xml_parser_state_t * state, const char ** attrs)
{
LV_UNUSED(attrs);
void * item = lv_keyboard_create(lv_xml_state_get_parent(state));
return item;
}
void lv_xml_keyboard_apply(lv_xml_parser_state_t * state, const char ** attrs)
{
void * item = lv_xml_state_get_item(state);
lv_xml_obj_apply(state, attrs); /*Apply the common properties, e.g. width, height, styles flags etc*/
for(int i = 0; attrs[i]; i += 2) {
const char * name = attrs[i];
const char * value = attrs[i + 1];
// if(lv_streq("textarea", name)) lv_keyboard_set_mode(item, lv_obj_get_child_by_name());
if(lv_streq("mode", name)) lv_keyboard_set_mode(item, mode_text_to_enum_value(value));
}
}
/**********************
* STATIC FUNCTIONS
**********************/
static lv_keyboard_mode_t mode_text_to_enum_value(const char * txt)
{
if(lv_streq("text_upper", txt)) return LV_KEYBOARD_MODE_TEXT_UPPER;
if(lv_streq("text_lower", txt)) return LV_KEYBOARD_MODE_TEXT_LOWER;
#if LV_USE_ARABIC_PERSIAN_CHARS == 1
if(lv_streq("text_arabic", txt)) return LV_KEYBOARD_MODE_TEXT_ARABIC;
#endif
if(lv_streq("number", txt)) return LV_KEYBOARD_MODE_NUMBER;
if(lv_streq("special", txt)) return LV_KEYBOARD_MODE_SPECIAL;
if(lv_streq("user_1", txt)) return LV_KEYBOARD_MODE_USER_1;
if(lv_streq("user_2", txt)) return LV_KEYBOARD_MODE_USER_2;
if(lv_streq("user_3", txt)) return LV_KEYBOARD_MODE_USER_3;
if(lv_streq("user_4", txt)) return LV_KEYBOARD_MODE_USER_4;
LV_LOG_WARN("%s is an unknown value for keyboard's mode", txt);
return 0; /*Return 0 in lack of a better option. */
}
#endif /* LV_USE_XML */
@@ -0,0 +1,41 @@
/**
* @file lv_xml_keyboard_parser.h
*
*/
#ifndef LV_KEYBOARD_XML_PARSER_H
#define LV_KEYBOARD_XML_PARSER_H
#ifdef __cplusplus
extern "C" {
#endif
/*********************
* INCLUDES
*********************/
#include "../lv_xml.h"
#if LV_USE_XML
/**********************
* TYPEDEFS
**********************/
/**********************
* GLOBAL PROTOTYPES
**********************/
void * lv_xml_keyboard_create(lv_xml_parser_state_t * state, const char ** attrs);
void lv_xml_keyboard_apply(lv_xml_parser_state_t * state, const char ** attrs);
/**********************
* MACROS
**********************/
#endif /* LV_USE_XML */
#ifdef __cplusplus
} /*extern "C"*/
#endif
#endif /*LV_KEYBOARD_XML_PARSE_H*/
@@ -0,0 +1,72 @@
/**
* @file lv_xml_textarea_parser.c
*
*/
/*********************
* INCLUDES
*********************/
#include "lv_xml_textarea_parser.h"
#if LV_USE_XML
#include "../../../lvgl.h"
#include "../../../lvgl_private.h"
/*********************
* DEFINES
*********************/
/**********************
* TYPEDEFS
**********************/
/**********************
* STATIC PROTOTYPES
**********************/
/**********************
* STATIC VARIABLES
**********************/
/**********************
* MACROS
**********************/
/**********************
* GLOBAL FUNCTIONS
**********************/
void * lv_xml_textarea_create(lv_xml_parser_state_t * state, const char ** attrs)
{
LV_UNUSED(attrs);
void * item = lv_textarea_create(lv_xml_state_get_parent(state));
return item;
}
void lv_xml_textarea_apply(lv_xml_parser_state_t * state, const char ** attrs)
{
void * item = lv_xml_state_get_item(state);
lv_xml_obj_apply(state, attrs); /*Apply the common properties, e.g. width, height, styles flags etc*/
for(int i = 0; attrs[i]; i += 2) {
const char * name = attrs[i];
const char * value = attrs[i + 1];
if(lv_streq("text", name)) lv_textarea_set_text(item, value);
else if(lv_streq("placeholder", name)) lv_textarea_set_placeholder_text(item, value);
else if(lv_streq("one_line", name)) lv_textarea_set_one_line(item, lv_xml_to_bool(value));
else if(lv_streq("password_mode", name)) lv_textarea_set_password_mode(item, lv_xml_to_bool(value));
else if(lv_streq("password_show_time", name)) lv_textarea_set_password_show_time(item, lv_xml_atoi(value));
else if(lv_streq("text_selection", name)) lv_textarea_set_text_selection(item, lv_xml_to_bool(value));
else if(lv_streq("cursor_pos", name)) lv_textarea_set_cursor_pos(item, lv_xml_atoi(value));
}
}
/**********************
* STATIC FUNCTIONS
**********************/
#endif /* LV_USE_XML */
@@ -0,0 +1,41 @@
/**
* @file lv_xml_textarea_parser.h
*
*/
#ifndef LV_TEXTAREA_XML_PARSER_H
#define LV_TEXTAREA_XML_PARSER_H
#ifdef __cplusplus
extern "C" {
#endif
/*********************
* INCLUDES
*********************/
#include "../lv_xml.h"
#if LV_USE_XML
/**********************
* TYPEDEFS
**********************/
/**********************
* GLOBAL PROTOTYPES
**********************/
void * lv_xml_textarea_create(lv_xml_parser_state_t * state, const char ** attrs);
void lv_xml_textarea_apply(lv_xml_parser_state_t * state, const char ** attrs);
/**********************
* MACROS
**********************/
#endif /* LV_USE_XML */
#ifdef __cplusplus
} /*extern "C"*/
#endif
#endif /*LV_TEXTAREA_XML_PARSE_H*/
Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

@@ -0,0 +1,31 @@
#if LV_BUILD_TEST
#include "../lvgl.h"
#include "unity/unity.h"
void setUp(void)
{
/* Function run before every test */
}
void tearDown(void)
{
/* Function run after every test */
lv_obj_clean(lv_screen_active());
}
void test_xml_image_with_attrs(void)
{
lv_obj_t * scr = lv_screen_active();
const char * keyboard1_attrs[] = {
"mode", "text_upper",
NULL, NULL,
};
lv_xml_create(scr, "lv_keyboard", keyboard1_attrs);
TEST_ASSERT_EQUAL_SCREENSHOT("xml/lv_keyboard.png");
}
#endif
@@ -0,0 +1,36 @@
#if LV_BUILD_TEST
#include "../lvgl.h"
#include "unity/unity.h"
void setUp(void)
{
/* Function run before every test */
}
void tearDown(void)
{
/* Function run after every test */
lv_obj_clean(lv_screen_active());
}
void test_xml_textarea_with_attrs(void)
{
lv_obj_t * scr = lv_screen_active();
const char * textarea1_attrs[] = {
"text", "This is the text",
"style_text_align", "center",
"one_line", "true",
"width", "400",
"align", "center",
NULL, NULL,
};
lv_xml_create(scr, "lv_textarea", textarea1_attrs);
TEST_ASSERT_EQUAL_SCREENSHOT("xml/lv_textarea.png");
}
#endif
+21
View File
@@ -0,0 +1,21 @@
<!--
Example
<lv_textarea text="Hello"/>
-->
<widget>
<api>
<enumdef name="lv_keyboard_mode" help="">
<enum name="text_upper"/>
<enum name="text_lower"/>
<enum name="text_arabic"/>
<enum name="special"/>
<enum name="user_1"/>
<enum name="user_2"/>
<enum name="user_3"/>
<enum name="user_4"/>
</enumdef>
<prop name="mode" type="enum:" help="The max range"/>
</api>
</widget>
+16
View File
@@ -0,0 +1,16 @@
<!--
Example
<lv_textarea text="Hello"/>
-->
<widget>
<api>
<prop name="text" type="string" help="The max range"/>
<prop name="placeholder" type="string" help="The max range"/>
<prop name="one_line" type="bool" help="The max range"/>
<prop name="password_mode" type="bool" help="The max range"/>
<prop name="password_show_time" type="int" help="The max range"/>
<prop name="text_selection" type="bool" help="The max range"/>
<prop name="cursor_pos" type="int" help="The max range"/>
</api>
</widget>