1 /**
2  * @file lv_xml_obj_parser.c
3  *
4  */
5 
6 /*********************
7  *      INCLUDES
8  *********************/
9 #include "lv_xml_obj_parser.h"
10 #if LV_USE_XML
11 
12 #include "../../../lvgl.h"
13 #include "../../../lvgl_private.h"
14 
15 /*********************
16  *      DEFINES
17  *********************/
18 
19 /**********************
20  *      TYPEDEFS
21  **********************/
22 
23 /**********************
24  *  STATIC PROTOTYPES
25  **********************/
26 static void apply_styles(lv_obj_t * obj, const char * name, const char * value);
27 
28 /**********************
29  *  STATIC VARIABLES
30  **********************/
31 
32 /**********************
33  *      MACROS
34  **********************/
35 
36 /* Expands to
37    if(lv_streq(prop_name, "style_height")) lv_obj_set_style_height(obj, value, selector)
38  */
39 #define SET_STYLE_IF(prop, value) if(lv_streq(prop_name, "style_" #prop)) lv_obj_set_style_##prop(obj, value, selector)
40 
41 /**********************
42  *   GLOBAL FUNCTIONS
43  **********************/
44 
lv_xml_obj_create(lv_xml_parser_state_t * state,const char ** attrs)45 void * lv_xml_obj_create(lv_xml_parser_state_t * state, const char ** attrs)
46 {
47     LV_UNUSED(attrs);
48     void * item = lv_obj_create(lv_xml_state_get_parent(state));
49 
50     return item;
51 }
52 
lv_xml_obj_apply(lv_xml_parser_state_t * state,const char ** attrs)53 void lv_xml_obj_apply(lv_xml_parser_state_t * state, const char ** attrs)
54 {
55     void * item = lv_xml_state_get_item(state);
56 
57     for(int i = 0; attrs[i]; i += 2) {
58         const char * name = attrs[i];
59         const char * value = attrs[i + 1];
60 
61         if(lv_streq("x", name)) lv_obj_set_x(item, lv_xml_to_size(value));
62         else if(lv_streq("y", name)) lv_obj_set_y(item, lv_xml_to_size(value));
63         else if(lv_streq("width", name)) lv_obj_set_width(item, lv_xml_to_size(value));
64         else if(lv_streq("height", name)) lv_obj_set_height(item, lv_xml_to_size(value));
65         else if(lv_streq("align", name)) lv_obj_set_align(item, lv_xml_align_to_enum(value));
66         else if(lv_streq("flex_flow", name)) lv_obj_set_flex_flow(item, lv_xml_flex_flow_to_enum(value));
67         else if(lv_streq("flex_grow", name)) lv_obj_set_flex_grow(item, lv_xml_atoi(value));
68 
69         else if(lv_streq("hidden", name))               lv_obj_update_flag(item, LV_OBJ_FLAG_HIDDEN, lv_xml_to_bool(value));
70         else if(lv_streq("clickable", name))            lv_obj_update_flag(item, LV_OBJ_FLAG_CLICKABLE, lv_xml_to_bool(value));
71         else if(lv_streq("click_focusable", name))      lv_obj_update_flag(item, LV_OBJ_FLAG_CLICK_FOCUSABLE,
72                                                                                lv_xml_to_bool(value));
73         else if(lv_streq("checkable", name))            lv_obj_update_flag(item, LV_OBJ_FLAG_CHECKABLE, lv_xml_to_bool(value));
74         else if(lv_streq("scrollable", name))           lv_obj_update_flag(item, LV_OBJ_FLAG_SCROLLABLE, lv_xml_to_bool(value));
75         else if(lv_streq("scroll_elastic", name))       lv_obj_update_flag(item, LV_OBJ_FLAG_SCROLL_ELASTIC,
76                                                                                lv_xml_to_bool(value));
77         else if(lv_streq("scroll_momentum", name))      lv_obj_update_flag(item, LV_OBJ_FLAG_SCROLL_MOMENTUM,
78                                                                                lv_xml_to_bool(value));
79         else if(lv_streq("scroll_one", name))           lv_obj_update_flag(item, LV_OBJ_FLAG_SCROLL_ONE, lv_xml_to_bool(value));
80         else if(lv_streq("scroll_chain_hor", name))     lv_obj_update_flag(item, LV_OBJ_FLAG_SCROLL_CHAIN_HOR,
81                                                                                lv_xml_to_bool(value));
82         else if(lv_streq("scroll_chain_ver", name))     lv_obj_update_flag(item, LV_OBJ_FLAG_SCROLL_CHAIN_VER,
83                                                                                lv_xml_to_bool(value));
84         else if(lv_streq("scroll_chain", name))         lv_obj_update_flag(item, LV_OBJ_FLAG_SCROLL_CHAIN,
85                                                                                lv_xml_to_bool(value));
86         else if(lv_streq("scroll_on_focus", name))      lv_obj_update_flag(item, LV_OBJ_FLAG_SCROLL_ON_FOCUS,
87                                                                                lv_xml_to_bool(value));
88         else if(lv_streq("scroll_with_arrow", name))    lv_obj_update_flag(item, LV_OBJ_FLAG_SCROLL_WITH_ARROW,
89                                                                                lv_xml_to_bool(value));
90         else if(lv_streq("snappable", name))            lv_obj_update_flag(item, LV_OBJ_FLAG_SNAPPABLE, lv_xml_to_bool(value));
91         else if(lv_streq("press_lock", name))           lv_obj_update_flag(item, LV_OBJ_FLAG_PRESS_LOCK, lv_xml_to_bool(value));
92         else if(lv_streq("event_bubble", name))         lv_obj_update_flag(item, LV_OBJ_FLAG_EVENT_BUBBLE,
93                                                                                lv_xml_to_bool(value));
94         else if(lv_streq("gesture_bubble", name))       lv_obj_update_flag(item, LV_OBJ_FLAG_GESTURE_BUBBLE,
95                                                                                lv_xml_to_bool(value));
96         else if(lv_streq("adv_hittest", name))          lv_obj_update_flag(item, LV_OBJ_FLAG_ADV_HITTEST,
97                                                                                lv_xml_to_bool(value));
98         else if(lv_streq("ignore_layout", name))        lv_obj_update_flag(item, LV_OBJ_FLAG_IGNORE_LAYOUT,
99                                                                                lv_xml_to_bool(value));
100         else if(lv_streq("floating", name))             lv_obj_update_flag(item, LV_OBJ_FLAG_FLOATING, lv_xml_to_bool(value));
101         else if(lv_streq("send_draw_task_events", name))lv_obj_update_flag(item, LV_OBJ_FLAG_SEND_DRAW_TASK_EVENTS,
102                                                                                lv_xml_to_bool(value));
103         else if(lv_streq("overflow_visible", name))     lv_obj_update_flag(item, LV_OBJ_FLAG_OVERFLOW_VISIBLE,
104                                                                                lv_xml_to_bool(value));
105         else if(lv_streq("flex_in_new_track", name))    lv_obj_update_flag(item, LV_OBJ_FLAG_FLEX_IN_NEW_TRACK,
106                                                                                lv_xml_to_bool(value));
107 
108         else if(lv_streq("styles", name)) lv_xml_style_add_to_obj(state, item, value);
109 
110         else if(lv_strlen(name) > 6 && lv_memcmp("style_", name, 6) == 0) {
111             apply_styles(item, name, value);
112         }
113     }
114 }
115 
116 /**********************
117  *   STATIC FUNCTIONS
118  **********************/
119 
apply_styles(lv_obj_t * obj,const char * name,const char * value)120 static void apply_styles(lv_obj_t * obj, const char * name, const char * value)
121 {
122     char name_local[512];
123     lv_strlcpy(name_local, name, sizeof(name_local));
124 
125     lv_style_selector_t selector;
126     const char * prop_name = lv_xml_style_string_process(name_local, &selector);
127 
128     SET_STYLE_IF(width, lv_xml_to_size(value));
129     else SET_STYLE_IF(height, lv_xml_to_size(value));
130     else SET_STYLE_IF(length, lv_xml_to_size(value));
131     else SET_STYLE_IF(radius, lv_xml_to_size(value));
132 
133     else SET_STYLE_IF(pad_left, lv_xml_atoi(value));
134     else SET_STYLE_IF(pad_right, lv_xml_atoi(value));
135     else SET_STYLE_IF(pad_top, lv_xml_atoi(value));
136     else SET_STYLE_IF(pad_bottom, lv_xml_atoi(value));
137     else SET_STYLE_IF(pad_hor, lv_xml_atoi(value));
138     else SET_STYLE_IF(pad_ver, lv_xml_atoi(value));
139     else SET_STYLE_IF(pad_all, lv_xml_atoi(value));
140     else SET_STYLE_IF(pad_row, lv_xml_atoi(value));
141     else SET_STYLE_IF(pad_column, lv_xml_atoi(value));
142     else SET_STYLE_IF(pad_gap, lv_xml_atoi(value));
143     else SET_STYLE_IF(pad_radial, lv_xml_atoi(value));
144 
145     else SET_STYLE_IF(margin_left, lv_xml_atoi(value));
146     else SET_STYLE_IF(margin_right, lv_xml_atoi(value));
147     else SET_STYLE_IF(margin_top, lv_xml_atoi(value));
148     else SET_STYLE_IF(margin_bottom, lv_xml_atoi(value));
149     else SET_STYLE_IF(margin_hor, lv_xml_atoi(value));
150     else SET_STYLE_IF(margin_ver, lv_xml_atoi(value));
151     else SET_STYLE_IF(margin_all, lv_xml_atoi(value));
152 
153     else SET_STYLE_IF(base_dir, lv_xml_base_dir_to_enum(value));
154     else SET_STYLE_IF(clip_corner, lv_xml_to_bool(value));
155 
156     else SET_STYLE_IF(bg_opa, lv_xml_to_opa(value));
157     else SET_STYLE_IF(bg_color, lv_xml_to_color(value));
158     else SET_STYLE_IF(bg_grad_dir, lv_xml_grad_dir_to_enum(value));
159     else SET_STYLE_IF(bg_grad_color, lv_xml_to_color(value));
160     else SET_STYLE_IF(bg_main_stop, lv_xml_atoi(value));
161     else SET_STYLE_IF(bg_grad_stop, lv_xml_atoi(value));
162 
163     else SET_STYLE_IF(bg_image_src, lv_xml_get_image(value));
164     else SET_STYLE_IF(bg_image_tiled, lv_xml_to_bool(value));
165     else SET_STYLE_IF(bg_image_recolor, lv_xml_to_color(value));
166     else SET_STYLE_IF(bg_image_recolor_opa, lv_xml_to_opa(value));
167 
168     else SET_STYLE_IF(border_color, lv_xml_to_color(value));
169     else SET_STYLE_IF(border_width, lv_xml_atoi(value));
170     else SET_STYLE_IF(border_opa, lv_xml_to_opa(value));
171     else SET_STYLE_IF(border_side, lv_xml_border_side_to_enum(value));
172     else SET_STYLE_IF(border_post, lv_xml_to_bool(value));
173 
174     else SET_STYLE_IF(outline_color, lv_xml_to_color(value));
175     else SET_STYLE_IF(outline_width, lv_xml_atoi(value));
176     else SET_STYLE_IF(outline_opa, lv_xml_to_opa(value));
177     else SET_STYLE_IF(outline_pad, lv_xml_atoi(value));
178 
179     else SET_STYLE_IF(shadow_width, lv_xml_atoi(value));
180     else SET_STYLE_IF(shadow_color, lv_xml_to_color(value));
181     else SET_STYLE_IF(shadow_offset_x, lv_xml_atoi(value));
182     else SET_STYLE_IF(shadow_offset_y, lv_xml_atoi(value));
183     else SET_STYLE_IF(shadow_spread, lv_xml_atoi(value));
184     else SET_STYLE_IF(shadow_opa, lv_xml_to_opa(value));
185 
186     else SET_STYLE_IF(text_color, lv_xml_to_color(value));
187     else SET_STYLE_IF(text_font, lv_xml_get_font(value));
188     else SET_STYLE_IF(text_opa, lv_xml_to_opa(value));
189     else SET_STYLE_IF(text_align, lv_xml_text_align_to_enum(value));
190     else SET_STYLE_IF(text_letter_space, lv_xml_atoi(value));
191     else SET_STYLE_IF(text_line_space, lv_xml_atoi(value));
192     else SET_STYLE_IF(text_decor, lv_xml_text_decor_to_enum(value));
193 
194     else SET_STYLE_IF(image_opa, lv_xml_to_opa(value));
195     else SET_STYLE_IF(image_recolor, lv_xml_to_color(value));
196     else SET_STYLE_IF(image_recolor_opa, lv_xml_to_opa(value));
197 
198     else SET_STYLE_IF(line_color, lv_xml_to_color(value));
199     else SET_STYLE_IF(line_opa, lv_xml_to_opa(value));
200     else SET_STYLE_IF(line_width, lv_xml_atoi(value));
201     else SET_STYLE_IF(line_dash_width, lv_xml_atoi(value));
202     else SET_STYLE_IF(line_dash_gap, lv_xml_atoi(value));
203     else SET_STYLE_IF(line_rounded, lv_xml_to_bool(value));
204 
205     else SET_STYLE_IF(arc_color, lv_xml_to_color(value));
206     else SET_STYLE_IF(arc_opa, lv_xml_to_opa(value));
207     else SET_STYLE_IF(arc_width, lv_xml_atoi(value));
208     else SET_STYLE_IF(arc_rounded, lv_xml_to_bool(value));
209     else SET_STYLE_IF(arc_image_src, lv_xml_get_image(value));
210 
211     else SET_STYLE_IF(opa, lv_xml_to_opa(value));
212     else SET_STYLE_IF(opa_layered, lv_xml_to_opa(value));
213     else SET_STYLE_IF(color_filter_opa, lv_xml_to_opa(value));
214     else SET_STYLE_IF(anim_duration, lv_xml_atoi(value));
215     else SET_STYLE_IF(blend_mode, lv_xml_blend_mode_to_enum(value));
216     else SET_STYLE_IF(transform_width, lv_xml_atoi(value));
217     else SET_STYLE_IF(transform_height, lv_xml_atoi(value));
218     else SET_STYLE_IF(translate_x, lv_xml_atoi(value));
219     else SET_STYLE_IF(translate_y, lv_xml_atoi(value));
220     else SET_STYLE_IF(translate_radial, lv_xml_atoi(value));
221     else SET_STYLE_IF(transform_scale_x, lv_xml_atoi(value));
222     else SET_STYLE_IF(transform_scale_y, lv_xml_atoi(value));
223     else SET_STYLE_IF(transform_rotation, lv_xml_atoi(value));
224     else SET_STYLE_IF(transform_pivot_x, lv_xml_atoi(value));
225     else SET_STYLE_IF(transform_pivot_y, lv_xml_atoi(value));
226     else SET_STYLE_IF(transform_skew_x, lv_xml_atoi(value));
227     else SET_STYLE_IF(bitmap_mask_src, lv_xml_get_image(value));
228     else SET_STYLE_IF(rotary_sensitivity, lv_xml_atoi(value));
229 
230     else SET_STYLE_IF(layout, lv_xml_layout_to_enum(value));
231 
232     else SET_STYLE_IF(flex_flow, lv_xml_flex_flow_to_enum(value));
233     else SET_STYLE_IF(flex_grow, lv_xml_atoi(value));
234     else SET_STYLE_IF(flex_main_place, lv_xml_flex_align_to_enum(value));
235     else SET_STYLE_IF(flex_cross_place, lv_xml_flex_align_to_enum(value));
236     else SET_STYLE_IF(flex_track_place, lv_xml_flex_align_to_enum(value));
237 
238     else SET_STYLE_IF(grid_column_align, lv_xml_grid_align_to_enum(value));
239     else SET_STYLE_IF(grid_row_align, lv_xml_grid_align_to_enum(value));
240     else SET_STYLE_IF(grid_cell_column_pos, lv_xml_atoi(value));
241     else SET_STYLE_IF(grid_cell_column_span, lv_xml_atoi(value));
242     else SET_STYLE_IF(grid_cell_x_align, lv_xml_grid_align_to_enum(value));
243     else SET_STYLE_IF(grid_cell_row_pos, lv_xml_atoi(value));
244     else SET_STYLE_IF(grid_cell_row_span, lv_xml_atoi(value));
245     else SET_STYLE_IF(grid_cell_y_align, lv_xml_grid_align_to_enum(value));
246 }
247 
248 
249 #endif /* LV_USE_XML */
250