mirror of
https://github.com/brl/mutter.git
synced 2025-01-23 18:09:10 +00:00
alpha: Allow setting the function in ClutterScript
When defining an Alpha in ClutterScript we should allow setting the alpha function by using a custom property. This makes it possible to have both: { "id" : "behaviour-1", "type" : "ClutterBehaviourDepth", "alpha" : { "timeline" : "timeline-1", "function" : "alpha_func" }, ... } And: { "id" : "alpha-1", "type" : "ClutterAlpha", "timeline" : "timeline-1", "function" : "alpha_func" }, { "id" : "behaviour-1", "type" : "ClutterBehaviourDepth", "alpha" : "alpha-1", ... } The latter allows defining a single alpha function for multiple behaviours.
This commit is contained in:
parent
50aec3c540
commit
f0ed71c77d
@ -64,6 +64,31 @@
|
|||||||
* <graphic fileref="easing-modes.png" format="PNG"/>
|
* <graphic fileref="easing-modes.png" format="PNG"/>
|
||||||
* </figure>
|
* </figure>
|
||||||
*
|
*
|
||||||
|
* <refsect2 id="ClutterAlpha-script">
|
||||||
|
* <title>ClutterAlpha custom properties for #ClutterScript</title>
|
||||||
|
* <para>#ClutterAlpha defines a custom "function" property for
|
||||||
|
* #ClutterScript which allows to reference a custom alpha function
|
||||||
|
* available in the source code. Setting the "function" property
|
||||||
|
* is equivalent to calling clutter_alpha_set_func() with the
|
||||||
|
* specified function name. No user data or #GDestroyNotify is
|
||||||
|
* available to be passed.</para>
|
||||||
|
* <example id="ClutterAlpha-script-example">
|
||||||
|
* <title>Defining a ClutterAlpha in ClutterScript</title>
|
||||||
|
* <para>The following JSON fragment defines a #ClutterAlpha
|
||||||
|
* using a #ClutterTimeline with id "timeline-01" and an alpha
|
||||||
|
* function called my_sine_alpha(). The defined #ClutterAlpha
|
||||||
|
* instance can be reused in multiple #ClutterBehaviour
|
||||||
|
* definitions.</para>
|
||||||
|
* <programlisting>
|
||||||
|
* {
|
||||||
|
* "id" : "sine-alpha",
|
||||||
|
* "timeline" : "timeline-01",
|
||||||
|
* "function" : "my_sine_alpha"
|
||||||
|
* }
|
||||||
|
* </programlisting>
|
||||||
|
* </informalexample>
|
||||||
|
* </refsect2>
|
||||||
|
*
|
||||||
* Since: 0.2
|
* Since: 0.2
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -73,15 +98,23 @@
|
|||||||
|
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
|
#include <gmodule.h>
|
||||||
|
|
||||||
#include "clutter-alpha.h"
|
#include "clutter-alpha.h"
|
||||||
#include "clutter-debug.h"
|
#include "clutter-debug.h"
|
||||||
#include "clutter-enum-types.h"
|
#include "clutter-enum-types.h"
|
||||||
#include "clutter-main.h"
|
#include "clutter-main.h"
|
||||||
#include "clutter-marshal.h"
|
#include "clutter-marshal.h"
|
||||||
#include "clutter-private.h"
|
#include "clutter-private.h"
|
||||||
|
#include "clutter-scriptable.h"
|
||||||
|
|
||||||
G_DEFINE_TYPE (ClutterAlpha, clutter_alpha, G_TYPE_INITIALLY_UNOWNED);
|
static void clutter_scriptable_iface_init (ClutterScriptableIface *iface);
|
||||||
|
|
||||||
|
G_DEFINE_TYPE_WITH_CODE (ClutterAlpha,
|
||||||
|
clutter_alpha,
|
||||||
|
G_TYPE_INITIALLY_UNOWNED,
|
||||||
|
G_IMPLEMENT_INTERFACE (CLUTTER_TYPE_SCRIPTABLE,
|
||||||
|
clutter_scriptable_iface_init));
|
||||||
|
|
||||||
struct _ClutterAlphaPrivate
|
struct _ClutterAlphaPrivate
|
||||||
{
|
{
|
||||||
@ -197,6 +230,73 @@ clutter_alpha_dispose (GObject *object)
|
|||||||
G_OBJECT_CLASS (clutter_alpha_parent_class)->dispose (object);
|
G_OBJECT_CLASS (clutter_alpha_parent_class)->dispose (object);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static ClutterAlphaFunc
|
||||||
|
resolve_alpha_func (const gchar *name)
|
||||||
|
{
|
||||||
|
static GModule *module = NULL;
|
||||||
|
ClutterAlphaFunc func;
|
||||||
|
|
||||||
|
CLUTTER_NOTE (SCRIPT, "Looking up '%s' alpha function", name);
|
||||||
|
|
||||||
|
if (G_UNLIKELY (module == NULL))
|
||||||
|
module = g_module_open (NULL, G_MODULE_BIND_LAZY);
|
||||||
|
|
||||||
|
if (g_module_symbol (module, name, (gpointer) &func))
|
||||||
|
{
|
||||||
|
CLUTTER_NOTE (SCRIPT, "Found '%s' alpha function in the symbols table",
|
||||||
|
name);
|
||||||
|
return func;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
clutter_alpha_set_custom_property (ClutterScriptable *scriptable,
|
||||||
|
ClutterScript *script,
|
||||||
|
const gchar *name,
|
||||||
|
const GValue *value)
|
||||||
|
{
|
||||||
|
if (strncmp (name, "function", 8) == 0)
|
||||||
|
{
|
||||||
|
g_assert (G_VALUE_HOLDS (value, G_TYPE_POINTER));
|
||||||
|
if (g_value_get_pointer (value) != NULL)
|
||||||
|
{
|
||||||
|
clutter_alpha_set_func (CLUTTER_ALPHA (scriptable),
|
||||||
|
g_value_get_pointer (value),
|
||||||
|
NULL, NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
g_object_set_property (G_OBJECT (scriptable), name, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
clutter_alpha_parse_custom_node (ClutterScriptable *scriptable,
|
||||||
|
ClutterScript *script,
|
||||||
|
GValue *value,
|
||||||
|
const gchar *name,
|
||||||
|
JsonNode *node)
|
||||||
|
{
|
||||||
|
if (strncmp (name, "function", 8) == 0)
|
||||||
|
{
|
||||||
|
const gchar *func_name = json_node_get_string (node);
|
||||||
|
|
||||||
|
g_value_init (value, G_TYPE_POINTER);
|
||||||
|
g_value_set_pointer (value, resolve_alpha_func (func_name));
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
clutter_scriptable_iface_init (ClutterScriptableIface *iface)
|
||||||
|
{
|
||||||
|
iface->parse_custom_node = clutter_alpha_parse_custom_node;
|
||||||
|
iface->set_custom_property = clutter_alpha_set_custom_property;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
clutter_alpha_class_init (ClutterAlphaClass *klass)
|
clutter_alpha_class_init (ClutterAlphaClass *klass)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user