[gedit/wip/search-animation: 3/4] Make use of the floating occurrence



commit 04444dfade8ddff79642bc0d7c6a1e5ceeec1625
Author: Ignacio Casal Quinteiro <icq gnome org>
Date:   Sun Aug 19 22:02:01 2012 +0200

    Make use of the floating occurrence

 gedit/gedit-floating-occurrence.c |   11 ++++++-
 gedit/gedit-floating-occurrence.h |    7 +++-
 gedit/gedit-view-frame.c          |   59 +++++++++++++++++++++++++++++++++++++
 3 files changed, 74 insertions(+), 3 deletions(-)
---
diff --git a/gedit/gedit-floating-occurrence.c b/gedit/gedit-floating-occurrence.c
index 78c1166..ab08220 100644
--- a/gedit/gedit-floating-occurrence.c
+++ b/gedit/gedit-floating-occurrence.c
@@ -296,7 +296,7 @@ gedit_floating_occurrence_init (GeditFloatingOccurrence *occurrence)
 	                                GTK_STYLE_PROVIDER (GEDIT_FLOATING_OCCURRENCE_GET_CLASS (occurrence)->priv->css),
 	                                GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
 
-	occurrence->priv->label = gtk_label_new ("Hello");
+	occurrence->priv->label = gtk_label_new ("");
 	gtk_widget_show (occurrence->priv->label);
 	gtk_container_add (GTK_CONTAINER (occurrence), occurrence->priv->label);
 }
@@ -307,4 +307,13 @@ gedit_floating_occurrence_new (void)
 	return g_object_new (GEDIT_TYPE_FLOATING_OCCURRENCE, NULL);
 }
 
+void
+gedit_floating_occurrence_set_text (GeditFloatingOccurrence *occurrence,
+                                    const gchar             *text)
+{
+	g_return_if_fail (GEDIT_IS_FLOATING_OCCURRENCE (occurrence));
+
+	gtk_label_set_text (GTK_LABEL (occurrence->priv->label), text);
+}
+
 /* ex:set ts=8 noet: */
diff --git a/gedit/gedit-floating-occurrence.h b/gedit/gedit-floating-occurrence.h
index f05de9c..451f99a 100644
--- a/gedit/gedit-floating-occurrence.h
+++ b/gedit/gedit-floating-occurrence.h
@@ -56,9 +56,12 @@ struct _GeditFloatingOccurrenceClass
 	GeditFloatingOccurrenceClassPrivate *priv;
 };
 
-GType		 gedit_floating_occurrence_get_type	(void) G_GNUC_CONST;
+GType            gedit_floating_occurrence_get_type     (void) G_GNUC_CONST;
 
-GtkWidget	*gedit_floating_occurrence_new		(void);
+GtkWidget       *gedit_floating_occurrence_new          (void);
+
+void             gedit_floating_occurrence_set_text     (GeditFloatingOccurrence *occurrence,
+                                                         const gchar             *text);
 
 G_END_DECLS
 
diff --git a/gedit/gedit-view-frame.c b/gedit/gedit-view-frame.c
index 2b72967..279fc2d 100644
--- a/gedit/gedit-view-frame.c
+++ b/gedit/gedit-view-frame.c
@@ -30,6 +30,7 @@
 #include "gedit-utils.h"
 #include "gedit-animated-overlay.h"
 #include "gedit-floating-slider.h"
+#include "gedit-floating-occurrence.h"
 
 #include <gdk/gdkkeysyms.h>
 #include <glib/gi18n.h>
@@ -74,6 +75,8 @@ struct _GeditViewFramePrivate
 	GtkWidget   *go_up_button;
 	GtkWidget   *go_down_button;
 
+	GtkWidget   *search_occurrence;
+
 	guint        typeselect_flush_timeout;
 	glong        view_scroll_event_id;
 	glong        search_entry_focus_out_id;
@@ -326,6 +329,12 @@ run_search (GeditViewFrame   *frame,
 
 		gtk_text_buffer_move_mark_by_name (GTK_TEXT_BUFFER (doc),
 		                                   "selection_bound", &match_end);
+		gtk_widget_show (frame->priv->search_occurrence);
+		gedit_floating_occurrence_set_text (GEDIT_FLOATING_OCCURRENCE (frame->priv->search_occurrence),
+		                                    entry_text);
+		g_object_set (G_OBJECT (frame->priv->search_occurrence),
+		              "animation-state", GEDIT_THEATRICS_ANIMATION_STATE_COMING,
+		              NULL);
 	}
 	else if (typing)
 	{
@@ -1234,6 +1243,43 @@ view_frame_mount_operation_factory (GeditDocument   *doc,
 	return gtk_mount_operation_new (GTK_WINDOW (window));
 }
 
+static gboolean
+on_get_child_position (GtkOverlay     *overlay,
+                       GtkWidget      *widget,
+                       GdkRectangle   *allocation,
+                       GeditViewFrame *frame)
+{
+	if (widget == frame->priv->search_occurrence)
+	{
+		GtkTextBuffer *buf;
+		GtkTextIter start, end;
+		GdkRectangle location;
+		gint x, y;
+		gint width, height;
+
+		buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (frame->priv->view));
+		gtk_text_buffer_get_selection_bounds (buf, &start, &end);
+		gtk_text_view_get_iter_location (GTK_TEXT_VIEW (frame->priv->view),
+		                                 &start, &location);
+		gtk_text_view_buffer_to_window_coords (GTK_TEXT_VIEW (frame->priv->view),
+		                                       GTK_TEXT_WINDOW_TEXT,
+		                                       location.x,
+		                                       location.y,
+		                                       &x, &y);
+
+		gtk_widget_get_preferred_width (widget, NULL, &width);
+		gtk_widget_get_preferred_height (widget, NULL, &height);
+
+		allocation->x = x;
+		allocation->y = y;
+		allocation->width = width;
+		allocation->height = height;
+		return TRUE;
+	}
+
+	return FALSE;
+}
+
 static void
 gedit_view_frame_init (GeditViewFrame *frame)
 {
@@ -1277,6 +1323,9 @@ gedit_view_frame_init (GeditViewFrame *frame)
 	gtk_widget_override_background_color (frame->priv->overlay, 0, &transparent);
 	gtk_widget_show (frame->priv->overlay);
 
+	g_signal_connect (frame->priv->overlay, "get-child-position",
+	                  G_CALLBACK (on_get_child_position), frame);
+
 	gtk_box_pack_start (GTK_BOX (frame), frame->priv->overlay, TRUE, TRUE, 0);
 
 	/* Add slider */
@@ -1302,6 +1351,16 @@ gedit_view_frame_init (GeditViewFrame *frame)
 
 	gedit_animated_overlay_add_animated_overlay (GEDIT_ANIMATED_OVERLAY (frame->priv->overlay),
 	                                             GEDIT_ANIMATABLE (frame->priv->slider));
+
+	/* Add search occurrence */
+	frame->priv->search_occurrence = gedit_floating_occurrence_new ();
+	g_object_set (G_OBJECT (frame->priv->search_occurrence),
+	              "easing", GEDIT_THEATRICS_CHOREOGRAPHER_EASING_EXPONENTIAL_IN_OUT,
+	              "blocking", GEDIT_THEATRICS_CHOREOGRAPHER_BLOCKING_DOWNSTAGE,
+	              NULL);
+
+	gedit_animated_overlay_add_animated_overlay (GEDIT_ANIMATED_OVERLAY (frame->priv->overlay),
+	                                             GEDIT_ANIMATABLE (frame->priv->search_occurrence));
 }
 
 GeditViewFrame *



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