aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/handlers
diff options
context:
space:
mode:
Diffstat (limited to 'src/quick/handlers')
-rw-r--r--src/quick/handlers/qquickpinchhandler.cpp42
-rw-r--r--src/quick/handlers/qquickpinchhandler_p.h3
-rw-r--r--src/quick/handlers/qquicksinglepointhandler.cpp2
-rw-r--r--src/quick/handlers/qquicktaphandler.cpp11
4 files changed, 31 insertions, 27 deletions
diff --git a/src/quick/handlers/qquickpinchhandler.cpp b/src/quick/handlers/qquickpinchhandler.cpp
index e6442e7258..a0fec37443 100644
--- a/src/quick/handlers/qquickpinchhandler.cpp
+++ b/src/quick/handlers/qquickpinchhandler.cpp
@@ -99,7 +99,7 @@ QQuickPinchHandler::QQuickPinchHandler(QQuickItem *parent)
*/
void QQuickPinchHandler::setMinimumScale(qreal minimumScale)
{
- if (m_minimumScale == minimumScale)
+ if (qFuzzyCompare(m_minimumScale, minimumScale))
return;
m_minimumScale = minimumScale;
@@ -114,7 +114,7 @@ void QQuickPinchHandler::setMinimumScale(qreal minimumScale)
*/
void QQuickPinchHandler::setMaximumScale(qreal maximumScale)
{
- if (m_maximumScale == maximumScale)
+ if (qFuzzyCompare(m_maximumScale, maximumScale))
return;
m_maximumScale = maximumScale;
@@ -129,7 +129,7 @@ void QQuickPinchHandler::setMaximumScale(qreal maximumScale)
*/
void QQuickPinchHandler::setMinimumRotation(qreal minimumRotation)
{
- if (m_minimumRotation == minimumRotation)
+ if (qFuzzyCompare(m_minimumRotation, minimumRotation))
return;
m_minimumRotation = minimumRotation;
@@ -144,7 +144,7 @@ void QQuickPinchHandler::setMinimumRotation(qreal minimumRotation)
*/
void QQuickPinchHandler::setMaximumRotation(qreal maximumRotation)
{
- if (m_maximumRotation == maximumRotation)
+ if (qFuzzyCompare(m_maximumRotation, maximumRotation))
return;
m_maximumRotation = maximumRotation;
@@ -158,7 +158,7 @@ void QQuickPinchHandler::setMaximumRotation(qreal maximumRotation)
*/
void QQuickPinchHandler::setMinimumX(qreal minX)
{
- if (m_minimumX == minX)
+ if (qFuzzyCompare(m_minimumX, minX))
return;
m_minimumX = minX;
emit minimumXChanged();
@@ -171,7 +171,7 @@ void QQuickPinchHandler::setMinimumX(qreal minX)
*/
void QQuickPinchHandler::setMaximumX(qreal maxX)
{
- if (m_maximumX == maxX)
+ if (qFuzzyCompare(m_maximumX, maxX))
return;
m_maximumX = maxX;
emit maximumXChanged();
@@ -184,7 +184,7 @@ void QQuickPinchHandler::setMaximumX(qreal maxX)
*/
void QQuickPinchHandler::setMinimumY(qreal minY)
{
- if (m_minimumY == minY)
+ if (qFuzzyCompare(m_minimumY, minY))
return;
m_minimumY = minY;
emit minimumYChanged();
@@ -197,7 +197,7 @@ void QQuickPinchHandler::setMinimumY(qreal minY)
*/
void QQuickPinchHandler::setMaximumY(qreal maxY)
{
- if (m_maximumY == maxY)
+ if (qFuzzyCompare(m_maximumY, maxY))
return;
m_maximumY = maxY;
emit maximumYChanged();
@@ -258,10 +258,10 @@ void QQuickPinchHandler::onActiveChanged()
m_startScale = t->scale(); // TODO incompatible with independent x/y scaling
m_startRotation = t->rotation();
QVector3D xformOrigin(t->transformOriginPoint());
- m_startMatrix.translate(t->x(), t->y());
+ m_startMatrix.translate(float(t->x()), float(t->y()));
m_startMatrix.translate(xformOrigin);
- m_startMatrix.scale(m_startScale);
- m_startMatrix.rotate(m_startRotation, 0, 0, -1);
+ m_startMatrix.scale(float(m_startScale));
+ m_startMatrix.rotate(float(m_startRotation), 0, 0, -1);
m_startMatrix.translate(-xformOrigin);
} else {
m_startScale = m_accumulatedScale;
@@ -377,9 +377,9 @@ void QQuickPinchHandler::handlePointerEventImpl(QQuickPointerEvent *event)
QVector2D centroidRelativeMovement = currentCentroidRelativePosition - pressCentroidRelativePosition;
accumulatedMovementMagnitude += centroidRelativeMovement.length();
- accumulatedCentroidDistance += pressCentroidRelativePosition.length();
+ accumulatedCentroidDistance += qreal(pressCentroidRelativePosition.length());
if (event->isPressEvent())
- m_accumulatedStartCentroidDistance += (QVector2D(point->scenePressPosition()) - pressCentroid).length();
+ m_accumulatedStartCentroidDistance += qreal((QVector2D(point->scenePressPosition()) - pressCentroid).length());
} else {
setPassiveGrab(point);
}
@@ -400,7 +400,7 @@ void QQuickPinchHandler::handlePointerEventImpl(QQuickPointerEvent *event)
if (!yAxis()->enabled())
avgDrag.setY(0);
- const qreal centroidMovementDelta = (currentCentroid - pressCentroid).length();
+ const qreal centroidMovementDelta = qreal((currentCentroid - pressCentroid).length());
qreal distanceToCentroidDelta = qAbs(accumulatedCentroidDistance - m_accumulatedStartCentroidDistance); // Used to detect scale
if (numberOfPointsDraggedOverThreshold >= 1) {
@@ -451,17 +451,13 @@ void QQuickPinchHandler::handlePointerEventImpl(QQuickPointerEvent *event)
// 3. Drag/translate
const QPointF centroidStartParentPos = target()->parentItem()->mapFromScene(m_centroid.sceneGrabPosition());
m_activeTranslation = QVector2D(centroidParentPos - centroidStartParentPos);
- if (!xAxis()->enabled())
- m_activeTranslation.setX(0);
- if (!yAxis()->enabled())
- m_activeTranslation.setY(0);
// apply rotation + scaling around the centroid - then apply translation.
QMatrix4x4 mat;
const QVector3D centroidParentVector(centroidParentPos);
mat.translate(centroidParentVector);
- mat.rotate(m_activeRotation, 0, 0, 1);
- mat.scale(m_activeScale);
+ mat.rotate(float(m_activeRotation), 0, 0, 1);
+ mat.scale(float(m_activeScale));
mat.translate(-centroidParentVector);
mat.translate(QVector3D(m_activeTranslation));
@@ -473,14 +469,16 @@ void QQuickPinchHandler::handlePointerEventImpl(QQuickPointerEvent *event)
if (xAxis()->enabled())
pos.setX(qBound(xAxis()->minimum(), pos.x(), xAxis()->maximum()));
+ else
+ pos.rx() -= qreal(m_activeTranslation.x());
if (yAxis()->enabled())
pos.setY(qBound(yAxis()->minimum(), pos.y(), yAxis()->maximum()));
+ else
+ pos.ry() -= qreal(m_activeTranslation.y());
target()->setPosition(pos);
target()->setRotation(rotation);
target()->setScale(m_accumulatedScale);
-
- // TODO some translation inadvertently happens; try to hold the chosen pinch origin in place
} else {
m_activeTranslation = QVector2D(m_centroid.scenePosition() - m_centroid.scenePressPosition());
}
diff --git a/src/quick/handlers/qquickpinchhandler_p.h b/src/quick/handlers/qquickpinchhandler_p.h
index 8f24d18166..b9e2cbf48f 100644
--- a/src/quick/handlers/qquickpinchhandler_p.h
+++ b/src/quick/handlers/qquickpinchhandler_p.h
@@ -150,10 +150,9 @@ private:
qreal m_startDistance = 0;
QPointF m_startPos;
qreal m_accumulatedStartCentroidDistance = 0;
-
QVector<PointData> m_startAngles;
- QMatrix4x4 m_startMatrix;
QQuickMatrix4x4 m_transform;
+ QMatrix4x4 m_startMatrix;
};
QT_END_NAMESPACE
diff --git a/src/quick/handlers/qquicksinglepointhandler.cpp b/src/quick/handlers/qquicksinglepointhandler.cpp
index 8f2f403975..c0fa39fad3 100644
--- a/src/quick/handlers/qquicksinglepointhandler.cpp
+++ b/src/quick/handlers/qquicksinglepointhandler.cpp
@@ -115,7 +115,7 @@ bool QQuickSinglePointHandler::wantsPointerEvent(QQuickPointerEvent *event)
int candidatePointCount = 0;
int c = event->pointCount();
QQuickEventPoint *chosen = nullptr;
- for (int i = 0; i < c; ++i) {
+ for (int i = 0; i < c && !chosen; ++i) {
QQuickEventPoint *p = event->point(i);
if (!p->exclusiveGrabber() && wantsEventPoint(p)) {
if (!chosen)
diff --git a/src/quick/handlers/qquicktaphandler.cpp b/src/quick/handlers/qquicktaphandler.cpp
index d480d3b491..475942b7ac 100644
--- a/src/quick/handlers/qquicktaphandler.cpp
+++ b/src/quick/handlers/qquicktaphandler.cpp
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2017 The Qt Company Ltd.
+** Copyright (C) 2019 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtQuick module of the Qt Toolkit.
@@ -38,6 +38,7 @@
****************************************************************************/
#include "qquicktaphandler_p.h"
+#include "qquicksinglepointhandler_p_p.h"
#include <qpa/qplatformtheme.h>
#include <private/qguiapplication_p.h>
#include <QtGui/qstylehints.h>
@@ -312,8 +313,14 @@ void QQuickTapHandler::setPressed(bool press, bool cancel, QQuickEventPoint *poi
// on release, ungrab after emitting changed signals
setExclusiveGrab(point, press);
}
- if (cancel)
+ if (cancel) {
emit canceled(point);
+ setExclusiveGrab(point, false);
+ // In case there is a filtering parent (Flickable), we should not give up the passive grab,
+ // so that it can continue to filter future events.
+ d_func()->reset();
+ emit pointChanged();
+ }
}
}