소스 검색

yuzu: Improve behavior when clicking on controller box in Control Configuration

When reducing the number of Connecter Controllers, keep the one clicked if it was not the last one of the list
flodavid 2 년 전
부모
커밋
27ab2a6e13
2개의 변경된 파일27개의 추가작업 그리고 10개의 파일을 삭제
  1. 26 10
      src/yuzu/configuration/configure_input.cpp
  2. 1 0
      src/yuzu/configuration/configure_input.h

+ 26 - 10
src/yuzu/configuration/configure_input.cpp

@@ -115,17 +115,9 @@ void ConfigureInput::Initialize(InputCommon::InputSubsystem* input_subsystem,
     for (std::size_t i = 0; i < player_tabs.size(); ++i) {
         player_tabs[i]->setLayout(new QHBoxLayout(player_tabs[i]));
         player_tabs[i]->layout()->addWidget(player_controllers[i]);
-        connect(player_controllers[i], &ConfigureInputPlayer::Connected, [&, i](bool is_connected) {
+        connect(player_connected[i], &QCheckBox::clicked, [this, i](int checked) {
             // Ensures that the controllers are always connected in sequential order
-            if (is_connected) {
-                for (std::size_t index = 0; index <= i; ++index) {
-                    player_connected[index]->setChecked(is_connected);
-                }
-            } else {
-                for (std::size_t index = i; index < player_tabs.size(); ++index) {
-                    player_connected[index]->setChecked(is_connected);
-                }
-            }
+            this->propagateMouseClickOnPlayers(i, checked, true);
         });
         connect(player_controllers[i], &ConfigureInputPlayer::RefreshInputDevices, this,
                 &ConfigureInput::UpdateAllInputDevices);
@@ -183,6 +175,30 @@ void ConfigureInput::Initialize(InputCommon::InputSubsystem* input_subsystem,
     LoadConfiguration();
 }
 
+void ConfigureInput::propagateMouseClickOnPlayers(size_t player_index, bool checked, bool origin) {
+    // Origin has already been toggled
+    if (!origin) {
+        player_connected[player_index]->setChecked(checked);
+    }
+
+    if (checked) {
+        // Check all previous buttons when checked
+        if (player_index > 0) {
+            propagateMouseClickOnPlayers(player_index - 1, checked, false);
+        }
+    } else {
+        // Unchecked all following buttons when unchecked
+        if (player_index < player_tabs.size() - 1) {
+            // Reconnect current player if it was the last one checked
+            // (player number was reduced by more than one)
+            if (origin && player_connected[player_index + 1]->checkState() == Qt::Checked) {
+                player_connected[player_index]->setCheckState(Qt::Checked);
+            }
+            propagateMouseClickOnPlayers(player_index + 1, checked, false);
+        }
+    }
+}
+
 QList<QWidget*> ConfigureInput::GetSubTabs() const {
     return {
         ui->tabPlayer1, ui->tabPlayer2, ui->tabPlayer3, ui->tabPlayer4,  ui->tabPlayer5,

+ 1 - 0
src/yuzu/configuration/configure_input.h

@@ -56,6 +56,7 @@ private:
     void UpdateDockedState(bool is_handheld);
     void UpdateAllInputDevices();
     void UpdateAllInputProfiles(std::size_t player_index);
+    void propagateMouseClickOnPlayers(size_t player_index, bool origin, bool checked);
 
     /// Load configuration settings.
     void LoadConfiguration();