summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire.ecortex@kdab.com>2014-11-12 12:11:12 +0100
committerSean Harmer <sean.harmer@kdab.com>2014-11-14 20:29:45 +0100
commita6913e7e688a38603b2ffa912635ff4e7a5e54eb (patch)
tree346cbbef103881dd77cf47b8da9b23fd4afc4da9
parent80262ce2cb56a8f86c0747070a9ed3398a0c3c7d (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>
-rw-r--r--src/input/keyboardinput.cpp46
-rw-r--r--src/input/keyboardinput_p.h5
-rw-r--r--src/input/qkeyboardinput.cpp11
-rw-r--r--src/input/qkeyboardinput.h1
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)