aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIsaac Marovitz <42140194+IsaacMarovitz@users.noreply.github.com>2023-01-06 18:35:21 -0500
committerGitHub <noreply@github.com>2023-01-07 00:35:21 +0100
commit38519f3b9ade223983f7529f9b4f4b857c60f42b (patch)
treea041ee4171f61417b75dd6a7a204d6d150f60ecb
parent7f27aabbd0501b32e4918384c0a50fd0b7f357fe (diff)
Ava GUI: `SettingsWindow` Refactor (#4177)1.1.513
* Fix redundancies * Add back elses * Settings Refactor * Fix Disposal functions * Use `ReflectionBinding` instead of redundant funcs * Ac_K suggestions * Update Ryujinx.Ava/UI/ViewModels/SettingsViewModel.cs Co-authored-by: Ac_K <Acoustik666@gmail.com> * Update locale keys * Update Ryujinx.Ava/UI/Windows/SettingsWindow.axaml.cs Co-authored-by: TSRBerry <20988865+TSRBerry@users.noreply.github.com> * Update Ryujinx.Ava/UI/Views/Settings/SettingsSystemView.axaml.cs Co-authored-by: TSRBerry <20988865+TSRBerry@users.noreply.github.com> * Update Ryujinx.Ava/UI/Views/Settings/SettingsSystemView.axaml.cs Co-authored-by: TSRBerry <20988865+TSRBerry@users.noreply.github.com> * Update Ryujinx.Ava/UI/Windows/SettingsWindow.axaml.cs Co-authored-by: TSRBerry <20988865+TSRBerry@users.noreply.github.com> * Use block-scoped namespaces * Fix typo * Make `TimeZone` internal again Co-authored-by: Ac_K <Acoustik666@gmail.com> Co-authored-by: TSRBerry <20988865+TSRBerry@users.noreply.github.com>
-rw-r--r--Ryujinx.Ava/UI/ViewModels/SettingsViewModel.cs104
-rw-r--r--Ryujinx.Ava/UI/Views/Settings/SettingsAudioView.axaml81
-rw-r--r--Ryujinx.Ava/UI/Views/Settings/SettingsAudioView.axaml.cs12
-rw-r--r--Ryujinx.Ava/UI/Views/Settings/SettingsCPUView.axaml72
-rw-r--r--Ryujinx.Ava/UI/Views/Settings/SettingsCPUView.axaml.cs12
-rw-r--r--Ryujinx.Ava/UI/Views/Settings/SettingsGraphicsView.axaml218
-rw-r--r--Ryujinx.Ava/UI/Views/Settings/SettingsGraphicsView.axaml.cs12
-rw-r--r--Ryujinx.Ava/UI/Views/Settings/SettingsHotkeysView.axaml104
-rw-r--r--Ryujinx.Ava/UI/Views/Settings/SettingsHotkeysView.axaml.cs81
-rw-r--r--Ryujinx.Ava/UI/Views/Settings/SettingsInputView.axaml46
-rw-r--r--Ryujinx.Ava/UI/Views/Settings/SettingsInputView.axaml.cs17
-rw-r--r--Ryujinx.Ava/UI/Views/Settings/SettingsLoggingView.axaml118
-rw-r--r--Ryujinx.Ava/UI/Views/Settings/SettingsLoggingView.axaml.cs12
-rw-r--r--Ryujinx.Ava/UI/Views/Settings/SettingsNetworkView.axaml35
-rw-r--r--Ryujinx.Ava/UI/Views/Settings/SettingsNetworkView.axaml.cs12
-rw-r--r--Ryujinx.Ava/UI/Views/Settings/SettingsSystemView.axaml195
-rw-r--r--Ryujinx.Ava/UI/Views/Settings/SettingsSystemView.axaml.cs52
-rw-r--r--Ryujinx.Ava/UI/Views/Settings/SettingsUIView.axaml156
-rw-r--r--Ryujinx.Ava/UI/Views/Settings/SettingsUIView.axaml.cs82
-rw-r--r--Ryujinx.Ava/UI/Windows/SettingsWindow.axaml884
-rw-r--r--Ryujinx.Ava/UI/Windows/SettingsWindow.axaml.cs210
21 files changed, 1420 insertions, 1095 deletions
diff --git a/Ryujinx.Ava/UI/ViewModels/SettingsViewModel.cs b/Ryujinx.Ava/UI/ViewModels/SettingsViewModel.cs
index 5570800a..d11b01f1 100644
--- a/Ryujinx.Ava/UI/ViewModels/SettingsViewModel.cs
+++ b/Ryujinx.Ava/UI/ViewModels/SettingsViewModel.cs
@@ -1,4 +1,3 @@
-using Avalonia;
using Avalonia.Collections;
using Avalonia.Controls;
using Avalonia.Threading;
@@ -8,8 +7,6 @@ using Ryujinx.Audio.Backends.OpenAL;
using Ryujinx.Audio.Backends.SDL2;
using Ryujinx.Audio.Backends.SoundIo;
using Ryujinx.Ava.Common.Locale;
-using Ryujinx.Ava.Input;
-using Ryujinx.Ava.UI.Controls;
using Ryujinx.Ava.UI.Helpers;
using Ryujinx.Ava.UI.Windows;
using Ryujinx.Common.Configuration;
@@ -19,7 +16,6 @@ using Ryujinx.Common.Logging;
using Ryujinx.Graphics.Vulkan;
using Ryujinx.HLE.FileSystem;
using Ryujinx.HLE.HOS.Services.Time.TimeZone;
-using Ryujinx.Input;
using Ryujinx.Ui.Common.Configuration;
using Ryujinx.Ui.Common.Configuration.System;
using System;
@@ -30,11 +26,10 @@ using TimeZone = Ryujinx.Ava.UI.Models.TimeZone;
namespace Ryujinx.Ava.UI.ViewModels
{
- internal class SettingsViewModel : BaseModel
+ public class SettingsViewModel : BaseModel
{
private readonly VirtualFileSystem _virtualFileSystem;
private readonly ContentManager _contentManager;
- private readonly StyleableWindow _owner;
private TimeZoneContentManager _timeZoneContentManager;
private readonly List<string> _validTzRegions;
@@ -44,10 +39,14 @@ namespace Ryujinx.Ava.UI.ViewModels
private int _graphicsBackendMultithreadingIndex;
private float _volume;
private bool _isVulkanAvailable = true;
- private bool _directoryChanged = false;
- private List<string> _gpuIds = new List<string>();
+ private bool _directoryChanged;
+ private List<string> _gpuIds = new();
private KeyboardHotkeys _keyboardHotkeys;
private int _graphicsBackendIndex;
+ private string _customThemePath;
+
+ public event Action CloseWindow;
+ public event Action SaveSettingsEvent;
public int ResolutionScale
{
@@ -67,19 +66,16 @@ namespace Ryujinx.Ava.UI.ViewModels
{
_graphicsBackendMultithreadingIndex = value;
- if (_owner != null)
+ if (_graphicsBackendMultithreadingIndex != (int)ConfigurationState.Instance.Graphics.BackendThreading.Value)
{
- if (_graphicsBackendMultithreadingIndex != (int)ConfigurationState.Instance.Graphics.BackendThreading.Value)
+ Dispatcher.UIThread.Post(async () =>
{
- Dispatcher.UIThread.Post(async () =>
- {
- await ContentDialogHelper.CreateInfoDialog(LocaleManager.Instance[LocaleKeys.DialogSettingsBackendThreadingWarningMessage],
- "",
- "",
- LocaleManager.Instance[LocaleKeys.InputDialogOk],
- LocaleManager.Instance[LocaleKeys.DialogSettingsBackendThreadingWarningTitle]);
- });
- }
+ await ContentDialogHelper.CreateInfoDialog(LocaleManager.Instance[LocaleKeys.DialogSettingsBackendThreadingWarningMessage],
+ "",
+ "",
+ LocaleManager.Instance[LocaleKeys.InputDialogOk],
+ LocaleManager.Instance[LocaleKeys.DialogSettingsBackendThreadingWarningTitle]);
+ });
}
OnPropertyChanged();
@@ -120,12 +116,12 @@ namespace Ryujinx.Ava.UI.ViewModels
OnPropertyChanged();
}
}
-
+
public bool IsMacOS
{
get => OperatingSystem.IsMacOS();
}
-
+
public bool EnableDiscordIntegration { get; set; }
public bool CheckUpdatesOnStart { get; set; }
public bool ShowConfirmExit { get; set; }
@@ -160,7 +156,20 @@ namespace Ryujinx.Ava.UI.ViewModels
public string TimeZone { get; set; }
public string ShaderDumpPath { get; set; }
- public string CustomThemePath { get; set; }
+
+ public string CustomThemePath
+ {
+ get
+ {
+ return _customThemePath;
+ }
+ set
+ {
+ _customThemePath = value;
+
+ OnPropertyChanged();
+ }
+ }
public int Language { get; set; }
public int Region { get; set; }
@@ -191,7 +200,7 @@ namespace Ryujinx.Ava.UI.ViewModels
{
_volume = value;
- ConfigurationState.Instance.System.AudioVolume.Value = (float)(_volume / 100);
+ ConfigurationState.Instance.System.AudioVolume.Value = _volume / 100;
OnPropertyChanged();
}
@@ -199,7 +208,7 @@ namespace Ryujinx.Ava.UI.ViewModels
public DateTimeOffset DateOffset { get; set; }
public TimeSpan TimeOffset { get; set; }
- public AvaloniaList<TimeZone> TimeZones { get; set; }
+ private AvaloniaList<TimeZone> TimeZones { get; set; }
public AvaloniaList<string> GameDirectories { get; set; }
public ObservableCollection<ComboBoxItem> AvailableGpus { get; set; }
@@ -214,17 +223,13 @@ namespace Ryujinx.Ava.UI.ViewModels
}
}
- public IGamepadDriver AvaloniaKeyboardDriver { get; }
-
- public SettingsViewModel(VirtualFileSystem virtualFileSystem, ContentManager contentManager, StyleableWindow owner) : this()
+ public SettingsViewModel(VirtualFileSystem virtualFileSystem, ContentManager contentManager) : this()
{
_virtualFileSystem = virtualFileSystem;
_contentManager = contentManager;
- _owner = owner;
if (Program.PreviewerDetached)
{
LoadTimeZones();
- AvaloniaKeyboardDriver = new AvaloniaKeyboardDriver(owner);
}
}
@@ -251,10 +256,10 @@ namespace Ryujinx.Ava.UI.ViewModels
IsSDL2Enabled = SDL2HardwareDeviceDriver.IsSupported;
}
- private unsafe void LoadAvailableGpus()
+ private void LoadAvailableGpus()
{
_gpuIds = new List<string>();
- List<string> names = new List<string>();
+ List<string> names = new();
var devices = VulkanRenderer.GetPhysicalDevices();
if (devices.Length == 0)
@@ -272,7 +277,7 @@ namespace Ryujinx.Ava.UI.ViewModels
}
AvailableGpus.Clear();
- AvailableGpus.AddRange(names.Select(x => new ComboBoxItem() { Content = x }));
+ AvailableGpus.AddRange(names.Select(x => new ComboBoxItem { Content = x }));
}
public void LoadTimeZones()
@@ -302,25 +307,6 @@ namespace Ryujinx.Ava.UI.ViewModels
}
}
- public async void BrowseTheme()
- {
- var dialog = new OpenFileDialog()
- {
- Title = LocaleManager.Instance[LocaleKeys.SettingsSelectThemeFileDialogTitle],
- AllowMultiple = false
- };
-
- dialog.Filters.Add(new FileDialogFilter() { Extensions = { "xaml" }, Name = LocaleManager.Instance[LocaleKeys.SettingsXamlThemeFile] });
-
- var file = await dialog.ShowAsync(_owner);
-
- if (file != null && file.Length > 0)
- {
- CustomThemePath = file[0];
- OnPropertyChanged(nameof(CustomThemePath));
- }
- }
-
public void LoadCurrentConfiguration()
{
ConfigurationState config = ConfigurationState.Instance;
@@ -477,16 +463,8 @@ namespace Ryujinx.Ava.UI.ViewModels
config.ToFileFormat().SaveConfig(Program.ConfigurationPath);
MainWindow.UpdateGraphicsConfig();
-
- if (_owner is SettingsWindow owner)
- {
- owner.ControllerSettings?.SaveCurrentProfile();
- }
-
- if (_owner.Owner is MainWindow window && _directoryChanged)
- {
- window.ViewModel.LoadApplications();
- }
+
+ SaveSettingsEvent?.Invoke();
_directoryChanged = false;
}
@@ -504,13 +482,13 @@ namespace Ryujinx.Ava.UI.ViewModels
public void OkButton()
{
SaveSettings();
- _owner.Close();
+ CloseWindow?.Invoke();
}
public void CancelButton()
{
RevertIfNotSaved();
- _owner.Close();
+ CloseWindow?.Invoke();
}
}
} \ No newline at end of file
diff --git a/Ryujinx.Ava/UI/Views/Settings/SettingsAudioView.axaml b/Ryujinx.Ava/UI/Views/Settings/SettingsAudioView.axaml
new file mode 100644
index 00000000..35283353
--- /dev/null
+++ b/Ryujinx.Ava/UI/Views/Settings/SettingsAudioView.axaml
@@ -0,0 +1,81 @@
+<UserControl
+ x:Class="Ryujinx.Ava.UI.Views.Settings.SettingsAudioView"
+ 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"
+ xmlns:ui="clr-namespace:FluentAvalonia.UI.Controls;assembly=FluentAvalonia"
+ xmlns:locale="clr-namespace:Ryujinx.Ava.Common.Locale"
+ xmlns:viewModels="clr-namespace:Ryujinx.Ava.UI.ViewModels"
+ mc:Ignorable="d"
+ x:CompileBindings="True"
+ x:DataType="viewModels:SettingsViewModel">
+ <Design.DataContext>
+ <viewModels:SettingsViewModel />
+ </Design.DataContext>
+ <ScrollViewer
+ Name="AudioPage"
+ HorizontalAlignment="Stretch"
+ VerticalAlignment="Stretch"
+ HorizontalScrollBarVisibility="Disabled"
+ VerticalScrollBarVisibility="Auto">
+ <Border Classes="settings">
+ <StackPanel
+ Margin="10"
+ HorizontalAlignment="Stretch"
+ Orientation="Vertical"
+ Spacing="10">
+ <TextBlock Classes="h1" Text="{locale:Locale SettingsTabAudio}" />
+ <StackPanel Margin="10,0,0,0" Orientation="Horizontal">
+ <TextBlock VerticalAlignment="Center"
+ Text="{locale:Locale SettingsTabSystemAudioBackend}"
+ ToolTip.Tip="{locale:Locale AudioBackendTooltip}"
+ Width="250" />
+ <ComboBox SelectedIndex="{Binding AudioBackend}"
+ Width="350"
+ HorizontalContentAlignment="Left">
+ <ComboBoxItem>
+ <TextBlock Text="{locale:Locale SettingsTabSystemAudioBackendDummy}" />
+ </ComboBoxItem>
+ <ComboBoxItem IsEnabled="{Binding IsOpenAlEnabled}">
+ <TextBlock Text="{locale:Locale SettingsTabSystemAudioBackendOpenAL}" />
+ </ComboBoxItem>
+ <ComboBoxItem IsEnabled="{Binding IsSoundIoEnabled}">
+ <TextBlock Text="{locale:Locale SettingsTabSystemAudioBackendSoundIO}" />
+ </ComboBoxItem>
+ <ComboBoxItem IsEnabled="{Binding IsSDL2Enabled}">
+ <TextBlock Text="{locale:Locale SettingsTabSystemAudioBackendSDL2}" />
+ </ComboBoxItem>
+ </ComboBox>
+ </StackPanel>
+ <StackPanel Margin="10,0,0,0" Orientation="Horizontal">
+ <TextBlock VerticalAlignment="Center"
+ Text="{locale:Locale SettingsTabSystemAudioVolume}"
+ ToolTip.Tip="{locale:Locale AudioVolumeTooltip}"
+ Width="250" />
+ <ui:NumberBox Value="{Binding Volume}"
+ ToolTip.Tip="{locale:Locale AudioVolumeTooltip}"
+ Width="350"
+ SmallChange="1"
+ LargeChange="10"
+ SimpleNumberFormat="F0"
+ SpinButtonPlacementMode="Inline"
+ Minimum="0"
+ Maximum="100" />
+ </StackPanel>
+ <StackPanel Margin="10,0,0,0" Orientation="Horizontal">
+ <Slider Value="{Binding Volume}"
+ Margin="250,0,0,0"
+ ToolTip.Tip="{locale:Locale AudioVolumeTooltip}"
+ Minimum="0"
+ Maximum="100"
+ SmallChange="5"
+ TickFrequency="5"
+ IsSnapToTickEnabled="True"
+ LargeChange="10"
+ Width="350" />
+ </StackPanel>
+ </StackPanel>
+ </Border>
+ </ScrollViewer>
+</UserControl> \ No newline at end of file
diff --git a/Ryujinx.Ava/UI/Views/Settings/SettingsAudioView.axaml.cs b/Ryujinx.Ava/UI/Views/Settings/SettingsAudioView.axaml.cs
new file mode 100644
index 00000000..026c7fdf
--- /dev/null
+++ b/Ryujinx.Ava/UI/Views/Settings/SettingsAudioView.axaml.cs
@@ -0,0 +1,12 @@
+using Avalonia.Controls;
+
+namespace Ryujinx.Ava.UI.Views.Settings
+{
+ public partial class SettingsAudioView : UserControl
+ {
+ public SettingsAudioView()
+ {
+ InitializeComponent();
+ }
+ }
+} \ No newline at end of file
diff --git a/Ryujinx.Ava/UI/Views/Settings/SettingsCPUView.axaml b/Ryujinx.Ava/UI/Views/Settings/SettingsCPUView.axaml
new file mode 100644
index 00000000..a0cf3452
--- /dev/null
+++ b/Ryujinx.Ava/UI/Views/Settings/SettingsCPUView.axaml
@@ -0,0 +1,72 @@
+<UserControl
+ x:Class="Ryujinx.Ava.UI.Views.Settings.SettingsCPUView"
+ 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"
+ xmlns:locale="clr-namespace:Ryujinx.Ava.Common.Locale"
+ xmlns:viewModels="clr-namespace:Ryujinx.Ava.UI.ViewModels"
+ mc:Ignorable="d"
+ x:CompileBindings="True"
+ x:DataType="viewModels:SettingsViewModel">
+ <Design.DataContext>
+ <viewModels:SettingsViewModel />
+ </Design.DataContext>
+ <ScrollViewer
+ Name="CpuPage"
+ HorizontalAlignment="Stretch"
+ VerticalAlignment="Stretch"
+ HorizontalScrollBarVisibility="Disabled"
+ VerticalScrollBarVisibility="Auto">
+ <Border Classes="settings">
+ <StackPanel
+ Margin="10"
+ HorizontalAlignment="Stretch"
+ Orientation="Vertical"
+ Spacing="10">
+ <TextBlock Classes="h1" Text="{locale:Locale SettingsTabCpuCache}" />
+ <StackPanel
+ Margin="10,0,0,0"
+ HorizontalAlignment="Stretch"
+ Orientation="Vertical">
+ <CheckBox IsChecked="{Binding EnablePptc}">
+ <TextBlock Text="{locale:Locale SettingsTabSystemEnablePptc}"
+ ToolTip.Tip="{locale:Locale PptcToggleTooltip}" />
+ </CheckBox>
+ </StackPanel>
+ <Separator Height="1" />
+ <TextBlock Classes="h1" Text="{locale:Locale SettingsTabCpuMemory}" />
+ <StackPanel
+ Margin="10,0,0,0"
+ HorizontalAlignment="Stretch"
+ Orientation="Vertical">
+ <StackPanel Orientation="Horizontal">
+ <TextBlock VerticalAlignment="Center"
+ Text="{locale:Locale SettingsTabSystemMemoryManagerMode}"
+ ToolTip.Tip="{locale:Locale MemoryManagerTooltip}"
+ Width="250" />
+ <ComboBox SelectedIndex="{Binding MemoryMode}"
+ ToolTip.Tip="{locale:Locale MemoryManagerTooltip}"
+ HorizontalContentAlignment="Left"
+ Width="350">
+ <ComboBoxItem
+ ToolTip.Tip="{locale:Locale MemoryManagerSoftwareTooltip}">
+ <TextBlock
+ Text="{locale:Locale SettingsTabSystemMemoryManagerModeSoftware}" />
+ </ComboBoxItem>
+ <ComboBoxItem
+ ToolTip.Tip="{locale:Locale MemoryManagerHostTooltip}">
+ <TextBlock Text="{locale:Locale SettingsTabSystemMemoryManagerModeHost}" />
+ </ComboBoxItem>
+ <ComboBoxItem
+ ToolTip.Tip="{locale:Locale MemoryManagerUnsafeTooltip}">
+ <TextBlock
+ Text="{locale:Locale SettingsTabSystemMemoryManagerModeHostUnchecked}" />
+ </ComboBoxItem>
+ </ComboBox>
+ </StackPanel>
+ </StackPanel>
+ </StackPanel>
+ </Border>
+ </ScrollViewer>
+</UserControl> \ No newline at end of file
diff --git a/Ryujinx.Ava/UI/Views/Settings/SettingsCPUView.axaml.cs b/Ryujinx.Ava/UI/Views/Settings/SettingsCPUView.axaml.cs
new file mode 100644
index 00000000..5c5b6079
--- /dev/null
+++ b/Ryujinx.Ava/UI/Views/Settings/SettingsCPUView.axaml.cs
@@ -0,0 +1,12 @@
+using Avalonia.Controls;
+
+namespace Ryujinx.Ava.UI.Views.Settings
+{
+ public partial class SettingsCPUView : UserControl
+ {
+ public SettingsCPUView()
+ {
+ InitializeComponent();
+ }
+ }
+} \ No newline at end of file
diff --git a/Ryujinx.Ava/UI/Views/Settings/SettingsGraphicsView.axaml b/Ryujinx.Ava/UI/Views/Settings/SettingsGraphicsView.axaml
new file mode 100644
index 00000000..1f65155a
--- /dev/null
+++ b/Ryujinx.Ava/UI/Views/Settings/SettingsGraphicsView.axaml
@@ -0,0 +1,218 @@
+<UserControl
+ x:Class="Ryujinx.Ava.UI.Views.Settings.SettingsGraphicsView"
+ 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"
+ xmlns:ui="clr-namespace:FluentAvalonia.UI.Controls;assembly=FluentAvalonia"
+ xmlns:locale="clr-namespace:Ryujinx.Ava.Common.Locale"
+ xmlns:viewModels="clr-namespace:Ryujinx.Ava.UI.ViewModels"
+ mc:Ignorable="d"
+ x:CompileBindings="True"
+ x:DataType="viewModels:SettingsViewModel">
+ <Design.DataContext>
+ <viewModels:SettingsViewModel />
+ </Design.DataContext>
+ <ScrollViewer
+ Name="GraphicsPage"
+ HorizontalAlignment="Stretch"
+ VerticalAlignment="Stretch"
+ HorizontalScrollBarVisibility="Disabled"
+ VerticalScrollBarVisibility="Auto">
+ <Border Classes="settings">
+ <StackPanel
+ Margin="10"
+ HorizontalAlignment="Stretch"
+ Orientation="Vertical"
+ Spacing="10">
+ <TextBlock Classes="h1" Text="{locale:Locale SettingsTabGraphicsAPI}" />
+ <StackPanel Margin="10,0,0,0" Orientation="Vertical" Spacing="10">
+ <StackPanel Orientation="Horizontal">
+ <TextBlock VerticalAlignment="Center"
+ ToolTip.Tip="{locale:Locale SettingsTabGraphicsBackendTooltip}"
+ Text="{locale:Locale SettingsTabGraphicsBackend}"
+ Width="250" />
+ <ComboBox Width="350"
+ HorizontalContentAlignment="Left"
+ ToolTip.Tip="{locale:Locale SettingsTabGraphicsBackendTooltip}"
+ SelectedIndex="{Binding GraphicsBackendIndex}">
+ <ComboBoxItem IsVisible="{Binding IsVulkanAvailable}">
+ <TextBlock Text="Vulkan" />
+ </ComboBoxItem>
+ <ComboBoxItem IsEnabled="{Binding IsOpenGLAvailable}">
+ <TextBlock Text="OpenGL" />
+ </ComboBoxItem>
+ </ComboBox>
+ </StackPanel>
+ <StackPanel Orientation="Horizontal" IsVisible="{Binding IsVulkanSelected}">
+ <TextBlock VerticalAlignment="Center"
+ ToolTip.Tip="{locale:Locale SettingsTabGraphicsPreferredGpuTooltip}"
+ Text="{locale:Locale SettingsTabGraphicsPreferredGpu}"
+ Width="250" />
+ <ComboBox Width="350"
+ HorizontalContentAlignment="Left"
+ ToolTip.Tip="{locale:Locale SettingsTabGraphicsPreferredGpuTooltip}"
+ SelectedIndex="{Binding PreferredGpuIndex}"
+ Items="{Binding AvailableGpus}"/>
+ </StackPanel>
+ </StackPanel>
+ <Separator Height="1" />
+ <TextBlock Classes="h1" Text="{locale:Locale SettingsTabGraphicsFeatures}" />
+ <StackPanel Margin="10,0,0,0" Orientation="Vertical" Spacing="10">
+ <StackPanel Orientation="Vertical">
+ <CheckBox IsChecked="{Binding EnableShaderCache}"
+ ToolTip.Tip="{locale:Locale ShaderCacheToggleTooltip}">
+ <TextBlock Text="{locale:Locale SettingsTabGraphicsEnableShaderCache}" />
+ </CheckBox>
+ <CheckBox IsChecked="{Binding EnableTextureRecompression}"
+ ToolTip.Tip="{locale:Locale SettingsEnableTextureRecompressionTooltip}">
+ <TextBlock Text="{locale:Locale SettingsEnableTextureRecompression}" />
+ </CheckBox>
+ <CheckBox IsChecked="{Binding EnableMacroHLE}"
+ ToolTip.Tip="{locale:Locale SettingsEnableMacroHLETooltip}">
+ <TextBlock Text="{locale:Locale SettingsEnableMacroHLE}" />
+ </CheckBox>
+ </StackPanel>
+ <StackPanel Orientation="Horizontal">
+ <TextBlock VerticalAlignment="Center"
+ ToolTip.Tip="{locale:Locale ResolutionScaleTooltip}"
+ Text="{locale:Locale SettingsTabGraphicsResolutionScale}"
+ Width="250" />
+ <ComboBox SelectedIndex="{Binding ResolutionScale}"
+ Width="350"
+ HorizontalContentAlignment="Left"
+ ToolTip.Tip="{locale:Locale ResolutionScaleTooltip}">
+ <ComboBoxItem>
+ <TextBlock Text="{locale:Locale SettingsTabGraphicsResolutionScaleCustom}" />
+ </ComboBoxItem>
+ <ComboBoxItem>
+ <TextBlock Text="{locale:Locale SettingsTabGraphicsResolutionScaleNative}" />
+ </ComboBoxItem>
+ <ComboBoxItem>
+ <TextBlock Text="{locale:Locale SettingsTabGraphicsResolutionScale2x}" />
+ </ComboBoxItem>
+ <ComboBoxItem>
+ <TextBlock Text="{locale:Locale SettingsTabGraphicsResolutionScale3x}" />
+ </ComboBoxItem>
+ <ComboBoxItem>
+ <TextBlock Text="{locale:Locale SettingsTabGraphicsResolutionScale4x}" />
+ </ComboBoxItem>
+ </ComboBox>
+ <ui:NumberBox
+ Margin="10,0,0,0"
+ ToolTip.Tip="{locale:Locale ResolutionScaleEntryTooltip}"
+ MinWidth="150"
+ SmallChange="0.1"
+ LargeChange="1"
+ SimpleNumberFormat="F2"
+ SpinButtonPlacementMode="Inline"
+ IsVisible="{Binding IsCustomResolutionScaleActive}"
+ Maximum="100"
+ Minimum="0.1"
+ Value="{Binding CustomResolutionScale}" />
+ </StackPanel>
+ <StackPanel Orientation="Horizontal">
+ <TextBlock VerticalAlignment="Center"
+ ToolTip.Tip="{locale:Locale AnisotropyTooltip}"
+ Text="{locale:Locale SettingsTabGraphicsAnisotropicFiltering}"
+ Width="250" />
+ <ComboBox SelectedIndex="{Binding MaxAnisotropy}"
+ Width="350"
+ HorizontalContentAlignment="Left"
+ ToolTip.Tip="{locale:Locale AnisotropyTooltip}">
+ <ComboBoxItem>
+ <TextBlock
+ Text="{locale:Locale SettingsTabGraphicsAnisotropicFilteringAuto}" />
+ </ComboBoxItem>
+ <ComboBoxItem>
+ <TextBlock Text="{locale:Locale SettingsTabGraphicsAnisotropicFiltering2x}" />
+ </ComboBoxItem>
+ <ComboBoxItem>
+ <TextBlock Text="{locale:Locale SettingsTabGraphicsAnisotropicFiltering4x}" />
+ </ComboBoxItem>
+ <ComboBoxItem>
+ <TextBlock Text="{locale:Locale SettingsTabGraphicsAnisotropicFiltering8x}" />
+ </ComboBoxItem>
+ <ComboBoxItem>
+ <TextBlock
+ Text="{locale:Locale SettingsTabGraphicsAnisotropicFiltering16x}" />
+ </ComboBoxItem>
+ </ComboBox>
+ </StackPanel>
+ <StackPanel Orientation="Horizontal">
+ <TextBlock VerticalAlignment="Center"
+ ToolTip.Tip="{locale:Locale AspectRatioTooltip}"
+ Text="{locale:Locale SettingsTabGraphicsAspectRatio}"
+ Width="250" />
+ <ComboBox SelectedIndex="{Binding AspectRatio}"
+ Width="350"
+ HorizontalContentAlignment="Left"
+ ToolTip.Tip="{locale:Locale AspectRatioTooltip}">
+ <ComboBoxItem>
+ <TextBlock Text="{locale:Locale SettingsTabGraphicsAspectRatio4x3}" />
+ </ComboBoxItem>
+ <ComboBoxItem>
+ <TextBlock Text="{locale:Locale SettingsTabGraphicsAspectRatio16x9}" />
+ </ComboBoxItem>
+ <ComboBoxItem>
+ <TextBlock Text="{locale:Locale SettingsTabGraphicsAspectRatio16x10}" />
+ </ComboBoxItem>
+ <ComboBoxItem>
+ <TextBlock Text="{locale:Locale SettingsTabGraphicsAspectRatio21x9}" />
+ </ComboBoxItem>
+ <ComboBoxItem>
+ <TextBlock Text="{locale:Locale SettingsTabGraphicsAspectRatio32x9}" />
+ </ComboBoxItem>
+ <ComboBoxItem>
+ <TextBlock Text="{locale:Locale SettingsTabGraphicsAspectRatioStretch}" />
+ </ComboBoxItem>
+ </ComboBox>
+ </StackPanel>
+ </StackPanel>
+ <StackPanel
+ Margin="10,0,0,0"
+ HorizontalAlignment="Stretch"
+ Orientation="Vertical"
+ Spacing="10">
+ <StackPanel Orientation="Horizontal">
+ <TextBlock VerticalAlignment="Center"
+ ToolTip.Tip="{locale:Locale GraphicsBackendThreadingTooltip}"
+ Text="{locale:Locale SettingsTabGraphicsBackendMultithreading}"
+ Width="250" />
+ <ComboBox Width="350"
+ HorizontalContentAlignment="Left"
+ ToolTip.Tip="{locale:Locale GalThreadingTooltip}"
+ SelectedIndex="{Binding GraphicsBackendMultithreadingIndex}">
+ <ComboBoxItem>
+ <TextBlock Text="{locale:Locale CommonAuto}" />
+ </ComboBoxItem>
+ <ComboBoxItem>
+ <TextBlock Text="{locale:Locale CommonOff}" />
+ </ComboBoxItem>
+ <ComboBoxItem>
+ <TextBlock Text="{locale:Locale CommonOn}" />
+ </ComboBoxItem>
+ </ComboBox>
+ </StackPanel>
+ </StackPanel>
+ <Separator Height="1" />
+ <TextBlock Classes="h1" Text="{locale:Locale SettingsTabGraphicsDeveloperOptions}" />
+ <StackPanel
+ Margin="10,0,0,0"
+ HorizontalAlignment="Stretch"
+ Orientation="Vertical"
+ Spacing="10">
+ <StackPanel Orientation="Horizontal">
+ <TextBlock VerticalAlignment="Center"
+ ToolTip.Tip="{locale:Locale ShaderDumpPathTooltip}"
+ Text="{locale:Locale SettingsTabGraphicsShaderDumpPath}"
+ Width="250" />
+ <TextBox Text="{Binding ShaderDumpPath}"
+ Width="350"
+ ToolTip.Tip="{locale:Locale ShaderDumpPathTooltip}" />
+ </StackPanel>
+ </StackPanel>
+ </StackPanel>
+ </Border>
+ </ScrollViewer>
+</UserControl> \ No newline at end of file
diff --git a/Ryujinx.Ava/UI/Views/Settings/SettingsGraphicsView.axaml.cs b/Ryujinx.Ava/UI/Views/Settings/SettingsGraphicsView.axaml.cs
new file mode 100644
index 00000000..8fe08552
--- /dev/null
+++ b/Ryujinx.Ava/UI/Views/Settings/SettingsGraphicsView.axaml.cs
@@ -0,0 +1,12 @@
+using Avalonia.Controls;
+
+namespace Ryujinx.Ava.UI.Views.Settings
+{
+ public partial class SettingsGraphicsView : UserControl
+ {
+ public SettingsGraphicsView()
+ {
+ InitializeComponent();
+ }
+ }
+} \ No newline at end of file
diff --git a/Ryujinx.Ava/UI/Views/Settings/SettingsHotkeysView.axaml b/Ryujinx.Ava/UI/Views/Settings/SettingsHotkeysView.axaml
new file mode 100644
index 00000000..361125bf
--- /dev/null
+++ b/Ryujinx.Ava/UI/Views/Settings/SettingsHotkeysView.axaml
@@ -0,0 +1,104 @@
+<UserControl
+ x:Class="Ryujinx.Ava.UI.Views.Settings.SettingsHotkeysView"
+ 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"
+ xmlns:locale="clr-namespace:Ryujinx.Ava.Common.Locale"
+ xmlns:viewModels="clr-namespace:Ryujinx.Ava.UI.ViewModels"
+ xmlns:helpers="clr-namespace:Ryujinx.Ava.UI.Helpers"
+ mc:Ignorable="d"
+ x:CompileBindings="True"
+ x:DataType="viewModels:SettingsViewModel"
+ Focusable="True">
+ <Design.DataContext>
+ <viewModels:SettingsViewModel />
+ </Design.DataContext>
+ <UserControl.Resources>
+ <helpers:KeyValueConverter x:Key="Key" />
+ </UserControl.Resources>
+ <ScrollViewer
+ Name="HotkeysPage"
+ HorizontalAlignment="Stretch"
+ VerticalAlignment="Stretch"
+ HorizontalScrollBarVisibility="Disabled"
+ VerticalScrollBarVisibility="Auto">
+ <Border Classes="settings">
+ <StackPanel Margin="10" Orientation="Vertical" Spacing="10">
+ <TextBlock Classes="h1" Text="{locale:Locale SettingsTabHotkeysHotkeys}" />
+ <StackPanel Margin="10,0,0,0" Orientation="Horizontal">
+ <TextBlock VerticalAlignment="Center" Text="{locale:Locale SettingsTabHotkeysToggleVsyncHotkey}" Width="230" />
+ <ToggleButton Width="90" Height="27" Checked="Button_Checked" Unchecked="Button_Unchecked">
+ <TextBlock
+ Text="{Binding KeyboardHotkeys.ToggleVsync, Mode=TwoWay, Converter={StaticResource Key}}"
+ TextAlignment="Center" />
+ </ToggleButton>
+ </StackPanel>
+ <StackPanel Margin="10,0,0,0" Orientation="Horizontal">
+ <TextBlock VerticalAlignment="Center" Text="{locale:Locale SettingsTabHotkeysScreenshotHotkey}" Width="230" />
+ <ToggleButton Width="90" Height="27" Checked="Button_Checked" Unchecked="Button_Unchecked">
+ <TextBlock
+ Text="{Binding KeyboardHotkeys.Screenshot, Mode=TwoWay, Converter={StaticResource Key}}"
+ TextAlignment="Center" />
+ </ToggleButton>
+ </StackPanel>
+ <StackPanel Margin="10,0,0,0" Orientation="Horizontal">
+ <TextBlock VerticalAlignment="Center" Text="{locale:Locale SettingsTabHotkeysShowUiHotkey}" Width="230" />
+ <ToggleButton Width="90" Height="27" Checked="Button_Checked" Unchecked="Button_Unchecked">
+ <TextBlock
+ Text="{Binding KeyboardHotkeys.ShowUi, Mode=TwoWay, Converter={StaticResource Key}}"
+ TextAlignment="Center" />
+ </ToggleButton>
+ </StackPanel>
+ <StackPanel Margin="10,0,0,0" Orientation="Horizontal">
+ <TextBlock VerticalAlignment="Center" Text="{locale:Locale SettingsTabHotkeysPauseHotkey}" Width="230" />
+ <ToggleButton Width="90" Height="27" Checked="Button_Checked" Unchecked="Button_Unchecked">
+ <TextBlock
+ Text="{Binding KeyboardHotkeys.Pause, Mode=TwoWay, Converter={StaticResource Key}}"
+ TextAlignment="Center" />
+ </ToggleButton>
+ </StackPanel>
+ <StackPanel Margin="10,0,0,0" Orientation="Horizontal">
+ <TextBlock VerticalAlignment="Center" Text="{locale:Locale SettingsTabHotkeysToggleMuteHotkey}" Width="230" />
+ <ToggleButton Width="90" Height="27" Checked="Button_Checked" Unchecked="Button_Unchecked">
+ <TextBlock
+ Text="{Binding KeyboardHotkeys.ToggleMute, Mode=TwoWay, Converter={StaticResource Key}}"
+ TextAlignment="Center" />
+ </ToggleButton>
+ </StackPanel>
+ <StackPanel Margin="10,0,0,0" Orientation="Horizontal">
+ <TextBlock VerticalAlignment="Center" Text="{locale:Locale SettingsTabHotkeysResScaleUpHotkey}" Width="230" />
+ <ToggleButton Width="90" Height="27" Checked="Button_Checked" Unchecked="Button_Unchecked">
+ <TextBlock
+ Text="{Binding KeyboardHotkeys.ResScaleUp, Mode=TwoWay, Converter={StaticResource Key}}"
+ TextAlignment="Center" />
+ </ToggleButton>
+ </StackPanel>
+ <StackPanel Margin="10,0,0,0" Orientation="Horizontal">
+ <TextBlock VerticalAlignment="Center" Text="{locale:Locale SettingsTabHotkeysResScaleDownHotkey}" Width="230" />
+ <ToggleButton Width="90" Height="27" Checked="Button_Checked" Unchecked="Button_Unchecked">
+ <TextBlock
+ Text="{Binding KeyboardHotkeys.ResScaleDown, Mode=TwoWay, Converter={StaticResource Key}}"
+ TextAlignment="Center" />
+ </ToggleButton>
+ </StackPanel>
+ <StackPanel Margin="10,0,0,0" Orientation="Horizontal">
+ <TextBlock VerticalAlignment="Center" Text="{locale:Locale SettingsTabHotkeysVolumeUpHotkey}" Width="230" />
+ <ToggleButton Width="90" Height="27" Checked="Button_Checked" Unchecked="Button_Unchecked">
+ <TextBlock
+ Text="{Binding KeyboardHotkeys.VolumeUp, Mode=TwoWay, Converter={StaticResource Key}}"
+ TextAlignment="Center" />
+ </ToggleButton>
+ </StackPanel>
+ <StackPanel Margin="10,0,0,0" Orientation="Horizontal">
+ <TextBlock VerticalAlignment="Center" Text="{locale:Locale SettingsTabHotkeysVolumeDownHotkey}" Width="230" />
+ <ToggleButton Width="90" Height="27" Checked="Button_Checked" Unchecked="Button_Unchecked">
+ <TextBlock
+ Text="{Binding KeyboardHotkeys.VolumeDown, Mode=TwoWay, Converter={StaticResource Key}}"
+ TextAlignment="Center" />
+ </ToggleButton>
+ </StackPanel>
+ </StackPanel>
+ </Border>
+ </ScrollViewer>
+</UserControl> \ No newline at end of file
diff --git a/Ryujinx.Ava/UI/Views/Settings/SettingsHotkeysView.axaml.cs b/Ryujinx.Ava/UI/Views/Settings/SettingsHotkeysView.axaml.cs
new file mode 100644
index 00000000..702f73e8
--- /dev/null
+++ b/Ryujinx.Ava/UI/Views/Settings/SettingsHotkeysView.axaml.cs
@@ -0,0 +1,81 @@
+using Avalonia.Controls;
+using Avalonia.Controls.Primitives;
+using Avalonia.Input;
+using Avalonia.Interactivity;
+using Ryujinx.Ava.Input;
+using Ryujinx.Ava.UI.Helpers;
+using Ryujinx.Input;
+using Ryujinx.Input.Assigner;
+
+namespace Ryujinx.Ava.UI.Views.Settings
+{
+ public partial class SettingsHotkeysView : UserControl
+ {
+ private ButtonKeyAssigner _currentAssigner;
+ private IGamepadDriver AvaloniaKeyboardDriver;
+
+ public SettingsHotkeysView()
+ {
+ InitializeComponent();
+ AvaloniaKeyboardDriver = new AvaloniaKeyboardDriver(this);
+ }
+
+ private void MouseClick(object sender, PointerPressedEventArgs e)
+ {
+ bool shouldUnbind = e.GetCurrentPoint(this).Properties.IsMiddleButtonPressed;
+
+ _currentAssigner?.Cancel(shouldUnbind);
+
+ PointerPressed -= MouseClick;
+ }
+
+ private void Button_Checked(object sender, RoutedEventArgs e)
+ {
+ if (sender is ToggleButton button)
+ {
+ if (_currentAssigner != null && button == _currentAssigner.ToggledButton)
+ {
+ return;
+ }
+
+ if (_currentAssigner == null && button.IsChecked != null && (bool)button.IsChecked)
+ {
+ _currentAssigner = new ButtonKeyAssigner(button);
+
+ FocusManager.Instance?.Focus(this, NavigationMethod.Pointer);
+
+ PointerPressed += MouseClick;
+
+ var keyboard = (IKeyboard)AvaloniaKeyboardDriver.GetGamepad(AvaloniaKeyboardDriver.GamepadsIds[0]);
+ IButtonAssigner assigner = new KeyboardKeyAssigner(keyboard);
+
+ _currentAssigner.GetInputAndAssign(assigner);
+ }
+ else
+ {
+ if (_currentAssigner != null)
+ {
+ ToggleButton oldButton = _currentAssigner.ToggledButton;
+
+ _currentAssigner.Cancel();
+ _currentAssigner = null;
+
+ button.IsChecked = false;
+ }
+ }
+ }
+ }
+
+ private void Button_Unchecked(object sender, RoutedEventArgs e)
+ {
+ _currentAssigner?.Cancel();
+ _currentAssigner = null;
+ }
+
+ public void Dispose()
+ {
+ _currentAssigner?.Cancel();
+ _currentAssigner = null;
+ }
+ }
+} \ No newline at end of file
diff --git a/Ryujinx.Ava/UI/Views/Settings/SettingsInputView.axaml b/Ryujinx.Ava/UI/Views/Settings/SettingsInputView.axaml
new file mode 100644
index 00000000..1c774bda
--- /dev/null
+++ b/Ryujinx.Ava/UI/Views/Settings/SettingsInputView.axaml
@@ -0,0 +1,46 @@
+<UserControl
+ x:Class="Ryujinx.Ava.UI.Views.Settings.SettingsInputView"
+ 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"
+ xmlns:locale="clr-namespace:Ryujinx.Ava.Common.Locale"
+ xmlns:window="clr-namespace:Ryujinx.Ava.UI.Windows"
+ xmlns:viewModels="clr-namespace:Ryujinx.Ava.UI.ViewModels"
+ mc:Ignorable="d"
+ x:CompileBindings="True"
+ x:DataType="viewModels:SettingsViewModel">
+ <Design.DataContext>
+ <viewModels:SettingsViewModel />
+ </Design.DataContext>
+ <ScrollViewer
+ Name="InputPage"
+ HorizontalAlignment="Stretch"
+ VerticalAlignment="Stretch"
+ HorizontalScrollBarVisibility="Disabled"
+ VerticalScrollBarVisibility="Auto">
+ <Border Classes="settings">
+ <StackPanel Margin="4" Orientation="Vertical">
+ <StackPanel Orientation="Horizontal">
+ <CheckBox Margin="5,0"
+ ToolTip.Tip="{locale:Locale DockModeToggleTooltip}"
+ IsChecked="{Binding EnableDockedMode}">
+ <TextBlock VerticalAlignment="Center"
+ Text="{locale:Locale SettingsTabInputEnableDockedMode}" />
+ </CheckBox>
+ <CheckBox Margin="5,0"
+ ToolTip.Tip="{locale:Locale DirectKeyboardTooltip}"
+ IsChecked="{Binding EnableKeyboard}">
+ <TextBlock Text="{locale:Locale SettingsTabInputDirectKeyboardAccess}" />
+ </CheckBox>
+ <CheckBox Margin="5,0"
+ ToolTip.Tip="{locale:Locale DirectMouseTooltip}"
+ IsChecked="{Binding EnableMouse}">
+ <TextBlock Text="{locale:Locale SettingsTabInputDirectMouseAccess}" />
+ </CheckBox>
+ </StackPanel>
+ <window:ControllerSettingsWindow Name="ControllerSettings" Margin="0" MinHeight="600" />
+ </StackPanel>
+ </Border>
+ </ScrollViewer>
+</UserControl> \ No newline at end of file
diff --git a/Ryujinx.Ava/UI/Views/Settings/SettingsInputView.axaml.cs b/Ryujinx.Ava/UI/Views/Settings/SettingsInputView.axaml.cs
new file mode 100644
index 00000000..0c2105ec
--- /dev/null
+++ b/Ryujinx.Ava/UI/Views/Settings/SettingsInputView.axaml.cs
@@ -0,0 +1,17 @@
+using Avalonia.Controls;
+
+namespace Ryujinx.Ava.UI.Views.Settings
+{
+ public partial class SettingsInputView : UserControl
+ {
+ public SettingsInputView()
+ {
+ InitializeComponent();
+ }
+
+ public void Dispose()
+ {
+ ControllerSettings.Dispose();
+ }
+ }
+} \ No newline at end of file
diff --git a/Ryujinx.Ava/UI/Views/Settings/SettingsLoggingView.axaml b/Ryujinx.Ava/UI/Views/Settings/SettingsLoggingView.axaml
new file mode 100644
index 00000000..2163dcda
--- /dev/null
+++ b/Ryujinx.Ava/UI/Views/Settings/SettingsLoggingView.axaml
@@ -0,0 +1,118 @@
+<UserControl
+ x:Class="Ryujinx.Ava.UI.Views.Settings.SettingsLoggingView"
+ 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"
+ xmlns:ui="clr-namespace:FluentAvalonia.UI.Controls;assembly=FluentAvalonia"
+ xmlns:locale="clr-namespace:Ryujinx.Ava.Common.Locale"
+ xmlns:viewModels="clr-namespace:Ryujinx.Ava.UI.ViewModels"
+ mc:Ignorable="d"
+ x:CompileBindings="True"
+ x:DataType="viewModels:SettingsViewModel">
+ <Design.DataContext>
+ <viewModels:SettingsViewModel />
+ </Design.DataContext>
+ <ScrollViewer
+ Name="LoggingPage"
+ HorizontalAlignment="Stretch"
+ VerticalAlignment="Stretch"
+ HorizontalScrollBarVisibility="Disabled"
+ VerticalScrollBarVisibility="Auto">
+ <Border Classes="settings">
+ <StackPanel
+ Margin="10"
+ HorizontalAlignment="Stretch"
+ Orientation="Vertical"
+ Spacing="10">
+ <TextBlock Classes="h1" Text="{locale:Locale SettingsTabLoggingLogging}" />
+ <StackPanel Margin="10,0,0,0" Orientation="Vertical">
+ <CheckBox IsChecked="{Binding EnableFileLog}"
+ ToolTip.Tip="{locale:Locale FileLogTooltip}">
+ <TextBlock Text="{locale:Locale SettingsTabLoggingEnableLoggingToFile}" />
+ </CheckBox>
+ <CheckBox IsChecked="{Binding EnableStub}"
+ ToolTip.Tip="{locale:Locale StubLogTooltip}">
+ <TextBlock Text="{locale:Locale SettingsTabLoggingEnableStubLogs}" />
+ </CheckBox>
+ <CheckBox IsChecked="{Binding EnableInfo}"
+ ToolTip.Tip="{locale:Locale InfoLogTooltip}">
+ <TextBlock Text="{locale:Locale SettingsTabLoggingEnableInfoLogs}" />
+ </CheckBox>
+ <CheckBox IsChecked="{Binding EnableWarn}"
+ ToolTip.Tip="{locale:Locale WarnLogTooltip}">
+ <TextBlock Text="{locale:Locale SettingsTabLoggingEnableWarningLogs}" />
+ </CheckBox>
+ <CheckBox IsChecked="{Binding EnableError}"
+ ToolTip.Tip="{locale:Locale ErrorLogTooltip}">
+ <TextBlock Text="{locale:Locale SettingsTabLoggingEnableErrorLogs}" />
+ </CheckBox>
+ <CheckBox IsChecked="{Binding EnableTrace}"
+ ToolTip.Tip="{locale:Locale TraceLogTooltip}">
+ <TextBlock Text="{locale:Locale SettingsTabLoggingEnableTraceLogs}" />
+ </CheckBox>
+ <CheckBox IsChecked="{Binding EnableGuest}"
+ ToolTip.Tip="{locale:Locale GuestLogTooltip}">
+ <TextBlock Text="{locale:Locale SettingsTabLoggingEnableGuestLogs}" />
+ </CheckBox>
+ </StackPanel>
+ <Separator Height="1" />
+ <TextBlock Classes="h1" Text="{locale:Locale SettingsTabLoggingDeveloperOptions}" />
+ <StackPanel
+ Margin="10,0,0,0"
+ HorizontalAlignment="Stretch"
+ Orientation="Vertical"
+ Spacing="10">
+ <StackPanel Orientation="Vertical">
+ <CheckBox IsChecked="{Binding EnableDebug}"
+ ToolTip.Tip="{locale:Locale DebugLogTooltip}">
+ <TextBlock Text="{locale:Locale SettingsTabLoggingEnableDebugLogs}" />
+ </CheckBox>
+ <CheckBox IsChecked="{Binding EnableFsAccessLog}"
+ ToolTip.Tip="{locale:Locale FileAccessLogTooltip}">
+ <TextBlock Text="{locale:Locale SettingsTabLoggingEnableFsAccessLogs}" />
+ </CheckBox>
+ <StackPanel Margin="0,10,0,0" Orientation="Horizontal" VerticalAlignment="Stretch">
+ <TextBlock VerticalAlignment="Center"
+ ToolTip.Tip="{locale:Locale FSAccessLogModeTooltip}"
+ Text="{locale:Locale SettingsTabLoggingFsGlobalAccessLogMode}"
+ Width="285" />
+ <ui:NumberBox
+ Maximum="3"
+ Minimum="0"
+ Width="150"
+ SpinButtonPlacementMode="Inline"
+ SmallChange="1"
+ LargeChange="1"
+ Value="{Binding FsGlobalAccessLogMode}" />
+ </StackPanel>
+ <StackPanel Margin="0,10,0,0" Orientation="Horizontal">
+ <TextBlock VerticalAlignment="Center"
+ Text="{locale:Locale SettingsTabLoggingGraphicsBackendLogLevel}"
+ ToolTip.Tip="{locale:Locale OpenGlLogLevel}"
+ Width="285" />
+ <ComboBox SelectedIndex="{Binding OpenglDebugLevel}"
+ Width="150"
+ HorizontalContentAlignment="Left"
+ ToolTip.Tip="{locale:Locale OpenGlLogLevel}">
+ <ComboBoxItem>
+ <TextBlock Text="{locale:Locale SettingsTabLoggingGraphicsBackendLogLevelNone}" />
+ </ComboBoxItem>
+ <ComboBoxItem>
+ <TextBlock Text="{locale:Locale SettingsTabLoggingGraphicsBackendLogLevelError}" />
+ </ComboBoxItem>
+ <ComboBoxItem>
+ <TextBlock
+ Text="{locale:Locale SettingsTabLoggingGraphicsBackendLogLevelPerformance}" />
+ </ComboBoxItem>
+ <ComboBoxItem>
+ <TextBlock Text="{locale:Locale SettingsTabLoggingGraphicsBackendLogLevelAll}" />
+ </ComboBoxItem>
+ </ComboBox>
+ </StackPanel>
+ </StackPanel>
+ </StackPanel>
+ </StackPanel>
+ </Border>
+ </ScrollViewer>
+</UserControl> \ No newline at end of file
diff --git a/Ryujinx.Ava/UI/Views/Settings/SettingsLoggingView.axaml.cs b/Ryujinx.Ava/UI/Views/Settings/SettingsLoggingView.axaml.cs
new file mode 100644
index 00000000..2ec476ac
--- /dev/null
+++ b/Ryujinx.Ava/UI/Views/Settings/SettingsLoggingView.axaml.cs
@@ -0,0 +1,12 @@
+using Avalonia.Controls;
+
+namespace Ryujinx.Ava.UI.Views.Settings
+{
+ public partial class SettingsLoggingView : UserControl
+ {
+ public SettingsLoggingView()
+ {
+ InitializeComponent();
+ }
+ }
+} \ No newline at end of file
diff --git a/Ryujinx.Ava/UI/Views/Settings/SettingsNetworkView.axaml b/Ryujinx.Ava/UI/Views/Settings/SettingsNetworkView.axaml
new file mode 100644
index 00000000..8efd367d
--- /dev/null
+++ b/Ryujinx.Ava/UI/Views/Settings/SettingsNetworkView.axaml
@@ -0,0 +1,35 @@
+<UserControl
+ x:Class="Ryujinx.Ava.UI.Views.Settings.SettingsNetworkView"
+ 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"
+ xmlns:locale="clr-namespace:Ryujinx.Ava.Common.Locale"
+ xmlns:viewModels="clr-namespace:Ryujinx.Ava.UI.ViewModels"
+ mc:Ignorable="d"
+ x:CompileBindings="True"
+ x:DataType="viewModels:SettingsViewModel">
+ <Design.DataContext>
+ <viewModels:SettingsViewModel />
+ </Design.DataContext>
+ <ScrollViewer
+ Name="NetworkPage"
+ HorizontalAlignment="Stretch"
+ VerticalAlignment="Stretch"
+ HorizontalScrollBarVisibility="Disabled"
+ VerticalScrollBarVisibility="Auto">
+ <Border Classes="settings">
+ <StackPanel
+ Margin="10"
+ HorizontalAlignment="Stretch"
+ Orientation="Vertical"
+ Spacing="10">
+ <TextBlock Classes="h1" Text="{locale:Locale SettingsTabNetworkConnection}" />
+ <CheckBox Margin="10,0,0,0" IsChecked="{Binding EnableInternetAccess}">
+ <TextBlock Text="{locale:Locale SettingsTabSystemEnableInternetAccess}"
+ ToolTip.Tip="{locale:Locale EnableInternetAccessTooltip}" />
+ </CheckBox>
+ </StackPanel>
+ </Border>
+ </ScrollViewer>
+</UserControl> \ No newline at end of file
diff --git a/Ryujinx.Ava/UI/Views/Settings/SettingsNetworkView.axaml.cs b/Ryujinx.Ava/UI/Views/Settings/SettingsNetworkView.axaml.cs
new file mode 100644
index 00000000..d7407b9d
--- /dev/null
+++ b/Ryujinx.Ava/UI/Views/Settings/SettingsNetworkView.axaml.cs
@@ -0,0 +1,12 @@
+using Avalonia.Controls;
+
+namespace Ryujinx.Ava.UI.Views.Settings
+{
+ public partial class SettingsNetworkView : UserControl
+ {
+ public SettingsNetworkView()
+ {
+ InitializeComponent();
+ }
+ }
+} \ No newline at end of file
diff --git a/Ryujinx.Ava/UI/Views/Settings/SettingsSystemView.axaml b/Ryujinx.Ava/UI/Views/Settings/SettingsSystemView.axaml
new file mode 100644
index 00000000..ddcca39c
--- /dev/null
+++ b/Ryujinx.Ava/UI/Views/Settings/SettingsSystemView.axaml
@@ -0,0 +1,195 @@
+<UserControl
+ x:Class="Ryujinx.Ava.UI.Views.Settings.SettingsSystemView"
+ 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"
+ xmlns:locale="clr-namespace:Ryujinx.Ava.Common.Locale"
+ xmlns:viewModels="clr-namespace:Ryujinx.Ava.UI.ViewModels"
+ mc:Ignorable="d"
+ x:CompileBindings="True"
+ x:DataType="viewModels:SettingsViewModel">
+ <Design.DataContext>
+ <viewModels:SettingsViewModel />
+ </Design.DataContext>
+ <ScrollViewer
+ Name="SystemPage"
+ HorizontalAlignment="Stretch"
+ VerticalAlignment="Stretch"
+ HorizontalScrollBarVisibility="Disabled"
+ VerticalScrollBarVisibility="Auto">
+ <Border Classes="settings">
+ <StackPanel
+ Margin="10"
+ HorizontalAlignment="Stretch"
+ Orientation="Vertical"
+ Spacing="10">
+ <TextBlock Classes="h1" Text="{locale:Locale SettingsTabSystemCore}" />
+ <StackPanel Margin="10,0,0,0" Orientation="Vertical">
+ <StackPanel Margin="0,0,0,10" Orientation="Horizontal">
+ <TextBlock VerticalAlignment="Center"
+ Text="{locale:Locale SettingsTabSystemSystemRegion}"
+ Width="250" />
+ <ComboBox SelectedIndex="{Binding Region}"
+ ToolTip.Tip="{locale:Locale RegionTooltip}"
+ HorizontalContentAlignment="Left"
+ Width="350">
+ <ComboBoxItem>
+ <TextBlock Text="{locale:Locale SettingsTabSystemSystemRegionJapan}" />
+ </ComboBoxItem>
+ <ComboBoxItem>
+ <TextBlock Text="{locale:Locale SettingsTabSystemSystemRegionUSA}" />
+ </ComboBoxItem>
+ <ComboBoxItem>
+ <TextBlock Text="{locale:Locale SettingsTabSystemSystemRegionEurope}" />
+ </ComboBoxItem>
+ <ComboBoxItem>
+ <TextBlock Text="{locale:Locale SettingsTabSystemSystemRegionAustralia}" />
+ </ComboBoxItem>
+ <ComboBoxItem>
+ <TextBlock Text="{locale:Locale SettingsTabSystemSystemRegionChina}" />
+ </ComboBoxItem>
+ <ComboBoxItem>
+ <TextBlock Text="{locale:Locale SettingsTabSystemSystemRegionKorea}" />
+ </ComboBoxItem>
+ <ComboBoxItem>
+ <TextBlock Text="{locale:Locale SettingsTabSystemSystemRegionTaiwan}" />
+ </ComboBoxItem>
+ </ComboBox>
+ </StackPanel>
+ <StackPanel Margin="0,0,0,10" Orientation="Horizontal">
+ <TextBlock VerticalAlignment="Center"
+ Text="{locale:Locale SettingsTabSystemSystemLanguage}"
+ ToolTip.Tip="{locale:Locale LanguageTooltip}"
+ Width="250" />
+ <ComboBox SelectedIndex="{Binding Language}"
+ ToolTip.Tip="{locale:Locale LanguageTooltip}"
+ HorizontalContentAlignment="Left"
+ Width="350">
+ <ComboBoxItem>
+ <TextBlock Text="{locale:Locale SettingsTabSystemSystemLanguageJapanese}" />
+ </ComboBoxItem>
+ <ComboBoxItem>
+ <TextBlock
+ Text="{locale:Locale SettingsTabSystemSystemLanguageAmericanEnglish}" />
+ </ComboBoxItem>
+ <ComboBoxItem>
+ <TextBlock Text="{locale:Locale SettingsTabSystemSystemLanguageFrench}" />
+ </ComboBoxItem>
+ <ComboBoxItem>
+ <TextBlock Text="{locale:Locale SettingsTabSystemSystemLanguageGerman}" />
+ </ComboBoxItem>
+ <ComboBoxItem>
+ <TextBlock Text="{locale:Locale SettingsTabSystemSystemLanguageItalian}" />
+ </ComboBoxItem>
+ <ComboBoxItem>
+ <TextBlock Text="{locale:Locale SettingsTabSystemSystemLanguageSpanish}" />
+ </ComboBoxItem>
+ <ComboBoxItem>
+ <TextBlock Text="{locale:Locale SettingsTabSystemSystemLanguageChinese}" />
+ </ComboBoxItem>
+ <ComboBoxItem>
+ <TextBlock Text="{locale:Locale SettingsTabSystemSystemLanguageKorean}" />
+ </ComboBoxItem>
+ <ComboBoxItem>
+ <TextBlock Text="{locale:Locale SettingsTabSystemSystemLanguageDutch}" />
+ </ComboBoxItem>
+ <ComboBoxItem>
+ <TextBlock Text="{locale:Locale SettingsTabSystemSystemLanguagePortuguese}" />
+ </ComboBoxItem>
+ <ComboBoxItem>
+ <TextBlock Text="{locale:Locale SettingsTabSystemSystemLanguageRussian}" />
+ </ComboBoxItem>
+ <ComboBoxItem>
+ <TextBlock Text="{locale:Locale SettingsTabSystemSystemLanguageTaiwanese}" />
+ </ComboBoxItem>
+ <ComboBoxItem>
+ <TextBlock
+ Text="{locale:Locale SettingsTabSystemSystemLanguageBritishEnglish}" />
+ </ComboBoxItem>
+ <ComboBoxItem>
+ <TextBlock
+ Text="{locale:Locale SettingsTabSystemSystemLanguageCanadianFrench}" />
+ </ComboBoxItem>
+ <ComboBoxItem>
+ <TextBlock
+ Text="{locale:Locale SettingsTabSystemSystemLanguageLatinAmericanSpanish}" />
+ </ComboBoxItem>
+ <ComboBoxItem>
+ <TextBlock
+ Text="{locale:Locale SettingsTabSystemSystemLanguageSimplifiedChinese}" />
+ </ComboBoxItem>
+ <ComboBoxItem>
+ <TextBlock
+ Text="{locale:Locale SettingsTabSystemSystemLanguageTraditionalChinese}" />
+ </ComboBoxItem>
+ <ComboBoxItem>
+ <TextBlock
+ Text="{locale:Locale SettingsTabSystemSystemLanguageBrazilianPortuguese}" />
+ </ComboBoxItem>
+ </ComboBox>
+ </StackPanel>
+ <StackPanel Margin="0,0,0,10" Orientation="Horizontal">
+ <TextBlock VerticalAlignment="Center"
+ Text="{locale:Locale SettingsTabSystemSystemTimeZone}"
+ ToolTip.Tip="{locale:Locale TimezoneTooltip}"
+ Width="250" />
+ <AutoCompleteBox
+ Name="TimeZoneBox"
+ Width="350"
+ MaxDropDownHeight="500"
+ FilterMode="Contains"
+ Items="{Binding TimeZones}"
+ SelectionChanged="TimeZoneBox_OnSelectionChanged"
+ Text="{Binding Path=TimeZone, Mode=OneWay}"
+ TextChanged="TimeZoneBox_OnTextChanged"
+ ToolTip.Tip="{locale:Locale TimezoneTooltip}" />
+ </StackPanel>
+ <StackPanel Margin="0,0,0,10" Orientation="Horizontal">
+ <TextBlock VerticalAlignment="Center"
+ Text="{locale:Locale SettingsTabSystemSystemTime}"
+ ToolTip.Tip="{locale:Locale TimeTooltip}"
+ Width="250"/>
+ <DatePicker VerticalAlignment="Center" SelectedDate="{Binding DateOffset}"
+ ToolTip.Tip="{locale:Locale TimeTooltip}"
+ Width="350" />
+ </StackPanel>
+ <StackPanel Margin="250,0,0,10" Orientation="Horizontal">
+ <TimePicker
+ VerticalAlignment="Center"
+ ClockIdentifier="24HourClock"
+ SelectedTime="{Binding TimeOffset}"
+ Width="350"
+ ToolTip.Tip="{locale:Locale TimeTooltip}" />
+ </StackPanel>
+ <CheckBox IsChecked="{Binding EnableVsync}">
+ <TextBlock Text="{locale:Locale SettingsTabSystemEnableVsync}"
+ ToolTip.Tip="{locale:Locale VSyncToggleTooltip}" />
+ </CheckBox>
+ <CheckBox IsChecked="{Binding EnableFsIntegrityChecks}">
+ <TextBlock Text="{locale:Locale SettingsTabSystemEnableFsIntegrityChecks}"
+ ToolTip.Tip="{locale:Locale FsIntegrityToggleTooltip}" />
+ </CheckBox>
+ </StackPanel>
+ <Separator Height="1" />
+ <StackPanel Orientation="Horizontal">
+ <TextBlock Classes="h1" Text="{locale:Locale SettingsTabSystemHacks}" />
+ <TextBlock Text="{locale:Locale SettingsTabSystemHacksNote}" />
+ </StackPanel>
+ <StackPanel
+ Margin="10,0,0,0"
+ HorizontalAlignment="Stretch"
+ Orientation="Vertical">
+ <CheckBox IsChecked="{Binding ExpandDramSize}"
+ ToolTip.Tip="{locale:Locale DRamTooltip}">
+ <TextBlock Text="{locale:Locale SettingsTabSystemExpandDramSize}" />
+ </CheckBox>
+ <CheckBox IsChecked="{Binding IgnoreMissingServices}"
+ ToolTip.Tip="{locale:Locale IgnoreMissingServicesTooltip}">
+ <TextBlock Text="{locale:Locale SettingsTabSystemIgnoreMissingServices}" />
+ </CheckBox>
+ </StackPanel>
+ </StackPanel>
+ </Border>
+ </ScrollViewer>
+</UserControl> \ No newline at end of file
diff --git a/Ryujinx.Ava/UI/Views/Settings/SettingsSystemView.axaml.cs b/Ryujinx.Ava/UI/Views/Settings/SettingsSystemView.axaml.cs
new file mode 100644
index 00000000..d2ea59de
--- /dev/null
+++ b/Ryujinx.Ava/UI/Views/Settings/SettingsSystemView.axaml.cs
@@ -0,0 +1,52 @@
+using Avalonia.Controls;
+using Avalonia.Data;
+using Avalonia.Data.Converters;
+using Ryujinx.Ava.UI.ViewModels;
+using System;
+using System.Linq;
+using TimeZone = Ryujinx.Ava.UI.Models.TimeZone;
+
+namespace Ryujinx.Ava.UI.Views.Settings
+{
+ public partial class SettingsSystemView : UserControl
+ {
+ public SettingsViewModel ViewModel;
+
+ public SettingsSystemView()
+ {
+ InitializeComponent();
+
+ FuncMultiValueConverter<string, string> converter = new(parts => string.Format("{0} {1} {2}", parts.ToArray()).Trim());
+ MultiBinding tzMultiBinding = new() { Converter = converter };
+
+ tzMultiBinding.Bindings.Add(new Binding("UtcDifference"));
+ tzMultiBinding.Bindings.Add(new Binding("Location"));
+ tzMultiBinding.Bindings.Add(new Binding("Abbreviation"));
+
+ TimeZoneBox.ValueMemberBinding = tzMultiBinding;
+ }
+
+ private void TimeZoneBox_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
+ {
+ if (e.AddedItems != null && e.AddedItems.Count > 0)
+ {
+ if (e.AddedItems[0] is TimeZone timeZone)
+ {
+ e.Handled = true;
+
+ ViewModel.ValidateAndSetTimeZone(timeZone.Location);
+ }
+ }
+ }
+
+ private void TimeZoneBox_OnTextChanged(object sender, EventArgs e)
+ {
+ if (sender is AutoCompleteBox box && box.SelectedItem is TimeZone timeZone)
+ {
+ {
+ ViewModel.ValidateAndSetTimeZone(timeZone.Location);
+ }
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/Ryujinx.Ava/UI/Views/Settings/SettingsUIView.axaml b/Ryujinx.Ava/UI/Views/Settings/SettingsUIView.axaml
new file mode 100644
index 00000000..61b6c433
--- /dev/null
+++ b/Ryujinx.Ava/UI/Views/Settings/SettingsUIView.axaml
@@ -0,0 +1,156 @@
+<UserControl
+ x:Class="Ryujinx.Ava.UI.Views.Settings.SettingsUIView"
+ 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"
+ xmlns:locale="clr-namespace:Ryujinx.Ava.Common.Locale"
+ xmlns:viewModels="clr-namespace:Ryujinx.Ava.UI.ViewModels"
+ mc:Ignorable="d"
+ x:CompileBindings="True"
+ x:DataType="viewModels:SettingsViewModel">
+ <Design.DataContext>
+ <viewModels:SettingsViewModel />
+ </Design.DataContext>
+ <ScrollViewer
+ Name="UiPage"
+ HorizontalAlignment="Stretch"
+ VerticalAlignment="Stretch"
+ HorizontalScrollBarVisibility="Disabled"
+ VerticalScrollBarVisibility="Auto">
+ <Border Classes="settings">
+ <StackPanel
+ Margin="10"
+ HorizontalAlignment="Stretch"
+ Orientation="Vertical"
+ Spacing="10">
+ <TextBlock Classes="h1" Text="{locale:Locale SettingsTabGeneralGeneral}" />
+ <StackPanel Margin="10,0,0,0" Orientation="Vertical">
+ <CheckBox IsChecked="{Binding EnableDiscordIntegration}">
+ <TextBlock VerticalAlignment="Center"
+ ToolTip.Tip="{locale:Locale ToggleDiscordTooltip}"
+ Text="{locale:Locale SettingsTabGeneralEnableDiscordRichPresence}" />
+ </CheckBox>
+ <CheckBox IsChecked="{Binding CheckUpdatesOnStart}">
+ <TextBlock Text="{locale:Locale SettingsTabGeneralCheckUpdatesOnLaunch}" />
+ </CheckBox>
+ <CheckBox IsChecked="{Binding ShowConfirmExit}">
+ <TextBlock Text="{locale:Locale SettingsTabGeneralShowConfirmExitDialog}" />
+ </CheckBox>
+ <CheckBox IsChecked="{Binding HideCursorOnIdle}">
+ <TextBlock Text="{locale:Locale SettingsTabGeneralHideCursorOnIdle}" />
+ </CheckBox>
+ </StackPanel>
+ <Separator Height="1" />
+ <TextBlock Classes="h1" Text="{locale:Locale SettingsTabGeneralGameDirectories}" />
+ <StackPanel
+ Margin="10,0,0,0"
+ HorizontalAlignment="Stretch"
+ Orientation="Vertical"
+ Spacing="10">
+ <ListBox
+ Name="GameList"
+ MinHeight="230"
+ Items="{Binding GameDirectories}">
+ <ListBox.Styles>
+ <Style Selector="ListBoxItem">
+ <Setter Property="Padding" Value="10" />
+ <Setter Property="Background" Value="{DynamicResource ListBoxBackground}" />
+ </Style>
+ </ListBox.Styles>
+ </ListBox>
+ <Grid HorizontalAlignment="Stretch">
+ <Grid.ColumnDefinitions>
+ <ColumnDefinition Width="*" />
+ <ColumnDefinition Width="Auto" />
+ <ColumnDefinition Width="Auto" />
+ </Grid.ColumnDefinitions>
+ <TextBox
+ Name="PathBox"
+ Margin="0"
+ ToolTip.Tip="{locale:Locale AddGameDirBoxTooltip}"
+ VerticalAlignment="Stretch" />
+ <Button
+ Name="AddButton"
+ Grid.Column="1"
+ MinWidth="90"
+ Margin="10,0,0,0"
+ ToolTip.Tip="{locale:Locale AddGameDirTooltip}"
+ Click="AddButton_OnClick">
+ <TextBlock HorizontalAlignment="Center"
+ Text="{locale:Locale SettingsTabGeneralAdd}" />
+ </Button>
+ <Button
+ Name="RemoveButton"
+ Grid.Column="2"
+ MinWidth="90"
+ Margin="10,0,0,0"
+ ToolTip.Tip="{locale:Locale RemoveGameDirTooltip}"
+ Click="RemoveButton_OnClick">
+ <TextBlock HorizontalAlignment="Center"
+ Text="{locale:Locale SettingsTabGeneralRemove}" />
+ </Button>
+ </Grid>
+ </StackPanel>
+ <Separator Height="1" />
+ <TextBlock Classes="h1" Text="{locale:Locale SettingsTabGeneralTheme}" />
+ <Grid Margin="10,0,0,0">
+ <Grid.ColumnDefinitions>
+ <ColumnDefinition Width="Auto" />
+ <ColumnDefinition />
+ <ColumnDefinition Width="Auto" />
+ </Grid.ColumnDefinitions>
+ <Grid.RowDefinitions>
+ <RowDefinition />
+ <RowDefinition />
+ <RowDefinition />
+ </Grid.RowDefinitions>
+ <CheckBox
+ IsChecked="{Binding EnableCustomTheme}"
+ ToolTip.Tip="{locale:Locale CustomThemeCheckTooltip}">
+ <TextBlock Text="{locale:Locale SettingsTabGeneralThemeEnableCustomTheme}" />
+ </CheckBox>
+ <TextBlock
+ Grid.Column="0"
+ Grid.Row="1"
+ VerticalAlignment="Center"
+ Margin="0,10,0,0"
+ Text="{locale:Locale SettingsTabGeneralThemeCustomTheme}"
+ ToolTip.Tip="{locale:Locale CustomThemePathTooltip}" />
+ <TextBox
+ Grid.Row="1"
+ Grid.Column="1"
+ Margin="0,10,0,0"
+ Text="{Binding CustomThemePath}" />
+ <Button
+ Grid.Row="1"
+ Grid.Column="2"
+ Margin="10,10,0,0"
+ Click="BrowseTheme"
+ ToolTip.Tip="{locale:Locale CustomThemeBrowseTooltip}"
+ Content="{locale:Locale ButtonBrowse}" />
+ <TextBlock
+ Grid.Column="0"
+ Grid.Row="2"
+ VerticalAlignment="Center"
+ Margin="0,10,0,0"
+ Text="{locale:Locale SettingsTabGeneralThemeBaseStyle}" />
+ <ComboBox
+ Grid.Column="1"
+ Grid.Row="2"
+ VerticalAlignment="Center"
+ Margin="0,10,0,0"
+ MinWidth="100"
+ SelectedIndex="{Binding BaseStyleIndex}">
+ <ComboBoxItem>
+ <TextBlock Text="{locale:Locale SettingsTabGeneralThemeBaseStyleLight}" />
+ </ComboBoxItem>
+ <ComboBoxItem>
+ <TextBlock Text="{locale:Locale SettingsTabGeneralThemeBaseStyleDark}" />
+ </ComboBoxItem>
+ </ComboBox>
+ </Grid>
+ </StackPanel>
+ </Border>
+ </ScrollViewer>
+</UserControl> \ No newline at end of file
diff --git a/Ryujinx.Ava/UI/Views/Settings/SettingsUIView.axaml.cs b/Ryujinx.Ava/UI/Views/Settings/SettingsUIView.axaml.cs
new file mode 100644
index 00000000..8e6da7c5
--- /dev/null
+++ b/Ryujinx.Ava/UI/Views/Settings/SettingsUIView.axaml.cs
@@ -0,0 +1,82 @@
+using Avalonia.Controls;
+using Avalonia.Controls.ApplicationLifetimes;
+using Avalonia.Interactivity;
+using Ryujinx.Ava.Common.Locale;
+using Ryujinx.Ava.UI.ViewModels;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+
+namespace Ryujinx.Ava.UI.Views.Settings
+{
+ public partial class SettingsUIView : UserControl
+ {
+ public SettingsViewModel ViewModel;
+
+ public SettingsUIView()
+ {
+ InitializeComponent();
+ }
+
+ private async void AddButton_OnClick(object sender, RoutedEventArgs e)
+ {
+ string path = PathBox.Text;
+
+ if (!string.IsNullOrWhiteSpace(path) && Directory.Exists(path) && !ViewModel.GameDirectories.Contains(path))
+ {
+ ViewModel.GameDirectories.Add(path);
+ ViewModel.DirectoryChanged = true;
+ }
+ else
+ {
+ if (Avalonia.Application.Current.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
+ {
+ path = await new OpenFolderDialog().ShowAsync(desktop.MainWindow);
+
+ if (!string.IsNullOrWhiteSpace(path))
+ {
+ ViewModel.GameDirectories.Add(path);
+ ViewModel.DirectoryChanged = true;
+ }
+ }
+ }
+ }
+
+ private void RemoveButton_OnClick(object sender, RoutedEventArgs e)
+ {
+ int oldIndex = GameList.SelectedIndex;
+
+ foreach (string path in new List<string>(GameList.SelectedItems.Cast<string>()))
+ {
+ ViewModel.GameDirectories.Remove(path);
+ ViewModel.DirectoryChanged = true;
+ }
+
+ if (GameList.ItemCount > 0)
+ {
+ GameList.SelectedIndex = oldIndex < GameList.ItemCount ? oldIndex : 0;
+ }
+ }
+
+ public async void BrowseTheme(object sender, RoutedEventArgs e)
+ {
+ var dialog = new OpenFileDialog()
+ {
+ Title = LocaleManager.Instance[LocaleKeys.SettingsSelectThemeFileDialogTitle],
+ AllowMultiple = false
+ };
+
+ dialog.Filters.Add(new FileDialogFilter() { Extensions = { "xaml" }, Name = LocaleManager.Instance[LocaleKeys.SettingsXamlThemeFile] });
+
+ if (Avalonia.Application.Current.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
+ {
+ var file = await dialog.ShowAsync(desktop.MainWindow);
+
+ if (file != null && file.Length > 0)
+ {
+ ViewModel.CustomThemePath = file[0];
+ }
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/Ryujinx.Ava/UI/Windows/SettingsWindow.axaml b/Ryujinx.Ava/UI/Windows/SettingsWindow.axaml
index e2550082..851e9b5b 100644
--- a/Ryujinx.Ava/UI/Windows/SettingsWindow.axaml
+++ b/Ryujinx.Ava/UI/Windows/SettingsWindow.axaml
@@ -6,13 +6,12 @@
xmlns:locale="clr-namespace:Ryujinx.Ava.Common.Locale"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
- xmlns:viewModels="clr-namespace:Ryujinx.Ava.UI.ViewModels"
xmlns:window="clr-namespace:Ryujinx.Ava.UI.Windows"
+ xmlns:viewModels="clr-namespace:Ryujinx.Ava.UI.ViewModels"
+ xmlns:settings="clr-namespace:Ryujinx.Ava.UI.Views.Settings"
xmlns:helpers="clr-namespace:Ryujinx.Ava.UI.Helpers"
Width="1100"
Height="768"
- d:DesignWidth="800"
- d:DesignHeight="950"
MinWidth="800"
MinHeight="480"
WindowStartupLocation="CenterOwner"
@@ -23,9 +22,6 @@
<Design.DataContext>
<viewModels:SettingsViewModel />
</Design.DataContext>
- <Window.Resources>
- <helpers:KeyValueConverter x:Key="Key" />
- </Window.Resources>
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" MinWidth="600">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
@@ -38,871 +34,15 @@
IsVisible="False"
KeyboardNavigation.IsTabStop="False"/>
<Grid Name="Pages" IsVisible="False" Grid.Row="2">
- <ScrollViewer Name="UiPage"
- Margin="0,0,2,0"
- HorizontalAlignment="Stretch"
- VerticalAlignment="Stretch"
- HorizontalScrollBarVisibility="Disabled"
- VerticalScrollBarVisibility="Auto">
- <Border Classes="settings">
- <StackPanel
- Margin="10,5"
- HorizontalAlignment="Stretch"
- Orientation="Vertical"
- Spacing="10">
- <TextBlock Classes="h1" Text="{locale:Locale SettingsTabGeneralGeneral}" />
- <StackPanel Margin="10,0,0,0" Orientation="Vertical">
- <CheckBox IsChecked="{Binding EnableDiscordIntegration}">
- <TextBlock VerticalAlignment="Center"
- ToolTip.Tip="{locale:Locale ToggleDiscordTooltip}"
- Text="{locale:Locale SettingsTabGeneralEnableDiscordRichPresence}" />
- </CheckBox>
- <CheckBox IsChecked="{Binding CheckUpdatesOnStart}">
- <TextBlock Text="{locale:Locale SettingsTabGeneralCheckUpdatesOnLaunch}" />
- </CheckBox>
- <CheckBox IsChecked="{Binding ShowConfirmExit}">
- <TextBlock Text="{locale:Locale SettingsTabGeneralShowConfirmExitDialog}" />
- </CheckBox>
- <CheckBox IsChecked="{Binding HideCursorOnIdle}">
- <TextBlock Text="{locale:Locale SettingsTabGeneralHideCursorOnIdle}" />
- </CheckBox>
- </StackPanel>
- <Separator Height="1" />
- <TextBlock Classes="h1" Text="{locale:Locale SettingsTabGeneralGameDirectories}" />
- <StackPanel
- Margin="10,0,0,0"
- HorizontalAlignment="Stretch"
- Orientation="Vertical"
- Spacing="10">
- <ListBox
- Name="GameList"
- MinHeight="250"
- Items="{Binding GameDirectories}" />
- <Grid HorizontalAlignment="Stretch">
- <Grid.ColumnDefinitions>
- <ColumnDefinition Width="*" />
- <ColumnDefinition Width="Auto" />
- <ColumnDefinition Width="Auto" />
- </Grid.ColumnDefinitions>
- <TextBox
- Name="PathBox"
- Margin="0"
- ToolTip.Tip="{locale:Locale AddGameDirBoxTooltip}"
- VerticalAlignment="Stretch" />
- <Button
- Name="AddButton"
- Grid.Column="1"
- MinWidth="90"
- Margin="10,0,0,0"
- ToolTip.Tip="{locale:Locale AddGameDirTooltip}"
- Click="AddButton_OnClick">
- <TextBlock HorizontalAlignment="Center"
- Text="{locale:Locale SettingsTabGeneralAdd}" />
- </Button>
- <Button
- Name="RemoveButton"
- Grid.Column="2"
- MinWidth="90"
- Margin="10,0,0,0"
- ToolTip.Tip="{locale:Locale RemoveGameDirTooltip}"
- Click="RemoveButton_OnClick">
- <TextBlock HorizontalAlignment="Center"
- Text="{locale:Locale SettingsTabGeneralRemove}" />
- </Button>
- </Grid>
- </StackPanel>
- <Separator Height="1" />
- <TextBlock Classes="h1" Text="{locale:Locale SettingsTabGeneralTheme}" />
- <Grid Margin="10,0,0,0">
- <Grid.ColumnDefinitions>
- <ColumnDefinition Width="Auto" />
- <ColumnDefinition />
- <ColumnDefinition Width="Auto" />
- </Grid.ColumnDefinitions>
- <Grid.RowDefinitions>
- <RowDefinition />
- <RowDefinition />
- <RowDefinition />
- </Grid.RowDefinitions>
- <CheckBox IsChecked="{Binding EnableCustomTheme}"
- ToolTip.Tip="{locale:Locale CustomThemeCheckTooltip}">
- <TextBlock Text="{locale:Locale SettingsTabGeneralThemeEnableCustomTheme}" />
- </CheckBox>
- <TextBlock VerticalAlignment="Center"
- Margin="0,10,0,0"
- Grid.Row="1"
- Text="{locale:Locale SettingsTabGeneralThemeCustomTheme}"
- ToolTip.Tip="{locale:Locale CustomThemePathTooltip}" />
- <TextBox Margin="0,10,0,0"
- Grid.Row="1"
- Grid.Column="1"
- Text="{Binding CustomThemePath}" />
- <Button Grid.Row="1"
- Grid.Column="2"
- Margin="10,10,0,0"
- Command="{ReflectionBinding BrowseTheme}"
- ToolTip.Tip="{locale:Locale CustomThemeBrowseTooltip}"
- Content="{locale:Locale ButtonBrowse}" />
- <TextBlock VerticalAlignment="Center"
- Margin="0,10,0,0"
- Grid.Row="2"
- Text="{locale:Locale SettingsTabGeneralThemeBaseStyle}" />
- <ComboBox VerticalAlignment="Center"
- Margin="0,10,0,0"
- Grid.Column="1"
- Grid.Row="2"
- MinWidth="100"
- SelectedIndex="{Binding BaseStyleIndex}">
- <ComboBoxItem>
- <TextBlock Text="{locale:Locale SettingsTabGeneralThemeBaseStyleLight}" />
- </ComboBoxItem>
- <ComboBoxItem>
- <TextBlock Text="{locale:Locale SettingsTabGeneralThemeBaseStyleDark}" />
- </ComboBoxItem>
- </ComboBox>
- </Grid>
- </StackPanel>
- </Border>
- </ScrollViewer>
- <ScrollViewer Name="InputPage"
- HorizontalAlignment="Stretch"
- VerticalAlignment="Stretch"
- Padding="0,0,2,0"
- HorizontalScrollBarVisibility="Disabled"
- VerticalScrollBarVisibility="Auto">
- <Border Classes="settings">
- <StackPanel Margin="4" Orientation="Vertical">
- <StackPanel Orientation="Horizontal">
- <CheckBox Margin="5,0"
- ToolTip.Tip="{locale:Locale DockModeToggleTooltip}"
- IsChecked="{Binding EnableDockedMode}">
- <TextBlock VerticalAlignment="Center"
- Text="{locale:Locale SettingsTabInputEnableDockedMode}" />
- </CheckBox>
- <CheckBox Margin="5,0"
- ToolTip.Tip="{locale:Locale DirectKeyboardTooltip}"
- IsChecked="{Binding EnableKeyboard}">
- <TextBlock Text="{locale:Locale SettingsTabInputDirectKeyboardAccess}" />
- </CheckBox>
- <CheckBox Margin="5,0"
- ToolTip.Tip="{locale:Locale DirectMouseTooltip}"
- IsChecked="{Binding EnableMouse}">
- <TextBlock Text="{locale:Locale SettingsTabInputDirectMouseAccess}" />
- </CheckBox>
- </StackPanel>
- <window:ControllerSettingsWindow Name="ControllerSettings" Margin="0,0,0,0" MinHeight="600" />
- </StackPanel>
- </Border>
- </ScrollViewer>
- <ScrollViewer Name="HotkeysPage"
- HorizontalAlignment="Stretch"
- VerticalAlignment="Stretch"
- HorizontalScrollBarVisibility="Disabled"
- VerticalScrollBarVisibility="Auto">
- <Border Classes="settings">
- <StackPanel Margin="10,5" Orientation="Vertical" Spacing="10">
- <TextBlock Classes="h1" Text="{locale:Locale SettingsTabHotkeysHotkeys}" />
- <StackPanel Margin="10,0,0,0" Orientation="Horizontal">
- <TextBlock VerticalAlignment="Center" Text="{locale:Locale SettingsTabHotkeysToggleVsyncHotkey}" Width="230" />
- <ToggleButton Width="90" Height="27" Checked="Button_Checked" Unchecked="Button_Unchecked">
- <TextBlock
- Text="{Binding KeyboardHotkeys.ToggleVsync, Mode=TwoWay, Converter={StaticResource Key}}"
- TextAlignment="Center" />
- </ToggleButton>
- </StackPanel>
- <StackPanel Margin="10,0,0,0" Orientation="Horizontal">
- <TextBlock VerticalAlignment="Center" Text="{locale:Locale SettingsTabHotkeysScreenshotHotkey}" Width="230" />
- <ToggleButton Width="90" Height="27" Checked="Button_Checked" Unchecked="Button_Unchecked">
- <TextBlock
- Text="{Binding KeyboardHotkeys.Screenshot, Mode=TwoWay, Converter={StaticResource Key}}"
- TextAlignment="Center" />
- </ToggleButton>
- </StackPanel>
- <StackPanel Margin="10,0,0,0" Orientation="Horizontal">
- <TextBlock VerticalAlignment="Center" Text="{locale:Locale SettingsTabHotkeysShowUiHotkey}" Width="230" />
- <ToggleButton Width="90" Height="27" Checked="Button_Checked" Unchecked="Button_Unchecked">
- <TextBlock
- Text="{Binding KeyboardHotkeys.ShowUi, Mode=TwoWay, Converter={StaticResource Key}}"
- TextAlignment="Center" />
- </ToggleButton>
- </StackPanel>
- <StackPanel Margin="10,0,0,0" Orientation="Horizontal">
- <TextBlock VerticalAlignment="Center" Text="{locale:Locale SettingsTabHotkeysPauseHotkey}" Width="230" />
- <ToggleButton Width="90" Height="27" Checked="Button_Checked" Unchecked="Button_Unchecked">
- <TextBlock
- Text="{Binding KeyboardHotkeys.Pause, Mode=TwoWay, Converter={StaticResource Key}}"
- TextAlignment="Center" />
- </ToggleButton>
- </StackPanel>
- <StackPanel Margin="10,0,0,0" Orientation="Horizontal">
- <TextBlock VerticalAlignment="Center" Text="{locale:Locale SettingsTabHotkeysToggleMuteHotkey}" Width="230" />
- <ToggleButton Width="90" Height="27" Checked="Button_Checked" Unchecked="Button_Unchecked">
- <TextBlock
- Text="{Binding KeyboardHotkeys.ToggleMute, Mode=TwoWay, Converter={StaticResource Key}}"
- TextAlignment="Center" />
- </ToggleButton>
- </StackPanel>
- <StackPanel Margin="10,0,0,0" Orientation="Horizontal">
- <TextBlock VerticalAlignment="Center" Text="{locale:Locale SettingsTabHotkeysResScaleUpHotkey}" Width="230" />
- <ToggleButton Width="90" Height="27" Checked="Button_Checked" Unchecked="Button_Unchecked">
- <TextBlock
- Text="{Binding KeyboardHotkeys.ResScaleUp, Mode=TwoWay, Converter={StaticResource Key}}"
- TextAlignment="Center" />
- </ToggleButton>
- </StackPanel>
- <StackPanel Margin="10,0,0,0" Orientation="Horizontal">
- <TextBlock VerticalAlignment="Center" Text="{locale:Locale SettingsTabHotkeysResScaleDownHotkey}" Width="230" />
- <ToggleButton Width="90" Height="27" Checked="Button_Checked" Unchecked="Button_Unchecked">
- <TextBlock
- Text="{Binding KeyboardHotkeys.ResScaleDown, Mode=TwoWay, Converter={StaticResource Key}}"
- TextAlignment="Center" />
- </ToggleButton>
- </StackPanel>
- <StackPanel Margin="10,0,0,0" Orientation="Horizontal">
- <TextBlock VerticalAlignment="Center" Text="{locale:Locale SettingsTabHotkeysVolumeUpHotkey}" Width="230" />
- <ToggleButton Width="90" Height="27" Checked="Button_Checked" Unchecked="Button_Unchecked">
- <TextBlock
- Text="{Binding KeyboardHotkeys.VolumeUp, Mode=TwoWay, Converter={StaticResource Key}}"
- TextAlignment="Center" />
- </ToggleButton>
- </StackPanel>
- <StackPanel Margin="10,0,0,0" Orientation="Horizontal">
- <TextBlock VerticalAlignment="Center" Text="{locale:Locale SettingsTabHotkeysVolumeDownHotkey}" Width="230" />
- <ToggleButton Width="90" Height="27" Checked="Button_Checked" Unchecked="Button_Unchecked">
- <TextBlock
- Text="{Binding KeyboardHotkeys.VolumeDown, Mode=TwoWay, Converter={StaticResource Key}}"
- TextAlignment="Center" />
- </ToggleButton>
- </StackPanel>
- </StackPanel>
- </Border>
- </ScrollViewer>
- <ScrollViewer Name="SystemPage"
- HorizontalAlignment="Stretch"
- VerticalAlignment="Stretch"
- HorizontalScrollBarVisibility="Disabled"
- VerticalScrollBarVisibility="Auto">
- <Border Classes="settings">
- <StackPanel
- Margin="10,5"
- HorizontalAlignment="Stretch"
- Orientation="Vertical"
- Spacing="10">
- <TextBlock Classes="h1" Text="{locale:Locale SettingsTabSystemCore}" />
- <StackPanel Margin="10,0,0,0" Orientation="Vertical">
- <StackPanel Margin="0,0,0,10" Orientation="Horizontal">
- <TextBlock VerticalAlignment="Center"
- Text="{locale:Locale SettingsTabSystemSystemRegion}"
- Width="250" />
- <ComboBox SelectedIndex="{Binding Region}"
- ToolTip.Tip="{locale:Locale RegionTooltip}"
- HorizontalContentAlignment="Left"
- Width="350">
- <ComboBoxItem>
- <TextBlock Text="{locale:Locale SettingsTabSystemSystemRegionJapan}" />
- </ComboBoxItem>
- <ComboBoxItem>
- <TextBlock Text="{locale:Locale SettingsTabSystemSystemRegionUSA}" />
- </ComboBoxItem>
- <ComboBoxItem>
- <TextBlock Text="{locale:Locale SettingsTabSystemSystemRegionEurope}" />
- </ComboBoxItem>
- <ComboBoxItem>
- <TextBlock Text="{locale:Locale SettingsTabSystemSystemRegionAustralia}" />
- </ComboBoxItem>
- <ComboBoxItem>
- <TextBlock Text="{locale:Locale SettingsTabSystemSystemRegionChina}" />
- </ComboBoxItem>
- <ComboBoxItem>
- <TextBlock Text="{locale:Locale SettingsTabSystemSystemRegionKorea}" />
- </ComboBoxItem>
- <ComboBoxItem>
- <TextBlock Text="{locale:Locale SettingsTabSystemSystemRegionTaiwan}" />
- </ComboBoxItem>
- </ComboBox>
- </StackPanel>
- <StackPanel Margin="0,0,0,10" Orientation="Horizontal">
- <TextBlock VerticalAlignment="Center"
- Text="{locale:Locale SettingsTabSystemSystemLanguage}"
- ToolTip.Tip="{locale:Locale LanguageTooltip}"
- Width="250" />
- <ComboBox SelectedIndex="{Binding Language}"
- ToolTip.Tip="{locale:Locale LanguageTooltip}"
- HorizontalContentAlignment="Left"
- Width="350">
- <ComboBoxItem>
- <TextBlock Text="{locale:Locale SettingsTabSystemSystemLanguageJapanese}" />
- </ComboBoxItem>
- <ComboBoxItem>
- <TextBlock
- Text="{locale:Locale SettingsTabSystemSystemLanguageAmericanEnglish}" />
- </ComboBoxItem>
- <ComboBoxItem>
- <TextBlock Text="{locale:Locale SettingsTabSystemSystemLanguageFrench}" />
- </ComboBoxItem>
- <ComboBoxItem>
- <TextBlock Text="{locale:Locale SettingsTabSystemSystemLanguageGerman}" />
- </ComboBoxItem>
- <ComboBoxItem>
- <TextBlock Text="{locale:Locale SettingsTabSystemSystemLanguageItalian}" />
- </ComboBoxItem>
- <ComboBoxItem>
- <TextBlock Text="{locale:Locale SettingsTabSystemSystemLanguageSpanish}" />
- </ComboBoxItem>
- <ComboBoxItem>
- <TextBlock Text="{locale:Locale SettingsTabSystemSystemLanguageChinese}" />
- </ComboBoxItem>
- <ComboBoxItem>
- <TextBlock Text="{locale:Locale SettingsTabSystemSystemLanguageKorean}" />
- </ComboBoxItem>
- <ComboBoxItem>
- <TextBlock Text="{locale:Locale SettingsTabSystemSystemLanguageDutch}" />
- </ComboBoxItem>
- <ComboBoxItem>
- <TextBlock Text="{locale:Locale SettingsTabSystemSystemLanguagePortuguese}" />
- </ComboBoxItem>
- <ComboBoxItem>
- <TextBlock Text="{locale:Locale SettingsTabSystemSystemLanguageRussian}" />
- </ComboBoxItem>
- <ComboBoxItem>
- <TextBlock Text="{locale:Locale SettingsTabSystemSystemLanguageTaiwanese}" />
- </ComboBoxItem>
- <ComboBoxItem>
- <TextBlock
- Text="{locale:Locale SettingsTabSystemSystemLanguageBritishEnglish}" />
- </ComboBoxItem>
- <ComboBoxItem>
- <TextBlock
- Text="{locale:Locale SettingsTabSystemSystemLanguageCanadianFrench}" />
- </ComboBoxItem>
- <ComboBoxItem>
- <TextBlock
- Text="{locale:Locale SettingsTabSystemSystemLanguageLatinAmericanSpanish}" />
- </ComboBoxItem>
- <ComboBoxItem>
- <TextBlock
- Text="{locale:Locale SettingsTabSystemSystemLanguageSimplifiedChinese}" />
- </ComboBoxItem>
- <ComboBoxItem>
- <TextBlock
- Text="{locale:Locale SettingsTabSystemSystemLanguageTraditionalChinese}" />
- </ComboBoxItem>
- <ComboBoxItem>
- <TextBlock
- Text="{locale:Locale SettingsTabSystemSystemLanguageBrazilianPortuguese}" />
- </ComboBoxItem>
- </ComboBox>
- </StackPanel>
- <StackPanel Margin="0,0,0,10" Orientation="Horizontal">
- <TextBlock VerticalAlignment="Center"
- Text="{locale:Locale SettingsTabSystemSystemTimeZone}"
- ToolTip.Tip="{locale:Locale TimezoneTooltip}"
- Width="250" />
- <AutoCompleteBox
- Name="TimeZoneBox"
- Width="350"
- MaxDropDownHeight="500"
- FilterMode="Contains"
- Items="{Binding TimeZones}"
- SelectionChanged="TimeZoneBox_OnSelectionChanged"
- Text="{Binding Path=TimeZone, Mode=OneWay}"
- TextChanged="TimeZoneBox_OnTextChanged"
- ValueMemberBinding="{ReflectionBinding TzMultiBinding}"
- ToolTip.Tip="{locale:Locale TimezoneTooltip}" />
- </StackPanel>
- <StackPanel Margin="0,0,0,10" Orientation="Horizontal">
- <TextBlock VerticalAlignment="Center"
- Text="{locale:Locale SettingsTabSystemSystemTime}"
- ToolTip.Tip="{locale:Locale TimeTooltip}"
- Width="250"/>
- <DatePicker VerticalAlignment="Center" SelectedDate="{Binding DateOffset}"
- ToolTip.Tip="{locale:Locale TimeTooltip}"
- Width="350" />
- </StackPanel>
- <StackPanel Margin="250,0,0,10" Orientation="Horizontal">
- <TimePicker
- VerticalAlignment="Center"
- ClockIdentifier="24HourClock"
- SelectedTime="{Binding TimeOffset}"
- Width="350"
- ToolTip.Tip="{locale:Locale TimeTooltip}" />
- </StackPanel>
- <CheckBox IsChecked="{Binding EnableVsync}">
- <TextBlock Text="{locale:Locale SettingsTabSystemEnableVsync}"
- ToolTip.Tip="{locale:Locale VSyncToggleTooltip}" />
- </CheckBox>
- <CheckBox IsChecked="{Binding EnableFsIntegrityChecks}">
- <TextBlock Text="{locale:Locale SettingsTabSystemEnableFsIntegrityChecks}"
- ToolTip.Tip="{locale:Locale FsIntegrityToggleTooltip}" />
- </CheckBox>
- </StackPanel>
- <Separator Height="1" />
- <StackPanel Orientation="Horizontal">
- <TextBlock Classes="h1" Text="{locale:Locale SettingsTabSystemHacks}" />
- <TextBlock Text="{locale:Locale SettingsTabSystemHacksNote}" />
- </StackPanel>
- <StackPanel
- Margin="10,0,0,0"
- HorizontalAlignment="Stretch"
- Orientation="Vertical">
- <CheckBox IsChecked="{Binding ExpandDramSize}"
- ToolTip.Tip="{locale:Locale DRamTooltip}">
- <TextBlock Text="{locale:Locale SettingsTabSystemExpandDramSize}" />
- </CheckBox>
- <CheckBox IsChecked="{Binding IgnoreMissingServices}"
- ToolTip.Tip="{locale:Locale IgnoreMissingServicesTooltip}">
- <TextBlock Text="{locale:Locale SettingsTabSystemIgnoreMissingServices}" />
- </CheckBox>
- </StackPanel>
- </StackPanel>
- </Border>
- </ScrollViewer>
- <ScrollViewer
- Name="CpuPage"
- HorizontalAlignment="Stretch"
- VerticalAlignment="Stretch"
- HorizontalScrollBarVisibility="Disabled"
- VerticalScrollBarVisibility="Auto">
- <Border Classes="settings">
- <StackPanel
- Margin="10,5"
- HorizontalAlignment="Stretch"
- Orientation="Vertical"
- Spacing="10">
- <TextBlock Classes="h1" Text="{locale:Locale SettingsTabCpuCache}" />
- <StackPanel
- Margin="10,0,0,0"
- HorizontalAlignment="Stretch"
- Orientation="Vertical">
- <CheckBox IsChecked="{Binding EnablePptc}">
- <TextBlock Text="{locale:Locale SettingsTabSystemEnablePptc}"
- ToolTip.Tip="{locale:Locale PptcToggleTooltip}" />
- </CheckBox>
- </StackPanel>
- <Separator Height="1" />
- <TextBlock Classes="h1" Text="{locale:Locale SettingsTabCpuMemory}" />
- <StackPanel
- Margin="10,0,0,0"
- HorizontalAlignment="Stretch"
- Orientation="Vertical">
- <StackPanel Orientation="Horizontal">
- <TextBlock VerticalAlignment="Center"
- Text="{locale:Locale SettingsTabSystemMemoryManagerMode}"
- ToolTip.Tip="{locale:Locale MemoryManagerTooltip}"
- Width="250" />
- <ComboBox SelectedIndex="{Binding MemoryMode}"
- ToolTip.Tip="{locale:Locale MemoryManagerTooltip}"
- HorizontalContentAlignment="Left"
- Width="350">
- <ComboBoxItem
- ToolTip.Tip="{locale:Locale MemoryManagerSoftwareTooltip}">
- <TextBlock
- Text="{locale:Locale SettingsTabSystemMemoryManagerModeSoftware}" />
- </ComboBoxItem>
- <ComboBoxItem
- ToolTip.Tip="{locale:Locale MemoryManagerHostTooltip}">
- <TextBlock Text="{locale:Locale SettingsTabSystemMemoryManagerModeHost}" />
- </ComboBoxItem>
- <ComboBoxItem
- ToolTip.Tip="{locale:Locale MemoryManagerUnsafeTooltip}">
- <TextBlock
- Text="{locale:Locale SettingsTabSystemMemoryManagerModeHostUnchecked}" />
- </ComboBoxItem>
- </ComboBox>
- </StackPanel>
- </StackPanel>
- </StackPanel>
- </Border>
- </ScrollViewer>
- <ScrollViewer
- Name="GraphicsPage"
- HorizontalAlignment="Stretch"
- VerticalAlignment="Stretch"
- HorizontalScrollBarVisibility="Disabled"
- VerticalScrollBarVisibility="Auto">
- <Border Classes="settings">
- <StackPanel
- Margin="10,5"
- HorizontalAlignment="Stretch"
- Orientation="Vertical"
- Spacing="10">
- <TextBlock Classes="h1" Text="{locale:Locale SettingsTabGraphicsAPI}" />
- <StackPanel Margin="10,0,0,0" Orientation="Vertical" Spacing="10">
- <StackPanel Orientation="Horizontal">
- <TextBlock VerticalAlignment="Center"
- ToolTip.Tip="{locale:Locale SettingsTabGraphicsBackendTooltip}"
- Text="{locale:Locale SettingsTabGraphicsBackend}"
- Width="250" />
- <ComboBox Width="350"
- HorizontalContentAlignment="Left"
- ToolTip.Tip="{locale:Locale SettingsTabGraphicsBackendTooltip}"
- SelectedIndex="{Binding GraphicsBackendIndex}">
- <ComboBoxItem IsVisible="{Binding IsVulkanAvailable}">
- <TextBlock Text="Vulkan" />
- </ComboBoxItem>
- <ComboBoxItem IsEnabled="{Binding IsOpenGLAvailable}">
- <TextBlock Text="OpenGL" />
- </ComboBoxItem>
- </ComboBox>
- </StackPanel>
- <StackPanel Orientation="Horizontal" IsVisible="{Binding IsVulkanSelected}">
- <TextBlock VerticalAlignment="Center"
- ToolTip.Tip="{locale:Locale SettingsTabGraphicsPreferredGpuTooltip}"
- Text="{locale:Locale SettingsTabGraphicsPreferredGpu}"
- Width="250" />
- <ComboBox Width="350"
- HorizontalContentAlignment="Left"
- ToolTip.Tip="{locale:Locale SettingsTabGraphicsPreferredGpuTooltip}"
- SelectedIndex="{Binding PreferredGpuIndex}"
- Items="{Binding AvailableGpus}"/>
- </StackPanel>
- </StackPanel>
- <Separator Height="1" />
- <TextBlock Classes="h1" Text="{locale:Locale SettingsTabGraphicsFeatures}" />
- <StackPanel Margin="10,0,0,0" Orientation="Vertical" Spacing="10">
- <StackPanel Orientation="Vertical">
- <CheckBox IsChecked="{Binding EnableShaderCache}"
- ToolTip.Tip="{locale:Locale ShaderCacheToggleTooltip}">
- <TextBlock Text="{locale:Locale SettingsTabGraphicsEnableShaderCache}" />
- </CheckBox>
- <CheckBox IsChecked="{Binding EnableTextureRecompression}"
- ToolTip.Tip="{locale:Locale SettingsEnableTextureRecompressionTooltip}">
- <TextBlock Text="{locale:Locale SettingsEnableTextureRecompression}" />
- </CheckBox>
- <CheckBox IsChecked="{Binding EnableMacroHLE}"
- ToolTip.Tip="{locale:Locale SettingsEnableMacroHLETooltip}">
- <TextBlock Text="{locale:Locale SettingsEnableMacroHLE}" />
- </CheckBox>
- </StackPanel>
- <StackPanel Orientation="Horizontal">
- <TextBlock VerticalAlignment="Center"
- ToolTip.Tip="{locale:Locale ResolutionScaleTooltip}"
- Text="{locale:Locale SettingsTabGraphicsResolutionScale}"
- Width="250" />
- <ComboBox SelectedIndex="{Binding ResolutionScale}"
- Width="350"
- HorizontalContentAlignment="Left"
- ToolTip.Tip="{locale:Locale ResolutionScaleTooltip}">
- <ComboBoxItem>
- <TextBlock Text="{locale:Locale SettingsTabGraphicsResolutionScaleCustom}" />
- </ComboBoxItem>
- <ComboBoxItem>
- <TextBlock Text="{locale:Locale SettingsTabGraphicsResolutionScaleNative}" />
- </ComboBoxItem>
- <ComboBoxItem>
- <TextBlock Text="{locale:Locale SettingsTabGraphicsResolutionScale2x}" />
- </ComboBoxItem>
- <ComboBoxItem>
- <TextBlock Text="{locale:Locale SettingsTabGraphicsResolutionScale3x}" />
- </ComboBoxItem>
- <ComboBoxItem>
- <TextBlock Text="{locale:Locale SettingsTabGraphicsResolutionScale4x}" />
- </ComboBoxItem>
- </ComboBox>
- <ui:NumberBox
- Margin="10,0,0,0"
- ToolTip.Tip="{locale:Locale ResolutionScaleEntryTooltip}"
- MinWidth="150"
- SmallChange="0.1"
- LargeChange="1"
- SimpleNumberFormat="F2"
- SpinButtonPlacementMode="Inline"
- IsVisible="{Binding IsCustomResolutionScaleActive}"
- Maximum="100"
- Minimum="0.1"
- Value="{Binding CustomResolutionScale}" />
- </StackPanel>
- <StackPanel Orientation="Horizontal">
- <TextBlock VerticalAlignment="Center"
- ToolTip.Tip="{locale:Locale AnisotropyTooltip}"
- Text="{locale:Locale SettingsTabGraphicsAnisotropicFiltering}"
- Width="250" />
- <ComboBox SelectedIndex="{Binding MaxAnisotropy}"
- Width="350"
- HorizontalContentAlignment="Left"
- ToolTip.Tip="{locale:Locale AnisotropyTooltip}">
- <ComboBoxItem>
- <TextBlock
- Text="{locale:Locale SettingsTabGraphicsAnisotropicFilteringAuto}" />
- </ComboBoxItem>
- <ComboBoxItem>
- <TextBlock Text="{locale:Locale SettingsTabGraphicsAnisotropicFiltering2x}" />
- </ComboBoxItem>
- <ComboBoxItem>
- <TextBlock Text="{locale:Locale SettingsTabGraphicsAnisotropicFiltering4x}" />
- </ComboBoxItem>
- <ComboBoxItem>
- <TextBlock Text="{locale:Locale SettingsTabGraphicsAnisotropicFiltering8x}" />
- </ComboBoxItem>
- <ComboBoxItem>
- <TextBlock
- Text="{locale:Locale SettingsTabGraphicsAnisotropicFiltering16x}" />
- </ComboBoxItem>
- </ComboBox>
- </StackPanel>
- <StackPanel Orientation="Horizontal">
- <TextBlock VerticalAlignment="Center"
- ToolTip.Tip="{locale:Locale AspectRatioTooltip}"
- Text="{locale:Locale SettingsTabGraphicsAspectRatio}"
- Width="250" />
- <ComboBox SelectedIndex="{Binding AspectRatio}"
- Width="350"
- HorizontalContentAlignment="Left"
- ToolTip.Tip="{locale:Locale AspectRatioTooltip}">
- <ComboBoxItem>
- <TextBlock Text="{locale:Locale SettingsTabGraphicsAspectRatio4x3}" />
- </ComboBoxItem>
- <ComboBoxItem>
- <TextBlock Text="{locale:Locale SettingsTabGraphicsAspectRatio16x9}" />
- </ComboBoxItem>
- <ComboBoxItem>
- <TextBlock Text="{locale:Locale SettingsTabGraphicsAspectRatio16x10}" />
- </ComboBoxItem>
- <ComboBoxItem>
- <TextBlock Text="{locale:Locale SettingsTabGraphicsAspectRatio21x9}" />
- </ComboBoxItem>
- <ComboBoxItem>
- <TextBlock Text="{locale:Locale SettingsTabGraphicsAspectRatio32x9}" />
- </ComboBoxItem>
- <ComboBoxItem>
- <TextBlock Text="{locale:Locale SettingsTabGraphicsAspectRatioStretch}" />
- </ComboBoxItem>
- </ComboBox>
- </StackPanel>
- </StackPanel>
- <StackPanel
- Margin="10,0,0,0"
- HorizontalAlignment="Stretch"
- Orientation="Vertical"
- Spacing="10">
- <StackPanel Orientation="Horizontal">
- <TextBlock VerticalAlignment="Center"
- ToolTip.Tip="{locale:Locale GraphicsBackendThreadingTooltip}"
- Text="{locale:Locale SettingsTabGraphicsBackendMultithreading}"
- Width="250" />
- <ComboBox Width="350"
- HorizontalContentAlignment="Left"
- ToolTip.Tip="{locale:Locale GalThreadingTooltip}"
- SelectedIndex="{Binding GraphicsBackendMultithreadingIndex}">
- <ComboBoxItem>
- <TextBlock Text="{locale:Locale CommonAuto}" />
- </ComboBoxItem>
- <ComboBoxItem>
- <TextBlock Text="{locale:Locale CommonOff}" />
- </ComboBoxItem>
- <ComboBoxItem>
- <TextBlock Text="{locale:Locale CommonOn}" />
- </ComboBoxItem>
- </ComboBox>
- </StackPanel>
- </StackPanel>
- <Separator Height="1" />
- <TextBlock Classes="h1" Text="{locale:Locale SettingsTabGraphicsDeveloperOptions}" />
- <StackPanel
- Margin="10,0,0,0"
- HorizontalAlignment="Stretch"
- Orientation="Vertical"
- Spacing="10">
- <StackPanel Orientation="Horizontal">
- <TextBlock VerticalAlignment="Center"
- ToolTip.Tip="{locale:Locale ShaderDumpPathTooltip}"
- Text="{locale:Locale SettingsTabGraphicsShaderDumpPath}"
- Width="250" />
- <TextBox Text="{Binding ShaderDumpPath}"
- Width="350"
- ToolTip.Tip="{locale:Locale ShaderDumpPathTooltip}" />
- </StackPanel>
- </StackPanel>
- </StackPanel>
- </Border>
- </ScrollViewer>
- <ScrollViewer
- Name="AudioPage"
- HorizontalAlignment="Stretch"
- VerticalAlignment="Stretch"
- HorizontalScrollBarVisibility="Disabled"
- VerticalScrollBarVisibility="Auto">
- <Border Classes="settings">
- <StackPanel
- Margin="10,5"
- HorizontalAlignment="Stretch"
- Orientation="Vertical"
- Spacing="10">
- <TextBlock Classes="h1" Text="{locale:Locale SettingsTabAudio}" />
- <StackPanel Margin="10,0,0,0" Orientation="Horizontal">
- <TextBlock VerticalAlignment="Center"
- Text="{locale:Locale SettingsTabSystemAudioBackend}"
- ToolTip.Tip="{locale:Locale AudioBackendTooltip}"
- Width="250" />
- <ComboBox SelectedIndex="{Binding AudioBackend}"
- Width="350"
- HorizontalContentAlignment="Left">
- <ComboBoxItem>
- <TextBlock Text="{locale:Locale SettingsTabSystemAudioBackendDummy}" />
- </ComboBoxItem>
- <ComboBoxItem IsEnabled="{Binding IsOpenAlEnabled}">
- <TextBlock Text="{locale:Locale SettingsTabSystemAudioBackendOpenAL}" />
- </ComboBoxItem>
- <ComboBoxItem IsEnabled="{Binding IsSoundIoEnabled}">
- <TextBlock Text="{locale:Locale SettingsTabSystemAudioBackendSoundIO}" />
- </ComboBoxItem>
- <ComboBoxItem IsEnabled="{Binding IsSDL2Enabled}">
- <TextBlock Text="{locale:Locale SettingsTabSystemAudioBackendSDL2}" />
- </ComboBoxItem>
- </ComboBox>
- </StackPanel>
- <StackPanel Margin="10,0,0,0" Orientation="Horizontal">
- <TextBlock VerticalAlignment="Center"
- Text="{locale:Locale SettingsTabSystemAudioVolume}"
- ToolTip.Tip="{locale:Locale AudioVolumeTooltip}"
- Width="250" />
- <ui:NumberBox Value="{Binding Volume}"
- ToolTip.Tip="{locale:Locale AudioVolumeTooltip}"
- Width="350"
- SmallChange="1"
- LargeChange="10"
- SimpleNumberFormat="F0"
- SpinButtonPlacementMode="Inline"
- Minimum="0"
- Maximum="100" />
- </StackPanel>
- <StackPanel Margin="10,0,0,0" Orientation="Horizontal">
- <Slider Value="{Binding Volume}"
- Margin="250,0,0,0"
- ToolTip.Tip="{locale:Locale AudioVolumeTooltip}"
- Minimum="0"
- Maximum="100"
- SmallChange="5"
- TickFrequency="5"
- IsSnapToTickEnabled="True"
- LargeChange="10"
- Width="350" />
- </StackPanel>
- </StackPanel>
- </Border>
- </ScrollViewer>
- <ScrollViewer
- Name="NetworkPage"
- HorizontalAlignment="Stretch"
- VerticalAlignment="Stretch"
- HorizontalScrollBarVisibility="Disabled"
- VerticalScrollBarVisibility="Auto">
- <Border Classes="settings">
- <StackPanel
- Margin="10,5"
- HorizontalAlignment="Stretch"
- Orientation="Vertical"
- Spacing="10">
- <TextBlock Classes="h1" Text="{locale:Locale SettingsTabNetworkConnection}" />
- <CheckBox Margin="10,0,0,0" IsChecked="{Binding EnableInternetAccess}">
- <TextBlock Text="{locale:Locale SettingsTabSystemEnableInternetAccess}"
- ToolTip.Tip="{locale:Locale EnableInternetAccessTooltip}" />
- </CheckBox>
- </StackPanel>
- </Border>
- </ScrollViewer>
- <ScrollViewer
- Name="LoggingPage"
- HorizontalAlignment="Stretch"
- VerticalAlignment="Stretch"
- HorizontalScrollBarVisibility="Disabled"
- VerticalScrollBarVisibility="Auto">
- <Border Classes="settings">
- <StackPanel
- Margin="10,5"
- HorizontalAlignment="Stretch"
- Orientation="Vertical"
- Spacing="10">
- <TextBlock Classes="h1" Text="{locale:Locale SettingsTabLoggingLogging}" />
- <StackPanel Margin="10,0,0,0" Orientation="Vertical">
- <CheckBox IsChecked="{Binding EnableFileLog}"
- ToolTip.Tip="{locale:Locale FileLogTooltip}">
- <TextBlock Text="{locale:Locale SettingsTabLoggingEnableLoggingToFile}" />
- </CheckBox>
- <CheckBox IsChecked="{Binding EnableStub}"
- ToolTip.Tip="{locale:Locale StubLogTooltip}">
- <TextBlock Text="{locale:Locale SettingsTabLoggingEnableStubLogs}" />
- </CheckBox>
- <CheckBox IsChecked="{Binding EnableInfo}"
- ToolTip.Tip="{locale:Locale InfoLogTooltip}">
- <TextBlock Text="{locale:Locale SettingsTabLoggingEnableInfoLogs}" />
- </CheckBox>
- <CheckBox IsChecked="{Binding EnableWarn}"
- ToolTip.Tip="{locale:Locale WarnLogTooltip}">
- <TextBlock Text="{locale:Locale SettingsTabLoggingEnableWarningLogs}" />
- </CheckBox>
- <CheckBox IsChecked="{Binding EnableError}"
- ToolTip.Tip="{locale:Locale ErrorLogTooltip}">
- <TextBlock Text="{locale:Locale SettingsTabLoggingEnableErrorLogs}" />
- </CheckBox>
- <CheckBox IsChecked="{Binding EnableTrace}"
- ToolTip.Tip="{locale:Locale TraceLogTooltip}">
- <TextBlock Text="{locale:Locale SettingsTabLoggingEnableTraceLogs}" />
- </CheckBox>
- <CheckBox IsChecked="{Binding EnableGuest}"
- ToolTip.Tip="{locale:Locale GuestLogTooltip}">
- <TextBlock Text="{locale:Locale SettingsTabLoggingEnableGuestLogs}" />
- </CheckBox>
- </StackPanel>
- <Separator Height="1" />
- <TextBlock Classes="h1" Text="{locale:Locale SettingsTabLoggingDeveloperOptions}" />
- <StackPanel
- Margin="10,0,0,0"
- HorizontalAlignment="Stretch"
- Orientation="Vertical"
- Spacing="10">
- <StackPanel Orientation="Vertical">
- <CheckBox IsChecked="{Binding EnableDebug}"
- ToolTip.Tip="{locale:Locale DebugLogTooltip}">
- <TextBlock Text="{locale:Locale SettingsTabLoggingEnableDebugLogs}" />
- </CheckBox>
- <CheckBox IsChecked="{Binding EnableFsAccessLog}"
- ToolTip.Tip="{locale:Locale FileAccessLogTooltip}">
- <TextBlock Text="{locale:Locale SettingsTabLoggingEnableFsAccessLogs}" />
- </CheckBox>
- <StackPanel Margin="0,10,0,0" Orientation="Horizontal" VerticalAlignment="Stretch">
- <TextBlock VerticalAlignment="Center"
- ToolTip.Tip="{locale:Locale FSAccessLogModeTooltip}"
- Text="{locale:Locale SettingsTabLoggingFsGlobalAccessLogMode}"
- Width="285" />
- <ui:NumberBox
- Maximum="3"
- Minimum="0"
- Width="150"
- SpinButtonPlacementMode="Inline"
- SmallChange="1"
- LargeChange="1"
- Value="{Binding FsGlobalAccessLogMode}" />
- </StackPanel>
- <StackPanel Margin="0,10,0,0" Orientation="Horizontal">
- <TextBlock VerticalAlignment="Center"
- Text="{locale:Locale SettingsTabLoggingGraphicsBackendLogLevel}"
- ToolTip.Tip="{locale:Locale OpenGlLogLevel}"
- Width="285" />
- <ComboBox SelectedIndex="{Binding OpenglDebugLevel}"
- Width="150"
- HorizontalContentAlignment="Left"
- ToolTip.Tip="{locale:Locale OpenGlLogLevel}">
- <ComboBoxItem>
- <TextBlock Text="{locale:Locale SettingsTabLoggingGraphicsBackendLogLevelNone}" />
- </ComboBoxItem>
- <ComboBoxItem>
- <TextBlock Text="{locale:Locale SettingsTabLoggingGraphicsBackendLogLevelError}" />
- </ComboBoxItem>
- <ComboBoxItem>
- <TextBlock
- Text="{locale:Locale SettingsTabLoggingGraphicsBackendLogLevelPerformance}" />
- </ComboBoxItem>
- <ComboBoxItem>
- <TextBlock Text="{locale:Locale SettingsTabLoggingGraphicsBackendLogLevelAll}" />
- </ComboBoxItem>
- </ComboBox>
- </StackPanel>
- </StackPanel>
- </StackPanel>
- </StackPanel>
- </Border>
- </ScrollViewer>
+ <settings:SettingsUIView Name="UiPage" />
+ <settings:SettingsInputView Name="InputPage" />
+ <settings:SettingsHotkeysView Name="HotkeysPage" />
+ <settings:SettingsSystemView Name="SystemPage" />
+ <settings:SettingsCPUView Name="CpuPage" />
+ <settings:SettingsGraphicsView Name="GraphicsPage" />
+ <settings:SettingsAudioView Name="AudioPage" />
+ <settings:SettingsNetworkView Name="NetworkPage" />
+ <settings:SettingsLoggingView Name="LoggingPage" />
</Grid>
<ui:NavigationView Grid.Row="1"
IsSettingsVisible="False"
@@ -962,7 +102,7 @@
Spacing="10"
Orientation="Horizontal"
HorizontalAlignment="Right"
- ReverseOrder="{ReflectionBinding IsMacOS}">
+ ReverseOrder="{Binding IsMacOS}">
<Button
HotKey="Enter"
Classes="accent"
diff --git a/Ryujinx.Ava/UI/Windows/SettingsWindow.axaml.cs b/Ryujinx.Ava/UI/Windows/SettingsWindow.axaml.cs
index ae489b86..bdf7e94d 100644
--- a/Ryujinx.Ava/UI/Windows/SettingsWindow.axaml.cs
+++ b/Ryujinx.Ava/UI/Windows/SettingsWindow.axaml.cs
@@ -1,49 +1,29 @@
-using Avalonia.Controls;
-using Avalonia.Controls.Primitives;
-using Avalonia.Data;
-using Avalonia.Data.Converters;
-using Avalonia.Input;
-using Avalonia.Interactivity;
using FluentAvalonia.Core;
using FluentAvalonia.UI.Controls;
using Ryujinx.Ava.Common.Locale;
-using Ryujinx.Ava.UI.Controls;
-using Ryujinx.Ava.UI.Helpers;
using Ryujinx.Ava.UI.ViewModels;
using Ryujinx.HLE.FileSystem;
-using Ryujinx.Input;
-using Ryujinx.Input.Assigner;
using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
-using TimeZone = Ryujinx.Ava.UI.Models.TimeZone;
+using System.ComponentModel;
namespace Ryujinx.Ava.UI.Windows
{
public partial class SettingsWindow : StyleableWindow
{
- private ButtonKeyAssigner _currentAssigner;
-
internal SettingsViewModel ViewModel { get; set; }
public SettingsWindow(VirtualFileSystem virtualFileSystem, ContentManager contentManager)
{
Title = $"Ryujinx {Program.Version} - {LocaleManager.Instance[LocaleKeys.Settings]}";
- ViewModel = new SettingsViewModel(virtualFileSystem, contentManager, this);
+ ViewModel = new SettingsViewModel(virtualFileSystem, contentManager);
DataContext = ViewModel;
+ ViewModel.CloseWindow += Close;
+ ViewModel.SaveSettingsEvent += SaveSettings;
+
InitializeComponent();
Load();
-
- FuncMultiValueConverter<string, string> converter = new(parts => string.Format("{0} {1} {2}", parts.ToArray()).Trim());
- MultiBinding tzMultiBinding = new() { Converter = converter };
- tzMultiBinding.Bindings.Add(new Binding("UtcDifference"));
- tzMultiBinding.Bindings.Add(new Binding("Location"));
- tzMultiBinding.Bindings.Add(new Binding("Abbreviation"));
-
- TimeZoneBox.ValueMemberBinding = tzMultiBinding;
}
public SettingsWindow()
@@ -55,159 +35,69 @@ namespace Ryujinx.Ava.UI.Windows
Load();
}
- private void Load()
+ public void SaveSettings()
{
- Pages.Children.Clear();
- NavPanel.SelectionChanged += NavPanelOnSelectionChanged;
- NavPanel.SelectedItem = NavPanel.MenuItems.ElementAt(0);
- }
+ InputPage.ControllerSettings?.SaveCurrentProfile();
- private void Button_Checked(object sender, RoutedEventArgs e)
- {
- if (sender is ToggleButton button)
+ if (Owner is MainWindow window && ViewModel.DirectoryChanged)
{
- if (_currentAssigner != null && button == _currentAssigner.ToggledButton)
- {
- return;
- }
-
- if (_currentAssigner == null && (bool)button.IsChecked)
- {
- _currentAssigner = new ButtonKeyAssigner(button);
-
- FocusManager.Instance.Focus(this, NavigationMethod.Pointer);
-
- PointerPressed += MouseClick;
-
- IKeyboard keyboard = (IKeyboard)ViewModel.AvaloniaKeyboardDriver.GetGamepad(ViewModel.AvaloniaKeyboardDriver.GamepadsIds[0]);
- IButtonAssigner assigner = new KeyboardKeyAssigner(keyboard);
-
- _currentAssigner.GetInputAndAssign(assigner);
- }
- else
- {
- if (_currentAssigner != null)
- {
- ToggleButton oldButton = _currentAssigner.ToggledButton;
-
- _currentAssigner.Cancel();
- _currentAssigner = null;
-
- button.IsChecked = false;
- }
- }
+ window.ViewModel.LoadApplications();
}
}
- private void Button_Unchecked(object sender, RoutedEventArgs e)
- {
- _currentAssigner?.Cancel();
- _currentAssigner = null;
- }
-
- private void MouseClick(object sender, PointerPressedEventArgs e)
+ private void Load()
{
- bool shouldUnbind = false;
-
- if (e.GetCurrentPoint(this).Properties.IsMiddleButtonPressed)
- {
- shouldUnbind = true;
- }
-
- _currentAssigner?.Cancel(shouldUnbind);
-
- PointerPressed -= MouseClick;
+ Pages.Children.Clear();
+ NavPanel.SelectionChanged += NavPanelOnSelectionChanged;
+ NavPanel.SelectedItem = NavPanel.MenuItems.ElementAt(0);
}
private void NavPanelOnSelectionChanged(object sender, NavigationViewSelectionChangedEventArgs e)
{
- if (e.SelectedItem is NavigationViewItem navitem)
+ if (e.SelectedItem is NavigationViewItem navItem && navItem.Tag is not null)
{
- NavPanel.Content = navitem.Tag.ToString() switch
+ switch (navItem.Tag.ToString())
{
- "UiPage" => UiPage,
- "InputPage" => InputPage,
- "HotkeysPage" => HotkeysPage,
- "SystemPage" => SystemPage,
- "CpuPage" => CpuPage,
- "GraphicsPage" => GraphicsPage,
- "AudioPage" => AudioPage,
- "NetworkPage" => NetworkPage,
- "LoggingPage" => LoggingPage,
- _ => throw new NotImplementedException()
- };
- }
- }
-
- private async void AddButton_OnClick(object sender, RoutedEventArgs e)
- {
- string path = PathBox.Text;
-
- if (!string.IsNullOrWhiteSpace(path) && Directory.Exists(path) && !ViewModel.GameDirectories.Contains(path))
- {
- ViewModel.GameDirectories.Add(path);
- ViewModel.DirectoryChanged = true;
- }
- else
- {
- path = await new OpenFolderDialog().ShowAsync(this);
-
- if (!string.IsNullOrWhiteSpace(path))
- {
- ViewModel.GameDirectories.Add(path);
- ViewModel.DirectoryChanged = true;
+ case "UiPage":
+ UiPage.ViewModel = ViewModel;
+ NavPanel.Content = UiPage;
+ break;
+ case "InputPage":
+ NavPanel.Content = InputPage;
+ break;
+ case "HotkeysPage":
+ NavPanel.Content = HotkeysPage;
+ break;
+ case "SystemPage":
+ SystemPage.ViewModel = ViewModel;
+ NavPanel.Content = SystemPage;
+ break;
+ case "CpuPage":
+ NavPanel.Content = CpuPage;
+ break;
+ case "GraphicsPage":
+ NavPanel.Content = GraphicsPage;
+ break;
+ case "AudioPage":
+ NavPanel.Content = AudioPage;
+ break;
+ case "NetworkPage":
+ NavPanel.Content = NetworkPage;
+ break;
+ case "LoggingPage":
+ NavPanel.Content = LoggingPage;
+ break;
+ default:
+ throw new NotImplementedException();
}
}
}
- private void RemoveButton_OnClick(object sender, RoutedEventArgs e)
+ protected override void OnClosing(CancelEventArgs e)
{
- int oldIndex = GameList.SelectedIndex;
-
- foreach (string path in new List<string>(GameList.SelectedItems.Cast<string>()))
- {
- ViewModel.GameDirectories.Remove(path);
- ViewModel.DirectoryChanged = true;
- }
-
- if (GameList.ItemCount > 0)
- {
- GameList.SelectedIndex = oldIndex < GameList.ItemCount ? oldIndex : 0;
- }
- }
-
- private void TimeZoneBox_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
- {
- if (e.AddedItems != null && e.AddedItems.Count > 0)
- {
- if (e.AddedItems[0] is TimeZone timeZone)
- {
- e.Handled = true;
-
- ViewModel.ValidateAndSetTimeZone(timeZone.Location);
- }
- }
- }
-
- private void TimeZoneBox_OnTextChanged(object sender, EventArgs e)
- {
- if (sender is AutoCompleteBox box)
- {
- if (box.SelectedItem != null && box.SelectedItem is TimeZone timeZone)
- {
- ViewModel.ValidateAndSetTimeZone(timeZone.Location);
- }
- }
- }
-
- protected override void OnClosed(EventArgs e)
- {
- ControllerSettings.Dispose();
-
- _currentAssigner?.Cancel();
- _currentAssigner = null;
-
- base.OnClosed(e);
+ HotkeysPage.Dispose();
+ InputPage.Dispose();
+ base.OnClosing(e);
}
}
} \ No newline at end of file