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