summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2015-12-03 10:58:46 +0100
committerSean Harmer <sean.harmer@kdab.com>2015-12-04 19:07:41 +0000
commit19d8d0443bed987a997f486c70ffb9ad62bc1419 (patch)
tree8d02f1f32f92f7c15fafe1a97eef02dbb46424a8
parentc9961da49757b5d76164a5334ed1f114fffcfca0 (diff)
QAxisInput/QActionInput: use list of int rather than int mask
Needed to allow devices like keyboards which have more than 64 keys Change-Id: Ia837285ba9c5b7c26d3d89046d7d9f7a4cddb2ba Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
-rw-r--r--src/input/backend/actioninput.cpp19
-rw-r--r--src/input/backend/actioninput_p.h4
-rw-r--r--src/input/backend/axisinput.cpp20
-rw-r--r--src/input/backend/axisinput_p.h4
-rw-r--r--src/input/backend/updateaxisactionjob.cpp11
-rw-r--r--src/input/frontend/qactioninput.cpp7
-rw-r--r--src/input/frontend/qactioninput.h6
-rw-r--r--src/input/frontend/qaxisinput.cpp7
-rw-r--r--src/input/frontend/qaxisinput.h6
-rw-r--r--tests/auto/input/axisinput/tst_axisinput.cpp26
-rw-r--r--tests/auto/input/qactioninput/tst_qactioninput.cpp9
-rw-r--r--tests/auto/input/qaxisinput/tst_qaxisinput.cpp9
12 files changed, 82 insertions, 46 deletions
diff --git a/src/input/backend/actioninput.cpp b/src/input/backend/actioninput.cpp
index 694623c50..3371c978d 100644
--- a/src/input/backend/actioninput.cpp
+++ b/src/input/backend/actioninput.cpp
@@ -45,6 +45,19 @@ namespace Qt3DInput {
namespace Input {
+namespace {
+
+QVector<int> listToIntArray(const QVariantList &l)
+{
+ QVector<int> array;
+ array.reserve(l.size());
+ Q_FOREACH (const QVariant &v, l)
+ array.push_back(v.toInt());
+ return array;
+}
+
+} // anonymous
+
ActionInput::ActionInput()
: Qt3DCore::QBackendNode()
, m_keys(0)
@@ -56,7 +69,7 @@ void ActionInput::updateFromPeer(Qt3DCore::QNode *peer)
{
QActionInput *input = static_cast<QActionInput *>(peer);
m_enabled = input->isEnabled();
- m_keys = input->keys();
+ m_keys = listToIntArray(input->keys());
if (input->sourceDevice())
m_sourceDevice = input->sourceDevice()->id();
}
@@ -65,7 +78,7 @@ void ActionInput::cleanup()
{
m_enabled = false;
m_sourceDevice = Qt3DCore::QNodeId();
- m_keys = 0;
+ m_keys.clear();
}
void ActionInput::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e)
@@ -77,7 +90,7 @@ void ActionInput::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e)
} else if (propertyChange->propertyName() == QByteArrayLiteral("enabled")) {
m_enabled = propertyChange->value().toBool();
} else if (propertyChange->propertyName() == QByteArrayLiteral("keys")) {
- m_keys = propertyChange->value().toInt();
+ m_keys = listToIntArray(propertyChange->value().toList());
}
}
}
diff --git a/src/input/backend/actioninput_p.h b/src/input/backend/actioninput_p.h
index 3fcea7139..66cf88ccd 100644
--- a/src/input/backend/actioninput_p.h
+++ b/src/input/backend/actioninput_p.h
@@ -64,13 +64,13 @@ public:
void updateFromPeer(Qt3DCore::QNode *peer) Q_DECL_OVERRIDE;
void cleanup();
- inline qint64 keys() const { return m_keys; }
+ inline QVector<int> keys() const { return m_keys; }
inline Qt3DCore::QNodeId sourceDevice() const { return m_sourceDevice; }
inline bool isEnabled() const { return m_enabled; }
void sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) Q_DECL_OVERRIDE;
private:
- qint64 m_keys;
+ QVector<int> m_keys;
Qt3DCore::QNodeId m_sourceDevice;
bool m_enabled;
};
diff --git a/src/input/backend/axisinput.cpp b/src/input/backend/axisinput.cpp
index 71b905aca..f7bb32246 100644
--- a/src/input/backend/axisinput.cpp
+++ b/src/input/backend/axisinput.cpp
@@ -45,10 +45,22 @@ namespace Qt3DInput {
namespace Input {
+namespace {
+
+QVector<int> listToIntArray(const QVariantList &l)
+{
+ QVector<int> array;
+ array.reserve(l.size());
+ Q_FOREACH (const QVariant &v, l)
+ array.push_back(v.toInt());
+ return array;
+}
+
+} // anonymous
+
AxisInput::AxisInput()
: Qt3DCore::QBackendNode()
, m_axis(0)
- , m_keys(0)
, m_scale(0.0f)
, m_enabled(false)
{
@@ -63,7 +75,7 @@ void AxisInput::updateFromPeer(Qt3DCore::QNode *peer)
m_axis = input->axis();
m_scale = input->scale();
m_enabled = input->isEnabled();
- m_keys = input->keys();
+ m_keys = listToIntArray(input->keys());
if (input->sourceDevice())
m_sourceDevice = input->sourceDevice()->id();
}
@@ -73,7 +85,7 @@ void AxisInput::cleanup()
m_axis = 0;
m_enabled = false;
m_scale = 0.0f;
- m_keys = 0;
+ m_keys.clear();
m_sourceDevice = Qt3DCore::QNodeId();
}
@@ -90,7 +102,7 @@ void AxisInput::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e)
} else if (propertyChange->propertyName() == QByteArrayLiteral("enabled")) {
m_enabled = propertyChange->value().toBool();
} else if (propertyChange->propertyName() == QByteArrayLiteral("keys")) {
- m_keys = propertyChange->value().toInt();
+ m_keys = listToIntArray(propertyChange->value().toList());
}
}
}
diff --git a/src/input/backend/axisinput_p.h b/src/input/backend/axisinput_p.h
index 6ab868483..2b27e2c42 100644
--- a/src/input/backend/axisinput_p.h
+++ b/src/input/backend/axisinput_p.h
@@ -66,14 +66,14 @@ public:
inline int axis() const { return m_axis; }
inline float scale() const { return m_scale; }
- inline qint64 keys() const { return m_keys; }
+ inline QVector<int> keys() const { return m_keys; }
inline Qt3DCore::QNodeId sourceDevice() const { return m_sourceDevice; }
inline bool isEnabled() const { return m_enabled; }
void sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) Q_DECL_OVERRIDE;
private:
int m_axis;
- qint64 m_keys;
+ QVector<int> m_keys;
Qt3DCore::QNodeId m_sourceDevice;
float m_scale;
bool m_enabled;
diff --git a/src/input/backend/updateaxisactionjob.cpp b/src/input/backend/updateaxisactionjob.cpp
index e89f70ec6..5c2a336dc 100644
--- a/src/input/backend/updateaxisactionjob.cpp
+++ b/src/input/backend/updateaxisactionjob.cpp
@@ -48,12 +48,11 @@ namespace Input {
namespace {
-bool anyOfRequiredKeysPressed(qint64 keys, QAbstractPhysicalDeviceBackendNode *physicalDeviceBackend)
+bool anyOfRequiredKeysPressed(const QVector<int> &keys, QAbstractPhysicalDeviceBackendNode *physicalDeviceBackend)
{
bool validKeyWasPressed = false;
- for (int i = 0; i < 64; ++i) {
- const int individualBit = (1 << i);
- if ((individualBit & keys) && physicalDeviceBackend->isButtonPressed(individualBit)) {
+ Q_FOREACH (int key, keys) {
+ if (physicalDeviceBackend->isButtonPressed(key)) {
validKeyWasPressed = true;
break;
}
@@ -120,11 +119,11 @@ void UpdateAxisActionJob::updateAxis(LogicalDevice *device)
if (physicalDeviceBackend != Q_NULLPTR) {
// Update the value
- const qint64 keys = axisInput->keys();
+ const QVector<int> keys = axisInput->keys();
// Axis was specified -> we take this as the base value
if (axisInput->axis() != -1)
axisValue += physicalDeviceBackend->axisValue(axisInput->axis());
- else if (keys != 0) {
+ else if (!keys.isEmpty()) {
// TO DO: Linear Curver for the progression of the scale value
if (anyOfRequiredKeysPressed(keys, physicalDeviceBackend))
axisValue += axisInput->scale();
diff --git a/src/input/frontend/qactioninput.cpp b/src/input/frontend/qactioninput.cpp
index 54531df06..dd0773dc8 100644
--- a/src/input/frontend/qactioninput.cpp
+++ b/src/input/frontend/qactioninput.cpp
@@ -46,11 +46,10 @@ class QActionInputPrivate : public Qt3DCore::QNodePrivate
public:
QActionInputPrivate()
: Qt3DCore::QNodePrivate()
- , m_keys(0)
, m_sourceDevice(Q_NULLPTR)
{}
- int m_keys;
+ QVariantList m_keys;
QAbstractPhysicalDevice *m_sourceDevice;
};
@@ -64,7 +63,7 @@ QActionInput::~QActionInput()
QNode::cleanup();
}
-int QActionInput::keys() const
+QVariantList QActionInput::keys() const
{
Q_D(const QActionInput);
return d->m_keys;
@@ -91,7 +90,7 @@ QAbstractPhysicalDevice *QActionInput::sourceDevice() const
return d->m_sourceDevice;
}
-void QActionInput::setKeys(int keys)
+void QActionInput::setKeys(const QVariantList &keys)
{
Q_D(QActionInput);
if (d->m_keys != keys) {
diff --git a/src/input/frontend/qactioninput.h b/src/input/frontend/qactioninput.h
index 537e7e1e0..37e9c7957 100644
--- a/src/input/frontend/qactioninput.h
+++ b/src/input/frontend/qactioninput.h
@@ -51,7 +51,7 @@ class QT3DINPUTSHARED_EXPORT QActionInput : public Qt3DCore::QNode
{
Q_OBJECT
Q_PROPERTY(Qt3DInput::QAbstractPhysicalDevice *sourceDevice READ sourceDevice WRITE setSourceDevice NOTIFY sourceDeviceChanged)
- Q_PROPERTY(int keys READ keys WRITE setKeys NOTIFY keysChanged)
+ Q_PROPERTY(QVariantList keys READ keys WRITE setKeys NOTIFY keysChanged)
public:
explicit QActionInput(Qt3DCore::QNode *parent = Q_NULLPTR);
@@ -60,8 +60,8 @@ public:
void setSourceDevice(QAbstractPhysicalDevice *sourceDevice);
QAbstractPhysicalDevice *sourceDevice() const;
- void setKeys(int keys);
- int keys() const;
+ void setKeys(const QVariantList &keys);
+ QVariantList keys() const;
Q_SIGNALS:
void sourceDeviceChanged();
diff --git a/src/input/frontend/qaxisinput.cpp b/src/input/frontend/qaxisinput.cpp
index f854286b4..35f16beb0 100644
--- a/src/input/frontend/qaxisinput.cpp
+++ b/src/input/frontend/qaxisinput.cpp
@@ -47,13 +47,12 @@ class QAxisInputPrivate : public Qt3DCore::QNodePrivate
public:
QAxisInputPrivate()
: Qt3DCore::QNodePrivate()
- , m_keys(0)
, m_sourceDevice(Q_NULLPTR)
, m_scale(0.0f)
, m_axis(-1)
{}
- int m_keys;
+ QVariantList m_keys;
QAbstractPhysicalDevice *m_sourceDevice;
float m_scale;
int m_axis;
@@ -119,7 +118,7 @@ int QAxisInput::axis() const
return d->m_axis;
}
-void QAxisInput::setKeys(int keys)
+void QAxisInput::setKeys(const QVariantList &keys)
{
Q_D(QAxisInput);
if (keys != d->m_keys) {
@@ -128,7 +127,7 @@ void QAxisInput::setKeys(int keys)
}
}
-int QAxisInput::keys() const
+QVariantList QAxisInput::keys() const
{
Q_D(const QAxisInput);
return d->m_keys;
diff --git a/src/input/frontend/qaxisinput.h b/src/input/frontend/qaxisinput.h
index 08cc8be6a..b28e85a3a 100644
--- a/src/input/frontend/qaxisinput.h
+++ b/src/input/frontend/qaxisinput.h
@@ -54,7 +54,7 @@ class QT3DINPUTSHARED_EXPORT QAxisInput : public Qt3DCore::QNode
Q_PROPERTY(Qt3DInput::QAbstractPhysicalDevice *sourceDevice READ sourceDevice WRITE setSourceDevice NOTIFY sourceDeviceChanged)
Q_PROPERTY(float scale READ scale WRITE setScale NOTIFY scaleChanged)
Q_PROPERTY(int axis READ axis WRITE setAxis NOTIFY axisChanged)
- Q_PROPERTY(int keys READ keys WRITE setKeys NOTIFY keysChanged)
+ Q_PROPERTY(QVariantList keys READ keys WRITE setKeys NOTIFY keysChanged)
public:
explicit QAxisInput(Qt3DCore::QNode *parent = Q_NULLPTR);
@@ -69,8 +69,8 @@ public:
void setAxis(int axis);
int axis() const;
- void setKeys(int keys);
- int keys() const;
+ void setKeys(const QVariantList &keys);
+ QVariantList keys() const;
Q_SIGNALS:
void sourceDeviceChanged();
diff --git a/tests/auto/input/axisinput/tst_axisinput.cpp b/tests/auto/input/axisinput/tst_axisinput.cpp
index f63c3d445..1b1879443 100644
--- a/tests/auto/input/axisinput/tst_axisinput.cpp
+++ b/tests/auto/input/axisinput/tst_axisinput.cpp
@@ -43,6 +43,18 @@
#include <Qt3DCore/qscenepropertychange.h>
#include "testdevice.h"
+namespace {
+
+void compareKeys(const QVector<int> &backendKeys, const QVariantList &frontendKeys)
+{
+ QCOMPARE(backendKeys.size(), frontendKeys.size());
+ for (int i = 0, m = backendKeys.size(); i < m; ++i) {
+ QCOMPARE(backendKeys.at(i), frontendKeys.at(i).toInt());
+ }
+}
+
+}
+
class tst_AxisInput: public QObject
{
Q_OBJECT
@@ -56,7 +68,7 @@ private Q_SLOTS:
Qt3DInput::QAxisInput axisInput;
TestDevice sourceDevice;
- axisInput.setKeys((1 << 8));
+ axisInput.setKeys(QVariantList() << QVariant(1 << 8));
axisInput.setAxis(327);
axisInput.setScale(0.5f);
axisInput.setSourceDevice(&sourceDevice);
@@ -67,7 +79,7 @@ private Q_SLOTS:
// THEN
QCOMPARE(backendAxisInput.peerUuid(), axisInput.id());
QCOMPARE(backendAxisInput.isEnabled(), axisInput.isEnabled());
- QCOMPARE(backendAxisInput.keys(), axisInput.keys());
+ compareKeys(backendAxisInput.keys(), axisInput.keys());
QCOMPARE(backendAxisInput.axis(), axisInput.axis());
QCOMPARE(backendAxisInput.scale(), axisInput.scale());
QCOMPARE(backendAxisInput.sourceDevice(), sourceDevice.id());
@@ -81,7 +93,7 @@ private Q_SLOTS:
// THEN
QVERIFY(backendAxisInput.peerUuid().isNull());
QCOMPARE(backendAxisInput.scale(), 0.0f);
- QCOMPARE(backendAxisInput.keys(), 0);
+ QVERIFY(backendAxisInput.keys().isEmpty());
QCOMPARE(backendAxisInput.axis(), 0);
QCOMPARE(backendAxisInput.isEnabled(), false);
QCOMPARE(backendAxisInput.sourceDevice(), Qt3DCore::QNodeId());
@@ -90,7 +102,7 @@ private Q_SLOTS:
Qt3DInput::QAxisInput axisInput;
TestDevice sourceDevice;
- axisInput.setKeys((1 << 8));
+ axisInput.setKeys(QVariantList() << QVariant(1 << 8));
axisInput.setAxis(327);
axisInput.setScale(0.5f);
axisInput.setSourceDevice(&sourceDevice);
@@ -102,7 +114,7 @@ private Q_SLOTS:
// THEN
QVERIFY(backendAxisInput.peerUuid().isNull());
QCOMPARE(backendAxisInput.scale(), 0.0f);
- QCOMPARE(backendAxisInput.keys(), 0);
+ QVERIFY(backendAxisInput.keys().isEmpty());
QCOMPARE(backendAxisInput.axis(), 0);
QCOMPARE(backendAxisInput.isEnabled(), false);
QCOMPARE(backendAxisInput.sourceDevice(), Qt3DCore::QNodeId());
@@ -124,12 +136,12 @@ private Q_SLOTS:
// WHEN
updateChange.reset(new Qt3DCore::QScenePropertyChange(Qt3DCore::NodeUpdated, Qt3DCore::QSceneChange::Node, Qt3DCore::QNodeId()));
- updateChange->setValue(64);
+ updateChange->setValue(QVariantList() << QVariant(64));
updateChange->setPropertyName("keys");
backendAxisInput.sceneChangeEvent(updateChange);
// THEN
- QCOMPARE(backendAxisInput.keys(), 64);
+ compareKeys(backendAxisInput.keys(), QVariantList() << QVariant(64));
// WHEN
updateChange.reset(new Qt3DCore::QScenePropertyChange(Qt3DCore::NodeUpdated, Qt3DCore::QSceneChange::Node, Qt3DCore::QNodeId()));
diff --git a/tests/auto/input/qactioninput/tst_qactioninput.cpp b/tests/auto/input/qactioninput/tst_qactioninput.cpp
index 3b8022860..77275c2cb 100644
--- a/tests/auto/input/qactioninput/tst_qactioninput.cpp
+++ b/tests/auto/input/qactioninput/tst_qactioninput.cpp
@@ -69,12 +69,12 @@ private Q_SLOTS:
QTest::newRow("defaultConstructed") << defaultConstructed;
Qt3DInput::QActionInput *actionInputWithKeys = new Qt3DInput::QActionInput();
- actionInputWithKeys->setKeys((1 << 1) | (1 << 5));
+ actionInputWithKeys->setKeys(QVariantList() << QVariant((1 << 1) | (1 << 5)));
QTest::newRow("actionInputWithKeys") << actionInputWithKeys;
Qt3DInput::QActionInput *actionInputWithKeysAndSourceDevice = new Qt3DInput::QActionInput();
TestDevice *device = new TestDevice();
- actionInputWithKeysAndSourceDevice->setKeys((1 << 1) | (1 << 5));
+ actionInputWithKeysAndSourceDevice->setKeys(QVariantList() << QVariant((1 << 1) | (1 << 5)));
actionInputWithKeysAndSourceDevice->setSourceDevice(device);
QTest::newRow("actionInputWithKeysAndSourceDevice") << actionInputWithKeysAndSourceDevice;
}
@@ -106,14 +106,15 @@ private Q_SLOTS:
TestArbiter arbiter(actionInput.data());
// WHEN
- actionInput->setKeys(555);
+ QVariantList keys = QVariantList() << QVariant(555);
+ actionInput->setKeys(keys);
QCoreApplication::processEvents();
// THEN
QCOMPARE(arbiter.events.size(), 1);
Qt3DCore::QScenePropertyChangePtr change = arbiter.events.first().staticCast<Qt3DCore::QScenePropertyChange>();
QCOMPARE(change->propertyName(), "keys");
- QCOMPARE(change->value().toInt(), 555);
+ QCOMPARE(change->value().toList(), keys);
QCOMPARE(change->type(), Qt3DCore::NodeUpdated);
arbiter.events.clear();
diff --git a/tests/auto/input/qaxisinput/tst_qaxisinput.cpp b/tests/auto/input/qaxisinput/tst_qaxisinput.cpp
index ec65824e9..2dc7e3308 100644
--- a/tests/auto/input/qaxisinput/tst_qaxisinput.cpp
+++ b/tests/auto/input/qaxisinput/tst_qaxisinput.cpp
@@ -69,14 +69,14 @@ private Q_SLOTS:
QTest::newRow("defaultConstructed") << defaultConstructed;
Qt3DInput::QAxisInput *axisInputWithKeysAndAxis = new Qt3DInput::QAxisInput();
- axisInputWithKeysAndAxis->setKeys((1 << 1) | (1 << 5));
+ axisInputWithKeysAndAxis->setKeys(QVariantList() << QVariant((1 << 1) | (1 << 5)));
axisInputWithKeysAndAxis->setAxis(383);
axisInputWithKeysAndAxis->setScale(327.0f);
QTest::newRow("axisInputWithKeys") << axisInputWithKeysAndAxis;
Qt3DInput::QAxisInput *axisInputWithKeysAndSourceDevice = new Qt3DInput::QAxisInput();
TestDevice *device = new TestDevice();
- axisInputWithKeysAndSourceDevice->setKeys((1 << 1) | (1 << 5));
+ axisInputWithKeysAndSourceDevice->setKeys(QVariantList() << QVariant((1 << 1) | (1 << 5)));
axisInputWithKeysAndSourceDevice->setSourceDevice(device);
axisInputWithKeysAndSourceDevice->setAxis(427);
axisInputWithKeysAndAxis->setScale(355.0f);
@@ -112,14 +112,15 @@ private Q_SLOTS:
TestArbiter arbiter(axisInput.data());
// WHEN
- axisInput->setKeys(555);
+ QVariantList keys = QVariantList() << QVariant(555);
+ axisInput->setKeys(keys);
QCoreApplication::processEvents();
// THEN
QCOMPARE(arbiter.events.size(), 1);
Qt3DCore::QScenePropertyChangePtr change = arbiter.events.first().staticCast<Qt3DCore::QScenePropertyChange>();
QCOMPARE(change->propertyName(), "keys");
- QCOMPARE(change->value().toInt(), 555);
+ QCOMPARE(change->value().toList(), keys);
QCOMPARE(change->type(), Qt3DCore::NodeUpdated);
arbiter.events.clear();