[gedit] Add a GeditAnimatable and use it.
- From: Ignacio Casal Quinteiro <icq src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gedit] Add a GeditAnimatable and use it.
- Date: Fri, 18 Feb 2011 11:58:45 +0000 (UTC)
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]