[gnome-builder] view-stack: add swipe gestures to view stack



commit bc26db1f23395c07c762437fc7e21cccb26add07
Author: Christian Hergert <christian hergert me>
Date:   Tue Aug 25 16:00:35 2015 -0700

    view-stack: add swipe gestures to view stack
    
    I feel that this interacts poorly with the GtkTextView selection grips,
    but it does get us started in the right direction.
    
    Longer term, I imagine we'll either make GtkStack allow to scroll multiple
    child views, or write our own widget to do that. Then we can get more
    appropriate slide transitions.

 src/views/gb-view-stack-private.h |    1 +
 src/views/gb-view-stack.c         |   29 +++++++++++++++++++++++++++++
 2 files changed, 30 insertions(+), 0 deletions(-)
---
diff --git a/src/views/gb-view-stack-private.h b/src/views/gb-view-stack-private.h
index 298ad38..a09389e 100644
--- a/src/views/gb-view-stack-private.h
+++ b/src/views/gb-view-stack-private.h
@@ -30,6 +30,7 @@ struct _GbViewStack
 
   GList              *focus_history;
   IdeBackForwardList *back_forward_list;
+  GtkGesture         *swipe_gesture;
 
   /* Weak references */
   GtkWidget          *active_view;
diff --git a/src/views/gb-view-stack.c b/src/views/gb-view-stack.c
index 88867a6..53c5a33 100644
--- a/src/views/gb-view-stack.c
+++ b/src/views/gb-view-stack.c
@@ -399,6 +399,26 @@ gb_view_stack__views_listbox_row_activated_cb (GbViewStack   *self,
 }
 
 static void
+gb_view_stack_swipe (GbViewStack     *self,
+                     gdouble          velocity_x,
+                     gdouble          velocity_y,
+                     GtkGestureSwipe *gesture)
+{
+  g_assert (GB_IS_VIEW_STACK (self));
+  g_assert (GTK_IS_GESTURE_SWIPE (gesture));
+
+  if (ABS (velocity_x) > ABS (velocity_y))
+    {
+      if (velocity_x < 0)
+        gb_widget_activate_action (GTK_WIDGET (self), "view-stack", "previous-view", NULL);
+      else if (velocity_x > 0)
+        gb_widget_activate_action (GTK_WIDGET (self), "view-stack", "next-view", NULL);
+    }
+
+  g_print ("SWIPE: %lf %lf\n", velocity_x, velocity_y);
+}
+
+static void
 gb_view_stack_destroy (GtkWidget *widget)
 {
   GbViewStack *self = (GbViewStack *)widget;
@@ -434,6 +454,7 @@ gb_view_stack_finalize (GObject *object)
   ide_clear_weak_pointer (&self->title_binding);
   ide_clear_weak_pointer (&self->active_view);
   g_clear_object (&self->back_forward_list);
+  g_clear_object (&self->swipe_gesture);
 
   G_OBJECT_CLASS (gb_view_stack_parent_class)->finalize (object);
 }
@@ -549,6 +570,14 @@ gb_view_stack_init (GbViewStack *self)
                            self,
                            G_CONNECT_SWAPPED);
 
+  self->swipe_gesture = gtk_gesture_swipe_new (GTK_WIDGET (self));
+  gtk_gesture_single_set_touch_only (GTK_GESTURE_SINGLE (self->swipe_gesture), TRUE);
+  g_signal_connect_object (self->swipe_gesture,
+                           "swipe",
+                           G_CALLBACK (gb_view_stack_swipe),
+                           self,
+                           G_CONNECT_SWAPPED);
+
   /*
    * FIXME:
    *


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