summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBastian Winkler <buz@netbuz.org>2013-01-18 10:55:59 +0200
committerBastian Winkler <buz@netbuz.org>2013-11-07 17:21:40 +0100
commit0d7d0cebf41a1c69cc61b699f73a1e221c91db16 (patch)
tree09bd4377ab61804559a69dc60b6c37156fda3360
parenta6417b4d4c2c7e4dc590e20ecf7bf442c4136962 (diff)
downloadclutter-0d7d0cebf41a1c69cc61b699f73a1e221c91db16.tar.gz
interval: Implement ClutterScriptable interface
This allows the creation of ClutterTransition objects in ClutterScript: { "id" : "scripted-transition", "type" : "ClutterPropertyTransition", "property-name" : "background-color", "interval" : { "type" : "ClutterInterval", "value-type" : "ClutterColor", "initial" : "red", "final" : "blue" } }
-rw-r--r--clutter/clutter-interval.c50
-rw-r--r--tests/conform/script-parser.c35
-rw-r--r--tests/conform/test-conform-main.c1
-rw-r--r--tests/data/Makefile.am1
-rw-r--r--tests/data/test-script-interval.json16
5 files changed, 102 insertions, 1 deletions
diff --git a/clutter/clutter-interval.c b/clutter/clutter-interval.c
index 601ad0f7e..861a5fe1b 100644
--- a/clutter/clutter-interval.c
+++ b/clutter/clutter-interval.c
@@ -61,6 +61,8 @@
#include "clutter-interval.h"
#include "clutter-private.h"
#include "clutter-units.h"
+#include "clutter-scriptable.h"
+#include "clutter-script-private.h"
#include "deprecated/clutter-fixed.h"
@@ -93,7 +95,14 @@ struct _ClutterIntervalPrivate
GValue *values;
};
-G_DEFINE_TYPE_WITH_PRIVATE (ClutterInterval, clutter_interval, G_TYPE_INITIALLY_UNOWNED)
+static void clutter_scriptable_iface_init (ClutterScriptableIface *iface);
+
+G_DEFINE_TYPE_WITH_CODE (ClutterInterval,
+ clutter_interval,
+ G_TYPE_INITIALLY_UNOWNED,
+ G_ADD_PRIVATE (ClutterInterval)
+ G_IMPLEMENT_INTERFACE (CLUTTER_TYPE_SCRIPTABLE,
+ clutter_scriptable_iface_init));
static gboolean
clutter_interval_real_validate (ClutterInterval *interval,
@@ -479,6 +488,45 @@ clutter_interval_get_property (GObject *gobject,
}
}
+static gboolean
+clutter_interval_parse_custom_node (ClutterScriptable *scriptable,
+ ClutterScript *script,
+ GValue *value,
+ const gchar *name,
+ JsonNode *node)
+{
+ ClutterIntervalPrivate *priv = CLUTTER_INTERVAL (scriptable)->priv;
+
+ if ((strcmp (name, "initial") == 0) || (strcmp (name, "final") == 0))
+ {
+ g_value_init (value, priv->value_type);
+ return _clutter_script_parse_node (script, value, name, node, NULL);
+ }
+
+ return FALSE;
+}
+
+static void
+clutter_interval_set_custom_property (ClutterScriptable *scriptable,
+ ClutterScript *script,
+ const gchar *name,
+ const GValue *value)
+{
+ ClutterInterval *self = CLUTTER_INTERVAL (scriptable);
+
+ if (strcmp (name, "initial") == 0)
+ clutter_interval_set_initial_value (self, value);
+ else if (strcmp (name, "final") == 0)
+ clutter_interval_set_final_value (self, value);
+}
+
+static void
+clutter_scriptable_iface_init (ClutterScriptableIface *iface)
+{
+ iface->parse_custom_node = clutter_interval_parse_custom_node;
+ iface->set_custom_property = clutter_interval_set_custom_property;
+}
+
static void
clutter_interval_class_init (ClutterIntervalClass *klass)
{
diff --git a/tests/conform/script-parser.c b/tests/conform/script-parser.c
index 0b455e180..73ec954a1 100644
--- a/tests/conform/script-parser.c
+++ b/tests/conform/script-parser.c
@@ -442,3 +442,38 @@ script_margin (TestConformSimpleFixture *fixture,
g_object_unref (script);
g_free (test_file);
}
+
+void
+script_interval (TestConformSimpleFixture *fixture,
+ gpointer dummy)
+{
+ ClutterScript *script = clutter_script_new ();
+ ClutterInterval *interval;
+ gchar *test_file;
+ GError *error = NULL;
+ GValue *initial, *final;
+
+ test_file = clutter_test_get_data_file ("test-script-interval.json");
+ clutter_script_load_from_file (script, test_file, &error);
+ if (g_test_verbose () && error)
+ g_print ("Error: %s", error->message);
+
+ g_assert_no_error (error);
+
+ interval = CLUTTER_INTERVAL (clutter_script_get_object (script, "int-1"));
+ initial = clutter_interval_peek_initial_value (interval);
+ g_assert (G_VALUE_HOLDS (initial, G_TYPE_FLOAT));
+ g_assert_cmpfloat (g_value_get_float (initial), ==, 23.3f);
+ final = clutter_interval_peek_final_value (interval);
+ g_assert (G_VALUE_HOLDS (final, G_TYPE_FLOAT));
+ g_assert_cmpfloat (g_value_get_float (final), ==, 42.2f);
+
+ interval = CLUTTER_INTERVAL (clutter_script_get_object (script, "int-2"));
+ initial = clutter_interval_peek_initial_value (interval);
+ g_assert (G_VALUE_HOLDS (initial, CLUTTER_TYPE_COLOR));
+ final = clutter_interval_peek_final_value (interval);
+ g_assert (G_VALUE_HOLDS (final, CLUTTER_TYPE_COLOR));
+
+ g_object_unref (script);
+ g_free (test_file);
+}
diff --git a/tests/conform/test-conform-main.c b/tests/conform/test-conform-main.c
index d05c537d5..1bb185aff 100644
--- a/tests/conform/test-conform-main.c
+++ b/tests/conform/test-conform-main.c
@@ -198,6 +198,7 @@ main (int argc, char **argv)
TEST_CONFORM_SIMPLE ("/script", animator_multi_properties);
TEST_CONFORM_SIMPLE ("/script", state_base);
TEST_CONFORM_SIMPLE ("/script", script_margin);
+ TEST_CONFORM_SIMPLE ("/script", script_interval);
TEST_CONFORM_SKIP (g_test_slow (), "/timeline", timeline_base);
TEST_CONFORM_SIMPLE ("/timeline", timeline_markers_from_script);
diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am
index edbe23cec..4e6878e88 100644
--- a/tests/data/Makefile.am
+++ b/tests/data/Makefile.am
@@ -18,6 +18,7 @@ json_files = \
test-state-1.json \
test-script-timeline-markers.json \
test-script-margin.json \
+ test-script-interval.json \
$(NULL)
EXTRA_DIST += $(json_files)
diff --git a/tests/data/test-script-interval.json b/tests/data/test-script-interval.json
new file mode 100644
index 000000000..35fe5c22c
--- /dev/null
+++ b/tests/data/test-script-interval.json
@@ -0,0 +1,16 @@
+[
+ {
+ "id" : "int-1",
+ "type" : "ClutterInterval",
+ "value-type" : "gfloat",
+ "initial" : 23.3,
+ "final" : 42.2
+ },
+ {
+ "id" : "int-2",
+ "type" : "ClutterInterval",
+ "value-type" : "ClutterColor",
+ "initial" : "red",
+ "final" : "blue"
+ }
+]