summaryrefslogtreecommitdiffstats
path: root/src/widgets/kernel/qstandardgestures.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/widgets/kernel/qstandardgestures.cpp')
-rw-r--r--src/widgets/kernel/qstandardgestures.cpp26
1 files changed, 15 insertions, 11 deletions
diff --git a/src/widgets/kernel/qstandardgestures.cpp b/src/widgets/kernel/qstandardgestures.cpp
index d19e473d18..d7589cc594 100644
--- a/src/widgets/kernel/qstandardgestures.cpp
+++ b/src/widgets/kernel/qstandardgestures.cpp
@@ -53,7 +53,7 @@ QGesture *QPanGestureRecognizer::create(QObject *target)
{
if (target && target->isWidgetType()) {
#if (defined(Q_OS_MACX) || defined(Q_OS_WIN)) && !defined(QT_NO_NATIVE_GESTURES)
- // for scroll areas on Windows and Mac OS X we want to use native gestures instead
+ // for scroll areas on Windows and OS X we want to use native gestures instead
if (!qobject_cast<QAbstractScrollArea *>(target->parent()))
static_cast<QWidget *>(target)->setAttribute(Qt::WA_AcceptTouchEvents);
#else
@@ -334,23 +334,27 @@ QGestureRecognizer::Result QSwipeGestureRecognizer::recognize(QGesture *state,
d->swipeAngle = QLineF(p1.startScreenPos(), p1.screenPos()).angle();
static const int MoveThreshold = 50;
+ static const int directionChangeThreshold = MoveThreshold / 8;
if (qAbs(xDistance) > MoveThreshold || qAbs(yDistance) > MoveThreshold) {
// measure the distance to check if the direction changed
d->lastPositions[0] = p1.screenPos().toPoint();
d->lastPositions[1] = p2.screenPos().toPoint();
d->lastPositions[2] = p3.screenPos().toPoint();
- QSwipeGesture::SwipeDirection horizontal =
- xDistance > 0 ? QSwipeGesture::Right : QSwipeGesture::Left;
- QSwipeGesture::SwipeDirection vertical =
- yDistance > 0 ? QSwipeGesture::Down : QSwipeGesture::Up;
- if (d->verticalDirection == QSwipeGesture::NoDirection)
+ result = QGestureRecognizer::TriggerGesture;
+ // QTBUG-46195, small changes in direction should not cause the gesture to be canceled.
+ if (d->verticalDirection == QSwipeGesture::NoDirection || qAbs(yDistance) > directionChangeThreshold) {
+ const QSwipeGesture::SwipeDirection vertical = yDistance > 0
+ ? QSwipeGesture::Down : QSwipeGesture::Up;
+ if (d->verticalDirection != QSwipeGesture::NoDirection && d->verticalDirection != vertical)
+ result = QGestureRecognizer::CancelGesture;
d->verticalDirection = vertical;
- if (d->horizontalDirection == QSwipeGesture::NoDirection)
+ }
+ if (d->horizontalDirection == QSwipeGesture::NoDirection || qAbs(xDistance) > directionChangeThreshold) {
+ const QSwipeGesture::SwipeDirection horizontal = xDistance > 0
+ ? QSwipeGesture::Right : QSwipeGesture::Left;
+ if (d->horizontalDirection != QSwipeGesture::NoDirection && d->horizontalDirection != horizontal)
+ result = QGestureRecognizer::CancelGesture;
d->horizontalDirection = horizontal;
- if (d->verticalDirection != vertical || d->horizontalDirection != horizontal) {
- result = QGestureRecognizer::CancelGesture;
- } else {
- result = QGestureRecognizer::TriggerGesture;
}
} else {
if (q->state() != Qt::NoGesture)