summaryrefslogtreecommitdiffstats
path: root/src/input
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 /src/input
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>
Diffstat (limited to 'src/input')
-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)