diff options
Diffstat (limited to 'src/gamepad/qgamepadmanager.cpp')
-rw-r--r-- | src/gamepad/qgamepadmanager.cpp | 196 |
1 files changed, 117 insertions, 79 deletions
diff --git a/src/gamepad/qgamepadmanager.cpp b/src/gamepad/qgamepadmanager.cpp index 58422c5..9628f0e 100644 --- a/src/gamepad/qgamepadmanager.cpp +++ b/src/gamepad/qgamepadmanager.cpp @@ -41,54 +41,70 @@ #include <QtCore/QLoggingCategory> +#include <private/qobject_p.h> + QT_BEGIN_NAMESPACE Q_LOGGING_CATEGORY(gp, "qt.gamepad") -/*! - \class QGamepadManager - \inmodule QtGamepad - \brief Queries attached gamepads and related events. +class QGamepadManagerPrivate : public QObjectPrivate +{ + Q_DECLARE_PUBLIC(QGamepadManager) +public: + QGamepadManagerPrivate() + : gamepadBackend(nullptr) + { + loadBackend(); + } - QGamepadManager provides a high-level interface for querying the attached - gamepads and events related to all of the connected devices. - */ + void loadBackend(); -/*! - * Constructor for QGamepadManager. - */ + QGamepadBackend *gamepadBackend; + QSet<int> connectedGamepads; -QGamepadManager::QGamepadManager() : - QObject(0) + //private slots + void _q_forwardGamepadConnected(int deviceId); + void _q_forwardGamepadDisconnected(int deviceId); + void _q_forwardGamepadAxisEvent(int deviceId, QGamepadManager::GamepadAxis axis, double value); + void _q_forwardGamepadButtonPressEvent(int deviceId, QGamepadManager::GamepadButton button, double value); + void _q_forwardGamepadButtonReleaseEvent(int deviceId, QGamepadManager::GamepadButton button); +}; + +void QGamepadManagerPrivate::_q_forwardGamepadConnected(int deviceId) { - loadBackend(); + Q_Q(QGamepadManager); + connectedGamepads.insert(deviceId); + emit q->gamepadConnected(deviceId); + emit q->connectedGamepadsChanged(); +} - qRegisterMetaType<QGamepadManager::GamepadButton>("QGamepadManager::GamepadButton"); - qRegisterMetaType<QGamepadManager::GamepadAxis>("QGamepadManager::GamepadAxis"); +void QGamepadManagerPrivate::_q_forwardGamepadDisconnected(int deviceId) +{ + Q_Q(QGamepadManager); + connectedGamepads.remove(deviceId); + emit q->gamepadDisconnected(deviceId); + emit q->connectedGamepadsChanged(); +} - connect(m_gamepadBackend, SIGNAL(gamepadAdded(int)), this, SLOT(forwardGamepadConnected(int))); - connect(m_gamepadBackend, SIGNAL(gamepadRemoved(int)), this, SLOT(forwardGamepadDisconnected(int))); - connect(m_gamepadBackend, SIGNAL(gamepadAxisMoved(int,QGamepadManager::GamepadAxis,double)), this, SLOT(forwardGamepadAxisEvent(int,QGamepadManager::GamepadAxis,double))); - connect(m_gamepadBackend, SIGNAL(gamepadButtonPressed(int,QGamepadManager::GamepadButton,double)), this, SLOT(forwardGamepadButtonPressEvent(int,QGamepadManager::GamepadButton,double))); - connect(m_gamepadBackend, SIGNAL(gamepadButtonReleased(int,QGamepadManager::GamepadButton)), this, SLOT(forwardGamepadButtonReleaseEvent(int,QGamepadManager::GamepadButton))); - connect(m_gamepadBackend, &QGamepadBackend::buttonConfigured, this, &QGamepadManager::buttonConfigured); - connect(m_gamepadBackend, &QGamepadBackend::axisConfigured, this, &QGamepadManager::axisConfigured); - connect(m_gamepadBackend, &QGamepadBackend::configurationCanceled, this, &QGamepadManager::configurationCanceled); +void QGamepadManagerPrivate::_q_forwardGamepadAxisEvent(int deviceId, QGamepadManager::GamepadAxis axis, double value) +{ + Q_Q(QGamepadManager); + emit q->gamepadAxisEvent(deviceId, axis, value); +} - if (!m_gamepadBackend->start()) - qCWarning(gp) << "Failed to start gamepad backend"; +void QGamepadManagerPrivate::_q_forwardGamepadButtonPressEvent(int deviceId, QGamepadManager::GamepadButton button, double value) +{ + Q_Q(QGamepadManager); + emit q->gamepadButtonPressEvent(deviceId, button, value); } -/*! - * Destructor for QGamepadManager. - */ -QGamepadManager::~QGamepadManager() +void QGamepadManagerPrivate::_q_forwardGamepadButtonReleaseEvent(int deviceId, QGamepadManager::GamepadButton button) { - m_gamepadBackend->stop(); - m_gamepadBackend->deleteLater(); + Q_Q(QGamepadManager); + emit q->gamepadButtonReleaseEvent(deviceId, button); } -void QGamepadManager::loadBackend() +void QGamepadManagerPrivate::loadBackend() { QStringList keys = QGamepadBackendFactory::keys(); qCDebug(gp) << "Available backends:" << keys; @@ -99,95 +115,117 @@ void QGamepadManager::loadBackend() targetKey = requestedKey; if (!targetKey.isEmpty()) { qCDebug(gp) << "Loading backend" << targetKey; - m_gamepadBackend = QGamepadBackendFactory::create(targetKey, QStringList()); + gamepadBackend = QGamepadBackendFactory::create(targetKey, QStringList()); } } - if (!m_gamepadBackend) { + if (!gamepadBackend) { //Use dummy backend - m_gamepadBackend = new QGamepadBackend(); + gamepadBackend = new QGamepadBackend(); qCDebug(gp) << "Using dummy backend"; } } -QGamepadManager *QGamepadManager::instance() -{ - static QGamepadManager instance; - return &instance; -} +/*! + \class QGamepadManager + \inmodule QtGamepad + \brief Queries attached gamepads and related events. -bool QGamepadManager::isGamepadConnected(int deviceId) -{ - return m_connectedGamepads.contains(deviceId); -} + QGamepadManager provides a high-level interface for querying the attached + gamepads and events related to all of the connected devices. + */ -const QList<int> QGamepadManager::connectedGamepads() const -{ - return m_connectedGamepads.toList(); -} +/*! + * Constructor for QGamepadManager. + */ -bool QGamepadManager::isConfigurationNeeded(int deviceId) +QGamepadManager::QGamepadManager() : + QObject(*new QGamepadManagerPrivate(), nullptr) { - return m_gamepadBackend->isConfigurationNeeded(deviceId); + Q_D(QGamepadManager); + + qRegisterMetaType<QGamepadManager::GamepadButton>("QGamepadManager::GamepadButton"); + qRegisterMetaType<QGamepadManager::GamepadAxis>("QGamepadManager::GamepadAxis"); + + connect(d->gamepadBackend, SIGNAL(gamepadAdded(int)), this, SLOT(_q_forwardGamepadConnected(int))); + connect(d->gamepadBackend, SIGNAL(gamepadRemoved(int)), this, SLOT(_q_forwardGamepadDisconnected(int))); + connect(d->gamepadBackend, SIGNAL(gamepadAxisMoved(int,QGamepadManager::GamepadAxis,double)), this, SLOT(_q_forwardGamepadAxisEvent(int,QGamepadManager::GamepadAxis,double))); + connect(d->gamepadBackend, SIGNAL(gamepadButtonPressed(int,QGamepadManager::GamepadButton,double)), this, SLOT(_q_forwardGamepadButtonPressEvent(int,QGamepadManager::GamepadButton,double))); + connect(d->gamepadBackend, SIGNAL(gamepadButtonReleased(int,QGamepadManager::GamepadButton)), this, SLOT(_q_forwardGamepadButtonReleaseEvent(int,QGamepadManager::GamepadButton))); + + connect(d->gamepadBackend, &QGamepadBackend::buttonConfigured, this, &QGamepadManager::buttonConfigured); + connect(d->gamepadBackend, &QGamepadBackend::axisConfigured, this, &QGamepadManager::axisConfigured); + connect(d->gamepadBackend, &QGamepadBackend::configurationCanceled, this, &QGamepadManager::configurationCanceled); + + if (!d->gamepadBackend->start()) + qCWarning(gp) << "Failed to start gamepad backend"; } -bool QGamepadManager::configureButton(int deviceId, QGamepadManager::GamepadButton button) +/*! + * Destructor for QGamepadManager. + */ + +QGamepadManager::~QGamepadManager() { - return m_gamepadBackend->configureButton(deviceId, button); + Q_D(QGamepadManager); + d->gamepadBackend->stop(); + d->gamepadBackend->deleteLater(); } -bool QGamepadManager::configureAxis(int deviceId, QGamepadManager::GamepadAxis axis) +QGamepadManager *QGamepadManager::instance() { - return m_gamepadBackend->configureAxis(deviceId, axis); + static QGamepadManager instance; + return &instance; } -bool QGamepadManager::setCancelConfigureButton(int deviceId, QGamepadManager::GamepadButton button) +bool QGamepadManager::isGamepadConnected(int deviceId) const { - return m_gamepadBackend->setCancelConfigureButton(deviceId, button); + Q_D(const QGamepadManager); + return d->connectedGamepads.contains(deviceId); } -void QGamepadManager::resetConfiguration(int deviceId) +const QList<int> QGamepadManager::connectedGamepads() const { - m_gamepadBackend->resetConfiguration(deviceId); + Q_D(const QGamepadManager); + return d->connectedGamepads.toList(); } -void QGamepadManager::setSettingsFile(const QString &file) +bool QGamepadManager::isConfigurationNeeded(int deviceId) const { - m_gamepadBackend->setSettingsFile(file); + Q_D(const QGamepadManager); + return d->gamepadBackend->isConfigurationNeeded(deviceId); } -void QGamepadManager::forwardGamepadConnected(int deviceId) +bool QGamepadManager::configureButton(int deviceId, QGamepadManager::GamepadButton button) { - //qDebug() << "gamepad connected: " << index; - m_connectedGamepads.insert(deviceId); - emit gamepadConnected(deviceId); - emit connectedGamepadsChanged(); + Q_D(QGamepadManager); + return d->gamepadBackend->configureButton(deviceId, button); } -void QGamepadManager::forwardGamepadDisconnected(int deviceId) +bool QGamepadManager::configureAxis(int deviceId, QGamepadManager::GamepadAxis axis) { - //qDebug() << "gamepad disconnected: " << index; - m_connectedGamepads.remove(deviceId); - emit gamepadDisconnected(deviceId); - emit connectedGamepadsChanged(); + Q_D(QGamepadManager); + return d->gamepadBackend->configureAxis(deviceId, axis); } -void QGamepadManager::forwardGamepadAxisEvent(int deviceId, QGamepadManager::GamepadAxis axis, double value) +bool QGamepadManager::setCancelConfigureButton(int deviceId, QGamepadManager::GamepadButton button) { - //qDebug() << "gamepad axis event: " << index << axis << value; - emit gamepadAxisEvent(deviceId, axis, value); + Q_D(QGamepadManager); + return d->gamepadBackend->setCancelConfigureButton(deviceId, button); } -void QGamepadManager::forwardGamepadButtonPressEvent(int deviceId, QGamepadManager::GamepadButton button, double value) +void QGamepadManager::resetConfiguration(int deviceId) { - //qDebug() << "gamepad button press event: " << index << button << value; - emit gamepadButtonPressEvent(deviceId, button, value); + Q_D(QGamepadManager); + d->gamepadBackend->resetConfiguration(deviceId); } -void QGamepadManager::forwardGamepadButtonReleaseEvent(int deviceId, QGamepadManager::GamepadButton button) +void QGamepadManager::setSettingsFile(const QString &file) { - //qDebug() << "gamepad button release event: " << index << button; - emit gamepadButtonReleaseEvent(deviceId, button); + Q_D(QGamepadManager); + d->gamepadBackend->setSettingsFile(file); } QT_END_NAMESPACE + +#include "moc_qgamepadmanager.cpp" |