From 0411ba7d3235508554035406dc747df19e8deffb Mon Sep 17 00:00:00 2001 From: Emmanuele Bassi Date: Thu, 17 Jun 2010 17:35:00 +0100 Subject: [PATCH] actor: Parse actions, constraints and effects members ClutterActor should allow attaching actions, constraints and effects just like it allows behaviours, e.g.: { ... "constraints" : [ { "type" : "ClutterAlignConstraint", "source" : "stage", "align-axis" : "x-axis", "factor" : 0.5 }, { "type" : "ClutterAlignConstraint", "source" : "stage", "align-axis" : "y-axis", "factor" : 0.5 } ], ... } or: { ... "actions" : [ { "type" : "ClutterDragAction", "signals" : [ { "name" : "drag-end", "handler" : "on_drag_end" } ] } ], ... } In order to do so, we use the Scriptable interface implementation and add three new custom properties accepting an array; then we parse each member of the array as a new object. --- clutter/clutter-actor.c | 86 ++++++++++++++++++++++-- tests/data/test-script-named-object.json | 36 ++++++++-- 2 files changed, 111 insertions(+), 11 deletions(-) diff --git a/clutter/clutter-actor.c b/clutter/clutter-actor.c index 37119b446..a6d6e0b6e 100644 --- a/clutter/clutter-actor.c +++ b/clutter/clutter-actor.c @@ -301,7 +301,7 @@ #include "clutter-private.h" #include "clutter-profile.h" #include "clutter-scriptable.h" -#include "clutter-script.h" +#include "clutter-script-private.h" #include "clutter-stage.h" #include "clutter-units.h" @@ -8297,6 +8297,40 @@ parse_rotation (ClutterActor *actor, return retval; } +static GSList * +parse_actor_metas (ClutterScript *script, + ClutterActor *actor, + JsonNode *node) +{ + GList *elements, *l; + GSList *retval = NULL; + + if (!JSON_NODE_HOLDS_ARRAY (node)) + return NULL; + + elements = json_array_get_elements (json_node_get_array (node)); + + for (l = elements; l != NULL; l = l->next) + { + JsonNode *element = l->data; + const gchar *id = _clutter_script_get_id_from_node (element); + GObject *meta; + + if (id == NULL || *id == '\0') + continue; + + meta = clutter_script_get_object (script, id); + if (meta == NULL) + continue; + + retval = g_slist_prepend (retval, meta); + } + + g_list_free (elements); + + return g_slist_reverse (retval); +} + static gboolean clutter_actor_parse_custom_node (ClutterScriptable *scriptable, ClutterScript *script, @@ -8355,6 +8389,19 @@ clutter_actor_parse_custom_node (ClutterScriptable *scriptable, else g_slice_free (RotationInfo, info); } + else if (strcmp (name, "actions") == 0 || + strcmp (name, "constraints") == 0 || + strcmp (name, "effects") == 0) + { + GSList *l; + + l = parse_actor_metas (script, actor, node); + + g_value_init (value, G_TYPE_POINTER); + g_value_set_pointer (value, l); + + retval = TRUE; + } return retval; } @@ -8365,6 +8412,8 @@ clutter_actor_set_custom_property (ClutterScriptable *scriptable, const gchar *name, const GValue *value) { + ClutterActor *actor = CLUTTER_ACTOR (scriptable); + #ifdef CLUTTER_ENABLE_DEBUG if (G_UNLIKELY (clutter_debug_flags & CLUTTER_DEBUG_SCRIPT)) { @@ -8388,16 +8437,45 @@ clutter_actor_set_custom_property (ClutterScriptable *scriptable, info = g_value_get_pointer (value); - clutter_actor_set_rotation (CLUTTER_ACTOR (scriptable), + clutter_actor_set_rotation (actor, info->axis, info->angle, info->center_x, info->center_y, info->center_z); g_slice_free (RotationInfo, info); + + return; } - else - g_object_set_property (G_OBJECT (scriptable), name, value); + + if (strcmp (name, "actions") == 0 || + strcmp (name, "constraints") == 0 || + strcmp (name, "effects") == 0) + { + GSList *metas, *l; + + if (!G_VALUE_HOLDS (value, G_TYPE_POINTER)) + return; + + metas = g_value_get_pointer (value); + for (l = metas; l != NULL; l = l->next) + { + if (name[0] == 'a') + clutter_actor_add_action (actor, l->data); + + if (name[0] == 'c') + clutter_actor_add_constraint (actor, l->data); + + if (name[0] == 'e') + clutter_actor_add_effect (actor, l->data); + } + + g_slist_free (metas); + + return; + } + + g_object_set_property (G_OBJECT (scriptable), name, value); } static void diff --git a/tests/data/test-script-named-object.json b/tests/data/test-script-named-object.json index f1a5d27c2..7210321c9 100644 --- a/tests/data/test-script-named-object.json +++ b/tests/data/test-script-named-object.json @@ -7,15 +7,37 @@ "pack-start" : false }, { - "id" : "test", - "type" : "ClutterBox", - "layout-manager" : "layout", + "type" : "ClutterStage", + "id" : "main-stage", "children" : [ { - "id" : "child-1", - "type" : "ClutterRectangle", - "width" : "3 em", - "height" : "3 em" + "id" : "test", + "type" : "ClutterBox", + "layout-manager" : "layout", + "children" : [ + { + "id" : "child-1", + "type" : "ClutterRectangle", + "width" : "3 em", + "height" : "3 em" + } + ], + "constraints" : [ + { + "type" : "ClutterAlignConstraint", + "name" : "x-align", + "factor" : 0.5, + "align-axis" : "x-axis", + "source" : "main-stage" + }, + { + "type" : "ClutterAlignConstraint", + "name" : "y-align", + "factor" : 0.5, + "align-axis" : "y-axis", + "source" : "main-stage" + } + ] } ] }