2007-10-08 Emmanuele Bassi <ebassi@openedhand.com>

* clutter/clutter-script-private.h:
	* clutter/clutter-script.c: Allow defining childrens for every
	container actor inside the UI definition files.
This commit is contained in:
Emmanuele Bassi 2007-10-08 16:25:10 +00:00
parent 34a40de3c5
commit 76dd06bc7b
3 changed files with 39 additions and 31 deletions

View File

@ -1,3 +1,9 @@
2007-10-08 Emmanuele Bassi <ebassi@openedhand.com>
* clutter/clutter-script-private.h:
* clutter/clutter-script.c: Allow defining childrens for every
container actor inside the UI definition files.
2007-10-08 Matthew Allum <mallum@openedhand.com> 2007-10-08 Matthew Allum <mallum@openedhand.com>
* clutter/clutter-actor.c: * clutter/clutter-actor.c:

View File

@ -13,6 +13,7 @@ typedef struct {
gchar *id; gchar *id;
GList *properties; GList *properties;
GList *children;
GType gtype; GType gtype;
GObject *object; GObject *object;

View File

@ -137,15 +137,15 @@ parse_member_to_property (ClutterScript *script,
const gchar *name, const gchar *name,
JsonNode *node) JsonNode *node)
{ {
PropertyInfo *retval; PropertyInfo *retval = NULL;
GValue value = { 0, }; GValue value = { 0, };
retval = g_slice_new (PropertyInfo);
retval->property_name = g_strdup (name);
switch (JSON_NODE_TYPE (node)) switch (JSON_NODE_TYPE (node))
{ {
case JSON_NODE_VALUE: case JSON_NODE_VALUE:
retval = g_slice_new (PropertyInfo);
retval->property_name = g_strdup (name);
json_node_get_value (node, &value); json_node_get_value (node, &value);
g_value_init (&retval->value, G_VALUE_TYPE (&value)); g_value_init (&retval->value, G_VALUE_TYPE (&value));
g_value_copy (&value, &retval->value); g_value_copy (&value, &retval->value);
@ -156,7 +156,7 @@ parse_member_to_property (ClutterScript *script,
break; break;
case JSON_NODE_ARRAY: case JSON_NODE_ARRAY:
if (strcmp (name, "geometry") == 0) if (strcmp (name, "clip") == 0)
{ {
JsonArray *array = json_node_get_array (node); JsonArray *array = json_node_get_array (node);
JsonNode *val; JsonNode *val;
@ -176,6 +176,8 @@ parse_member_to_property (ClutterScript *script,
} }
} }
retval = g_slice_new (PropertyInfo);
retval->property_name = g_strdup (name);
g_value_init (&retval->value, CLUTTER_TYPE_GEOMETRY); g_value_init (&retval->value, CLUTTER_TYPE_GEOMETRY);
g_value_set_boxed (&retval->value, &geom); g_value_set_boxed (&retval->value, &geom);
} }
@ -221,8 +223,7 @@ parse_member_to_property (ClutterScript *script,
} }
} }
g_value_init (&retval->value, G_TYPE_POINTER); info->children = children;
g_value_set_pointer (&retval->value, children);
} }
break; break;
@ -277,6 +278,9 @@ json_object_end (JsonParser *parser,
PropertyInfo *pinfo; PropertyInfo *pinfo;
pinfo = parse_member_to_property (script, oinfo, name, val); pinfo = parse_member_to_property (script, oinfo, name, val);
if (!pinfo)
continue;
oinfo->properties = g_list_prepend (oinfo->properties, pinfo); oinfo->properties = g_list_prepend (oinfo->properties, pinfo);
CLUTTER_NOTE (SCRIPT, "Added property `%s' (type:%s) for class `%s'", CLUTTER_NOTE (SCRIPT, "Added property `%s' (type:%s) for class `%s'",
@ -371,9 +375,6 @@ translate_properties (ClutterScript *script,
PropertyInfo *pinfo = l->data; PropertyInfo *pinfo = l->data;
GParameter param = { NULL }; GParameter param = { NULL };
if (strcmp (pinfo->property_name, "children") == 0)
continue;
pspec = g_object_class_find_property (oclass, pinfo->property_name); pspec = g_object_class_find_property (oclass, pinfo->property_name);
if (!pspec) if (!pspec)
{ {
@ -450,24 +451,6 @@ construct_stage (ClutterScript *script,
GParamSpec *pspec; GParamSpec *pspec;
GValue value = { 0, }; GValue value = { 0, };
/* "children" is a fake property: we use it so we can construct
* the list of children of a given container
*/
if (strcmp (name, "children") == 0)
{
GList *children = g_value_get_pointer (&pinfo->value);
/* we know ClutterStage is a ClutterContainer */
add_children (script, CLUTTER_CONTAINER (oinfo->object), children);
/* unset, so we don't leak it later */
g_list_foreach (children, (GFunc) g_free, NULL);
g_list_free (children);
g_value_set_pointer (&pinfo->value, NULL);
continue;
}
pspec = g_object_class_find_property (oclass, name); pspec = g_object_class_find_property (oclass, name);
if (!pspec) if (!pspec)
{ {
@ -489,6 +472,14 @@ construct_stage (ClutterScript *script,
g_type_class_unref (oclass); g_type_class_unref (oclass);
if (oinfo->children)
{
/* we know ClutterStage is a ClutterContainer */
add_children (script,
CLUTTER_CONTAINER (oinfo->object),
oinfo->children);
}
g_object_set_data_full (oinfo->object, "clutter-script-name", g_object_set_data_full (oinfo->object, "clutter-script-name",
g_strdup (oinfo->id), g_strdup (oinfo->id),
g_free); g_free);
@ -527,9 +518,6 @@ clutter_script_construct_object (ClutterScript *script,
n_params); n_params);
oinfo->object = g_object_newv (gtype, n_params, params); oinfo->object = g_object_newv (gtype, n_params, params);
g_object_set_data_full (oinfo->object, "clutter-script-name",
g_strdup (oinfo->id),
g_free);
for (i = 0; i < n_params; i++) for (i = 0; i < n_params; i++)
{ {
@ -539,6 +527,16 @@ clutter_script_construct_object (ClutterScript *script,
g_free (params); g_free (params);
if (oinfo->children)
{
if (CLUTTER_IS_CONTAINER (oinfo->object))
add_children (script, CLUTTER_CONTAINER (oinfo->object), oinfo->children);
}
g_object_set_data_full (oinfo->object, "clutter-script-name",
g_strdup (oinfo->id),
g_free);
return oinfo->object; return oinfo->object;
} }
@ -583,6 +581,9 @@ object_info_free (gpointer data)
} }
g_list_free (oinfo->properties); g_list_free (oinfo->properties);
g_list_foreach (oinfo->children, (GFunc) g_free, NULL);
g_list_free (oinfo->children);
if (oinfo->object) if (oinfo->object)
g_object_unref (oinfo->object); g_object_unref (oinfo->object);