From 5d4f488bf30f5650051d6cc226a75dbd17cd9a70 Mon Sep 17 00:00:00 2001 From: Jan Arve Saether Date: Fri, 24 Feb 2017 16:42:47 +0100 Subject: Move properties into grouped "point" property Change-Id: I80000110a2e0ca69210322a0fcc587d86158358e Reviewed-by: Shawn Rutledge --- src/quick/handlers/qquickdraghandler.cpp | 2 +- src/quick/handlers/qquickpointersinglehandler.cpp | 95 +++++++++++----------- src/quick/handlers/qquickpointersinglehandler_p.h | 99 +++++++++++++---------- src/quick/handlers/qquicktaphandler.cpp | 4 +- 4 files changed, 109 insertions(+), 91 deletions(-) (limited to 'src/quick') diff --git a/src/quick/handlers/qquickdraghandler.cpp b/src/quick/handlers/qquickdraghandler.cpp index 27edffd65a..b41e1f6c9d 100644 --- a/src/quick/handlers/qquickdraghandler.cpp +++ b/src/quick/handlers/qquickdraghandler.cpp @@ -69,7 +69,7 @@ QQuickDragHandler::~QQuickDragHandler() bool QQuickDragHandler::wantsEventPoint(QQuickEventPoint *point) { // If we've already been interested in a point, stay interested, even if it has strayed outside bounds. - return ((point->state() != QQuickEventPoint::Pressed && pointId() == point->pointId()) + return ((point->state() != QQuickEventPoint::Pressed && this->point().id() == point->pointId()) || QQuickPointerSingleHandler::wantsEventPoint(point)); } diff --git a/src/quick/handlers/qquickpointersinglehandler.cpp b/src/quick/handlers/qquickpointersinglehandler.cpp index 80632303f1..40a99b0e99 100644 --- a/src/quick/handlers/qquickpointersinglehandler.cpp +++ b/src/quick/handlers/qquickpointersinglehandler.cpp @@ -52,9 +52,6 @@ Q_DECLARE_LOGGING_CATEGORY(DBG_TOUCH_TARGET) QQuickPointerSingleHandler::QQuickPointerSingleHandler(QObject *parent) : QQuickPointerDeviceHandler(parent) - , m_pointId(0) - , m_rotation(0) - , m_pressure(0) , m_acceptedButtons(Qt::LeftButton) , m_ignoreAdditionalPoints(false) { @@ -68,7 +65,7 @@ bool QQuickPointerSingleHandler::wantsPointerEvent(QQuickPointerEvent *event) (event->buttons() & m_acceptedButtons) == 0 && (event->button() & m_acceptedButtons) == 0) return false; - if (m_pointId) { + if (m_pointInfo.m_id) { // We already know which one we want, so check whether it's there. // It's expected to be an update or a release. // If we no longer want it, cancel the grab. @@ -79,7 +76,7 @@ bool QQuickPointerSingleHandler::wantsPointerEvent(QQuickPointerEvent *event) QQuickEventPoint *p = event->point(i); if (wantsEventPoint(p)) { ++candidatePointCount; - if (p->pointId() == m_pointId) + if (p->pointId() == m_pointInfo.m_id) point = p; } } @@ -91,7 +88,7 @@ bool QQuickPointerSingleHandler::wantsPointerEvent(QQuickPointerEvent *event) point->cancelAllGrabs(this); } } else { - qCWarning(DBG_TOUCH_TARGET) << this << "pointId" << hex << m_pointId + qCWarning(DBG_TOUCH_TARGET) << this << "pointId" << hex << m_pointInfo.m_id << "is missing from current event, but was neither canceled nor released"; return false; } @@ -109,56 +106,56 @@ bool QQuickPointerSingleHandler::wantsPointerEvent(QQuickPointerEvent *event) } } if (chosen && candidatePointCount == 1) { - m_pointId = chosen->pointId(); + m_pointInfo.m_id = chosen->pointId(); chosen->setAccepted(); } } - return m_pointId; + return m_pointInfo.m_id; } void QQuickPointerSingleHandler::handlePointerEventImpl(QQuickPointerEvent *event) { QQuickPointerDeviceHandler::handlePointerEventImpl(event); - QQuickEventPoint *currentPoint = event->pointById(m_pointId); + QQuickEventPoint *currentPoint = event->pointById(m_pointInfo.m_id); Q_ASSERT(currentPoint); - if (!m_pointId || !currentPoint->isAccepted()) { + if (!m_pointInfo.m_id || !currentPoint->isAccepted()) { reset(); } else { if (event->asPointerTouchEvent()) { QQuickEventTouchPoint *tp = static_cast(currentPoint); - m_uniquePointId = tp->uniqueId(); - m_rotation = tp->rotation(); - m_pressure = tp->pressure(); - m_ellipseDiameters = tp->ellipseDiameters(); + m_pointInfo.m_uniqueId = tp->uniqueId(); + m_pointInfo.m_rotation = tp->rotation(); + m_pointInfo.m_pressure = tp->pressure(); + m_pointInfo.m_ellipseDiameters = tp->ellipseDiameters(); } else if (event->asPointerTabletEvent()) { // TODO } else { - m_uniquePointId = event->device()->uniqueId(); - m_rotation = 0; - m_pressure = event->buttons() ? 1 : 0; - m_ellipseDiameters = QSizeF(); + m_pointInfo.m_uniqueId = event->device()->uniqueId(); + m_pointInfo.m_rotation = 0; + m_pointInfo.m_pressure = event->buttons() ? 1 : 0; + m_pointInfo.m_ellipseDiameters = QSizeF(); } - m_pos = currentPoint->pos(); + m_pointInfo.m_position = currentPoint->pos(); + m_pointInfo.m_scenePosition = currentPoint->scenePos(); if (currentPoint->state() == QQuickEventPoint::Updated) - m_velocity = currentPoint->velocity(); + m_pointInfo.m_velocity = currentPoint->velocity(); handleEventPoint(currentPoint); switch (currentPoint->state()) { case QQuickEventPoint::Pressed: - m_pressPos = currentPoint->pos(); - m_scenePressPos = currentPoint->scenePos(); - setPressedButtons(event->buttons()); - emit pointIdChanged(); + m_pointInfo.m_pressPosition = currentPoint->pos(); + m_pointInfo.m_scenePressPosition = currentPoint->scenePos(); + m_pointInfo.m_pressedButtons = event->buttons(); break; case QQuickEventPoint::Released: setExclusiveGrab(currentPoint, false); reset(); break; default: - setPressedButtons(event->buttons()); + m_pointInfo.m_pressedButtons = event->buttons(); break; } + emit pointChanged(); } - emit eventPointHandled(); } bool QQuickPointerSingleHandler::wantsEventPoint(QQuickEventPoint *point) @@ -172,12 +169,12 @@ void QQuickPointerSingleHandler::onGrabChanged(QQuickPointerHandler *grabber, QQ return; switch (stateChange) { case QQuickEventPoint::GrabExclusive: - m_sceneGrabPos = point->sceneGrabPos(); + m_pointInfo.m_sceneGrabPosition = point->sceneGrabPos(); setActive(true); QQuickPointerHandler::onGrabChanged(grabber, stateChange, point); break; case QQuickEventPoint::GrabPassive: - m_sceneGrabPos = point->sceneGrabPos(); + m_pointInfo.m_sceneGrabPosition = point->sceneGrabPos(); QQuickPointerHandler::onGrabChanged(grabber, stateChange, point); break; case QQuickEventPoint::OverrideGrabPassive: @@ -202,15 +199,8 @@ void QQuickPointerSingleHandler::setIgnoreAdditionalPoints(bool v) void QQuickPointerSingleHandler::moveTarget(QPointF pos, QQuickEventPoint *point) { target()->setPosition(pos); - m_pos = target()->mapFromScene(point->scenePos()); -} - -void QQuickPointerSingleHandler::setPressedButtons(Qt::MouseButtons buttons) -{ - if (buttons != m_pressedButtons) { - m_pressedButtons = buttons; - emit pressedButtonsChanged(); - } + m_pointInfo.m_scenePosition = point->scenePos(); + m_pointInfo.m_position = target()->mapFromScene(m_pointInfo.m_scenePosition); } void QQuickPointerSingleHandler::setAcceptedButtons(Qt::MouseButtons buttons) @@ -225,20 +215,31 @@ void QQuickPointerSingleHandler::setAcceptedButtons(Qt::MouseButtons buttons) void QQuickPointerSingleHandler::reset() { setActive(false); - bool pointIdChange = m_pointId != 0; - m_pointId = 0; - m_uniquePointId = QPointingDeviceUniqueId(); - m_pos = QPointF(); - m_pressPos = QPointF(); - m_scenePressPos = QPointF(); - m_sceneGrabPos = QPointF(); + m_pointInfo.reset(); +} + +QQuickHandlerPoint::QQuickHandlerPoint() + : m_id(0) + , m_rotation(0) + , m_pressure(0) +{} + +void QQuickHandlerPoint::reset() +{ + m_id = 0; + m_uniqueId = QPointingDeviceUniqueId(); + m_position = QPointF(); + m_scenePosition = QPointF(); + m_pressPosition = QPointF(); + m_scenePressPosition = QPointF(); + m_sceneGrabPosition = QPointF(); m_velocity = QVector2D(); m_rotation = 0; m_pressure = 0; m_ellipseDiameters = QSizeF(); - setPressedButtons(Qt::NoButton); - if (pointIdChange) - emit pointIdChanged(); + m_pressedButtons = Qt::NoButton; } +int g_metaTypeId = qRegisterMetaType(); + QT_END_NAMESPACE diff --git a/src/quick/handlers/qquickpointersinglehandler_p.h b/src/quick/handlers/qquickpointersinglehandler_p.h index 06b8ec45dc..635c9e0a77 100644 --- a/src/quick/handlers/qquickpointersinglehandler_p.h +++ b/src/quick/handlers/qquickpointersinglehandler_p.h @@ -55,47 +55,74 @@ QT_BEGIN_NAMESPACE +class QQuickPointerSingleHandler; + +class Q_QUICK_PRIVATE_EXPORT QQuickHandlerPoint { + Q_PROPERTY(int id READ id) + Q_PROPERTY(QPointingDeviceUniqueId uniqueId READ uniqueId) + Q_PROPERTY(QPointF position READ position) + Q_PROPERTY(QPointF scenePosition READ scenePosition) + Q_PROPERTY(QPointF pressPosition READ pressPosition) + Q_PROPERTY(QPointF scenePressPosition READ scenePressPosition) + Q_PROPERTY(QPointF sceneGrabPosition READ sceneGrabPosition) + Q_PROPERTY(Qt::MouseButtons pressedButtons READ pressedButtons) + Q_PROPERTY(QVector2D velocity READ velocity) + Q_PROPERTY(qreal rotation READ rotation) + Q_PROPERTY(qreal pressure READ pressure) + Q_PROPERTY(QSizeF ellipseDiameters READ ellipseDiameters) + Q_GADGET + +public: + QQuickHandlerPoint(); + + int id() const { return m_id; } + Qt::MouseButtons pressedButtons() const { return m_pressedButtons; } + QPointF pressPosition() const { return m_pressPosition; } + QPointF scenePressPosition() const { return m_scenePressPosition; } + QPointF sceneGrabPosition() const { return m_sceneGrabPosition; } + QPointF position() const { return m_position; } + QPointF scenePosition() const { return m_scenePosition; } + QVector2D velocity() const { return m_velocity; } + qreal rotation() const { return m_rotation; } + qreal pressure() const { return m_pressure; } + QSizeF ellipseDiameters() const { return m_ellipseDiameters; } + QPointingDeviceUniqueId uniqueId() const { return m_uniqueId; } + +private: + void reset(); + int m_id; + QPointingDeviceUniqueId m_uniqueId; + Qt::MouseButtons m_pressedButtons; + QPointF m_position; + QPointF m_scenePosition; + QPointF m_pressPosition; + QPointF m_scenePressPosition; + QPointF m_sceneGrabPosition; + QVector2D m_velocity; + qreal m_rotation; + qreal m_pressure; + QSizeF m_ellipseDiameters; + friend class QQuickPointerSingleHandler; +}; + class Q_QUICK_PRIVATE_EXPORT QQuickPointerSingleHandler : public QQuickPointerDeviceHandler { Q_OBJECT - Q_PROPERTY(int pointId READ pointId NOTIFY pointIdChanged) - Q_PROPERTY(QPointingDeviceUniqueId uniquePointId READ uniquePointId NOTIFY pointIdChanged) - Q_PROPERTY(QPointF pos READ pos NOTIFY eventPointHandled) - Q_PROPERTY(QPointF scenePos READ scenePos NOTIFY eventPointHandled) - Q_PROPERTY(QPointF pressPos READ pressPos NOTIFY pressedButtonsChanged) - Q_PROPERTY(QPointF scenePressPos READ scenePressPos NOTIFY pressedButtonsChanged) - Q_PROPERTY(QPointF sceneGrabPos READ sceneGrabPos NOTIFY singlePointGrabChanged) - Q_PROPERTY(Qt::MouseButtons pressedButtons READ pressedButtons NOTIFY pressedButtonsChanged) - Q_PROPERTY(QVector2D velocity READ velocity NOTIFY eventPointHandled) - Q_PROPERTY(qreal rotation READ rotation NOTIFY eventPointHandled) - Q_PROPERTY(qreal pressure READ pressure NOTIFY eventPointHandled) - Q_PROPERTY(QSizeF ellipseDiameters READ ellipseDiameters NOTIFY eventPointHandled) Q_PROPERTY(Qt::MouseButtons acceptedButtons READ acceptedButtons WRITE setAcceptedButtons NOTIFY acceptedButtonsChanged) + Q_PROPERTY(QQuickHandlerPoint point READ point NOTIFY pointChanged) public: explicit QQuickPointerSingleHandler(QObject *parent = 0); virtual ~QQuickPointerSingleHandler() { } - int pointId() const { return m_pointId; } - Qt::MouseButtons pressedButtons() const { return m_pressedButtons; } Qt::MouseButtons acceptedButtons() const { return m_acceptedButtons; } void setAcceptedButtons(Qt::MouseButtons buttons); - QPointF pressPos() const { return m_pressPos; } - QPointF scenePressPos() const { return m_scenePressPos; } - QPointF sceneGrabPos() const { return m_sceneGrabPos; } - QPointF pos() const { return m_pos; } - QPointF scenePos() const { return parentItem()->mapToScene(m_pos); } - QVector2D velocity() const { return m_velocity; } - qreal rotation() const { return m_rotation; } - qreal pressure() const { return m_pressure; } - QSizeF ellipseDiameters() const { return m_ellipseDiameters; } - QPointingDeviceUniqueId uniquePointId() const { return m_uniquePointId; } + + QQuickHandlerPoint point() const { return m_pointInfo; } Q_SIGNALS: - void pointIdChanged(); - void pressedButtonsChanged(); - void acceptedButtonsChanged(); + void pointChanged(); void singlePointGrabChanged(); // QQuickPointerHandler::grabChanged signal can't be a property notifier here - void eventPointHandled(); + void acceptedButtonsChanged(); protected: bool wantsPointerEvent(QQuickPointerEvent *event) override; @@ -103,7 +130,7 @@ protected: void handlePointerEventImpl(QQuickPointerEvent *event) override; virtual void handleEventPoint(QQuickEventPoint *point) = 0; - QQuickEventPoint *currentPoint(QQuickPointerEvent *ev) { return ev->pointById(m_pointId); } + QQuickEventPoint *currentPoint(QQuickPointerEvent *ev) { return ev->pointById(m_pointInfo.m_id); } void onGrabChanged(QQuickPointerHandler *grabber, QQuickEventPoint::GrabState stateChange, QQuickEventPoint *point) override; void setIgnoreAdditionalPoints(bool v = true); @@ -111,27 +138,17 @@ protected: void moveTarget(QPointF pos, QQuickEventPoint *point); private: - void setPressedButtons(Qt::MouseButtons buttons); void reset(); private: - int m_pointId; - QPointingDeviceUniqueId m_uniquePointId; - Qt::MouseButtons m_pressedButtons; - QPointF m_pos; - QPointF m_pressPos; - QPointF m_scenePressPos; - QPointF m_sceneGrabPos; - QVector2D m_velocity; - qreal m_rotation; - qreal m_pressure; - QSizeF m_ellipseDiameters; + QQuickHandlerPoint m_pointInfo; Qt::MouseButtons m_acceptedButtons; bool m_ignoreAdditionalPoints : 1; }; QT_END_NAMESPACE +QML_DECLARE_TYPE(QQuickHandlerPoint) QML_DECLARE_TYPE(QQuickPointerSingleHandler) #endif // QQUICKPOINTERSINGLEHANDLER_H diff --git a/src/quick/handlers/qquicktaphandler.cpp b/src/quick/handlers/qquicktaphandler.cpp index d73e9fd100..272c6de000 100644 --- a/src/quick/handlers/qquicktaphandler.cpp +++ b/src/quick/handlers/qquicktaphandler.cpp @@ -128,7 +128,7 @@ bool QQuickTapHandler::wantsEventPoint(QQuickEventPoint *point) ret = parentContains(point); break; case ReleaseWithinBounds: - ret = point->pointId() == pointId(); + ret = point->pointId() == this->point().id(); break; } break; @@ -143,7 +143,7 @@ bool QQuickTapHandler::wantsEventPoint(QQuickEventPoint *point) // so onGrabChanged(this, CancelGrabExclusive, point) and setPressed(false) will be called. // But when m_gesturePolicy is DragThreshold, we don't get an exclusive grab, but // we still don't want to be pressed anymore. - if (!ret && point->pointId() == pointId() && point->state() != QQuickEventPoint::Stationary) + if (!ret && point->pointId() == this->point().id() && point->state() != QQuickEventPoint::Stationary) setPressed(false, true, point); return ret; } -- cgit v1.2.3