| 
						
						
							
								
							
						
						
					 | 
				
			
			 | 
			 | 
			
				@ -348,22 +348,22 @@ ConfigureInputPlayer::ConfigureInputPlayer(QWidget* parent, std::size_t player_i
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    // Player Connected checkbox
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    connect(ui->groupConnectedController, &QGroupBox::toggled,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            [&](bool checked) { emit Connected(checked); });
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            [this](bool checked) { emit Connected(checked); });
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    // Set up controller type. Only Player 1 can choose Handheld.
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    ui->comboControllerType->clear();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    QStringList controller_types = {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        QStringLiteral("Pro Controller"),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        QStringLiteral("Dual Joycons"),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        QStringLiteral("Left Joycon"),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        QStringLiteral("Right Joycon"),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        tr("Pro Controller"),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        tr("Dual Joycons"),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        tr("Left Joycon"),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        tr("Right Joycon"),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    };
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    if (player_index == 0) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        controller_types.append(QStringLiteral("Handheld"));
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        controller_types.append(tr("Handheld"));
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        connect(ui->comboControllerType, qOverload<int>(&QComboBox::currentIndexChanged),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                [&](int index) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                [this](int index) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                    emit HandheldStateChanged(GetControllerTypeFromIndex(index) ==
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                                              Settings::ControllerType::Handheld);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                });
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -375,7 +375,7 @@ ConfigureInputPlayer::ConfigureInputPlayer(QWidget* parent, std::size_t player_i
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        ui->buttonHome->setEnabled(false);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        ui->groupConnectedController->setCheckable(false);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        QStringList debug_controller_types = {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            QStringLiteral("Pro Controller"),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            tr("Pro Controller"),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        };
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        ui->comboControllerType->addItems(debug_controller_types);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    } else {
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -384,17 +384,18 @@ ConfigureInputPlayer::ConfigureInputPlayer(QWidget* parent, std::size_t player_i
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    UpdateControllerIcon();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    UpdateControllerAvailableButtons();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    connect(ui->comboControllerType, qOverload<int>(&QComboBox::currentIndexChanged), [&](int) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    connect(ui->comboControllerType, qOverload<int>(&QComboBox::currentIndexChanged), [this](int) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        UpdateControllerIcon();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        UpdateControllerAvailableButtons();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    });
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    connect(ui->comboDevices, qOverload<int>(&QComboBox::currentIndexChanged),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            [&] { UpdateMappingWithDefaults(); });
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    connect(ui->comboDevices, qOverload<int>(&QComboBox::currentIndexChanged), this,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            &ConfigureInputPlayer::UpdateMappingWithDefaults);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    ui->buttonRefreshDevices->setIcon(QIcon::fromTheme(QStringLiteral("view-refresh")));
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    UpdateInputDevices();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    connect(ui->buttonRefreshDevices, &QPushButton::clicked, [&] { emit RefreshInputDevices(); });
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    connect(ui->buttonRefreshDevices, &QPushButton::clicked,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            [this] { emit RefreshInputDevices(); });
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    timeout_timer->setSingleShot(true);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    connect(timeout_timer.get(), &QTimer::timeout, [this] { SetPollingResult({}, true); });
 | 
			
		
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
			
			 | 
			 | 
			
				@ -707,26 +708,22 @@ void ConfigureInputPlayer::keyPressEvent(QKeyEvent* event) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				void ConfigureInputPlayer::UpdateControllerIcon() {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    // We aren't using Qt's built in theme support here since we aren't drawing an icon (and its
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    // "nonstandard" to use an image through the icon support)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    QString stylesheet{};
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    switch (GetControllerTypeFromIndex(ui->comboControllerType->currentIndex())) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    case Settings::ControllerType::ProController:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        stylesheet = QStringLiteral("image: url(:/controller/pro_controller%0)");
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        break;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    case Settings::ControllerType::DualJoyconDetached:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        stylesheet = QStringLiteral("image: url(:/controller/dual_joycon%0)");
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        break;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    case Settings::ControllerType::LeftJoycon:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        stylesheet = QStringLiteral("image: url(:/controller/single_joycon_left_vertical%0)");
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        break;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    case Settings::ControllerType::RightJoycon:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        stylesheet = QStringLiteral("image: url(:/controller/single_joycon_right_vertical%0)");
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        break;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    case Settings::ControllerType::Handheld:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        stylesheet = QStringLiteral("image: url(:/controller/handheld%0)");
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        break;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    default:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        break;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    const QString stylesheet = [this] {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        switch (GetControllerTypeFromIndex(ui->comboControllerType->currentIndex())) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        case Settings::ControllerType::ProController:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            return QStringLiteral("image: url(:/controller/pro_controller%0)");
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        case Settings::ControllerType::DualJoyconDetached:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            return QStringLiteral("image: url(:/controller/dual_joycon%0)");
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        case Settings::ControllerType::LeftJoycon:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            return QStringLiteral("image: url(:/controller/single_joycon_left_vertical%0)");
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        case Settings::ControllerType::RightJoycon:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            return QStringLiteral("image: url(:/controller/single_joycon_right_vertical%0)");
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        case Settings::ControllerType::Handheld:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            return QStringLiteral("image: url(:/controller/handheld%0)");
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        default:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            return QString{};
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    }();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    const QString theme = [this] {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        if (QIcon::themeName().contains(QStringLiteral("dark"))) {
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -744,12 +741,12 @@ void ConfigureInputPlayer::UpdateControllerIcon() {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				void ConfigureInputPlayer::UpdateControllerAvailableButtons() {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    auto layout = GetControllerTypeFromIndex(ui->comboControllerType->currentIndex());
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    if (debug) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        layout = Settings::ControllerType::DualJoyconDetached;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        layout = Settings::ControllerType::ProController;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    // List of all the widgets that will be hidden by any of the following layouts that need
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    // "unhidden" after the controller type changes
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    const std::vector<QWidget*> layout_show = {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    const std::array<QWidget*, 9> layout_show = {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        ui->buttonShoulderButtonsSLSR,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        ui->horizontalSpacerShoulderButtonsWidget,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        ui->horizontalSpacerShoulderButtonsWidget2,
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -768,11 +765,6 @@ void ConfigureInputPlayer::UpdateControllerAvailableButtons() {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    std::vector<QWidget*> layout_hidden;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    switch (layout) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    case Settings::ControllerType::ProController:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        layout_hidden = {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            ui->buttonShoulderButtonsSLSR,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            ui->horizontalSpacerShoulderButtonsWidget2,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        };
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        break;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    case Settings::ControllerType::DualJoyconDetached:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    case Settings::ControllerType::Handheld:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        layout_hidden = {
 | 
			
		
		
	
	
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
				
			
			 | 
			 | 
			
				
 
 |