configure_input.cpp 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. // Copyright 2016 Citra Emulator Project
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #include <algorithm>
  5. #include <memory>
  6. #include <utility>
  7. #include <QMenu>
  8. #include <QMessageBox>
  9. #include <QTimer>
  10. #include "common/param_package.h"
  11. #include "configuration/configure_touchscreen_advanced.h"
  12. #include "core/core.h"
  13. #include "core/hle/service/hid/controllers/npad.h"
  14. #include "input_common/main.h"
  15. #include "ui_configure_input.h"
  16. #include "ui_configure_input_player.h"
  17. #include "ui_configure_mouse_advanced.h"
  18. #include "ui_configure_touchscreen_advanced.h"
  19. #include "yuzu/configuration/config.h"
  20. #include "yuzu/configuration/configure_input.h"
  21. #include "yuzu/configuration/configure_input_player.h"
  22. #include "yuzu/configuration/configure_mouse_advanced.h"
  23. ConfigureInput::ConfigureInput(QWidget* parent)
  24. : QWidget(parent), ui(std::make_unique<Ui::ConfigureInput>()) {
  25. ui->setupUi(this);
  26. players_enabled = {
  27. ui->player1_checkbox, ui->player2_checkbox, ui->player3_checkbox, ui->player4_checkbox,
  28. ui->player5_checkbox, ui->player6_checkbox, ui->player7_checkbox, ui->player8_checkbox,
  29. };
  30. player_controller = {
  31. ui->player1_combobox, ui->player2_combobox, ui->player3_combobox, ui->player4_combobox,
  32. ui->player5_combobox, ui->player6_combobox, ui->player7_combobox, ui->player8_combobox,
  33. };
  34. player_configure = {
  35. ui->player1_configure, ui->player2_configure, ui->player3_configure, ui->player4_configure,
  36. ui->player5_configure, ui->player6_configure, ui->player7_configure, ui->player8_configure,
  37. };
  38. for (auto* controller_box : player_controller) {
  39. controller_box->addItems(
  40. {"Pro Controller", "Dual Joycons", "Single Right Joycon", "Single Left Joycon"});
  41. }
  42. this->loadConfiguration();
  43. updateUIEnabled();
  44. connect(ui->restore_defaults_button, &QPushButton::pressed, this,
  45. &ConfigureInput::restoreDefaults);
  46. for (auto* enabled : players_enabled)
  47. connect(enabled, &QCheckBox::stateChanged, this, &ConfigureInput::updateUIEnabled);
  48. connect(ui->use_docked_mode, &QCheckBox::stateChanged, this, &ConfigureInput::updateUIEnabled);
  49. connect(ui->handheld_connected, &QCheckBox::stateChanged, this,
  50. &ConfigureInput::updateUIEnabled);
  51. connect(ui->mouse_enabled, &QCheckBox::stateChanged, this, &ConfigureInput::updateUIEnabled);
  52. connect(ui->keyboard_enabled, &QCheckBox::stateChanged, this, &ConfigureInput::updateUIEnabled);
  53. connect(ui->debug_enabled, &QCheckBox::stateChanged, this, &ConfigureInput::updateUIEnabled);
  54. connect(ui->touchscreen_enabled, &QCheckBox::stateChanged, this,
  55. &ConfigureInput::updateUIEnabled);
  56. for (std::size_t i = 0; i < player_configure.size(); ++i) {
  57. connect(player_configure[i], &QPushButton::pressed, this,
  58. [this, i]() { CallConfigureDialog<ConfigureInputPlayer>(i, false); });
  59. }
  60. connect(ui->handheld_configure, &QPushButton::pressed, this,
  61. [this]() { CallConfigureDialog<ConfigureInputPlayer>(8, false); });
  62. connect(ui->debug_configure, &QPushButton::pressed, this,
  63. [this]() { CallConfigureDialog<ConfigureInputPlayer>(9, true); });
  64. connect(ui->mouse_advanced, &QPushButton::pressed, this,
  65. [this]() { CallConfigureDialog<ConfigureMouseAdvanced>(); });
  66. connect(ui->touchscreen_advanced, &QPushButton::pressed, this,
  67. [this]() { CallConfigureDialog<ConfigureTouchscreenAdvanced>(); });
  68. ui->use_docked_mode->setEnabled(!Core::System::GetInstance().IsPoweredOn());
  69. }
  70. template <typename Dialog, typename... Args>
  71. void ConfigureInput::CallConfigureDialog(Args&&... args) {
  72. this->applyConfiguration();
  73. Dialog dialog(this, std::forward<Args>(args)...);
  74. const auto res = dialog.exec();
  75. if (res == QDialog::Accepted) {
  76. dialog.applyConfiguration();
  77. }
  78. }
  79. void ConfigureInput::applyConfiguration() {
  80. for (std::size_t i = 0; i < players_enabled.size(); ++i) {
  81. Settings::values.players[i].connected = players_enabled[i]->isChecked();
  82. Settings::values.players[i].type =
  83. static_cast<Settings::ControllerType>(player_controller[i]->currentIndex());
  84. }
  85. Settings::values.use_docked_mode = ui->use_docked_mode->isChecked();
  86. Settings::values
  87. .players[Service::HID::Controller_NPad::NPadIdToIndex(Service::HID::NPAD_HANDHELD)]
  88. .connected = ui->handheld_connected->isChecked();
  89. Settings::values.debug_pad_enabled = ui->debug_enabled->isChecked();
  90. Settings::values.mouse_enabled = ui->mouse_enabled->isChecked();
  91. Settings::values.keyboard_enabled = ui->keyboard_enabled->isChecked();
  92. Settings::values.touchscreen.enabled = ui->touchscreen_enabled->isChecked();
  93. }
  94. void ConfigureInput::updateUIEnabled() {
  95. for (std::size_t i = 0; i < players_enabled.size(); ++i) {
  96. const auto enabled = players_enabled[i]->checkState() == Qt::Checked;
  97. player_controller[i]->setEnabled(enabled);
  98. player_configure[i]->setEnabled(enabled);
  99. }
  100. bool hit_disabled = false;
  101. for (auto* player : players_enabled) {
  102. player->setDisabled(hit_disabled);
  103. if (!player->isChecked())
  104. hit_disabled = true;
  105. }
  106. ui->handheld_connected->setEnabled(!ui->use_docked_mode->isChecked());
  107. ui->handheld_configure->setEnabled(ui->handheld_connected->isChecked() &&
  108. !ui->use_docked_mode->isChecked());
  109. ui->mouse_advanced->setEnabled(ui->mouse_enabled->isChecked());
  110. ui->debug_configure->setEnabled(ui->debug_enabled->isChecked());
  111. ui->touchscreen_advanced->setEnabled(ui->touchscreen_enabled->isChecked());
  112. }
  113. void ConfigureInput::loadConfiguration() {
  114. std::stable_partition(Settings::values.players.begin(), Settings::values.players.end(),
  115. [](const auto& player) { return player.connected; });
  116. for (std::size_t i = 0; i < players_enabled.size(); ++i) {
  117. players_enabled[i]->setChecked(Settings::values.players[i].connected);
  118. player_controller[i]->setCurrentIndex(static_cast<u8>(Settings::values.players[i].type));
  119. }
  120. ui->use_docked_mode->setChecked(Settings::values.use_docked_mode);
  121. ui->handheld_connected->setChecked(
  122. Settings::values
  123. .players[Service::HID::Controller_NPad::NPadIdToIndex(Service::HID::NPAD_HANDHELD)]
  124. .connected);
  125. ui->debug_enabled->setChecked(Settings::values.debug_pad_enabled);
  126. ui->mouse_enabled->setChecked(Settings::values.mouse_enabled);
  127. ui->keyboard_enabled->setChecked(Settings::values.keyboard_enabled);
  128. ui->touchscreen_enabled->setChecked(Settings::values.touchscreen.enabled);
  129. updateUIEnabled();
  130. }
  131. void ConfigureInput::restoreDefaults() {
  132. players_enabled[0]->setCheckState(Qt::Checked);
  133. player_controller[0]->setCurrentIndex(1);
  134. for (std::size_t i = 1; i < players_enabled.size(); ++i) {
  135. players_enabled[i]->setCheckState(Qt::Unchecked);
  136. player_controller[i]->setCurrentIndex(0);
  137. }
  138. ui->use_docked_mode->setCheckState(Qt::Unchecked);
  139. ui->handheld_connected->setCheckState(Qt::Unchecked);
  140. ui->mouse_enabled->setCheckState(Qt::Unchecked);
  141. ui->keyboard_enabled->setCheckState(Qt::Unchecked);
  142. ui->debug_enabled->setCheckState(Qt::Unchecked);
  143. ui->touchscreen_enabled->setCheckState(Qt::Checked);
  144. updateUIEnabled();
  145. }