[gnome-tetravex] Use GestureMultiPress.



commit 070b8fee7c479fe30ce5138a78f541d300a2a242
Author: Arnaud Bonatti <arnaud bonatti gmail com>
Date:   Thu Feb 20 21:04:23 2020 +0100

    Use GestureMultiPress.

 src/gnome-tetravex.vala | 36 ++++++++++++++-----------
 src/puzzle-view.vala    | 70 +++++++++++++++++++++++++++++--------------------
 2 files changed, 63 insertions(+), 43 deletions(-)
---
diff --git a/src/gnome-tetravex.vala b/src/gnome-tetravex.vala
index 5b5632b..70ec421 100644
--- a/src/gnome-tetravex.vala
+++ b/src/gnome-tetravex.vala
@@ -381,7 +381,8 @@ private class Tetravex : Gtk.Application
         view.vexpand = true;
         view.can_focus = true;
         view.show ();
-        view.button_release_event.connect (view_button_release_event);
+        view_click_controller = new GestureMultiPress (view);
+        view_click_controller.released.connect (on_release_on_view);
         settings.bind ("theme", view, "theme-id", SettingsBindFlags.GET | SettingsBindFlags.NO_SENSITIVITY);
 
         Overlay overlay = new Overlay ();
@@ -450,7 +451,8 @@ private class Tetravex : Gtk.Application
                                                     /* align end */ true,
                                                     sizegroup);
 
-        new_game_button.button_press_event.connect (() => { view.disable_highlight (); return false; });
+        new_game_button_click_controller = new GestureMultiPress (new_game_button);
+        new_game_button_click_controller.pressed.connect (on_new_game_button_click);
         new_game_solve_stack = new Stack ();
         new_game_solve_stack.add_named (solve_button, "solve");
         new_game_solve_stack.add_named (new_game_button, "new-game");
@@ -808,19 +810,6 @@ private class Tetravex : Gtk.Application
         scores_dialog_visible = false;
     }
 
-    private bool view_button_release_event (Widget widget, Gdk.EventButton event)
-    {
-        /* Cancel pause on click */
-        if (puzzle.paused)
-        {
-            puzzle.paused = false;
-            update_bottom_button_states ();
-            return true;
-        }
-
-        return false;
-    }
-
     private bool has_been_solved = false;
     private void solve_cb ()
     {
@@ -980,6 +969,23 @@ private class Tetravex : Gtk.Application
         return false;
     }
 
+    private GestureMultiPress new_game_button_click_controller;
+    private inline void on_new_game_button_click (GestureMultiPress _new_game_button_click_controller, int 
n_press, double event_x, double event_y)
+    {
+        view.disable_highlight ();
+    }
+
+    private GestureMultiPress view_click_controller;
+    private inline void on_release_on_view (GestureMultiPress _view_click_controller, int n_press, double 
event_x, double event_y)
+    {
+        /* Cancel pause on click */
+        if (puzzle.paused)
+        {
+            puzzle.paused = false;
+            update_bottom_button_states ();
+        }
+    }
+
     /*\
     * * help/about
     \*/
diff --git a/src/puzzle-view.vala b/src/puzzle-view.vala
index d781b11..ec4f976 100644
--- a/src/puzzle-view.vala
+++ b/src/puzzle-view.vala
@@ -193,6 +193,7 @@ private class PuzzleView : Gtk.DrawingArea
 
     construct
     {
+        init_mouse ();
         init_keyboard ();
 
         set_events (Gdk.EventMask.EXPOSURE_MASK
@@ -671,48 +672,64 @@ private class PuzzleView : Gtk.DrawingArea
         assert_not_reached ();
     }
 
+    /*\
+    * * mouse user actions
+    \*/
+
+    private Gtk.GestureMultiPress click_controller;         // for keeping in memory
+
+    private void init_mouse ()  // called on construct
+    {
+        click_controller = new Gtk.GestureMultiPress (this);
+        click_controller.pressed.connect (on_click);
+        click_controller.released.connect (on_release);
+    }
+
     [CCode (notify = false)] internal bool mouse_use_extra_buttons  { private get; internal set; default = 
true; }
     [CCode (notify = false)] internal int  mouse_back_button        { private get; internal set; default = 
8; }
     [CCode (notify = false)] internal int  mouse_forward_button     { private get; internal set; default = 
9; }
 
-    protected override bool button_press_event (Gdk.EventButton event)
+    private inline void on_click (Gtk.GestureMultiPress _click_controller, int n_press, double event_x, 
double event_y)
     {
         if (puzzle.paused || puzzle.is_solved)
-            return false;
+            return;
         clear_keyboard_highlight (/* only selection */ false);
 
-        if (event.button == Gdk.BUTTON_PRIMARY || event.button == Gdk.BUTTON_SECONDARY)
-            return main_button_pressed (event);
+        uint button = _click_controller.get_button ();
+        if (button == Gdk.BUTTON_PRIMARY || button == Gdk.BUTTON_SECONDARY)
+        {
+            main_button_pressed (n_press, event_x, event_y);
+            return;
+        }
 
         if (!mouse_use_extra_buttons)
-            return false;
-        if (event.button == mouse_back_button)
+            return;
+        if (button == mouse_back_button)
             undo ();
-        else if (event.button == mouse_forward_button)
+        else if (button == mouse_forward_button)
             redo ();
-        return false;
     }
 
-    private inline bool main_button_pressed (Gdk.EventButton event)
+    private inline void main_button_pressed (int n_press, double event_x, double event_y)
     {
         if (puzzle.is_solved)   // security
-            return false;
+            return;
 
-        if (event.type == Gdk.EventType.BUTTON_PRESS)
+        if (n_press == 1)
         {
             if (selected_tile == null)
-                pick_tile (event.x, event.y);
+                pick_tile (event_x, event_y);
             else
-                drop_tile (event.x, event.y);
+                drop_tile (event_x, event_y);
         }
-        else if (event.type == Gdk.EventType.DOUBLE_BUTTON_PRESS)
+        else
         {
             bool had_selected_tile = selected_tile != null;
 
             /* Move tile from left to right on double click */
-            pick_tile (event.x, event.y);
+            pick_tile (event_x, event_y);
             if (selected_tile == null)
-                return false;
+                return;
 
             if (on_right_half (((!) selected_tile).x))
             {
@@ -727,15 +744,15 @@ private class PuzzleView : Gtk.DrawingArea
                     else    /* consider double click as a single click */
                     {
                         if (had_selected_tile)
-                            drop_tile (event.x, event.y);
-                        return false;
+                            drop_tile (event_x, event_y);
+                        return;
                     }
                 }
                 else        /* consider double click as a single click */
                 {
                     if (had_selected_tile)
-                        drop_tile (event.x, event.y);
-                    return false;
+                        drop_tile (event_x, event_y);
+                    return;
                 }
             }
             else if (!had_selected_tile)
@@ -744,25 +761,22 @@ private class PuzzleView : Gtk.DrawingArea
             selected_tile = null;
             tile_selected = false;
         }
-
-        return false;
     }
 
-    protected override bool button_release_event (Gdk.EventButton event)
+    private inline void on_release (Gtk.GestureMultiPress _click_controller, int n_press, double event_x, 
double event_y)
     {
         if (puzzle.paused || puzzle.is_solved)
-            return false;
+            return;
         clear_keyboard_highlight (/* only selection */ false);
 
-        if ((event.button == Gdk.BUTTON_PRIMARY || event.button == Gdk.BUTTON_SECONDARY)
+        uint button = _click_controller.get_button ();
+        if ((button == Gdk.BUTTON_PRIMARY || button == Gdk.BUTTON_SECONDARY)
          && selected_tile != null && selection_timeout == 0)
-            drop_tile (event.x, event.y);
+            drop_tile (event_x, event_y);
 
         if (selection_timeout != 0)
             Source.remove (selection_timeout);
         selection_timeout = 0;
-
-        return false;
     }
 
     protected override bool motion_notify_event (Gdk.EventMotion event)


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