diff options
author | Kevin Ottens <kevin.ottens@kdab.com> | 2016-05-19 16:54:48 +0200 |
---|---|---|
committer | Sean Harmer <sean.harmer@kdab.com> | 2016-05-23 11:58:44 +0000 |
commit | e53a337637a3534fd9b94156d3db2cf0a11abb10 (patch) | |
tree | ffabf0b72c40a88cd4c9a4d6e711d53565fc69c2 /src/input | |
parent | 5122113ab4487f6831e6bb626c9f87213ec4f1f3 (diff) |
Repair AxisSetting handling in physical devices
Change-Id: I9989f5ccf7871eb60083c4fcb40d4eb9158b1b19
Task-number: QTBUG-53358
Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
Diffstat (limited to 'src/input')
-rw-r--r-- | src/input/backend/qabstractphysicaldevicebackendnode.cpp | 52 | ||||
-rw-r--r-- | src/input/backend/qabstractphysicaldevicebackendnode_p_p.h | 3 |
2 files changed, 36 insertions, 19 deletions
diff --git a/src/input/backend/qabstractphysicaldevicebackendnode.cpp b/src/input/backend/qabstractphysicaldevicebackendnode.cpp index eb66f4188..86e55ec04 100644 --- a/src/input/backend/qabstractphysicaldevicebackendnode.cpp +++ b/src/input/backend/qabstractphysicaldevicebackendnode.cpp @@ -130,6 +130,35 @@ Input::AxisSetting *QAbstractPhysicalDeviceBackendNodePrivate::getAxisSetting(Qt return axisSetting; } +QVector<Input::AxisIdSetting> QAbstractPhysicalDeviceBackendNodePrivate::convertToAxisIdSettingVector(Qt3DCore::QNodeId axisSettingId) const +{ + const auto axisSetting = getAxisSetting(axisSettingId); + const auto axisIds = axisSetting->axes(); + + auto result = QVector<Input::AxisIdSetting>(); + result.reserve(axisIds.size()); + std::transform(axisIds.constBegin(), axisIds.constEnd(), + std::back_inserter(result), + [axisSettingId] (int axisId) { + return Input::AxisIdSetting{ axisId, axisSettingId }; + }); + return result; +} + +void QAbstractPhysicalDeviceBackendNodePrivate::updatePendingAxisSettings() +{ + if (m_pendingAxisSettingIds.isEmpty()) + return; + + m_axisSettings = std::accumulate( + m_pendingAxisSettingIds.constBegin(), m_pendingAxisSettingIds.constEnd(), + QVector<Input::AxisIdSetting>(), + [this] (const QVector<Input::AxisIdSetting> ¤t, Qt3DCore::QNodeId axisSettingId) { + return current + convertToAxisIdSettingVector(axisSettingId); + }); + m_pendingAxisSettingIds.clear(); +} + QAbstractPhysicalDeviceBackendNode::QAbstractPhysicalDeviceBackendNode(QBackendNode::Mode mode) : Qt3DCore::QBackendNode(*new QAbstractPhysicalDeviceBackendNodePrivate(mode)) { @@ -140,28 +169,11 @@ QAbstractPhysicalDeviceBackendNode::QAbstractPhysicalDeviceBackendNode(QAbstract { } -// TODO: Fold this into a job as described below -//void QAbstractPhysicalDeviceBackendNode::updateFromPeer(Qt3DCore::QNode *peer) -//{ -// Q_D(QAbstractPhysicalDeviceBackendNode); -// QAbstractPhysicalDevice *physicalDevice = static_cast<QAbstractPhysicalDevice *>(peer); -// const auto axisSettings = physicalDevice->axisSettings(); -// for (QAxisSetting *axisSetting : axisSettings) { -// // Each axis setting can apply to more than one axis. If an axis is -// // mentioned in more than one setting, we use the last one -// const auto axisIds = variantListToVector(axisSetting->axes()); -// for (int axisId : axisIds) -// d->addAxisSetting(axisId, axisSetting->id()); -// } -//} - void QAbstractPhysicalDeviceBackendNode::initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) { const auto deviceChange = qSharedPointerCast<QPhysicalDeviceCreatedChangeBase>(change); Q_D(QAbstractPhysicalDeviceBackendNode); - // Store the axis setting Ids. We will update the settings themselves from - // a job scheduled on the next frame. - // TODO: Create such a job once all types can be created this way. + // Store the axis setting Ids. We will update the settings themselves when needed d->m_pendingAxisSettingIds = deviceChange->axisSettingIds(); } @@ -218,8 +230,10 @@ QInputAspect *QAbstractPhysicalDeviceBackendNode::inputAspect() const float QAbstractPhysicalDeviceBackendNode::processedAxisValue(int axisIdentifier) { - // Find axis settings for this axis (if any) Q_D(QAbstractPhysicalDeviceBackendNode); + d->updatePendingAxisSettings(); + + // Find axis settings for this axis (if any) Qt3DCore::QNodeId axisSettingId; QVector<Input::AxisIdSetting>::const_iterator it; QVector<Input::AxisIdSetting>::const_iterator end = d->m_axisSettings.cend(); diff --git a/src/input/backend/qabstractphysicaldevicebackendnode_p_p.h b/src/input/backend/qabstractphysicaldevicebackendnode_p_p.h index ce47181fa..8d9ee0617 100644 --- a/src/input/backend/qabstractphysicaldevicebackendnode_p_p.h +++ b/src/input/backend/qabstractphysicaldevicebackendnode_p_p.h @@ -96,6 +96,9 @@ public: Input::AxisSetting *getAxisSetting(Qt3DCore::QNodeId axisSettingId) const; + QVector<Input::AxisIdSetting> convertToAxisIdSettingVector(Qt3DCore::QNodeId axisSettingId) const; + void updatePendingAxisSettings(); + Qt3DCore::QNodeIdVector m_pendingAxisSettingIds; QVector<Input::AxisIdSetting> m_axisSettings; QVector<Input::AxisIdFilter> m_axisFilters; |