Commit de046ba09a5b84918848170cb073471ee95671dc

Authored by Perry Werneck
1 parent 6dc92b98

Parsing keypad model elements.

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
... ... @@ -85,9 +85,15 @@
85 85 unsigned short height;
86 86 unsigned short position;
87 87  
  88 + struct {
  89 + unsigned short row;
  90 + unsigned short col;
  91 + } current;
  92 +
88 93 gchar *name;
89 94 gchar *label;
90 95  
  96 + GList *elements;
91 97  
92 98 };
93 99  
... ...