diff options
| author | Isaac Marovitz <42140194+IsaacMarovitz@users.noreply.github.com> | 2023-01-06 18:35:21 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-01-07 00:35:21 +0100 |
| commit | 38519f3b9ade223983f7529f9b4f4b857c60f42b (patch) | |
| tree | a041ee4171f61417b75dd6a7a204d6d150f60ecb /Ryujinx.Ava/UI/Views | |
| parent | 7f27aabbd0501b32e4918384c0a50fd0b7f357fe (diff) | |
Ava GUI: `SettingsWindow` Refactor (#4177)
* 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>
Diffstat (limited to 'Ryujinx.Ava/UI/Views')
18 files changed, 1317 insertions, 0 deletions
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 |
