configure_input_player: Use the npad style set to show the available controllers
This will reduce the likelihood of an invalid controller type to be set within a game
This commit is contained in:
		| @@ -27,6 +27,8 @@ | ||||
| #include "yuzu/configuration/input_profiles.h" | ||||
| #include "yuzu/util/limitable_input_dialog.h" | ||||
|  | ||||
| using namespace Service::HID; | ||||
|  | ||||
| const std::array<std::string, ConfigureInputPlayer::ANALOG_SUB_BUTTONS_NUM> | ||||
|     ConfigureInputPlayer::analog_sub_buttons{{ | ||||
|         "up", | ||||
| @@ -47,48 +49,12 @@ void UpdateController(Settings::ControllerType controller_type, std::size_t npad | ||||
|     } | ||||
|     Service::SM::ServiceManager& sm = system.ServiceManager(); | ||||
|  | ||||
|     auto& npad = | ||||
|         sm.GetService<Service::HID::Hid>("hid") | ||||
|             ->GetAppletResource() | ||||
|             ->GetController<Service::HID::Controller_NPad>(Service::HID::HidController::NPad); | ||||
|     auto& npad = sm.GetService<Hid>("hid")->GetAppletResource()->GetController<Controller_NPad>( | ||||
|         HidController::NPad); | ||||
|  | ||||
|     npad.UpdateControllerAt(npad.MapSettingsTypeToNPad(controller_type), npad_index, connected); | ||||
| } | ||||
|  | ||||
| /// Maps the controller type combobox index to Controller Type enum | ||||
| constexpr Settings::ControllerType GetControllerTypeFromIndex(int index) { | ||||
|     switch (index) { | ||||
|     case 0: | ||||
|     default: | ||||
|         return Settings::ControllerType::ProController; | ||||
|     case 1: | ||||
|         return Settings::ControllerType::DualJoyconDetached; | ||||
|     case 2: | ||||
|         return Settings::ControllerType::LeftJoycon; | ||||
|     case 3: | ||||
|         return Settings::ControllerType::RightJoycon; | ||||
|     case 4: | ||||
|         return Settings::ControllerType::Handheld; | ||||
|     } | ||||
| } | ||||
|  | ||||
| /// Maps the Controller Type enum to controller type combobox index | ||||
| constexpr int GetIndexFromControllerType(Settings::ControllerType type) { | ||||
|     switch (type) { | ||||
|     case Settings::ControllerType::ProController: | ||||
|     default: | ||||
|         return 0; | ||||
|     case Settings::ControllerType::DualJoyconDetached: | ||||
|         return 1; | ||||
|     case Settings::ControllerType::LeftJoycon: | ||||
|         return 2; | ||||
|     case Settings::ControllerType::RightJoycon: | ||||
|         return 3; | ||||
|     case Settings::ControllerType::Handheld: | ||||
|         return 4; | ||||
|     } | ||||
| } | ||||
|  | ||||
| QString GetKeyName(int key_code) { | ||||
|     switch (key_code) { | ||||
|     case Qt::LeftButton: | ||||
| @@ -453,18 +419,7 @@ ConfigureInputPlayer::ConfigureInputPlayer(QWidget* parent, std::size_t player_i | ||||
|     connect(ui->groupConnectedController, &QGroupBox::toggled, | ||||
|             [this](bool checked) { emit Connected(checked); }); | ||||
|  | ||||
|     // Set up controller type. Only Player 1 can choose Handheld. | ||||
|     ui->comboControllerType->clear(); | ||||
|  | ||||
|     QStringList controller_types = { | ||||
|         tr("Pro Controller"), | ||||
|         tr("Dual Joycons"), | ||||
|         tr("Left Joycon"), | ||||
|         tr("Right Joycon"), | ||||
|     }; | ||||
|  | ||||
|     if (player_index == 0) { | ||||
|         controller_types.append(tr("Handheld")); | ||||
|         connect(ui->comboControllerType, qOverload<int>(&QComboBox::currentIndexChanged), | ||||
|                 [this](int index) { | ||||
|                     emit HandheldStateChanged(GetControllerTypeFromIndex(index) == | ||||
| @@ -480,12 +435,9 @@ ConfigureInputPlayer::ConfigureInputPlayer(QWidget* parent, std::size_t player_i | ||||
|     if (debug) { | ||||
|         ui->buttonScreenshot->setEnabled(false); | ||||
|         ui->buttonHome->setEnabled(false); | ||||
|         QStringList debug_controller_types = { | ||||
|             tr("Pro Controller"), | ||||
|         }; | ||||
|         ui->comboControllerType->addItems(debug_controller_types); | ||||
|         ui->comboControllerType->addItem(tr("Pro Controller")); | ||||
|     } else { | ||||
|         ui->comboControllerType->addItems(controller_types); | ||||
|         SetConnectableControllers(); | ||||
|     } | ||||
|  | ||||
|     UpdateControllerIcon(); | ||||
| @@ -667,7 +619,7 @@ void ConfigureInputPlayer::LoadConfiguration() { | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     ui->comboControllerType->setCurrentIndex(static_cast<int>(player.controller_type)); | ||||
|     ui->comboControllerType->setCurrentIndex(GetIndexFromControllerType(player.controller_type)); | ||||
|     ui->groupConnectedController->setChecked( | ||||
|         player.connected || | ||||
|         (player_index == 0 && Settings::values.players.GetValue()[HANDHELD_INDEX].connected)); | ||||
| @@ -841,6 +793,82 @@ void ConfigureInputPlayer::UpdateUI() { | ||||
|     } | ||||
| } | ||||
|  | ||||
| void ConfigureInputPlayer::SetConnectableControllers() { | ||||
|     const auto add_controllers = [this](bool enable_all, | ||||
|                                         Controller_NPad::NpadStyleSet npad_style_set = {}) { | ||||
|         index_controller_type_pairs.clear(); | ||||
|         ui->comboControllerType->clear(); | ||||
|  | ||||
|         if (enable_all || npad_style_set.pro_controller == 1) { | ||||
|             index_controller_type_pairs.emplace_back(ui->comboControllerType->count(), | ||||
|                                                      Settings::ControllerType::ProController); | ||||
|             ui->comboControllerType->addItem(tr("Pro Controller")); | ||||
|         } | ||||
|  | ||||
|         if (enable_all || npad_style_set.joycon_dual == 1) { | ||||
|             index_controller_type_pairs.emplace_back(ui->comboControllerType->count(), | ||||
|                                                      Settings::ControllerType::DualJoyconDetached); | ||||
|             ui->comboControllerType->addItem(tr("Dual Joycons")); | ||||
|         } | ||||
|  | ||||
|         if (enable_all || npad_style_set.joycon_left == 1) { | ||||
|             index_controller_type_pairs.emplace_back(ui->comboControllerType->count(), | ||||
|                                                      Settings::ControllerType::LeftJoycon); | ||||
|             ui->comboControllerType->addItem(tr("Left Joycon")); | ||||
|         } | ||||
|  | ||||
|         if (enable_all || npad_style_set.joycon_right == 1) { | ||||
|             index_controller_type_pairs.emplace_back(ui->comboControllerType->count(), | ||||
|                                                      Settings::ControllerType::RightJoycon); | ||||
|             ui->comboControllerType->addItem(tr("Right Joycon")); | ||||
|         } | ||||
|  | ||||
|         if (player_index == 0 && (enable_all || npad_style_set.handheld == 1)) { | ||||
|             index_controller_type_pairs.emplace_back(ui->comboControllerType->count(), | ||||
|                                                      Settings::ControllerType::Handheld); | ||||
|             ui->comboControllerType->addItem(tr("Handheld")); | ||||
|         } | ||||
|     }; | ||||
|  | ||||
|     Core::System& system{Core::System::GetInstance()}; | ||||
|  | ||||
|     if (!system.IsPoweredOn()) { | ||||
|         add_controllers(true); | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     Service::SM::ServiceManager& sm = system.ServiceManager(); | ||||
|  | ||||
|     auto& npad = sm.GetService<Hid>("hid")->GetAppletResource()->GetController<Controller_NPad>( | ||||
|         HidController::NPad); | ||||
|  | ||||
|     add_controllers(false, npad.GetSupportedStyleSet()); | ||||
| } | ||||
|  | ||||
| Settings::ControllerType ConfigureInputPlayer::GetControllerTypeFromIndex(int index) const { | ||||
|     const auto it = | ||||
|         std::find_if(index_controller_type_pairs.begin(), index_controller_type_pairs.end(), | ||||
|                      [index](const auto& pair) { return pair.first == index; }); | ||||
|  | ||||
|     if (it == index_controller_type_pairs.end()) { | ||||
|         return Settings::ControllerType::ProController; | ||||
|     } | ||||
|  | ||||
|     return it->second; | ||||
| } | ||||
|  | ||||
| int ConfigureInputPlayer::GetIndexFromControllerType(Settings::ControllerType type) const { | ||||
|     const auto it = | ||||
|         std::find_if(index_controller_type_pairs.begin(), index_controller_type_pairs.end(), | ||||
|                      [type](const auto& pair) { return pair.second == type; }); | ||||
|  | ||||
|     if (it == index_controller_type_pairs.end()) { | ||||
|         return -1; | ||||
|     } | ||||
|  | ||||
|     return it->first; | ||||
| } | ||||
|  | ||||
| void ConfigureInputPlayer::UpdateInputDevices() { | ||||
|     input_devices = input_subsystem->GetInputDevices(); | ||||
|     ui->comboDevices->clear(); | ||||
|   | ||||
| @@ -9,6 +9,7 @@ | ||||
| #include <memory> | ||||
| #include <optional> | ||||
| #include <string> | ||||
| #include <vector> | ||||
|  | ||||
| #include <QWidget> | ||||
|  | ||||
| @@ -112,6 +113,15 @@ private: | ||||
|     /// Update UI to reflect current configuration. | ||||
|     void UpdateUI(); | ||||
|  | ||||
|     /// Sets the available controllers. | ||||
|     void SetConnectableControllers(); | ||||
|  | ||||
|     /// Gets the Controller Type for a given controller combobox index. | ||||
|     Settings::ControllerType GetControllerTypeFromIndex(int index) const; | ||||
|  | ||||
|     /// Gets the controller combobox index for a given Controller Type. | ||||
|     int GetIndexFromControllerType(Settings::ControllerType type) const; | ||||
|  | ||||
|     /// Update the available input devices. | ||||
|     void UpdateInputDevices(); | ||||
|  | ||||
| @@ -151,6 +161,9 @@ private: | ||||
|     std::unique_ptr<QTimer> timeout_timer; | ||||
|     std::unique_ptr<QTimer> poll_timer; | ||||
|  | ||||
|     /// Stores a pair of "Connected Controllers" combobox index and Controller Type enum. | ||||
|     std::vector<std::pair<int, Settings::ControllerType>> index_controller_type_pairs; | ||||
|  | ||||
|     static constexpr int PLAYER_COUNT = 8; | ||||
|     std::array<QCheckBox*, PLAYER_COUNT> player_connected_checkbox; | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Morph
					Morph