animatable: Deprecate and replace animate_property()

The animate_property() method of the Animatable interface is far less
than optimal:

  • it has a direct reference to ClutterAnimation;
  • it has an interval decomposed as two values.

These issues tie the Animatable interface with the Animation object,
even though it's neither necessary nor future-proof.

Let's introduce a new method, interpolate_value(), which does not
reference ClutterAnimation and uses a ClutterInterval to express the
initial and final states.
This commit is contained in:
Emmanuele Bassi 2011-07-15 14:27:26 +01:00
parent 473f3817d4
commit 8b861cea8f
2 changed files with 69 additions and 9 deletions

View File

@ -84,6 +84,9 @@ clutter_animatable_default_init (ClutterAnimatableInterface *iface)
* be applied to the #ClutterAnimatable, and %FALSE otherwise * be applied to the #ClutterAnimatable, and %FALSE otherwise
* *
* Since: 1.0 * Since: 1.0
*
* Deprecated: 1.8: Use clutter_animatable_interpolate_value()
* instead
*/ */
gboolean gboolean
clutter_animatable_animate_property (ClutterAnimatable *animatable, clutter_animatable_animate_property (ClutterAnimatable *animatable,
@ -94,6 +97,7 @@ clutter_animatable_animate_property (ClutterAnimatable *animatable,
gdouble progress, gdouble progress,
GValue *value) GValue *value)
{ {
ClutterAnimatableIface *iface;
gboolean res; gboolean res;
g_return_val_if_fail (CLUTTER_IS_ANIMATABLE (animatable), FALSE); g_return_val_if_fail (CLUTTER_IS_ANIMATABLE (animatable), FALSE);
@ -107,14 +111,26 @@ clutter_animatable_animate_property (ClutterAnimatable *animatable,
G_VALUE_TYPE (value) == G_VALUE_TYPE (final_value), G_VALUE_TYPE (value) == G_VALUE_TYPE (final_value),
FALSE); FALSE);
res = iface = CLUTTER_ANIMATABLE_GET_IFACE (animatable);
CLUTTER_ANIMATABLE_GET_IFACE (animatable)->animate_property (animatable, if (iface->animate_property == NULL)
animation, {
property_name, ClutterInterval *interval;
initial_value,
final_value, interval = clutter_animation_get_interval (animation, property_name);
progress, if (interval == NULL)
value); return FALSE;
res = clutter_animatable_interpolate_value (animatable, property_name,
interval,
progress,
value);
}
else
res = iface->animate_property (animatable, animation,
property_name,
initial_value, final_value,
progress,
value);
return res; return res;
} }
@ -207,3 +223,33 @@ clutter_animatable_set_final_state (ClutterAnimatable *animatable,
else else
g_object_set_property (G_OBJECT (animatable), property_name, value); g_object_set_property (G_OBJECT (animatable), property_name, value);
} }
gboolean
clutter_animatable_interpolate_value (ClutterAnimatable *animatable,
const gchar *property_name,
ClutterInterval *interval,
gdouble progress,
GValue *value)
{
ClutterAnimatableIface *iface;
g_return_val_if_fail (CLUTTER_IS_ANIMATABLE (animatable), FALSE);
g_return_val_if_fail (property_name != NULL, FALSE);
g_return_val_if_fail (CLUTTER_IS_INTERVAL (interval), FALSE);
g_return_val_if_fail (value != NULL, FALSE);
CLUTTER_NOTE (ANIMATION, "Interpolating '%s' (progress: %.3f)",
property_name,
progress);
iface = CLUTTER_ANIMATABLE_GET_IFACE (animatable);
if (iface->interpolate_value != NULL)
{
return iface->interpolate_value (animatable, property_name,
interval,
progress,
value);
}
else
return clutter_interval_compute_value (interval, progress, value);
}

View File

@ -53,13 +53,15 @@ typedef struct _ClutterAnimatableIface ClutterAnimatableIface;
/** /**
* ClutterAnimatableIface: * ClutterAnimatableIface:
* @animate_property: virtual function for custom interpolation of a * @animate_property: virtual function for custom interpolation of a
* property * property. This virtual function is deprecated
* @find_property: virtual function for retrieving the #GParamSpec of * @find_property: virtual function for retrieving the #GParamSpec of
* an animatable property * an animatable property
* @get_initial_state: virtual function for retrieving the initial * @get_initial_state: virtual function for retrieving the initial
* state of an animatable property * state of an animatable property
* @set_final_state: virtual function for setting the state of an * @set_final_state: virtual function for setting the state of an
* animatable property * animatable property
* @interpolate_value: virtual function for interpolating the progress
* of a property
* *
* Base interface for #GObject<!-- -->s that can be animated by a * Base interface for #GObject<!-- -->s that can be animated by a
* a #ClutterAnimation. * a #ClutterAnimation.
@ -87,10 +89,16 @@ struct _ClutterAnimatableIface
void (* set_final_state) (ClutterAnimatable *animatable, void (* set_final_state) (ClutterAnimatable *animatable,
const gchar *property_name, const gchar *property_name,
const GValue *value); const GValue *value);
gboolean (* interpolate_value) (ClutterAnimatable *animatable,
const gchar *property_name,
ClutterInterval *interval,
gdouble progress,
GValue *value);
}; };
GType clutter_animatable_get_type (void) G_GNUC_CONST; GType clutter_animatable_get_type (void) G_GNUC_CONST;
#ifndef CLUTTER_DISABLE_DEPRECATED
gboolean clutter_animatable_animate_property (ClutterAnimatable *animatable, gboolean clutter_animatable_animate_property (ClutterAnimatable *animatable,
ClutterAnimation *animation, ClutterAnimation *animation,
const gchar *property_name, const gchar *property_name,
@ -98,6 +106,7 @@ gboolean clutter_animatable_animate_property (ClutterAnimatable *animatable,
const GValue *final_value, const GValue *final_value,
gdouble progress, gdouble progress,
GValue *value); GValue *value);
#endif /* CLUTTER_DISABLE_DEPRECATED */
GParamSpec *clutter_animatable_find_property (ClutterAnimatable *animatable, GParamSpec *clutter_animatable_find_property (ClutterAnimatable *animatable,
const gchar *property_name); const gchar *property_name);
@ -107,6 +116,11 @@ void clutter_animatable_get_initial_state (ClutterAnimatable *animatable,
void clutter_animatable_set_final_state (ClutterAnimatable *animatable, void clutter_animatable_set_final_state (ClutterAnimatable *animatable,
const gchar *property_name, const gchar *property_name,
const GValue *value); const GValue *value);
gboolean clutter_animatable_interpolate_value (ClutterAnimatable *animatable,
const gchar *property_name,
ClutterInterval *interval,
gdouble progress,
GValue *value);
G_END_DECLS G_END_DECLS