From 72b2f5d34f2f24bdcb252d2158d43aa7f827e60b Mon Sep 17 00:00:00 2001
From: Morph <39850852+Morph1984@users.noreply.github.com>
Date: Thu, 27 Aug 2020 03:52:26 -0400
Subject: [PATCH] applets/controller: Load configuration prior to setting up
 connections

This avoids unintentionally changing the states of elements while loading them in.
---
 src/yuzu/applets/controller.cpp | 46 +++++++++++++++++++--------------
 src/yuzu/applets/controller.h   |  6 ++---
 2 files changed, 29 insertions(+), 23 deletions(-)

diff --git a/src/yuzu/applets/controller.cpp b/src/yuzu/applets/controller.cpp
index 4783446a80..4920d2df64 100644
--- a/src/yuzu/applets/controller.cpp
+++ b/src/yuzu/applets/controller.cpp
@@ -171,7 +171,18 @@ QtControllerSelectorDialog::QtControllerSelectorDialog(
         ui->checkboxPlayer7Connected, ui->checkboxPlayer8Connected,
     };
 
+    // Setup/load everything prior to setting up connections.
+    // This avoids unintentionally changing the states of elements while loading them in.
+    SetSupportedControllers();
+    DisableUnsupportedPlayers();
+    LoadConfiguration();
+
     for (std::size_t i = 0; i < NUM_PLAYERS; ++i) {
+        SetExplainText(i);
+        UpdateControllerIcon(i);
+        UpdateLEDPattern(i);
+        UpdateBorderColor(i);
+
         connect(player_groupboxes[i], &QGroupBox::toggled, [this, i](bool checked) {
             if (checked) {
                 for (std::size_t index = 0; index <= i; ++index) {
@@ -208,8 +219,6 @@ QtControllerSelectorDialog::QtControllerSelectorDialog(
                                           Settings::ControllerType::Handheld);
                     });
         }
-
-        SetExplainText(i);
     }
 
     connect(ui->inputConfigButton, &QPushButton::clicked, this,
@@ -218,10 +227,6 @@ QtControllerSelectorDialog::QtControllerSelectorDialog(
     connect(ui->buttonBox, &QDialogButtonBox::accepted, this,
             &QtControllerSelectorDialog::ApplyConfiguration);
 
-    SetSupportedControllers();
-    DisableUnsupportedPlayers();
-    LoadConfiguration();
-
     // If keep_controllers_connected is false, forcefully disconnect all controllers
     if (!parameters.keep_controllers_connected) {
         for (auto player : player_groupboxes) {
@@ -249,6 +254,21 @@ void QtControllerSelectorDialog::ApplyConfiguration() {
     Settings::values.vibration_enabled = ui->vibrationGroup->isChecked();
 }
 
+void QtControllerSelectorDialog::LoadConfiguration() {
+    for (std::size_t index = 0; index < NUM_PLAYERS; ++index) {
+        const auto connected = Settings::values.players[index].connected ||
+                               (index == 0 && Settings::values.players[8].connected);
+        player_groupboxes[index]->setChecked(connected);
+        connected_controller_checkboxes[index]->setChecked(connected);
+        emulated_controllers[index]->setCurrentIndex(
+            GetIndexFromControllerType(Settings::values.players[index].controller_type));
+    }
+
+    UpdateDockedState(Settings::values.players[8].connected);
+
+    ui->vibrationGroup->setChecked(Settings::values.vibration_enabled);
+}
+
 void QtControllerSelectorDialog::CallConfigureInputDialog() {
     const auto max_supported_players = parameters.enable_single_mode ? 1 : parameters.max_players;
 
@@ -557,20 +577,6 @@ void QtControllerSelectorDialog::DisableUnsupportedPlayers() {
     }
 }
 
-void QtControllerSelectorDialog::LoadConfiguration() {
-    for (std::size_t index = 0; index < NUM_PLAYERS; ++index) {
-        const auto connected = Settings::values.players[index].connected ||
-                               (index == 0 && Settings::values.players[8].connected);
-        player_groupboxes[index]->setChecked(connected);
-        emulated_controllers[index]->setCurrentIndex(
-            GetIndexFromControllerType(Settings::values.players[index].controller_type));
-    }
-
-    UpdateDockedState(Settings::values.players[8].connected);
-
-    ui->vibrationGroup->setChecked(Settings::values.vibration_enabled);
-}
-
 QtControllerSelector::QtControllerSelector(GMainWindow& parent) {
     connect(this, &QtControllerSelector::MainWindowReconfigureControllers, &parent,
             &GMainWindow::ControllerSelectorReconfigureControllers, Qt::QueuedConnection);
diff --git a/src/yuzu/applets/controller.h b/src/yuzu/applets/controller.h
index 6ab4bea096..2d6d588c62 100644
--- a/src/yuzu/applets/controller.h
+++ b/src/yuzu/applets/controller.h
@@ -37,6 +37,9 @@ private:
     // Applies the current configuration.
     void ApplyConfiguration();
 
+    // Loads the current input configuration into the frontend applet.
+    void LoadConfiguration();
+
     // Initializes the "Configure Input" Dialog.
     void CallConfigureInputDialog();
 
@@ -68,9 +71,6 @@ private:
     // Disables and disconnects unsupported players based on the given parameters.
     void DisableUnsupportedPlayers();
 
-    // Loads the current input configuration into the frontend applet.
-    void LoadConfiguration();
-
     std::unique_ptr<Ui::QtControllerSelectorDialog> ui;
 
     // Parameters sent in from the backend HLE applet.