diff options
-rw-r--r-- | src/gui/kernel/qevent.cpp | 50 | ||||
-rw-r--r-- | src/gui/kernel/qevent.h | 12 | ||||
-rw-r--r-- | tests/auto/gui/kernel/qmouseevent/tst_qmouseevent.cpp | 15 | ||||
-rw-r--r-- | tests/auto/gui/kernel/qtouchevent/tst_qtouchevent.cpp | 34 |
4 files changed, 111 insertions, 0 deletions
diff --git a/src/gui/kernel/qevent.cpp b/src/gui/kernel/qevent.cpp index 517233482f..ea831f9a40 100644 --- a/src/gui/kernel/qevent.cpp +++ b/src/gui/kernel/qevent.cpp @@ -362,6 +362,30 @@ QSinglePointEvent::QSinglePointEvent(QEvent::Type type, const QPointingDevice *d } /*! + Returns true if this event represents a \l {button()}{button} being pressed. +*/ +bool QSinglePointEvent::isPressEvent() const +{ + return m_button != Qt::NoButton && m_mouseState.testFlag(m_button); +} + +/*! + Returns true if this event does not include a change in \l {buttons()}{button state}. +*/ +bool QSinglePointEvent::isUpdateEvent() const +{ + return m_button == Qt::NoButton; +} + +/*! + Returns true if this event represents a \l {button()}{button} being released. +*/ +bool QSinglePointEvent::isReleaseEvent() const +{ + return m_button != Qt::NoButton && !m_mouseState.testFlag(m_button); +} + +/*! \fn QPointingDevice::PointerType QPointerEvent::pointerType() const Returns the type of point that generated the event. @@ -4224,6 +4248,32 @@ QTouchEvent::QTouchEvent(QEvent::Type eventType, QTouchEvent::~QTouchEvent() { } +/*! + Returns true if this event includes at least one newly-pressed touchpoint. +*/ +bool QTouchEvent::isPressEvent() const +{ + return m_touchPointStates.testFlag(QEventPoint::State::Pressed); +} + +/*! + Returns true if this event does not include newly-pressed or newly-released + touchpoints. +*/ +bool QTouchEvent::isUpdateEvent() const +{ + return !m_touchPointStates.testFlag(QEventPoint::State::Pressed) && + !m_touchPointStates.testFlag(QEventPoint::State::Released); +} + +/*! + Returns true if this event includes at least one newly-released touchpoint. +*/ +bool QTouchEvent::isReleaseEvent() const +{ + return m_touchPointStates.testFlag(QEventPoint::State::Released); +} + /*! \fn QObject *QTouchEvent::target() const Returns the target object within the window on which the event occurred. diff --git a/src/gui/kernel/qevent.h b/src/gui/kernel/qevent.h index cfbaf8603e..8ba138a1bb 100644 --- a/src/gui/kernel/qevent.h +++ b/src/gui/kernel/qevent.h @@ -200,6 +200,9 @@ public: virtual ~QPointerEvent(); virtual int pointCount() const = 0; virtual const QEventPoint &point(int i) const = 0; + virtual bool isPressEvent() const { return false; } + virtual bool isUpdateEvent() const { return false; } + virtual bool isReleaseEvent() const { return false; } explicit QPointerEvent(Type type, const QPointingDevice *dev, Qt::KeyboardModifiers modifiers = Qt::NoModifier); const QPointingDevice *pointingDevice() const; @@ -225,6 +228,10 @@ public: inline QPointF scenePosition() const { return m_point.scenePosition(); } inline QPointF globalPosition() const { return m_point.globalPosition(); } + bool isPressEvent() const override; + bool isUpdateEvent() const override; + bool isReleaseEvent() const override; + protected: QEventPoint m_point; Qt::MouseButton m_button = Qt::NoButton; @@ -330,6 +337,8 @@ public: inline QPointF posF() const { return position(); } #endif // QT_DEPRECATED_SINCE(6, 0) + bool isUpdateEvent() const override { return true; } + // TODO deprecate when we figure out an actual replacement (point history?) inline QPoint oldPos() const { return m_oldPos.toPoint(); } inline QPointF oldPosF() const { return m_oldPos; } @@ -954,6 +963,9 @@ public: inline QObject *target() const { return m_target; } inline QEventPoint::States touchPointStates() const { return m_touchPointStates; } const QList<QEventPoint> &touchPoints() const { return m_touchPoints; } + bool isPressEvent() const override; + bool isUpdateEvent() const override; + bool isReleaseEvent() const override; protected: QObject *m_target = nullptr; diff --git a/tests/auto/gui/kernel/qmouseevent/tst_qmouseevent.cpp b/tests/auto/gui/kernel/qmouseevent/tst_qmouseevent.cpp index eda66198b7..70e5169648 100644 --- a/tests/auto/gui/kernel/qmouseevent/tst_qmouseevent.cpp +++ b/tests/auto/gui/kernel/qmouseevent/tst_qmouseevent.cpp @@ -113,13 +113,28 @@ void tst_QMouseEvent::mouseEventBasic() QPointF local(100, 100); QPointF scene(200, 200); QPointF screen(300, 300); + // Press left button QMouseEvent me(QEvent::MouseButtonPress, local, scene, screen, Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); QCOMPARE(me.isAccepted(), true); QCOMPARE(me.button(), Qt::LeftButton); QCOMPARE(me.buttons(), Qt::LeftButton); + QVERIFY(me.isPressEvent()); + QVERIFY(!me.isReleaseEvent()); QCOMPARE(me.position(), local); QCOMPARE(me.scenePosition(), scene); QCOMPARE(me.globalPosition(), screen); + // Press right button while left is already pressed + me = QMouseEvent(QEvent::MouseButtonPress, local, scene, screen, Qt::RightButton, Qt::LeftButton | Qt::RightButton, Qt::NoModifier); + QVERIFY(me.isPressEvent()); + QVERIFY(!me.isReleaseEvent()); + // Release right button while left is still pressed + me = QMouseEvent(QEvent::MouseButtonRelease, local, scene, screen, Qt::RightButton, Qt::LeftButton, Qt::NoModifier); + QVERIFY(!me.isPressEvent()); + QVERIFY(me.isReleaseEvent()); + // Release left button in the usual way + me = QMouseEvent(QEvent::MouseButtonRelease, local, scene, screen, Qt::LeftButton, Qt::NoButton, Qt::NoModifier); + QVERIFY(!me.isPressEvent()); + QVERIFY(me.isReleaseEvent()); } void tst_QMouseEvent::checkMousePressEvent_data() diff --git a/tests/auto/gui/kernel/qtouchevent/tst_qtouchevent.cpp b/tests/auto/gui/kernel/qtouchevent/tst_qtouchevent.cpp index 08c8dd3f78..d3d8eba34d 100644 --- a/tests/auto/gui/kernel/qtouchevent/tst_qtouchevent.cpp +++ b/tests/auto/gui/kernel/qtouchevent/tst_qtouchevent.cpp @@ -217,6 +217,7 @@ public: private slots: void cleanup(); void qPointerUniqueId(); + void state(); void touchDisabledByDefault(); void touchEventAcceptedByDefault(); void touchBeginPropagatesWhenIgnored(); @@ -290,6 +291,39 @@ void tst_QTouchEvent::qPointerUniqueId() QCOMPARE(set.size(), 2); } +void tst_QTouchEvent::state() +{ + QTouchEvent touchEvent(QEvent::TouchBegin, touchScreenDevice, + Qt::NoModifier, QList<QEventPoint>() << + QEventPoint(0, QEventPoint::State::Stationary, {}, {}) << + QEventPoint(1, QEventPoint::State::Pressed, {}, {})); + QCOMPARE(touchEvent.touchPointStates(), QEventPoint::State::Stationary | QEventPoint::State::Pressed); + QCOMPARE(touchEvent.pointCount(), 2); + QVERIFY(touchEvent.isPressEvent()); + QVERIFY(!touchEvent.isUpdateEvent()); + QVERIFY(!touchEvent.isReleaseEvent()); + + touchEvent = QTouchEvent(QEvent::TouchBegin, touchScreenDevice, + Qt::NoModifier, QList<QEventPoint>() << + QEventPoint(0, QEventPoint::State::Updated, {}, {}) << + QEventPoint(1, QEventPoint::State::Pressed, {}, {})); + QCOMPARE(touchEvent.touchPointStates(), QEventPoint::State::Updated | QEventPoint::State::Pressed); + QCOMPARE(touchEvent.pointCount(), 2); + QVERIFY(touchEvent.isPressEvent()); + QVERIFY(!touchEvent.isUpdateEvent()); + QVERIFY(!touchEvent.isReleaseEvent()); + + touchEvent = QTouchEvent(QEvent::TouchBegin, touchScreenDevice, + Qt::NoModifier, QList<QEventPoint>() << + QEventPoint(0, QEventPoint::State::Updated, {}, {}) << + QEventPoint(1, QEventPoint::State::Released, {}, {})); + QCOMPARE(touchEvent.touchPointStates(), QEventPoint::State::Updated | QEventPoint::State::Released); + QCOMPARE(touchEvent.pointCount(), 2); + QVERIFY(!touchEvent.isPressEvent()); + QVERIFY(!touchEvent.isUpdateEvent()); + QVERIFY(touchEvent.isReleaseEvent()); +} + void tst_QTouchEvent::touchDisabledByDefault() { // QWidget |