From 9db0a074bbad5b5f1f29f22b0e39e8fb3f108a32 Mon Sep 17 00:00:00 2001
From: Paul Wisbey
Date: Thu, 22 May 2014 18:45:52 +0100
Subject: [PATCH] Fix for flick gesture in Screen Reader mode
[problem] Flick gestures do not work with 2 fingers
[cause] Incorrect velocity calculation
[solution] Use correct 'previous position' in Gesture::Finished event
---
.../internal/focus-manager/focus-manager-impl.cpp | 12 ++++++++++--
.../internal/focus-manager/focus-manager-impl.h | 2 ++
2 files changed, 12 insertions(+), 2 deletions(-)
diff --git a/base/dali-toolkit/internal/focus-manager/focus-manager-impl.cpp b/base/dali-toolkit/internal/focus-manager/focus-manager-impl.cpp
index a52d48022a..2ca17e5060 100644
--- a/base/dali-toolkit/internal/focus-manager/focus-manager-impl.cpp
+++ b/base/dali-toolkit/internal/focus-manager/focus-manager-impl.cpp
@@ -877,13 +877,21 @@ bool FocusManager::HandlePanGesture(const Integration::PanGestureEvent& panEvent
}
}
+ // Gesture::Finished (Up) events are delivered with previous (Motion) event position
+ // Use the real previous position; otherwise we may incorrectly get a ZERO velocity
+ if ( Gesture::Finished != panEvent.state )
+ {
+ // Store the previous position for next Gesture::Finished iteration.
+ mPreviousPosition = panEvent.previousPosition;
+ }
+
Actor rootActor = Stage::GetCurrent().GetRootLayer();
Dali::PanGesture pan(panEvent.state);
pan.time = panEvent.time;
pan.numberOfTouches = panEvent.numberOfTouches;
pan.screenPosition = panEvent.currentPosition;
- pan.screenDisplacement = panEvent.previousPosition - panEvent.currentPosition;
+ pan.screenDisplacement = mPreviousPosition - panEvent.currentPosition;
pan.screenVelocity.x = pan.screenDisplacement.x / panEvent.timeDelta;
pan.screenVelocity.y = pan.screenDisplacement.y / panEvent.timeDelta;
@@ -898,7 +906,7 @@ bool FocusManager::HandlePanGesture(const Integration::PanGestureEvent& panEvent
pan.position = localCurrent;
Vector2 localPrevious;
- control.ScreenToLocal( localPrevious.x, localPrevious.y, panEvent.previousPosition.x, panEvent.previousPosition.y );
+ control.ScreenToLocal( localPrevious.x, localPrevious.y, mPreviousPosition.x, mPreviousPosition.y );
pan.displacement = localCurrent - localPrevious;
pan.velocity.x = pan.displacement.x / panEvent.timeDelta;
diff --git a/base/dali-toolkit/internal/focus-manager/focus-manager-impl.h b/base/dali-toolkit/internal/focus-manager/focus-manager-impl.h
index de2cd39c2a..c69557c2e8 100644
--- a/base/dali-toolkit/internal/focus-manager/focus-manager-impl.h
+++ b/base/dali-toolkit/internal/focus-manager/focus-manager-impl.h
@@ -386,6 +386,8 @@ private:
Actor mFocusIndicatorActor; ///< The focus indicator actor shared by all the focusable actors for highlight
+ Vector2 mPreviousPosition; ///< The previous pan position; useful for calculating velocity for Gesture::Finished events
+
unsigned int mRecursiveFocusMoveCounter; ///< The counter to count the number of recursive focus movement attempted before the focus movement is successful.
bool mIsAccessibilityTtsEnabled; ///< Whether accessibility feature(screen-reader) turned on/off
--
2.34.1