Commit de046ba09a5b84918848170cb073471ee95671dc

Authored by Perry Werneck
1 parent 6dc92b98

Parsing keypad model elements.

src/objects/keypad/keypad.c
@@ -59,6 +59,11 @@ @@ -59,6 +59,11 @@
59 59
60 KeypadModel * model = PW_KEYPAD_MODEL(object); 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 if(model->name) { 67 if(model->name) {
63 g_free(model->name); 68 g_free(model->name);
64 model->name = NULL; 69 model->name = NULL;
@@ -139,7 +144,6 @@ @@ -139,7 +144,6 @@
139 144
140 static void KeypadModel_init(KeypadModel *object) { 145 static void KeypadModel_init(KeypadModel *object) {
141 146
142 -  
143 } 147 }
144 148
145 static void get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { 149 static void get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) {
@@ -235,14 +239,14 @@ @@ -235,14 +239,14 @@
235 return "undefined"; 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 debug("%s(%s)",__FUNCTION__,element_name); 244 debug("%s(%s)",__FUNCTION__,element_name);
241 245
242 if(!g_ascii_strcasecmp(element_name,"button")) { 246 if(!g_ascii_strcasecmp(element_name,"button")) {
243 247
244 const gchar *row, *col, *width, *height; 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 if(!g_markup_collect_attributes( 251 if(!g_markup_collect_attributes(
248 element_name,names,values,error, 252 element_name,names,values,error,
@@ -258,39 +262,59 @@ @@ -258,39 +262,59 @@
258 } 262 }
259 263
260 if(row) { 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 if(col) { 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 if(width) { 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 if(height) { 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 debug("%s(%s)",__FUNCTION__,element_name); 298 debug("%s(%s)",__FUNCTION__,element_name);
286 299
287 if(!g_ascii_strcasecmp(element_name,"button")) { 300 if(!g_ascii_strcasecmp(element_name,"button")) {
288 g_markup_parse_context_pop(context); 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 static const GMarkupParser parser = { 319 static const GMarkupParser parser = {
296 (void (*)(GMarkupParseContext *, const gchar *, const gchar **, const gchar **, gpointer, GError **)) 320 (void (*)(GMarkupParseContext *, const gchar *, const gchar **, const gchar **, gpointer, GError **))
@@ -303,6 +327,10 @@ @@ -303,6 +327,10 @@
303 NULL 327 NULL
304 }; 328 };
305 329
  330 + KeypadModel * model = PW_KEYPAD_MODEL(object);
  331 +
  332 + model->elements = g_list_reverse(model->elements);
306 g_markup_parse_context_push(context, &parser, model); 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,10 +100,9 @@
100 NULL 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 g_markup_parse_context_parse(context,text,strlen(text),&error); 104 g_markup_parse_context_parse(context,text,strlen(text),&error);
105 g_markup_parse_context_free(context); 105 g_markup_parse_context_free(context);
106 -  
107 } 106 }
108 107
109 if(error) { 108 if(error) {
src/objects/keypad/private.h
@@ -85,9 +85,15 @@ @@ -85,9 +85,15 @@
85 unsigned short height; 85 unsigned short height;
86 unsigned short position; 86 unsigned short position;
87 87
  88 + struct {
  89 + unsigned short row;
  90 + unsigned short col;
  91 + } current;
  92 +
88 gchar *name; 93 gchar *name;
89 gchar *label; 94 gchar *label;
90 95
  96 + GList *elements;
91 97
92 }; 98 };
93 99