[eog/wip/gestures: 3/3] EogWindow: handle pan gestures to switch to next/prev image



commit 7007bae78a2f3cdb0af7c5f8bd7b4a7ebf94b656
Author: Carlos Garnacho <carlosg gnome org>
Date:   Mon May 5 21:10:18 2014 +0200

    EogWindow: handle pan gestures to switch to next/prev image
    
    This has been implemented in the window where there is a knowledge about
    EogThumbView, and image navigation. A GtkGesturePan is set on the
    EogScrollView into its own group. If horizontal swipes happen and the
    scrollview has no scrollbars, the gesture is consumed to handle "switch
    to next/prev image".

 src/eog-window.c |   72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 72 insertions(+), 0 deletions(-)
---
diff --git a/src/eog-window.c b/src/eog-window.c
index 5c0a12a..361d2cc 100644
--- a/src/eog-window.c
+++ b/src/eog-window.c
@@ -104,6 +104,12 @@ typedef enum {
        EOG_WINDOW_STATUS_NORMAL
 } EogWindowStatus;
 
+typedef enum {
+       EOG_PAN_ACTION_NONE,
+       EOG_PAN_ACTION_NEXT,
+       EOG_PAN_ACTION_PREV
+} EogPanAction;
+
 enum {
        PROP_0,
        PROP_GALLERY_POS,
@@ -185,6 +191,9 @@ struct _EogWindowPrivate {
 
        PeasExtensionSet    *extensions;
 
+       GtkGesture          *pan_gesture;
+       EogPanAction         pan_action;
+
 #ifdef HAVE_LCMS
         cmsHPROFILE         *display_profile;
 #endif
@@ -4833,6 +4842,57 @@ eog_window_add_open_editor_action (EogWindow *window)
 }
 
 static void
+pan_gesture_pan_cb (GtkGesturePan   *gesture,
+                   GtkPanDirection  direction,
+                   gdouble          offset,
+                   EogWindow       *window)
+{
+       EogWindowPrivate *priv;
+
+       priv = window->priv;
+
+       if (eog_scroll_view_scrollbars_visible (priv->view)) {
+               gtk_gesture_set_state (GTK_GESTURE (gesture),
+                                      GTK_EVENT_SEQUENCE_DENIED);
+               return;
+       }
+
+#define PAN_ACTION_DISTANCE 200
+
+       priv->pan_action = EOG_PAN_ACTION_NONE;
+       gtk_gesture_set_state (GTK_GESTURE (gesture), GTK_EVENT_SEQUENCE_CLAIMED);
+
+       if (offset > PAN_ACTION_DISTANCE) {
+               if (direction == GTK_PAN_DIRECTION_LEFT ||
+                   gtk_widget_get_direction (GTK_WIDGET (window)) == GTK_TEXT_DIR_RTL)
+                       priv->pan_action = EOG_PAN_ACTION_NEXT;
+               else
+                       priv->pan_action = EOG_PAN_ACTION_PREV;
+       }
+#undef PAN_ACTION_DISTANCE
+}
+
+static void
+pan_gesture_end_cb (GtkGesture       *gesture,
+                   GdkEventSequence *sequence,
+                   EogWindow        *window)
+{
+       EogWindowPrivate *priv;
+
+       if (!gtk_gesture_handles_sequence (gesture, sequence))
+               return;
+
+       priv = window->priv;
+
+       if (priv->pan_action == EOG_PAN_ACTION_PREV)
+               eog_window_cmd_go_prev (NULL, window);
+       else if (priv->pan_action == EOG_PAN_ACTION_NEXT)
+               eog_window_cmd_go_next (NULL, window);
+
+       priv->pan_action = EOG_PAN_ACTION_NONE;
+}
+
+static void
 eog_window_construct_ui (EogWindow *window)
 {
        EogWindowPrivate *priv;
@@ -5032,6 +5092,12 @@ eog_window_construct_ui (EogWindow *window)
        priv->overlay = gtk_overlay_new();
 
        priv->view = eog_scroll_view_new ();
+       priv->pan_gesture = gtk_gesture_pan_new (priv->view, GTK_PAN_ORIENTATION_HORIZONTAL);
+       gtk_gesture_attach (priv->pan_gesture, GTK_PHASE_CAPTURE);
+       g_signal_connect (priv->pan_gesture, "pan",
+                         G_CALLBACK (pan_gesture_pan_cb), window);
+       g_signal_connect (priv->pan_gesture, "end",
+                         G_CALLBACK (pan_gesture_end_cb), window);
 
        gtk_container_add (GTK_CONTAINER(priv->overlay), priv->view);
 
@@ -5273,6 +5339,12 @@ eog_window_dispose (GObject *object)
                priv->fullscreen_popup = NULL;
        }
 
+       if (priv->pan_gesture) {
+               gtk_gesture_detach (priv->pan_gesture);
+               g_object_unref (priv->pan_gesture);
+               priv->pan_gesture = NULL;
+       }
+
        slideshow_clear_timeout (window);
        eog_window_uninhibit_screensaver (window);
 


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