diff options
-rw-r--r-- | src/input/backend/mousedevice.cpp | 11 | ||||
-rw-r--r-- | src/input/backend/mousedevice_p.h | 2 | ||||
-rw-r--r-- | src/input/frontend/qmousedevice.cpp | 38 | ||||
-rw-r--r-- | src/input/frontend/qmousedevice.h | 4 | ||||
-rw-r--r-- | src/input/frontend/qmousedevice_p.h | 1 | ||||
-rw-r--r-- | src/quick3d/imports/input/qt3dquick3dinputplugin.cpp | 1 | ||||
-rw-r--r-- | tests/auto/input/mousedevice/tst_mousedevice.cpp | 73 | ||||
-rw-r--r-- | tests/auto/input/qmousedevice/tst_qmousedevice.cpp | 45 |
8 files changed, 169 insertions, 6 deletions
diff --git a/src/input/backend/mousedevice.cpp b/src/input/backend/mousedevice.cpp index 47045a1a1..c5b2a22ce 100644 --- a/src/input/backend/mousedevice.cpp +++ b/src/input/backend/mousedevice.cpp @@ -57,6 +57,7 @@ MouseDevice::MouseDevice() , m_inputHandler(nullptr) , m_wasPressed(false) , m_sensitivity(0.1f) + , m_updateAxesContinuously(false) { } @@ -126,6 +127,11 @@ float MouseDevice::sensitivity() const return m_sensitivity; } +bool MouseDevice::updateAxesContinuously() const +{ + return m_updateAxesContinuously; +} + #if QT_CONFIG(wheelevent) void MouseDevice::updateWheelEvents(const QList<QT_PREPEND_NAMESPACE (QWheelEvent)> &events) { @@ -153,8 +159,8 @@ void MouseDevice::updateMouseEvents(const QList<QT_PREPEND_NAMESPACE(QMouseEvent m_mouseState.leftPressed = e.buttons() & (Qt::LeftButton); m_mouseState.centerPressed = e.buttons() & (Qt::MiddleButton); m_mouseState.rightPressed = e.buttons() & (Qt::RightButton); - bool pressed = m_mouseState.leftPressed || m_mouseState.centerPressed || m_mouseState.rightPressed; - if (m_wasPressed && pressed) { + const bool pressed = m_mouseState.leftPressed || m_mouseState.centerPressed || m_mouseState.rightPressed; + if (m_updateAxesContinuously || (m_wasPressed && pressed)) { m_mouseState.xAxis += m_sensitivity * (e.screenPos().x() - m_previousPos.x()); m_mouseState.yAxis += m_sensitivity * (m_previousPos.y() - e.screenPos().y()); } @@ -172,6 +178,7 @@ void MouseDevice::syncFromFrontEnd(const Qt3DCore::QNode *frontEnd, bool firstTi return; m_sensitivity = node->sensitivity(); + m_updateAxesContinuously = node->updateAxesContinuously(); } MouseDeviceFunctor::MouseDeviceFunctor(QInputAspect *inputAspect, InputHandler *handler) diff --git a/src/input/backend/mousedevice_p.h b/src/input/backend/mousedevice_p.h index 283eeaeaf..d41bb527b 100644 --- a/src/input/backend/mousedevice_p.h +++ b/src/input/backend/mousedevice_p.h @@ -107,6 +107,7 @@ public: QPointF previousPos() const; bool wasPressed() const; float sensitivity() const; + bool updateAxesContinuously() const; void syncFromFrontEnd(const Qt3DCore::QNode *frontEnd, bool firstTime) override; @@ -117,6 +118,7 @@ private: QPointF m_previousPos; bool m_wasPressed; float m_sensitivity; + bool m_updateAxesContinuously; }; class MouseDeviceFunctor : public Qt3DCore::QBackendNodeMapper diff --git a/src/input/frontend/qmousedevice.cpp b/src/input/frontend/qmousedevice.cpp index 4a78b3b21..5872fbcd2 100644 --- a/src/input/frontend/qmousedevice.cpp +++ b/src/input/frontend/qmousedevice.cpp @@ -52,6 +52,7 @@ namespace Qt3DInput { QMouseDevicePrivate::QMouseDevicePrivate() : QAbstractPhysicalDevicePrivate() , m_sensitivity(0.1f) + , m_updateContinuously(false) { } @@ -106,6 +107,27 @@ QMouseDevicePrivate::QMouseDevicePrivate() Default is 0.1. */ +/*! + \property Qt3DInput::QMouseDevice::updateAxesContinously + + If true, axes will be updated anytime they change regardless of whether + any mouse button is being pressed. Otherwise, axes are updated only when + one of the mouse buttons is being pressed. + + \since 5.15 + \default false +*/ + +/*! + \qmlproperty bool MouseDevice::updateAxesContinously + + If true, axes will be updated anytime they change regardless of whether + any mouse button is being pressed. Otherwise, axes are updated only when + one of the mouse buttons is being pressed. + + \since 5.15 + \default false +*/ /*! Constructs a new QMouseDevice instance with parent \a parent. @@ -211,6 +233,12 @@ float QMouseDevice::sensitivity() const return d->m_sensitivity; } +bool QMouseDevice::updateAxesContinuously() const +{ + Q_D(const QMouseDevice); + return d->m_updateContinuously; +} + void QMouseDevice::setSensitivity(float value) { Q_D(QMouseDevice); @@ -221,6 +249,16 @@ void QMouseDevice::setSensitivity(float value) emit sensitivityChanged(value); } +void QMouseDevice::setUpdateAxesContinuously(bool updateAxesContinuously) +{ + Q_D(QMouseDevice); + if (d->m_updateContinuously == updateAxesContinuously) + return; + + d->m_updateContinuously = updateAxesContinuously; + emit updateAxesContinuouslyChanged(updateAxesContinuously); +} + /*! \internal */ void QMouseDevice::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &change) { diff --git a/src/input/frontend/qmousedevice.h b/src/input/frontend/qmousedevice.h index 01e243790..7754c2e29 100644 --- a/src/input/frontend/qmousedevice.h +++ b/src/input/frontend/qmousedevice.h @@ -57,6 +57,7 @@ class Q_3DINPUTSHARED_EXPORT QMouseDevice : public Qt3DInput::QAbstractPhysicalD { Q_OBJECT Q_PROPERTY(float sensitivity READ sensitivity WRITE setSensitivity NOTIFY sensitivityChanged) + Q_PROPERTY(bool updateAxesContinuously READ updateAxesContinuously WRITE setUpdateAxesContinuously NOTIFY updateAxesContinuouslyChanged REVISION 15) public: explicit QMouseDevice(Qt3DCore::QNode *parent = nullptr); ~QMouseDevice(); @@ -77,12 +78,15 @@ public: int buttonIdentifier(const QString &name) const final; float sensitivity() const; + bool updateAxesContinuously() const; public Q_SLOTS: void setSensitivity(float value); + void setUpdateAxesContinuously(bool updateAxesContinuously); Q_SIGNALS: void sensitivityChanged(float value); + void updateAxesContinuouslyChanged(bool updateAxesContinuously); protected: void sceneChangeEvent(const Qt3DCore::QSceneChangePtr &change) override; diff --git a/src/input/frontend/qmousedevice_p.h b/src/input/frontend/qmousedevice_p.h index 49c1c6191..91daccb6f 100644 --- a/src/input/frontend/qmousedevice_p.h +++ b/src/input/frontend/qmousedevice_p.h @@ -67,6 +67,7 @@ public: Q_DECLARE_PUBLIC(QMouseDevice) float m_sensitivity; + bool m_updateContinuously; }; struct QMouseDeviceData diff --git a/src/quick3d/imports/input/qt3dquick3dinputplugin.cpp b/src/quick3d/imports/input/qt3dquick3dinputplugin.cpp index ba2e0661c..2a9596a00 100644 --- a/src/quick3d/imports/input/qt3dquick3dinputplugin.cpp +++ b/src/quick3d/imports/input/qt3dquick3dinputplugin.cpp @@ -86,6 +86,7 @@ void Qt3DQuick3DInputPlugin::registerTypes(const char *uri) #endif qmlRegisterType<Qt3DInput::QMouseHandler>(uri, 2, 0, "MouseHandler"); qmlRegisterType<Qt3DInput::QMouseDevice>(uri, 2, 0, "MouseDevice"); + qmlRegisterType<Qt3DInput::QMouseDevice, 15>(uri, 2, 15, "MouseDevice"); qmlRegisterExtendedType<Qt3DInput::QLogicalDevice, Qt3DInput::Input::Quick::Quick3DLogicalDevice>(uri, 2, 0, "LogicalDevice"); qmlRegisterUncreatableType<Qt3DInput::QAbstractActionInput>(uri, 2, 0, "AbstractActionInput", QStringLiteral("AbstractActionInput is abstract")); diff --git a/tests/auto/input/mousedevice/tst_mousedevice.cpp b/tests/auto/input/mousedevice/tst_mousedevice.cpp index f245e399d..95ae8de56 100644 --- a/tests/auto/input/mousedevice/tst_mousedevice.cpp +++ b/tests/auto/input/mousedevice/tst_mousedevice.cpp @@ -58,6 +58,7 @@ private Q_SLOTS: QCOMPARE(backendMouseDevice.previousPos(), QPointF()); QCOMPARE(backendMouseDevice.wasPressed(), false); QCOMPARE(backendMouseDevice.sensitivity(), 0.1f); + QCOMPARE(backendMouseDevice.updateAxesContinuously(), false); } void checkInitializeFromPeer() @@ -85,6 +86,7 @@ private Q_SLOTS: QCOMPARE(backendMouseDevice.previousPos(), QPointF()); QCOMPARE(backendMouseDevice.wasPressed(), false); QCOMPARE(backendMouseDevice.sensitivity(), 0.8f); + QCOMPARE(backendMouseDevice.updateAxesContinuously(), false); } { // WHEN @@ -125,6 +127,7 @@ private Q_SLOTS: QCOMPARE(backendMouseDevice.previousPos(), QPointF(400.0f, 400.0f)); QCOMPARE(backendMouseDevice.wasPressed(), true); QCOMPARE(backendMouseDevice.sensitivity(), 0.1f); + QCOMPARE(backendMouseDevice.updateAxesContinuously(), false); // WHEN eventList = QList<QT_PREPEND_NAMESPACE(QMouseEvent)>() << QT_PREPEND_NAMESPACE(QMouseEvent)(QMouseEvent::MouseMove, @@ -147,12 +150,13 @@ private Q_SLOTS: QCOMPARE(backendMouseDevice.previousPos(), QPointF(600.0f, 600.0f)); QCOMPARE(backendMouseDevice.wasPressed(), true); QCOMPARE(backendMouseDevice.sensitivity(), 0.1f); + QCOMPARE(backendMouseDevice.updateAxesContinuously(), false); // WHEN eventList = QList<QT_PREPEND_NAMESPACE(QMouseEvent)>() << QT_PREPEND_NAMESPACE(QMouseEvent)(QMouseEvent::MouseButtonRelease, - QPointF(600.0f, 600.0f), - QPointF(600.0f, 600.0f), - QPointF(600.0f, 600.0f), + QPointF(800.0f, 800.0f), + QPointF(800.0f, 800.0f), + QPointF(800.0f, 800.0f), Qt::LeftButton, Qt::NoButton, Qt::NoModifier); @@ -166,9 +170,61 @@ private Q_SLOTS: QCOMPARE(backendMouseDevice.mouseState().leftPressed, false); QCOMPARE(backendMouseDevice.mouseState().rightPressed, false); QCOMPARE(backendMouseDevice.mouseState().centerPressed, false); - QCOMPARE(backendMouseDevice.previousPos(), QPointF(600.0f, 600.0f)); + QCOMPARE(backendMouseDevice.previousPos(), QPointF(800.0f, 800.0f)); QCOMPARE(backendMouseDevice.wasPressed(), false); QCOMPARE(backendMouseDevice.sensitivity(), 0.1f); + QCOMPARE(backendMouseDevice.updateAxesContinuously(), false); + + // WHEN + eventList = QList<QT_PREPEND_NAMESPACE(QMouseEvent)>() << QT_PREPEND_NAMESPACE(QMouseEvent)(QMouseEvent::MouseMove, + QPointF(900.0f, 900.0f), + QPointF(900.0f, 900.0f), + QPointF(900.0f, 900.0f), + Qt::NoButton, + Qt::NoButton, + Qt::NoModifier); + + // THEN -> no axes update + backendMouseDevice.updateMouseEvents(eventList); + QCOMPARE(backendMouseDevice.mouseState().xAxis, 0.0f); + QCOMPARE(backendMouseDevice.mouseState().yAxis, 0.0f); + QCOMPARE(backendMouseDevice.mouseState().wXAxis, 0.0f); + QCOMPARE(backendMouseDevice.mouseState().wYAxis, 0.0f); + QCOMPARE(backendMouseDevice.mouseState().leftPressed, false); + QCOMPARE(backendMouseDevice.mouseState().rightPressed, false); + QCOMPARE(backendMouseDevice.mouseState().centerPressed, false); + QCOMPARE(backendMouseDevice.previousPos(), QPointF(900.0f, 900.0f)); + QCOMPARE(backendMouseDevice.wasPressed(), false); + QCOMPARE(backendMouseDevice.sensitivity(), 0.1f); + QCOMPARE(backendMouseDevice.updateAxesContinuously(), false); + + + // WHEN + eventList = QList<QT_PREPEND_NAMESPACE(QMouseEvent)>() << QT_PREPEND_NAMESPACE(QMouseEvent)(QMouseEvent::MouseMove, + QPointF(1000.0f, 1000.0f), + QPointF(1000.0f, 1000.0f), + QPointF(1000.0f, 1000.0f), + Qt::NoButton, + Qt::NoButton, + Qt::NoModifier); + + Qt3DInput::QMouseDevice mouseDevice; + mouseDevice.setUpdateAxesContinuously(true); + backendMouseDevice.syncFromFrontEnd(&mouseDevice, false); + backendMouseDevice.updateMouseEvents(eventList); + + // THEN + QCOMPARE(backendMouseDevice.mouseState().xAxis, (1000.0f - 900.0f) * 0.1f); + QCOMPARE(backendMouseDevice.mouseState().yAxis, (900.0f - 1000.0f) * 0.1f); + QCOMPARE(backendMouseDevice.mouseState().wXAxis, 0.0f); + QCOMPARE(backendMouseDevice.mouseState().wYAxis, 0.0f); + QCOMPARE(backendMouseDevice.mouseState().leftPressed,false); + QCOMPARE(backendMouseDevice.mouseState().rightPressed, false); + QCOMPARE(backendMouseDevice.mouseState().centerPressed, false); + QCOMPARE(backendMouseDevice.previousPos(), QPointF(1000.0f, 1000.0f)); + QCOMPARE(backendMouseDevice.wasPressed(), false); + QCOMPARE(backendMouseDevice.sensitivity(), 0.1f); + QCOMPARE(backendMouseDevice.updateAxesContinuously(), true); } void checkMouseWheelState() @@ -241,6 +297,15 @@ private Q_SLOTS: // THEN QCOMPARE(backendMouseDevice.sensitivity(), newValue); } + { + // WHEN + const bool newValue = true; + mouseDevice.setUpdateAxesContinuously(newValue); + backendMouseDevice.syncFromFrontEnd(&mouseDevice, false); + + // THEN + QCOMPARE(backendMouseDevice.updateAxesContinuously(), newValue); + } } }; diff --git a/tests/auto/input/qmousedevice/tst_qmousedevice.cpp b/tests/auto/input/qmousedevice/tst_qmousedevice.cpp index fd2c8e603..6a8f39c71 100644 --- a/tests/auto/input/qmousedevice/tst_qmousedevice.cpp +++ b/tests/auto/input/qmousedevice/tst_qmousedevice.cpp @@ -50,6 +50,7 @@ private Q_SLOTS: // THEN QCOMPARE(mouseDevice.sensitivity(), 0.1f); + QCOMPARE(mouseDevice.updateAxesContinuously(), false); QCOMPARE(mouseDevice.axisCount(), 4); QCOMPARE(mouseDevice.buttonCount(), 3); QCOMPARE(mouseDevice.axisNames(), QStringList() @@ -96,6 +97,25 @@ private Q_SLOTS: QCOMPARE(mouseDevice.sensitivity(), newValue); QCOMPARE(spy.count(), 0); } + { + // WHEN + QSignalSpy spy(&mouseDevice, SIGNAL(updateAxesContinuouslyChanged(bool))); + const bool newValue = true; + mouseDevice.setUpdateAxesContinuously(newValue); + + // THEN + QVERIFY(spy.isValid()); + QCOMPARE(mouseDevice.updateAxesContinuously(), newValue); + QCOMPARE(spy.count(), 1); + + // WHEN + spy.clear(); + mouseDevice.setUpdateAxesContinuously(newValue); + + // THEN + QCOMPARE(mouseDevice.updateAxesContinuously(), newValue); + QCOMPARE(spy.count(), 0); + } } void checkCreationData() @@ -175,6 +195,31 @@ private Q_SLOTS: } + void checkUpdateAxesContinuouslyUpdate() + { + // GIVEN + TestArbiter arbiter; + Qt3DInput::QMouseDevice mouseDevice; + arbiter.setArbiterOnNode(&mouseDevice); + + { + // WHEN + mouseDevice.setUpdateAxesContinuously(true); + // THEN + QCOMPARE(arbiter.dirtyNodes.size(), 1); + QCOMPARE(arbiter.dirtyNodes.front(), &mouseDevice); + } + + { + // WHEN + mouseDevice.setSensitivity(true); + + QCOMPARE(arbiter.dirtyNodes.size(), 1); + QCOMPARE(arbiter.dirtyNodes.front(), &mouseDevice); + } + + } + }; QTEST_MAIN(tst_QMouseDevice) |