diff options
author | Mike Krus <mike.krus@kdab.com> | 2019-09-27 19:27:50 +0100 |
---|---|---|
committer | Mike Krus <mike.krus@kdab.com> | 2019-10-01 07:04:08 +0100 |
commit | bf34cec2c4e184c7b5dad23435bec45983b6b796 (patch) | |
tree | 40a955e2e25cce89107e713bde58bc19d1eb767b | |
parent | e532a1cf37855f79a0a662d9b07786337e5fd220 (diff) |
Update QKeyboardHandler to use direct sync
Change-Id: I08fdf7d4beccc512f84e70449ed706eab6df7d0b
Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
-rw-r--r-- | src/input/backend/keyboardhandler.cpp | 42 | ||||
-rw-r--r-- | src/input/backend/keyboardhandler_p.h | 8 | ||||
-rw-r--r-- | src/input/frontend/qinputaspect.cpp | 2 | ||||
-rw-r--r-- | tests/auto/input/keyboardhandler/tst_keyboardhandler.cpp | 43 |
4 files changed, 41 insertions, 54 deletions
diff --git a/src/input/backend/keyboardhandler.cpp b/src/input/backend/keyboardhandler.cpp index ae1e6d03c..e96fbb9d2 100644 --- a/src/input/backend/keyboardhandler.cpp +++ b/src/input/backend/keyboardhandler.cpp @@ -56,22 +56,12 @@ namespace Qt3DInput { namespace Input { KeyboardHandler::KeyboardHandler() - : QBackendNode(QBackendNode::ReadWrite) + : BackendNode(QBackendNode::ReadWrite) , m_inputHandler(nullptr) , m_focus(false) { } -void KeyboardHandler::initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) -{ - const auto typedChange = qSharedPointerCast<Qt3DCore::QNodeCreatedChange<QKeyboardHandlerData>>(change); - const auto &data = typedChange->data; - setSourcerDevice(data.keyboardDeviceId); - m_focus = false; - if (data.focus) - requestFocus(); -} - Qt3DCore::QNodeId KeyboardHandler::keyboardDevice() const { return m_keyboardDevice; @@ -105,24 +95,28 @@ void KeyboardHandler::keyEvent(const QKeyEventPtr &event) notifyObservers(e); } -void KeyboardHandler::sceneChangeEvent(const QSceneChangePtr &e) +void KeyboardHandler::syncFromFrontEnd(const Qt3DCore::QNode *frontEnd, bool firstTime) { + BackendNode::syncFromFrontEnd(frontEnd, firstTime); + const Qt3DInput::QKeyboardHandler *node = qobject_cast<const Qt3DInput::QKeyboardHandler *>(frontEnd); + if (!node) + return; + + if (firstTime) + m_focus = false; + bool focusRequest = false; - if (e->type() == PropertyUpdated) { - QPropertyUpdatedChangePtr propertyChange = qSharedPointerCast<QPropertyUpdatedChange>(e); - if (propertyChange->propertyName() == QByteArrayLiteral("sourceDevice")) { - const QNodeId newId = propertyChange->value().value<QNodeId>(); - if (m_keyboardDevice != newId) { - setSourcerDevice(newId); - focusRequest = m_focus; - } - } else if (propertyChange->propertyName() == QByteArrayLiteral("focus")) { - focusRequest = propertyChange->value().toBool(); - } + auto id = Qt3DCore::qIdForNode(node->sourceDevice()); + if (m_keyboardDevice != id) { + setSourcerDevice(id); + focusRequest = m_focus; } + + if (m_focus != node->focus()) + focusRequest = node->focus(); + if (focusRequest) requestFocus(); - QBackendNode::sceneChangeEvent(e); } void KeyboardHandler::requestFocus() diff --git a/src/input/backend/keyboardhandler_p.h b/src/input/backend/keyboardhandler_p.h index 317c33792..903b4d511 100644 --- a/src/input/backend/keyboardhandler_p.h +++ b/src/input/backend/keyboardhandler_p.h @@ -52,7 +52,7 @@ // #include <Qt3DInput/qkeyevent.h> -#include <Qt3DCore/qbackendnode.h> +#include <Qt3DInput/private/backendnode_p.h> #include <Qt3DCore/qnodeid.h> QT_BEGIN_NAMESPACE @@ -63,7 +63,7 @@ namespace Input { class InputHandler; -class Q_AUTOTEST_EXPORT KeyboardHandler : public Qt3DCore::QBackendNode +class Q_AUTOTEST_EXPORT KeyboardHandler : public BackendNode { public: KeyboardHandler(); @@ -75,15 +75,13 @@ public: inline bool focus() const { return m_focus; } - void sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) override; + void syncFromFrontEnd(const Qt3DCore::QNode *frontEnd, bool firstTime) override; protected: void requestFocus(); void setSourcerDevice(Qt3DCore::QNodeId device); private: - void initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) final; - InputHandler *m_inputHandler; Qt3DCore::QNodeId m_keyboardDevice; bool m_focus; diff --git a/src/input/frontend/qinputaspect.cpp b/src/input/frontend/qinputaspect.cpp index 05e860a4b..fffde2851 100644 --- a/src/input/frontend/qinputaspect.cpp +++ b/src/input/frontend/qinputaspect.cpp @@ -146,7 +146,7 @@ QInputAspect::QInputAspect(QInputAspectPrivate &dd, QObject *parent) qRegisterMetaType<Qt3DInput::QAbstractPhysicalDevice*>(); registerBackendType<QKeyboardDevice, true>(QBackendNodeMapperPtr(new Input::KeyboardDeviceFunctor(this, d_func()->m_inputHandler.data()))); - registerBackendType<QKeyboardHandler>(QBackendNodeMapperPtr(new Input::KeyboardHandlerFunctor(d_func()->m_inputHandler.data()))); + registerBackendType<QKeyboardHandler, true>(QBackendNodeMapperPtr(new Input::KeyboardHandlerFunctor(d_func()->m_inputHandler.data()))); registerBackendType<QMouseDevice, true>(QBackendNodeMapperPtr(new Input::MouseDeviceFunctor(this, d_func()->m_inputHandler.data()))); registerBackendType<QMouseHandler>(QBackendNodeMapperPtr(new Input::MouseHandlerFunctor(d_func()->m_inputHandler.data()))); registerBackendType<QAxis, true>(QBackendNodeMapperPtr(new Input::InputNodeFunctor<Input::Axis, Input::AxisManager>(d_func()->m_inputHandler->axisManager()))); diff --git a/tests/auto/input/keyboardhandler/tst_keyboardhandler.cpp b/tests/auto/input/keyboardhandler/tst_keyboardhandler.cpp index 3681f3554..331478472 100644 --- a/tests/auto/input/keyboardhandler/tst_keyboardhandler.cpp +++ b/tests/auto/input/keyboardhandler/tst_keyboardhandler.cpp @@ -54,7 +54,7 @@ private Q_SLOTS: auto keyboardDevice = new Qt3DInput::QKeyboardDevice; auto backendKeyboardDevice = inputHandler.keyboardDeviceManager()->getOrCreateResource(keyboardDevice->id()); backendKeyboardDevice->setInputHandler(&inputHandler); - simulateInitialization(keyboardDevice, backendKeyboardDevice); + simulateInitializationSync(keyboardDevice, backendKeyboardDevice); Qt3DInput::QKeyboardHandler keyboardHandler; auto backendKeyboardHandler = inputHandler.keyboardInputManager()->getOrCreateResource(keyboardHandler.id()); @@ -64,7 +64,7 @@ private Q_SLOTS: keyboardHandler.setSourceDevice(keyboardDevice); // WHEN - simulateInitialization(&keyboardHandler, backendKeyboardHandler); + simulateInitializationSync(&keyboardHandler, backendKeyboardHandler); // THEN QCOMPARE(backendKeyboardHandler->peerId(), keyboardHandler.id()); @@ -90,50 +90,45 @@ private Q_SLOTS: // GIVEN Qt3DInput::Input::InputHandler inputHandler; + Qt3DInput::QKeyboardHandler keyboardHandler; + keyboardHandler.setEnabled(false); + Qt3DInput::Input::KeyboardHandler backendKeyboardHandler; + backendKeyboardHandler.setInputHandler(&inputHandler); + Qt3DInput::QKeyboardDevice device; Qt3DInput::Input::KeyboardDevice *backendKeyboardDevice = inputHandler.keyboardDeviceManager()->getOrCreateResource(device.id()); backendKeyboardDevice->setInputHandler(&inputHandler); - Qt3DInput::Input::KeyboardHandler *backendKeyboardHandler - = inputHandler.keyboardInputManager()->getOrCreateResource(Qt3DCore::QNodeId::createId()); - backendKeyboardHandler->setInputHandler(&inputHandler); + simulateInitializationSync(&keyboardHandler, &backendKeyboardHandler); // WHEN - Qt3DCore::QPropertyUpdatedChangePtr updateChange(new Qt3DCore::QPropertyUpdatedChange(Qt3DCore::QNodeId())); - updateChange->setPropertyName("sourceDevice"); - updateChange->setValue(QVariant::fromValue(device.id())); - backendKeyboardHandler->sceneChangeEvent(updateChange); + keyboardHandler.setSourceDevice(&device); + backendKeyboardHandler.syncFromFrontEnd(&keyboardHandler, false); // THEN - QCOMPARE(backendKeyboardHandler->keyboardDevice(), device.id()); + QCOMPARE(backendKeyboardHandler.keyboardDevice(), device.id()); // WHEN (still disabled, nothing should happen) - updateChange = QSharedPointer<Qt3DCore::QPropertyUpdatedChange>::create(Qt3DCore::QNodeId()); - updateChange->setPropertyName("focus"); - updateChange->setValue(true); - backendKeyboardHandler->sceneChangeEvent(updateChange); + keyboardHandler.setFocus(true); + backendKeyboardHandler.syncFromFrontEnd(&keyboardHandler, false); // THEN QVERIFY(backendKeyboardDevice->lastKeyboardInputRequester().isNull()); // WHEN - updateChange = QSharedPointer<Qt3DCore::QPropertyUpdatedChange>::create(Qt3DCore::QNodeId()); - updateChange->setPropertyName("enabled"); - updateChange->setValue(true); - backendKeyboardHandler->sceneChangeEvent(updateChange); + keyboardHandler.setEnabled(true); + backendKeyboardHandler.syncFromFrontEnd(&keyboardHandler, false); // THEN - QCOMPARE(backendKeyboardHandler->isEnabled(), true); + QCOMPARE(backendKeyboardHandler.isEnabled(), true); // WHEN (now enabled, should request focus) - updateChange = QSharedPointer<Qt3DCore::QPropertyUpdatedChange>::create(Qt3DCore::QNodeId()); - updateChange->setPropertyName("focus"); - updateChange->setValue(true); - backendKeyboardHandler->sceneChangeEvent(updateChange); + keyboardHandler.setFocus(true); + backendKeyboardHandler.syncFromFrontEnd(&keyboardHandler, false); // THEN - QCOMPARE(backendKeyboardDevice->lastKeyboardInputRequester(), backendKeyboardHandler->peerId()); + QCOMPARE(backendKeyboardDevice->lastKeyboardInputRequester(), backendKeyboardHandler.peerId()); } }; |