[gnome-tetravex] Use GestureMultiPress.
- From: Arnaud B. <arnaudb src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-tetravex] Use GestureMultiPress.
- Date: Mon, 9 Mar 2020 22:33:46 +0000 (UTC)
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]