script: Use a node when resolving an animation mode
authorEmmanuele Bassi <ebassi@linux.intel.com>
Mon, 8 Feb 2010 15:45:43 +0000 (15:45 +0000)
committerEmmanuele Bassi <ebassi@linux.intel.com>
Mon, 8 Feb 2010 15:45:43 +0000 (15:45 +0000)
Instead of taking a string and duplicating the "is it a string or an
integer" check in both Alpha and Animation, the function in
ClutterScript that resolves the animation mode values should take a
JsonNode and do all the checks it needs.

clutter/clutter-alpha.c
clutter/clutter-animation.c
clutter/clutter-script-parser.c
clutter/clutter-script-private.h

index 0a144c4..9a41de6 100644 (file)
@@ -302,25 +302,14 @@ clutter_alpha_parse_custom_node (ClutterScriptable *scriptable,
    */
   if (strncmp (name, "mode", 4) == 0)
     {
-      if (JSON_NODE_TYPE (node) != JSON_NODE_VALUE)
-        return FALSE;
+      gulong mode;
 
-      g_value_init (value, G_TYPE_ULONG);
+      mode = clutter_script_resolve_animation_mode (node);
 
-      if (json_node_get_value_type (node) == G_TYPE_INT64)
-        {
-          g_value_set_ulong (value, json_node_get_int (node));
-          return TRUE;
-        }
-      else if (json_node_get_value_type (node) == G_TYPE_STRING)
-        {
-          const gchar *str = json_node_get_string (node);
-          gulong mode;
+      g_value_init (value, G_TYPE_ULONG);
+      g_value_set_ulong (value, mode);
 
-          mode = clutter_script_resolve_animation_mode (str);
-          g_value_set_ulong (value, mode);
-          return TRUE;
-        }
+      return TRUE;
     }
 
   return FALSE;
index 7139e77..40590ac 100644 (file)
@@ -403,29 +403,14 @@ clutter_animation_parse_custom_node (ClutterScriptable *scriptable,
 {
   if (strncmp (name, "mode", 4) == 0)
     {
-      if (json_node_get_node_type (node) != JSON_NODE_VALUE)
-        return FALSE;
+      gulong mode;
 
-      g_value_init (value, G_TYPE_ULONG);
-
-      if (json_node_get_value_type (node) == G_TYPE_INT64)
-        {
-          g_value_set_ulong (value, json_node_get_int (node));
-          return TRUE;
-        }
-      else if (json_node_get_value_type (node) == G_TYPE_STRING)
-        {
-          const gchar *str = json_node_get_string (node);
-          gulong mode = CLUTTER_LINEAR;
+      mode = clutter_script_resolve_animation_mode (node);
 
-          mode = clutter_script_resolve_animation_mode (str);
-          g_value_set_ulong (value, mode);
+      g_value_init (value, G_TYPE_ULONG);
+      g_value_set_ulong (value, mode);
 
-          return TRUE;
-        }
-      else
-        g_warning ("Expected an integer id or a string id for "
-                   "the ClutterAnimation mode property");
+      return TRUE;
     }
 
   return FALSE;
index a33702c..37585fe 100644 (file)
@@ -769,26 +769,39 @@ static const struct
 static const gint n_animation_modes = G_N_ELEMENTS (animation_modes);
 
 gulong
-clutter_script_resolve_animation_mode (const gchar *name)
+clutter_script_resolve_animation_mode (JsonNode *node)
 {
-  gint i, res = 0;
+  gint i, res = CLUTTER_CUSTOM_MODE;
 
-  /* XXX - we might be able to optimize by changing the ordering
-   * of the animation_modes array, e.g.
-   *  - special casing linear
-   *  - tokenizing ('ease', 'In', 'Sine') and matching on token
-   *  - binary searching?
-   */
-  for (i = 0; i < n_animation_modes; i++)
+  if (JSON_NODE_TYPE (node) != JSON_NODE_VALUE)
+    return CLUTTER_CUSTOM_MODE;
+
+  if (json_node_get_value_type (node) == G_TYPE_INT64)
+    return json_node_get_int (node);
+
+  if (json_node_get_value_type (node) == G_TYPE_STRING)
     {
-      if (strcmp (animation_modes[i].name, name) == 0)
-        return animation_modes[i].mode;
-    }
+      const gchar *name = json_node_get_string (node);
+
+      /* XXX - we might be able to optimize by changing the ordering
+       * of the animation_modes array, e.g.
+       *  - special casing linear
+       *  - tokenizing ('ease', 'In', 'Sine') and matching on token
+       *  - binary searching?
+       */
+      for (i = 0; i < n_animation_modes; i++)
+        {
+          if (strcmp (animation_modes[i].name, name) == 0)
+            return animation_modes[i].mode;
+        }
 
-  if (clutter_script_enum_from_string (CLUTTER_TYPE_ANIMATION_MODE, name, &res))
-    return res;
+      if (clutter_script_enum_from_string (CLUTTER_TYPE_ANIMATION_MODE,
+                                           name,
+                                           &res))
+        return res;
 
-  g_warning ("Unable to find the animation mode '%s'", name);
+      g_warning ("Unable to find the animation mode '%s'", name);
+    }
 
   return CLUTTER_CUSTOM_MODE;
 }
@@ -850,8 +863,8 @@ _clutter_script_parse_alpha (ClutterScript *script,
     }
 
   val = json_object_get_member (object, "mode");
-  if (val && json_node_get_string (val) != NULL)
-    mode = clutter_script_resolve_animation_mode (json_node_get_string (val));
+  if (val)
+    mode = clutter_script_resolve_animation_mode (val);
 
   if (mode == CLUTTER_CUSTOM_MODE)
     {
index 601a93b..3dc7378 100644 (file)
@@ -103,7 +103,7 @@ gboolean clutter_script_parse_node        (ClutterScript *script,
 GType    clutter_script_get_type_from_symbol (const gchar *symbol);
 GType    clutter_script_get_type_from_class  (const gchar *name);
 
-gulong   clutter_script_resolve_animation_mode (const gchar *namer);
+gulong   clutter_script_resolve_animation_mode (JsonNode *node);
 
 gboolean clutter_script_enum_from_string  (GType          gtype,
                                            const gchar   *string,