From ab7ebecfc851ba37d06ae861c4118c1ef8a697ed Mon Sep 17 00:00:00 2001
From: Emmanuel Hansen <emmausssss@gmail.com>
Date: Fri, 22 Sep 2023 20:55:39 +0000
Subject: [PATCH] use compiled binding for controller view

---
 src/Ryujinx.Ava/Assets/Styles/Styles.xaml     |   6 +-
 .../UI/Models/InputConfiguration.cs           |   2 +-
 .../UI/ViewModels/ControllerInputViewModel.cs |  90 +-
 .../UI/ViewModels/GamePadInputViewModel.cs    |  63 ++
 .../UI/ViewModels/InputViewModel.cs           |  64 ++
 .../UI/ViewModels/KeyboardInputViewModel.cs   |  47 +
 .../UI/Views/Input/ControllerInputView.axaml  | 955 +-----------------
 .../Views/Input/ControllerInputView.axaml.cs  |  24 +-
 .../UI/Views/Input/GamePadInputView.axaml     | 741 ++++++++++++++
 .../UI/Views/Input/GamePadInputView.axaml.cs  |  14 +
 .../UI/Views/Input/KeyboardInputView.axaml    | 672 ++++++++++++
 .../UI/Views/Input/KeyboardInputView.axaml.cs |  14 +
 .../UI/Views/Input/MotionInputView.axaml.cs   |   4 +-
 .../UI/Views/Input/RumbleInputView.axaml.cs   |   4 +-
 14 files changed, 1716 insertions(+), 984 deletions(-)
 create mode 100644 src/Ryujinx.Ava/UI/ViewModels/GamePadInputViewModel.cs
 create mode 100644 src/Ryujinx.Ava/UI/ViewModels/InputViewModel.cs
 create mode 100644 src/Ryujinx.Ava/UI/ViewModels/KeyboardInputViewModel.cs
 create mode 100644 src/Ryujinx.Ava/UI/Views/Input/GamePadInputView.axaml
 create mode 100644 src/Ryujinx.Ava/UI/Views/Input/GamePadInputView.axaml.cs
 create mode 100644 src/Ryujinx.Ava/UI/Views/Input/KeyboardInputView.axaml
 create mode 100644 src/Ryujinx.Ava/UI/Views/Input/KeyboardInputView.axaml.cs

diff --git a/src/Ryujinx.Ava/Assets/Styles/Styles.xaml b/src/Ryujinx.Ava/Assets/Styles/Styles.xaml
index f7f64be22..5e6ab6faf 100644
--- a/src/Ryujinx.Ava/Assets/Styles/Styles.xaml
+++ b/src/Ryujinx.Ava/Assets/Styles/Styles.xaml
@@ -14,10 +14,6 @@
                             <MenuItem Header="Test 1" />
                             <MenuItem Header="Test 2" />
                             <MenuItem Header="Test 3">
-                                <MenuItem.Icon>
-                                    <CheckBox Margin="0"
-                                              IsChecked="{ReflectionBinding Checkbox, Mode=TwoWay}" />
-                                </MenuItem.Icon>
                             </MenuItem>
                         </MenuItem>
                     </Menu>
@@ -393,4 +389,4 @@
         <x:Double x:Key="ContentDialogMaxWidth">600</x:Double>
         <x:Double x:Key="ContentDialogMaxHeight">756</x:Double>
     </Styles.Resources>
-</Styles>
\ No newline at end of file
+</Styles>
diff --git a/src/Ryujinx.Ava/UI/Models/InputConfiguration.cs b/src/Ryujinx.Ava/UI/Models/InputConfiguration.cs
index f1352c6d8..a7810124c 100644
--- a/src/Ryujinx.Ava/UI/Models/InputConfiguration.cs
+++ b/src/Ryujinx.Ava/UI/Models/InputConfiguration.cs
@@ -7,7 +7,7 @@ using System;
 
 namespace Ryujinx.Ava.UI.Models
 {
-    internal class InputConfiguration<TKey, TStick> : BaseModel
+    public class InputConfiguration<TKey, TStick> : BaseModel
     {
         private float _deadzoneRight;
         private float _triggerThreshold;
diff --git a/src/Ryujinx.Ava/UI/ViewModels/ControllerInputViewModel.cs b/src/Ryujinx.Ava/UI/ViewModels/ControllerInputViewModel.cs
index c0c625321..0177c7f96 100644
--- a/src/Ryujinx.Ava/UI/ViewModels/ControllerInputViewModel.cs
+++ b/src/Ryujinx.Ava/UI/ViewModels/ControllerInputViewModel.cs
@@ -48,10 +48,11 @@ namespace Ryujinx.Ava.UI.ViewModels
         private int _controllerNumber;
         private string _controllerImage;
         private int _device;
-        private object _configuration;
+        private InputViewModel _configuration;
         private string _profileName;
         private bool _isLoaded;
-
+        private bool _isLeft;
+        private bool _isRight;
         private static readonly InputConfigJsonSerializerContext _serializerContext = new(JsonHelper.GetDefaultSerializerOptions());
 
         public IGamepadDriver AvaloniaKeyboardDriver { get; }
@@ -63,23 +64,47 @@ namespace Ryujinx.Ava.UI.ViewModels
         public AvaloniaList<string> ProfilesList { get; set; }
         public AvaloniaList<string> DeviceList { get; set; }
 
+        public event EventHandler ConfigurationChanged;
+
         // XAML Flags
         public bool ShowSettings => _device > 0;
         public bool IsController => _device > 1;
         public bool IsKeyboard => !IsController;
-        public bool IsRight { get; set; }
-        public bool IsLeft { get; set; }
+        public bool IsRight
+        {
+            get => _isRight; set
+            {
+                _isRight = value;
+
+                _configuration.IsRight = IsRight;
+            }
+        }
+        public bool IsLeft
+        {
+            get => _isLeft; set
+            {
+                _isLeft = value;
+
+                _configuration.IsLeft = IsLeft;
+            }
+        }
 
         public bool IsModified { get; set; }
 
-        public object Configuration
+        public InputViewModel Configuration
         {
             get => _configuration;
             set
             {
                 _configuration = value;
 
+                _configuration.IsLeft = IsLeft;
+                _configuration.IsRight = IsRight;
+                _configuration.ControllerImage = _controllerImage;
+
                 OnPropertyChanged();
+
+                ConfigurationChanged?.Invoke(this, EventArgs.Empty);
             }
         }
 
@@ -167,27 +192,9 @@ namespace Ryujinx.Ava.UI.ViewModels
             {
                 _controllerImage = value;
 
+                if (_configuration != null)
+                    _configuration.ControllerImage = value;
                 OnPropertyChanged();
-                OnPropertyChanged(nameof(Image));
-            }
-        }
-
-        public SvgImage Image
-        {
-            get
-            {
-                SvgImage image = new();
-
-                if (!string.IsNullOrWhiteSpace(_controllerImage))
-                {
-                    SvgSource source = new();
-
-                    source.Load(EmbeddedResources.GetStream(_controllerImage));
-
-                    image.Source = source;
-                }
-
-                return image;
             }
         }
 
@@ -282,12 +289,12 @@ namespace Ryujinx.Ava.UI.ViewModels
 
             if (Config is StandardKeyboardInputConfig keyboardInputConfig)
             {
-                Configuration = new InputConfiguration<Key, ConfigStickInputId>(keyboardInputConfig);
+                Configuration = new KeyboardInputViewModel(new InputConfiguration<Key, ConfigStickInputId>(keyboardInputConfig));
             }
 
             if (Config is StandardControllerInputConfig controllerInputConfig)
             {
-                Configuration = new InputConfiguration<ConfigGamepadInputId, ConfigStickInputId>(controllerInputConfig);
+                Configuration = new GamePadInputViewModel(new InputConfiguration<ConfigGamepadInputId, ConfigStickInputId>(controllerInputConfig), async () => { await MotionInputView.Show(this); }, async () => { await RumbleInputView.Show(this); });
             }
         }
 
@@ -323,16 +330,6 @@ namespace Ryujinx.Ava.UI.ViewModels
             }
         }
 
-        public async void ShowMotionConfig()
-        {
-            await MotionInputView.Show(this);
-        }
-
-        public async void ShowRumbleConfig()
-        {
-            await RumbleInputView.Show(this);
-        }
-
         private void LoadInputDriver()
         {
             if (_device < 0)
@@ -760,14 +757,7 @@ namespace Ryujinx.Ava.UI.ViewModels
 
                 InputConfig config = null;
 
-                if (IsKeyboard)
-                {
-                    config = (Configuration as InputConfiguration<Key, ConfigStickInputId>).GetConfig();
-                }
-                else if (IsController)
-                {
-                    config = (Configuration as InputConfiguration<GamepadInputId, ConfigStickInputId>).GetConfig();
-                }
+                config = Configuration.GetConfig();
 
                 config.ControllerType = Controllers[_controller].Type;
 
@@ -830,18 +820,16 @@ namespace Ryujinx.Ava.UI.ViewModels
 
                 if (device.Type == DeviceType.Keyboard)
                 {
-                    var inputConfig = Configuration as InputConfiguration<Key, ConfigStickInputId>;
+                    var inputConfig = Configuration.Config as InputConfiguration<Key, ConfigStickInputId>;
                     inputConfig.Id = device.Id;
                 }
                 else
                 {
-                    var inputConfig = Configuration as InputConfiguration<GamepadInputId, ConfigStickInputId>;
+                    var inputConfig = Configuration.Config as InputConfiguration<GamepadInputId, ConfigStickInputId>;
                     inputConfig.Id = device.Id.Split(" ")[0];
                 }
 
-                var config = !IsController
-                    ? (Configuration as InputConfiguration<Key, ConfigStickInputId>).GetConfig()
-                    : (Configuration as InputConfiguration<GamepadInputId, ConfigStickInputId>).GetConfig();
+                var config = Configuration.GetConfig();
                 config.ControllerType = Controllers[_controller].Type;
                 config.PlayerIndex = _playerId;
 
@@ -878,6 +866,8 @@ namespace Ryujinx.Ava.UI.ViewModels
             OnPropertyChanged(nameof(IsKeyboard));
             OnPropertyChanged(nameof(IsRight));
             OnPropertyChanged(nameof(IsLeft));
+
+            Configuration?.NotifyChanges();
         }
 
         public void Dispose()
diff --git a/src/Ryujinx.Ava/UI/ViewModels/GamePadInputViewModel.cs b/src/Ryujinx.Ava/UI/ViewModels/GamePadInputViewModel.cs
new file mode 100644
index 000000000..c8d98d24d
--- /dev/null
+++ b/src/Ryujinx.Ava/UI/ViewModels/GamePadInputViewModel.cs
@@ -0,0 +1,63 @@
+using Ryujinx.Ava.UI.Models;
+using Ryujinx.Ava.UI.Views.Input;
+using Ryujinx.Common.Configuration.Hid;
+using System;
+using ConfigGamepadInputId = Ryujinx.Common.Configuration.Hid.Controller.GamepadInputId;
+using ConfigStickInputId = Ryujinx.Common.Configuration.Hid.Controller.StickInputId;
+
+namespace Ryujinx.Ava.UI.ViewModels
+{
+    public class GamePadInputViewModel : InputViewModel
+    {
+        private InputConfiguration<ConfigGamepadInputId, ConfigStickInputId> _configuration;
+        private Func<System.Threading.Tasks.Task> _showMotionConfigCommand;
+        private Func<System.Threading.Tasks.Task> _showRumbleConfigCommand;
+
+
+        public InputConfiguration<ConfigGamepadInputId, ConfigStickInputId> Configuration
+        {
+            get => _configuration;
+            set
+            {
+                _configuration = value;
+
+                OnPropertyChanged();
+            }
+        }
+
+        internal override object Config => _configuration;
+
+        public GamePadInputViewModel(InputConfiguration<ConfigGamepadInputId, ConfigStickInputId> configuration, Func<System.Threading.Tasks.Task> showMotionConfigCommand, Func<System.Threading.Tasks.Task> showRumbleConfigCommand)
+        {
+            Configuration = configuration;
+            _showMotionConfigCommand = showMotionConfigCommand;
+            _showRumbleConfigCommand = showRumbleConfigCommand;
+        }
+
+        public GamePadInputViewModel()
+        {
+        }
+
+        public override void NotifyChanges()
+        {
+            OnPropertyChanged(nameof(Configuration));
+
+            base.NotifyChanges();
+        }
+
+        public override InputConfig GetConfig()
+        {
+            return _configuration.GetConfig();
+        }
+
+        public async void ShowMotionConfig()
+        {
+            await _showMotionConfigCommand();
+        }
+
+        public async void ShowRumbleConfig()
+        {
+           await _showRumbleConfigCommand();
+        }
+    }
+}
diff --git a/src/Ryujinx.Ava/UI/ViewModels/InputViewModel.cs b/src/Ryujinx.Ava/UI/ViewModels/InputViewModel.cs
new file mode 100644
index 000000000..2021746cf
--- /dev/null
+++ b/src/Ryujinx.Ava/UI/ViewModels/InputViewModel.cs
@@ -0,0 +1,64 @@
+using Avalonia.Svg.Skia;
+using Ryujinx.Ava.UI.Models;
+using Ryujinx.Common;
+using Ryujinx.Common.Configuration.Hid;
+using ConfigStickInputId = Ryujinx.Common.Configuration.Hid.Controller.StickInputId;
+using Key = Ryujinx.Common.Configuration.Hid.Key;
+
+namespace Ryujinx.Ava.UI.ViewModels
+{
+    public abstract class InputViewModel : BaseModel
+    {
+        private string _controllerImage;
+
+        public bool IsRight { get; set; }
+        public bool IsLeft { get; set; }
+
+        internal abstract object Config { get; }
+
+        public void NotifyChange(string property)
+        {
+            OnPropertyChanged(property);
+        }
+
+        public string ControllerImage
+        {
+            get => _controllerImage;
+            set
+            {
+                _controllerImage = value;
+
+                OnPropertyChanged();
+                OnPropertyChanged(nameof(Image));
+            }
+        }
+
+        public SvgImage Image
+        {
+            get
+            {
+                SvgImage image = new();
+
+                if (!string.IsNullOrWhiteSpace(_controllerImage))
+                {
+                    SvgSource source = new();
+
+                    source.Load(EmbeddedResources.GetStream(_controllerImage));
+
+                    image.Source = source;
+                }
+
+                return image;
+            }
+        }
+
+        public virtual void NotifyChanges()
+        {
+            OnPropertyChanged(nameof(IsRight));
+            OnPropertyChanged(nameof(IsLeft));
+            OnPropertyChanged(nameof(Image));
+        }
+
+        public abstract InputConfig GetConfig();
+    }
+}
diff --git a/src/Ryujinx.Ava/UI/ViewModels/KeyboardInputViewModel.cs b/src/Ryujinx.Ava/UI/ViewModels/KeyboardInputViewModel.cs
new file mode 100644
index 000000000..b918e6732
--- /dev/null
+++ b/src/Ryujinx.Ava/UI/ViewModels/KeyboardInputViewModel.cs
@@ -0,0 +1,47 @@
+using Ryujinx.Ava.UI.Models;
+using Ryujinx.Common.Configuration.Hid;
+using ConfigStickInputId = Ryujinx.Common.Configuration.Hid.Controller.StickInputId;
+using Key = Ryujinx.Common.Configuration.Hid.Key;
+
+namespace Ryujinx.Ava.UI.ViewModels
+{
+    public class KeyboardInputViewModel : InputViewModel
+    {
+        private InputConfiguration<Key, ConfigStickInputId> _configuration;
+
+
+        public InputConfiguration<Key, ConfigStickInputId> Configuration
+        {
+            get => _configuration;
+            set
+            {
+                _configuration = value;
+
+                OnPropertyChanged();
+            }
+        }
+
+        internal override object Config => _configuration;
+
+        public KeyboardInputViewModel(InputConfiguration<Key, ConfigStickInputId> configuration)
+        {
+            Configuration = configuration;
+        }
+
+        public KeyboardInputViewModel()
+        {
+        }
+
+        public override void NotifyChanges()
+        {
+            OnPropertyChanged(nameof(Configuration));
+
+            base.NotifyChanges();
+        }
+
+        public override InputConfig GetConfig()
+        {
+            return _configuration.GetConfig();
+        }
+    }
+}
diff --git a/src/Ryujinx.Ava/UI/Views/Input/ControllerInputView.axaml b/src/Ryujinx.Ava/UI/Views/Input/ControllerInputView.axaml
index d636873a3..6813d4c88 100644
--- a/src/Ryujinx.Ava/UI/Views/Input/ControllerInputView.axaml
+++ b/src/Ryujinx.Ava/UI/Views/Input/ControllerInputView.axaml
@@ -8,6 +8,7 @@
     xmlns:controls="clr-namespace:Ryujinx.Ava.UI.Controls"
     xmlns:models="clr-namespace:Ryujinx.Ava.UI.Models"
     xmlns:viewModels="clr-namespace:Ryujinx.Ava.UI.ViewModels"
+    xmlns:views="clr-namespace:Ryujinx.Ava.UI.Views.Input;assembly=Ryujinx.Ava"
     xmlns:helpers="clr-namespace:Ryujinx.Ava.UI.Helpers"
     HorizontalAlignment="Stretch"
     VerticalAlignment="Stretch"
@@ -25,9 +26,12 @@
     </UserControl.Resources>
     <UserControl.Styles>
         <Style Selector="ToggleButton">
-            <Setter Property="Width" Value="90" />
-            <Setter Property="Height" Value="27" />
-            <Setter Property="HorizontalAlignment" Value="Stretch" />
+            <Setter Property="Width"
+                    Value="90" />
+            <Setter Property="Height"
+                    Value="27" />
+            <Setter Property="HorizontalAlignment"
+                    Value="Stretch" />
         </Style>
     </UserControl.Styles>
     <StackPanel
@@ -101,7 +105,7 @@
                         HorizontalAlignment="Stretch"
                         VerticalAlignment="Center"
                         SelectedIndex="0"
-                        ItemsSource="{Binding ProfilesList}" 
+                        ItemsSource="{Binding ProfilesList}"
                         Text="{Binding ProfileName, Mode=TwoWay}" />
                     <Button
                         Grid.Column="2"
@@ -109,7 +113,7 @@
                         Margin="5,0,0,0"
                         VerticalAlignment="Center"
                         ToolTip.Tip="{locale:Locale ControllerSettingsLoadProfileToolTip}"
-                        Command="{ReflectionBinding LoadProfile}">
+                        Command="{Binding LoadProfile}">
                         <ui:SymbolIcon
                             Symbol="Upload"
                             FontSize="15"
@@ -117,11 +121,11 @@
                     </Button>
                     <Button
                         Grid.Column="3"
-                            MinWidth="0"
-                            Margin="5,0,0,0"
-                            VerticalAlignment="Center"
-                            ToolTip.Tip="{locale:Locale ControllerSettingsSaveProfileToolTip}"
-                            Command="{ReflectionBinding SaveProfile}">
+                        MinWidth="0"
+                        Margin="5,0,0,0"
+                        VerticalAlignment="Center"
+                        ToolTip.Tip="{locale:Locale ControllerSettingsSaveProfileToolTip}"
+                        Command="{Binding SaveProfile}">
                         <ui:SymbolIcon
                             Symbol="Save"
                             FontSize="15"
@@ -129,11 +133,11 @@
                     </Button>
                     <Button
                         Grid.Column="4"
-                            MinWidth="0"
-                            Margin="5,0,0,0"
-                            VerticalAlignment="Center"
-                            ToolTip.Tip="{locale:Locale ControllerSettingsRemoveProfileToolTip}"
-                            Command="{ReflectionBinding RemoveProfile}">
+                        MinWidth="0"
+                        Margin="5,0,0,0"
+                        VerticalAlignment="Center"
+                        ToolTip.Tip="{locale:Locale ControllerSettingsRemoveProfileToolTip}"
+                        Command="{Binding RemoveProfile}">
                         <ui:SymbolIcon
                             Symbol="Delete"
                             FontSize="15"
@@ -177,7 +181,7 @@
                         MinWidth="0"
                         Margin="5,0,0,0"
                         VerticalAlignment="Center"
-                        Command="{ReflectionBinding LoadDevices}">
+                        Command="{Binding LoadDevices}">
                         <ui:SymbolIcon
                             Symbol="Refresh"
                             FontSize="15"
@@ -215,915 +219,20 @@
             </Grid>
         </StackPanel>
         <!-- Button / JoyStick Settings -->
-        <Grid
+        <ContentControl
             Name="SettingButtons"
             MinHeight="450"
+            Content="{Binding Configuration}"
             IsVisible="{Binding ShowSettings}">
-            <Grid.ColumnDefinitions>
-                <ColumnDefinition Width="Auto" />
-                <ColumnDefinition Width="*" />
-                <ColumnDefinition Width="Auto" />
-            </Grid.ColumnDefinitions>
-            <!-- Left Controls -->
-            <StackPanel
-                Orientation="Vertical"
-                Margin="0,0,5,0"
-                Grid.Column="0">
-                <!-- Left Triggers -->
-                <Border
-                    BorderBrush="{DynamicResource ThemeControlBorderColor}"
-                    BorderThickness="1"
-                    IsVisible="{Binding IsLeft}"
-                    MinHeight="90"
-                    CornerRadius="5">
-                    <Grid
-                        Margin="10"
-                        HorizontalAlignment="Stretch">
-                        <Grid.ColumnDefinitions>
-                            <ColumnDefinition />
-                            <ColumnDefinition />
-                        </Grid.ColumnDefinitions>
-                        <Grid.RowDefinitions>
-                            <RowDefinition />
-                            <RowDefinition />
-                        </Grid.RowDefinitions>
-                        <StackPanel
-                            Grid.Column="0"
-                            Grid.Row="0"
-                            Orientation="Horizontal">
-                            <TextBlock
-                                Width="20"
-                                HorizontalAlignment="Center"
-                                VerticalAlignment="Center"
-                                Text="{locale:Locale ControllerSettingsTriggerZL}"
-                                TextAlignment="Center" />
-                            <ToggleButton>
-                                <TextBlock
-                                    Text="{ReflectionBinding Configuration.ButtonZl, Mode=TwoWay, Converter={StaticResource Key}}"
-                                    TextAlignment="Center" />
-                            </ToggleButton>
-                        </StackPanel>
-                        <StackPanel
-                            Grid.Column="0"
-                            Grid.Row="1"
-                            Orientation="Horizontal">
-                            <TextBlock
-                                Width="20"
-                                HorizontalAlignment="Center"
-                                VerticalAlignment="Center"
-                                Text="{locale:Locale ControllerSettingsTriggerL}"
-                                TextAlignment="Center" />
-                            <ToggleButton>
-                                <TextBlock
-                                    Text="{ReflectionBinding Configuration.ButtonL, Mode=TwoWay, Converter={StaticResource Key}}"
-                                    TextAlignment="Center" />
-                            </ToggleButton>
-                        </StackPanel>
-                        <StackPanel
-                            Grid.Column="1"
-                            Grid.Row="1"
-                            Orientation="Horizontal">
-                            <TextBlock
-                                Width="20"
-                                HorizontalAlignment="Center"
-                                VerticalAlignment="Center"
-                                Text="{locale:Locale ControllerSettingsButtonMinus}"
-                                TextAlignment="Center" />
-                            <ToggleButton>
-                                <TextBlock
-                                    Text="{ReflectionBinding Configuration.ButtonMinus, Mode=TwoWay, Converter={StaticResource Key}}"
-                                    TextAlignment="Center" />
-                            </ToggleButton>
-                        </StackPanel>
-                    </Grid>
-                </Border>
-                <!-- Left Joystick -->
-                <Border
-                    BorderBrush="{DynamicResource ThemeControlBorderColor}"
-                    BorderThickness="1"
-                    IsVisible="{Binding IsLeft}"
-                    Margin="0,5,0,0"
-                    CornerRadius="5">
-                    <StackPanel
-                        Margin="10"
-                        Orientation="Vertical">
-                        <TextBlock
-                            Margin="0,0,0,10"
-                            HorizontalAlignment="Center"
-                            Text="{locale:Locale ControllerSettingsLStick}" />
-                        <!-- Left Joystick Keyboard -->
-                        <StackPanel
-                            IsVisible="{Binding !IsController}"
-                            Orientation="Vertical">
-                            <!-- Left Joystick Button -->
-                            <StackPanel
-                                Margin="0,0,0,4"
-                                Orientation="Horizontal">
-                                <TextBlock
-                                    Margin="0,0,10,0"
-                                    Width="120"
-                                    HorizontalAlignment="Center"
-                                    VerticalAlignment="Center"
-                                    Text="{locale:Locale ControllerSettingsStickButton}"
-                                    TextAlignment="Center" />
-                                <ToggleButton>
-                                    <TextBlock
-                                        Text="{ReflectionBinding Configuration.LeftKeyboardStickButton, Mode=TwoWay, Converter={StaticResource Key}}"
-                                        TextAlignment="Center" />
-                                </ToggleButton>
-                            </StackPanel>
-                            <!-- Left Joystick Up -->
-                            <StackPanel
-                                Margin="0,0,0,4"
-                                Orientation="Horizontal">
-                                <TextBlock
-                                    Margin="0,0,10,0"
-                                    Width="120"
-                                    HorizontalAlignment="Center"
-                                    VerticalAlignment="Center"
-                                    Text="{locale:Locale ControllerSettingsStickUp}"
-                                    TextAlignment="Center" />
-                                <ToggleButton>
-                                    <TextBlock
-                                        Text="{ReflectionBinding Configuration.LeftStickUp, Mode=TwoWay, Converter={StaticResource Key}}"
-                                        TextAlignment="Center" />
-                                </ToggleButton>
-                            </StackPanel>
-                            <!-- Left Joystick Down -->
-                            <StackPanel
-                                Margin="0,0,0,4"
-                                Orientation="Horizontal">
-                                <TextBlock
-                                    Margin="0,0,10,0"
-                                    Width="120"
-                                    HorizontalAlignment="Center"
-                                    VerticalAlignment="Center"
-                                    Text="{locale:Locale ControllerSettingsStickDown}"
-                                    TextAlignment="Center" />
-                                <ToggleButton>
-                                    <TextBlock
-                                        Text="{ReflectionBinding Configuration.LeftStickDown, Mode=TwoWay, Converter={StaticResource Key}}"
-                                        TextAlignment="Center" />
-                                </ToggleButton>
-                            </StackPanel>
-                            <!-- Left Joystick Left -->
-                            <StackPanel
-                                Margin="0,0,0,4"
-                                Orientation="Horizontal">
-                                <TextBlock
-                                    Margin="0,0,10,0"
-                                    Width="120"
-                                    HorizontalAlignment="Center"
-                                    VerticalAlignment="Center"
-                                    Text="{locale:Locale ControllerSettingsStickLeft}"
-                                    TextAlignment="Center" />
-                                <ToggleButton>
-                                    <TextBlock
-                                        Text="{ReflectionBinding Configuration.LeftStickLeft, Mode=TwoWay, Converter={StaticResource Key}}"
-                                        TextAlignment="Center" />
-                                </ToggleButton>
-                            </StackPanel>
-                            <!-- Left Joystick Right -->
-                            <StackPanel
-                                Margin="0,0,0,4"
-                                Orientation="Horizontal">
-                                <TextBlock
-                                    Margin="0,0,10,0"
-                                    Width="120"
-                                    HorizontalAlignment="Center"
-                                    VerticalAlignment="Center"
-                                    Text="{locale:Locale ControllerSettingsStickRight}"
-                                    TextAlignment="Center" />
-                                <ToggleButton>
-                                    <TextBlock
-                                        Text="{ReflectionBinding Configuration.LeftStickRight, Mode=TwoWay, Converter={StaticResource Key}}"
-                                        TextAlignment="Center" />
-                                </ToggleButton>
-                            </StackPanel>
-                        </StackPanel>
-                        <!-- Left Joystick Controller -->
-                        <StackPanel
-                            IsVisible="{Binding IsController}"
-                            Orientation="Vertical">
-                            <!-- Left Joystick Button -->
-                            <StackPanel
-                                Orientation="Horizontal">
-                                <TextBlock
-                                    Margin="0,0,10,0"
-                                    Width="120"
-                                    HorizontalAlignment="Center"
-                                    VerticalAlignment="Center"
-                                    Text="{locale:Locale ControllerSettingsStickButton}"
-                                    TextAlignment="Center" />
-                                <ToggleButton>
-                                    <TextBlock
-                                        Text="{ReflectionBinding Configuration.LeftControllerStickButton, Mode=TwoWay, Converter={StaticResource Key}}"
-                                        TextAlignment="Center" />
-                                </ToggleButton>
-                            </StackPanel>
-                            <!-- Left Joystick Stick -->
-                            <StackPanel
-                                Margin="0,4,0,4"
-                                Orientation="Horizontal">
-                                <TextBlock
-                                    Margin="0,0,10,0"
-                                    Width="120"
-                                    HorizontalAlignment="Center"
-                                    VerticalAlignment="Center"
-                                    Text="{locale:Locale ControllerSettingsStickStick}"
-                                    TextAlignment="Center" />
-                                <ToggleButton Tag="stick">
-                                    <TextBlock
-                                        Text="{ReflectionBinding Configuration.LeftJoystick, Mode=TwoWay, Converter={StaticResource Key}}"
-                                        TextAlignment="Center" />
-                                </ToggleButton>
-                            </StackPanel>
-                            <Separator
-                                Margin="0,8,0,8"
-                                Height="1" />
-                            <CheckBox IsChecked="{ReflectionBinding Configuration.LeftInvertStickX}">
-                                <TextBlock Text="{locale:Locale ControllerSettingsStickInvertXAxis}" />
-                            </CheckBox>
-                            <CheckBox IsChecked="{ReflectionBinding Configuration.LeftInvertStickY}">
-                                <TextBlock Text="{locale:Locale ControllerSettingsStickInvertYAxis}" />
-                            </CheckBox>
-                            <CheckBox IsChecked="{ReflectionBinding Configuration.LeftRotate90}">
-                                <TextBlock Text="{locale:Locale ControllerSettingsRotate90}" />
-                            </CheckBox>
-                            <Separator
-                                Margin="0,8,0,8"
-                                Height="1" />
-                            <StackPanel Orientation="Vertical">
-                                <TextBlock
-                                    HorizontalAlignment="Center"
-                                    Text="{locale:Locale ControllerSettingsStickDeadzone}" />
-                                <StackPanel
-                                    HorizontalAlignment="Center"
-                                    VerticalAlignment="Center"
-                                    Orientation="Horizontal">
-                                    <controls:SliderScroll
-                                        Width="130"
-                                        Maximum="1"
-                                        TickFrequency="0.01"
-                                        IsSnapToTickEnabled="True"
-                                        SmallChange="0.01"
-                                        Minimum="0"
-                                        Value="{ReflectionBinding Configuration.DeadzoneLeft, Mode=TwoWay}" />
-                                    <TextBlock
-                                        VerticalAlignment="Center"
-                                        Width="25"
-                                        Text="{ReflectionBinding Configuration.DeadzoneLeft, StringFormat=\{0:0.00\}}" />
-                                </StackPanel>
-                                <TextBlock
-                                    HorizontalAlignment="Center"
-                                    Text="{locale:Locale ControllerSettingsStickRange}" />
-                                <StackPanel
-                                    HorizontalAlignment="Center"
-                                    VerticalAlignment="Center"
-                                    Orientation="Horizontal">
-                                    <controls:SliderScroll
-                                        Width="130"
-                                        Maximum="2"
-                                        TickFrequency="0.01"
-                                        IsSnapToTickEnabled="True"
-                                        SmallChange="0.01"
-                                        Minimum="0"
-                                        Value="{ReflectionBinding Configuration.RangeLeft, Mode=TwoWay}" />
-                                    <TextBlock
-                                        VerticalAlignment="Center"
-                                        Width="25"
-                                        Text="{ReflectionBinding Configuration.RangeLeft, StringFormat=\{0:0.00\}}" />
-                                </StackPanel>
-                            </StackPanel>
-                        </StackPanel>
-                    </StackPanel>
-                </Border>
-                <!-- Left DPad -->
-                <Border
-                    BorderBrush="{DynamicResource ThemeControlBorderColor}"
-                    BorderThickness="1"
-                    VerticalAlignment="Top"
-                    IsVisible="{Binding IsLeft}"
-                    Margin="0,5,0,0"
-                    CornerRadius="5">
-                    <StackPanel
-                        Margin="10"
-                        Orientation="Vertical">
-                        <TextBlock
-                            Margin="0,0,0,10"
-                            HorizontalAlignment="Center"
-                            Text="{locale:Locale ControllerSettingsDPad}" />
-                        <StackPanel Orientation="Vertical">
-                            <!-- Left DPad Up -->
-                            <StackPanel
-                                Margin="0,0,0,4"
-                                Orientation="Horizontal">
-                                <TextBlock
-                                    Margin="0,0,10,0"
-                                    Width="120"
-                                    HorizontalAlignment="Center"
-                                    VerticalAlignment="Center"
-                                    Text="{locale:Locale ControllerSettingsDPadUp}"
-                                    TextAlignment="Center" />
-                                <ToggleButton>
-                                    <TextBlock
-                                        Text="{ReflectionBinding Configuration.DpadUp, Mode=TwoWay, Converter={StaticResource Key}}"
-                                        TextAlignment="Center" />
-                                </ToggleButton>
-                            </StackPanel>
-                            <!-- Left DPad Down -->
-                            <StackPanel
-                                Margin="0,0,0,4"
-                                Orientation="Horizontal">
-                                <TextBlock
-                                    Margin="0,0,10,0"
-                                    Width="120"
-                                    HorizontalAlignment="Center"
-                                    VerticalAlignment="Center"
-                                    Text="{locale:Locale ControllerSettingsDPadDown}"
-                                    TextAlignment="Center" />
-                                <ToggleButton>
-                                    <TextBlock
-                                        Text="{ReflectionBinding Configuration.DpadDown, Mode=TwoWay, Converter={StaticResource Key}}"
-                                        TextAlignment="Center" />
-                                </ToggleButton>
-                            </StackPanel>
-                            <!-- Left DPad Left -->
-                            <StackPanel
-                                Margin="0,0,0,4"
-                                Orientation="Horizontal">
-                                <TextBlock
-                                    Margin="0,0,10,0"
-                                    Width="120"
-                                    HorizontalAlignment="Center"
-                                    VerticalAlignment="Center"
-                                    Text="{locale:Locale ControllerSettingsDPadLeft}"
-                                    TextAlignment="Center" />
-                                <ToggleButton>
-                                    <TextBlock
-                                        Text="{ReflectionBinding Configuration.DpadLeft, Mode=TwoWay, Converter={StaticResource Key}}"
-                                        TextAlignment="Center" />
-                                </ToggleButton>
-                            </StackPanel>
-                            <!-- Left DPad Right -->
-                            <StackPanel
-                                Margin="0,0,0,4"
-                                Orientation="Horizontal">
-                                <TextBlock
-                                    Margin="0,0,10,0"
-                                    Width="120"
-                                    HorizontalAlignment="Center"
-                                    VerticalAlignment="Center"
-                                    Text="{locale:Locale ControllerSettingsDPadRight}"
-                                    TextAlignment="Center" />
-                                <ToggleButton>
-                                    <TextBlock
-                                        Text="{ReflectionBinding Configuration.DpadRight, Mode=TwoWay, Converter={StaticResource Key}}"
-                                        TextAlignment="Center" />
-                                </ToggleButton>
-                            </StackPanel>
-                        </StackPanel>
-                    </StackPanel>
-                </Border>
-            </StackPanel>
-            <!-- Triggers & Side Buttons -->
-            <StackPanel
-                Grid.Column="1"
-                HorizontalAlignment="Stretch"
-                VerticalAlignment="Stretch">
-                <Border
-                    BorderBrush="{DynamicResource ThemeControlBorderColor}"
-                    BorderThickness="1"
-                    CornerRadius="5"
-                    MinHeight="90">
-                    <StackPanel
-                        Margin="8"
-                        Orientation="Vertical">
-                        <TextBlock
-                            HorizontalAlignment="Center"
-                            Text="{locale:Locale ControllerSettingsTriggerThreshold}" />
-                        <StackPanel
-                            HorizontalAlignment="Center"
-                            Orientation="Horizontal">
-                            <controls:SliderScroll
-                                Width="130"
-                                Maximum="1"
-                                TickFrequency="0.01"
-                                IsSnapToTickEnabled="True"
-                                SmallChange="0.01"
-                                Minimum="0"
-                                Value="{ReflectionBinding Configuration.TriggerThreshold, Mode=TwoWay}" />
-                            <TextBlock
-                              Width="25"
-                              Text="{ReflectionBinding Configuration.TriggerThreshold, StringFormat=\{0:0.00\}}" />
-                        </StackPanel>
-                        <StackPanel
-                            Margin="0,4,0,0"
-                            HorizontalAlignment="Center"
-                            VerticalAlignment="Center"
-                            IsVisible="{Binding !IsRight}"
-                            Orientation="Horizontal">
-                            <TextBlock
-                                Width="20"
-                                HorizontalAlignment="Center"
-                                VerticalAlignment="Center"
-                                Text="{locale:Locale ControllerSettingsLeftSR}"
-                                TextAlignment="Center" />
-                            <ToggleButton>
-                                <TextBlock
-                                    Text="{ReflectionBinding Configuration.LeftButtonSr, Mode=TwoWay, Converter={StaticResource Key}}"
-                                    TextAlignment="Center" />
-                            </ToggleButton>
-                        </StackPanel>
-                        <StackPanel
-                            Margin="0,4,0,0"
-                            HorizontalAlignment="Center"
-                            VerticalAlignment="Center"
-                            IsVisible="{Binding !IsRight}"
-                            Orientation="Horizontal">
-                            <TextBlock
-                                Width="20"
-                                HorizontalAlignment="Center"
-                                VerticalAlignment="Center"
-                                Text="{locale:Locale ControllerSettingsLeftSL}"
-                                TextAlignment="Center" />
-                            <ToggleButton>
-                                <TextBlock
-                                    Text="{ReflectionBinding Configuration.LeftButtonSl, Mode=TwoWay, Converter={StaticResource Key}}"
-                                    TextAlignment="Center" />
-                            </ToggleButton>
-                        </StackPanel>
-                        <StackPanel
-                            Margin="0,4,0,0"
-                            HorizontalAlignment="Center"
-                            VerticalAlignment="Center"
-                            IsVisible="{Binding !IsLeft}"
-                            Orientation="Horizontal">
-                            <TextBlock
-                                Width="20"
-                                HorizontalAlignment="Center"
-                                VerticalAlignment="Center"
-                                Text="{locale:Locale ControllerSettingsRightSR}"
-                                TextAlignment="Center" />
-                            <ToggleButton>
-                                <TextBlock
-                                    Text="{ReflectionBinding Configuration.RightButtonSr, Mode=TwoWay, Converter={StaticResource Key}}"
-                                    TextAlignment="Center" />
-                            </ToggleButton>
-                        </StackPanel>
-                        <StackPanel
-                            Margin="0,4,0,0"
-                            HorizontalAlignment="Center"
-                            VerticalAlignment="Center"
-                            IsVisible="{Binding !IsLeft}"
-                            Orientation="Horizontal">
-                            <TextBlock
-                                Width="20"
-                                HorizontalAlignment="Center"
-                                VerticalAlignment="Center"
-                                Text="{locale:Locale ControllerSettingsRightSL}"
-                                TextAlignment="Center" />
-                            <ToggleButton>
-                                <TextBlock
-                                    Text="{ReflectionBinding Configuration.RightButtonSl, Mode=TwoWay, Converter={StaticResource Key}}"
-                                    TextAlignment="Center" />
-                            </ToggleButton>
-                        </StackPanel>
-                    </StackPanel>
-                </Border>
-                <!-- Controller Picture -->
-                <Image
-                    Margin="0,10,0,0"
-                    MaxHeight="300"
-                    HorizontalAlignment="Stretch"
-                    VerticalAlignment="Stretch"
-                    Source="{Binding Image}" />
-                <!-- Motion + Rumble -->
-                <StackPanel
-                    Margin="0,10,0,0"
-                    Spacing="5"
-                    Orientation="Vertical"
-                    VerticalAlignment="Bottom">
-                    <Border
-                        BorderBrush="{DynamicResource ThemeControlBorderColor}"
-                        BorderThickness="1"
-                        CornerRadius="5"
-                        VerticalAlignment="Bottom"
-                        HorizontalAlignment="Stretch"
-                        IsVisible="{Binding IsController}">
-                        <Grid>
-                            <Grid.ColumnDefinitions>
-                                <ColumnDefinition Width="*" />
-                                <ColumnDefinition Width="Auto" />
-                            </Grid.ColumnDefinitions>
-                            <CheckBox
-                                Margin="10"
-                                MinWidth="0"
-                                Grid.Column="0"
-                                IsChecked="{ReflectionBinding Configuration.EnableMotion, Mode=TwoWay}">
-                                <TextBlock Text="{locale:Locale ControllerSettingsMotion}" />
-                            </CheckBox>
-                            <Button
-                                Margin="10"
-                                Grid.Column="1"
-                                Command="{Binding ShowMotionConfig}">
-                                <TextBlock Text="{locale:Locale ControllerSettingsConfigureGeneral}" />
-                            </Button>
-                        </Grid>
-                    </Border>
-                    <Border
-                        BorderBrush="{DynamicResource ThemeControlBorderColor}"
-                        BorderThickness="1"
-                        CornerRadius="5"
-                        HorizontalAlignment="Stretch"
-                        IsVisible="{Binding IsController}"
-                        Margin="0,-1,0,0">
-                        <Grid>
-                            <Grid.ColumnDefinitions>
-                                <ColumnDefinition Width="*" />
-                                <ColumnDefinition Width="Auto" />
-                            </Grid.ColumnDefinitions>
-                            <CheckBox
-                                Margin="10"
-                                MinWidth="0"
-                                Grid.Column="0"
-                                IsChecked="{ReflectionBinding Configuration.EnableRumble, Mode=TwoWay}">
-                                <TextBlock Text="{locale:Locale ControllerSettingsRumble}" />
-                            </CheckBox>
-                            <Button
-                                Margin="10"
-                                Grid.Column="1"
-                                Command="{Binding ShowRumbleConfig}">
-                                <TextBlock Text="{locale:Locale ControllerSettingsConfigureGeneral}" />
-                            </Button>
-                        </Grid>
-                    </Border>
-                </StackPanel>
-            </StackPanel>
-            <!-- Right Controls -->
-            <StackPanel
-                Orientation="Vertical"
-                Margin="5,0,0,0"
-                Grid.Column="2">
-                <!-- Right Triggers -->
-                <Border
-                    BorderBrush="{DynamicResource ThemeControlBorderColor}"
-                    BorderThickness="1"
-                    IsVisible="{Binding IsRight}"
-                    MinHeight="90"
-                    CornerRadius="5">
-                    <Grid
-                        Margin="10"
-                        HorizontalAlignment="Stretch">
-                        <Grid.ColumnDefinitions>
-                            <ColumnDefinition />
-                            <ColumnDefinition />
-                        </Grid.ColumnDefinitions>
-                        <Grid.RowDefinitions>
-                            <RowDefinition />
-                            <RowDefinition />
-                        </Grid.RowDefinitions>
-                        <StackPanel
-                            Grid.Column="1"
-                            Grid.Row="0"
-                            Orientation="Horizontal">
-                            <TextBlock
-                                Width="20"
-                                HorizontalAlignment="Center"
-                                VerticalAlignment="Center"
-                                Text="{locale:Locale ControllerSettingsTriggerZR}"
-                                TextAlignment="Center" />
-                            <ToggleButton>
-                                <TextBlock
-                                    Text="{ReflectionBinding Configuration.ButtonZr, Mode=TwoWay, Converter={StaticResource Key}}"
-                                    TextAlignment="Center" />
-                            </ToggleButton>
-                        </StackPanel>
-                        <StackPanel
-                            Grid.Column="1"
-                            Grid.Row="1"
-                            HorizontalAlignment="Center"
-                            VerticalAlignment="Center"
-                            Orientation="Horizontal">
-                            <TextBlock
-                                Width="20"
-                                HorizontalAlignment="Center"
-                                VerticalAlignment="Center"
-                                Text="{locale:Locale ControllerSettingsTriggerR}"
-                                TextAlignment="Center" />
-                            <ToggleButton>
-                                <TextBlock
-                                    Text="{ReflectionBinding Configuration.ButtonR, Mode=TwoWay, Converter={StaticResource Key}}"
-                                    TextAlignment="Center" />
-                            </ToggleButton>
-                        </StackPanel>
-                        <StackPanel
-                            Grid.Column="0"
-                            Grid.Row="1"
-                            HorizontalAlignment="Right"
-                            VerticalAlignment="Center"
-                            Orientation="Horizontal">
-                            <TextBlock
-                                Width="20"
-                                HorizontalAlignment="Center"
-                                VerticalAlignment="Center"
-                                Text="{locale:Locale ControllerSettingsButtonPlus}"
-                                TextAlignment="Center" />
-                            <ToggleButton>
-                                <TextBlock
-                                    Text="{ReflectionBinding Configuration.ButtonPlus, Mode=TwoWay, Converter={StaticResource Key}}"
-                                    TextAlignment="Center" />
-                            </ToggleButton>
-                        </StackPanel>
-                    </Grid>
-                </Border>
-                <!-- Right Joystick -->
-                <Border
-                    BorderBrush="{DynamicResource ThemeControlBorderColor}"
-                    BorderThickness="1"
-                    IsVisible="{Binding IsRight}"
-                    Margin="0,5,0,0"
-                    CornerRadius="5">
-                    <StackPanel
-                        Margin="10"
-                        Orientation="Vertical">
-                        <TextBlock
-                            Margin="0,0,0,10"
-                            HorizontalAlignment="Center"
-                            Text="{locale:Locale ControllerSettingsButtons}" />
-                        <StackPanel
-                            Orientation="Vertical">
-                            <!-- Right Buttons A -->
-                            <StackPanel
-                                Margin="0,0,0,4"
-                                Orientation="Horizontal">
-                                <TextBlock
-                                    Width="120"
-                                    Margin="0,0,10,0"
-                                    HorizontalAlignment="Center"
-                                    VerticalAlignment="Center"
-                                    Text="{locale:Locale ControllerSettingsButtonA}"
-                                    TextAlignment="Center" />
-                                <ToggleButton>
-                                    <TextBlock
-                                        Text="{ReflectionBinding Configuration.ButtonA, Mode=TwoWay, Converter={StaticResource Key}}"
-                                        TextAlignment="Center" />
-                                </ToggleButton>
-                            </StackPanel>
-                            <!-- Right Buttons B -->
-                            <StackPanel
-                                Margin="0,0,0,4"
-                                Orientation="Horizontal">
-                                <TextBlock
-                                    Width="120"
-                                    Margin="0,0,10,0"
-                                    HorizontalAlignment="Center"
-                                    VerticalAlignment="Center"
-                                    Text="{locale:Locale ControllerSettingsButtonB}"
-                                    TextAlignment="Center" />
-                                <ToggleButton>
-                                    <TextBlock
-                                        Text="{ReflectionBinding Configuration.ButtonB, Mode=TwoWay, Converter={StaticResource Key}}"
-                                        TextAlignment="Center" />
-                                </ToggleButton>
-                            </StackPanel>
-                            <!-- Right Buttons X -->
-                            <StackPanel
-                                Margin="0,0,0,4"
-                                Orientation="Horizontal">
-                                <TextBlock
-                                    Width="120"
-                                    Margin="0,0,10,0"
-                                    HorizontalAlignment="Center"
-                                    VerticalAlignment="Center"
-                                    Text="{locale:Locale ControllerSettingsButtonX}"
-                                    TextAlignment="Center" />
-                                <ToggleButton>
-                                    <TextBlock
-                                        Text="{ReflectionBinding Configuration.ButtonX, Mode=TwoWay, Converter={StaticResource Key}}"
-                                        TextAlignment="Center" />
-                                </ToggleButton>
-                            </StackPanel>
-                            <!-- Right Buttons Y -->
-                            <StackPanel
-                                Margin="0,0,0,4"
-                                Orientation="Horizontal">
-                                <TextBlock
-                                    Width="120"
-                                    Margin="0,0,10,0"
-                                    HorizontalAlignment="Center"
-                                    VerticalAlignment="Center"
-                                    Text="{locale:Locale ControllerSettingsButtonY}"
-                                    TextAlignment="Center" />
-                                <ToggleButton>
-                                    <TextBlock
-                                        Text="{ReflectionBinding Configuration.ButtonY, Mode=TwoWay, Converter={StaticResource Key}}"
-                                        TextAlignment="Center" />
-                                </ToggleButton>
-                            </StackPanel>
-                        </StackPanel>
-                    </StackPanel>
-                </Border>
-                <!-- Right DPad -->
-                <Border
-                    Padding="10"
-                    BorderBrush="{DynamicResource ThemeControlBorderColor}"
-                    BorderThickness="1"
-                    CornerRadius="5"
-                    IsVisible="{Binding IsRight}"
-                    Margin="0,5,0,0">
-                    <StackPanel Orientation="Vertical">
-                        <TextBlock
-                            Margin="0,0,0,10"
-                            HorizontalAlignment="Center"
-                            Text="{locale:Locale ControllerSettingsRStick}" />
-                        <!-- Right Joystick Keyboard -->
-                        <StackPanel
-                            IsVisible="{Binding !IsController}"
-                            Orientation="Vertical">
-                            <!-- Right Joystick Button -->
-                            <StackPanel
-                                Margin="0,0,0,4"
-                                Orientation="Horizontal">
-                                <TextBlock
-                                    Margin="0,0,10,0"
-                                    Width="120"
-                                    HorizontalAlignment="Center"
-                                    VerticalAlignment="Center"
-                                    Text="{locale:Locale ControllerSettingsStickButton}"
-                                    TextAlignment="Center" />
-                                <ToggleButton>
-                                    <TextBlock
-                                        Text="{ReflectionBinding Configuration.RightKeyboardStickButton, Mode=TwoWay, Converter={StaticResource Key}}"
-                                        TextAlignment="Center" />
-                                </ToggleButton>
-                            </StackPanel>
-                            <!-- Right Joystick Up -->
-                            <StackPanel
-                                Margin="0,0,0,4"
-                                Orientation="Horizontal">
-                                <TextBlock
-                                    Margin="0,0,10,0"
-                                    Width="120"
-                                    HorizontalAlignment="Center"
-                                    VerticalAlignment="Center"
-                                    Text="{locale:Locale ControllerSettingsStickUp}"
-                                    TextAlignment="Center" />
-                                <ToggleButton>
-                                    <TextBlock
-                                        Text="{ReflectionBinding Configuration.RightStickUp, Mode=TwoWay, Converter={StaticResource Key}}"
-                                        TextAlignment="Center" />
-                                </ToggleButton>
-                            </StackPanel>
-                            <!-- Right Joystick Down -->
-                            <StackPanel
-                                Margin="0,0,0,4"
-                                Orientation="Horizontal">
-                                <TextBlock
-                                    Margin="0,0,10,0"
-                                    Width="120"
-                                    HorizontalAlignment="Center"
-                                    VerticalAlignment="Center"
-                                    Text="{locale:Locale ControllerSettingsStickDown}"
-                                    TextAlignment="Center" />
-                                <ToggleButton>
-                                    <TextBlock
-                                        Text="{ReflectionBinding Configuration.RightStickDown, Mode=TwoWay, Converter={StaticResource Key}}"
-                                        TextAlignment="Center" />
-                                </ToggleButton>
-                            </StackPanel>
-                            <!-- Right Joystick Left -->
-                            <StackPanel
-                                Margin="0,0,0,4"
-                                Orientation="Horizontal">
-                                <TextBlock
-                                    Margin="0,0,10,0"
-                                    Width="120"
-                                    HorizontalAlignment="Center"
-                                    VerticalAlignment="Center"
-                                    Text="{locale:Locale ControllerSettingsStickLeft}"
-                                    TextAlignment="Center" />
-                                <ToggleButton>
-                                    <TextBlock
-                                        Text="{ReflectionBinding Configuration.RightStickLeft, Mode=TwoWay, Converter={StaticResource Key}}"
-                                        TextAlignment="Center" />
-                                </ToggleButton>
-                            </StackPanel>
-                            <!-- Right Joystick Right -->
-                            <StackPanel
-                                Margin="0,0,0,4"
-                                Orientation="Horizontal">
-                                <TextBlock
-                                    Margin="0,0,10,0"
-                                    Width="120"
-                                    HorizontalAlignment="Center"
-                                    VerticalAlignment="Center"
-                                    Text="{locale:Locale ControllerSettingsStickRight}"
-                                    TextAlignment="Center" />
-                                <ToggleButton>
-                                    <TextBlock
-                                        Text="{ReflectionBinding Configuration.RightStickRight, Mode=TwoWay, Converter={StaticResource Key}}"
-                                        TextAlignment="Center" />
-                                </ToggleButton>
-                            </StackPanel>
-                        </StackPanel>
-                        <!-- Right Joystick Controller -->
-                        <StackPanel
-                            IsVisible="{Binding IsController}"
-                            Orientation="Vertical">
-                            <!-- Right Joystick Button -->
-                            <StackPanel
-                                Orientation="Horizontal">
-                                <TextBlock
-                                    Margin="0,0,10,0"
-                                    Width="120"
-                                    HorizontalAlignment="Center"
-                                    VerticalAlignment="Center"
-                                    Text="{locale:Locale ControllerSettingsStickButton}"
-                                    TextAlignment="Center" />
-                                <ToggleButton>
-                                    <TextBlock
-                                        Text="{ReflectionBinding Configuration.RightControllerStickButton, Mode=TwoWay, Converter={StaticResource Key}}"
-                                        TextAlignment="Center" />
-                                </ToggleButton>
-                            </StackPanel>
-                            <!-- Right Joystick Stick -->
-                            <StackPanel
-                                Margin="0,4,0,4"
-                                Background="{DynamicResource ThemeDarkColor}"
-                                Orientation="Horizontal">
-                                <TextBlock
-                                    Margin="0,0,10,0"
-                                    Width="120"
-                                    HorizontalAlignment="Center"
-                                    VerticalAlignment="Center"
-                                    Text="{locale:Locale ControllerSettingsStickStick}"
-                                    TextAlignment="Center" />
-                                <ToggleButton Tag="stick">
-                                    <TextBlock
-                                        Text="{ReflectionBinding Configuration.RightJoystick, Mode=TwoWay, Converter={StaticResource Key}}"
-                                        TextAlignment="Center" />
-                                </ToggleButton>
-                            </StackPanel>
-                            <Separator Margin="0,8,0,8" Height="1" />
-                            <CheckBox IsChecked="{ReflectionBinding Configuration.RightInvertStickX}">
-                                <TextBlock Text="{locale:Locale ControllerSettingsStickInvertXAxis}" />
-                            </CheckBox>
-                            <CheckBox IsChecked="{ReflectionBinding Configuration.RightInvertStickY}">
-                                <TextBlock Text="{locale:Locale ControllerSettingsStickInvertYAxis}" />
-                            </CheckBox>
-                            <CheckBox IsChecked="{ReflectionBinding Configuration.RightRotate90}">
-                                <TextBlock Text="{locale:Locale ControllerSettingsRotate90}" />
-                            </CheckBox>
-                            <Separator Margin="0,8,0,8" Height="1" />
-                            <StackPanel Orientation="Vertical">
-                                <TextBlock
-                                    HorizontalAlignment="Center"
-                                    Text="{locale:Locale ControllerSettingsStickDeadzone}" />
-                                <StackPanel
-                                    HorizontalAlignment="Center"
-                                    VerticalAlignment="Center"
-                                    Orientation="Horizontal">
-                                    <controls:SliderScroll
-                                        Width="130"
-                                        Maximum="1"
-                                        TickFrequency="0.01"
-                                        IsSnapToTickEnabled="True"
-                                        SmallChange="0.01"
-                                        Padding="0"
-                                        VerticalAlignment="Center"
-                                        Minimum="0"
-                                        Value="{ReflectionBinding Configuration.DeadzoneRight, Mode=TwoWay}" />
-                                    <TextBlock
-                                        VerticalAlignment="Center"
-                                        Width="25"
-                                        Text="{ReflectionBinding Configuration.DeadzoneRight, StringFormat=\{0:0.00\}}" />
-                                </StackPanel>
-                                <TextBlock
-                                    HorizontalAlignment="Center"
-                                    Text="{locale:Locale ControllerSettingsStickRange}" />
-                                <StackPanel
-                                    HorizontalAlignment="Center"
-                                    VerticalAlignment="Center"
-                                    Orientation="Horizontal">
-                                    <controls:SliderScroll
-                                        Width="130"
-                                        Maximum="2"
-                                        TickFrequency="0.01"
-                                        IsSnapToTickEnabled="True"
-                                        SmallChange="0.01"
-                                        Minimum="0"
-                                        Value="{ReflectionBinding Configuration.RangeRight, Mode=TwoWay}" />
-                                    <TextBlock
-                                        VerticalAlignment="Center"
-                                        Width="25"
-                                        Text="{ReflectionBinding Configuration.RangeRight, StringFormat=\{0:0.00\}}" />
-                                </StackPanel>
-                            </StackPanel>
-                        </StackPanel>
-                    </StackPanel>
-                </Border>
-            </StackPanel>
-        </Grid>
+            <ContentControl.DataTemplates>
+                <DataTemplate DataType="viewModels:KeyboardInputViewModel">
+                    <views:KeyboardInputView DataContext="{Binding}"/>
+                </DataTemplate>
+                <DataTemplate DataType="viewModels:GamePadInputViewModel">
+                    <views:GamePadInputView DataContext="{Binding}"/>
+                </DataTemplate>
+            </ContentControl.DataTemplates>
+
+        </ContentControl>
     </StackPanel>
 </UserControl>
diff --git a/src/Ryujinx.Ava/UI/Views/Input/ControllerInputView.axaml.cs b/src/Ryujinx.Ava/UI/Views/Input/ControllerInputView.axaml.cs
index 351297060..ab49deccc 100644
--- a/src/Ryujinx.Ava/UI/Views/Input/ControllerInputView.axaml.cs
+++ b/src/Ryujinx.Ava/UI/Views/Input/ControllerInputView.axaml.cs
@@ -1,8 +1,10 @@
+using Avalonia;
 using Avalonia.Controls;
 using Avalonia.Controls.Primitives;
 using Avalonia.Input;
 using Avalonia.Interactivity;
 using Avalonia.LogicalTree;
+using Avalonia.VisualTree;
 using Ryujinx.Ava.Common.Locale;
 using Ryujinx.Ava.UI.Helpers;
 using Ryujinx.Ava.UI.Models;
@@ -26,8 +28,19 @@ namespace Ryujinx.Ava.UI.Views.Input
             DataContext = ViewModel = new ControllerInputViewModel(this);
 
             InitializeComponent();
+        }
 
-            foreach (ILogical visual in SettingButtons.GetLogicalDescendants())
+        private void SettingButtons_PropertyChanged(object sender, AvaloniaPropertyChangedEventArgs e)
+        {
+            if(e.Property == ContentProperty)
+            {
+                RebindEvents();
+            }
+        }
+
+        public void RebindEvents()
+        {
+            foreach (var visual in SettingButtons.GetLogicalDescendants())
             {
                 if (visual is ToggleButton button && visual is not CheckBox)
                 {
@@ -36,6 +49,15 @@ namespace Ryujinx.Ava.UI.Views.Input
             }
         }
 
+        protected override void OnLoaded(RoutedEventArgs e)
+        {
+            base.OnLoaded(e);
+
+            RebindEvents();
+
+            SettingButtons.PropertyChanged += SettingButtons_PropertyChanged;
+        }
+
         protected override void OnPointerReleased(PointerReleasedEventArgs e)
         {
             base.OnPointerReleased(e);
diff --git a/src/Ryujinx.Ava/UI/Views/Input/GamePadInputView.axaml b/src/Ryujinx.Ava/UI/Views/Input/GamePadInputView.axaml
new file mode 100644
index 000000000..db1e588e6
--- /dev/null
+++ b/src/Ryujinx.Ava/UI/Views/Input/GamePadInputView.axaml
@@ -0,0 +1,741 @@
+<UserControl xmlns="https://github.com/avaloniaui"
+             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+             mc:Ignorable="d"
+             d:DesignWidth="800"
+             d:DesignHeight="450"
+             xmlns:viewModels="clr-namespace:Ryujinx.Ava.UI.ViewModels"
+             x:DataType="viewModels:GamePadInputViewModel"
+             xmlns:helpers="clr-namespace:Ryujinx.Ava.UI.Helpers"
+             xmlns:locale="clr-namespace:Ryujinx.Ava.Common.Locale"
+             xmlns:controls="clr-namespace:Ryujinx.Ava.UI.Controls"
+             x:Class="Ryujinx.Ava.UI.Views.Input.GamePadInputView">
+    <UserControl.Resources>
+        <helpers:KeyValueConverter x:Key="Key" />
+    </UserControl.Resources>
+    <Grid>
+        <Grid.ColumnDefinitions>
+            <ColumnDefinition Width="Auto" />
+            <ColumnDefinition Width="*" />
+            <ColumnDefinition Width="Auto" />
+        </Grid.ColumnDefinitions>
+        <!-- Left Controls -->
+        <StackPanel
+            Orientation="Vertical"
+            Margin="0,0,5,0"
+            Grid.Column="0">
+            <!-- Left Triggers -->
+            <Border
+                BorderBrush="{DynamicResource ThemeControlBorderColor}"
+                BorderThickness="1"
+                IsVisible="{Binding IsLeft}"
+                MinHeight="90"
+                CornerRadius="5">
+                <Grid
+                    Margin="10"
+                    HorizontalAlignment="Stretch">
+                    <Grid.ColumnDefinitions>
+                        <ColumnDefinition />
+                        <ColumnDefinition />
+                    </Grid.ColumnDefinitions>
+                    <Grid.RowDefinitions>
+                        <RowDefinition />
+                        <RowDefinition />
+                    </Grid.RowDefinitions>
+                    <StackPanel
+                        Grid.Column="0"
+                        Grid.Row="0"
+                        Orientation="Horizontal">
+                        <TextBlock
+                            Width="20"
+                            HorizontalAlignment="Center"
+                            VerticalAlignment="Center"
+                            Text="{locale:Locale ControllerSettingsTriggerZL}"
+                            TextAlignment="Center" />
+                        <ToggleButton>
+                            <TextBlock
+                                Text="{Binding Configuration.ButtonZl, Mode=TwoWay, Converter={StaticResource Key}}"
+                                TextAlignment="Center" />
+                        </ToggleButton>
+                    </StackPanel>
+                    <StackPanel
+                        Grid.Column="0"
+                        Grid.Row="1"
+                        Orientation="Horizontal">
+                        <TextBlock
+                            Width="20"
+                            HorizontalAlignment="Center"
+                            VerticalAlignment="Center"
+                            Text="{locale:Locale ControllerSettingsTriggerL}"
+                            TextAlignment="Center" />
+                        <ToggleButton>
+                            <TextBlock
+                                Text="{Binding Configuration.ButtonL, Mode=TwoWay, Converter={StaticResource Key}}"
+                                TextAlignment="Center" />
+                        </ToggleButton>
+                    </StackPanel>
+                    <StackPanel
+                        Grid.Column="1"
+                        Grid.Row="1"
+                        Orientation="Horizontal">
+                        <TextBlock
+                            Width="20"
+                            HorizontalAlignment="Center"
+                            VerticalAlignment="Center"
+                            Text="{locale:Locale ControllerSettingsButtonMinus}"
+                            TextAlignment="Center" />
+                        <ToggleButton>
+                            <TextBlock
+                                Text="{Binding Configuration.ButtonMinus, Mode=TwoWay, Converter={StaticResource Key}}"
+                                TextAlignment="Center" />
+                        </ToggleButton>
+                    </StackPanel>
+                </Grid>
+            </Border>
+            <!-- Left Joystick -->
+            <Border
+                BorderBrush="{DynamicResource ThemeControlBorderColor}"
+                BorderThickness="1"
+                IsVisible="{Binding IsLeft}"
+                Margin="0,5,0,0"
+                CornerRadius="5">
+                <StackPanel
+                    Margin="10"
+                    Orientation="Vertical">
+                    <TextBlock
+                        Margin="0,0,0,10"
+                        HorizontalAlignment="Center"
+                        Text="{locale:Locale ControllerSettingsLStick}" />
+                    <!-- Left Joystick Controller -->
+                    <StackPanel
+                        Orientation="Vertical">
+                        <!-- Left Joystick Button -->
+                        <StackPanel
+                            Orientation="Horizontal">
+                            <TextBlock
+                                Margin="0,0,10,0"
+                                Width="120"
+                                HorizontalAlignment="Center"
+                                VerticalAlignment="Center"
+                                Text="{locale:Locale ControllerSettingsStickButton}"
+                                TextAlignment="Center" />
+                            <ToggleButton>
+                                <TextBlock
+                                    Text="{Binding Configuration.LeftControllerStickButton, Mode=TwoWay, Converter={StaticResource Key}}"
+                                    TextAlignment="Center" />
+                            </ToggleButton>
+                        </StackPanel>
+                        <!-- Left Joystick Stick -->
+                        <StackPanel
+                            Margin="0,4,0,4"
+                            Orientation="Horizontal">
+                            <TextBlock
+                                Margin="0,0,10,0"
+                                Width="120"
+                                HorizontalAlignment="Center"
+                                VerticalAlignment="Center"
+                                Text="{locale:Locale ControllerSettingsStickStick}"
+                                TextAlignment="Center" />
+                            <ToggleButton Tag="stick">
+                                <TextBlock
+                                    Text="{Binding Configuration.LeftJoystick, Mode=TwoWay, Converter={StaticResource Key}}"
+                                    TextAlignment="Center" />
+                            </ToggleButton>
+                        </StackPanel>
+                        <Separator
+                            Margin="0,8,0,8"
+                            Height="1" />
+                        <CheckBox IsChecked="{Binding Configuration.LeftInvertStickX}">
+                            <TextBlock Text="{locale:Locale ControllerSettingsStickInvertXAxis}" />
+                        </CheckBox>
+                        <CheckBox IsChecked="{Binding Configuration.LeftInvertStickY}">
+                            <TextBlock Text="{locale:Locale ControllerSettingsStickInvertYAxis}" />
+                        </CheckBox>
+                        <CheckBox IsChecked="{Binding Configuration.LeftRotate90}">
+                            <TextBlock Text="{locale:Locale ControllerSettingsRotate90}" />
+                        </CheckBox>
+                        <Separator
+                            Margin="0,8,0,8"
+                            Height="1" />
+                        <StackPanel Orientation="Vertical">
+                            <TextBlock
+                                HorizontalAlignment="Center"
+                                Text="{locale:Locale ControllerSettingsStickDeadzone}" />
+                            <StackPanel
+                                HorizontalAlignment="Center"
+                                VerticalAlignment="Center"
+                                Orientation="Horizontal">
+                                <controls:SliderScroll
+                                    Width="130"
+                                    Maximum="1"
+                                    TickFrequency="0.01"
+                                    IsSnapToTickEnabled="True"
+                                    SmallChange="0.01"
+                                    Minimum="0"
+                                    Value="{Binding Configuration.DeadzoneLeft, Mode=TwoWay}" />
+                                <TextBlock
+                                    VerticalAlignment="Center"
+                                    Width="25"
+                                    Text="{Binding Configuration.DeadzoneLeft, StringFormat=\{0:0.00\}}" />
+                            </StackPanel>
+                            <TextBlock
+                                HorizontalAlignment="Center"
+                                Text="{locale:Locale ControllerSettingsStickRange}" />
+                            <StackPanel
+                                HorizontalAlignment="Center"
+                                VerticalAlignment="Center"
+                                Orientation="Horizontal">
+                                <controls:SliderScroll
+                                    Width="130"
+                                    Maximum="2"
+                                    TickFrequency="0.01"
+                                    IsSnapToTickEnabled="True"
+                                    SmallChange="0.01"
+                                    Minimum="0"
+                                    Value="{Binding Configuration.RangeLeft, Mode=TwoWay}" />
+                                <TextBlock
+                                    VerticalAlignment="Center"
+                                    Width="25"
+                                    Text="{Binding Configuration.RangeLeft, StringFormat=\{0:0.00\}}" />
+                            </StackPanel>
+                        </StackPanel>
+                    </StackPanel>
+                </StackPanel>
+            </Border>
+            <!-- Left DPad -->
+            <Border
+                BorderBrush="{DynamicResource ThemeControlBorderColor}"
+                BorderThickness="1"
+                VerticalAlignment="Top"
+                IsVisible="{Binding IsLeft}"
+                Margin="0,5,0,0"
+                CornerRadius="5">
+                <StackPanel
+                    Margin="10"
+                    Orientation="Vertical">
+                    <TextBlock
+                        Margin="0,0,0,10"
+                        HorizontalAlignment="Center"
+                        Text="{locale:Locale ControllerSettingsDPad}" />
+                    <StackPanel Orientation="Vertical">
+                        <!-- Left DPad Up -->
+                        <StackPanel
+                            Margin="0,0,0,4"
+                            Orientation="Horizontal">
+                            <TextBlock
+                                Margin="0,0,10,0"
+                                Width="120"
+                                HorizontalAlignment="Center"
+                                VerticalAlignment="Center"
+                                Text="{locale:Locale ControllerSettingsDPadUp}"
+                                TextAlignment="Center" />
+                            <ToggleButton>
+                                <TextBlock
+                                    Text="{Binding Configuration.DpadUp, Mode=TwoWay, Converter={StaticResource Key}}"
+                                    TextAlignment="Center" />
+                            </ToggleButton>
+                        </StackPanel>
+                        <!-- Left DPad Down -->
+                        <StackPanel
+                            Margin="0,0,0,4"
+                            Orientation="Horizontal">
+                            <TextBlock
+                                Margin="0,0,10,0"
+                                Width="120"
+                                HorizontalAlignment="Center"
+                                VerticalAlignment="Center"
+                                Text="{locale:Locale ControllerSettingsDPadDown}"
+                                TextAlignment="Center" />
+                            <ToggleButton>
+                                <TextBlock
+                                    Text="{Binding Configuration.DpadDown, Mode=TwoWay, Converter={StaticResource Key}}"
+                                    TextAlignment="Center" />
+                            </ToggleButton>
+                        </StackPanel>
+                        <!-- Left DPad Left -->
+                        <StackPanel
+                            Margin="0,0,0,4"
+                            Orientation="Horizontal">
+                            <TextBlock
+                                Margin="0,0,10,0"
+                                Width="120"
+                                HorizontalAlignment="Center"
+                                VerticalAlignment="Center"
+                                Text="{locale:Locale ControllerSettingsDPadLeft}"
+                                TextAlignment="Center" />
+                            <ToggleButton>
+                                <TextBlock
+                                    Text="{Binding Configuration.DpadLeft, Mode=TwoWay, Converter={StaticResource Key}}"
+                                    TextAlignment="Center" />
+                            </ToggleButton>
+                        </StackPanel>
+                        <!-- Left DPad Right -->
+                        <StackPanel
+                            Margin="0,0,0,4"
+                            Orientation="Horizontal">
+                            <TextBlock
+                                Margin="0,0,10,0"
+                                Width="120"
+                                HorizontalAlignment="Center"
+                                VerticalAlignment="Center"
+                                Text="{locale:Locale ControllerSettingsDPadRight}"
+                                TextAlignment="Center" />
+                            <ToggleButton>
+                                <TextBlock
+                                    Text="{Binding Configuration.DpadRight, Mode=TwoWay, Converter={StaticResource Key}}"
+                                    TextAlignment="Center" />
+                            </ToggleButton>
+                        </StackPanel>
+                    </StackPanel>
+                </StackPanel>
+            </Border>
+        </StackPanel>
+        <!-- Triggers & Side Buttons -->
+        <StackPanel
+            Grid.Column="1"
+            HorizontalAlignment="Stretch"
+            VerticalAlignment="Stretch">
+            <Border
+                BorderBrush="{DynamicResource ThemeControlBorderColor}"
+                BorderThickness="1"
+                CornerRadius="5"
+                MinHeight="90">
+                <StackPanel
+                    Margin="8"
+                    Orientation="Vertical">
+                    <TextBlock
+                        HorizontalAlignment="Center"
+                        Text="{locale:Locale ControllerSettingsTriggerThreshold}" />
+                    <StackPanel
+                        HorizontalAlignment="Center"
+                        Orientation="Horizontal">
+                        <controls:SliderScroll
+                            Width="130"
+                            Maximum="1"
+                            TickFrequency="0.01"
+                            IsSnapToTickEnabled="True"
+                            SmallChange="0.01"
+                            Minimum="0"
+                            Value="{Binding Configuration.TriggerThreshold, Mode=TwoWay}" />
+                        <TextBlock
+                            Width="25"
+                            Text="{Binding Configuration.TriggerThreshold, StringFormat=\{0:0.00\}}" />
+                    </StackPanel>
+                    <StackPanel
+                        Margin="0,4,0,0"
+                        HorizontalAlignment="Center"
+                        VerticalAlignment="Center"
+                        IsVisible="{Binding !IsRight}"
+                        Orientation="Horizontal">
+                        <TextBlock
+                            Width="20"
+                            HorizontalAlignment="Center"
+                            VerticalAlignment="Center"
+                            Text="{locale:Locale ControllerSettingsLeftSR}"
+                            TextAlignment="Center" />
+                        <ToggleButton>
+                            <TextBlock
+                                Text="{Binding Configuration.LeftButtonSr, Mode=TwoWay, Converter={StaticResource Key}}"
+                                TextAlignment="Center" />
+                        </ToggleButton>
+                    </StackPanel>
+                    <StackPanel
+                        Margin="0,4,0,0"
+                        HorizontalAlignment="Center"
+                        VerticalAlignment="Center"
+                        IsVisible="{Binding !IsRight}"
+                        Orientation="Horizontal">
+                        <TextBlock
+                            Width="20"
+                            HorizontalAlignment="Center"
+                            VerticalAlignment="Center"
+                            Text="{locale:Locale ControllerSettingsLeftSL}"
+                            TextAlignment="Center" />
+                        <ToggleButton>
+                            <TextBlock
+                                Text="{Binding Configuration.LeftButtonSl, Mode=TwoWay, Converter={StaticResource Key}}"
+                                TextAlignment="Center" />
+                        </ToggleButton>
+                    </StackPanel>
+                    <StackPanel
+                        Margin="0,4,0,0"
+                        HorizontalAlignment="Center"
+                        VerticalAlignment="Center"
+                        IsVisible="{Binding !IsLeft}"
+                        Orientation="Horizontal">
+                        <TextBlock
+                            Width="20"
+                            HorizontalAlignment="Center"
+                            VerticalAlignment="Center"
+                            Text="{locale:Locale ControllerSettingsRightSR}"
+                            TextAlignment="Center" />
+                        <ToggleButton>
+                            <TextBlock
+                                Text="{Binding Configuration.RightButtonSr, Mode=TwoWay, Converter={StaticResource Key}}"
+                                TextAlignment="Center" />
+                        </ToggleButton>
+                    </StackPanel>
+                    <StackPanel
+                        Margin="0,4,0,0"
+                        HorizontalAlignment="Center"
+                        VerticalAlignment="Center"
+                        IsVisible="{Binding !IsLeft}"
+                        Orientation="Horizontal">
+                        <TextBlock
+                            Width="20"
+                            HorizontalAlignment="Center"
+                            VerticalAlignment="Center"
+                            Text="{locale:Locale ControllerSettingsRightSL}"
+                            TextAlignment="Center" />
+                        <ToggleButton>
+                            <TextBlock
+                                Text="{Binding Configuration.RightButtonSl, Mode=TwoWay, Converter={StaticResource Key}}"
+                                TextAlignment="Center" />
+                        </ToggleButton>
+                    </StackPanel>
+                </StackPanel>
+            </Border>
+            <!-- Controller Picture -->
+            <Image
+                Margin="0,10,0,0"
+                MaxHeight="300"
+                HorizontalAlignment="Stretch"
+                VerticalAlignment="Stretch"
+                Source="{Binding Image}" />
+            <StackPanel
+                Margin="0,10,0,0"
+                Spacing="5"
+                Orientation="Vertical"
+                VerticalAlignment="Bottom">
+                <Border
+                    BorderBrush="{DynamicResource ThemeControlBorderColor}"
+                    BorderThickness="1"
+                    CornerRadius="5"
+                    VerticalAlignment="Bottom"
+                    HorizontalAlignment="Stretch">
+                    <Grid>
+                        <Grid.ColumnDefinitions>
+                            <ColumnDefinition Width="*" />
+                            <ColumnDefinition Width="Auto" />
+                        </Grid.ColumnDefinitions>
+                        <CheckBox
+                            Margin="10"
+                            MinWidth="0"
+                            Grid.Column="0"
+                            IsChecked="{Binding Configuration.EnableMotion, Mode=TwoWay}">
+                            <TextBlock Text="{locale:Locale ControllerSettingsMotion}" />
+                        </CheckBox>
+                        <Button
+                            Margin="10"
+                            Grid.Column="1"
+                            Command="{Binding ShowMotionConfig}">
+                            <TextBlock Text="{locale:Locale ControllerSettingsConfigureGeneral}" />
+                        </Button>
+                    </Grid>
+                </Border>
+                <Border
+                    BorderBrush="{DynamicResource ThemeControlBorderColor}"
+                    BorderThickness="1"
+                    CornerRadius="5"
+                    HorizontalAlignment="Stretch"
+                    Margin="0,-1,0,0">
+                    <Grid>
+                        <Grid.ColumnDefinitions>
+                            <ColumnDefinition Width="*" />
+                            <ColumnDefinition Width="Auto" />
+                        </Grid.ColumnDefinitions>
+                        <CheckBox
+                            Margin="10"
+                            MinWidth="0"
+                            Grid.Column="0"
+                            IsChecked="{Binding Configuration.EnableRumble, Mode=TwoWay}">
+                            <TextBlock Text="{locale:Locale ControllerSettingsRumble}" />
+                        </CheckBox>
+                        <Button
+                            Margin="10"
+                            Grid.Column="1"
+                            Command="{Binding ShowRumbleConfig}">
+                            <TextBlock Text="{locale:Locale ControllerSettingsConfigureGeneral}" />
+                        </Button>
+                    </Grid>
+                </Border>
+            </StackPanel>
+        </StackPanel>
+        <!-- Right Controls -->
+        <StackPanel
+            Orientation="Vertical"
+            Margin="5,0,0,0"
+            Grid.Column="2">
+            <!-- Right Triggers -->
+            <Border
+                BorderBrush="{DynamicResource ThemeControlBorderColor}"
+                BorderThickness="1"
+                IsVisible="{Binding IsRight}"
+                MinHeight="90"
+                CornerRadius="5">
+                <Grid
+                    Margin="10"
+                    HorizontalAlignment="Stretch">
+                    <Grid.ColumnDefinitions>
+                        <ColumnDefinition />
+                        <ColumnDefinition />
+                    </Grid.ColumnDefinitions>
+                    <Grid.RowDefinitions>
+                        <RowDefinition />
+                        <RowDefinition />
+                    </Grid.RowDefinitions>
+                    <StackPanel
+                        Grid.Column="1"
+                        Grid.Row="0"
+                        Orientation="Horizontal">
+                        <TextBlock
+                            Width="20"
+                            HorizontalAlignment="Center"
+                            VerticalAlignment="Center"
+                            Text="{locale:Locale ControllerSettingsTriggerZR}"
+                            TextAlignment="Center" />
+                        <ToggleButton>
+                            <TextBlock
+                                Text="{Binding Configuration.ButtonZr, Mode=TwoWay, Converter={StaticResource Key}}"
+                                TextAlignment="Center" />
+                        </ToggleButton>
+                    </StackPanel>
+                    <StackPanel
+                        Grid.Column="1"
+                        Grid.Row="1"
+                        HorizontalAlignment="Center"
+                        VerticalAlignment="Center"
+                        Orientation="Horizontal">
+                        <TextBlock
+                            Width="20"
+                            HorizontalAlignment="Center"
+                            VerticalAlignment="Center"
+                            Text="{locale:Locale ControllerSettingsTriggerR}"
+                            TextAlignment="Center" />
+                        <ToggleButton>
+                            <TextBlock
+                                Text="{Binding Configuration.ButtonR, Mode=TwoWay, Converter={StaticResource Key}}"
+                                TextAlignment="Center" />
+                        </ToggleButton>
+                    </StackPanel>
+                    <StackPanel
+                        Grid.Column="0"
+                        Grid.Row="1"
+                        HorizontalAlignment="Right"
+                        VerticalAlignment="Center"
+                        Orientation="Horizontal">
+                        <TextBlock
+                            Width="20"
+                            HorizontalAlignment="Center"
+                            VerticalAlignment="Center"
+                            Text="{locale:Locale ControllerSettingsButtonPlus}"
+                            TextAlignment="Center" />
+                        <ToggleButton>
+                            <TextBlock
+                                Text="{Binding Configuration.ButtonPlus, Mode=TwoWay, Converter={StaticResource Key}}"
+                                TextAlignment="Center" />
+                        </ToggleButton>
+                    </StackPanel>
+                </Grid>
+            </Border>
+            <!-- Right Joystick -->
+            <Border
+                BorderBrush="{DynamicResource ThemeControlBorderColor}"
+                BorderThickness="1"
+                IsVisible="{Binding IsRight}"
+                Margin="0,5,0,0"
+                CornerRadius="5">
+                <StackPanel
+                    Margin="10"
+                    Orientation="Vertical">
+                    <TextBlock
+                        Margin="0,0,0,10"
+                        HorizontalAlignment="Center"
+                        Text="{locale:Locale ControllerSettingsButtons}" />
+                    <StackPanel
+                        Orientation="Vertical">
+                        <!-- Right Buttons A -->
+                        <StackPanel
+                            Margin="0,0,0,4"
+                            Orientation="Horizontal">
+                            <TextBlock
+                                Width="120"
+                                Margin="0,0,10,0"
+                                HorizontalAlignment="Center"
+                                VerticalAlignment="Center"
+                                Text="{locale:Locale ControllerSettingsButtonA}"
+                                TextAlignment="Center" />
+                            <ToggleButton>
+                                <TextBlock
+                                    Text="{Binding Configuration.ButtonA, Mode=TwoWay, Converter={StaticResource Key}}"
+                                    TextAlignment="Center" />
+                            </ToggleButton>
+                        </StackPanel>
+                        <!-- Right Buttons B -->
+                        <StackPanel
+                            Margin="0,0,0,4"
+                            Orientation="Horizontal">
+                            <TextBlock
+                                Width="120"
+                                Margin="0,0,10,0"
+                                HorizontalAlignment="Center"
+                                VerticalAlignment="Center"
+                                Text="{locale:Locale ControllerSettingsButtonB}"
+                                TextAlignment="Center" />
+                            <ToggleButton>
+                                <TextBlock
+                                    Text="{Binding Configuration.ButtonB, Mode=TwoWay, Converter={StaticResource Key}}"
+                                    TextAlignment="Center" />
+                            </ToggleButton>
+                        </StackPanel>
+                        <!-- Right Buttons X -->
+                        <StackPanel
+                            Margin="0,0,0,4"
+                            Orientation="Horizontal">
+                            <TextBlock
+                                Width="120"
+                                Margin="0,0,10,0"
+                                HorizontalAlignment="Center"
+                                VerticalAlignment="Center"
+                                Text="{locale:Locale ControllerSettingsButtonX}"
+                                TextAlignment="Center" />
+                            <ToggleButton>
+                                <TextBlock
+                                    Text="{Binding Configuration.ButtonX, Mode=TwoWay, Converter={StaticResource Key}}"
+                                    TextAlignment="Center" />
+                            </ToggleButton>
+                        </StackPanel>
+                        <!-- Right Buttons Y -->
+                        <StackPanel
+                            Margin="0,0,0,4"
+                            Orientation="Horizontal">
+                            <TextBlock
+                                Width="120"
+                                Margin="0,0,10,0"
+                                HorizontalAlignment="Center"
+                                VerticalAlignment="Center"
+                                Text="{locale:Locale ControllerSettingsButtonY}"
+                                TextAlignment="Center" />
+                            <ToggleButton>
+                                <TextBlock
+                                    Text="{Binding Configuration.ButtonY, Mode=TwoWay, Converter={StaticResource Key}}"
+                                    TextAlignment="Center" />
+                            </ToggleButton>
+                        </StackPanel>
+                    </StackPanel>
+                </StackPanel>
+            </Border>
+            <!-- Right DPad -->
+            <Border
+                Padding="10"
+                BorderBrush="{DynamicResource ThemeControlBorderColor}"
+                BorderThickness="1"
+                CornerRadius="5"
+                IsVisible="{Binding IsRight}"
+                Margin="0,5,0,0">
+                <StackPanel Orientation="Vertical">
+                    <TextBlock
+                        Margin="0,0,0,10"
+                        HorizontalAlignment="Center"
+                        Text="{locale:Locale ControllerSettingsRStick}" />
+                    <!-- Right Joystick Controller -->
+                    <StackPanel
+                        Orientation="Vertical">
+                        <!-- Right Joystick Button -->
+                        <StackPanel
+                            Orientation="Horizontal">
+                            <TextBlock
+                                Margin="0,0,10,0"
+                                Width="120"
+                                HorizontalAlignment="Center"
+                                VerticalAlignment="Center"
+                                Text="{locale:Locale ControllerSettingsStickButton}"
+                                TextAlignment="Center" />
+                            <ToggleButton>
+                                <TextBlock
+                                    Text="{Binding Configuration.RightControllerStickButton, Mode=TwoWay, Converter={StaticResource Key}}"
+                                    TextAlignment="Center" />
+                            </ToggleButton>
+                        </StackPanel>
+                        <!-- Right Joystick Stick -->
+                        <StackPanel
+                            Margin="0,4,0,4"
+                            Background="{DynamicResource ThemeDarkColor}"
+                            Orientation="Horizontal">
+                            <TextBlock
+                                Margin="0,0,10,0"
+                                Width="120"
+                                HorizontalAlignment="Center"
+                                VerticalAlignment="Center"
+                                Text="{locale:Locale ControllerSettingsStickStick}"
+                                TextAlignment="Center" />
+                            <ToggleButton Tag="stick">
+                                <TextBlock
+                                    Text="{Binding Configuration.RightJoystick, Mode=TwoWay, Converter={StaticResource Key}}"
+                                    TextAlignment="Center" />
+                            </ToggleButton>
+                        </StackPanel>
+                        <Separator Margin="0,8,0,8"
+                                   Height="1" />
+                        <CheckBox IsChecked="{Binding Configuration.RightInvertStickX}">
+                            <TextBlock Text="{locale:Locale ControllerSettingsStickInvertXAxis}" />
+                        </CheckBox>
+                        <CheckBox IsChecked="{Binding Configuration.RightInvertStickY}">
+                            <TextBlock Text="{locale:Locale ControllerSettingsStickInvertYAxis}" />
+                        </CheckBox>
+                        <CheckBox IsChecked="{Binding Configuration.RightRotate90}">
+                            <TextBlock Text="{locale:Locale ControllerSettingsRotate90}" />
+                        </CheckBox>
+                        <Separator Margin="0,8,0,8"
+                                   Height="1" />
+                        <StackPanel Orientation="Vertical">
+                            <TextBlock
+                                HorizontalAlignment="Center"
+                                Text="{locale:Locale ControllerSettingsStickDeadzone}" />
+                            <StackPanel
+                                HorizontalAlignment="Center"
+                                VerticalAlignment="Center"
+                                Orientation="Horizontal">
+                                <controls:SliderScroll
+                                    Width="130"
+                                    Maximum="1"
+                                    TickFrequency="0.01"
+                                    IsSnapToTickEnabled="True"
+                                    SmallChange="0.01"
+                                    Padding="0"
+                                    VerticalAlignment="Center"
+                                    Minimum="0"
+                                    Value="{Binding Configuration.DeadzoneRight, Mode=TwoWay}" />
+                                <TextBlock
+                                    VerticalAlignment="Center"
+                                    Width="25"
+                                    Text="{Binding Configuration.DeadzoneRight, StringFormat=\{0:0.00\}}" />
+                            </StackPanel>
+                            <TextBlock
+                                HorizontalAlignment="Center"
+                                Text="{locale:Locale ControllerSettingsStickRange}" />
+                            <StackPanel
+                                HorizontalAlignment="Center"
+                                VerticalAlignment="Center"
+                                Orientation="Horizontal">
+                                <controls:SliderScroll
+                                    Width="130"
+                                    Maximum="2"
+                                    TickFrequency="0.01"
+                                    IsSnapToTickEnabled="True"
+                                    SmallChange="0.01"
+                                    Minimum="0"
+                                    Value="{Binding Configuration.RangeRight, Mode=TwoWay}" />
+                                <TextBlock
+                                    VerticalAlignment="Center"
+                                    Width="25"
+                                    Text="{Binding Configuration.RangeRight, StringFormat=\{0:0.00\}}" />
+                            </StackPanel>
+                        </StackPanel>
+                    </StackPanel>
+                </StackPanel>
+            </Border>
+        </StackPanel>
+    </Grid>
+</UserControl>
diff --git a/src/Ryujinx.Ava/UI/Views/Input/GamePadInputView.axaml.cs b/src/Ryujinx.Ava/UI/Views/Input/GamePadInputView.axaml.cs
new file mode 100644
index 000000000..cf1037f5d
--- /dev/null
+++ b/src/Ryujinx.Ava/UI/Views/Input/GamePadInputView.axaml.cs
@@ -0,0 +1,14 @@
+using Avalonia;
+using Avalonia.Controls;
+using Avalonia.Markup.Xaml;
+
+namespace Ryujinx.Ava.UI.Views.Input
+{
+    public partial class GamePadInputView : UserControl
+    {
+        public GamePadInputView()
+        {
+            InitializeComponent();
+        }
+    }
+}
diff --git a/src/Ryujinx.Ava/UI/Views/Input/KeyboardInputView.axaml b/src/Ryujinx.Ava/UI/Views/Input/KeyboardInputView.axaml
new file mode 100644
index 000000000..bcc31873f
--- /dev/null
+++ b/src/Ryujinx.Ava/UI/Views/Input/KeyboardInputView.axaml
@@ -0,0 +1,672 @@
+<UserControl xmlns="https://github.com/avaloniaui"
+             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+             mc:Ignorable="d"
+             d:DesignWidth="800"
+             d:DesignHeight="450"
+             xmlns:viewModels="clr-namespace:Ryujinx.Ava.UI.ViewModels"
+             x:DataType="viewModels:KeyboardInputViewModel"
+             xmlns:helpers="clr-namespace:Ryujinx.Ava.UI.Helpers"
+             xmlns:locale="clr-namespace:Ryujinx.Ava.Common.Locale"
+             xmlns:controls="clr-namespace:Ryujinx.Ava.UI.Controls"
+             x:Class="Ryujinx.Ava.UI.Views.Input.KeyboardInputView">
+    <UserControl.Resources>
+        <helpers:KeyValueConverter x:Key="Key" />
+    </UserControl.Resources>
+    <Grid>
+        <Grid.ColumnDefinitions>
+            <ColumnDefinition Width="Auto" />
+            <ColumnDefinition Width="*" />
+            <ColumnDefinition Width="Auto" />
+        </Grid.ColumnDefinitions>
+        <!-- Left Controls -->
+        <StackPanel
+            Orientation="Vertical"
+            Margin="0,0,5,0"
+            Grid.Column="0">
+            <!-- Left Triggers -->
+            <Border
+                BorderBrush="{DynamicResource ThemeControlBorderColor}"
+                BorderThickness="1"
+                IsVisible="{Binding IsLeft}"
+                MinHeight="90"
+                CornerRadius="5">
+                <Grid
+                    Margin="10"
+                    HorizontalAlignment="Stretch">
+                    <Grid.ColumnDefinitions>
+                        <ColumnDefinition />
+                        <ColumnDefinition />
+                    </Grid.ColumnDefinitions>
+                    <Grid.RowDefinitions>
+                        <RowDefinition />
+                        <RowDefinition />
+                    </Grid.RowDefinitions>
+                    <StackPanel
+                        Grid.Column="0"
+                        Grid.Row="0"
+                        Orientation="Horizontal">
+                        <TextBlock
+                            Width="20"
+                            HorizontalAlignment="Center"
+                            VerticalAlignment="Center"
+                            Text="{locale:Locale ControllerSettingsTriggerZL}"
+                            TextAlignment="Center" />
+                        <ToggleButton>
+                            <TextBlock
+                                Text="{Binding Configuration.ButtonZl, Mode=TwoWay, Converter={StaticResource Key}}"
+                                TextAlignment="Center" />
+                        </ToggleButton>
+                    </StackPanel>
+                    <StackPanel
+                        Grid.Column="0"
+                        Grid.Row="1"
+                        Orientation="Horizontal">
+                        <TextBlock
+                            Width="20"
+                            HorizontalAlignment="Center"
+                            VerticalAlignment="Center"
+                            Text="{locale:Locale ControllerSettingsTriggerL}"
+                            TextAlignment="Center" />
+                        <ToggleButton>
+                            <TextBlock
+                                Text="{Binding Configuration.ButtonL, Mode=TwoWay, Converter={StaticResource Key}}"
+                                TextAlignment="Center" />
+                        </ToggleButton>
+                    </StackPanel>
+                    <StackPanel
+                        Grid.Column="1"
+                        Grid.Row="1"
+                        Orientation="Horizontal">
+                        <TextBlock
+                            Width="20"
+                            HorizontalAlignment="Center"
+                            VerticalAlignment="Center"
+                            Text="{locale:Locale ControllerSettingsButtonMinus}"
+                            TextAlignment="Center" />
+                        <ToggleButton>
+                            <TextBlock
+                                Text="{Binding Configuration.ButtonMinus, Mode=TwoWay, Converter={StaticResource Key}}"
+                                TextAlignment="Center" />
+                        </ToggleButton>
+                    </StackPanel>
+                </Grid>
+            </Border>
+            <!-- Left Joystick -->
+            <Border
+                BorderBrush="{DynamicResource ThemeControlBorderColor}"
+                BorderThickness="1"
+                IsVisible="{Binding IsLeft}"
+                Margin="0,5,0,0"
+                CornerRadius="5">
+                <StackPanel
+                    Margin="10"
+                    Orientation="Vertical">
+                    <TextBlock
+                        Margin="0,0,0,10"
+                        HorizontalAlignment="Center"
+                        Text="{locale:Locale ControllerSettingsLStick}" />
+                    <!-- Left Joystick Keyboard -->
+                    <StackPanel
+                        Orientation="Vertical">
+                        <!-- Left Joystick Button -->
+                        <StackPanel
+                            Margin="0,0,0,4"
+                            Orientation="Horizontal">
+                            <TextBlock
+                                Margin="0,0,10,0"
+                                Width="120"
+                                HorizontalAlignment="Center"
+                                VerticalAlignment="Center"
+                                Text="{locale:Locale ControllerSettingsStickButton}"
+                                TextAlignment="Center" />
+                            <ToggleButton>
+                                <TextBlock
+                                    Text="{Binding Configuration.LeftKeyboardStickButton, Mode=TwoWay, Converter={StaticResource Key}}"
+                                    TextAlignment="Center" />
+                            </ToggleButton>
+                        </StackPanel>
+                        <!-- Left Joystick Up -->
+                        <StackPanel
+                            Margin="0,0,0,4"
+                            Orientation="Horizontal">
+                            <TextBlock
+                                Margin="0,0,10,0"
+                                Width="120"
+                                HorizontalAlignment="Center"
+                                VerticalAlignment="Center"
+                                Text="{locale:Locale ControllerSettingsStickUp}"
+                                TextAlignment="Center" />
+                            <ToggleButton>
+                                <TextBlock
+                                    Text="{Binding Configuration.LeftStickUp, Mode=TwoWay, Converter={StaticResource Key}}"
+                                    TextAlignment="Center" />
+                            </ToggleButton>
+                        </StackPanel>
+                        <!-- Left Joystick Down -->
+                        <StackPanel
+                            Margin="0,0,0,4"
+                            Orientation="Horizontal">
+                            <TextBlock
+                                Margin="0,0,10,0"
+                                Width="120"
+                                HorizontalAlignment="Center"
+                                VerticalAlignment="Center"
+                                Text="{locale:Locale ControllerSettingsStickDown}"
+                                TextAlignment="Center" />
+                            <ToggleButton>
+                                <TextBlock
+                                    Text="{Binding Configuration.LeftStickDown, Mode=TwoWay, Converter={StaticResource Key}}"
+                                    TextAlignment="Center" />
+                            </ToggleButton>
+                        </StackPanel>
+                        <!-- Left Joystick Left -->
+                        <StackPanel
+                            Margin="0,0,0,4"
+                            Orientation="Horizontal">
+                            <TextBlock
+                                Margin="0,0,10,0"
+                                Width="120"
+                                HorizontalAlignment="Center"
+                                VerticalAlignment="Center"
+                                Text="{locale:Locale ControllerSettingsStickLeft}"
+                                TextAlignment="Center" />
+                            <ToggleButton>
+                                <TextBlock
+                                    Text="{Binding Configuration.LeftStickLeft, Mode=TwoWay, Converter={StaticResource Key}}"
+                                    TextAlignment="Center" />
+                            </ToggleButton>
+                        </StackPanel>
+                        <!-- Left Joystick Right -->
+                        <StackPanel
+                            Margin="0,0,0,4"
+                            Orientation="Horizontal">
+                            <TextBlock
+                                Margin="0,0,10,0"
+                                Width="120"
+                                HorizontalAlignment="Center"
+                                VerticalAlignment="Center"
+                                Text="{locale:Locale ControllerSettingsStickRight}"
+                                TextAlignment="Center" />
+                            <ToggleButton>
+                                <TextBlock
+                                    Text="{Binding Configuration.LeftStickRight, Mode=TwoWay, Converter={StaticResource Key}}"
+                                    TextAlignment="Center" />
+                            </ToggleButton>
+                        </StackPanel>
+                    </StackPanel>
+                </StackPanel>
+            </Border>
+            <!-- Left DPad -->
+            <Border
+                BorderBrush="{DynamicResource ThemeControlBorderColor}"
+                BorderThickness="1"
+                VerticalAlignment="Top"
+                IsVisible="{Binding IsLeft}"
+                Margin="0,5,0,0"
+                CornerRadius="5">
+                <StackPanel
+                    Margin="10"
+                    Orientation="Vertical">
+                    <TextBlock
+                        Margin="0,0,0,10"
+                        HorizontalAlignment="Center"
+                        Text="{locale:Locale ControllerSettingsDPad}" />
+                    <StackPanel Orientation="Vertical">
+                        <!-- Left DPad Up -->
+                        <StackPanel
+                            Margin="0,0,0,4"
+                            Orientation="Horizontal">
+                            <TextBlock
+                                Margin="0,0,10,0"
+                                Width="120"
+                                HorizontalAlignment="Center"
+                                VerticalAlignment="Center"
+                                Text="{locale:Locale ControllerSettingsDPadUp}"
+                                TextAlignment="Center" />
+                            <ToggleButton>
+                                <TextBlock
+                                    Text="{Binding Configuration.DpadUp, Mode=TwoWay, Converter={StaticResource Key}}"
+                                    TextAlignment="Center" />
+                            </ToggleButton>
+                        </StackPanel>
+                        <!-- Left DPad Down -->
+                        <StackPanel
+                            Margin="0,0,0,4"
+                            Orientation="Horizontal">
+                            <TextBlock
+                                Margin="0,0,10,0"
+                                Width="120"
+                                HorizontalAlignment="Center"
+                                VerticalAlignment="Center"
+                                Text="{locale:Locale ControllerSettingsDPadDown}"
+                                TextAlignment="Center" />
+                            <ToggleButton>
+                                <TextBlock
+                                    Text="{Binding Configuration.DpadDown, Mode=TwoWay, Converter={StaticResource Key}}"
+                                    TextAlignment="Center" />
+                            </ToggleButton>
+                        </StackPanel>
+                        <!-- Left DPad Left -->
+                        <StackPanel
+                            Margin="0,0,0,4"
+                            Orientation="Horizontal">
+                            <TextBlock
+                                Margin="0,0,10,0"
+                                Width="120"
+                                HorizontalAlignment="Center"
+                                VerticalAlignment="Center"
+                                Text="{locale:Locale ControllerSettingsDPadLeft}"
+                                TextAlignment="Center" />
+                            <ToggleButton>
+                                <TextBlock
+                                    Text="{Binding Configuration.DpadLeft, Mode=TwoWay, Converter={StaticResource Key}}"
+                                    TextAlignment="Center" />
+                            </ToggleButton>
+                        </StackPanel>
+                        <!-- Left DPad Right -->
+                        <StackPanel
+                            Margin="0,0,0,4"
+                            Orientation="Horizontal">
+                            <TextBlock
+                                Margin="0,0,10,0"
+                                Width="120"
+                                HorizontalAlignment="Center"
+                                VerticalAlignment="Center"
+                                Text="{locale:Locale ControllerSettingsDPadRight}"
+                                TextAlignment="Center" />
+                            <ToggleButton>
+                                <TextBlock
+                                    Text="{Binding Configuration.DpadRight, Mode=TwoWay, Converter={StaticResource Key}}"
+                                    TextAlignment="Center" />
+                            </ToggleButton>
+                        </StackPanel>
+                    </StackPanel>
+                </StackPanel>
+            </Border>
+        </StackPanel>
+        <!-- Triggers & Side Buttons -->
+        <StackPanel
+            Grid.Column="1"
+            HorizontalAlignment="Stretch"
+            VerticalAlignment="Stretch">
+            <Border
+                BorderBrush="{DynamicResource ThemeControlBorderColor}"
+                BorderThickness="1"
+                CornerRadius="5"
+                MinHeight="90">
+                <StackPanel
+                    Margin="8"
+                    Orientation="Vertical">
+                    <TextBlock
+                        HorizontalAlignment="Center"
+                        Text="{locale:Locale ControllerSettingsTriggerThreshold}" />
+                    <StackPanel
+                        HorizontalAlignment="Center"
+                        Orientation="Horizontal">
+                        <controls:SliderScroll
+                            Width="130"
+                            Maximum="1"
+                            TickFrequency="0.01"
+                            IsSnapToTickEnabled="True"
+                            SmallChange="0.01"
+                            Minimum="0"
+                            Value="{Binding Configuration.TriggerThreshold, Mode=TwoWay}" />
+                        <TextBlock
+                            Width="25"
+                            Text="{Binding Configuration.TriggerThreshold, StringFormat=\{0:0.00\}}" />
+                    </StackPanel>
+                    <StackPanel
+                        Margin="0,4,0,0"
+                        HorizontalAlignment="Center"
+                        VerticalAlignment="Center"
+                        IsVisible="{Binding !IsRight}"
+                        Orientation="Horizontal">
+                        <TextBlock
+                            Width="20"
+                            HorizontalAlignment="Center"
+                            VerticalAlignment="Center"
+                            Text="{locale:Locale ControllerSettingsLeftSR}"
+                            TextAlignment="Center" />
+                        <ToggleButton>
+                            <TextBlock
+                                Text="{Binding Configuration.LeftButtonSr, Mode=TwoWay, Converter={StaticResource Key}}"
+                                TextAlignment="Center" />
+                        </ToggleButton>
+                    </StackPanel>
+                    <StackPanel
+                        Margin="0,4,0,0"
+                        HorizontalAlignment="Center"
+                        VerticalAlignment="Center"
+                        IsVisible="{Binding !IsRight}"
+                        Orientation="Horizontal">
+                        <TextBlock
+                            Width="20"
+                            HorizontalAlignment="Center"
+                            VerticalAlignment="Center"
+                            Text="{locale:Locale ControllerSettingsLeftSL}"
+                            TextAlignment="Center" />
+                        <ToggleButton>
+                            <TextBlock
+                                Text="{Binding Configuration.LeftButtonSl, Mode=TwoWay, Converter={StaticResource Key}}"
+                                TextAlignment="Center" />
+                        </ToggleButton>
+                    </StackPanel>
+                    <StackPanel
+                        Margin="0,4,0,0"
+                        HorizontalAlignment="Center"
+                        VerticalAlignment="Center"
+                        IsVisible="{Binding !IsLeft}"
+                        Orientation="Horizontal">
+                        <TextBlock
+                            Width="20"
+                            HorizontalAlignment="Center"
+                            VerticalAlignment="Center"
+                            Text="{locale:Locale ControllerSettingsRightSR}"
+                            TextAlignment="Center" />
+                        <ToggleButton>
+                            <TextBlock
+                                Text="{Binding Configuration.RightButtonSr, Mode=TwoWay, Converter={StaticResource Key}}"
+                                TextAlignment="Center" />
+                        </ToggleButton>
+                    </StackPanel>
+                    <StackPanel
+                        Margin="0,4,0,0"
+                        HorizontalAlignment="Center"
+                        VerticalAlignment="Center"
+                        IsVisible="{Binding !IsLeft}"
+                        Orientation="Horizontal">
+                        <TextBlock
+                            Width="20"
+                            HorizontalAlignment="Center"
+                            VerticalAlignment="Center"
+                            Text="{locale:Locale ControllerSettingsRightSL}"
+                            TextAlignment="Center" />
+                        <ToggleButton>
+                            <TextBlock
+                                Text="{Binding Configuration.RightButtonSl, Mode=TwoWay, Converter={StaticResource Key}}"
+                                TextAlignment="Center" />
+                        </ToggleButton>
+                    </StackPanel>
+                </StackPanel>
+            </Border>
+            <!-- Controller Picture -->
+            <Image
+                Margin="0,10,0,0"
+                MaxHeight="300"
+                HorizontalAlignment="Stretch"
+                VerticalAlignment="Stretch"
+                Source="{Binding Image}" />
+        </StackPanel>
+        <!-- Right Controls -->
+        <StackPanel
+            Orientation="Vertical"
+            Margin="5,0,0,0"
+            Grid.Column="2">
+            <!-- Right Triggers -->
+            <Border
+                BorderBrush="{DynamicResource ThemeControlBorderColor}"
+                BorderThickness="1"
+                IsVisible="{Binding IsRight}"
+                MinHeight="90"
+                CornerRadius="5">
+                <Grid
+                    Margin="10"
+                    HorizontalAlignment="Stretch">
+                    <Grid.ColumnDefinitions>
+                        <ColumnDefinition />
+                        <ColumnDefinition />
+                    </Grid.ColumnDefinitions>
+                    <Grid.RowDefinitions>
+                        <RowDefinition />
+                        <RowDefinition />
+                    </Grid.RowDefinitions>
+                    <StackPanel
+                        Grid.Column="1"
+                        Grid.Row="0"
+                        Orientation="Horizontal">
+                        <TextBlock
+                            Width="20"
+                            HorizontalAlignment="Center"
+                            VerticalAlignment="Center"
+                            Text="{locale:Locale ControllerSettingsTriggerZR}"
+                            TextAlignment="Center" />
+                        <ToggleButton>
+                            <TextBlock
+                                Text="{Binding Configuration.ButtonZr, Mode=TwoWay, Converter={StaticResource Key}}"
+                                TextAlignment="Center" />
+                        </ToggleButton>
+                    </StackPanel>
+                    <StackPanel
+                        Grid.Column="1"
+                        Grid.Row="1"
+                        HorizontalAlignment="Center"
+                        VerticalAlignment="Center"
+                        Orientation="Horizontal">
+                        <TextBlock
+                            Width="20"
+                            HorizontalAlignment="Center"
+                            VerticalAlignment="Center"
+                            Text="{locale:Locale ControllerSettingsTriggerR}"
+                            TextAlignment="Center" />
+                        <ToggleButton>
+                            <TextBlock
+                                Text="{Binding Configuration.ButtonR, Mode=TwoWay, Converter={StaticResource Key}}"
+                                TextAlignment="Center" />
+                        </ToggleButton>
+                    </StackPanel>
+                    <StackPanel
+                        Grid.Column="0"
+                        Grid.Row="1"
+                        HorizontalAlignment="Right"
+                        VerticalAlignment="Center"
+                        Orientation="Horizontal">
+                        <TextBlock
+                            Width="20"
+                            HorizontalAlignment="Center"
+                            VerticalAlignment="Center"
+                            Text="{locale:Locale ControllerSettingsButtonPlus}"
+                            TextAlignment="Center" />
+                        <ToggleButton>
+                            <TextBlock
+                                Text="{Binding Configuration.ButtonPlus, Mode=TwoWay, Converter={StaticResource Key}}"
+                                TextAlignment="Center" />
+                        </ToggleButton>
+                    </StackPanel>
+                </Grid>
+            </Border>
+            <!-- Right Joystick -->
+            <Border
+                BorderBrush="{DynamicResource ThemeControlBorderColor}"
+                BorderThickness="1"
+                IsVisible="{Binding IsRight}"
+                Margin="0,5,0,0"
+                CornerRadius="5">
+                <StackPanel
+                    Margin="10"
+                    Orientation="Vertical">
+                    <TextBlock
+                        Margin="0,0,0,10"
+                        HorizontalAlignment="Center"
+                        Text="{locale:Locale ControllerSettingsButtons}" />
+                    <StackPanel
+                        Orientation="Vertical">
+                        <!-- Right Buttons A -->
+                        <StackPanel
+                            Margin="0,0,0,4"
+                            Orientation="Horizontal">
+                            <TextBlock
+                                Width="120"
+                                Margin="0,0,10,0"
+                                HorizontalAlignment="Center"
+                                VerticalAlignment="Center"
+                                Text="{locale:Locale ControllerSettingsButtonA}"
+                                TextAlignment="Center" />
+                            <ToggleButton>
+                                <TextBlock
+                                    Text="{Binding Configuration.ButtonA, Mode=TwoWay, Converter={StaticResource Key}}"
+                                    TextAlignment="Center" />
+                            </ToggleButton>
+                        </StackPanel>
+                        <!-- Right Buttons B -->
+                        <StackPanel
+                            Margin="0,0,0,4"
+                            Orientation="Horizontal">
+                            <TextBlock
+                                Width="120"
+                                Margin="0,0,10,0"
+                                HorizontalAlignment="Center"
+                                VerticalAlignment="Center"
+                                Text="{locale:Locale ControllerSettingsButtonB}"
+                                TextAlignment="Center" />
+                            <ToggleButton>
+                                <TextBlock
+                                    Text="{Binding Configuration.ButtonB, Mode=TwoWay, Converter={StaticResource Key}}"
+                                    TextAlignment="Center" />
+                            </ToggleButton>
+                        </StackPanel>
+                        <!-- Right Buttons X -->
+                        <StackPanel
+                            Margin="0,0,0,4"
+                            Orientation="Horizontal">
+                            <TextBlock
+                                Width="120"
+                                Margin="0,0,10,0"
+                                HorizontalAlignment="Center"
+                                VerticalAlignment="Center"
+                                Text="{locale:Locale ControllerSettingsButtonX}"
+                                TextAlignment="Center" />
+                            <ToggleButton>
+                                <TextBlock
+                                    Text="{Binding Configuration.ButtonX, Mode=TwoWay, Converter={StaticResource Key}}"
+                                    TextAlignment="Center" />
+                            </ToggleButton>
+                        </StackPanel>
+                        <!-- Right Buttons Y -->
+                        <StackPanel
+                            Margin="0,0,0,4"
+                            Orientation="Horizontal">
+                            <TextBlock
+                                Width="120"
+                                Margin="0,0,10,0"
+                                HorizontalAlignment="Center"
+                                VerticalAlignment="Center"
+                                Text="{locale:Locale ControllerSettingsButtonY}"
+                                TextAlignment="Center" />
+                            <ToggleButton>
+                                <TextBlock
+                                    Text="{Binding Configuration.ButtonY, Mode=TwoWay, Converter={StaticResource Key}}"
+                                    TextAlignment="Center" />
+                            </ToggleButton>
+                        </StackPanel>
+                    </StackPanel>
+                </StackPanel>
+            </Border>
+            <!-- Right DPad -->
+            <Border
+                Padding="10"
+                BorderBrush="{DynamicResource ThemeControlBorderColor}"
+                BorderThickness="1"
+                CornerRadius="5"
+                IsVisible="{Binding IsRight}"
+                Margin="0,5,0,0">
+                <StackPanel Orientation="Vertical">
+                    <TextBlock
+                        Margin="0,0,0,10"
+                        HorizontalAlignment="Center"
+                        Text="{locale:Locale ControllerSettingsRStick}" />
+                    <!-- Right Joystick Keyboard -->
+                    <StackPanel
+                        Orientation="Vertical">
+                        <!-- Right Joystick Button -->
+                        <StackPanel
+                            Margin="0,0,0,4"
+                            Orientation="Horizontal">
+                            <TextBlock
+                                Margin="0,0,10,0"
+                                Width="120"
+                                HorizontalAlignment="Center"
+                                VerticalAlignment="Center"
+                                Text="{locale:Locale ControllerSettingsStickButton}"
+                                TextAlignment="Center" />
+                            <ToggleButton>
+                                <TextBlock
+                                    Text="{Binding Configuration.RightKeyboardStickButton, Mode=TwoWay, Converter={StaticResource Key}}"
+                                    TextAlignment="Center" />
+                            </ToggleButton>
+                        </StackPanel>
+                        <!-- Right Joystick Up -->
+                        <StackPanel
+                            Margin="0,0,0,4"
+                            Orientation="Horizontal">
+                            <TextBlock
+                                Margin="0,0,10,0"
+                                Width="120"
+                                HorizontalAlignment="Center"
+                                VerticalAlignment="Center"
+                                Text="{locale:Locale ControllerSettingsStickUp}"
+                                TextAlignment="Center" />
+                            <ToggleButton>
+                                <TextBlock
+                                    Text="{Binding Configuration.RightStickUp, Mode=TwoWay, Converter={StaticResource Key}}"
+                                    TextAlignment="Center" />
+                            </ToggleButton>
+                        </StackPanel>
+                        <!-- Right Joystick Down -->
+                        <StackPanel
+                            Margin="0,0,0,4"
+                            Orientation="Horizontal">
+                            <TextBlock
+                                Margin="0,0,10,0"
+                                Width="120"
+                                HorizontalAlignment="Center"
+                                VerticalAlignment="Center"
+                                Text="{locale:Locale ControllerSettingsStickDown}"
+                                TextAlignment="Center" />
+                            <ToggleButton>
+                                <TextBlock
+                                    Text="{Binding Configuration.RightStickDown, Mode=TwoWay, Converter={StaticResource Key}}"
+                                    TextAlignment="Center" />
+                            </ToggleButton>
+                        </StackPanel>
+                        <!-- Right Joystick Left -->
+                        <StackPanel
+                            Margin="0,0,0,4"
+                            Orientation="Horizontal">
+                            <TextBlock
+                                Margin="0,0,10,0"
+                                Width="120"
+                                HorizontalAlignment="Center"
+                                VerticalAlignment="Center"
+                                Text="{locale:Locale ControllerSettingsStickLeft}"
+                                TextAlignment="Center" />
+                            <ToggleButton>
+                                <TextBlock
+                                    Text="{Binding Configuration.RightStickLeft, Mode=TwoWay, Converter={StaticResource Key}}"
+                                    TextAlignment="Center" />
+                            </ToggleButton>
+                        </StackPanel>
+                        <!-- Right Joystick Right -->
+                        <StackPanel
+                            Margin="0,0,0,4"
+                            Orientation="Horizontal">
+                            <TextBlock
+                                Margin="0,0,10,0"
+                                Width="120"
+                                HorizontalAlignment="Center"
+                                VerticalAlignment="Center"
+                                Text="{locale:Locale ControllerSettingsStickRight}"
+                                TextAlignment="Center" />
+                            <ToggleButton>
+                                <TextBlock
+                                    Text="{Binding Configuration.RightStickRight, Mode=TwoWay, Converter={StaticResource Key}}"
+                                    TextAlignment="Center" />
+                            </ToggleButton>
+                        </StackPanel>
+                    </StackPanel>
+                </StackPanel>
+            </Border>
+        </StackPanel>
+    </Grid>
+</UserControl>
diff --git a/src/Ryujinx.Ava/UI/Views/Input/KeyboardInputView.axaml.cs b/src/Ryujinx.Ava/UI/Views/Input/KeyboardInputView.axaml.cs
new file mode 100644
index 000000000..9e1470589
--- /dev/null
+++ b/src/Ryujinx.Ava/UI/Views/Input/KeyboardInputView.axaml.cs
@@ -0,0 +1,14 @@
+using Avalonia;
+using Avalonia.Controls;
+using Avalonia.Markup.Xaml;
+
+namespace Ryujinx.Ava.UI.Views.Input
+{
+    public partial class KeyboardInputView : UserControl
+    {
+        public KeyboardInputView()
+        {
+            InitializeComponent();
+        }
+    }
+}
diff --git a/src/Ryujinx.Ava/UI/Views/Input/MotionInputView.axaml.cs b/src/Ryujinx.Ava/UI/Views/Input/MotionInputView.axaml.cs
index 1b340752b..c2f55812f 100644
--- a/src/Ryujinx.Ava/UI/Views/Input/MotionInputView.axaml.cs
+++ b/src/Ryujinx.Ava/UI/Views/Input/MotionInputView.axaml.cs
@@ -19,7 +19,7 @@ namespace Ryujinx.Ava.UI.Views.Input
 
         public MotionInputView(ControllerInputViewModel viewModel)
         {
-            var config = viewModel.Configuration as InputConfiguration<GamepadInputId, StickInputId>;
+            var config = viewModel.Configuration.Config as InputConfiguration<GamepadInputId, StickInputId>;
 
             _viewModel = new MotionInputViewModel
             {
@@ -51,7 +51,7 @@ namespace Ryujinx.Ava.UI.Views.Input
             };
             contentDialog.PrimaryButtonClick += (sender, args) =>
             {
-                var config = viewModel.Configuration as InputConfiguration<GamepadInputId, StickInputId>;
+                var config = viewModel.Configuration.Config as InputConfiguration<GamepadInputId, StickInputId>;
                 config.Slot = content._viewModel.Slot;
                 config.Sensitivity = content._viewModel.Sensitivity;
                 config.GyroDeadzone = content._viewModel.GyroDeadzone;
diff --git a/src/Ryujinx.Ava/UI/Views/Input/RumbleInputView.axaml.cs b/src/Ryujinx.Ava/UI/Views/Input/RumbleInputView.axaml.cs
index 9307f872c..94384f828 100644
--- a/src/Ryujinx.Ava/UI/Views/Input/RumbleInputView.axaml.cs
+++ b/src/Ryujinx.Ava/UI/Views/Input/RumbleInputView.axaml.cs
@@ -19,7 +19,7 @@ namespace Ryujinx.Ava.UI.Views.Input
 
         public RumbleInputView(ControllerInputViewModel viewModel)
         {
-            var config = viewModel.Configuration as InputConfiguration<GamepadInputId, StickInputId>;
+            var config = viewModel.Configuration.Config as InputConfiguration<GamepadInputId, StickInputId>;
 
             _viewModel = new RumbleInputViewModel
             {
@@ -47,7 +47,7 @@ namespace Ryujinx.Ava.UI.Views.Input
 
             contentDialog.PrimaryButtonClick += (sender, args) =>
             {
-                var config = viewModel.Configuration as InputConfiguration<GamepadInputId, StickInputId>;
+                var config = viewModel.Configuration.Config as InputConfiguration<GamepadInputId, StickInputId>;
                 config.StrongRumble = content._viewModel.StrongRumble;
                 config.WeakRumble = content._viewModel.WeakRumble;
             };