[clutter] layout-manager: Add a new animation API



commit 7f6b17bc504ca508554a5e2075af59125682e531
Author: Bastian Winkler <buz netbuz org>
Date:   Thu May 24 15:45:07 2012 +0200

    layout-manager: Add a new animation API
    
    It's similar to to the implicit animation API of ClutterActor and
    compatible to deprecated API of ClutterBoxLayout and
    ClutterTableLayout.
    
    It adds :use-animations, :easing-mode, :easing-duration and
    :easing-delay properties to control animations when allocation of a
    child has changed. Layout manager implementers should call
    
    use_animations = clutter_layout_manager_get_easing_state (manager,
                                                              &mode,
                                                              &duration,
                                                              &delay);
    
    from the allocate() virtual function to access these values.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=676827

 clutter/clutter-layout-manager.c           |  406 +++++++++++++++++++++++++++-
 clutter/clutter-layout-manager.h           |   27 ++
 clutter/clutter.symbols                    |    9 +
 doc/reference/clutter/clutter-sections.txt |    9 +
 4 files changed, 449 insertions(+), 2 deletions(-)
---
diff --git a/clutter/clutter-layout-manager.c b/clutter/clutter-layout-manager.c
index 39da12c..19b1daf 100644
--- a/clutter/clutter-layout-manager.c
+++ b/clutter/clutter-layout-manager.c
@@ -332,6 +332,7 @@
 #include "deprecated/clutter-alpha.h"
 
 #include "clutter-debug.h"
+#include "clutter-enum-types.h"
 #include "clutter-layout-manager.h"
 #include "clutter-layout-meta.h"
 #include "clutter-marshal.h"
@@ -347,11 +348,28 @@
 
 struct _ClutterLayoutManagerPrivate
 {
-  gpointer dummy;
+  ClutterAnimationMode easing_mode;
+  guint easing_duration;
+  guint easing_delay;
+  guint use_animations : 1;
 };
 
 enum
 {
+  PROP_0,
+
+  PROP_USE_ANIMATIONS,
+  PROP_EASING_MODE,
+  PROP_EASING_DURATION,
+  PROP_EASING_DELAY,
+
+  PROP_LAST
+};
+
+static GParamSpec *layout_props[PROP_LAST];
+
+enum
+{
   LAYOUT_CHANGED,
 
   LAST_SIGNAL
@@ -583,8 +601,76 @@ layout_manager_real_end_animation (ClutterLayoutManager *manager)
 }
 
 static void
+layout_manager_set_property (GObject      *gobject,
+                             guint         prop_id,
+                             const GValue *value,
+                             GParamSpec   *pspec)
+{
+  ClutterLayoutManager *self = CLUTTER_LAYOUT_MANAGER (gobject);
+
+  switch (prop_id)
+    {
+    case PROP_USE_ANIMATIONS:
+      clutter_layout_manager_set_use_animations (self,
+                                                 g_value_get_boolean (value));
+      break;
+
+    case PROP_EASING_MODE:
+      clutter_layout_manager_set_easing_mode (self, g_value_get_enum (value));
+      break;
+
+    case PROP_EASING_DURATION:
+      clutter_layout_manager_set_easing_duration (self,
+                                                  g_value_get_uint (value));
+      break;
+
+    case PROP_EASING_DELAY:
+      clutter_layout_manager_set_easing_delay (self, g_value_get_uint (value));
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
+      break;
+    }
+}
+
+static void
+layout_manager_get_property (GObject    *gobject,
+                             guint       prop_id,
+                             GValue     *value,
+                             GParamSpec *pspec)
+{
+  ClutterLayoutManagerPrivate *priv = CLUTTER_LAYOUT_MANAGER (gobject)->priv;
+
+  switch (prop_id)
+    {
+    case PROP_USE_ANIMATIONS:
+      g_value_set_boolean (value, priv->use_animations);
+      break;
+
+    case PROP_EASING_MODE:
+      g_value_set_enum (value, priv->easing_mode);
+      break;
+
+    case PROP_EASING_DURATION:
+      g_value_set_uint (value, priv->easing_duration);
+      break;
+
+    case PROP_EASING_DELAY:
+      g_value_set_uint (value, priv->easing_delay);
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
+      break;
+    }
+}
+
+static void
 clutter_layout_manager_class_init (ClutterLayoutManagerClass *klass)
 {
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
   quark_layout_meta =
     g_quark_from_static_string ("clutter-layout-manager-child-meta");
   quark_layout_alpha =
@@ -592,6 +678,9 @@ clutter_layout_manager_class_init (ClutterLayoutManagerClass *klass)
 
   g_type_class_add_private (klass, sizeof (ClutterLayoutManagerPrivate));
 
+  object_class->set_property = layout_manager_set_property;
+  object_class->get_property = layout_manager_get_property;
+
   klass->get_preferred_width = layout_manager_real_get_preferred_width;
   klass->get_preferred_height = layout_manager_real_get_preferred_height;
   klass->allocate = layout_manager_real_allocate;
@@ -603,6 +692,80 @@ clutter_layout_manager_class_init (ClutterLayoutManagerClass *klass)
   klass->set_container = layout_manager_real_set_container;
 
   /**
+   * ClutterLayoutManager:use-animations:
+   *
+   * Whether the #ClutterLayoutManager should animate changes in the
+   * layout, overriding the easing state of the children.
+   *
+   * Since: 1.12
+   */
+  layout_props[PROP_USE_ANIMATIONS] =
+    g_param_spec_boolean ("use-animations",
+                          P_("Use Animations"),
+                          P_("Whether layout changes should be animated"),
+                          FALSE,
+                          CLUTTER_PARAM_READWRITE);
+
+  /**
+   * ClutterLayoutManager:easing-mode:
+   *
+   * The easing mode for the animations, in case
+   * #ClutterLayoutManager:use-animations is set to %TRUE.
+   *
+   * The easing mode has the same semantics of #ClutterAnimation:mode: it can
+   * either be a value from the #ClutterAnimationMode enumeration, like
+   * %CLUTTER_EASE_OUT_CUBIC, or a logical id as returned by
+   * clutter_alpha_register_func().
+   *
+   * The default value is %CLUTTER_EASE_OUT_CUBIC.
+   *
+   * Since: 1.12
+   */
+  layout_props[PROP_EASING_MODE] =
+    g_param_spec_enum ("easing-mode",
+                       P_("Easing Mode"),
+                       P_("The easing mode of the animations"),
+                       CLUTTER_TYPE_ANIMATION_MODE,
+                       CLUTTER_EASE_OUT_CUBIC,
+                       CLUTTER_PARAM_READWRITE);
+
+  /**
+   * ClutterLayoutManager:easing-duration:
+   *
+   * The duration of the animations, in case
+   * #ClutterLayoutManager:use-animations is set to %TRUE.
+   *
+   * The duration is expressed in milliseconds.
+   *
+   * Since: 1.12
+   */
+  layout_props[PROP_EASING_DURATION] =
+    g_param_spec_uint ("easing-duration",
+                       P_("Easing Duration"),
+                       P_("The duration of the animations"),
+                       0, G_MAXUINT, 250,
+                       CLUTTER_PARAM_READWRITE);
+
+  /**
+   * ClutterLayoutManager:easing-delay:
+   *
+   * The delay befor the animations will start,
+   * #ClutterLayoutManager:use-animations is set to %TRUE.
+   *
+   * The duration is expressed in milliseconds.
+   *
+   * Since: 1.12
+   */
+  layout_props[PROP_EASING_DELAY] =
+    g_param_spec_uint ("easing-delay",
+                       P_("Easing Delay"),
+                       P_("The delay befor the animations start"),
+                       0, G_MAXUINT, 0,
+                       CLUTTER_PARAM_READWRITE);
+
+  g_object_class_install_properties (object_class, PROP_LAST, layout_props);
+
+  /**
    * ClutterLayoutManager::layout-changed:
    * @manager: the #ClutterLayoutManager that emitted the signal
    *
@@ -645,9 +808,16 @@ clutter_layout_manager_class_init (ClutterLayoutManagerClass *klass)
 static void
 clutter_layout_manager_init (ClutterLayoutManager *manager)
 {
-  manager->priv =
+  ClutterLayoutManagerPrivate *priv;
+
+  manager->priv = priv =
     G_TYPE_INSTANCE_GET_PRIVATE (manager, CLUTTER_TYPE_LAYOUT_MANAGER,
                                  ClutterLayoutManagerPrivate);
+
+  priv->use_animations = FALSE;
+  priv->easing_mode = CLUTTER_EASE_OUT_CUBIC;
+  priv->easing_duration = 250;
+  priv->easing_delay = 0;
 }
 
 /**
@@ -1388,3 +1558,235 @@ clutter_layout_manager_get_animation_progress (ClutterLayoutManager *manager)
 
   return klass->get_animation_progress (manager);
 }
+
+/**
+ * clutter_layout_manager_set_use_animations:
+ * @manager: a #ClutterLayoutManager
+ * @animate: %TRUE if the layout should use animations
+ *
+ * Sets whether @manager should animate changes in the layout properties
+ *
+ * The duration and delay of the animations are controlled by
+ * clutter_layout_manager_set_easing_duration() and
+ * clutter_layout_manager_set_easing_delay(); the easing mode to be used
+ * by the animations is controlled by clutter_layout_manager_set_easing_mode()
+ *
+ * Since: 1.12
+ */
+void
+clutter_layout_manager_set_use_animations (ClutterLayoutManager *manager,
+                                           gboolean              animate)
+{
+  ClutterLayoutManagerPrivate *priv;
+
+  g_return_if_fail (CLUTTER_IS_LAYOUT_MANAGER (manager));
+
+  priv = manager->priv;
+
+  if (priv->use_animations == animate)
+    return;
+
+  priv->use_animations = animate;
+
+  g_object_notify_by_pspec (G_OBJECT (manager),
+                            layout_props[PROP_USE_ANIMATIONS]);
+}
+
+/**
+ * clutter_layout_manager_get_use_animations:
+ * @manager: a #ClutterLayoutManager
+ *
+ * Retrieves whether @manager should animate changes in the layout properties.
+
+ * Return value: %TRUE if the animations should be used, %FALSE otherwise
+ *
+ * Since: 1.12
+ */
+gboolean
+clutter_layout_manager_get_use_animations (ClutterLayoutManager *manager)
+{
+  g_return_val_if_fail (CLUTTER_IS_LAYOUT_MANAGER (manager), FALSE);
+
+  return manager->priv->use_animations;
+}
+
+/**
+ * clutter_layout_manager_set_easing_mode:
+ * @manager: a #ClutterLayoutManager
+ * @mode: an easing mode, either from #ClutterAnimationMode or a logical id
+ *   from clutter_alpha_register_func()
+
+ * Sets the easing mode to be used by @manager when animating changes in layout
+ * properties.
+ *
+ * Since: 1.12
+ */
+void
+clutter_layout_manager_set_easing_mode (ClutterLayoutManager *manager,
+                                        ClutterAnimationMode  mode)
+{
+  ClutterLayoutManagerPrivate *priv;
+
+  g_return_if_fail (CLUTTER_IS_LAYOUT_MANAGER (manager));
+  g_return_if_fail (mode < CLUTTER_ANIMATION_LAST);
+  g_return_if_fail (mode != CLUTTER_CUSTOM_MODE);
+
+  priv = manager->priv;
+
+  if (priv->easing_mode == mode)
+    return;
+
+  priv->easing_mode = mode;
+
+  g_object_notify_by_pspec (G_OBJECT (manager), layout_props[PROP_EASING_MODE]);
+}
+
+/**
+ * clutter_layout_manager_get_easing_mode:
+ * @manager: a #ClutterLayoutManager
+ *
+ * Retrieves the easing mode set using clutter_layout_manager_set_easing_mode()
+ *
+ * Return value: an easing mode
+ *
+ * Since: 1.12
+ */
+ClutterAnimationMode
+clutter_layout_manager_get_easing_mode (ClutterLayoutManager *manager)
+{
+  g_return_val_if_fail (CLUTTER_IS_LAYOUT_MANAGER (manager), CLUTTER_LINEAR);
+
+  return manager->priv->easing_mode;
+}
+
+
+/**
+ * clutter_layout_manager_set_easing_duration:
+ * @manager: a #ClutterLayoutManager
+ * @duration: the duration of the animations, in milliseconds
+ *
+ * Sets the duration of the animations used by @manager when animating changes
+ * in the layout properties.
+ *
+ * Since: 1.12
+ */
+void
+clutter_layout_manager_set_easing_duration (ClutterLayoutManager *manager,
+                                            guint                 duration)
+{
+  ClutterLayoutManagerPrivate *priv;
+
+  g_return_if_fail (CLUTTER_IS_LAYOUT_MANAGER (manager));
+
+  priv = manager->priv;
+
+  if (priv->easing_duration == duration)
+    return;
+
+  priv->easing_duration = duration;
+
+  g_object_notify_by_pspec (G_OBJECT (manager),
+                            layout_props[PROP_EASING_DURATION]);
+}
+
+/**
+ * clutter_layout_manager_get_easing_duration:
+ * @manager: a #ClutterLayoutManager
+ *
+ * Retrieves the duration set using clutter_layout_manager_set_easing_duration()
+ *
+ * Return value: the duration of the animations, in milliseconds
+ *
+ * Since: 1.12
+ */
+guint
+clutter_layout_manager_get_easing_duration (ClutterLayoutManager *manager)
+{
+  g_return_val_if_fail (CLUTTER_IS_LAYOUT_MANAGER (manager), 0);
+
+  return manager->priv->easing_duration;
+}
+
+/**
+ * clutter_layout_manager_set_easing_delay:
+ * @manager: a #ClutterLayoutManager
+ * @delay: the delay in milliseconds
+ *
+ * Sets the delay before the animations used by @manager will start.
+ *
+ * Since: 1.12
+ */
+void
+clutter_layout_manager_set_easing_delay (ClutterLayoutManager *manager,
+                                         guint                 delay)
+{
+  ClutterLayoutManagerPrivate *priv;
+
+  g_return_if_fail (CLUTTER_IS_LAYOUT_MANAGER (manager));
+
+  priv = manager->priv;
+
+  if (priv->easing_delay == delay)
+    return;
+
+  priv->easing_delay = delay;
+
+  g_object_notify_by_pspec (G_OBJECT (manager),
+                            layout_props[PROP_EASING_DELAY]);
+}
+
+/**
+ * clutter_layout_manager_get_easing_delay:
+ * @manager: a #ClutterLayoutManager
+ *
+ * Retrieves the delay set using clutter_layout_manager_set_easing_delay()
+
+ * Return value: the delay in milliseconds
+ *
+ * Since: 1.12
+ */
+guint
+clutter_layout_manager_get_easing_delay (ClutterLayoutManager *manager)
+{
+  g_return_val_if_fail (CLUTTER_IS_LAYOUT_MANAGER (manager), 0);
+
+  return manager->priv->easing_delay;
+}
+
+/**
+ * clutter_layout_manager_get_easing_state:
+ * @manager: a #ClutterLayoutManager
+ * @mode: (out): the #ClutterAnimationMode
+ * @duration: (out): the easing duration
+ * @delay: (out): the easing delay
+ *
+ * Retrieves all the necessary information if and how the @manager should
+ * animate allocation changes. This function is meant to be called by
+ * implementations of the #ClutterLayoutManager class in the
+ * #ClutterLayoutManagerClass.allocate() virtual function.
+ *
+ * Return value: %TRUE if the @manager should animate allocation changes
+ *
+ * Since: 1.12
+ */
+gboolean
+clutter_layout_manager_get_easing_state (ClutterLayoutManager *manager,
+                                         ClutterAnimationMode *mode,
+                                         guint                *duration,
+                                         guint                *delay)
+{
+  ClutterLayoutManagerPrivate *priv;
+
+  g_return_val_if_fail (CLUTTER_IS_LAYOUT_MANAGER (manager), FALSE);
+
+  priv = manager->priv;
+
+  if (mode)
+    *mode = priv->easing_mode;
+  if (duration)
+    *duration = priv->easing_duration;
+  if (delay)
+    *delay = priv->easing_delay;
+
+  return priv->use_animations;
+}
diff --git a/clutter/clutter-layout-manager.h b/clutter/clutter-layout-manager.h
index d19d563..b034b40 100644
--- a/clutter/clutter-layout-manager.h
+++ b/clutter/clutter-layout-manager.h
@@ -210,6 +210,33 @@ void               clutter_layout_manager_end_animation         (ClutterLayoutMa
 CLUTTER_DEPRECATED_IN_1_12
 gdouble            clutter_layout_manager_get_animation_progress (ClutterLayoutManager   *manager);
 
+CLUTTER_AVAILABLE_IN_1_12
+void               clutter_layout_manager_set_use_animations    (ClutterLayoutManager   *manager,
+                                                                 gboolean                animate);
+CLUTTER_AVAILABLE_IN_1_12
+gboolean           clutter_layout_manager_get_use_animations    (ClutterLayoutManager   *manager);
+CLUTTER_AVAILABLE_IN_1_12
+void               clutter_layout_manager_set_easing_mode       (ClutterLayoutManager   *manager,
+                                                                 ClutterAnimationMode    mode);
+CLUTTER_AVAILABLE_IN_1_12
+ClutterAnimationMode clutter_layout_manager_get_easing_mode     (ClutterLayoutManager   *manager);
+
+CLUTTER_AVAILABLE_IN_1_12
+void               clutter_layout_manager_set_easing_duration   (ClutterLayoutManager   *manager,
+                                                                 guint                   duration);
+CLUTTER_AVAILABLE_IN_1_12
+guint              clutter_layout_manager_get_easing_duration   (ClutterLayoutManager   *manager);
+CLUTTER_AVAILABLE_IN_1_12
+void               clutter_layout_manager_set_easing_delay      (ClutterLayoutManager   *manager,
+                                                                 guint                   delay);
+CLUTTER_AVAILABLE_IN_1_12
+guint              clutter_layout_manager_get_easing_delay      (ClutterLayoutManager   *manager);
+CLUTTER_AVAILABLE_IN_1_12
+gboolean           clutter_layout_manager_get_easing_state      (ClutterLayoutManager   *manager,
+                                                                 ClutterAnimationMode   *mode,
+                                                                 guint                  *duration,
+                                                                 guint                  *delay);
+
 G_END_DECLS
 
 #endif /* __CLUTTER_LAYOUT_MANAGER_H__ */
diff --git a/clutter/clutter.symbols b/clutter/clutter.symbols
index ef0477d..0c71a6e 100644
--- a/clutter/clutter.symbols
+++ b/clutter/clutter.symbols
@@ -841,6 +841,15 @@ clutter_layout_manager_get_type
 clutter_layout_manager_layout_changed
 clutter_layout_manager_list_child_properties
 clutter_layout_manager_set_container
+clutter_layout_manager_set_use_animations
+clutter_layout_manager_get_use_animations
+clutter_layout_manager_set_easing_mode
+clutter_layout_manager_get_easing_mode
+clutter_layout_manager_set_easing_duration
+clutter_layout_manager_get_easing_duration
+clutter_layout_manager_set_easing_delay
+clutter_layout_manager_get_easing_delay
+clutter_layout_manager_get_easing_state
 clutter_list_model_get_type
 clutter_list_model_iter_get_type
 clutter_list_model_new
diff --git a/doc/reference/clutter/clutter-sections.txt b/doc/reference/clutter/clutter-sections.txt
index 78918dd..1a3abae 100644
--- a/doc/reference/clutter/clutter-sections.txt
+++ b/doc/reference/clutter/clutter-sections.txt
@@ -2139,6 +2139,15 @@ clutter_layout_manager_find_child_property
 clutter_layout_manager_list_child_properties
 
 <SUBSECTION>
+clutter_layout_manager_set_use_animations
+clutter_layout_manager_get_use_animations
+clutter_layout_manager_set_easing_mode
+clutter_layout_manager_get_easing_mode
+clutter_layout_manager_set_easing_duration
+clutter_layout_manager_get_easing_duration
+clutter_layout_manager_set_easing_delay
+clutter_layout_manager_get_easing_delay
+clutter_layout_manager_get_easing_state
 clutter_layout_manager_begin_animation
 clutter_layout_manager_end_animation
 clutter_layout_manager_get_animation_progress



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]