From 638be5f296bf52943da4366699d33f1e8656e00c Mon Sep 17 00:00:00 2001
From: TSR Berry <20988865+TSRBerry@users.noreply.github.com>
Date: Sat, 21 Oct 2023 15:19:21 +0200
Subject: Revert "Ava UI: Input Menu Refactor (#4998)"

This reverts commit 49b37550cae6b3c69f59a9c7a44b17e3c12a813b.

This currently breaks the GTK GUI.
---
 .../UI/Views/Input/ControllerInputView.axaml.cs    | 160 ++++++++++-----------
 1 file changed, 74 insertions(+), 86 deletions(-)

(limited to 'src/Ryujinx.Ava/UI/Views/Input/ControllerInputView.axaml.cs')

diff --git a/src/Ryujinx.Ava/UI/Views/Input/ControllerInputView.axaml.cs b/src/Ryujinx.Ava/UI/Views/Input/ControllerInputView.axaml.cs
index 52fc6238..35129706 100644
--- a/src/Ryujinx.Ava/UI/Views/Input/ControllerInputView.axaml.cs
+++ b/src/Ryujinx.Ava/UI/Views/Input/ControllerInputView.axaml.cs
@@ -1,28 +1,35 @@
-using Avalonia;
 using Avalonia.Controls;
 using Avalonia.Controls.Primitives;
 using Avalonia.Input;
 using Avalonia.Interactivity;
 using Avalonia.LogicalTree;
+using Ryujinx.Ava.Common.Locale;
 using Ryujinx.Ava.UI.Helpers;
-using Ryujinx.Ava.UI.ViewModels.Input;
+using Ryujinx.Ava.UI.Models;
+using Ryujinx.Ava.UI.ViewModels;
 using Ryujinx.Common.Configuration.Hid.Controller;
 using Ryujinx.Input;
 using Ryujinx.Input.Assigner;
+using System;
 
 namespace Ryujinx.Ava.UI.Views.Input
 {
     public partial class ControllerInputView : UserControl
     {
+        private bool _dialogOpen;
+
         private ButtonKeyAssigner _currentAssigner;
+        internal ControllerInputViewModel ViewModel { get; set; }
 
         public ControllerInputView()
         {
+            DataContext = ViewModel = new ControllerInputViewModel(this);
+
             InitializeComponent();
 
             foreach (ILogical visual in SettingButtons.GetLogicalDescendants())
             {
-                if (visual is ToggleButton button and not CheckBox)
+                if (visual is ToggleButton button && visual is not CheckBox)
                 {
                     button.IsCheckedChanged += Button_IsCheckedChanged;
                 }
@@ -52,7 +59,7 @@ namespace Ryujinx.Ava.UI.Views.Input
 
                     bool isStick = button.Tag != null && button.Tag.ToString() == "stick";
 
-                    if (_currentAssigner == null && (bool)button.IsChecked)
+                    if (_currentAssigner == null)
                     {
                         _currentAssigner = new ButtonKeyAssigner(button);
 
@@ -60,86 +67,14 @@ namespace Ryujinx.Ava.UI.Views.Input
 
                         PointerPressed += MouseClick;
 
-                        IKeyboard keyboard = (IKeyboard)(DataContext as ControllerInputViewModel).parentModel.AvaloniaKeyboardDriver.GetGamepad("0"); // Open Avalonia keyboard for cancel operations.
+                        IKeyboard keyboard = (IKeyboard)ViewModel.AvaloniaKeyboardDriver.GetGamepad("0"); // Open Avalonia keyboard for cancel operations.
                         IButtonAssigner assigner = CreateButtonAssigner(isStick);
 
                         _currentAssigner.ButtonAssigned += (sender, e) =>
                         {
-                            if (e.ButtonValue.HasValue)
+                            if (e.IsAssigned)
                             {
-                                var viewModel = (DataContext as ControllerInputViewModel);
-                                var buttonValue = e.ButtonValue.Value;
-                                viewModel.parentModel.IsModified = true;
-
-                                switch (button.Name)
-                                {
-                                    case "ButtonZl":
-                                        viewModel.Config.ButtonZl = buttonValue.AsGamepadButtonInputId();
-                                        break;
-                                    case "ButtonL":
-                                        viewModel.Config.ButtonL = buttonValue.AsGamepadButtonInputId();
-                                        break;
-                                    case "ButtonMinus":
-                                        viewModel.Config.ButtonMinus = buttonValue.AsGamepadButtonInputId();
-                                        break;
-                                    case "LeftStickButton":
-                                        viewModel.Config.LeftStickButton = buttonValue.AsGamepadButtonInputId();
-                                        break;
-                                    case "LeftJoystick":
-                                        viewModel.Config.LeftJoystick = buttonValue.AsGamepadStickId();
-                                        break;
-                                    case "DpadUp":
-                                        viewModel.Config.DpadUp = buttonValue.AsGamepadButtonInputId();
-                                        break;
-                                    case "DpadDown":
-                                        viewModel.Config.DpadDown = buttonValue.AsGamepadButtonInputId();
-                                        break;
-                                    case "DpadLeft":
-                                        viewModel.Config.DpadLeft = buttonValue.AsGamepadButtonInputId();
-                                        break;
-                                    case "DpadRight":
-                                        viewModel.Config.DpadRight = buttonValue.AsGamepadButtonInputId();
-                                        break;
-                                    case "LeftButtonSr":
-                                        viewModel.Config.LeftButtonSr = buttonValue.AsGamepadButtonInputId();
-                                        break;
-                                    case "LeftButtonSl":
-                                        viewModel.Config.LeftButtonSl = buttonValue.AsGamepadButtonInputId();
-                                        break;
-                                    case "RightButtonSr":
-                                        viewModel.Config.RightButtonSr = buttonValue.AsGamepadButtonInputId();
-                                        break;
-                                    case "RightButtonSl":
-                                        viewModel.Config.RightButtonSl = buttonValue.AsGamepadButtonInputId();
-                                        break;
-                                    case "ButtonZr":
-                                        viewModel.Config.ButtonZr = buttonValue.AsGamepadButtonInputId();
-                                        break;
-                                    case "ButtonR":
-                                        viewModel.Config.ButtonR = buttonValue.AsGamepadButtonInputId();
-                                        break;
-                                    case "ButtonPlus":
-                                        viewModel.Config.ButtonPlus = buttonValue.AsGamepadButtonInputId();
-                                        break;
-                                    case "ButtonA":
-                                        viewModel.Config.ButtonA = buttonValue.AsGamepadButtonInputId();
-                                        break;
-                                    case "ButtonB":
-                                        viewModel.Config.ButtonB = buttonValue.AsGamepadButtonInputId();
-                                        break;
-                                    case "ButtonX":
-                                        viewModel.Config.ButtonX = buttonValue.AsGamepadButtonInputId();
-                                        break;
-                                    case "ButtonY":
-                                        viewModel.Config.ButtonY = buttonValue.AsGamepadButtonInputId();
-                                        break;
-                                    case "RightStickButton":
-                                        viewModel.Config.RightStickButton = buttonValue.AsGamepadButtonInputId();
-                                        break;
-                                    case "RightJoystick":
-                                        viewModel.Config.RightJoystick = buttonValue.AsGamepadStickId();
-                                        break;
-                                }
+                                ViewModel.IsModified = true;
                             }
                         };
 
@@ -165,29 +100,82 @@ namespace Ryujinx.Ava.UI.Views.Input
             }
         }
 
+        public void SaveCurrentProfile()
+        {
+            ViewModel.Save();
+        }
+
+        private IButtonAssigner CreateButtonAssigner(bool forStick)
+        {
+            IButtonAssigner assigner;
+
+            var device = ViewModel.Devices[ViewModel.Device];
+
+            if (device.Type == DeviceType.Keyboard)
+            {
+                assigner = new KeyboardKeyAssigner((IKeyboard)ViewModel.SelectedGamepad);
+            }
+            else if (device.Type == DeviceType.Controller)
+            {
+                assigner = new GamepadButtonAssigner(ViewModel.SelectedGamepad, (ViewModel.Config as StandardControllerInputConfig).TriggerThreshold, forStick);
+            }
+            else
+            {
+                throw new Exception("Controller not supported");
+            }
+
+            return assigner;
+        }
+
         private void MouseClick(object sender, PointerPressedEventArgs e)
         {
-            bool shouldUnbind = e.GetCurrentPoint(this).Properties.IsMiddleButtonPressed;
+            bool shouldUnbind = false;
+
+            if (e.GetCurrentPoint(this).Properties.IsMiddleButtonPressed)
+            {
+                shouldUnbind = true;
+            }
 
             _currentAssigner?.Cancel(shouldUnbind);
 
             PointerPressed -= MouseClick;
         }
 
-        private IButtonAssigner CreateButtonAssigner(bool forStick)
+        private async void PlayerIndexBox_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
         {
-            IButtonAssigner assigner;
+            if (ViewModel.IsModified && !_dialogOpen)
+            {
+                _dialogOpen = true;
 
-            assigner = new GamepadButtonAssigner((DataContext as ControllerInputViewModel).parentModel.SelectedGamepad, ((DataContext as ControllerInputViewModel).parentModel.Config as StandardControllerInputConfig).TriggerThreshold, forStick);
+                var result = await ContentDialogHelper.CreateConfirmationDialog(
+                    LocaleManager.Instance[LocaleKeys.DialogControllerSettingsModifiedConfirmMessage],
+                    LocaleManager.Instance[LocaleKeys.DialogControllerSettingsModifiedConfirmSubMessage],
+                    LocaleManager.Instance[LocaleKeys.InputDialogYes],
+                    LocaleManager.Instance[LocaleKeys.InputDialogNo],
+                    LocaleManager.Instance[LocaleKeys.RyujinxConfirm]);
 
-            return assigner;
+                if (result == UserResult.Yes)
+                {
+                    ViewModel.Save();
+                }
+
+                _dialogOpen = false;
+
+                ViewModel.IsModified = false;
+
+                if (e.AddedItems.Count > 0)
+                {
+                    var player = (PlayerModel)e.AddedItems[0];
+                    ViewModel.PlayerId = player.Id;
+                }
+            }
         }
 
-        protected override void OnDetachedFromVisualTree(VisualTreeAttachmentEventArgs e)
+        public void Dispose()
         {
-            base.OnDetachedFromVisualTree(e);
             _currentAssigner?.Cancel();
             _currentAssigner = null;
+            ViewModel.Dispose();
         }
     }
 }
-- 
cgit v1.2.3-70-g09d2