X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Finput%2Fgesturedetector.cpp;h=98e3ff30522bdf6de8fbe7a8b052ddbadb54f92d;hb=1b33313502f837e2b0d02d3f2d129c85a8c66064;hp=d626c5d08efc6dcbd909083651045c7f056c98db;hpb=2d8e49766252749ef586ffd988c9858666c01995;p=libs%2Fgui.git diff --git a/source/input/gesturedetector.cpp b/source/input/gesturedetector.cpp index d626c5d..98e3ff3 100644 --- a/source/input/gesturedetector.cpp +++ b/source/input/gesturedetector.cpp @@ -12,6 +12,7 @@ GestureDetector::GestureDetector(Touchscreen &ts): touchscreen(ts), current_gesture(GESTURE_NONE), active_points(0), + pending_tap(GESTURE_NONE), invalid_gesture(false) { name = "Gesture"; @@ -26,16 +27,14 @@ 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_DRAG_2) + return "Two-finger drag"; else if(btn==GESTURE_PINCH) return "Pinch"; + else if(btn==GESTURE_ROTATE) + return "Rotate"; else return Device::get_button_name(btn); } @@ -64,6 +63,14 @@ void GestureDetector::touch_down(unsigned btn) p.x = 0; p.y = 0; p.threshold_exceeded = false; + + if(current_gesture==GESTURE_NONE && !invalid_gesture) + { + if(btn==0) + pending_tap = GESTURE_TAP; + else if(btn==1) + pending_tap = GESTURE_TAP_2; + } } void GestureDetector::touch_up(unsigned btn) @@ -85,6 +92,16 @@ void GestureDetector::touch_up(unsigned btn) invalid_gesture = false; for(unsigned i=0; (i((pending_tap-GESTURE_TAP)+1, MAX_POINTS); + set_gesture_location((1<=1) + { p.threshold_exceeded = true; + pending_tap = GESTURE_NONE; + } if(current_gesture==GESTURE_NONE && !invalid_gesture) start_gesture(); @@ -141,53 +161,67 @@ void GestureDetector::start_gesture() /* If the points moved away from or towards each other without rotating significantly, it's a pinch gesture. */ current_gesture = GESTURE_PINCH; - else - invalid_gesture = true; + else if(turn*turn2>0 && abs(turn)>abs(away) && abs(turn2)>abs(away2)) + /* If the points both turned in the same direction without significant + changes in distance, it's a rotate gesture. */ + current_gesture = GESTURE_ROTATE; + else if((p.x*p2.x+p.y*p2.y)>2*abs(p.x*p2.y-p.y*p2.x)) + // If both points moved in the same direction, it's a two-finger drag. + current_gesture = GESTURE_DRAG_2; if(current_gesture!=GESTURE_NONE) - { active_points = 3; - set_axis_value(0, (p.down_x+p2.down_x)/2, true); - set_axis_value(1, (p.down_y+p2.down_y)/2, true); - } } 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; } - update_progress(); if(current_gesture!=GESTURE_NONE) + { + set_gesture_location(active_points); + update_progress(); set_button_state(current_gesture, true, true); + } + else + invalid_gesture = true; +} + +void GestureDetector::set_gesture_location(unsigned mask) +{ + float x = 0; + float y = 0; + unsigned count = 0; + for(unsigned i=0; i