diff --git a/src/axiseditdialog.cpp b/src/axiseditdialog.cpp index aaed3b6f..a96306dc 100644 --- a/src/axiseditdialog.cpp +++ b/src/axiseditdialog.cpp @@ -23,6 +23,17 @@ AxisEditDialog::AxisEditDialog(JoyAxis *axis, QWidget *parent) : updateWindowTitleAxisName(); initialThrottleState = axis->getThrottle(); + bool actAsTrigger = false; + if (initialThrottleState == JoyAxis::PositiveThrottle || + initialThrottleState == JoyAxis::PositiveHalfThrottle) + { + actAsTrigger = true; + } + + if (actAsTrigger) + { + buildTriggerPresetsMenu(); + } ui->horizontalSlider->setValue(axis->getDeadZone()); ui->lineEdit->setText(QString::number(axis->getDeadZone())); @@ -76,7 +87,14 @@ AxisEditDialog::AxisEditDialog(JoyAxis *axis, QWidget *parent) : ui->joyValueLabel->setText(QString::number(axis->getCurrentRawValue())); ui->axisstatusBox->setValue(axis->getCurrentRawValue()); - selectCurrentPreset(); + if (!actAsTrigger) + { + selectAxisCurrentPreset(); + } + else + { + selectTriggerPreset(); + } ui->axisNameLineEdit->setText(axis->getAxisName()); @@ -91,6 +109,8 @@ AxisEditDialog::AxisEditDialog(JoyAxis *axis, QWidget *parent) : connect(ui->horizontalSlider_2, SIGNAL(valueChanged(int)), axis, SLOT(setMaxZoneValue(int))); connect(ui->comboBox_2, SIGNAL(currentIndexChanged(int)), this, SLOT(updateThrottleUi(int))); + connect(ui->comboBox_2, SIGNAL(currentIndexChanged(int)), this, SLOT(presetForThrottleChange(int))); + connect(axis, SIGNAL(moved(int)), ui->axisstatusBox, SLOT(setValue(int))); connect(axis, SIGNAL(moved(int)), this, SLOT(updateJoyValue(int))); @@ -113,6 +133,26 @@ AxisEditDialog::~AxisEditDialog() } void AxisEditDialog::implementPresets(int index) +{ + bool actAsTrigger = false; + int currentThrottle = axis->getThrottle(); + if (currentThrottle == JoyAxis::PositiveThrottle || + currentThrottle == JoyAxis::PositiveHalfThrottle) + { + actAsTrigger = true; + } + + if (actAsTrigger) + { + implementTriggerPresets(index); + } + else + { + implementAxisPresets(index); + } +} + +void AxisEditDialog::implementAxisPresets(int index) { JoyButtonSlot *nbuttonslot = 0; JoyButtonSlot *pbuttonslot = 0; @@ -309,7 +349,7 @@ void AxisEditDialog::checkFinalSettings() } } -void AxisEditDialog::selectCurrentPreset() +void AxisEditDialog::selectAxisCurrentPreset() { JoyAxisButton *naxisbutton = axis->getNAxisButton(); QList *naxisslots = naxisbutton->getAssignedSlots(); @@ -385,14 +425,86 @@ void AxisEditDialog::selectCurrentPreset() } } +void AxisEditDialog::selectTriggerPreset() +{ + JoyAxisButton *paxisbutton = axis->getPAxisButton(); + QList *paxisslots = paxisbutton->getAssignedSlots(); + + if (paxisslots->length() == 1) + { + JoyButtonSlot *pslot = paxisslots->at(0); + if (pslot->getSlotMode() == JoyButtonSlot::JoyMouseButton && pslot->getSlotCode() == JoyButtonSlot::MouseLB) + { + ui->presetsComboBox->setCurrentIndex(1); + } + else if (pslot->getSlotMode() == JoyButtonSlot::JoyMouseButton && pslot->getSlotCode() == JoyButtonSlot::MouseRB) + { + ui->presetsComboBox->setCurrentIndex(2); + } + else + { + ui->presetsComboBox->setCurrentIndex(0); + } + } + else if (paxisslots->length() == 0) + { + ui->presetsComboBox->setCurrentIndex(3); + } + else + { + ui->presetsComboBox->setCurrentIndex(0); + } +} + +void AxisEditDialog::implementTriggerPresets(int index) +{ + JoyButtonSlot *pbuttonslot = 0; + + if (index == 1) + { + pbuttonslot = new JoyButtonSlot(JoyButtonSlot::MouseLB, JoyButtonSlot::JoyMouseButton, this); + } + else if (index == 2) + { + pbuttonslot = new JoyButtonSlot(JoyButtonSlot::MouseRB, JoyButtonSlot::JoyMouseButton, this); + } + else if (index == 3) + { + JoyAxisButton *nbutton = axis->getNAxisButton(); + JoyAxisButton *pbutton = axis->getPAxisButton(); + nbutton->clearSlotsEventReset(); + refreshNButtonLabel(); + + pbutton->clearSlotsEventReset(); + refreshPButtonLabel(); + } + + if (pbuttonslot) + { + + JoyAxisButton *nbutton = axis->getNAxisButton(); + JoyAxisButton *pbutton = axis->getPAxisButton(); + if (nbutton->getAssignedSlots()->length() > 0) + { + nbutton->clearSlotsEventReset(); + refreshNButtonLabel(); + } + + pbutton->clearSlotsEventReset(false); + pbutton->setAssignedSlot(pbuttonslot->getSlotCode(), pbuttonslot->getSlotCodeAlias(), pbuttonslot->getSlotMode()); + refreshPButtonLabel(); + pbuttonslot->deleteLater(); + } +} + void AxisEditDialog::refreshPreset() { // Disconnect event associated with presetsComboBox so a change in the index does not // alter the axis buttons - disconnect(ui->presetsComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(implementPresets(int))); - selectCurrentPreset(); + disconnect(ui->presetsComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(implementAxisPresets(int))); + selectAxisCurrentPreset(); // Reconnect the event - connect(ui->presetsComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(implementPresets(int))); + connect(ui->presetsComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(implementAxisPresets(int))); } void AxisEditDialog::openMouseSettingsDialog() @@ -439,3 +551,58 @@ void AxisEditDialog::updateWindowTitleAxisName() setWindowTitle(temp); } + +void AxisEditDialog::buildAxisPresetsMenu() +{ + ui->presetsComboBox->clear(); + + ui->presetsComboBox->addItem(tr("")); + ui->presetsComboBox->addItem(tr("Mouse (Horizontal)")); + ui->presetsComboBox->addItem(tr("Mouse (Inverted Horizontal)")); + ui->presetsComboBox->addItem(tr("Mouse (Vertical)")); + ui->presetsComboBox->addItem(tr("Mouse (Inverted Vertical)")); + ui->presetsComboBox->addItem(tr("Arrows: Up | Down")); + ui->presetsComboBox->addItem(tr("Arrows: Left | Right")); + ui->presetsComboBox->addItem(tr("Keys: W | S")); + ui->presetsComboBox->addItem(tr("Keys: A | D")); + ui->presetsComboBox->addItem(tr("NumPad: KP_8 | KP_2")); + ui->presetsComboBox->addItem(tr("NumPad: KP_4 | KP_6")); + ui->presetsComboBox->addItem(tr("None")); +} + +void AxisEditDialog::buildTriggerPresetsMenu() +{ + ui->presetsComboBox->clear(); + + ui->presetsComboBox->addItem(tr("")); + ui->presetsComboBox->addItem(tr("Left Mouse Button")); + ui->presetsComboBox->addItem(tr("Right Mouse Button")); + ui->presetsComboBox->addItem(tr("None")); +} + +void AxisEditDialog::presetForThrottleChange(int index) +{ + Q_UNUSED(index); + + bool actAsTrigger = false; + int currentThrottle = axis->getThrottle(); + if (currentThrottle == JoyAxis::PositiveThrottle || + currentThrottle == JoyAxis::PositiveHalfThrottle) + { + actAsTrigger = true; + } + + disconnect(ui->presetsComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(implementPresets(int))); + if (actAsTrigger) + { + buildTriggerPresetsMenu(); + selectTriggerPreset(); + } + else + { + buildAxisPresetsMenu(); + selectAxisCurrentPreset(); + } + + connect(ui->presetsComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(implementPresets(int))); +} diff --git a/src/axiseditdialog.h b/src/axiseditdialog.h index 90d546fb..a465dd24 100644 --- a/src/axiseditdialog.h +++ b/src/axiseditdialog.h @@ -20,7 +20,11 @@ public: ~AxisEditDialog(); protected: - void selectCurrentPreset(); + void selectAxisCurrentPreset(); + void selectTriggerPreset(); + + void buildTriggerPresetsMenu(); + void buildAxisPresetsMenu(); JoyAxis *axis; SetAxisThrottleDialog *setAxisThrottleConfirm; @@ -30,7 +34,11 @@ private: Ui::AxisEditDialog *ui; private slots: + void implementAxisPresets(int index); + void implementTriggerPresets(int index); void implementPresets(int index); + void presetForThrottleChange(int index); + void updateDeadZoneBox(int value); void updateMaxZoneBox(int value); void updateThrottleUi(int index); diff --git a/src/joyaxiscontextmenu.cpp b/src/joyaxiscontextmenu.cpp index 2f603c60..e0eaa60d 100644 --- a/src/joyaxiscontextmenu.cpp +++ b/src/joyaxiscontextmenu.cpp @@ -11,6 +11,25 @@ JoyAxisContextMenu::JoyAxisContextMenu(JoyAxis *axis, QWidget *parent) : } void JoyAxisContextMenu::buildMenu() +{ + bool actAsTrigger = false; + if (axis->getThrottle() == JoyAxis::PositiveThrottle || + axis->getThrottle() == JoyAxis::PositiveHalfThrottle) + { + actAsTrigger = true; + } + + if (actAsTrigger) + { + buildTriggerMenu(); + } + else + { + buildAxisMenu(); + } +} + +void JoyAxisContextMenu::buildAxisMenu() { QAction *action = 0; @@ -272,3 +291,98 @@ void JoyAxisContextMenu::openMouseSettingsDialog() MouseAxisSettingsDialog *dialog = new MouseAxisSettingsDialog(this->axis, parentWidget()); dialog->show(); } + +void JoyAxisContextMenu::buildTriggerMenu() +{ + QAction *action = 0; + + QActionGroup *presetGroup = new QActionGroup(this); + int presetMode = 0; + int currentPreset = getTriggerPresetIndex(); + + action = this->addAction(tr("Left Mouse Button")); + action->setCheckable(true); + action->setChecked(currentPreset == presetMode+1); + action->setData(QVariant(presetMode)); + connect(action, SIGNAL(triggered()), this, SLOT(setTriggerPreset())); + presetGroup->addAction(action); + + presetMode++; + action = this->addAction(tr("Right Mouse Button")); + action->setCheckable(true); + action->setChecked(currentPreset == presetMode+1); + action->setData(QVariant(presetMode)); + connect(action, SIGNAL(triggered()), this, SLOT(setTriggerPreset())); + presetGroup->addAction(action); + + presetMode++; + action = this->addAction(tr("None")); + action->setCheckable(true); + action->setChecked(currentPreset == presetMode+1); + action->setData(QVariant(presetMode)); + connect(action, SIGNAL(triggered()), this, SLOT(setTriggerPreset())); + presetGroup->addAction(action); + + this->addSeparator(); + + action = this->addAction(tr("Mouse Settings")); + action->setCheckable(false); + connect(action, SIGNAL(triggered()), this, SLOT(openMouseSettingsDialog())); +} + +int JoyAxisContextMenu::getTriggerPresetIndex() +{ + int result = 0; + + JoyAxisButton *paxisbutton = axis->getPAxisButton(); + QList *paxisslots = paxisbutton->getAssignedSlots(); + + if (paxisslots->length() == 1) + { + JoyButtonSlot *pslot = paxisslots->at(0); + if (pslot->getSlotMode() == JoyButtonSlot::JoyMouseButton && pslot->getSlotCode() == JoyButtonSlot::MouseLB) + { + result = 1; + } + else if (pslot->getSlotMode() == JoyButtonSlot::JoyMouseButton && pslot->getSlotCode() == JoyButtonSlot::MouseRB) + { + result = 2; + } + } + else if (paxisslots->length() == 0) + { + result = 3; + } + + return result; +} + +void JoyAxisContextMenu::setTriggerPreset() +{ + QAction *action = static_cast(sender()); + int item = action->data().toInt(); + + JoyButtonSlot *pbuttonslot = 0; + + if (item == 0) + { + pbuttonslot = new JoyButtonSlot(JoyButtonSlot::MouseLB, JoyButtonSlot::JoyMouseButton, this); + } + else if (item == 1) + { + pbuttonslot = new JoyButtonSlot(JoyButtonSlot::MouseRB, JoyButtonSlot::JoyMouseButton, this); + } + else if (item == 2) + { + JoyAxisButton *pbutton = axis->getPAxisButton(); + pbutton->clearSlotsEventReset(); + } + + if (pbuttonslot) + { + JoyAxisButton *button = axis->getPAxisButton(); + button->clearSlotsEventReset(false); + button->setAssignedSlot(pbuttonslot->getSlotCode(), pbuttonslot->getSlotCodeAlias(), pbuttonslot->getSlotMode()); + pbuttonslot->deleteLater(); + } +} diff --git a/src/joyaxiscontextmenu.h b/src/joyaxiscontextmenu.h index 677323d8..fb47ebfe 100644 --- a/src/joyaxiscontextmenu.h +++ b/src/joyaxiscontextmenu.h @@ -11,9 +11,12 @@ class JoyAxisContextMenu : public QMenu public: explicit JoyAxisContextMenu(JoyAxis *axis, QWidget *parent = 0); void buildMenu(); + void buildAxisMenu(); + void buildTriggerMenu(); protected: int getPresetIndex(); + int getTriggerPresetIndex(); JoyAxis *axis; @@ -23,6 +26,7 @@ public slots: private slots: void setAxisPreset(); + void setTriggerPreset(); void openMouseSettingsDialog(); }; diff --git a/src/joybuttonslot.h b/src/joybuttonslot.h index 9e6d5c0c..13237744 100644 --- a/src/joybuttonslot.h +++ b/src/joybuttonslot.h @@ -17,6 +17,7 @@ public: enum JoySlotMouseDirection {MouseUp=1, MouseDown, MouseLeft, MouseRight}; enum JoySlotMouseWheelButton {MouseWheelUp=4, MouseWheelDown=5, MouseWheelLeft=6, MouseWheelRight=7}; + enum JoySlotMouseButton {MouseLB=1, MouseMB, MouseRB}; explicit JoyButtonSlot(QObject *parent = 0); explicit JoyButtonSlot(int code, JoySlotInputAction mode, QObject *parent=0);