From a5be5c703808817dda8feafb03b0aec04b20afbb Mon Sep 17 00:00:00 2001 From: Mikko Rasa Date: Sat, 21 Nov 2015 10:34:01 +0200 Subject: [PATCH] Combine swipe gestures into a single drag gesture This makes them more versatile for different kinds of control schemes. Directional swipes can still be approximated through the Control interface. Capturing swipe gestures is no longer easily possible, but the capture interface is due for a rewrite to support activator controls anyway. --- source/input/gesturedetector.cpp | 40 +++++++++----------------------- source/input/gesturedetector.h | 7 ++---- 2 files changed, 13 insertions(+), 34 deletions(-) diff --git a/source/input/gesturedetector.cpp b/source/input/gesturedetector.cpp index d626c5d..cc02797 100644 --- a/source/input/gesturedetector.cpp +++ b/source/input/gesturedetector.cpp @@ -26,14 +26,8 @@ GestureDetector::GestureDetector(Touchscreen &ts): string GestureDetector::get_button_name(unsigned btn) const { - if(btn==GESTURE_SWIPE_DOWN) - return "Swipe down"; - else if(btn==GESTURE_SWIPE_UP) - return "Swipe up"; - else if(btn==GESTURE_SWIPE_LEFT) - return "Swipe left"; - else if(btn==GESTURE_SWIPE_RIGHT) - return "Swipe right"; + if(btn==GESTURE_DRAG) + return "Drag"; else if(btn==GESTURE_PINCH) return "Pinch"; else @@ -153,20 +147,10 @@ void GestureDetector::start_gesture() } else { - // Allow a maximum deviation of about 26° to recognize a swipe gesture. - if(abs(p.x)>2*abs(p.y)) - current_gesture = (p.x>0 ? GESTURE_SWIPE_RIGHT : GESTURE_SWIPE_LEFT); - else if(abs(p.y)>2*abs(p.x)) - current_gesture = (p.y>0 ? GESTURE_SWIPE_UP : GESTURE_SWIPE_DOWN); - else - invalid_gesture = true; - - if(current_gesture!=GESTURE_NONE) - { - active_points = 1; - set_axis_value(0, p.down_x, true); - set_axis_value(1, p.down_y, true); - } + current_gesture = GESTURE_DRAG; + active_points = 1; + set_axis_value(0, p.down_x, true); + set_axis_value(1, p.down_y, true); } update_progress(); @@ -179,14 +163,11 @@ void GestureDetector::update_progress() { TouchPoint &p = points[0]; - if(current_gesture==GESTURE_SWIPE_DOWN) - set_axis_value(2, -p.y, true); - else if(current_gesture==GESTURE_SWIPE_UP) - set_axis_value(2, p.y, true); - else if(current_gesture==GESTURE_SWIPE_LEFT) - set_axis_value(2, -p.x, true); - else if(current_gesture==GESTURE_SWIPE_RIGHT) + if(current_gesture==GESTURE_DRAG) + { set_axis_value(2, p.x, true); + set_axis_value(3, p.y, true); + } else if(current_gesture==GESTURE_PINCH) { TouchPoint &p2 = points[1]; @@ -197,6 +178,7 @@ void GestureDetector::update_progress() float dx = ddx+p.x-p2.x; float dy = ddy+p.y-p2.y; set_axis_value(2, sqrt(dx*dx+dy*dy)/sqrt(ddx*ddx+ddy*ddy)-1, true); + set_axis_value(3, 0, true); } } diff --git a/source/input/gesturedetector.h b/source/input/gesturedetector.h index b2d0d4f..fdd083d 100644 --- a/source/input/gesturedetector.h +++ b/source/input/gesturedetector.h @@ -11,17 +11,14 @@ class Touchscreen; enum Gesture { GESTURE_NONE, - GESTURE_SWIPE_DOWN, - GESTURE_SWIPE_UP, - GESTURE_SWIPE_LEFT, - GESTURE_SWIPE_RIGHT, + GESTURE_DRAG, GESTURE_PINCH }; /** Interprets events from a Touchscreen as high-level gestures. One button is provided for each type of gesture. Axes 0 and 1 indicate the starting position -of the gesture; axis 2 tracks its progress. The progress axis may exhibit +of the gesture; axes 2 and 3 track its progress. The progress axis may exhibit absolute values greater than one. */ class GestureDetector: public Device -- 2.43.0