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