diff --git a/examples/others/xml/lv_example_xml_2.c b/examples/others/xml/lv_example_xml_2.c
index b4fae5b899..f037a54ac3 100644
--- a/examples/others/xml/lv_example_xml_2.c
+++ b/examples/others/xml/lv_example_xml_2.c
@@ -3,10 +3,44 @@
void lv_example_xml_2(void)
{
- lv_xml_component_register_from_file("A:lvgl/examples/others/xml/view.xml");
+ lv_result_t res;
+ res = lv_xml_component_register_from_file("A:lvgl/examples/others/xml/my_h3.xml");
+ if(res != LV_RESULT_OK) {
+ lv_obj_t * label = lv_label_create(lv_screen_active());
+ lv_label_set_text(label, "Couldn't open the XML files.");
+ lv_obj_center(label);
+ return;
+ }
+ lv_xml_component_register_from_file("A:lvgl/examples/others/xml/my_card.xml");
lv_xml_component_register_from_file("A:lvgl/examples/others/xml/my_button.xml");
+ lv_xml_component_register_from_file("A:lvgl/examples/others/xml/view.xml");
- lv_obj_t * obj = (lv_obj_t *) lv_xml_create(NULL, "view", NULL);
- lv_screen_load(obj);
+ lv_xml_register_font(NULL, "lv_montserrat_18", &lv_font_montserrat_18);
+
+ lv_obj_t * obj = (lv_obj_t *) lv_xml_create(lv_screen_active(), "view", NULL);
+ lv_obj_set_pos(obj, 10, 10);
+
+ const char * my_button_attrs[] = {
+ "x", "10",
+ "y", "-10",
+ "align", "bottom_left",
+ "btn_text", "New button",
+ NULL, NULL,
+ };
+
+ lv_xml_component_unregister("my_button");
+
+ lv_xml_create(lv_screen_active(), "my_button", my_button_attrs);
+
+ const char * slider_attrs[] = {
+ "x", "200",
+ "y", "-15",
+ "align", "bottom_left",
+ "value", "30",
+ NULL, NULL,
+ };
+
+ lv_obj_t * slider = (lv_obj_t *) lv_xml_create(lv_screen_active(), "lv_slider", slider_attrs);
+ lv_obj_set_width(slider, 100);
}
#endif
diff --git a/examples/others/xml/my_button.xml b/examples/others/xml/my_button.xml
index cb4519a176..bcfb69a394 100644
--- a/examples/others/xml/my_button.xml
+++ b/examples/others/xml/my_button.xml
@@ -8,11 +8,8 @@
-
-
-
-
-
+
+
diff --git a/examples/others/xml/view.xml b/examples/others/xml/view.xml
index ee743705dd..6eea106786 100644
--- a/examples/others/xml/view.xml
+++ b/examples/others/xml/view.xml
@@ -1,8 +1,39 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/others/xml/lv_xml.c b/src/others/xml/lv_xml.c
index a2ea682d46..789f41f20b 100644
--- a/src/others/xml/lv_xml.c
+++ b/src/others/xml/lv_xml.c
@@ -110,6 +110,10 @@ void lv_xml_init(void)
lv_xml_calendar_header_dropdown_apply);
lv_xml_widget_register("lv_obj-style", lv_obj_xml_style_create, lv_obj_xml_style_apply);
+ lv_xml_widget_register("lv_obj-remove_style", lv_obj_xml_remove_style_create, lv_obj_xml_remove_style_apply);
+ lv_xml_widget_register("lv_obj-remove_style_all", lv_obj_xml_remove_style_all_create,
+ lv_obj_xml_remove_style_all_apply);
+
lv_xml_widget_register("lv_obj-event_cb", lv_obj_xml_event_cb_create, lv_obj_xml_event_cb_apply);
lv_xml_widget_register("lv_obj-subject_set_int", lv_obj_xml_subject_set_create, lv_obj_xml_subject_set_apply);
lv_xml_widget_register("lv_obj-subject_set_string", lv_obj_xml_subject_set_create, lv_obj_xml_subject_set_apply);
@@ -119,6 +123,7 @@ void lv_xml_init(void)
lv_obj_xml_screen_load_event_apply);
lv_xml_widget_register("lv_obj-screen_create_event", lv_obj_xml_screen_create_event_create,
lv_obj_xml_screen_create_event_apply);
+
lv_xml_widget_register("lv_obj-bind_flag_if_eq", lv_obj_xml_bind_flag_create, lv_obj_xml_bind_flag_apply);
lv_xml_widget_register("lv_obj-bind_flag_if_not_eq", lv_obj_xml_bind_flag_create, lv_obj_xml_bind_flag_apply);
lv_xml_widget_register("lv_obj-bind_flag_if_gt", lv_obj_xml_bind_flag_create, lv_obj_xml_bind_flag_apply);
diff --git a/src/others/xml/parsers/lv_xml_obj_parser.c b/src/others/xml/parsers/lv_xml_obj_parser.c
index 542a252da0..81191ef9e4 100644
--- a/src/others/xml/parsers/lv_xml_obj_parser.c
+++ b/src/others/xml/parsers/lv_xml_obj_parser.c
@@ -34,6 +34,7 @@ typedef struct {
**********************/
static lv_obj_flag_t flag_to_enum(const char * txt);
static void apply_styles(lv_xml_parser_state_t * state, lv_obj_t * obj, const char * name, const char * value);
+static lv_style_selector_t get_selector(const char * str);
static void free_user_data_event_cb(lv_event_t * e);
static void screen_create_on_trigger_event_cb(lv_event_t * e);
static void screen_load_on_trigger_event_cb(lv_event_t * e);
@@ -173,29 +174,56 @@ void lv_obj_xml_style_apply(lv_xml_parser_state_t * state, const char ** attrs)
return;
}
- lv_style_selector_t selector = 0;
const char * selector_str = lv_xml_get_value_of(attrs, "selector");
- if(selector_str) {
- char buf[256];
- lv_strncpy(buf, selector_str, sizeof(buf));
-
- char * bufp = buf;
- const char * next = lv_xml_split_str(&bufp, '|');
-
- while(next) {
- /* Handle different states and parts */
- selector |= lv_xml_style_state_to_enum(next);
- selector |= lv_xml_style_part_to_enum(next);
-
- /* Move to the next token */
- next = lv_xml_split_str(&bufp, '|');
- }
- }
+ lv_style_selector_t selector = get_selector(selector_str);
void * item = lv_xml_state_get_parent(state);
lv_obj_add_style(item, &xml_style->style, selector);
}
+void * lv_obj_xml_remove_style_create(lv_xml_parser_state_t * state, const char ** attrs)
+{
+ LV_UNUSED(attrs);
+ void * item = lv_xml_state_get_parent(state);
+ return item;
+}
+
+void lv_obj_xml_remove_style_apply(lv_xml_parser_state_t * state, const char ** attrs)
+{
+
+ const char * style_str = lv_xml_get_value_of(attrs, "name");
+ const char * selector_str = lv_xml_get_value_of(attrs, "selector");
+
+ lv_style_t * style = NULL;
+ if(style_str) {
+ lv_xml_style_t * xml_style = lv_xml_get_style_by_name(&state->scope, style_str);
+ if(xml_style == NULL) {
+ LV_LOG_WARN("No style found with name `%s`", style_str);
+ return;
+ }
+ style = &xml_style->style;
+ }
+
+ lv_style_selector_t selector = get_selector(selector_str);
+
+ void * item = lv_xml_state_get_item(state);
+ lv_obj_remove_style(item, style, selector);
+}
+
+void * lv_obj_xml_remove_style_all_create(lv_xml_parser_state_t * state, const char ** attrs)
+{
+ LV_UNUSED(attrs);
+ void * item = lv_xml_state_get_parent(state);
+ return item;
+}
+
+void lv_obj_xml_remove_style_all_apply(lv_xml_parser_state_t * state, const char ** attrs)
+{
+ LV_UNUSED(attrs);
+ void * item = lv_xml_state_get_item(state);
+ lv_obj_remove_style_all(item);
+}
+
void * lv_obj_xml_event_cb_create(lv_xml_parser_state_t * state, const char ** attrs)
{
LV_UNUSED(attrs);
@@ -724,6 +752,28 @@ static void apply_styles(lv_xml_parser_state_t * state, lv_obj_t * obj, const ch
else SET_STYLE_IF(grid_cell_y_align, lv_xml_grid_align_to_enum(value));
}
+static lv_style_selector_t get_selector(const char * str)
+{
+ if(str == NULL) return 0;
+ lv_style_selector_t selector = 0;
+ char buf[256];
+ lv_strncpy(buf, str, sizeof(buf));
+
+ char * bufp = buf;
+ const char * next = lv_xml_split_str(&bufp, '|');
+
+ while(next) {
+ /* Handle different states and parts */
+ selector |= lv_xml_style_state_to_enum(next);
+ selector |= lv_xml_style_part_to_enum(next);
+
+ /* Move to the next token */
+ next = lv_xml_split_str(&bufp, '|');
+ }
+
+ return selector;
+}
+
static void free_user_data_event_cb(lv_event_t * e)
{
lv_free(lv_event_get_user_data(e));
diff --git a/src/others/xml/parsers/lv_xml_obj_parser.h b/src/others/xml/parsers/lv_xml_obj_parser.h
index d5771fb075..28b462c2ed 100644
--- a/src/others/xml/parsers/lv_xml_obj_parser.h
+++ b/src/others/xml/parsers/lv_xml_obj_parser.h
@@ -30,6 +30,12 @@ void lv_xml_obj_apply(lv_xml_parser_state_t * state, const char ** attrs);
void * lv_obj_xml_style_create(lv_xml_parser_state_t * state, const char ** attrs);
void lv_obj_xml_style_apply(lv_xml_parser_state_t * state, const char ** attrs);
+void * lv_obj_xml_remove_style_create(lv_xml_parser_state_t * state, const char ** attrs);
+void lv_obj_xml_remove_style_apply(lv_xml_parser_state_t * state, const char ** attrs);
+
+void * lv_obj_xml_remove_style_all_create(lv_xml_parser_state_t * state, const char ** attrs);
+void lv_obj_xml_remove_style_all_apply(lv_xml_parser_state_t * state, const char ** attrs);
+
void * lv_obj_xml_event_cb_create(lv_xml_parser_state_t * state, const char ** attrs);
void lv_obj_xml_event_cb_apply(lv_xml_parser_state_t * state, const char ** attrs);
diff --git a/tests/src/test_cases/xml/test_xml_screen_event.c b/tests/src/test_cases/xml/test_xml_screen_event.c
index c1e52d6c6c..a8ff4119a6 100644
--- a/tests/src/test_cases/xml/test_xml_screen_event.c
+++ b/tests/src/test_cases/xml/test_xml_screen_event.c
@@ -1,4 +1,4 @@
-#if LV_BUILD_TEST || 1
+#if LV_BUILD_TEST
#include "../lvgl.h"
#include "unity/unity.h"
diff --git a/tests/src/test_cases/xml/test_xml_style.c b/tests/src/test_cases/xml/test_xml_style.c
index bbb4bdc152..87ce12cd25 100644
--- a/tests/src/test_cases/xml/test_xml_style.c
+++ b/tests/src/test_cases/xml/test_xml_style.c
@@ -1,4 +1,4 @@
-#if LV_BUILD_TEST
+#if LV_BUILD_TEST || 1
#include "../lvgl.h"
#include "unity/unity.h"
@@ -138,7 +138,48 @@ void test_xml_style_same_name(void)
lv_xml_component_register_from_data("comp1", comp1);
lv_obj_t * obj = lv_xml_create(lv_screen_active(), "comp1", NULL);
TEST_ASSERT_EQUAL(20, lv_obj_get_style_bg_opa(obj, 0));
+}
+
+
+void test_xml_style_remove(void)
+{
+ const char * comp1 =
+ ""
+ " "
+ " "
+ ""
+ " "
+ " "
+ " "
+ "