diff options
Diffstat (limited to 'src/frontend/qt_sdl/InputConfig/InputConfigDialog.cpp')
-rw-r--r-- | src/frontend/qt_sdl/InputConfig/InputConfigDialog.cpp | 253 |
1 files changed, 253 insertions, 0 deletions
diff --git a/src/frontend/qt_sdl/InputConfig/InputConfigDialog.cpp b/src/frontend/qt_sdl/InputConfig/InputConfigDialog.cpp new file mode 100644 index 0000000..4ed843e --- /dev/null +++ b/src/frontend/qt_sdl/InputConfig/InputConfigDialog.cpp @@ -0,0 +1,253 @@ +/* + Copyright 2016-2021 Arisotura + + This file is part of melonDS. + + melonDS is free software: you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + melonDS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with melonDS. If not, see http://www.gnu.org/licenses/. +*/ + +#include <QGroupBox> +#include <QLabel> +#include <QKeyEvent> +#include <QDebug> + +#include <SDL2/SDL.h> + +#include "types.h" +#include "Config.h" +#include "PlatformConfig.h" + +#include "MapButton.h" +#include "Input.h" +#include "InputConfigDialog.h" +#include "ui_InputConfigDialog.h" + + +InputConfigDialog* InputConfigDialog::currentDlg = nullptr; + +const int dskeyorder[12] = {0, 1, 10, 11, 5, 4, 6, 7, 9, 8, 2, 3}; +const char* dskeylabels[12] = {"A", "B", "X", "Y", "Left", "Right", "Up", "Down", "L", "R", "Select", "Start"}; + +const int hk_addons[] = +{ + HK_SolarSensorIncrease, + HK_SolarSensorDecrease, +}; + +const char* hk_addons_labels[] = +{ + "[Boktai] Sunlight + ", + "[Boktai] Sunlight - ", +}; + +const int hk_general[] = +{ + HK_Pause, + HK_Reset, + HK_FrameStep, + HK_FastForward, + HK_FastForwardToggle, + HK_FullscreenToggle, + HK_Lid, + HK_Mic, + HK_SwapScreens +}; + +const char* hk_general_labels[] = +{ + "Pause/resume", + "Reset", + "Frame step", + "Fast forward", + "Toggle FPS limit", + "Toggle Fullscreen", + "Close/open lid", + "Microphone", + "Swap screens" +}; + +const int keypad_num = 12; +const int hk_addons_num = 2; +const int hk_general_num = 9; + + +InputConfigDialog::InputConfigDialog(QWidget* parent) : QDialog(parent), ui(new Ui::InputConfigDialog) +{ + ui->setupUi(this); + setAttribute(Qt::WA_DeleteOnClose); + + for (int i = 0; i < keypad_num; i++) + { + keypadKeyMap[i] = Config::KeyMapping[dskeyorder[i]]; + keypadJoyMap[i] = Config::JoyMapping[dskeyorder[i]]; + } + + for (int i = 0; i < hk_addons_num; i++) + { + addonsKeyMap[i] = Config::HKKeyMapping[hk_addons[i]]; + addonsJoyMap[i] = Config::HKJoyMapping[hk_addons[i]]; + } + + for (int i = 0; i < hk_general_num; i++) + { + hkGeneralKeyMap[i] = Config::HKKeyMapping[hk_general[i]]; + hkGeneralJoyMap[i] = Config::HKJoyMapping[hk_general[i]]; + } + + populatePage(ui->tabAddons, hk_addons_num, hk_addons_labels, addonsKeyMap, addonsJoyMap); + populatePage(ui->tabHotkeysGeneral, hk_general_num, hk_general_labels, hkGeneralKeyMap, hkGeneralJoyMap); + + int njoy = SDL_NumJoysticks(); + if (njoy > 0) + { + for (int i = 0; i < njoy; i++) + { + const char* name = SDL_JoystickNameForIndex(i); + ui->cbxJoystick->addItem(QString(name)); + } + ui->cbxJoystick->setCurrentIndex(Input::JoystickID); + } + else + { + ui->cbxJoystick->addItem("(no joysticks available)"); + ui->cbxJoystick->setEnabled(false); + } + + setupKeypadPage(); +} + +InputConfigDialog::~InputConfigDialog() +{ + delete ui; +} + +void InputConfigDialog::setupKeypadPage() +{ + for (int i = 0; i < keypad_num; i++) + { + QPushButton* pushButtonKey = this->findChild<QPushButton*>(QStringLiteral("btnKey") + dskeylabels[i]); + QPushButton* pushButtonJoy = this->findChild<QPushButton*>(QStringLiteral("btnJoy") + dskeylabels[i]); + + KeyMapButton* keyMapButtonKey = new KeyMapButton(&keypadKeyMap[i], false); + JoyMapButton* keyMapButtonJoy = new JoyMapButton(&keypadJoyMap[i], false); + + pushButtonKey->parentWidget()->layout()->replaceWidget(pushButtonKey, keyMapButtonKey); + pushButtonJoy->parentWidget()->layout()->replaceWidget(pushButtonJoy, keyMapButtonJoy); + + delete pushButtonKey; + delete pushButtonJoy; + + if (ui->cbxJoystick->isEnabled()) + { + ui->stackMapping->setCurrentIndex(1); + } + } +} + +void InputConfigDialog::populatePage(QWidget* page, int num, const char** labels, int* keymap, int* joymap) +{ + // kind of a hack + bool ishotkey = (page != ui->tabInput); + + QHBoxLayout* main_layout = new QHBoxLayout(); + + QGroupBox* group; + QGridLayout* group_layout; + + group = new QGroupBox("Keyboard mappings:"); + main_layout->addWidget(group); + group_layout = new QGridLayout(); + group_layout->setSpacing(1); + for (int i = 0; i < num; i++) + { + QLabel* label = new QLabel(QString(labels[i])+":"); + KeyMapButton* btn = new KeyMapButton(&keymap[i], ishotkey); + + group_layout->addWidget(label, i, 0); + group_layout->addWidget(btn, i, 1); + } + group_layout->setRowStretch(num, 1); + group->setLayout(group_layout); + group->setMinimumWidth(275); + + group = new QGroupBox("Joystick mappings:"); + main_layout->addWidget(group); + group_layout = new QGridLayout(); + group_layout->setSpacing(1); + for (int i = 0; i < num; i++) + { + QLabel* label = new QLabel(QString(labels[i])+":"); + JoyMapButton* btn = new JoyMapButton(&joymap[i], ishotkey); + + group_layout->addWidget(label, i, 0); + group_layout->addWidget(btn, i, 1); + } + group_layout->setRowStretch(num, 1); + group->setLayout(group_layout); + group->setMinimumWidth(275); + + page->setLayout(main_layout); +} + +void InputConfigDialog::on_InputConfigDialog_accepted() +{ + for (int i = 0; i < 12; i++) + { + Config::KeyMapping[dskeyorder[i]] = keypadKeyMap[i]; + Config::JoyMapping[dskeyorder[i]] = keypadJoyMap[i]; + } + + for (int i = 0; i < 2; i++) + { + Config::HKKeyMapping[hk_addons[i]] = addonsKeyMap[i]; + Config::HKJoyMapping[hk_addons[i]] = addonsJoyMap[i]; + } + + for (int i = 0; i < 9; i++) + { + Config::HKKeyMapping[hk_general[i]] = hkGeneralKeyMap[i]; + Config::HKJoyMapping[hk_general[i]] = hkGeneralJoyMap[i]; + } + + Config::JoystickID = Input::JoystickID; + Config::Save(); + + closeDlg(); +} + +void InputConfigDialog::on_InputConfigDialog_rejected() +{ + Input::JoystickID = Config::JoystickID; + Input::OpenJoystick(); + + closeDlg(); +} + +void InputConfigDialog::on_btnKeyMapSwitch_clicked() +{ + ui->stackMapping->setCurrentIndex(0); +} + +void InputConfigDialog::on_btnJoyMapSwitch_clicked() +{ + ui->stackMapping->setCurrentIndex(1); +} + +void InputConfigDialog::on_cbxJoystick_currentIndexChanged(int id) +{ + // prevent a spurious change + if (ui->cbxJoystick->count() < 2) return; + + Input::JoystickID = id; + Input::OpenJoystick(); +} |