blob: ff57db61d7d7d4da0aedde9add9d6c8fe240d942 [file] [log] [blame]
/****************************************************************************
**
** Copyright (C) 2015 The Qt Company Ltd.
** Contact: http://www.qt.io/licensing/
**
** This file is part of the Qt Gamepad module
**
** $QT_BEGIN_LICENSE:LGPL3$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see http://www.qt.io/terms-conditions. For further
** information use the contact form at http://www.qt.io/contact-us.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 3 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPLv3 included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 3 requirements
** will be met: https://www.gnu.org/licenses/lgpl.html.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 2.0 or later as published by the Free
** Software Foundation and appearing in the file LICENSE.GPL included in
** the packaging of this file. Please review the following information to
** ensure the GNU General Public License version 2.0 requirements will be
** met: http://www.gnu.org/licenses/gpl-2.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include "qgamepad.h"
#include <private/qobject_p.h>
QT_BEGIN_NAMESPACE
class QGamepadPrivate : public QObjectPrivate
{
Q_DECLARE_PUBLIC(QGamepad)
public:
QGamepadPrivate(int deviceId)
: deviceId(deviceId)
, connected(false)
, axisLeftX(0.0)
, axisLeftY(0.0)
, axisRightX(0.0)
, axisRightY(0.0)
, buttonA(false)
, buttonB(false)
, buttonX(false)
, buttonY(false)
, buttonL1(false)
, buttonR1(false)
, buttonL2(0.0)
, buttonR2(0.0)
, buttonSelect(false)
, buttonStart(false)
, buttonL3(false)
, buttonR3(false)
, buttonUp(false)
, buttonDown(false)
, buttonLeft(false)
, buttonRight(false)
, buttonCenter(false)
, buttonGuide(false)
{
}
QGamepadManager *gamepadManager;
int deviceId;
bool connected;
QString name;
double axisLeftX;
double axisLeftY;
double axisRightX;
double axisRightY;
bool buttonA;
bool buttonB;
bool buttonX;
bool buttonY;
bool buttonL1;
bool buttonR1;
double buttonL2;
double buttonR2;
bool buttonSelect;
bool buttonStart;
bool buttonL3;
bool buttonR3;
bool buttonUp;
bool buttonDown;
bool buttonLeft;
bool buttonRight;
bool buttonCenter;
bool buttonGuide;
void setConnected(bool isConnected);
void setName(const QString &name);
void _q_handleGamepadConnected(int id);
void _q_handleGamepadNameChanged(int id, const QString &name);
void _q_handleGamepadDisconnected(int id);
void _q_handleGamepadAxisEvent(int id, QGamepadManager::GamepadAxis axis, double value);
void _q_handleGamepadButtonPressEvent(int id, QGamepadManager::GamepadButton button, double value);
void _q_handleGamepadButtonReleaseEvent(int id, QGamepadManager::GamepadButton button);
};
void QGamepadPrivate::setConnected(bool isConnected)
{
Q_Q(QGamepad);
if (connected != isConnected) {
connected = isConnected;
emit q->connectedChanged(connected);
}
}
void QGamepadPrivate::setName(const QString &theName)
{
Q_Q(QGamepad);
if (name != theName) {
name = theName;
emit q->nameChanged(name);
}
}
/*!
* \internal
*/\
void QGamepadPrivate::_q_handleGamepadConnected(int id)
{
if (id == deviceId) {
setConnected(true);
}
}
/*!
* \internal
*/\
void QGamepadPrivate::_q_handleGamepadNameChanged(int id, const QString &name)
{
if (id == deviceId)
setName(name);
}
/*!
* \internal
*/\
void QGamepadPrivate::_q_handleGamepadDisconnected(int id)
{
if (id == deviceId) {
setConnected(false);
}
}
/*!
* \internal
*/\
void QGamepadPrivate::_q_handleGamepadAxisEvent(int id, QGamepadManager::GamepadAxis axis, double value)
{
Q_Q(QGamepad);
if (id != deviceId)
return;
switch (axis) {
case QGamepadManager::AxisLeftX:
axisLeftX = value;
emit q->axisLeftXChanged(value);
break;
case QGamepadManager::AxisLeftY:
axisLeftY = value;
emit q->axisLeftYChanged(value);
break;
case QGamepadManager::AxisRightX:
axisRightX = value;
emit q->axisRightXChanged(value);
break;
case QGamepadManager::AxisRightY:
axisRightY = value;
emit q->axisRightYChanged(value);
break;
default:
break;
}
}
/*!
* \internal
*/\
void QGamepadPrivate::_q_handleGamepadButtonPressEvent(int id, QGamepadManager::GamepadButton button, double value)
{
Q_Q(QGamepad);
if (id != deviceId)
return;
switch (button) {
case QGamepadManager::ButtonA:
buttonA = true;
emit q->buttonAChanged(true);
break;
case QGamepadManager::ButtonB:
buttonB = true;
emit q->buttonBChanged(true);
break;
case QGamepadManager::ButtonX:
buttonX = true;
emit q->buttonXChanged(true);
break;
case QGamepadManager::ButtonY:
buttonY = true;
emit q->buttonYChanged(true);
break;
case QGamepadManager::ButtonL1:
buttonL1 = true;
emit q->buttonL1Changed(true);
break;
case QGamepadManager::ButtonR1:
buttonR1 = true;
emit q->buttonR1Changed(true);
break;
case QGamepadManager::ButtonL2:
buttonL2 = value;
emit q->buttonL2Changed(value);
break;
case QGamepadManager::ButtonR2:
buttonR2 = value;
emit q->buttonR2Changed(value);
break;
case QGamepadManager::ButtonL3:
buttonL3 = true;
emit q->buttonL3Changed(true);
break;
case QGamepadManager::ButtonR3:
buttonR3 = true;
emit q->buttonR3Changed(true);
break;
case QGamepadManager::ButtonSelect:
buttonSelect = true;
emit q->buttonSelectChanged(true);
break;
case QGamepadManager::ButtonStart:
buttonStart = true;
emit q->buttonStartChanged(true);
break;
case QGamepadManager::ButtonUp:
buttonUp = true;
emit q->buttonUpChanged(true);
break;
case QGamepadManager::ButtonDown:
buttonDown = true;
emit q->buttonDownChanged(true);
break;
case QGamepadManager::ButtonLeft:
buttonLeft = true;
emit q->buttonLeftChanged(true);
break;
case QGamepadManager::ButtonRight:
buttonRight = true;
emit q->buttonRightChanged(true);
break;
case QGamepadManager::ButtonCenter:
buttonCenter = true;
emit q->buttonCenterChanged(true);
break;
case QGamepadManager::ButtonGuide:
buttonGuide = true;
emit q->buttonGuideChanged(true);
break;
default:
break;
}
}
/*!
* \internal
*/\
void QGamepadPrivate::_q_handleGamepadButtonReleaseEvent(int id, QGamepadManager::GamepadButton button)
{
Q_Q(QGamepad);
if (id != deviceId)
return;
switch (button) {
case QGamepadManager::ButtonA:
buttonA = false;
emit q->buttonAChanged(false);
break;
case QGamepadManager::ButtonB:
buttonB = false;
emit q->buttonBChanged(false);
break;
case QGamepadManager::ButtonX:
buttonX = false;
emit q->buttonXChanged(false);
break;
case QGamepadManager::ButtonY:
buttonY = false;
emit q->buttonYChanged(false);
break;
case QGamepadManager::ButtonL1:
buttonL1 = false;
emit q->buttonL1Changed(false);
break;
case QGamepadManager::ButtonR1:
buttonR1 = false;
emit q->buttonR1Changed(false);
break;
case QGamepadManager::ButtonL2:
buttonL2 = 0.0;
emit q->buttonL2Changed(0.0);
break;
case QGamepadManager::ButtonR2:
buttonR2 = 0.0;
emit q->buttonR2Changed(0.0);
break;
case QGamepadManager::ButtonL3:
buttonL3 = false;
emit q->buttonL3Changed(false);
break;
case QGamepadManager::ButtonR3:
buttonR3 = false;
emit q->buttonR3Changed(false);
break;
case QGamepadManager::ButtonSelect:
buttonSelect = false;
emit q->buttonSelectChanged(false);
break;
case QGamepadManager::ButtonStart:
buttonStart = false;
emit q->buttonStartChanged(false);
break;
case QGamepadManager::ButtonUp:
buttonUp = false;
emit q->buttonUpChanged(false);
break;
case QGamepadManager::ButtonDown:
buttonDown = false;
emit q->buttonDownChanged(false);
break;
case QGamepadManager::ButtonLeft:
buttonLeft = false;
emit q->buttonLeftChanged(false);
break;
case QGamepadManager::ButtonRight:
buttonRight = false;
emit q->buttonRightChanged(false);
break;
case QGamepadManager::ButtonCenter:
buttonCenter = false;
emit q->buttonCenterChanged(false);
break;
case QGamepadManager::ButtonGuide:
buttonGuide = false;
emit q->buttonGuideChanged(false);
break;
default:
break;
}
}
/*!
\class QGamepad
\inmodule QtGamepad
\brief A gamepad device connected to a system.
QGamepad is used to access the current state of gamepad hardware connected
to a system.
*/
/*!
* \qmltype Gamepad
* \inqmlmodule QtGamepad
* \brief A gamepad device connected to a system.
* \instantiates QGamepad
*
* Gamepad QML type is used to access the current state of gamepad
* hardware connected to a system.
*/
/*!
* Constructs a QGamepad with the given \a deviceId and \a parent.
*/
QGamepad::QGamepad(int deviceId, QObject *parent)
: QObject(*new QGamepadPrivate(deviceId), parent)
{
Q_D(QGamepad);
d->gamepadManager = QGamepadManager::instance();
connect(d->gamepadManager, SIGNAL(gamepadConnected(int)), this, SLOT(_q_handleGamepadConnected(int)));
connect(d->gamepadManager, SIGNAL(gamepadNameChanged(int, QString)), this, SLOT(_q_handleGamepadNameChanged(int, QString)));
connect(d->gamepadManager, SIGNAL(gamepadDisconnected(int)), this, SLOT(_q_handleGamepadDisconnected(int)));
connect(d->gamepadManager, SIGNAL(gamepadAxisEvent(int,QGamepadManager::GamepadAxis,double)), this, SLOT(_q_handleGamepadAxisEvent(int,QGamepadManager::GamepadAxis,double)));
connect(d->gamepadManager, SIGNAL(gamepadButtonPressEvent(int,QGamepadManager::GamepadButton,double)), this, SLOT(_q_handleGamepadButtonPressEvent(int,QGamepadManager::GamepadButton,double)));
connect(d->gamepadManager, SIGNAL(gamepadButtonReleaseEvent(int,QGamepadManager::GamepadButton)), this, SLOT(_q_handleGamepadButtonReleaseEvent(int,QGamepadManager::GamepadButton)));
d->setConnected(d->gamepadManager->isGamepadConnected(deviceId));
d->setName(d->gamepadManager->gamepadName(deviceId));
}
QGamepad::~QGamepad()
{
}
/*!
* \property QGamepad::deviceId
*
* This property holds the deviceId of the gamepad device. Multiple gamepad devices can be
* connected at any given time, so setting this property defines which gamepad to use.
*
* \sa QGamepadManager::connectedGamepads()
*/
/*!
* \qmlproperty int Gamepad::deviceId
*
* This property holds the deviceId of the gamepad device. Multiple gamepad devices can be
* connected at any given time, so setting this property defines which gamepad to use.
*
* \sa {GamepadManager::connectedGamepads}{GamepadManager.connectedGamepads}
*/
int QGamepad::deviceId() const
{
Q_D(const QGamepad);
return d->deviceId;
}
/*!
* \property QGamepad::connected
*
* The connectivity state of the gamepad device.
* If a gamepad is connected, this property will be \c true, otherwise \c false.
*/
/*!
* \qmlproperty bool Gamepad::connected
* \readonly
*
* The connectivity state of the gamepad device.
* If a gamepad is connected, this property will be \c true, otherwise \c false.
*/
bool QGamepad::isConnected() const
{
Q_D(const QGamepad);
return d->connected;
}
/*!
* \property QGamepad::name
*
* The reported name of the gamepad if one is available.
*/
/*!
* \qmlproperty string Gamepad::name
* \readonly
*
* The reported name of the gamepad if one is available.
*/
QString QGamepad::name() const
{
Q_D(const QGamepad);
return d->name;
}
/*!
* \property QGamepad::axisLeftX
*
* The value of the left thumbstick's X axis.
* The axis values range from -1.0 to 1.0.
*/
/*!
* \qmlproperty double Gamepad::axisLeftX
* \readonly
*
* The value of the left thumbstick's X axis.
* The axis values range from -1.0 to 1.0.
*/
double QGamepad::axisLeftX() const
{
Q_D(const QGamepad);
return d->axisLeftX;
}
/*!
* \property QGamepad::axisLeftY
*
* The value of the left thumbstick's Y axis.
* The axis values range from -1.0 to 1.0.
*/
/*!
* \qmlproperty double Gamepad::axisLeftY
* \readonly
*
* The value of the left thumbstick's Y axis.
* The axis values range from -1.0 to 1.0.
*/
double QGamepad::axisLeftY() const
{
Q_D(const QGamepad);
return d->axisLeftY;
}
/*!
* \property QGamepad::axisRightX
*
* This value of the right thumbstick's X axis.
* The axis values range from -1.0 to 1.0.
*/
/*!
* \qmlproperty double Gamepad::axisRightX
* \readonly
*
* This value of the right thumbstick's X axis.
* The axis values range from -1.0 to 1.0.
*/
double QGamepad::axisRightX() const
{
Q_D(const QGamepad);
return d->axisRightX;
}
/*!
* \property QGamepad::axisRightY
*
* This value of the right thumbstick's Y axis.
* The axis values range from -1.0 to 1.0.
*/
/*!
* \qmlproperty double Gamepad::axisRightY
* \readonly
*
* This value of the right thumbstick's Y axis.
* The axis values range from -1.0 to 1.0.
*/
double QGamepad::axisRightY() const
{
Q_D(const QGamepad);
return d->axisRightY;
}
/*!
* \property QGamepad::buttonA
*
* The state of the A button.
* The value is \c true when pressed, and \c false when not pressed.
*/
/*!
* \qmlproperty bool Gamepad::buttonA
* \readonly
*
* The state of the A button.
* The value is \c true when pressed, and \c false when not pressed.
*/
bool QGamepad::buttonA() const
{
Q_D(const QGamepad);
return d->buttonA;
}
/*!
* \property QGamepad::buttonB
*
* The state of the B button.
* The value is \c true when pressed, and \c false when not pressed.
*/
/*!
* \qmlproperty bool Gamepad::buttonB
* \readonly
*
* The state of the B button.
* The value is \c true when pressed, and \c false when not pressed.
*/
bool QGamepad::buttonB() const
{
Q_D(const QGamepad);
return d->buttonB;
}
/*!
* \property QGamepad::buttonX
*
* The state of the X button.
* The value is \c true when pressed, and \c false when not pressed.
*/
/*!
* \qmlproperty bool Gamepad::buttonX
* \readonly
*
* The state of the X button.
* The value is \c true when pressed, and \c false when not pressed.
*/
bool QGamepad::buttonX() const
{
Q_D(const QGamepad);
return d->buttonX;
}
/*!
* \property QGamepad::buttonY
*
* The state of the Y button.
* The value is \c true when pressed, and \c false when not pressed.
*/
/*!
* \qmlproperty bool Gamepad::buttonY
* \readonly
*
* The state of the Y button.
* The value is \c true when pressed, and \c false when not pressed.
*/
bool QGamepad::buttonY() const
{
Q_D(const QGamepad);
return d->buttonY;
}
/*!
* \property QGamepad::buttonL1
*
* The state of the left shoulder button.
* The value is \c true when pressed, and \c false when not pressed.
*/
/*!
* \qmlproperty bool Gamepad::buttonL1
* \readonly
*
* The state of the left shoulder button.
* The value is \c true when pressed, and \c false when not pressed.
*/
bool QGamepad::buttonL1() const
{
Q_D(const QGamepad);
return d->buttonL1;
}
/*!
* \property QGamepad::buttonR1
*
* The state of the right shoulder button.
* The value is \c true when pressed, and \c false when not pressed.
*/
/*!
* \qmlproperty bool Gamepad::buttonR1
* \readonly
*
* The state of the right shoulder button.
* The value is \c true when pressed, and \c false when not pressed.
*/
bool QGamepad::buttonR1() const
{
Q_D(const QGamepad);
return d->buttonR1;
}
/*!
* \property QGamepad::buttonL2
*
* The value of the left trigger button.
* This trigger value ranges from 0.0 when not pressed to 1.0
* when pressed completely.
*/
/*!
* \qmlproperty double Gamepad::buttonL2
* \readonly
*
* The value of the left trigger button.
* This trigger value ranges from 0.0 when not pressed to 1.0
* when pressed completely.
*/
double QGamepad::buttonL2() const
{
Q_D(const QGamepad);
return d->buttonL2;
}
/*!
* \property QGamepad::buttonR2
*
* The value of the right trigger button.
* This trigger value ranges from 0.0 when not pressed to 1.0
* when pressed completely.
*/
/*!
* \qmlproperty double Gamepad::buttonR2
* \readonly
*
* The value of the right trigger button.
* This trigger value ranges from 0.0 when not pressed to 1.0
* when pressed completely.
*/
double QGamepad::buttonR2() const
{
Q_D(const QGamepad);
return d->buttonR2;
}
/*!
* \property QGamepad::buttonSelect
*
* The state of the Select button.
* The value is \c true when pressed, and \c false when not pressed.
* This button can sometimes be labeled as the Back button on some gamepads.
*/
/*!
* \qmlproperty bool Gamepad::buttonSelect
* \readonly
*
* The state of the Select button.
* The value is \c true when pressed, and \c false when not pressed.
* This button can sometimes be labeled as the Back button on some gamepads.
*/
bool QGamepad::buttonSelect() const
{
Q_D(const QGamepad);
return d->buttonSelect;
}
/*!
* \property QGamepad::buttonStart
*
* The state of the Start button.
* The value is \c true when pressed, and \c false when not pressed.
* This button can sometimes be labeled as the Forward button on some gamepads.
*/
/*!
* \qmlproperty bool Gamepad::buttonStart
* \readonly
*
* The state of the Start button.
* The value is \c true when pressed, and \c false when not pressed.
* This button can sometimes be labeled as the Forward button on some gamepads.
*/
bool QGamepad::buttonStart() const
{
Q_D(const QGamepad);
return d->buttonStart;
}
/*!
* \property QGamepad::buttonL3
*
* The state of the left stick button.
* The value is \c true when pressed, and \c false when not pressed.
* This button is usually triggered by pressing the left joystick itself.
*/
/*!
* \qmlproperty bool Gamepad::buttonL3
* \readonly
*
* The state of the left stick button.
* The value is \c true when pressed, and \c false when not pressed.
* This button is usually triggered by pressing the left joystick itself.
*/
bool QGamepad::buttonL3() const
{
Q_D(const QGamepad);
return d->buttonL3;
}
/*!
* \property QGamepad::buttonR3
*
* The state of the right stick button.
* The value is \c true when pressed, and \c false when not pressed.
* This button is usually triggered by pressing the right joystick itself.
*/
/*!
* \qmlproperty bool Gamepad::buttonR3
* \readonly
*
* The state of the right stick button.
* The value is \c true when pressed, and \c false when not pressed.
* This button is usually triggered by pressing the right joystick itself.
*/
bool QGamepad::buttonR3() const
{
Q_D(const QGamepad);
return d->buttonR3;
}
/*!
* \property QGamepad::buttonUp
*
* The state of the direction pad up button.
* The value is \c true when pressed, and \c false when not pressed.
*/
/*!
* \qmlproperty bool Gamepad::buttonUp
* \readonly
*
* The state of the direction pad up button.
* The value is \c true when pressed, and \c false when not pressed.
*/
bool QGamepad::buttonUp() const
{
Q_D(const QGamepad);
return d->buttonUp;
}
/*!
* \property QGamepad::buttonDown
*
* The state of the direction pad down button.
* The value is \c true when pressed, and \c false when not pressed.
*/
/*!
* \qmlproperty bool Gamepad::buttonDown
* \readonly
*
* The state of the direction pad down button.
* The value is \c true when pressed, and \c false when not pressed.
*/
bool QGamepad::buttonDown() const
{
Q_D(const QGamepad);
return d->buttonDown;
}
/*!
* \property QGamepad::buttonLeft
*
* The state of the direction pad left button.
* The value is \c true when pressed, and \c false when not pressed.
*/
/*!
* \qmlproperty bool Gamepad::buttonLeft
* \readonly
*
* The state of the direction pad left button.
* The value is \c true when pressed, and \c false when not pressed.
*/
bool QGamepad::buttonLeft() const
{
Q_D(const QGamepad);
return d->buttonLeft;
}
/*!
* \property QGamepad::buttonRight
*
* The state of the direction pad right button.
* The value is \c true when pressed, and \c false when not pressed.
*/
/*!
* \qmlproperty bool Gamepad::buttonRight
* \readonly
*
* The state of the direction pad right button.
* The value is \c true when pressed, and \c false when not pressed.
*/
bool QGamepad::buttonRight() const
{
Q_D(const QGamepad);
return d->buttonRight;
}
/*!
* \property QGamepad::buttonCenter
*
* The state of the center button.
* The value is \c true when pressed, and \c false when not pressed.
*/
/*
* \qmlproperty bool Gamepad::buttonCenter
* \readonly
*
* The state of the center button.
* The value is \c true when pressed, and \c false when not pressed.
*/
bool QGamepad::buttonCenter() const
{
Q_D(const QGamepad);
return d->buttonCenter;
}
/*!
* \property QGamepad::buttonGuide
*
* The state of the guide button.
* The value is \c true when pressed, and \c false when not pressed.
* This button is typically the one in the center of the gamepad with a logo.
* Not all gamepads have a guide button.
*/
/*
* \qmlproperty bool Gamepad::buttonGuide
* \readonly
*
* The state of the guide button.
* The value is \c true when pressed, and \c false when not pressed.
* This button is typically the one in the center of the gamepad with a logo.
* Not all gamepads have a guide button.
*/
bool QGamepad::buttonGuide() const
{
Q_D(const QGamepad);
return d->buttonGuide;
}
void QGamepad::setDeviceId(int number)
{
Q_D(QGamepad);
if (d->deviceId != number) {
d->deviceId = number;
emit deviceIdChanged(number);
d->setConnected(d->gamepadManager->isGamepadConnected(d->deviceId));
}
}
QT_END_NAMESPACE
#include "moc_qgamepad.cpp"