[gedit] Add a GeditAnimatable and use it.



commit beeeef9dc4d3a4941ff233e467a76823fa79c07e
Author: Ignacio Casal Quinteiro <icq gnome org>
Date:   Thu Feb 17 23:57:07 2011 +0100

    Add a GeditAnimatable and use it.
    
    Now the GeditTheatricsAnimatedWidget is named as GeditFloatingSlider
    and it implements the GeditAnimatable. This makes the code more
    understandable and easier to extend.

 gedit/Makefile.am                                 |    4 +
 gedit/gedit-animatable.c                          |  104 +++++
 gedit/gedit-animatable.h                          |   57 +++
 gedit/gedit-animated-overlay.c                    |  186 +++------
 gedit/gedit-animated-overlay.h                    |   12 +-
 gedit/gedit-floating-slider.c                     |  326 ++++++++++++++
 gedit/gedit-floating-slider.h                     |   65 +++
 gedit/gedit-view-frame.c                          |  104 +++---
 gedit/theatrics/Makefile.am                       |    2 -
 gedit/theatrics/gedit-theatrics-animated-widget.c |  469 ---------------------
 gedit/theatrics/gedit-theatrics-animated-widget.h |  101 -----
 11 files changed, 676 insertions(+), 754 deletions(-)
---
diff --git a/gedit/Makefile.am b/gedit/Makefile.am
index 7bc75c6..51dac0a 100644
--- a/gedit/Makefile.am
+++ b/gedit/Makefile.am
@@ -101,6 +101,7 @@ BUILT_SOURCES = 			\
 	gedit-marshal.h
 
 NOINST_H_FILES =			\
+	gedit-animatable.h		\|
 	gedit-animated-overlay.h	\
 	gedit-close-button.h		\
 	gedit-command-line.h		\
@@ -112,6 +113,7 @@ NOINST_H_FILES =			\
 	gedit-document-saver.h		\
 	gedit-documents-panel.h		\
 	gedit-file-chooser-dialog.h	\
+	gedit-floating-slider.h		\
 	gedit-history-entry.h		\
 	gedit-io-error-info-bar.h	\
 	gedit-language-manager.h	\
@@ -169,6 +171,7 @@ libgedit_private_la_SOURCES =		\
 	gedit-window-activatable.c
 
 libgedit_c_files =			\
+	gedit-animatable.c		\
 	gedit-animated-overlay.c	\
 	gedit-app.c			\
 	gedit-close-button.c		\
@@ -192,6 +195,7 @@ libgedit_c_files =			\
 	gedit-encodings.c		\
 	gedit-encodings-combo-box.c	\
 	gedit-file-chooser-dialog.c	\
+	gedit-floating-slider.c		\
 	gedit-history-entry.c		\
 	gedit-io-error-info-bar.c	\
 	gedit-language-manager.c	\
diff --git a/gedit/gedit-animatable.c b/gedit/gedit-animatable.c
new file mode 100644
index 0000000..9a1c943
--- /dev/null
+++ b/gedit/gedit-animatable.c
@@ -0,0 +1,104 @@
+/*
+ * gedit-animatable.c
+ * This file is part of gedit
+ *
+ * Copyright (C) 2011 - Ignacio Casal Quinteiro
+ *
+ * gedit is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * gedit is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+#include "gedit-animatable.h"
+#include "gedit-overlay-child.h"
+#include "theatrics/gedit-theatrics-choreographer.h"
+#include "theatrics/gedit-theatrics-enum-types.h"
+
+G_DEFINE_INTERFACE(GeditAnimatable, gedit_animatable, GEDIT_TYPE_OVERLAY_CHILD)
+
+void
+gedit_animatable_default_init (GeditAnimatableInterface *iface)
+{
+	static gboolean initialized = FALSE;
+
+	if (!initialized)
+	{
+		g_object_interface_install_property (iface,
+		                                     g_param_spec_enum ("easing",
+		                                                        "Easing",
+		                                                        "The Easing",
+		                                                        GEDIT_TYPE_THEATRICS_CHOREOGRAPHER_EASING,
+		                                                        GEDIT_THEATRICS_CHOREOGRAPHER_EASING_LINEAR,
+		                                                        G_PARAM_READWRITE |
+		                                                        G_PARAM_CONSTRUCT |
+		                                                        G_PARAM_STATIC_STRINGS));
+
+		g_object_interface_install_property (iface,
+		                                     g_param_spec_enum ("blocking",
+		                                                        "Blocking",
+		                                                        "The Blocking",
+		                                                        GEDIT_TYPE_THEATRICS_CHOREOGRAPHER_BLOCKING,
+		                                                        GEDIT_THEATRICS_CHOREOGRAPHER_BLOCKING_DOWNSTAGE,
+		                                                        G_PARAM_READWRITE |
+		                                                        G_PARAM_CONSTRUCT |
+		                                                        G_PARAM_STATIC_STRINGS));
+
+		g_object_interface_install_property (iface,
+		                                     g_param_spec_enum ("animation-state",
+		                                                        "Animation State",
+		                                                        "The Animation State",
+		                                                        GEDIT_TYPE_THEATRICS_ANIMATION_STATE,
+		                                                        GEDIT_THEATRICS_ANIMATION_STATE_COMING,
+		                                                        G_PARAM_READWRITE |
+		                                                        G_PARAM_CONSTRUCT |
+		                                                        G_PARAM_STATIC_STRINGS));
+
+		g_object_interface_install_property (iface,
+		                                     g_param_spec_uint ("duration",
+		                                                        "Duration",
+		                                                        "The duration",
+		                                                        0,
+		                                                        G_MAXUINT,
+		                                                        300,
+		                                                        G_PARAM_READWRITE |
+		                                                        G_PARAM_CONSTRUCT |
+		                                                        G_PARAM_STATIC_STRINGS));
+
+		g_object_interface_install_property (iface,
+		                                     g_param_spec_double ("percent",
+		                                                          "Percent",
+		                                                          "The percent",
+		                                                          0.0,
+		                                                          G_MAXDOUBLE,
+		                                                          0.0,
+		                                                          G_PARAM_READWRITE |
+		                                                          G_PARAM_CONSTRUCT |
+		                                                          G_PARAM_STATIC_STRINGS));
+
+		g_object_interface_install_property (iface,
+		                                     g_param_spec_double ("bias",
+		                                                          "Bias",
+		                                                          "The bias",
+		                                                          0.0,
+		                                                          G_MAXDOUBLE,
+		                                                          1.0,
+		                                                          G_PARAM_READWRITE |
+		                                                          G_PARAM_STATIC_STRINGS));
+
+		initialized = TRUE;
+	}
+}
+
+/* XXX: too lazy to add the methods, should we or can we survive only with props? */
+
+/* ex:set ts=8 noet: */
diff --git a/gedit/gedit-animatable.h b/gedit/gedit-animatable.h
new file mode 100644
index 0000000..e2e0a5a
--- /dev/null
+++ b/gedit/gedit-animatable.h
@@ -0,0 +1,57 @@
+/*
+ * gedit-animatable.h
+ * This file is part of gedit
+ *
+ * Copyright (C) 2011 - Ignacio Casal Quinteiro
+ *
+ * gedit is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * gedit is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+#ifndef __GEDIT_ANIMATABLE_H__
+#define __GEDIT_ANIMATABLE_H__
+
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+/*
+ * Type checking and casting macros
+ */
+#define GEDIT_TYPE_ANIMATABLE		(gedit_animatable_get_type ())
+#define GEDIT_ANIMATABLE(obj)		(G_TYPE_CHECK_INSTANCE_CAST ((obj), GEDIT_TYPE_ANIMATABLE, GeditAnimatable))
+#define GEDIT_ANIMATABLE_IFACE(obj)	(G_TYPE_CHECK_CLASS_CAST ((obj), GEDIT_TYPE_ANIMATABLE, GeditAnimatableInterface))
+#define GEDIT_IS_ANIMATABLE(obj)	(G_TYPE_CHECK_INSTANCE_TYPE ((obj), GEDIT_TYPE_ANIMATABLE))
+#define GEDIT_ANIMATABLE_GET_IFACE(obj)	(G_TYPE_INSTANCE_GET_INTERFACE ((obj), GEDIT_TYPE_ANIMATABLE, GeditAnimatableInterface))
+
+typedef struct _GeditAnimatable           GeditAnimatable; /* dummy typedef */
+typedef struct _GeditAnimatableInterface  GeditAnimatableInterface;
+
+struct _GeditAnimatableInterface
+{
+	GTypeInterface g_iface;
+
+	/* Virtual public methods */
+};
+
+/*
+ * Public methods
+ */
+GType	 gedit_animatable_get_type	(void)  G_GNUC_CONST;
+
+G_END_DECLS
+
+#endif /* __GEDIT_ANIMATABLE_H__ */
+
+/* ex:set ts=8 noet: */
diff --git a/gedit/gedit-animated-overlay.c b/gedit/gedit-animated-overlay.c
index 9b4668a..c0856d9 100644
--- a/gedit/gedit-animated-overlay.c
+++ b/gedit/gedit-animated-overlay.c
@@ -23,7 +23,6 @@
 
 #include "gedit-animated-overlay.h"
 #include "theatrics/gedit-theatrics-stage.h"
-#include "theatrics/gedit-theatrics-animated-widget.h"
 
 struct _GeditAnimatedOverlayPrivate
 {
@@ -62,39 +61,49 @@ on_actor_step (GeditTheatricsStage  *stage,
                GeditAnimatedOverlay *overlay)
 {
 	GeditTheatricsAnimationState animation_state;
-	GeditTheatricsAnimatedWidget *anim_widget;
+	GObject *anim_widget;
+	guint duration;
 
-	anim_widget = GEDIT_THEATRICS_ANIMATED_WIDGET (gedit_theatrics_actor_get_target (actor));
-	animation_state = gedit_theatrics_animated_widget_get_animation_state (anim_widget);
+	anim_widget = gedit_theatrics_actor_get_target (actor);
+	g_assert (GEDIT_IS_ANIMATABLE (anim_widget));
+
+	g_object_get (anim_widget, "animation-state", &animation_state,
+	              "duration", &duration, NULL);
 
 	switch (animation_state)
 	{
 		case GEDIT_THEATRICS_ANIMATION_STATE_COMING:
 			gtk_widget_queue_draw (GTK_WIDGET (anim_widget));
-			gedit_theatrics_animated_widget_set_percent (anim_widget,
-			                                             gedit_theatrics_actor_get_percent (actor));
+
+			g_object_set (anim_widget, "percent",
+			              gedit_theatrics_actor_get_percent (actor),
+			              NULL);
+
 			if (gedit_theatrics_actor_get_expired (actor))
 			{
-				gedit_theatrics_animated_widget_set_animation_state (anim_widget,
-				                                                     GEDIT_THEATRICS_ANIMATION_STATE_IDLE);
+				g_object_set (anim_widget, "animation-state",
+				              GEDIT_THEATRICS_ANIMATION_STATE_IDLE, NULL);
 			}
 			break;
 		case GEDIT_THEATRICS_ANIMATION_STATE_INTENDING_TO_GO:
-			gedit_theatrics_animated_widget_set_animation_state (anim_widget,
-			                                                     GEDIT_THEATRICS_ANIMATION_STATE_GOING);
-			gedit_theatrics_animated_widget_set_bias (anim_widget,
-			                                          gedit_theatrics_actor_get_percent (actor));
-			gedit_theatrics_actor_reset (actor, gedit_theatrics_animated_widget_get_duration (anim_widget) *
-			                                    gedit_theatrics_actor_get_percent (actor));
+			g_object_set (anim_widget,
+			              "animation-state", GEDIT_THEATRICS_ANIMATION_STATE_GOING,
+			              "bias", gedit_theatrics_actor_get_percent (actor),
+			               NULL);
+			gedit_theatrics_actor_reset (actor, duration * gedit_theatrics_actor_get_percent (actor));
 			break;
 		case GEDIT_THEATRICS_ANIMATION_STATE_GOING:
+			gtk_widget_queue_draw (GTK_WIDGET (anim_widget));
+
+			g_object_set (anim_widget, "percent",
+			              1.0 - gedit_theatrics_actor_get_percent (actor),
+			              NULL);
+
 			if (gedit_theatrics_actor_get_expired (actor))
 			{
-				gtk_widget_destroy (GTK_WIDGET (anim_widget));
-				return;
+				g_object_set (anim_widget, "animation-state",
+				              GEDIT_THEATRICS_ANIMATION_STATE_IDLE, NULL);
 			}
-			gtk_widget_queue_draw (GTK_WIDGET (anim_widget));
-			gedit_theatrics_animated_widget_set_percent (anim_widget, 1.0 - gedit_theatrics_actor_get_percent (actor));
 			break;
 		default:
 			break;
@@ -116,6 +125,27 @@ gedit_animated_overlay_init (GeditAnimatedOverlay *overlay)
 	                  overlay);
 }
 
+static void
+on_animation_state_changed (GeditAnimatable      *animatable,
+                            GParamSpec           *pspec,
+                            GeditAnimatedOverlay *overlay)
+{
+	GeditTheatricsAnimationState animation_state;
+	guint duration;
+
+	g_object_get (G_OBJECT (animatable),
+	              "animation-state", &animation_state,
+	              "duration", &duration, NULL);
+
+	if (animation_state == GEDIT_THEATRICS_ANIMATION_STATE_COMING ||
+	    animation_state == GEDIT_THEATRICS_ANIMATION_STATE_INTENDING_TO_GO)
+	{
+		gedit_theatrics_stage_add_with_duration (overlay->priv->stage,
+		                                         G_OBJECT (animatable),
+		                                         duration);
+	}
+}
+
 /**
  * gedit_animated_overlay_new:
  * @main_widget: a #GtkWidget
@@ -137,110 +167,30 @@ gedit_animated_overlay_new (GtkWidget *main_widget,
 	                     NULL);
 }
 
-static GeditTheatricsAnimatedWidget *
-get_animated_widget (GeditAnimatedOverlay *overlay,
-                     GtkWidget            *widget)
-{
-	GeditTheatricsAnimatedWidget *anim_widget = NULL;
-	GtkWidget *main_widget;
-	GList *children, *l;
-
-	children = gtk_container_get_children (GTK_CONTAINER (overlay));
-	g_object_get (G_OBJECT (overlay), "main-widget", &main_widget, NULL);
-
-	for (l = children; l != NULL; l = g_list_next (l))
-	{
-		GtkWidget *child = GTK_WIDGET (l->data);
-
-		/* skip the main widget as it is not a OverlayChild */
-		if (child == main_widget)
-			continue;
-
-		if (child == widget)
-		{
-			anim_widget = GEDIT_THEATRICS_ANIMATED_WIDGET (child);
-			break;
-		}
-		else
-		{
-			GtkWidget *in_widget;
-
-			/* let's try also with the internal widget */
-			g_object_get (child, "widget", &in_widget, NULL);
-			g_assert (in_widget != NULL);
-
-			if (in_widget == widget)
-			{
-				anim_widget = GEDIT_THEATRICS_ANIMATED_WIDGET (child);
-				g_object_unref (in_widget);
-
-				break;
-			}
-
-			g_object_unref (in_widget);
-		}
-	}
-
-	g_object_unref (main_widget);
-	g_list_free (children);
-
-	return anim_widget;
-}
-
-/**
- * gedit_animated_overlay_slide:
- * @overlay: a #GeditAnimatedOverlay
- * @widget: a #GtkWidget to add to @overlay
- * @position: a #GeditOverlayChildPosition
- * @offset: offset for @widget
- * @duration: the duration of the animation
- * @easing: a #GeditTheatricsChoreographerEasing
- * @blocking: a #GeditTheatricsChoreographerBlocking
- * @orientation: the orientation of the animation
- * @in: if %TRUE slide in if %FALSE slide out
- *
- * Adds @widget in @overlay with a slide in/out animation depending on @in.
- */
 void
-gedit_animated_overlay_slide (GeditAnimatedOverlay               *overlay,
-                              GtkWidget                          *widget,
-                              GeditOverlayChildPosition           position,
-                              guint                               offset,
-                              guint                               duration,
-                              GeditTheatricsChoreographerEasing   easing,
-                              GeditTheatricsChoreographerBlocking blocking,
-                              GtkOrientation                      orientation,
-                              gboolean                            in)
+gedit_animated_overlay_add (GeditAnimatedOverlay     *overlay,
+                            GeditAnimatable          *animatable)
 {
-	GeditTheatricsAnimatedWidget *anim_widget;
+	GeditOverlayChildPosition position;
+	guint offset, duration;
 
-	anim_widget = get_animated_widget (overlay, widget);
+	g_return_if_fail (GEDIT_IS_OVERLAY (overlay));
+	g_return_if_fail (GEDIT_IS_ANIMATABLE (animatable));
 
-	if (anim_widget == NULL)
-	{
-		anim_widget = gedit_theatrics_animated_widget_new (widget, duration,
-		                                                   easing,
-		                                                   blocking,
-		                                                   orientation);
-		gtk_widget_show (GTK_WIDGET (anim_widget));
-
-		gedit_overlay_add (GEDIT_OVERLAY (overlay),
-		                   GTK_WIDGET (anim_widget),
-		                   position, offset);
-	}
-	else
-	{
-		/* we are only interested in the easing and the blocking */
-		gedit_theatrics_animated_widget_set_easing (anim_widget, easing);
-		gedit_theatrics_animated_widget_set_blocking (anim_widget, blocking);
-	}
+	g_object_get (G_OBJECT (animatable),
+	              "position", &position,
+	              "offset", &offset,
+	              "duration", &duration,
+	              NULL);
 
-	if (!in)
-	{
-		gedit_theatrics_animated_widget_set_animation_state (anim_widget, GEDIT_THEATRICS_ANIMATION_STATE_GOING);
-	}
+	/* FIXME: check that the widget is not already added */
 
-	gedit_theatrics_stage_add_with_duration (overlay->priv->stage,
-	                                         G_OBJECT (anim_widget),
-	                                         duration);
+	gedit_overlay_add (GEDIT_OVERLAY (overlay),
+	                   GTK_WIDGET (animatable),
+	                   position, offset);
+
+	g_signal_connect (animatable,
+	                  "notify::animation-state",
+	                  G_CALLBACK (on_animation_state_changed),
+	                  overlay);
 }
diff --git a/gedit/gedit-animated-overlay.h b/gedit/gedit-animated-overlay.h
index f9a2fb3..f181108 100644
--- a/gedit/gedit-animated-overlay.h
+++ b/gedit/gedit-animated-overlay.h
@@ -22,6 +22,7 @@
 #ifndef __GEDIT_ANIMATED_OVERLAY_H__
 #define __GEDIT_ANIMATED_OVERLAY_H__
 
+#include "gedit-animatable.h"
 #include "gedit-overlay.h"
 #include "theatrics/gedit-theatrics-choreographer.h"
 
@@ -56,15 +57,8 @@ GType gedit_animated_overlay_get_type (void) G_GNUC_CONST;
 GtkWidget *gedit_animated_overlay_new (GtkWidget *main_widget,
                                        GtkWidget *relative_widget);
 
-void gedit_animated_overlay_slide (GeditAnimatedOverlay               *overlay,
-                                   GtkWidget                          *widget,
-                                   GeditOverlayChildPosition           position,
-                                   guint                               offset,
-                                   guint                               duration,
-                                   GeditTheatricsChoreographerEasing   easing,
-                                   GeditTheatricsChoreographerBlocking blocking,
-                                   GtkOrientation                      orientation,
-                                   gboolean                            in);
+void gedit_animated_overlay_add (GeditAnimatedOverlay *overlay,
+                                 GeditAnimatable      *animatable);
 
 G_END_DECLS
 
diff --git a/gedit/gedit-floating-slider.c b/gedit/gedit-floating-slider.c
new file mode 100644
index 0000000..34d329e
--- /dev/null
+++ b/gedit/gedit-floating-slider.c
@@ -0,0 +1,326 @@
+/*
+ * gedit-floating-slider.c
+ * This file is part of gedit
+ *
+ * Copyright (C) 2010 - Ignacio Casal Quinteiro
+ *
+ * Based on Scott Peterson <lunchtimemama gmail com> work.
+ *
+ * gedit is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * gedit is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with gedit; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA  02110-1301  USA
+ */
+
+#include "gedit-floating-slider.h"
+#include "gedit-animatable.h"
+
+struct _GeditFloatingSliderPrivate
+{
+	GtkAllocation widget_alloc;
+	GeditTheatricsChoreographerEasing easing;
+	GeditTheatricsChoreographerBlocking blocking;
+	GeditTheatricsAnimationState animation_state;
+	GtkOrientation orientation;
+	guint duration;
+	gdouble bias;
+	gdouble percent;
+};
+
+enum
+{
+	PROP_0,
+	PROP_EASING,
+	PROP_BLOCKING,
+	PROP_ANIMATION_STATE,
+	PROP_DURATION,
+	PROP_PERCENT,
+	PROP_BIAS,
+	PROP_ORIENTATION
+};
+
+G_DEFINE_TYPE_EXTENDED (GeditFloatingSlider,
+			gedit_floating_slider,
+			GEDIT_TYPE_OVERLAY_CHILD,
+			0,
+			G_IMPLEMENT_INTERFACE (GEDIT_TYPE_ANIMATABLE,
+			                       NULL)
+			G_IMPLEMENT_INTERFACE (GTK_TYPE_ORIENTABLE,
+					       NULL))
+
+static void
+gedit_floating_slider_finalize (GObject *object)
+{
+	G_OBJECT_CLASS (gedit_floating_slider_parent_class)->finalize (object);
+}
+
+static void
+gedit_floating_slider_get_property (GObject    *object,
+                                    guint       prop_id,
+                                    GValue     *value,
+                                    GParamSpec *pspec)
+{
+	GeditFloatingSliderPrivate *priv = GEDIT_FLOATING_SLIDER (object)->priv;
+
+	switch (prop_id)
+	{
+		case PROP_EASING:
+			g_value_set_enum (value, priv->easing);
+			break;
+		case PROP_BLOCKING:
+			g_value_set_enum (value, priv->blocking);
+			break;
+		case PROP_ANIMATION_STATE:
+			g_value_set_enum (value, priv->animation_state);
+			break;
+		case PROP_DURATION:
+			g_value_set_uint (value, priv->duration);
+			break;
+		case PROP_PERCENT:
+			g_value_set_double (value, priv->percent);
+			break;
+		case PROP_BIAS:
+			g_value_set_double (value, priv->bias);
+			break;
+		case PROP_ORIENTATION:
+			g_value_set_enum (value, priv->orientation);
+			break;
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+			break;
+	}
+}
+
+static void
+gedit_floating_slider_set_property (GObject      *object,
+                                    guint         prop_id,
+                                    const GValue *value,
+                                    GParamSpec   *pspec)
+{
+	GeditFloatingSliderPrivate *priv = GEDIT_FLOATING_SLIDER (object)->priv;
+
+	switch (prop_id)
+	{
+		case PROP_EASING:
+			priv->easing = g_value_get_enum (value);
+			break;
+		case PROP_BLOCKING:
+			priv->blocking = g_value_get_enum (value);
+			break;
+		case PROP_ANIMATION_STATE:
+			priv->animation_state = g_value_get_enum (value);
+			break;
+		case PROP_DURATION:
+			priv->duration = g_value_get_uint (value);
+			break;
+		case PROP_PERCENT:
+			priv->percent = g_value_get_double (value);
+			gtk_widget_queue_resize_no_redraw (GTK_WIDGET (object));
+
+			/* Make the widget visibility automagic */
+			if (priv->percent > 0 && !gtk_widget_get_visible (GTK_WIDGET (object)))
+			{
+				gtk_widget_show (GTK_WIDGET (object));
+			}
+			else if (priv->percent == 0 && gtk_widget_get_visible (GTK_WIDGET (object)))
+			{
+				gtk_widget_hide (GTK_WIDGET (object));
+			}
+			break;
+		case PROP_BIAS:
+			priv->bias = g_value_get_double (value);
+			break;
+		case PROP_ORIENTATION:
+			priv->orientation = g_value_get_enum (value);
+			break;
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+			break;
+	}
+}
+
+static void
+gedit_floating_slider_get_preferred_width (GtkWidget *widget,
+                                           gint      *minimum,
+                                           gint      *natural)
+{
+	GeditFloatingSliderPrivate *priv = GEDIT_FLOATING_SLIDER (widget)->priv;
+	GtkWidget *child;
+	gint width;
+
+	GTK_WIDGET_CLASS (gedit_floating_slider_parent_class)->get_preferred_width (widget, minimum, natural);
+
+	child = gtk_bin_get_child (GTK_BIN (widget));
+
+	if (child != NULL)
+	{
+		gint child_min, child_nat;
+
+		gtk_widget_get_preferred_width (child, &child_min, &child_nat);
+		priv->widget_alloc.width = child_min;
+	}
+
+	if (priv->orientation == GTK_ORIENTATION_HORIZONTAL)
+	{
+		width = gedit_theatrics_choreographer_pixel_compose (priv->percent,
+		                                                     priv->widget_alloc.width,
+		                                                     priv->easing);
+	}
+	else
+	{
+		width = priv->widget_alloc.width;
+	}
+
+	*minimum = *natural = width;
+}
+
+static void
+gedit_floating_slider_get_preferred_height (GtkWidget *widget,
+                                            gint      *minimum,
+                                            gint      *natural)
+{
+	GeditFloatingSliderPrivate *priv = GEDIT_FLOATING_SLIDER (widget)->priv;
+	GtkWidget *child;
+	gint height;
+
+	GTK_WIDGET_CLASS (gedit_floating_slider_parent_class)->get_preferred_height (widget, minimum, natural);
+
+	child = gtk_bin_get_child (GTK_BIN (widget));
+
+	if (child != NULL)
+	{
+		gint child_min, child_nat;
+
+		gtk_widget_get_preferred_height (child, &child_min, &child_nat);
+		priv->widget_alloc.height = child_min;
+	}
+
+	if (priv->orientation == GTK_ORIENTATION_HORIZONTAL)
+	{
+		height = priv->widget_alloc.height;
+	}
+	else
+	{
+		height = gedit_theatrics_choreographer_pixel_compose (priv->percent,
+		                                                      priv->widget_alloc.height,
+		                                                      priv->easing);
+	}
+
+	*minimum = *natural = height;
+}
+
+static void
+gedit_floating_slider_size_allocate (GtkWidget     *widget,
+                                     GtkAllocation *allocation)
+{
+	GeditFloatingSliderPrivate *priv = GEDIT_FLOATING_SLIDER (widget)->priv;
+	GtkWidget *child;
+
+	GTK_WIDGET_CLASS (gedit_floating_slider_parent_class)->size_allocate (widget, allocation);
+
+	child = gtk_bin_get_child (GTK_BIN (widget));
+
+	if (child != NULL)
+	{
+		if (priv->orientation == GTK_ORIENTATION_HORIZONTAL)
+		{
+			priv->widget_alloc.height = allocation->height;
+			priv->widget_alloc.x = 0;
+
+			if (priv->blocking == GEDIT_THEATRICS_CHOREOGRAPHER_BLOCKING_DOWNSTAGE)
+			{
+				priv->widget_alloc.x = allocation->width - priv->widget_alloc.width;
+			}
+		}
+		else
+		{
+			priv->widget_alloc.width = allocation->width;
+			priv->widget_alloc.y = 0;
+
+			if (priv->blocking == GEDIT_THEATRICS_CHOREOGRAPHER_BLOCKING_DOWNSTAGE)
+			{
+				priv->widget_alloc.y = allocation->height - priv->widget_alloc.height;
+			}
+		}
+
+		if (priv->widget_alloc.height > 0 && priv->widget_alloc.width > 0)
+		{
+			gtk_widget_size_allocate (child, &priv->widget_alloc);
+		}
+	}
+}
+
+static void
+gedit_floating_slider_class_init (GeditFloatingSliderClass *klass)
+{
+	GObjectClass *object_class = G_OBJECT_CLASS (klass);
+	GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+	
+	object_class->finalize = gedit_floating_slider_finalize;
+	object_class->get_property = gedit_floating_slider_get_property;
+	object_class->set_property = gedit_floating_slider_set_property;
+
+	widget_class->get_preferred_width = gedit_floating_slider_get_preferred_width;
+	widget_class->get_preferred_height = gedit_floating_slider_get_preferred_height;
+	widget_class->size_allocate = gedit_floating_slider_size_allocate;
+
+	g_object_class_override_property (object_class,
+	                                  PROP_EASING,
+	                                  "easing");
+
+	g_object_class_override_property (object_class,
+	                                  PROP_BLOCKING,
+	                                  "blocking");
+
+	g_object_class_override_property (object_class,
+	                                  PROP_ANIMATION_STATE,
+	                                  "animation-state");
+
+	g_object_class_override_property (object_class,
+	                                  PROP_DURATION,
+	                                  "duration");
+
+	g_object_class_override_property (object_class,
+	                                  PROP_PERCENT,
+	                                  "percent");
+
+	g_object_class_override_property (object_class,
+	                                  PROP_BIAS,
+	                                  "bias");
+
+	g_object_class_override_property (object_class,
+	                                  PROP_ORIENTATION,
+	                                  "orientation");
+
+	g_type_class_add_private (object_class, sizeof (GeditFloatingSliderPrivate));
+}
+
+static void
+gedit_floating_slider_init (GeditFloatingSlider *slider)
+{
+	slider->priv = G_TYPE_INSTANCE_GET_PRIVATE (slider,
+	                                            GEDIT_TYPE_FLOATING_SLIDER,
+	                                            GeditFloatingSliderPrivate);
+
+	slider->priv->orientation = GTK_ORIENTATION_VERTICAL;
+}
+
+GtkWidget *
+gedit_floating_slider_new (GtkWidget *widget)
+{
+	return g_object_new (GEDIT_TYPE_FLOATING_SLIDER,
+	                     "widget", widget,
+	                     NULL);
+}
+
+/* ex:set ts=8 noet: */
diff --git a/gedit/gedit-floating-slider.h b/gedit/gedit-floating-slider.h
new file mode 100644
index 0000000..b5e635d
--- /dev/null
+++ b/gedit/gedit-floating-slider.h
@@ -0,0 +1,65 @@
+/*
+ * gedit-floating-slider.h
+ * This file is part of gedit
+ *
+ * Copyright (C) 2010 - Ignacio Casal Quinteiro
+ *
+ * Based on Scott Peterson <lunchtimemama gmail com> work.
+ *
+ * gedit is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * gedit is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with gedit; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA  02110-1301  USA
+ */
+
+#ifndef __GEDIT_FLOATING_SLIDER_H__
+#define __GEDIT_FLOATING_SLIDER_H__
+
+#include <glib-object.h>
+#include <gtk/gtk.h>
+#include "theatrics/gedit-theatrics-choreographer.h"
+#include "gedit-overlay-child.h"
+
+G_BEGIN_DECLS
+
+#define GEDIT_TYPE_FLOATING_SLIDER		(gedit_floating_slider_get_type ())
+#define GEDIT_FLOATING_SLIDER(obj)		(G_TYPE_CHECK_INSTANCE_CAST ((obj), GEDIT_TYPE_FLOATING_SLIDER, GeditFloatingSlider))
+#define GEDIT_FLOATING_SLIDER_CONST(obj)	(G_TYPE_CHECK_INSTANCE_CAST ((obj), GEDIT_TYPE_FLOATING_SLIDER, GeditFloatingSlider const))
+#define GEDIT_FLOATING_SLIDER_CLASS(klass)	(G_TYPE_CHECK_CLASS_CAST ((klass), GEDIT_TYPE_FLOATING_SLIDER, GeditFloatingSliderClass))
+#define GEDIT_IS_FLOATING_SLIDER(obj)		(G_TYPE_CHECK_INSTANCE_TYPE ((obj), GEDIT_TYPE_FLOATING_SLIDER))
+#define GEDIT_IS_FLOATING_SLIDER_CLASS(klass)	(G_TYPE_CHECK_CLASS_TYPE ((klass), GEDIT_TYPE_FLOATING_SLIDER))
+#define GEDIT_FLOATING_SLIDER_GET_CLASS(obj)	(G_TYPE_INSTANCE_GET_CLASS ((obj), GEDIT_TYPE_FLOATING_SLIDER, GeditFloatingSliderClass))
+
+typedef struct _GeditFloatingSlider		GeditFloatingSlider;
+typedef struct _GeditFloatingSliderClass	GeditFloatingSliderClass;
+typedef struct _GeditFloatingSliderPrivate	GeditFloatingSliderPrivate;
+
+struct _GeditFloatingSlider
+{
+	GeditOverlayChild parent;
+	
+	GeditFloatingSliderPrivate *priv;
+};
+
+struct _GeditFloatingSliderClass
+{
+	GeditOverlayChildClass parent_class;
+};
+
+GType		 gedit_floating_slider_get_type	(void) G_GNUC_CONST;
+
+GtkWidget	*gedit_floating_slider_new	(GtkWidget *widget);
+
+G_END_DECLS
+
+#endif /* __GEDIT_FLOATING_SLIDER_H__ */
diff --git a/gedit/gedit-view-frame.c b/gedit/gedit-view-frame.c
index 42ce01f..03c7e04 100644
--- a/gedit/gedit-view-frame.c
+++ b/gedit/gedit-view-frame.c
@@ -25,6 +25,7 @@
 #include "gedit-debug.h"
 #include "gedit-utils.h"
 #include "gedit-animated-overlay.h"
+#include "gedit-floating-slider.h"
 #include "gedit-rounded-frame.h"
 
 #include <gdk/gdkkeysyms.h>
@@ -66,6 +67,7 @@ struct _GeditViewFramePrivate
 	 */
 	guint        search_flags;
 
+	GtkWidget   *slider;
 	GtkWidget   *search_widget;
 	GtkWidget   *search_entry;
 
@@ -148,13 +150,15 @@ hide_search_widget (GeditViewFrame *frame,
                     gboolean        cancel)
 {
 	GtkTextBuffer *buffer;
-	GeditOverlayChildPosition position;
 
 	if (frame->priv->disable_popdown)
 	{
 		return;
 	}
 
+	g_signal_handler_block (frame->priv->search_entry,
+	                        frame->priv->search_entry_focus_out_id);
+
 	if (frame->priv->view_scroll_event_id != 0)
 	{
 		g_signal_handler_disconnect (frame->priv->view,
@@ -162,38 +166,16 @@ hide_search_widget (GeditViewFrame *frame,
 		frame->priv->view_scroll_event_id = 0;
 	}
 
-	if (frame->priv->search_entry_focus_out_id != 0)
-	{
-		g_signal_handler_disconnect (frame->priv->search_entry,
-		                             frame->priv->search_entry_focus_out_id);
-		frame->priv->search_entry_focus_out_id = 0;
-	}
-
 	if (frame->priv->typeselect_flush_timeout != 0)
 	{
 		g_source_remove (frame->priv->typeselect_flush_timeout);
 		frame->priv->typeselect_flush_timeout = 0;
 	}
 
-	if (gtk_widget_get_direction (frame->priv->search_entry) == GTK_TEXT_DIR_RTL)
-	{
-		position = GEDIT_OVERLAY_CHILD_POSITION_NORTH_WEST;
-	}
-	else
-	{
-		position = GEDIT_OVERLAY_CHILD_POSITION_NORTH_EAST;
-	}
-
-	gedit_animated_overlay_slide (GEDIT_ANIMATED_OVERLAY (frame->priv->overlay),
-	                              frame->priv->search_widget,
-	                              position,
-	                              SEARCH_POPUP_OFFSET,
-	                              300,
-	                              GEDIT_THEATRICS_CHOREOGRAPHER_EASING_EXPONENTIAL_IN_OUT,
-	                              GEDIT_THEATRICS_CHOREOGRAPHER_BLOCKING_UPSTAGE,
-	                              GTK_ORIENTATION_VERTICAL,
-	                              FALSE);
-	frame->priv->search_widget = NULL;
+	/* To hide the slider we just set the animation-state property */
+	g_object_set (G_OBJECT (frame->priv->slider),
+	              "animation-state", GEDIT_THEATRICS_ANIMATION_STATE_INTENDING_TO_GO,
+	              NULL);
 
 	if (cancel)
 	{
@@ -214,6 +196,9 @@ hide_search_widget (GeditViewFrame *frame,
 	/* Make sure the view is the one who has the focus when we destroy
 	   the search widget */
 	gtk_widget_grab_focus (frame->priv->view);
+
+	g_signal_handler_unblock (frame->priv->search_entry,
+	                          frame->priv->search_entry_focus_out_id);
 }
 
 static void
@@ -1078,11 +1063,6 @@ create_search_widget (GeditViewFrame *frame)
 	g_signal_connect (search_widget, "scroll-event",
 	                  G_CALLBACK (search_widget_scroll_event),
 	                  frame);
-	/* Manage the scroll also for the view */
-	frame->priv->view_scroll_event_id =
-		g_signal_connect (frame->priv->view, "scroll-event",
-			          G_CALLBACK (search_widget_scroll_event),
-			          frame);
 
 	hbox = gtk_hbox_new (FALSE, 3);
 	gtk_widget_show (hbox);
@@ -1205,6 +1185,8 @@ init_search_entry (GeditViewFrame *frame)
 
 	buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (frame->priv->view));
 
+	customize_for_search_mode (frame);
+
 	if (frame->priv->search_mode == GOTO_LINE)
 	{
 		gint   line;
@@ -1275,12 +1257,10 @@ start_interactive_search_real (GeditViewFrame *frame)
 	GtkTextBuffer *buffer;
 	GtkTextMark *mark;
 	GtkTextIter iter;
-	GeditOverlayChildPosition position;
 
 	/* FIXME: it enters here twice, why? */
 
-	if ((frame->priv->search_widget != NULL) &&
-	    gtk_widget_get_visible (frame->priv->search_widget))
+	if (gtk_widget_get_visible (frame->priv->slider))
 	{
 		if (frame->priv->search_mode != frame->priv->request_search_mode)
 		{
@@ -1309,29 +1289,19 @@ start_interactive_search_real (GeditViewFrame *frame)
 	frame->priv->start_mark = gtk_text_buffer_create_mark (buffer, NULL,
 	                                                       &iter, FALSE);
 
-	frame->priv->search_widget = create_search_widget (frame);
-
-	if (gtk_widget_get_direction (frame->priv->search_entry) == GTK_TEXT_DIR_RTL)
-	{
-		position = GEDIT_OVERLAY_CHILD_POSITION_NORTH_WEST;
-	}
-	else
-	{
-		position = GEDIT_OVERLAY_CHILD_POSITION_NORTH_EAST;
-	}
-
-	gedit_animated_overlay_slide (GEDIT_ANIMATED_OVERLAY (frame->priv->overlay),
-	                              frame->priv->search_widget,
-	                              position,
-	                              SEARCH_POPUP_OFFSET,
-	                              300,
-	                              GEDIT_THEATRICS_CHOREOGRAPHER_EASING_EXPONENTIAL_IN_OUT,
-	                              GEDIT_THEATRICS_CHOREOGRAPHER_BLOCKING_DOWNSTAGE,
-	                              GTK_ORIENTATION_VERTICAL,
-	                              TRUE);
+	/* To slide in we set the right animation state in the animatable */
+	g_object_set (G_OBJECT (frame->priv->slider),
+	              "animation-state", GEDIT_THEATRICS_ANIMATION_STATE_COMING,
+	              NULL);
 
 	init_search_entry (frame);
 
+	/* Manage the scroll also for the view */
+	frame->priv->view_scroll_event_id =
+		g_signal_connect (frame->priv->view, "scroll-event",
+			          G_CALLBACK (search_widget_scroll_event),
+			          frame);
+
 	frame->priv->typeselect_flush_timeout =
 		g_timeout_add (GEDIT_VIEW_FRAME_SEARCH_DIALOG_TIMEOUT,
 		               (GSourceFunc) search_entry_flush_timeout,
@@ -1406,6 +1376,7 @@ gedit_view_frame_init (GeditViewFrame *frame)
 {
 	GeditDocument *doc;
 	GtkWidget *sw;
+	GeditOverlayChildPosition position;
 
 	frame->priv = GEDIT_VIEW_FRAME_GET_PRIVATE (frame);
 
@@ -1450,6 +1421,29 @@ gedit_view_frame_init (GeditViewFrame *frame)
 	gtk_widget_show (frame->priv->overlay);
 
 	gtk_box_pack_start (GTK_BOX (frame), frame->priv->overlay, TRUE, TRUE, 0);
+
+	/* Add slider */
+	if (gtk_widget_get_direction (GTK_WIDGET (frame)) == GTK_TEXT_DIR_RTL)
+	{
+		position = GEDIT_OVERLAY_CHILD_POSITION_NORTH_WEST;
+	}
+	else
+	{
+		position = GEDIT_OVERLAY_CHILD_POSITION_NORTH_EAST;
+	}
+
+	frame->priv->search_widget = create_search_widget (frame);
+	frame->priv->slider = gedit_floating_slider_new (frame->priv->search_widget);
+	g_object_set (G_OBJECT (frame->priv->slider),
+	              "position", position,
+	              "offset", SEARCH_POPUP_OFFSET,
+	              "easing", GEDIT_THEATRICS_CHOREOGRAPHER_EASING_EXPONENTIAL_IN_OUT,
+	              "blocking", GEDIT_THEATRICS_CHOREOGRAPHER_BLOCKING_DOWNSTAGE,
+	              "orientation", GTK_ORIENTATION_VERTICAL,
+	              NULL);
+
+	gedit_animated_overlay_add (GEDIT_ANIMATED_OVERLAY (frame->priv->overlay),
+	                            GEDIT_ANIMATABLE (frame->priv->slider));
 }
 
 GeditViewFrame *
diff --git a/gedit/theatrics/Makefile.am b/gedit/theatrics/Makefile.am
index 8052be0..201479a 100644
--- a/gedit/theatrics/Makefile.am
+++ b/gedit/theatrics/Makefile.am
@@ -18,8 +18,6 @@ BUILT_SOURCES =					\
 libtheatrics_la_SOURCES =				\
 	gedit-theatrics-actor.h				\
 	gedit-theatrics-actor.c				\
-	gedit-theatrics-animated-widget.h		\
-	gedit-theatrics-animated-widget.c		\
 	gedit-theatrics-choreographer.h			\
 	gedit-theatrics-choreographer.c			\
 	gedit-theatrics-stage.h				\



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