aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorShawn Rutledge <shawn.rutledge@qt.io>2016-08-31 15:01:45 +0200
committerShawn Rutledge <shawn.rutledge@qt.io>2016-09-02 21:38:40 +0000
commit0dbb301e167292f728a845625556f2bef4699022 (patch)
tree7a527f05410363a84f99d1e41a22b35621144c49 /src
parent856332456d9f289a05bc039cfa4e875f21441207 (diff)
QQuickPointerEvent and EventPoint: add localize(QQuickItem *)
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 <jan-arve.saether@theqtcompany.com>
Diffstat (limited to 'src')
-rw-r--r--src/quick/items/qquickevents.cpp19
-rw-r--r--src/quick/items/qquickevents_p_p.h7
-rw-r--r--src/quick/items/qquickwindow.cpp6
3 files changed, 29 insertions, 3 deletions
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<QTouchEvent*>(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()) {