diff options
author | Paul Lemire <paul.lemire.ecortex@kdab.com> | 2014-11-12 12:11:12 +0100 |
---|---|---|
committer | Sean Harmer <sean.harmer@kdab.com> | 2014-11-14 20:29:45 +0100 |
commit | a6913e7e688a38603b2ffa912635ff4e7a5e54eb (patch) | |
tree | 346cbbef103881dd77cf47b8da9b23fd4afc4da9 /src/input | |
parent | 80262ce2cb56a8f86c0747070a9ed3398a0c3c7d (diff) |
KeyboardInput reacts when QKeyboardInput requests focus
In turn, KeyboardInput also updates QKeyboardInput when the focus changes,
some more piping needed to make all of this work.
Change-Id: I4fce87e0fa43407bd791414feb2b6ad1183f6043
Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
Diffstat (limited to 'src/input')
-rw-r--r-- | src/input/keyboardinput.cpp | 46 | ||||
-rw-r--r-- | src/input/keyboardinput_p.h | 5 | ||||
-rw-r--r-- | src/input/qkeyboardinput.cpp | 11 | ||||
-rw-r--r-- | src/input/qkeyboardinput.h | 1 |
4 files changed, 61 insertions, 2 deletions
diff --git a/src/input/keyboardinput.cpp b/src/input/keyboardinput.cpp index 3a6e945ba..a639de409 100644 --- a/src/input/keyboardinput.cpp +++ b/src/input/keyboardinput.cpp @@ -46,6 +46,7 @@ #include "inputmanagers_p.h" #include <QVariant> #include <Qt3DCore/qscenepropertychange.h> +#include <Qt3DCore/qbackendscenepropertychange.h> QT_BEGIN_NAMESPACE @@ -55,6 +56,8 @@ namespace Input { KeyboardInput::KeyboardInput() : QBackendNode(QBackendNode::ReadWrite) + , m_inputHandler(Q_NULLPTR) + , m_focus(false) { } @@ -63,6 +66,9 @@ void KeyboardInput::updateFromPeer(QNode *peer) QKeyboardInput *input = static_cast<QKeyboardInput *>(peer); if (input->controller() != Q_NULLPTR) m_keyboardController = input->controller()->uuid(); + m_focus = false; + if (input->focus()) + requestFocus(); } QNodeUuid KeyboardInput::keyboardController() const @@ -70,13 +76,48 @@ QNodeUuid KeyboardInput::keyboardController() const return m_keyboardController; } +void KeyboardInput::setInputHandler(InputHandler *handler) +{ + m_inputHandler = handler; +} + +// Called by the KeyboadController when the focus for the KeyboardInput has changed +// Sends a change notification so that the frontend can update itself +void KeyboardInput::setFocus(bool focus) +{ + if (focus != m_focus) { + m_focus = focus; + QBackendScenePropertyChangePtr e(new QBackendScenePropertyChange(NodeUpdated, this)); + e->setPropertyName("focus"); + e->setValue(m_focus); + notifyObservers(e); + } +} + void KeyboardInput::sceneChangeEvent(const QSceneChangePtr &e) { + bool focusRequest = false; if (e->type() == NodeUpdated) { QScenePropertyChangePtr propertyChange = qSharedPointerCast<QScenePropertyChange>(e); - if (propertyChange->propertyName() == QByteArrayLiteral("controller")) - m_keyboardController = propertyChange->value().value<QNodeUuid>(); + if (propertyChange->propertyName() == QByteArrayLiteral("controller")) { + const QNodeUuid newId = propertyChange->value().value<QNodeUuid>(); + if (m_keyboardController != newId) { + m_keyboardController = newId; + focusRequest = m_focus; + } + } else if (propertyChange->propertyName() == QByteArrayLiteral("focus")) { + focusRequest = propertyChange->value().toBool(); + } } + if (focusRequest) + requestFocus(); +} + +void KeyboardInput::requestFocus() +{ + KeyboardController *controller = m_inputHandler->keyboardControllerManager()->lookupResource(m_keyboardController); + if (controller) + controller->requestFocusForInput(peerUuid()); } KeyboardInputFunctor::KeyboardInputFunctor(InputHandler *handler) @@ -87,6 +128,7 @@ KeyboardInputFunctor::KeyboardInputFunctor(InputHandler *handler) QBackendNode *KeyboardInputFunctor::create(QNode *frontend) const { KeyboardInput *input = m_handler->keyboardInputManager()->getOrCreateResource(frontend->uuid()); + input->setInputHandler(m_handler); input->setPeer(frontend); return input; } diff --git a/src/input/keyboardinput_p.h b/src/input/keyboardinput_p.h index 01360e4fa..98cc4c32a 100644 --- a/src/input/keyboardinput_p.h +++ b/src/input/keyboardinput_p.h @@ -59,12 +59,17 @@ public: KeyboardInput(); void updateFromPeer(QNode *peer) Q_DECL_OVERRIDE; QNodeUuid keyboardController() const; + void setInputHandler(InputHandler *handler); + void setFocus(bool focus); protected: void sceneChangeEvent(const QSceneChangePtr &e) Q_DECL_OVERRIDE; + void requestFocus(); private: + InputHandler *m_inputHandler; QNodeUuid m_keyboardController; + bool m_focus; }; class KeyboardInputFunctor : public QBackendNodeFunctor diff --git a/src/input/qkeyboardinput.cpp b/src/input/qkeyboardinput.cpp index 32dbbee6d..fb811bc70 100644 --- a/src/input/qkeyboardinput.cpp +++ b/src/input/qkeyboardinput.cpp @@ -42,6 +42,7 @@ #include "qkeyboardinput.h" #include "qkeyboardinput_p.h" #include "qkeyboardcontroller.h" +#include <Qt3DCore/qbackendscenepropertychange.h> QT_BEGIN_NAMESPACE @@ -74,6 +75,16 @@ void QKeyboardInput::copy(const QNode *ref) setController(qobject_cast<QKeyboardController *>(QNodePrivate::get(input->d_func()->m_controller)->clone())); } +void QKeyboardInput::sceneChangeEvent(const QSceneChangePtr &change) +{ + QBackendScenePropertyChangePtr e = qSharedPointerCast<QBackendScenePropertyChange>(change); + if (e->type() == NodeUpdated && e->propertyName() == QByteArrayLiteral("focus")) { + bool block = blockNotifications(true); + setFocus(e->value().toBool()); + blockNotifications(block); + } +} + void QKeyboardInput::setController(QKeyboardController *controller) { Q_D(QKeyboardInput); diff --git a/src/input/qkeyboardinput.h b/src/input/qkeyboardinput.h index b788a0d54..f0ea4f4bd 100644 --- a/src/input/qkeyboardinput.h +++ b/src/input/qkeyboardinput.h @@ -72,6 +72,7 @@ Q_SIGNALS: protected: QKeyboardInput(QKeyboardInputPrivate &dd, QNode *parent = 0); void copy(const QNode *ref) Q_DECL_OVERRIDE; + void sceneChangeEvent(const QSceneChangePtr &change) Q_DECL_OVERRIDE; private: Q_DECLARE_PRIVATE(QKeyboardInput) |