1/****************************************************************************
2**
3** Copyright (C) 2016 Klaralvdalens Datakonsult AB (KDAB).
4** Contact: https://www.qt.io/licensing/
5**
6** This file is part of the Qt3D module of the Qt Toolkit.
7**
8** $QT_BEGIN_LICENSE:LGPL$
9** Commercial License Usage
10** Licensees holding valid commercial Qt licenses may use this file in
11** accordance with the commercial license agreement provided with the
12** Software or, alternatively, in accordance with the terms contained in
13** a written agreement between you and The Qt Company. For licensing terms
14** and conditions see https://www.qt.io/terms-conditions. For further
15** information use the contact form at https://www.qt.io/contact-us.
16**
17** GNU Lesser General Public License Usage
18** Alternatively, this file may be used under the terms of the GNU Lesser
19** General Public License version 3 as published by the Free Software
20** Foundation and appearing in the file LICENSE.LGPL3 included in the
21** packaging of this file. Please review the following information to
22** ensure the GNU Lesser General Public License version 3 requirements
23** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
24**
25** GNU General Public License Usage
26** Alternatively, this file may be used under the terms of the GNU
27** General Public License version 2.0 or (at your option) the GNU General
28** Public license version 3 or any later version approved by the KDE Free
29** Qt Foundation. The licenses are as published by the Free Software
30** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
31** included in the packaging of this file. Please review the following
32** information to ensure the GNU General Public License requirements will
33** be met: https://www.gnu.org/licenses/gpl-2.0.html and
34** https://www.gnu.org/licenses/gpl-3.0.html.
35**
36** $QT_END_LICENSE$
37**
38****************************************************************************/
39
40#include "qabstractphysicaldeviceproxy_p.h"
41#include "qabstractphysicaldeviceproxy_p_p.h"
42
43#include <Qt3DInput/qphysicaldevicecreatedchange.h>
44
45
46QT_BEGIN_NAMESPACE
47
48namespace Qt3DInput {
49
50/*!
51 \internal
52 */
53QAbstractPhysicalDeviceProxyPrivate::QAbstractPhysicalDeviceProxyPrivate(const QString &deviceName)
54 : QAbstractPhysicalDevicePrivate()
55 , m_deviceName(deviceName)
56 , m_status(QAbstractPhysicalDeviceProxy::NotFound)
57 , m_device(nullptr)
58{
59}
60
61/*!
62 \internal
63 */
64QAbstractPhysicalDeviceProxyPrivate::~QAbstractPhysicalDeviceProxyPrivate()
65{
66}
67
68/*!
69 \internal
70 */
71void QAbstractPhysicalDeviceProxyPrivate::setStatus(QAbstractPhysicalDeviceProxy::DeviceStatus status)
72{
73 if (status != m_status) {
74 m_status = status;
75 emit q_func()->statusChanged(status);
76 }
77}
78
79/*!
80 \class Qt3DInput::QAbstractPhysicalDeviceProxy
81 \inmodule Qt3DInput
82
83 \brief Qt3DInput::QAbstractPhysicalDeviceProxy acts as a proxy
84 for an actual Qt3DInput::QQAbstractPhysicalDevice device.
85
86 Qt3DInput::QAbstractPhysicalDeviceProxy can be used to facilitate
87 exposing a physical device to users. It alleviates the need to introspect
88 the axis and buttons based on their names.
89
90 It is typcally used through subclassing allowing to set the device name and
91 defining enums for the various axis and buttons of your targeted device.
92
93 At runtime, the status property will be updated to reflect whether an
94 actual device matching the device name could be created.
95
96 \since 5.8
97 */
98
99QString QAbstractPhysicalDeviceProxy::deviceName() const
100{
101 Q_D(const QAbstractPhysicalDeviceProxy);
102 return d->m_deviceName;
103}
104
105QAbstractPhysicalDeviceProxy::DeviceStatus QAbstractPhysicalDeviceProxy::status() const
106{
107 Q_D(const QAbstractPhysicalDeviceProxy);
108 return d->m_status;
109}
110
111int QAbstractPhysicalDeviceProxy::axisCount() const
112{
113 Q_D(const QAbstractPhysicalDeviceProxy);
114 if (d->m_device != nullptr)
115 return d->m_device->axisCount();
116 return 0;
117}
118
119int QAbstractPhysicalDeviceProxy::buttonCount() const
120{
121 Q_D(const QAbstractPhysicalDeviceProxy);
122 if (d->m_device != nullptr)
123 return d->m_device->buttonCount();
124 return 0;
125}
126
127QStringList QAbstractPhysicalDeviceProxy::axisNames() const
128{
129 Q_D(const QAbstractPhysicalDeviceProxy);
130 if (d->m_device != nullptr)
131 return d->m_device->axisNames();
132 return QStringList();
133}
134
135QStringList QAbstractPhysicalDeviceProxy::buttonNames() const
136{
137 Q_D(const QAbstractPhysicalDeviceProxy);
138 if (d->m_device != nullptr)
139 return d->m_device->buttonNames();
140 return QStringList();
141}
142
143int QAbstractPhysicalDeviceProxy::axisIdentifier(const QString &name) const
144{
145 Q_D(const QAbstractPhysicalDeviceProxy);
146 if (d->m_device != nullptr)
147 return d->m_device->axisIdentifier(name);
148 return -1;
149}
150
151int QAbstractPhysicalDeviceProxy::buttonIdentifier(const QString &name) const
152{
153 Q_D(const QAbstractPhysicalDeviceProxy);
154 if (d->m_device != nullptr)
155 return d->m_device->buttonIdentifier(name);
156 return -1;
157}
158
159/*!
160 \internal
161 */
162QAbstractPhysicalDeviceProxy::QAbstractPhysicalDeviceProxy(QAbstractPhysicalDeviceProxyPrivate &dd, Qt3DCore::QNode *parent)
163 : QAbstractPhysicalDevice(dd, parent)
164{
165}
166
167/*!
168 \internal
169 */
170Qt3DCore::QNodeCreatedChangeBasePtr QAbstractPhysicalDeviceProxy::createNodeCreationChange() const
171{
172 auto creationChange = QPhysicalDeviceCreatedChangePtr<QAbstractPhysicalDeviceProxyData>::create(arguments: this);
173 QAbstractPhysicalDeviceProxyData &data = creationChange->data;
174
175 Q_D(const QAbstractPhysicalDeviceProxy);
176 data.deviceName = d->m_deviceName;
177
178 return creationChange;
179}
180
181/*!
182 \internal
183 */
184void QAbstractPhysicalDeviceProxyPrivate::setDevice(QAbstractPhysicalDevice *device)
185{
186 Q_Q(QAbstractPhysicalDeviceProxy);
187
188 // Note: technically book keeping could be optional since we are the parent
189 // of the device. But who knows if someone plays with the object tree...
190
191 // Unset bookkeeper
192 if (m_device != nullptr) {
193 // Note: we cannot delete the device here as we don't how if we are
194 // called by the bookkeeper (in which case we would do a double free)
195 // or by the sceneChangeEvent
196 unregisterDestructionHelper(node: m_device);
197 setStatus(QAbstractPhysicalDeviceProxy::NotFound);
198 }
199
200 // Set parent so that node is created in the backend
201 if (device != nullptr && device->parent() == nullptr)
202 device->setParent(q);
203
204 m_device = device;
205
206 // Set bookkeeper
207 if (device != nullptr) {
208 setStatus(QAbstractPhysicalDeviceProxy::Ready);
209 registerPrivateDestructionHelper(node: m_device, func: &QAbstractPhysicalDeviceProxyPrivate::resetDevice);
210 }
211}
212
213void QAbstractPhysicalDeviceProxyPrivate::resetDevice(QAbstractPhysicalDevice *device)
214{
215 if (m_device == device) {
216 // Note: we cannot delete the device here as we don't how if we are
217 // called by the bookkeeper (in which case we would do a double free)
218 // or by the sceneChangeEvent
219 unregisterDestructionHelper(node: m_device);
220 setStatus(QAbstractPhysicalDeviceProxy::NotFound);
221
222 m_device = nullptr;
223 }
224}
225
226} // Qt3DInput
227
228QT_END_NAMESPACE
229

source code of qt3d/src/input/frontend/qabstractphysicaldeviceproxy.cpp