From 0dbb301e167292f728a845625556f2bef4699022 Mon Sep 17 00:00:00 2001 From: Shawn Rutledge Date: Wed, 31 Aug 2016 15:01:45 +0200 Subject: QQuickPointerEvent and EventPoint: add localize(QQuickItem *) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit During delivery we need to call QQuickItem::mapFromScene(point->scenePos()) so let's do it as early as possible and store the result right in the EventPoint. That way the pos() property can be made available, for the benefit of QML/JS signal handlers and also for C++ handlers. Change-Id: I2706ffd6bc51a449eeba64f69c9ffdfb913c5ca6 Reviewed-by: Jan Arve Sæther --- src/quick/items/qquickevents.cpp | 19 +++++++++++++++++++ src/quick/items/qquickevents_p_p.h | 7 +++++++ src/quick/items/qquickwindow.cpp | 6 +++--- 3 files changed, 29 insertions(+), 3 deletions(-) (limited to 'src/quick/items') diff --git a/src/quick/items/qquickevents.cpp b/src/quick/items/qquickevents.cpp index 45e2fd3e73..c3156d0328 100644 --- a/src/quick/items/qquickevents.cpp +++ b/src/quick/items/qquickevents.cpp @@ -529,6 +529,14 @@ void QQuickEventPoint::reset(Qt::TouchPointState state, const QPointF &scenePos, m_velocity = velocity; } +void QQuickEventPoint::localize(QQuickItem *target) +{ + if (target) + m_pos = target->mapFromScene(scenePos()); + else + m_pos = QPointF(); +} + QObject *QQuickEventPoint::grabber() const { return m_grabber.data(); @@ -638,6 +646,11 @@ QQuickPointerEvent *QQuickPointerMouseEvent::reset(QEvent *event) return this; } +void QQuickPointerMouseEvent::localize(QQuickItem *target) +{ + m_mousePoint->localize(target); +} + QQuickPointerEvent *QQuickPointerTouchEvent::reset(QEvent *event) { auto ev = static_cast(event); @@ -682,6 +695,12 @@ QQuickPointerEvent *QQuickPointerTouchEvent::reset(QEvent *event) return this; } +void QQuickPointerTouchEvent::localize(QQuickItem *target) +{ + for (auto point : qAsConst(m_touchPoints)) + point->localize(target); +} + QQuickEventPoint *QQuickPointerMouseEvent::point(int i) const { if (i == 0) return m_mousePoint; diff --git a/src/quick/items/qquickevents_p_p.h b/src/quick/items/qquickevents_p_p.h index 66393170ac..1c524e9e3b 100644 --- a/src/quick/items/qquickevents_p_p.h +++ b/src/quick/items/qquickevents_p_p.h @@ -250,6 +250,7 @@ private: class Q_QUICK_PRIVATE_EXPORT QQuickEventPoint : public QObject { Q_OBJECT + Q_PROPERTY(QPointF pos READ pos) Q_PROPERTY(QPointF scenePos READ scenePos) Q_PROPERTY(QPointF scenePressPos READ scenePressPos) Q_PROPERTY(QPointF sceneGrabPos READ sceneGrabPos) @@ -273,10 +274,12 @@ public: QQuickEventPoint(QQuickPointerEvent *parent); void reset(Qt::TouchPointState state, const QPointF &scenePos, quint64 pointId, ulong timestamp, const QVector2D &velocity = QVector2D()); + void localize(QQuickItem *target); void invalidate() { m_valid = false; } QQuickPointerEvent *pointerEvent() const; + QPointF pos() const { return m_pos; } QPointF scenePos() const { return m_scenePos; } QPointF scenePressPos() const { return m_scenePressPos; } QPointF sceneGrabPos() const { return m_sceneGrabPos; } @@ -297,6 +300,7 @@ public: void setPointerHandlerGrabber(QQuickPointerHandler *grabber); private: + QPointF m_pos; QPointF m_scenePos; QPointF m_scenePressPos; QPointF m_sceneGrabPos; @@ -365,6 +369,7 @@ public: // property accessors public: // helpers for C++ only (during event delivery) virtual QQuickPointerEvent *reset(QEvent *ev) = 0; + virtual void localize(QQuickItem *target) = 0; virtual bool isPressEvent() const = 0; virtual QQuickPointerMouseEvent *asPointerMouseEvent() { return nullptr; } @@ -404,6 +409,7 @@ public: : QQuickPointerEvent(parent), m_mousePoint(new QQuickEventPoint(this)) { } QQuickPointerEvent *reset(QEvent *) override; + void localize(QQuickItem *target) override; bool isPressEvent() const override; QQuickPointerMouseEvent *asPointerMouseEvent() override { return this; } const QQuickPointerMouseEvent *asPointerMouseEvent() const override { return this; } @@ -433,6 +439,7 @@ public: { } QQuickPointerEvent *reset(QEvent *) override; + void localize(QQuickItem *target) override; bool isPressEvent() const override; QQuickPointerTouchEvent *asPointerTouchEvent() override { return this; } const QQuickPointerTouchEvent *asPointerTouchEvent() const override { return this; } diff --git a/src/quick/items/qquickwindow.cpp b/src/quick/items/qquickwindow.cpp index 24943cb49d..20d4b3c5f6 100644 --- a/src/quick/items/qquickwindow.cpp +++ b/src/quick/items/qquickwindow.cpp @@ -2252,6 +2252,7 @@ bool QQuickWindowPrivate::deliverMatchingPointsToItem(QQuickItem *item, QQuickPo { Q_Q(QQuickWindow); QQuickItemPrivate *itemPrivate = QQuickItemPrivate::get(item); + pointerEvent->localize(item); // Let the Item's handlers (if any) have the event first. itemPrivate->handlePointerEvent(pointerEvent); @@ -2264,9 +2265,8 @@ bool QQuickWindowPrivate::deliverMatchingPointsToItem(QQuickItem *item, QQuickPo auto point = event->point(0); if (point->isAccepted()) return false; - QPointF localPos = item->mapFromScene(point->scenePos()); - Q_ASSERT(item->contains(localPos)); // transform is checked already - QMouseEvent *me = event->asMouseEvent(localPos); + Q_ASSERT(item->contains(point->pos())); // transform is checked already + QMouseEvent *me = event->asMouseEvent(point->pos()); me->accept(); q->sendEvent(item, me); if (me->isAccepted()) { -- cgit v1.2.3