Commit de046ba09a5b84918848170cb073471ee95671dc
1 parent
6dc92b98
Exists in
master
and in
4 other branches
Parsing keypad model elements.
Showing
3 changed files
with
45 additions
and
12 deletions
Show diff stats
src/objects/keypad/keypad.c
... | ... | @@ -59,6 +59,11 @@ |
59 | 59 | |
60 | 60 | KeypadModel * model = PW_KEYPAD_MODEL(object); |
61 | 61 | |
62 | + if(model->elements) { | |
63 | + g_list_free_full(model->elements,g_object_unref); | |
64 | + model->elements = NULL; | |
65 | + } | |
66 | + | |
62 | 67 | if(model->name) { |
63 | 68 | g_free(model->name); |
64 | 69 | model->name = NULL; |
... | ... | @@ -139,7 +144,6 @@ |
139 | 144 | |
140 | 145 | static void KeypadModel_init(KeypadModel *object) { |
141 | 146 | |
142 | - | |
143 | 147 | } |
144 | 148 | |
145 | 149 | static void get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { |
... | ... | @@ -235,14 +239,14 @@ |
235 | 239 | return "undefined"; |
236 | 240 | } |
237 | 241 | |
238 | - static void element_start(GMarkupParseContext *context, const gchar *element_name, const gchar **names,const gchar **values, KeypadModel *model, GError **error) { | |
242 | + static void element_start(GMarkupParseContext *context, const gchar *element_name, const gchar **names,const gchar **values, KeypadModel *keypad, GError **error) { | |
239 | 243 | |
240 | 244 | debug("%s(%s)",__FUNCTION__,element_name); |
241 | 245 | |
242 | 246 | if(!g_ascii_strcasecmp(element_name,"button")) { |
243 | 247 | |
244 | 248 | const gchar *row, *col, *width, *height; |
245 | - GObject * element = g_object_new(PW_TYPE_KEYPAD_ELEMENT,NULL); | |
249 | + KeypadElement * element = PW_KEYPAD_ELEMENT(g_object_new(PW_TYPE_KEYPAD_ELEMENT,NULL)); | |
246 | 250 | |
247 | 251 | if(!g_markup_collect_attributes( |
248 | 252 | element_name,names,values,error, |
... | ... | @@ -258,39 +262,59 @@ |
258 | 262 | } |
259 | 263 | |
260 | 264 | if(row) { |
261 | - PW_KEYPAD_ELEMENT(element)->width = (unsigned short) atoi(row); | |
265 | + element->row = (unsigned short) atoi(row); | |
266 | + } else { | |
267 | + element->row = keypad->current.row; | |
262 | 268 | } |
263 | 269 | |
264 | 270 | if(col) { |
265 | - PW_KEYPAD_ELEMENT(element)->width = (unsigned short) atoi(col); | |
271 | + element->col = (unsigned short) atoi(col); | |
272 | + } else { | |
273 | + element->col = keypad->current.col; | |
266 | 274 | } |
267 | 275 | |
268 | 276 | if(width) { |
269 | - PW_KEYPAD_ELEMENT(element)->width = (unsigned short) atoi(width); | |
277 | + element->width = (unsigned short) atoi(width); | |
278 | + } else { | |
279 | + element->width = 1; | |
270 | 280 | } |
271 | 281 | |
272 | 282 | if(height) { |
273 | - PW_KEYPAD_MODEL(element)->height = (unsigned short) atoi(height); | |
283 | + element->height = (unsigned short) atoi(height); | |
284 | + } else { | |
285 | + element->height = 1; | |
274 | 286 | } |
275 | 287 | |
276 | - keypad_model_element_parse_context(element,context); | |
288 | + keypad->elements = g_list_prepend(keypad->elements,element); | |
289 | + keypad_model_element_parse_context(G_OBJECT(element),context); | |
277 | 290 | |
278 | 291 | } |
279 | 292 | |
280 | 293 | |
281 | 294 | } |
282 | 295 | |
283 | - static void element_end(GMarkupParseContext *context, const gchar *element_name, GList *keypads, GError **error) { | |
296 | + static void element_end(GMarkupParseContext *context, const gchar *element_name, KeypadModel *keypad, GError **error) { | |
284 | 297 | |
285 | 298 | debug("%s(%s)",__FUNCTION__,element_name); |
286 | 299 | |
287 | 300 | if(!g_ascii_strcasecmp(element_name,"button")) { |
288 | 301 | g_markup_parse_context_pop(context); |
302 | + | |
303 | + KeypadElement * element = PW_KEYPAD_ELEMENT(g_list_first(keypad->elements)->data); | |
304 | + | |
305 | + keypad->current.row = element->row; | |
306 | + keypad->current.col = element->col + element->width; | |
307 | + | |
308 | + if(keypad->width && keypad->current.col >= keypad->width) { | |
309 | + keypad->current.col = 0; | |
310 | + keypad->current.row++; | |
311 | + } | |
312 | + | |
289 | 313 | } |
290 | 314 | |
291 | 315 | } |
292 | 316 | |
293 | - void keypad_model_parse_context(GObject *model, GMarkupParseContext *context) { | |
317 | + void keypad_model_parse_context(GObject *object, GMarkupParseContext *context) { | |
294 | 318 | |
295 | 319 | static const GMarkupParser parser = { |
296 | 320 | (void (*)(GMarkupParseContext *, const gchar *, const gchar **, const gchar **, gpointer, GError **)) |
... | ... | @@ -303,6 +327,10 @@ |
303 | 327 | NULL |
304 | 328 | }; |
305 | 329 | |
330 | + KeypadModel * model = PW_KEYPAD_MODEL(object); | |
331 | + | |
332 | + model->elements = g_list_reverse(model->elements); | |
306 | 333 | g_markup_parse_context_push(context, &parser, model); |
334 | + model->elements = g_list_reverse(model->elements); | |
307 | 335 | |
308 | 336 | } | ... | ... |
src/objects/keypad/load.c
... | ... | @@ -100,10 +100,9 @@ |
100 | 100 | NULL |
101 | 101 | }; |
102 | 102 | |
103 | - GMarkupParseContext * context = g_markup_parse_context_new(&parser,G_MARKUP_TREAT_CDATA_AS_TEXT,keypads,NULL); | |
103 | + GMarkupParseContext * context = g_markup_parse_context_new(&parser,G_MARKUP_TREAT_CDATA_AS_TEXT,keypads,NULL); | |
104 | 104 | g_markup_parse_context_parse(context,text,strlen(text),&error); |
105 | 105 | g_markup_parse_context_free(context); |
106 | - | |
107 | 106 | } |
108 | 107 | |
109 | 108 | if(error) { | ... | ... |
src/objects/keypad/private.h