diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2015-12-03 16:10:55 +0100 |
---|---|---|
committer | Sean Harmer <sean.harmer@kdab.com> | 2015-12-07 19:06:54 +0000 |
commit | dde3c565835a9ddd0edf980728db4f6ff7393160 (patch) | |
tree | 504e1479d28c66e87b973e6fb74831ba95ab39c1 /src/input | |
parent | f6ff4023e42bec8cfe088f27c17f7d309f0a9003 (diff) |
QMouseController: converted to QAbstractPhysicalDevice
Change-Id: I532e7378fe459ec201629b3ec3f0c9a69acf691f
Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
Diffstat (limited to 'src/input')
-rw-r--r-- | src/input/backend/inputhandler.cpp | 1 | ||||
-rw-r--r-- | src/input/backend/keyboardmousedeviceintegration.cpp | 6 | ||||
-rw-r--r-- | src/input/backend/mousecontroller.cpp | 44 | ||||
-rw-r--r-- | src/input/backend/mousecontroller_p.h | 21 | ||||
-rw-r--r-- | src/input/frontend/qmousecontroller.cpp | 52 | ||||
-rw-r--r-- | src/input/frontend/qmousecontroller.h | 25 | ||||
-rw-r--r-- | src/input/frontend/qmousecontroller_p.h | 4 |
7 files changed, 138 insertions, 15 deletions
diff --git a/src/input/backend/inputhandler.cpp b/src/input/backend/inputhandler.cpp index 5d2b30462..19622862a 100644 --- a/src/input/backend/inputhandler.cpp +++ b/src/input/backend/inputhandler.cpp @@ -182,6 +182,7 @@ QVector<Qt3DCore::QAspectJobPtr> InputHandler::mouseJobs() Q_FOREACH (const HMouseController cHandle, m_activeMouseControllers) { MouseController *controller = m_mouseControllerManager->data(cHandle); + controller->updateMouseEvents(events); // Event dispacthing job if (!events.isEmpty()) { diff --git a/src/input/backend/keyboardmousedeviceintegration.cpp b/src/input/backend/keyboardmousedeviceintegration.cpp index 25f851e34..c6f6f776e 100644 --- a/src/input/backend/keyboardmousedeviceintegration.cpp +++ b/src/input/backend/keyboardmousedeviceintegration.cpp @@ -79,8 +79,10 @@ QVector<Qt3DCore::QNodeId> KeyboardMouseDeviceIntegration::physicalDevices() con QAbstractPhysicalDeviceBackendNode *KeyboardMouseDeviceIntegration::physicalDevice(Qt3DCore::QNodeId id) const { - return m_handler->keyboardControllerManager()->lookupResource(id); - // TO DO: When mouse is in it should also be checked as well + QAbstractPhysicalDeviceBackendNode *device = m_handler->keyboardControllerManager()->lookupResource(id); + if (!device) + device = m_handler->mouseControllerManager()->lookupResource(id); + return device; } } // Input diff --git a/src/input/backend/mousecontroller.cpp b/src/input/backend/mousecontroller.cpp index da61f7241..2a39c088d 100644 --- a/src/input/backend/mousecontroller.cpp +++ b/src/input/backend/mousecontroller.cpp @@ -49,7 +49,7 @@ namespace Qt3DInput { namespace Input { MouseController::MouseController() - : QBackendNode() + : QAbstractPhysicalDeviceBackendNode(ReadOnly) { } @@ -59,7 +59,7 @@ MouseController::~MouseController() void MouseController::updateFromPeer(Qt3DCore::QNode *peer) { - Q_UNUSED(peer); + QAbstractPhysicalDeviceBackendNode::updateFromPeer(peer); } void MouseController::setInputHandler(InputHandler *handler) @@ -78,11 +78,51 @@ void MouseController::removeMouseInput(const Qt3DCore::QNodeId &input) m_mouseInputs.removeOne(input); } +float MouseController::axisValue(int axisIdentifier) const +{ + switch (axisIdentifier) { + case QMouseController::X: + return m_mouseState.xAxis; + case QMouseController::Y: + return m_mouseState.yAxis; + break; + default: + break; + } + return 0.0f; +} + +bool MouseController::isButtonPressed(int buttonIdentifier) const +{ + switch (buttonIdentifier) { + case QMouseController::Left: + return m_mouseState.leftPressed; + case QMouseController::Center: + return m_mouseState.rightPressed; + case QMouseController::Right: + return m_mouseState.centerPressed; + default: + break; + } + return false; +} + QVector<Qt3DCore::QNodeId> MouseController::mouseInputs() const { return m_mouseInputs; } +void MouseController::updateMouseEvents(const QList<QMouseEvent> &events) +{ + Q_FOREACH (const QMouseEvent &e, events) { + m_mouseState.leftPressed = e.buttons() & (Qt::LeftButton); + m_mouseState.centerPressed = e.buttons() & (Qt::MiddleButton); + m_mouseState.rightPressed = e.buttons() & (Qt::RightButton); + m_mouseState.xAxis = m_previousPos.x() - e.screenPos().x(); + m_mouseState.yAxis = m_previousPos.y() - e.screenPos().y(); + } +} + void MouseController::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) { Q_UNUSED(e); diff --git a/src/input/backend/mousecontroller_p.h b/src/input/backend/mousecontroller_p.h index 69adc78ee..7d6d55c97 100644 --- a/src/input/backend/mousecontroller_p.h +++ b/src/input/backend/mousecontroller_p.h @@ -48,7 +48,8 @@ // We mean it. // -#include <Qt3DCore/qbackendnode.h> +#include <Qt3DInput/qabstractphysicaldevicebackendnode.h> +#include <QMouseEvent> QT_BEGIN_NAMESPACE @@ -57,7 +58,7 @@ namespace Input { class InputHandler; -class MouseController : public Qt3DCore::QBackendNode +class MouseController : public Qt3DInput::QAbstractPhysicalDeviceBackendNode { public: MouseController(); @@ -69,14 +70,30 @@ public: void addMouseInput(const Qt3DCore::QNodeId &input); void removeMouseInput(const Qt3DCore::QNodeId &input); + float axisValue(int axisIdentifier) const Q_DECL_OVERRIDE; + bool isButtonPressed(int buttonIdentifier) const Q_DECL_OVERRIDE; + QVector<Qt3DCore::QNodeId> mouseInputs() const; + void updateMouseEvents(const QList<QMouseEvent> &events); + protected: void sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) Q_DECL_OVERRIDE; private: QVector<Qt3DCore::QNodeId> m_mouseInputs; InputHandler *m_inputHandler; + + struct MouseState { + float xAxis; + float yAxis; + bool leftPressed; + bool rightPressed; + bool centerPressed; + }; + + MouseState m_mouseState; + QPoint m_previousPos; }; class MouseControllerFunctor : public Qt3DCore::QBackendNodeFunctor diff --git a/src/input/frontend/qmousecontroller.cpp b/src/input/frontend/qmousecontroller.cpp index 461296056..1ec91ec9b 100644 --- a/src/input/frontend/qmousecontroller.cpp +++ b/src/input/frontend/qmousecontroller.cpp @@ -45,7 +45,7 @@ QT_BEGIN_NAMESPACE namespace Qt3DInput { QMouseControllerPrivate::QMouseControllerPrivate() - : QNodePrivate() + : QAbstractPhysicalDevicePrivate() { } @@ -60,7 +60,7 @@ QMouseControllerPrivate::QMouseControllerPrivate() * \sa QMouseInput */ QMouseController::QMouseController(QNode *parent) - : QNode(*new QMouseControllerPrivate, parent) + : QAbstractPhysicalDevice(*new QMouseControllerPrivate, parent) { } @@ -68,7 +68,7 @@ QMouseController::QMouseController(QNode *parent) \internal */ QMouseController::QMouseController(QMouseControllerPrivate &dd, QNode *parent) - : QNode(dd, parent) + : QAbstractPhysicalDevice(dd, parent) { } @@ -80,6 +80,52 @@ QMouseController::~QMouseController() QNode::cleanup(); } +int QMouseController::axisCount() const +{ + // TO DO: we could have mouse wheel later on + return 2; +} + +int QMouseController::buttonCount() const +{ + return 3; +} + +QStringList QMouseController::axisNames() const +{ + return QStringList() + << QStringLiteral("X") + << QStringLiteral("Y"); +} + +QStringList QMouseController::buttonNames() const +{ + return QStringList() + << QStringLiteral("Left") + << QStringLiteral("Right") + << QStringLiteral("Center"); +} + +int QMouseController::axisIdentifier(const QString &name) +{ + if (name == QStringLiteral("X")) + return X; + else if (name == QStringLiteral("Y")) + return Y; + return -1; +} + +int QMouseController::buttonIdentifier(const QString &name) +{ + if (name == QStringLiteral("Left")) + return Left; + else if (name == QStringLiteral("Right")) + return Right; + else if (name == QStringLiteral("Center")) + return Center; + return -1; +} + void QMouseController::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &change) { Q_UNUSED(change); diff --git a/src/input/frontend/qmousecontroller.h b/src/input/frontend/qmousecontroller.h index a0de94db1..b7be253f8 100644 --- a/src/input/frontend/qmousecontroller.h +++ b/src/input/frontend/qmousecontroller.h @@ -38,7 +38,7 @@ #define QT3DINPUT_QMOUSECONTROLLER_H #include <Qt3DInput/qt3dinput_global.h> -#include <Qt3DCore/qnode.h> +#include <Qt3DInput/qabstractphysicaldevice.h> QT_BEGIN_NAMESPACE @@ -47,16 +47,33 @@ namespace Qt3DInput { class QMouseControllerPrivate; class QMouseInput; -class QT3DINPUTSHARED_EXPORT QMouseController : public Qt3DCore::QNode +class QT3DINPUTSHARED_EXPORT QMouseController : public Qt3DInput::QAbstractPhysicalDevice { Q_OBJECT - public: explicit QMouseController(Qt3DCore::QNode *parent = 0); + ~QMouseController(); + + enum Axis { + X, + Y + }; + + enum Button { + Left, + Center, + Right + }; + + int axisCount() const Q_DECL_FINAL; + int buttonCount() const Q_DECL_FINAL; + QStringList axisNames() const Q_DECL_FINAL; + QStringList buttonNames() const Q_DECL_FINAL; + int axisIdentifier(const QString &name) Q_DECL_FINAL; + int buttonIdentifier(const QString &name) Q_DECL_FINAL; protected: QMouseController(QMouseControllerPrivate &dd, Qt3DCore::QNode *parent = 0); - ~QMouseController(); void sceneChangeEvent(const Qt3DCore::QSceneChangePtr &change) Q_DECL_OVERRIDE; diff --git a/src/input/frontend/qmousecontroller_p.h b/src/input/frontend/qmousecontroller_p.h index c04971af3..efffdf51b 100644 --- a/src/input/frontend/qmousecontroller_p.h +++ b/src/input/frontend/qmousecontroller_p.h @@ -48,7 +48,7 @@ // We mean it. // -#include <private/qnode_p.h> +#include <private/qabstractphysicaldevice_p.h> QT_BEGIN_NAMESPACE @@ -56,7 +56,7 @@ namespace Qt3DInput { class QMouseController; -class QMouseControllerPrivate : public Qt3DCore::QNodePrivate +class QMouseControllerPrivate : public Qt3DInput::QAbstractPhysicalDevicePrivate { public: QMouseControllerPrivate(); |