summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/input/backend/mousedevice.cpp11
-rw-r--r--src/input/backend/mousedevice_p.h2
-rw-r--r--src/input/frontend/qmousedevice.cpp38
-rw-r--r--src/input/frontend/qmousedevice.h4
-rw-r--r--src/input/frontend/qmousedevice_p.h1
-rw-r--r--src/quick3d/imports/input/qt3dquick3dinputplugin.cpp1
-rw-r--r--tests/auto/input/mousedevice/tst_mousedevice.cpp73
-rw-r--r--tests/auto/input/qmousedevice/tst_qmousedevice.cpp45
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)