diff options
author | Frederik Gladhorn <frederik.gladhorn@theqtcompany.com> | 2016-07-21 11:35:42 +0200 |
---|---|---|
committer | Frederik Gladhorn <frederik.gladhorn@qt.io> | 2016-07-21 14:14:56 +0000 |
commit | a5e7897dd7705a9df3a97e5de75b5b95d6a88e25 (patch) | |
tree | 39cbb88f5c25194b87f8124ae88e0c57e526d5b8 | |
parent | c856d877e77048701182cc0e5ae275c398e55166 (diff) |
Improve encapsuation of touch/mouse event specific things
This makes it easy to avoid casts when using the classes.
Change-Id: I27bd1244bffb3a7d2cdb4572c229333e4c499d9b
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
-rw-r--r-- | src/quick/items/qquickevents.cpp | 30 | ||||
-rw-r--r-- | src/quick/items/qquickevents_p_p.h | 24 | ||||
-rw-r--r-- | src/quick/items/qquickwindow.cpp | 13 | ||||
-rw-r--r-- | tests/auto/quick/qquickwindow/tst_qquickwindow.cpp | 17 |
4 files changed, 41 insertions, 43 deletions
diff --git a/src/quick/items/qquickevents.cpp b/src/quick/items/qquickevents.cpp index cb48255c4e..e4a080d2b7 100644 --- a/src/quick/items/qquickevents.cpp +++ b/src/quick/items/qquickevents.cpp @@ -506,26 +506,6 @@ QQuickPointerEvent *QQuickPointerTouchEvent::reset(QEvent *event) { return this; } -/*! - \internal - Returns the original touch event, or nullptr if it was not a touch event. -*/ -QTouchEvent *QQuickPointerEvent::asTouchEvent() const { - if (!isTouchEvent()) - return nullptr; - return static_cast<QTouchEvent *>(m_event); -} - -/*! - \internal - Returns the original mouse event, or nullptr if it was not a mouse event. -*/ -QMouseEvent *QQuickPointerEvent::asMouseEvent() const { - if (isMouseEvent()) - return static_cast<QMouseEvent *>(m_event); - return nullptr; -} - QQuickEventPoint *QQuickPointerMouseEvent::point(int i) const { if (i == 0) return m_mousePoint; @@ -554,6 +534,11 @@ bool QQuickPointerMouseEvent::allPointsAccepted() const { return m_mousePoint->isAccepted(); } +QMouseEvent *QQuickPointerMouseEvent::asMouseEvent() const +{ + return static_cast<QMouseEvent *>(m_event); +} + bool QQuickPointerTouchEvent::allPointsAccepted() const { for (int i = 0; i < m_pointCount; ++i) { if (!m_touchPoints.at(i)->isAccepted()) @@ -704,6 +689,11 @@ QTouchEvent *QQuickPointerTouchEvent::touchEventForItem(const QList<const QQuick return touchEvent; } +QTouchEvent *QQuickPointerTouchEvent::asTouchEvent() const +{ + return static_cast<QTouchEvent *>(m_event); +} + #ifndef QT_NO_DEBUG_STREAM Q_QUICK_PRIVATE_EXPORT QDebug operator<<(QDebug dbg, const QQuickPointerDevice *dev) { diff --git a/src/quick/items/qquickevents_p_p.h b/src/quick/items/qquickevents_p_p.h index 123d5e5280..9e37955914 100644 --- a/src/quick/items/qquickevents_p_p.h +++ b/src/quick/items/qquickevents_p_p.h @@ -64,6 +64,8 @@ QT_BEGIN_NAMESPACE class QQuickItem; class QQuickPointerDevice; class QQuickPointerEvent; +class QQuickPointerMouseEvent; +class QQuickPointerTabletEvent; class QQuickPointerTouchEvent; class QQuickKeyEvent : public QObject @@ -346,12 +348,12 @@ public: // property accessors public: // helpers for C++ only (during event delivery) virtual QQuickPointerEvent *reset(QEvent *ev) = 0; - QTouchEvent *asTouchEvent() const; - QMouseEvent *asMouseEvent() const; - - virtual bool isMouseEvent() const { return false; } - virtual bool isTouchEvent() const { return false; } - virtual bool isTabletEvent() const { return false; } + virtual QQuickPointerMouseEvent *asPointerMouseEvent() { return nullptr; } + virtual QQuickPointerTouchEvent *asPointerTouchEvent() { return nullptr; } + virtual QQuickPointerTabletEvent *asPointerTabletEvent() { return nullptr; } + virtual const QQuickPointerMouseEvent *asPointerMouseEvent() const { return nullptr; } + virtual const QQuickPointerTouchEvent *asPointerTouchEvent() const { return nullptr; } + virtual const QQuickPointerTabletEvent *asPointerTabletEvent() const { return nullptr; } bool isValid() const { return m_event != nullptr; } virtual bool allPointsAccepted() const = 0; @@ -379,12 +381,15 @@ public: } QQuickPointerEvent *reset(QEvent *) override; - bool isMouseEvent() const override { return true; } + QQuickPointerMouseEvent *asPointerMouseEvent() override { return this; } + const QQuickPointerMouseEvent *asPointerMouseEvent() const override { return this; } int pointCount() const override { return 1; } QQuickEventPoint *point(int i) const override; QQuickEventPoint *pointById(quint64 pointId) const override; bool allPointsAccepted() const override; + QMouseEvent *asMouseEvent() const; + private: QQuickEventPoint *m_mousePoint; }; @@ -397,7 +402,8 @@ public: {} QQuickPointerEvent *reset(QEvent *) override; - bool isTouchEvent() const override { return true; } + QQuickPointerTouchEvent *asPointerTouchEvent() override { return this; } + const QQuickPointerTouchEvent *asPointerTouchEvent() const override { return this; } int pointCount() const override { return m_pointCount; } QQuickEventPoint *point(int i) const override; QQuickEventPoint *pointById(quint64 pointId) const override; @@ -407,6 +413,8 @@ public: QMouseEvent *syntheticMouseEvent(int pointID, QQuickItem *relativeTo) const; QTouchEvent *touchEventForItem(const QList<const QQuickEventPoint *> &newPoints, QQuickItem *relativeTo) const; + QTouchEvent *asTouchEvent() const; + private: int m_pointCount; QVector<QQuickEventTouchPoint *> m_touchPoints; diff --git a/src/quick/items/qquickwindow.cpp b/src/quick/items/qquickwindow.cpp index 2210194114..0c88c511eb 100644 --- a/src/quick/items/qquickwindow.cpp +++ b/src/quick/items/qquickwindow.cpp @@ -2174,9 +2174,9 @@ void QQuickWindowPrivate::deliverPointerEvent(QQuickPointerEvent *event) // the usecase a bit evil, but we at least don't want to lose events. ++pointerEventRecursionGuard; - if (QMouseEvent *mouse = event->asMouseEvent()) { - deliverMouseEvent(mouse); - } else if (event->isTouchEvent()) { + if (QQuickPointerMouseEvent *mouse = event->asPointerMouseEvent()) { + deliverMouseEvent(mouse->asMouseEvent()); + } else if (event->asPointerTouchEvent()) { deliverTouchEvent(event); } else { Q_ASSERT(false); @@ -2217,7 +2217,7 @@ QVector<QQuickItem *> QQuickWindowPrivate::pointerTargets(QQuickItem *item, cons void QQuickWindowPrivate::deliverTouchEvent(QQuickPointerEvent *event) { - qCDebug(DBG_TOUCH) << " - delivering" << event->asTouchEvent(); + qCDebug(DBG_TOUCH) << " - delivering" << event->asPointerTouchEvent()->asTouchEvent(); // List of all items that received an event before // When we have TouchBegin this is and will stay empty @@ -2365,7 +2365,8 @@ bool QQuickWindowPrivate::deliverMatchingPointsToItem(QQuickItem *item, const QQ const QSet<quint64> &matchingNewPoints, const QList<const QQuickEventPoint *> &matchingPoints, QSet<QQuickItem *> *hasFiltered) { - auto pointerTouchEvent = static_cast<const QQuickPointerTouchEvent*>(event); + auto pointerTouchEvent = event->asPointerTouchEvent(); + Q_ASSERT(pointerTouchEvent); QScopedPointer<QTouchEvent> touchEvent(pointerTouchEvent->touchEventForItem(matchingPoints, item)); if (touchEvent.data()->touchPoints().isEmpty()) return false; @@ -2375,7 +2376,7 @@ bool QQuickWindowPrivate::deliverMatchingPointsToItem(QQuickItem *item, const QQ // First check whether the parent wants to be a filter, // and if the parent accepts the event we are done. - if (sendFilteredTouchEvent(item->parentItem(), item, event->asTouchEvent(), hasFiltered)) { + if (sendFilteredTouchEvent(item->parentItem(), item, pointerTouchEvent->asTouchEvent(), hasFiltered)) { // If the touch was accepted (regardless by whom or in what form), // update acceptedNewPoints qCDebug(DBG_TOUCH) << " - can't. intercepted " << touchEvent.data() << " to " << item->parentItem() << " instead of " << item; diff --git a/tests/auto/quick/qquickwindow/tst_qquickwindow.cpp b/tests/auto/quick/qquickwindow/tst_qquickwindow.cpp index 18f1b28b02..1e1197637b 100644 --- a/tests/auto/quick/qquickwindow/tst_qquickwindow.cpp +++ b/tests/auto/quick/qquickwindow/tst_qquickwindow.cpp @@ -2329,21 +2329,20 @@ void tst_qquickwindow::pointerEventTypeAndPointCount() QQuickPointerMouseEvent pme; pme.reset(&me); QVERIFY(pme.isValid()); - QVERIFY(pme.isMouseEvent()); - QVERIFY(!pme.isTouchEvent()); - QVERIFY(!pme.isTabletEvent()); - QVERIFY(pme.asMouseEvent()); - QVERIFY(!pme.asTouchEvent()); + QCOMPARE(pme.asMouseEvent(), &me); + QVERIFY(pme.asPointerMouseEvent()); + QVERIFY(!pme.asPointerTouchEvent()); + QVERIFY(!pme.asPointerTabletEvent()); // QVERIFY(!pe->asTabletEvent()); // TODO QCOMPARE(pme.pointCount(), 1); QQuickPointerTouchEvent pte; pte.reset(&te); QVERIFY(pte.isValid()); - QVERIFY(!pte.isMouseEvent()); - QVERIFY(pte.isTouchEvent()); - QVERIFY(!pte.isTabletEvent()); - QVERIFY(!pte.asMouseEvent()); + QCOMPARE(pte.asTouchEvent(), &te); + QVERIFY(!pte.asPointerMouseEvent()); + QVERIFY(pte.asPointerTouchEvent()); + QVERIFY(!pte.asPointerTabletEvent()); QVERIFY(pte.asTouchEvent()); // QVERIFY(!pte.asTabletEvent()); // TODO QCOMPARE(pte.pointCount(), 1); |