mirror of
https://github.com/brl/mutter.git
synced 2025-02-18 06:04:10 +00:00
script: Let ClutterActor parse behaviours
Up until now, the "behaviours" member of an actor definition was parsed by the ClutterScript parser itself - even though it's not strictly necessary. In an effort to minimize the ad hoc code in the Script parser, we should let ClutterActor handle all the special cases that involve actor-specific members.
This commit is contained in:
parent
fdc79427a6
commit
b7f99ddd3c
@ -291,6 +291,7 @@
|
|||||||
#include "clutter-action.h"
|
#include "clutter-action.h"
|
||||||
#include "clutter-actor-meta-private.h"
|
#include "clutter-actor-meta-private.h"
|
||||||
#include "clutter-animatable.h"
|
#include "clutter-animatable.h"
|
||||||
|
#include "clutter-behaviour.h"
|
||||||
#include "clutter-constraint.h"
|
#include "clutter-constraint.h"
|
||||||
#include "clutter-container.h"
|
#include "clutter-container.h"
|
||||||
#include "clutter-debug.h"
|
#include "clutter-debug.h"
|
||||||
@ -8340,6 +8341,40 @@ parse_actor_metas (ClutterScript *script,
|
|||||||
return g_slist_reverse (retval);
|
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
|
static gboolean
|
||||||
clutter_actor_parse_custom_node (ClutterScriptable *scriptable,
|
clutter_actor_parse_custom_node (ClutterScriptable *scriptable,
|
||||||
ClutterScript *script,
|
ClutterScript *script,
|
||||||
@ -8398,6 +8433,17 @@ clutter_actor_parse_custom_node (ClutterScriptable *scriptable,
|
|||||||
else
|
else
|
||||||
g_slice_free (RotationInfo, info);
|
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 ||
|
else if (strcmp (name, "actions") == 0 ||
|
||||||
strcmp (name, "constraints") == 0 ||
|
strcmp (name, "constraints") == 0 ||
|
||||||
strcmp (name, "effects") == 0)
|
strcmp (name, "effects") == 0)
|
||||||
@ -8457,6 +8503,26 @@ clutter_actor_set_custom_property (ClutterScriptable *scriptable,
|
|||||||
return;
|
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 ||
|
if (strcmp (name, "actions") == 0 ||
|
||||||
strcmp (name, "constraints") == 0 ||
|
strcmp (name, "constraints") == 0 ||
|
||||||
strcmp (name, "effects") == 0)
|
strcmp (name, "effects") == 0)
|
||||||
|
@ -35,7 +35,6 @@
|
|||||||
#include <gmodule.h>
|
#include <gmodule.h>
|
||||||
|
|
||||||
#include "clutter-actor.h"
|
#include "clutter-actor.h"
|
||||||
#include "clutter-behaviour.h"
|
|
||||||
#include "clutter-container.h"
|
#include "clutter-container.h"
|
||||||
#include "clutter-debug.h"
|
#include "clutter-debug.h"
|
||||||
#include "clutter-enum-types.h"
|
#include "clutter-enum-types.h"
|
||||||
@ -651,35 +650,6 @@ parse_signals (ClutterScript *script,
|
|||||||
return retval;
|
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 *
|
static ClutterTimeline *
|
||||||
construct_timeline (ClutterScript *script,
|
construct_timeline (ClutterScript *script,
|
||||||
JsonObject *object)
|
JsonObject *object)
|
||||||
@ -983,14 +953,6 @@ clutter_script_parser_object_end (JsonParser *json_parser,
|
|||||||
json_object_remove_member (object, "children");
|
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"))
|
if (json_object_has_member (object, "signals"))
|
||||||
{
|
{
|
||||||
val = json_object_get_member (object, "signals");
|
val = json_object_get_member (object, "signals");
|
||||||
@ -1740,46 +1702,6 @@ apply_child_properties (ClutterScript *script,
|
|||||||
oinfo->properties = unresolved;
|
oinfo->properties = unresolved;
|
||||||
}
|
}
|
||||||
|
|
||||||
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
|
static void
|
||||||
add_children (ClutterScript *script,
|
add_children (ClutterScript *script,
|
||||||
ObjectInfo *oinfo)
|
ObjectInfo *oinfo)
|
||||||
@ -1839,9 +1761,6 @@ _clutter_script_check_unresolved (ClutterScript *script,
|
|||||||
if (oinfo->children != NULL && CLUTTER_IS_CONTAINER (oinfo->object))
|
if (oinfo->children != NULL && CLUTTER_IS_CONTAINER (oinfo->object))
|
||||||
add_children (script, oinfo);
|
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
|
/* this is a bit *eugh*, but it allows us to effectively make sure
|
||||||
* that child and layout properties are parsed and applied to the
|
* that child and layout properties are parsed and applied to the
|
||||||
* right child
|
* right child
|
||||||
@ -1885,7 +1804,7 @@ _clutter_script_check_unresolved (ClutterScript *script,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (oinfo->properties || oinfo->children || oinfo->behaviours)
|
if (oinfo->properties || oinfo->children)
|
||||||
oinfo->has_unresolved = TRUE;
|
oinfo->has_unresolved = TRUE;
|
||||||
else
|
else
|
||||||
oinfo->has_unresolved = FALSE;
|
oinfo->has_unresolved = FALSE;
|
||||||
|
@ -58,7 +58,6 @@ typedef struct {
|
|||||||
|
|
||||||
GList *properties;
|
GList *properties;
|
||||||
GList *children;
|
GList *children;
|
||||||
GList *behaviours;
|
|
||||||
GList *signals;
|
GList *signals;
|
||||||
|
|
||||||
GType gtype;
|
GType gtype;
|
||||||
|
@ -308,9 +308,6 @@ object_info_free (gpointer data)
|
|||||||
g_list_foreach (oinfo->children, (GFunc) g_free, NULL);
|
g_list_foreach (oinfo->children, (GFunc) g_free, NULL);
|
||||||
g_list_free (oinfo->children);
|
g_list_free (oinfo->children);
|
||||||
|
|
||||||
g_list_foreach (oinfo->behaviours, (GFunc) g_free, NULL);
|
|
||||||
g_list_free (oinfo->behaviours);
|
|
||||||
|
|
||||||
/* we unref top-level objects and leave the actors alone,
|
/* we unref top-level objects and leave the actors alone,
|
||||||
* unless we are unmerging in which case we have to destroy
|
* unless we are unmerging in which case we have to destroy
|
||||||
* the actor to unparent them
|
* the actor to unparent them
|
||||||
|
Loading…
x
Reference in New Issue
Block a user