#include "clutter-action.h"
#include "clutter-actor-meta-private.h"
#include "clutter-animatable.h"
+#include "clutter-behaviour.h"
#include "clutter-constraint.h"
#include "clutter-container.h"
#include "clutter-debug.h"
return g_slist_reverse (retval);
}
+static GSList *
+parse_behaviours (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 *behaviour;
+
+ if (id == NULL || *id == '\0')
+ continue;
+
+ behaviour = clutter_script_get_object (script, id);
+ if (behaviour == NULL)
+ continue;
+
+ retval = g_slist_prepend (retval, behaviour);
+ }
+
+ g_list_free (elements);
+
+ return g_slist_reverse (retval);
+}
+
static gboolean
clutter_actor_parse_custom_node (ClutterScriptable *scriptable,
ClutterScript *script,
else
g_slice_free (RotationInfo, info);
}
+ else if (strcmp (name, "behaviours") == 0)
+ {
+ GSList *l;
+
+ l = parse_behaviours (script, actor, node);
+
+ g_value_init (value, G_TYPE_POINTER);
+ g_value_set_pointer (value, l);
+
+ retval = TRUE;
+ }
else if (strcmp (name, "actions") == 0 ||
strcmp (name, "constraints") == 0 ||
strcmp (name, "effects") == 0)
return;
}
+ if (strcmp (name, "behaviours") == 0)
+ {
+ GSList *behaviours, *l;
+
+ if (!G_VALUE_HOLDS (value, G_TYPE_POINTER))
+ return;
+
+ behaviours = g_value_get_pointer (value);
+ for (l = behaviours; l != NULL; l = l->next)
+ {
+ ClutterBehaviour *behaviour = l->data;
+
+ clutter_behaviour_apply (behaviour, actor);
+ }
+
+ g_slist_free (behaviours);
+
+ return;
+ }
+
if (strcmp (name, "actions") == 0 ||
strcmp (name, "constraints") == 0 ||
strcmp (name, "effects") == 0)
#include <gmodule.h>
#include "clutter-actor.h"
-#include "clutter-behaviour.h"
#include "clutter-container.h"
#include "clutter-debug.h"
#include "clutter-enum-types.h"
return retval;
}
-static GList *
-parse_behaviours (ObjectInfo *oinfo,
- JsonNode *node)
-{
- JsonArray *array;
- GList *retval;
- guint array_len, i;
-
- if (JSON_NODE_TYPE (node) != JSON_NODE_ARRAY)
- return NULL;
-
- retval = oinfo->behaviours;
-
- array = json_node_get_array (node);
- array_len = json_array_get_length (array);
-
- for (i = 0; i < array_len; i++)
- {
- JsonNode *child = json_array_get_element (array, i);
- const gchar *id;
-
- id = _clutter_script_get_id_from_node (child);
- if (id)
- retval = g_list_prepend (retval, g_strdup (id));
- }
-
- return g_list_reverse (retval);
-}
-
static ClutterTimeline *
construct_timeline (ClutterScript *script,
JsonObject *object)
json_object_remove_member (object, "children");
}
- if (json_object_has_member (object, "behaviours"))
- {
- val = json_object_get_member (object, "behaviours");
- oinfo->behaviours = parse_behaviours (oinfo, val);
-
- json_object_remove_member (object, "behaviours");
- }
-
if (json_object_has_member (object, "signals"))
{
val = json_object_get_member (object, "signals");
}
static void
-apply_behaviours (ClutterScript *script,
- ObjectInfo *oinfo)
-{
- ClutterActor *actor = CLUTTER_ACTOR (oinfo->object);
- GList *l, *unresolved;
-
- unresolved = NULL;
- for (l = oinfo->behaviours; l != NULL; l = l->next)
- {
- const gchar *name = l->data;
- ObjectInfo *behaviour_info;
- GObject *object = NULL;
-
- behaviour_info = _clutter_script_get_object_info (script, name);
- if (behaviour_info != NULL)
- {
- _clutter_script_construct_object (script, behaviour_info);
- object = behaviour_info->object;
- }
-
- if (object == NULL)
- {
- unresolved = g_list_prepend (unresolved, g_strdup (name));
- continue;
- }
-
- CLUTTER_NOTE (SCRIPT, "Applying behaviour '%s' to actor of type '%s'",
- name,
- g_type_name (G_OBJECT_TYPE (actor)));
-
- clutter_behaviour_apply (CLUTTER_BEHAVIOUR (object), actor);
- }
-
- g_list_foreach (oinfo->behaviours, (GFunc) g_free, NULL);
- g_list_free (oinfo->behaviours);
-
- oinfo->behaviours = unresolved;
-}
-
-static void
add_children (ClutterScript *script,
ObjectInfo *oinfo)
{
if (oinfo->children != NULL && CLUTTER_IS_CONTAINER (oinfo->object))
add_children (script, oinfo);
- if (oinfo->behaviours != NULL && CLUTTER_IS_ACTOR (oinfo->object))
- apply_behaviours (script, oinfo);
-
/* this is a bit *eugh*, but it allows us to effectively make sure
* that child and layout properties are parsed and applied to the
* right child
}
}
- if (oinfo->properties || oinfo->children || oinfo->behaviours)
+ if (oinfo->properties || oinfo->children)
oinfo->has_unresolved = TRUE;
else
oinfo->has_unresolved = FALSE;