[gnome-builder] minimap: cleanup delayed conceal handler



commit 7b7dc94e5d28023ffd74cc23501510ddb9be283a
Author: Christian Hergert <christian hergert me>
Date:   Tue Apr 28 18:48:07 2015 -0700

    minimap: cleanup delayed conceal handler
    
    This also allows us to keep the map visible during scroll events and
    motion events. Both of which are useful to make it feel more like an
    overlay scrollbar.

 libide/ide-source-map.c |  126 ++++++++++++++++++++++++++++++++++-------------
 1 files changed, 92 insertions(+), 34 deletions(-)
---
diff --git a/libide/ide-source-map.c b/libide/ide-source-map.c
index 56808e0..f501f12 100644
--- a/libide/ide-source-map.c
+++ b/libide/ide-source-map.c
@@ -28,8 +28,7 @@
 #include "ide-source-view.h"
 
 #define DEFAULT_WIDTH        100
-#define DELAYED_HIDE_TIMEOUT 2000
-#define DELAYED_SHOW_TIMEOUT 50
+#define CONCEAL_TIMEOUT      2000
 
 struct _IdeSourceMap
 {
@@ -45,10 +44,9 @@ struct _IdeSourceMap
   GtkSourceView           *view;
   GtkSourceGutterRenderer *line_renderer;
 
-  guint                    delayed_reveal_timeout;
+  guint                    delayed_conceal_timeout;
 
   guint                    in_press : 1;
-  guint                    is_hiding : 1;
   guint                    show_map : 1;
 };
 
@@ -76,24 +74,19 @@ static GParamSpec *gParamSpecs [LAST_PROP];
 static guint gSignals [LAST_SIGNAL];
 
 static gboolean
-ide_source_map_do_reveal (gpointer data)
+ide_source_map_do_conceal (gpointer data)
 {
   IdeSourceMap *self = data;
 
   g_assert (IDE_IS_SOURCE_MAP (self));
 
-  self->delayed_reveal_timeout = 0;
+  self->delayed_conceal_timeout = 0;
 
-  /* ignore if we are already at this state */
-  if ((!self->is_hiding) == self->show_map)
-    return G_SOURCE_REMOVE;
-
-  self->show_map = !self->is_hiding;
-
-  if (self->is_hiding)
-    g_signal_emit (self, gSignals [HIDE_MAP], 0);
-  else
-    g_signal_emit (self, gSignals [SHOW_MAP], 0);
+  if (self->show_map == TRUE)
+    {
+      self->show_map = FALSE;
+      g_signal_emit (self, gSignals [HIDE_MAP], 0);
+    }
 
   return G_SOURCE_REMOVE;
 }
@@ -107,16 +100,32 @@ ide_source_map__enter_notify_event (IdeSourceMap     *self,
   g_assert (event != NULL);
   g_assert (GTK_IS_WIDGET (widget));
 
-  self->is_hiding = FALSE;
+  if (self->show_map == FALSE)
+    {
+      self->show_map = TRUE;
+      g_signal_emit (self, gSignals [SHOW_MAP], 0);
+    }
+
+  return GDK_EVENT_PROPAGATE;
+}
 
-  if (self->delayed_reveal_timeout != 0)
-    g_source_remove (self->delayed_reveal_timeout);
+static void
+ide_source_map_show_map_and_queue_fade (IdeSourceMap *self)
+{
+  g_assert (IDE_IS_SOURCE_MAP (self));
 
-  self->delayed_reveal_timeout = g_timeout_add (DELAYED_SHOW_TIMEOUT,
-                                                ide_source_map_do_reveal,
-                                                self);
+  if (self->delayed_conceal_timeout != 0)
+    g_source_remove (self->delayed_conceal_timeout);
 
-  return GDK_EVENT_PROPAGATE;
+  self->delayed_conceal_timeout = g_timeout_add (CONCEAL_TIMEOUT,
+                                                 ide_source_map_do_conceal,
+                                                 self);
+
+  if (self->show_map == FALSE)
+    {
+      self->show_map = TRUE;
+      g_signal_emit (self, gSignals [SHOW_MAP], 0);
+    }
 }
 
 static gboolean
@@ -128,14 +137,35 @@ ide_source_map__leave_notify_event (IdeSourceMap     *self,
   g_assert (event != NULL);
   g_assert (GTK_IS_WIDGET (widget));
 
-  self->is_hiding = TRUE;
+  ide_source_map_show_map_and_queue_fade (self);
+
+  return GDK_EVENT_PROPAGATE;
+}
+
+static gboolean
+ide_source_map__motion_notify_event (IdeSourceMap   *self,
+                                     GdkEventMotion *motion,
+                                     GtkWidget      *widget)
+{
+  g_assert (IDE_IS_SOURCE_MAP (self));
+  g_assert (motion != NULL);
+  g_assert (GTK_IS_WIDGET (widget));
+
+  ide_source_map_show_map_and_queue_fade (self);
+
+  return GDK_EVENT_PROPAGATE;
+}
 
-  if (self->delayed_reveal_timeout != 0)
-    g_source_remove (self->delayed_reveal_timeout);
+static gboolean
+ide_source_map__scroll_event (IdeSourceMap   *self,
+                              GdkEventScroll *scroll,
+                              GtkWidget      *widget)
+{
+  g_assert (IDE_IS_SOURCE_MAP (self));
+  g_assert (scroll != NULL);
+  g_assert (GTK_IS_WIDGET (widget));
 
-  self->delayed_reveal_timeout = g_timeout_add (DELAYED_HIDE_TIMEOUT,
-                                                ide_source_map_do_reveal,
-                                                self);
+  ide_source_map_show_map_and_queue_fade (self);
 
   return GDK_EVENT_PROPAGATE;
 }
@@ -410,18 +440,26 @@ ide_source_map_set_view (IdeSourceMap  *self,
                                    G_CALLBACK (ide_source_map__view_notify_buffer),
                                    self,
                                    G_CONNECT_SWAPPED);
-
           g_signal_connect_object (view,
                                    "enter-notify-event",
                                    G_CALLBACK (ide_source_map__enter_notify_event),
                                    self,
                                    G_CONNECT_SWAPPED);
-
           g_signal_connect_object (view,
                                    "leave-notify-event",
                                    G_CALLBACK (ide_source_map__leave_notify_event),
                                    self,
                                    G_CONNECT_SWAPPED);
+          g_signal_connect_object (view,
+                                   "motion-notify-event",
+                                   G_CALLBACK (ide_source_map__motion_notify_event),
+                                   self,
+                                   G_CONNECT_SWAPPED);
+          g_signal_connect_object (view,
+                                   "scroll-event",
+                                   G_CALLBACK (ide_source_map__scroll_event),
+                                   self,
+                                   G_CONNECT_SWAPPED);
 
           buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));
           ide_source_map__buffer_notify_style_scheme (self, NULL, buffer);
@@ -787,10 +825,10 @@ ide_source_map_destroy (GtkWidget *widget)
 {
   IdeSourceMap *self = (IdeSourceMap *)widget;
 
-  if (self->delayed_reveal_timeout)
+  if (self->delayed_conceal_timeout)
     {
-      g_source_remove (self->delayed_reveal_timeout);
-      self->delayed_reveal_timeout = 0;
+      g_source_remove (self->delayed_conceal_timeout);
+      self->delayed_conceal_timeout = 0;
     }
 
   g_clear_object (&self->box_css_provider);
@@ -1014,6 +1052,16 @@ ide_source_map_init (IdeSourceMap *self)
                            G_CALLBACK (ide_source_map__leave_notify_event),
                            self,
                            G_CONNECT_SWAPPED);
+  g_signal_connect_object (self->overlay_box,
+                           "motion-notify-event",
+                           G_CALLBACK (ide_source_map__motion_notify_event),
+                           self,
+                           G_CONNECT_SWAPPED);
+  g_signal_connect_object (self->overlay_box,
+                           "scroll-event",
+                           G_CALLBACK (ide_source_map__scroll_event),
+                           self,
+                           G_CONNECT_SWAPPED);
 
   g_signal_connect_object (self->child_view,
                            "enter-notify-event",
@@ -1025,4 +1073,14 @@ ide_source_map_init (IdeSourceMap *self)
                            G_CALLBACK (ide_source_map__leave_notify_event),
                            self,
                            G_CONNECT_SWAPPED);
+  g_signal_connect_object (self->child_view,
+                           "motion-notify-event",
+                           G_CALLBACK (ide_source_map__motion_notify_event),
+                           self,
+                           G_CONNECT_SWAPPED);
+  g_signal_connect_object (self->child_view,
+                           "scroll-event",
+                           G_CALLBACK (ide_source_map__scroll_event),
+                           self,
+                           G_CONNECT_SWAPPED);
 }


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