From 6738114bc2102c8db4644a5b1a4a5a27f22d0fb8 Mon Sep 17 00:00:00 2001
From: Emmanuele Bassi <ebassi@openedhand.com>
Date: Thu, 25 Oct 2007 14:42:15 +0000
Subject: [PATCH] 2007-10-25  Emmanuele Bassi  <ebassi@openedhand.com>

	* clutter/clutter-behaviour-path.c: Implement the
	ClutterScriptableIface to parse the custom "knots" property.
---
 ChangeLog                        |  5 ++
 clutter/clutter-behaviour-path.c | 93 +++++++++++++++++++++++++++++---
 2 files changed, 92 insertions(+), 6 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index e55ac6b58..c3a2af5cc 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2007-10-25  Emmanuele Bassi  <ebassi@openedhand.com>
+
+	* clutter/clutter-behaviour-path.c: Implement the
+	ClutterScriptableIface to parse the custom "knots" property.
+
 2007-10-25  Emmanuele Bassi  <ebassi@openedhand.com>
 
 	* clutter/clutter-texture.c (clutter_texture_set_property): Do
diff --git a/clutter/clutter-behaviour-path.c b/clutter/clutter-behaviour-path.c
index be3578367..f2a735c85 100644
--- a/clutter/clutter-behaviour-path.c
+++ b/clutter/clutter-behaviour-path.c
@@ -46,18 +46,24 @@
 
 #include "clutter-actor.h"
 #include "clutter-behaviour.h"
-#include "clutter-marshal.h"
+#include "clutter-behaviour-path.h"
+#include "clutter-debug.h"
 #include "clutter-enum-types.h"
 #include "clutter-main.h"
-#include "clutter-behaviour-path.h"
+#include "clutter-marshal.h"
 #include "clutter-private.h"
-#include "clutter-debug.h"
+#include "clutter-scriptable.h"
+#include "clutter-script-private.h"
 
 #include <math.h>
 
-G_DEFINE_TYPE (ClutterBehaviourPath, 
-               clutter_behaviour_path,
-	       CLUTTER_TYPE_BEHAVIOUR);
+static void clutter_scriptable_iface_init (ClutterScriptableIface *iface);
+
+G_DEFINE_TYPE_WITH_CODE (ClutterBehaviourPath, 
+                         clutter_behaviour_path,
+	                 CLUTTER_TYPE_BEHAVIOUR,
+                         G_IMPLEMENT_INTERFACE (CLUTTER_TYPE_SCRIPTABLE,
+                                                clutter_scriptable_iface_init));
 
 struct _ClutterBehaviourPathPrivate
 {
@@ -329,6 +335,81 @@ clutter_behaviour_path_init (ClutterBehaviourPath *self)
   self->priv = priv = CLUTTER_BEHAVIOUR_PATH_GET_PRIVATE (self);
 }
 
+static void
+clutter_behaviour_path_set_custom_property (ClutterScriptable *scriptable,
+                                            ClutterScript     *script,
+                                            const gchar       *name,
+                                            const GValue      *value)
+{
+  if (strcmp (name, "knots") == 0)
+    {
+      ClutterBehaviourPath *path = CLUTTER_BEHAVIOUR_PATH (scriptable);
+      GSList *knots, *l;
+
+      if (!G_VALUE_HOLDS (value, G_TYPE_POINTER))
+        return;
+
+      knots = g_value_get_pointer (value);
+      for (l = knots; l != NULL; l = l->next)
+        {
+          ClutterKnot *knot = l->data;
+
+          clutter_behaviour_path_append_knot (path, knot);
+          clutter_knot_free (knot);
+        }
+
+      g_slist_free (knots);
+    }
+  else
+    g_object_set_property (G_OBJECT (scriptable), name, value);
+}
+
+static gboolean
+clutter_behaviour_path_parse_custom_node (ClutterScriptable *scriptable,
+                                          ClutterScript     *script,
+                                          GValue            *value,
+                                          const gchar       *name,
+                                          JsonNode          *node)
+{
+  if (strcmp (name, "knots") == 0)
+    {
+      JsonArray *array;
+      guint knots_len, i;
+      GSList *knots = NULL;
+
+      array = json_node_get_array (node);
+      knots_len = json_array_get_length (array);
+      
+      for (i = 0; i < knots_len; i++)
+        {
+          JsonNode *val = json_array_get_element (array, i);
+          ClutterKnot knot = { 0, };
+
+          if (clutter_script_parse_knot (script, val, &knot))
+            {
+              CLUTTER_NOTE (SCRIPT, "parsed knot [ x:%d, y:%d ]",
+                            knot.x, knot.y);
+
+              knots = g_slist_prepend (knots, clutter_knot_copy (&knot));
+            }
+        }
+
+      g_value_init (value, G_TYPE_POINTER);
+      g_value_set_pointer (value, knots);
+
+      return TRUE;
+    }
+
+  return FALSE;
+}
+
+static void
+clutter_scriptable_iface_init (ClutterScriptableIface *iface)
+{
+  iface->parse_custom_node = clutter_behaviour_path_parse_custom_node;
+  iface->set_custom_property = clutter_behaviour_path_set_custom_property;
+}
+
 /**
  * clutter_behaviour_path_new:
  * @alpha: a #ClutterAlpha, or %NULL