From b540ea80d16488d1e5b3eb6ca6b9e93cc663b06f Mon Sep 17 00:00:00 2001
From: Isaac Marovitz <42140194+IsaacMarovitz@users.noreply.github.com>
Date: Thu, 1 Dec 2022 21:31:21 -0500
Subject: [PATCH] Ava GUI: Make Dialogue More Intuitive (#3955)

* Adjust button position and locales

* Shortcuts + Highlight default action

* Update Locales - Corrections Welcome

* Move `Apply` button back to right side

* OS Reactive Button layout

* Fix reversed boolean :)

* Fix accented button styling
---
 Ryujinx.Ava/Assets/Locales/de_DE.json         |  4 +--
 Ryujinx.Ava/Assets/Locales/el_GR.json         |  4 +--
 Ryujinx.Ava/Assets/Locales/en_US.json         |  4 +--
 Ryujinx.Ava/Assets/Locales/es_ES.json         |  4 +--
 Ryujinx.Ava/Assets/Locales/fr_FR.json         |  4 +--
 Ryujinx.Ava/Assets/Locales/it_IT.json         |  4 +--
 Ryujinx.Ava/Assets/Locales/ja_JP.json         |  4 +--
 Ryujinx.Ava/Assets/Locales/ko_KR.json         |  4 +--
 Ryujinx.Ava/Assets/Locales/pl_PL.json         |  4 +--
 Ryujinx.Ava/Assets/Locales/pt_BR.json         |  4 +--
 Ryujinx.Ava/Assets/Locales/ru_RU.json         |  4 +--
 Ryujinx.Ava/Assets/Locales/tr_TR.json         |  4 +--
 Ryujinx.Ava/Assets/Locales/zh_CN.json         |  4 +--
 Ryujinx.Ava/Assets/Locales/zh_TW.json         |  4 +--
 .../Ui/ViewModels/SettingsViewModel.cs        | 36 ++++++++++++++++++-
 Ryujinx.Ava/Ui/Windows/SettingsWindow.axaml   | 23 ++++++++----
 .../Ui/Windows/SettingsWindow.axaml.cs        | 30 ----------------
 17 files changed, 79 insertions(+), 66 deletions(-)

diff --git a/Ryujinx.Ava/Assets/Locales/de_DE.json b/Ryujinx.Ava/Assets/Locales/de_DE.json
index cb8d787b8d..449f53886b 100644
--- a/Ryujinx.Ava/Assets/Locales/de_DE.json
+++ b/Ryujinx.Ava/Assets/Locales/de_DE.json
@@ -166,8 +166,8 @@
   "SettingsTabInput": "Eingabe",
   "SettingsTabInputEnableDockedMode": "Docked Modus",
   "SettingsTabInputDirectKeyboardAccess": "Direkter Tastaturzugriff",
-  "SettingsButtonSave": "Speichern",
-  "SettingsButtonClose": "Schließen",
+  "SettingsButtonOk": "OK",
+  "SettingsButtonCancel": "Abbrechen",
   "SettingsButtonApply": "Übernehmen",
   "ControllerSettingsPlayer": "Spieler",
   "ControllerSettingsPlayer1": "Spieler 1",
diff --git a/Ryujinx.Ava/Assets/Locales/el_GR.json b/Ryujinx.Ava/Assets/Locales/el_GR.json
index 4fb8bf5673..cd806544ef 100644
--- a/Ryujinx.Ava/Assets/Locales/el_GR.json
+++ b/Ryujinx.Ava/Assets/Locales/el_GR.json
@@ -166,8 +166,8 @@
   "SettingsTabInput": "Χειρισμός",
   "SettingsTabInputEnableDockedMode": "Ενεργοποίηση Docked Mode",
   "SettingsTabInputDirectKeyboardAccess": "Άμεση Πρόσβαση στο Πληκτρολόγιο",
-  "SettingsButtonSave": "Αποθήκευση",
-  "SettingsButtonClose": "Κλείσιμο",
+  "SettingsButtonOk": "OK",
+  "SettingsButtonCancel": "Ακύρωση",
   "SettingsButtonApply": "Εφαρμογή",
   "ControllerSettingsPlayer": "Παίχτης",
   "ControllerSettingsPlayer1": "Παίχτης 1",
diff --git a/Ryujinx.Ava/Assets/Locales/en_US.json b/Ryujinx.Ava/Assets/Locales/en_US.json
index 86cb44c9a0..87a2f50db3 100644
--- a/Ryujinx.Ava/Assets/Locales/en_US.json
+++ b/Ryujinx.Ava/Assets/Locales/en_US.json
@@ -166,8 +166,8 @@
   "SettingsTabInput": "Input",
   "SettingsTabInputEnableDockedMode": "Docked Mode",
   "SettingsTabInputDirectKeyboardAccess": "Direct Keyboard Access",
-  "SettingsButtonSave": "Save",
-  "SettingsButtonClose": "Close",
+  "SettingsButtonOk": "OK",
+  "SettingsButtonCancel": "Cancel",
   "SettingsButtonApply": "Apply",
   "ControllerSettingsPlayer": "Player",
   "ControllerSettingsPlayer1": "Player 1",
diff --git a/Ryujinx.Ava/Assets/Locales/es_ES.json b/Ryujinx.Ava/Assets/Locales/es_ES.json
index e6ba35c07c..379682eaed 100644
--- a/Ryujinx.Ava/Assets/Locales/es_ES.json
+++ b/Ryujinx.Ava/Assets/Locales/es_ES.json
@@ -166,8 +166,8 @@
   "SettingsTabInput": "Entrada",
   "SettingsTabInputEnableDockedMode": "Modo dock/TV",
   "SettingsTabInputDirectKeyboardAccess": "Acceso directo al teclado",
-  "SettingsButtonSave": "Guardar",
-  "SettingsButtonClose": "Cerrar",
+  "SettingsButtonOk": "OK",
+  "SettingsButtonCancel": "Cancelar",
   "SettingsButtonApply": "Aplicar",
   "ControllerSettingsPlayer": "Jugador",
   "ControllerSettingsPlayer1": "Jugador 1",
diff --git a/Ryujinx.Ava/Assets/Locales/fr_FR.json b/Ryujinx.Ava/Assets/Locales/fr_FR.json
index 29d26ec88a..4b0780d2e1 100644
--- a/Ryujinx.Ava/Assets/Locales/fr_FR.json
+++ b/Ryujinx.Ava/Assets/Locales/fr_FR.json
@@ -159,8 +159,8 @@
   "SettingsTabInput": "Contrôles",
   "SettingsTabInputEnableDockedMode": "Active le mode station d'accueil",
   "SettingsTabInputDirectKeyboardAccess": "Accès direct au clavier",
-  "SettingsButtonSave": "Enregistrer",
-  "SettingsButtonClose": "Fermer",
+  "SettingsButtonOk": "OK",
+  "SettingsButtonCancel": "Annuler",
   "SettingsButtonApply": "Appliquer",
   "ControllerSettingsPlayer": "Joueur",
   "ControllerSettingsPlayer1": "Joueur 1",
diff --git a/Ryujinx.Ava/Assets/Locales/it_IT.json b/Ryujinx.Ava/Assets/Locales/it_IT.json
index beed9a995f..3ab2617c01 100644
--- a/Ryujinx.Ava/Assets/Locales/it_IT.json
+++ b/Ryujinx.Ava/Assets/Locales/it_IT.json
@@ -166,8 +166,8 @@
     "SettingsTabInput": "Input",
     "SettingsTabInputEnableDockedMode": "Attiva modalità TV",
     "SettingsTabInputDirectKeyboardAccess": "Accesso diretto alla tastiera",
-    "SettingsButtonSave": "Salva",
-    "SettingsButtonClose": "Chiudi",
+    "SettingsButtonOk": "OK",
+    "SettingsButtonCancel": "Cancella",
     "SettingsButtonApply": "Applica",
     "ControllerSettingsPlayer": "Giocatore",
     "ControllerSettingsPlayer1": "Giocatore 1",
diff --git a/Ryujinx.Ava/Assets/Locales/ja_JP.json b/Ryujinx.Ava/Assets/Locales/ja_JP.json
index 5d95d7d083..549eabb494 100644
--- a/Ryujinx.Ava/Assets/Locales/ja_JP.json
+++ b/Ryujinx.Ava/Assets/Locales/ja_JP.json
@@ -166,8 +166,8 @@
   "SettingsTabInput": "入力",
   "SettingsTabInputEnableDockedMode": "ドッキングモード",
   "SettingsTabInputDirectKeyboardAccess": "キーボード直接アクセス",
-  "SettingsButtonSave": "セーブ",
-  "SettingsButtonClose": "閉じる",
+  "SettingsButtonOk": "オーケー",
+  "SettingsButtonCancel": "キャンセル",
   "SettingsButtonApply": "適用",
   "ControllerSettingsPlayer": "プレイヤー",
   "ControllerSettingsPlayer1": "プレイヤー 1",
diff --git a/Ryujinx.Ava/Assets/Locales/ko_KR.json b/Ryujinx.Ava/Assets/Locales/ko_KR.json
index cc7232c9f8..c1b000b874 100644
--- a/Ryujinx.Ava/Assets/Locales/ko_KR.json
+++ b/Ryujinx.Ava/Assets/Locales/ko_KR.json
@@ -165,8 +165,8 @@
   "SettingsTabInput": "입력",
   "SettingsTabInputEnableDockedMode": "도킹 모드 활성화",
   "SettingsTabInputDirectKeyboardAccess": "직접 키보드 액세스",
-  "SettingsButtonSave": "구하다",
-  "SettingsButtonClose": "출구",
+  "SettingsButtonOk": "좋아",
+  "SettingsButtonCancel": "취소",
   "SettingsButtonApply": "적용하다",
   "ControllerSettingsPlayer": "플레이어",
   "ControllerSettingsPlayer1": "플레이어 1",
diff --git a/Ryujinx.Ava/Assets/Locales/pl_PL.json b/Ryujinx.Ava/Assets/Locales/pl_PL.json
index d7f8a1bcb3..5a701c237d 100644
--- a/Ryujinx.Ava/Assets/Locales/pl_PL.json
+++ b/Ryujinx.Ava/Assets/Locales/pl_PL.json
@@ -166,8 +166,8 @@
   "SettingsTabInput": "Sterowanie",
   "SettingsTabInputEnableDockedMode": "Tryb Zadokowany",
   "SettingsTabInputDirectKeyboardAccess": "Bezpośredni Dostęp do Klawiatury",
-  "SettingsButtonSave": "Zapisz",
-  "SettingsButtonClose": "Zamknij",
+  "SettingsButtonOk": "OK",
+  "SettingsButtonCancel": "Anuluj",
   "SettingsButtonApply": "Zastosuj",
   "ControllerSettingsPlayer": "Gracz",
   "ControllerSettingsPlayer1": "Gracz 1",
diff --git a/Ryujinx.Ava/Assets/Locales/pt_BR.json b/Ryujinx.Ava/Assets/Locales/pt_BR.json
index c49084d895..a8b02f676e 100644
--- a/Ryujinx.Ava/Assets/Locales/pt_BR.json
+++ b/Ryujinx.Ava/Assets/Locales/pt_BR.json
@@ -166,8 +166,8 @@
   "SettingsTabInput": "Controle",
   "SettingsTabInputEnableDockedMode": "Habilitar modo TV",
   "SettingsTabInputDirectKeyboardAccess": "Acesso direto ao teclado",
-  "SettingsButtonSave": "Salvar",
-  "SettingsButtonClose": "Fechar",
+  "SettingsButtonOk": "OK",
+  "SettingsButtonCancel": "Cancelar",
   "SettingsButtonApply": "Aplicar",
   "ControllerSettingsPlayer": "Jogador",
   "ControllerSettingsPlayer1": "Jogador 1",
diff --git a/Ryujinx.Ava/Assets/Locales/ru_RU.json b/Ryujinx.Ava/Assets/Locales/ru_RU.json
index e2788296cb..fa74c4b92d 100644
--- a/Ryujinx.Ava/Assets/Locales/ru_RU.json
+++ b/Ryujinx.Ava/Assets/Locales/ru_RU.json
@@ -165,8 +165,8 @@
   "SettingsTabInput": "Управление",
   "SettingsTabInputEnableDockedMode": "Включить режим закрепления",
   "SettingsTabInputDirectKeyboardAccess": "Прямой доступ с клавиатуры",
-  "SettingsButtonSave": "Сохранить",
-  "SettingsButtonClose": "Закрыть",
+  "SettingsButtonOk": "OK",
+  "SettingsButtonCancel": "Отмена",
   "SettingsButtonApply": "Применить",
   "ControllerSettingsPlayer": "Игрок",
   "ControllerSettingsPlayer1": "Игрок 1",
diff --git a/Ryujinx.Ava/Assets/Locales/tr_TR.json b/Ryujinx.Ava/Assets/Locales/tr_TR.json
index 59979de3c8..e8713e0c1d 100644
--- a/Ryujinx.Ava/Assets/Locales/tr_TR.json
+++ b/Ryujinx.Ava/Assets/Locales/tr_TR.json
@@ -166,8 +166,8 @@
   "SettingsTabInput": "Giriş Yöntemi",
   "SettingsTabInputEnableDockedMode": "Docked Modunu Etkinleştir",
   "SettingsTabInputDirectKeyboardAccess": "Doğrudan Klavye Erişimi",
-  "SettingsButtonSave": "Kaydet",
-  "SettingsButtonClose": "Kapat",
+  "SettingsButtonOk": "Tamam",
+  "SettingsButtonCancel": "İptal",
   "SettingsButtonApply": "Uygula",
   "ControllerSettingsPlayer": "Oyuncu",
   "ControllerSettingsPlayer1": "Oyuncu 1",
diff --git a/Ryujinx.Ava/Assets/Locales/zh_CN.json b/Ryujinx.Ava/Assets/Locales/zh_CN.json
index 5e52f78abb..09b344e80c 100644
--- a/Ryujinx.Ava/Assets/Locales/zh_CN.json
+++ b/Ryujinx.Ava/Assets/Locales/zh_CN.json
@@ -166,8 +166,8 @@
   "SettingsTabInput": "输入",
   "SettingsTabInputEnableDockedMode": "主机模式",
   "SettingsTabInputDirectKeyboardAccess": "直通键盘控制",
-  "SettingsButtonSave": "保存",
-  "SettingsButtonClose": "关闭",
+  "SettingsButtonOk": "批准",
+  "SettingsButtonCancel": "取消",
   "SettingsButtonApply": "应用",
   "ControllerSettingsPlayer": "玩家",
   "ControllerSettingsPlayer1": "玩家 1",
diff --git a/Ryujinx.Ava/Assets/Locales/zh_TW.json b/Ryujinx.Ava/Assets/Locales/zh_TW.json
index 6b1d9d49f0..8a9e4d61d1 100644
--- a/Ryujinx.Ava/Assets/Locales/zh_TW.json
+++ b/Ryujinx.Ava/Assets/Locales/zh_TW.json
@@ -166,8 +166,8 @@
   "SettingsTabInput": "輸入",
   "SettingsTabInputEnableDockedMode": "Docked 模式",
   "SettingsTabInputDirectKeyboardAccess": "直通鍵盤控制",
-  "SettingsButtonSave": "儲存",
-  "SettingsButtonClose": "關閉",
+  "SettingsButtonOk": "嘛好",
+  "SettingsButtonCancel": "取消",
   "SettingsButtonApply": "套用",
   "ControllerSettingsPlayer": "玩家",
   "ControllerSettingsPlayer1": "玩家 1",
diff --git a/Ryujinx.Ava/Ui/ViewModels/SettingsViewModel.cs b/Ryujinx.Ava/Ui/ViewModels/SettingsViewModel.cs
index 584627417a..bd4a55e8f3 100644
--- a/Ryujinx.Ava/Ui/ViewModels/SettingsViewModel.cs
+++ b/Ryujinx.Ava/Ui/ViewModels/SettingsViewModel.cs
@@ -118,7 +118,12 @@ namespace Ryujinx.Ava.Ui.ViewModels
                 OnPropertyChanged();
             }
         }
-
+        
+        public bool IsMacOS
+        {
+            get => OperatingSystem.IsMacOS();
+        }
+        
         public bool EnableDiscordIntegration { get; set; }
         public bool CheckUpdatesOnStart { get; set; }
         public bool ShowConfirmExit { get; set; }
@@ -474,11 +479,40 @@ namespace Ryujinx.Ava.Ui.ViewModels
             MainWindow.UpdateGraphicsConfig();
 
             _previousVolumeLevel = Volume;
+
+            if (_owner is SettingsWindow owner)
+            {
+                owner.ControllerSettings?.SaveCurrentProfile();
+            }
+            
+            if (_owner.Owner is MainWindow window && _directoryChanged)
+            {
+                window.ViewModel.LoadApplications();
+            }
+
+            _directoryChanged = false;
         }
 
         public void RevertIfNotSaved()
         {
             Program.ReloadConfig();
         }
+
+        public void ApplyButton()
+        {
+            SaveSettings();
+        }
+
+        public void OkButton()
+        {
+            SaveSettings();
+            _owner.Close();
+        }
+
+        public void CancelButton()
+        {
+            RevertIfNotSaved();
+            _owner.Close();
+        }
     }
 }
\ No newline at end of file
diff --git a/Ryujinx.Ava/Ui/Windows/SettingsWindow.axaml b/Ryujinx.Ava/Ui/Windows/SettingsWindow.axaml
index 1791d8ea54..0a5cdc8934 100644
--- a/Ryujinx.Ava/Ui/Windows/SettingsWindow.axaml
+++ b/Ryujinx.Ava/Ui/Windows/SettingsWindow.axaml
@@ -955,16 +955,25 @@
                     Icon="Document" />
             </ui:NavigationView.MenuItems>
         </ui:NavigationView>
-        <StackPanel
+        <ReversibleStackPanel
             Grid.Row="2"
             Margin="10"
             Spacing="10"
             Orientation="Horizontal"
-            HorizontalAlignment="Right">
-            <Button Content="{locale:Locale SettingsButtonSave}" Click="SaveButton_Clicked" />
-            <Button Content="{locale:Locale SettingsButtonClose}" Click="CloseButton_Clicked" />
-            <Button Content="{locale:Locale SettingsButtonApply}"
-                    Click="ApplyButton_Clicked" />
-        </StackPanel>
+            HorizontalAlignment="Right"
+            ReverseOrder="{ReflectionBinding IsMacOS}">
+            <Button 
+                HotKey="Enter" 
+                Classes="accent"
+                Content="{locale:Locale SettingsButtonOk}" 
+                Command="{ReflectionBinding OkButton}" />
+            <Button 
+                HotKey="Escape" 
+                Content="{locale:Locale SettingsButtonCancel}" 
+                Command="{ReflectionBinding CancelButton}" />
+            <Button 
+                Content="{locale:Locale SettingsButtonApply}" 
+                Command="{ReflectionBinding ApplyButton}" />
+        </ReversibleStackPanel>
     </Grid>
 </window:StyleableWindow>
\ No newline at end of file
diff --git a/Ryujinx.Ava/Ui/Windows/SettingsWindow.axaml.cs b/Ryujinx.Ava/Ui/Windows/SettingsWindow.axaml.cs
index 0e610d77ba..d690322de5 100644
--- a/Ryujinx.Ava/Ui/Windows/SettingsWindow.axaml.cs
+++ b/Ryujinx.Ava/Ui/Windows/SettingsWindow.axaml.cs
@@ -199,36 +199,6 @@ namespace Ryujinx.Ava.Ui.Windows
             }
         }
 
-        private void SaveButton_Clicked(object sender, RoutedEventArgs e)
-        {
-            SaveSettings();
-            Close();
-        }
-
-        private void CloseButton_Clicked(object sender, RoutedEventArgs e)
-        {
-            ViewModel.RevertIfNotSaved();
-            Close();
-        }
-
-        private void ApplyButton_Clicked(object sender, RoutedEventArgs e)
-        {
-            SaveSettings();
-        }
-
-        private void SaveSettings()
-        {
-            ViewModel.SaveSettings();
-            ControllerSettings?.SaveCurrentProfile();
-
-            if (Owner is MainWindow window && ViewModel.DirectoryChanged)
-            {
-                window.ViewModel.LoadApplications();
-            }
-
-            ViewModel.DirectoryChanged = false;
-        }
-
         protected override void OnClosed(EventArgs e)
         {
             ControllerSettings.Dispose();