summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMike Krus <mike.krus@kdab.com>2019-09-27 16:28:34 +0100
committerMike Krus <mike.krus@kdab.com>2019-09-30 17:08:17 +0100
commit621c19719e51d0b4c94a51f802f8a2128e201b85 (patch)
tree1ebfff488c851245aa04d426b719b15cd23aa386
parent5c16cd7be2ba8bd6d98ee18305dd7d69a9f873ca (diff)
Update QAxis to use direct sync
Change-Id: Id159885d3c3ef4f2582a7b308350c6b43182f521 Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
-rw-r--r--src/input/backend/axis.cpp41
-rw-r--r--src/input/backend/axis_p.h8
-rw-r--r--src/input/frontend/qaxis.cpp13
-rw-r--r--src/input/frontend/qinputaspect.cpp2
-rw-r--r--tests/auto/input/axis/tst_axis.cpp25
-rw-r--r--tests/auto/input/qaxis/tst_qaxis.cpp18
6 files changed, 35 insertions, 72 deletions
diff --git a/src/input/backend/axis.cpp b/src/input/backend/axis.cpp
index 6ba4e2b34..20c05a49f 100644
--- a/src/input/backend/axis.cpp
+++ b/src/input/backend/axis.cpp
@@ -42,10 +42,9 @@
#include <Qt3DInput/qaxis.h>
#include <Qt3DInput/qabstractaxisinput.h>
#include <Qt3DCore/qpropertyupdatedchange.h>
-#include <Qt3DCore/qpropertynodeaddedchange.h>
-#include <Qt3DCore/qpropertynoderemovedchange.h>
#include <Qt3DInput/private/qaxis_p.h>
+#include <algorithm>
QT_BEGIN_NAMESPACE
@@ -54,18 +53,11 @@ namespace Qt3DInput {
namespace Input {
Axis::Axis()
- : Qt3DCore::QBackendNode(ReadWrite)
+ : BackendNode(ReadWrite)
, m_axisValue(0.0f)
{
}
-void Axis::initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change)
-{
- const auto typedChange = qSharedPointerCast<Qt3DCore::QNodeCreatedChange<QAxisData>>(change);
- const auto &data = typedChange->data;
- m_inputs = data.inputIds;
-}
-
void Axis::cleanup()
{
QBackendNode::setEnabled(false);
@@ -75,11 +67,11 @@ void Axis::cleanup()
void Axis::setAxisValue(float axisValue)
{
- if (isEnabled() && (axisValue != m_axisValue)) {
+ if (isEnabled() && (!qFuzzyCompare(axisValue, m_axisValue))) {
m_axisValue = axisValue;
// Send a change to the frontend
- auto e = Qt3DCore::QPropertyUpdatedChangePtr::create(peerId());
+ auto e = Qt3DCore::QPropertyUpdatedChangePtr::create(peerId()); // TODOSYNC replace with direct access
e->setDeliveryFlags(Qt3DCore::QSceneChange::DeliverToAll);
e->setPropertyName("value");
e->setValue(m_axisValue);
@@ -87,26 +79,15 @@ void Axis::setAxisValue(float axisValue)
}
}
-void Axis::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e)
+void Axis::syncFromFrontEnd(const Qt3DCore::QNode *frontEnd, bool firstTime)
{
- switch (e->type()) {
- case Qt3DCore::PropertyValueAdded: {
- const auto change = qSharedPointerCast<Qt3DCore::QPropertyNodeAddedChange>(e);
- if (change->propertyName() == QByteArrayLiteral("input"))
- m_inputs.push_back(change->addedNodeId());
- break;
- }
+ BackendNode::syncFromFrontEnd(frontEnd, firstTime);
+ const Qt3DInput::QAxis *node = qobject_cast<const Qt3DInput::QAxis *>(frontEnd);
+ if (!node)
+ return;
- case Qt3DCore::PropertyValueRemoved: {
- const auto change = qSharedPointerCast<Qt3DCore::QPropertyNodeRemovedChange>(e);
- if (change->propertyName() == QByteArrayLiteral("input"))
- m_inputs.removeOne(change->removedNodeId());
- }
-
- default:
- break;
- }
- QBackendNode::sceneChangeEvent(e);
+ auto ids = Qt3DCore::qIdsForNodes(node->inputs());
+ m_inputs = ids;
}
} // namespace Input
diff --git a/src/input/backend/axis_p.h b/src/input/backend/axis_p.h
index b83405060..da4ec9ac6 100644
--- a/src/input/backend/axis_p.h
+++ b/src/input/backend/axis_p.h
@@ -51,7 +51,7 @@
// We mean it.
//
-#include <Qt3DCore/qbackendnode.h>
+#include <Qt3DInput/private/backendnode_p.h>
#include <Qt3DCore/qnodeid.h>
QT_BEGIN_NAMESPACE
@@ -60,7 +60,7 @@ namespace Qt3DInput {
namespace Input {
-class Q_AUTOTEST_EXPORT Axis : public Qt3DCore::QBackendNode
+class Q_AUTOTEST_EXPORT Axis : public BackendNode
{
public:
Axis();
@@ -68,11 +68,9 @@ public:
inline QVector<Qt3DCore::QNodeId> inputs() const { return m_inputs; }
inline float axisValue() const { return m_axisValue; }
void setAxisValue(float axisValue);
- void sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) override;
+ void syncFromFrontEnd(const Qt3DCore::QNode *frontEnd, bool firstTime) override;
private:
- void initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) final;
-
QVector<Qt3DCore::QNodeId> m_inputs;
float m_axisValue;
};
diff --git a/src/input/frontend/qaxis.cpp b/src/input/frontend/qaxis.cpp
index 1830c8005..082ad4f67 100644
--- a/src/input/frontend/qaxis.cpp
+++ b/src/input/frontend/qaxis.cpp
@@ -117,12 +117,7 @@ void QAxis::addInput(QAbstractAxisInput *input)
// Ensures proper bookkeeping
d->registerDestructionHelper(input, &QAxis::removeInput, d->m_inputs);
-
- if (d->m_changeArbiter != nullptr) {
- const auto change = Qt3DCore::QPropertyNodeAddedChangePtr::create(id(), input);
- change->setPropertyName("input");
- d->notifyObservers(change);
- }
+ d->update();
}
}
@@ -144,11 +139,7 @@ void QAxis::removeInput(QAbstractAxisInput *input)
Q_D(QAxis);
if (d->m_inputs.contains(input)) {
- if (d->m_changeArbiter != nullptr) {
- const auto change = Qt3DCore::QPropertyNodeRemovedChangePtr::create(id(), input);
- change->setPropertyName("input");
- d->notifyObservers(change);
- }
+ d->update();
d->m_inputs.removeOne(input);
diff --git a/src/input/frontend/qinputaspect.cpp b/src/input/frontend/qinputaspect.cpp
index e91e545bb..c063f2580 100644
--- a/src/input/frontend/qinputaspect.cpp
+++ b/src/input/frontend/qinputaspect.cpp
@@ -149,7 +149,7 @@ QInputAspect::QInputAspect(QInputAspectPrivate &dd, QObject *parent)
registerBackendType<QKeyboardHandler>(QBackendNodeMapperPtr(new Input::KeyboardHandlerFunctor(d_func()->m_inputHandler.data())));
registerBackendType<QMouseDevice>(QBackendNodeMapperPtr(new Input::MouseDeviceFunctor(this, d_func()->m_inputHandler.data())));
registerBackendType<QMouseHandler>(QBackendNodeMapperPtr(new Input::MouseHandlerFunctor(d_func()->m_inputHandler.data())));
- registerBackendType<QAxis>(QBackendNodeMapperPtr(new Input::InputNodeFunctor<Input::Axis, Input::AxisManager>(d_func()->m_inputHandler->axisManager())));
+ registerBackendType<QAxis, true>(QBackendNodeMapperPtr(new Input::InputNodeFunctor<Input::Axis, Input::AxisManager>(d_func()->m_inputHandler->axisManager())));
registerBackendType<QAxisAccumulator>(QBackendNodeMapperPtr(new Input::InputNodeFunctor<Input::AxisAccumulator, Input::AxisAccumulatorManager>(d_func()->m_inputHandler->axisAccumulatorManager())));
registerBackendType<QAnalogAxisInput>(QBackendNodeMapperPtr(new Input::InputNodeFunctor<Input::AnalogAxisInput, Input::AnalogAxisInputManager>(d_func()->m_inputHandler->analogAxisInputManager())));
registerBackendType<QButtonAxisInput>(QBackendNodeMapperPtr(new Input::InputNodeFunctor<Input::ButtonAxisInput, Input::ButtonAxisInputManager>(d_func()->m_inputHandler->buttonAxisInputManager())));
diff --git a/tests/auto/input/axis/tst_axis.cpp b/tests/auto/input/axis/tst_axis.cpp
index 42f7f56fc..8ad8098af 100644
--- a/tests/auto/input/axis/tst_axis.cpp
+++ b/tests/auto/input/axis/tst_axis.cpp
@@ -65,7 +65,7 @@ private Q_SLOTS:
axis.addInput(&axisInput);
// WHEN
- simulateInitialization(&axis, &backendAxis);
+ simulateInitializationSync(&axis, &backendAxis);
// THEN
QCOMPARE(backendAxis.peerId(), axis.id());
@@ -97,7 +97,7 @@ private Q_SLOTS:
axis.addInput(&axisInput);
// WHEN
- simulateInitialization(&axis, &backendAxis);
+ simulateInitializationSync(&axis, &backendAxis);
backendAxis.setAxisValue(883.0f);
backendAxis.cleanup();
@@ -110,33 +110,30 @@ private Q_SLOTS:
void checkPropertyChanges()
{
// GIVEN
+ Qt3DInput::QAxis axis;
Qt3DInput::Input::Axis backendAxis;
- Qt3DCore::QPropertyUpdatedChangePtr updateChange;
+ simulateInitializationSync(&axis, &backendAxis);
// WHEN
- updateChange = QSharedPointer<Qt3DCore::QPropertyUpdatedChange>::create(Qt3DCore::QNodeId());
- updateChange->setPropertyName("enabled");
- updateChange->setValue(true);
- backendAxis.sceneChangeEvent(updateChange);
+ axis.setEnabled(false);
+ backendAxis.syncFromFrontEnd(&axis, false);
// THEN
- QCOMPARE(backendAxis.isEnabled(), true);
+ QCOMPARE(backendAxis.isEnabled(), false);
// WHEN
DummyAxisInput input;
const Qt3DCore::QNodeId inputId = input.id();
- const auto nodeAddedChange = Qt3DCore::QPropertyNodeAddedChangePtr::create(Qt3DCore::QNodeId(), &input);
- nodeAddedChange->setPropertyName("input");
- backendAxis.sceneChangeEvent(nodeAddedChange);
+ axis.addInput(&input);
+ backendAxis.syncFromFrontEnd(&axis, false);
// THEN
QCOMPARE(backendAxis.inputs().size(), 1);
QCOMPARE(backendAxis.inputs().first(), inputId);
// WHEN
- const auto nodeRemovedChange = Qt3DCore::QPropertyNodeRemovedChangePtr::create(Qt3DCore::QNodeId(), &input);
- nodeRemovedChange->setPropertyName("input");
- backendAxis.sceneChangeEvent(nodeRemovedChange);
+ axis.removeInput(&input);
+ backendAxis.syncFromFrontEnd(&axis, false);
// THEN
QCOMPARE(backendAxis.inputs().size(), 0);
diff --git a/tests/auto/input/qaxis/tst_qaxis.cpp b/tests/auto/input/qaxis/tst_qaxis.cpp
index 35cee0bba..03ddcb76d 100644
--- a/tests/auto/input/qaxis/tst_qaxis.cpp
+++ b/tests/auto/input/qaxis/tst_qaxis.cpp
@@ -113,24 +113,20 @@ private Q_SLOTS:
QCoreApplication::processEvents();
// THEN
- QCOMPARE(arbiter.events.size(), 1);
- Qt3DCore::QPropertyNodeAddedChangePtr change = arbiter.events.first().staticCast<Qt3DCore::QPropertyNodeAddedChange>();
- QCOMPARE(change->propertyName(), "input");
- QCOMPARE(change->addedNodeId(), input->id());
- QCOMPARE(change->type(), Qt3DCore::PropertyValueAdded);
+ QCOMPARE(arbiter.events.size(), 0);
+ QCOMPARE(arbiter.dirtyNodes.size(), 1);
+ QCOMPARE(arbiter.dirtyNodes.front(), axis.data());
- arbiter.events.clear();
+ arbiter.dirtyNodes.clear();
// WHEN
axis->removeInput(input);
QCoreApplication::processEvents();
// THEN
- QCOMPARE(arbiter.events.size(), 1);
- Qt3DCore::QPropertyNodeRemovedChangePtr nodeRemovedChange = arbiter.events.first().staticCast<Qt3DCore::QPropertyNodeRemovedChange>();
- QCOMPARE(nodeRemovedChange->propertyName(), "input");
- QCOMPARE(nodeRemovedChange->removedNodeId(), input->id());
- QCOMPARE(nodeRemovedChange->type(), Qt3DCore::PropertyValueRemoved);
+ QCOMPARE(arbiter.events.size(), 0);
+ QCOMPARE(arbiter.dirtyNodes.size(), 1);
+ QCOMPARE(arbiter.dirtyNodes.front(), axis.data());
arbiter.events.clear();
}