aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.Ava/UI/Windows
diff options
context:
space:
mode:
authorMary Guillemard <mary@mary.zone>2024-03-02 12:51:05 +0100
committerGitHub <noreply@github.com>2024-03-02 12:51:05 +0100
commitec6cb0abb4b7669895b6e96fd7581c93b5abd691 (patch)
tree128c862ff5faea0b219467656d4023bee7faefb5 /src/Ryujinx.Ava/UI/Windows
parent53b5985da6b9d7b281d9fc25b93bfd1d1918a107 (diff)
infra: Make Avalonia the default UI (#6375)
* misc: Move Ryujinx project to Ryujinx.Gtk3 This breaks release CI for now but that's fine. Signed-off-by: Mary Guillemard <mary@mary.zone> * misc: Move Ryujinx.Ava project to Ryujinx This breaks CI for now, but it's fine. Signed-off-by: Mary Guillemard <mary@mary.zone> * infra: Make Avalonia the default UI Should fix CI after the previous changes. GTK3 isn't build by the release job anymore, only by PR CI. This also ensure that the test-ava update package is still generated to allow update from the old testing channel. Signed-off-by: Mary Guillemard <mary@mary.zone> * Fix missing copy in create_app_bundle.sh Signed-off-by: Mary Guillemard <mary@mary.zone> * Fix syntax error Signed-off-by: Mary Guillemard <mary@mary.zone> --------- Signed-off-by: Mary Guillemard <mary@mary.zone>
Diffstat (limited to 'src/Ryujinx.Ava/UI/Windows')
-rw-r--r--src/Ryujinx.Ava/UI/Windows/AboutWindow.axaml270
-rw-r--r--src/Ryujinx.Ava/UI/Windows/AboutWindow.axaml.cs63
-rw-r--r--src/Ryujinx.Ava/UI/Windows/AmiiboWindow.axaml75
-rw-r--r--src/Ryujinx.Ava/UI/Windows/AmiiboWindow.axaml.cs60
-rw-r--r--src/Ryujinx.Ava/UI/Windows/CheatWindow.axaml126
-rw-r--r--src/Ryujinx.Ava/UI/Windows/CheatWindow.axaml.cs123
-rw-r--r--src/Ryujinx.Ava/UI/Windows/ContentDialogOverlayWindow.axaml25
-rw-r--r--src/Ryujinx.Ava/UI/Windows/ContentDialogOverlayWindow.axaml.cs21
-rw-r--r--src/Ryujinx.Ava/UI/Windows/DownloadableContentManagerWindow.axaml192
-rw-r--r--src/Ryujinx.Ava/UI/Windows/DownloadableContentManagerWindow.axaml.cs115
-rw-r--r--src/Ryujinx.Ava/UI/Windows/IconColorPicker.cs194
-rw-r--r--src/Ryujinx.Ava/UI/Windows/MainWindow.axaml205
-rw-r--r--src/Ryujinx.Ava/UI/Windows/MainWindow.axaml.cs551
-rw-r--r--src/Ryujinx.Ava/UI/Windows/ModManagerWindow.axaml179
-rw-r--r--src/Ryujinx.Ava/UI/Windows/ModManagerWindow.axaml.cs139
-rw-r--r--src/Ryujinx.Ava/UI/Windows/SettingsWindow.axaml130
-rw-r--r--src/Ryujinx.Ava/UI/Windows/SettingsWindow.axaml.cs103
-rw-r--r--src/Ryujinx.Ava/UI/Windows/StyleableWindow.cs44
-rw-r--r--src/Ryujinx.Ava/UI/Windows/TitleUpdateWindow.axaml133
-rw-r--r--src/Ryujinx.Ava/UI/Windows/TitleUpdateWindow.axaml.cs96
20 files changed, 0 insertions, 2844 deletions
diff --git a/src/Ryujinx.Ava/UI/Windows/AboutWindow.axaml b/src/Ryujinx.Ava/UI/Windows/AboutWindow.axaml
deleted file mode 100644
index 69fa8251..00000000
--- a/src/Ryujinx.Ava/UI/Windows/AboutWindow.axaml
+++ /dev/null
@@ -1,270 +0,0 @@
-<UserControl
- x:Class="Ryujinx.Ava.UI.Windows.AboutWindow"
- xmlns="https://github.com/avaloniaui"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
- xmlns:locale="clr-namespace:Ryujinx.Ava.Common.Locale"
- xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
- xmlns:ui="clr-namespace:FluentAvalonia.UI.Controls;assembly=FluentAvalonia"
- xmlns:viewModel="clr-namespace:Ryujinx.Ava.UI.ViewModels"
- Width="550"
- Height="260"
- Margin="0,-12,0,0"
- d:DesignHeight="260"
- d:DesignWidth="550"
- x:DataType="viewModel:AboutWindowViewModel"
- Focusable="True"
- mc:Ignorable="d">
- <Design.DataContext>
- <viewModel:AboutWindowViewModel />
- </Design.DataContext>
- <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
- <Grid.ColumnDefinitions>
- <ColumnDefinition Width="Auto" />
- <ColumnDefinition Width="Auto" />
- <ColumnDefinition Width="*" />
- </Grid.ColumnDefinitions>
- <Grid
- Grid.Column="0"
- HorizontalAlignment="Stretch"
- VerticalAlignment="Stretch">
- <Grid.RowDefinitions>
- <RowDefinition Height="Auto" />
- <RowDefinition Height="*" />
- <RowDefinition Height="Auto" />
- </Grid.RowDefinitions>
- <StackPanel
- Grid.Row="0"
- HorizontalAlignment="Stretch"
- VerticalAlignment="Stretch"
- Spacing="10">
- <Grid>
- <Grid.ColumnDefinitions>
- <ColumnDefinition Width="Auto" />
- <ColumnDefinition Width="*" />
- <ColumnDefinition Width="Auto" />
- </Grid.ColumnDefinitions>
- <StackPanel
- Grid.Column="1"
- Orientation="Horizontal"
- HorizontalAlignment="Center"
- Spacing="10">
- <Image
- Height="80"
- Source="resm:Ryujinx.UI.Common.Resources.Logo_Ryujinx.png?assembly=Ryujinx.UI.Common"
- HorizontalAlignment="Center"
- IsHitTestVisible="True" />
- <WrapPanel
- HorizontalAlignment="Right"
- VerticalAlignment="Center"
- Orientation="Vertical">
- <TextBlock
- FontSize="28"
- FontWeight="Bold"
- Text="Ryujinx"
- TextAlignment="Start"
- Width="110"
- HorizontalAlignment="Center"
- VerticalAlignment="Center" />
- <TextBlock
- FontSize="11"
- Text="(REE-YOU-JINX)"
- TextAlignment="Start"
- Width="110"
- HorizontalAlignment="Center"
- VerticalAlignment="Center" />
- </WrapPanel>
- </StackPanel>
- </Grid>
- <TextBlock
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- FontSize="10"
- LineHeight="12"
- Text="{Binding Version}"
- TextAlignment="Center" />
- <Button
- Padding="5"
- HorizontalAlignment="Center"
- Background="Transparent"
- Click="Button_OnClick"
- Tag="https://github.com/Ryujinx/Ryujinx/wiki/Changelog#ryujinx-changelog">
- <TextBlock
- FontSize="10"
- Text="{locale:Locale AboutChangelogButton}"
- TextAlignment="Center"
- ToolTip.Tip="{locale:Locale AboutChangelogButtonTooltipMessage}" />
- </Button>
- </StackPanel>
- <StackPanel
- Grid.Row="2"
- HorizontalAlignment="Stretch"
- VerticalAlignment="Stretch"
- Spacing="10">
- <TextBlock
- Width="200"
- HorizontalAlignment="Center"
- FontSize="10"
- LineHeight="12"
- Text="{locale:Locale AboutDisclaimerMessage}"
- TextAlignment="Center"
- TextWrapping="Wrap" />
- <TextBlock
- Name="AmiiboLabel"
- Width="200"
- HorizontalAlignment="Center"
- FontSize="10"
- LineHeight="12"
- PointerPressed="AmiiboLabel_OnPointerPressed"
- Text="{locale:Locale AboutAmiiboDisclaimerMessage}"
- TextAlignment="Center"
- TextWrapping="Wrap" />
- <StackPanel
- HorizontalAlignment="Center"
- Orientation="Horizontal"
- Spacing="10">
- <Button
- MinWidth="30"
- MinHeight="30"
- MaxWidth="30"
- MaxHeight="30"
- Padding="8"
- Background="Transparent"
- Click="Button_OnClick"
- CornerRadius="15"
- Tag="https://www.patreon.com/ryujinx"
- ToolTip.Tip="{locale:Locale AboutPatreonUrlTooltipMessage}">
- <Image Source="{Binding PatreonLogo}" />
- </Button>
- <Button
- MinWidth="30"
- MinHeight="30"
- MaxWidth="30"
- MaxHeight="30"
- Padding="8"
- Background="Transparent"
- Click="Button_OnClick"
- CornerRadius="15"
- Tag="https://github.com/Ryujinx/Ryujinx"
- ToolTip.Tip="{locale:Locale AboutGithubUrlTooltipMessage}">
- <Image Source="{Binding GithubLogo}" />
- </Button>
- <Button
- MinWidth="30"
- MinHeight="30"
- MaxWidth="30"
- MaxHeight="30"
- Padding="8"
- Background="Transparent"
- Click="Button_OnClick"
- CornerRadius="15"
- Tag="https://discordapp.com/invite/N2FmfVc"
- ToolTip.Tip="{locale:Locale AboutDiscordUrlTooltipMessage}">
- <Image Source="{Binding DiscordLogo}" />
- </Button>
- <Button
- MinWidth="30"
- MinHeight="30"
- MaxWidth="30"
- MaxHeight="30"
- Padding="8"
- Background="Transparent"
- Click="Button_OnClick"
- CornerRadius="15"
- Tag="https://twitter.com/RyujinxEmu"
- ToolTip.Tip="{locale:Locale AboutTwitterUrlTooltipMessage}">
- <Image Source="{Binding TwitterLogo}" />
- </Button>
- <Button
- MinWidth="30"
- MinHeight="30"
- MaxWidth="30"
- MaxHeight="30"
- Padding="8"
- Background="Transparent"
- Click="Button_OnClick"
- CornerRadius="15"
- Tag="https://www.ryujinx.org"
- ToolTip.Tip="{locale:Locale AboutUrlTooltipMessage}">
- <ui:SymbolIcon Foreground="{DynamicResource ThemeForegroundColor}" Symbol="Link" />
- </Button>
- </StackPanel>
- </StackPanel>
- </Grid>
- <Border
- Grid.Column="1"
- Width="1"
- Margin="20,0"
- VerticalAlignment="Stretch"
- BorderBrush="{DynamicResource ThemeControlBorderColor}"
- BorderThickness="1,0,0,0" />
- <Grid
- Grid.Column="2"
- HorizontalAlignment="Stretch"
- VerticalAlignment="Stretch">
- <Grid.RowDefinitions>
- <RowDefinition Height="Auto" />
- <RowDefinition Height="Auto" />
- <RowDefinition Height="Auto" />
- </Grid.RowDefinitions>
- <StackPanel
- Grid.Row="0"
- Margin="0,10,0,0"
- Spacing="2">
- <TextBlock
- FontSize="15"
- FontWeight="Bold"
- Text="{locale:Locale AboutRyujinxAboutTitle}" />
- <TextBlock
- FontSize="10"
- Text="{locale:Locale AboutRyujinxAboutContent}"
- TextWrapping="Wrap" />
- </StackPanel>
- <StackPanel
- Grid.Row="1"
- Margin="0,10,0,0"
- Spacing="2">
- <TextBlock
- FontSize="15"
- FontWeight="Bold"
- Text="{locale:Locale AboutRyujinxMaintainersTitle}" />
- <TextBlock
- FontSize="10"
- Text="{Binding Developers}"
- TextWrapping="Wrap" />
- <Button
- Padding="5"
- HorizontalAlignment="Left"
- Background="Transparent"
- Click="Button_OnClick"
- Tag="https://github.com/Ryujinx/Ryujinx/graphs/contributors?type=a">
- <TextBlock
- FontSize="10"
- Text="{locale:Locale AboutRyujinxContributorsButtonHeader}"
- TextAlignment="End"
- ToolTip.Tip="{locale:Locale AboutRyujinxMaintainersContentTooltipMessage}" />
- </Button>
- </StackPanel>
- <StackPanel
- Grid.Row="2"
- Margin="0,10,0,0"
- Spacing="2">
- <TextBlock
- FontSize="15"
- FontWeight="Bold"
- Text="{locale:Locale AboutRyujinxSupprtersTitle}" />
- <ScrollViewer
- Height="70"
- HorizontalScrollBarVisibility="Disabled"
- VerticalScrollBarVisibility="Visible">
- <TextBlock
- Name="SupportersTextBlock"
- VerticalAlignment="Top"
- FontSize="10"
- Text="{Binding Supporters}"
- TextWrapping="Wrap" />
- </ScrollViewer>
- </StackPanel>
- </Grid>
- </Grid>
-</UserControl>
diff --git a/src/Ryujinx.Ava/UI/Windows/AboutWindow.axaml.cs b/src/Ryujinx.Ava/UI/Windows/AboutWindow.axaml.cs
deleted file mode 100644
index c32661b0..00000000
--- a/src/Ryujinx.Ava/UI/Windows/AboutWindow.axaml.cs
+++ /dev/null
@@ -1,63 +0,0 @@
-using Avalonia.Controls;
-using Avalonia.Input;
-using Avalonia.Interactivity;
-using Avalonia.Layout;
-using Avalonia.Styling;
-using FluentAvalonia.UI.Controls;
-using Ryujinx.Ava.Common.Locale;
-using Ryujinx.Ava.UI.Helpers;
-using Ryujinx.Ava.UI.ViewModels;
-using Ryujinx.UI.Common.Helper;
-using System.Threading.Tasks;
-using Button = Avalonia.Controls.Button;
-
-namespace Ryujinx.Ava.UI.Windows
-{
- public partial class AboutWindow : UserControl
- {
- public AboutWindow()
- {
- DataContext = new AboutWindowViewModel();
-
- InitializeComponent();
- }
-
- public static async Task Show()
- {
- ContentDialog contentDialog = new()
- {
- PrimaryButtonText = "",
- SecondaryButtonText = "",
- CloseButtonText = LocaleManager.Instance[LocaleKeys.UserProfilesClose],
- Content = new AboutWindow(),
- };
-
- Style closeButton = new(x => x.Name("CloseButton"));
- closeButton.Setters.Add(new Setter(WidthProperty, 80d));
-
- Style closeButtonParent = new(x => x.Name("CommandSpace"));
- closeButtonParent.Setters.Add(new Setter(HorizontalAlignmentProperty, HorizontalAlignment.Right));
-
- contentDialog.Styles.Add(closeButton);
- contentDialog.Styles.Add(closeButtonParent);
-
- await ContentDialogHelper.ShowAsync(contentDialog);
- }
-
- private void Button_OnClick(object sender, RoutedEventArgs e)
- {
- if (sender is Button button)
- {
- OpenHelper.OpenUrl(button.Tag.ToString());
- }
- }
-
- private void AmiiboLabel_OnPointerPressed(object sender, PointerPressedEventArgs e)
- {
- if (sender is TextBlock)
- {
- OpenHelper.OpenUrl("https://amiiboapi.com");
- }
- }
- }
-}
diff --git a/src/Ryujinx.Ava/UI/Windows/AmiiboWindow.axaml b/src/Ryujinx.Ava/UI/Windows/AmiiboWindow.axaml
deleted file mode 100644
index c587aa87..00000000
--- a/src/Ryujinx.Ava/UI/Windows/AmiiboWindow.axaml
+++ /dev/null
@@ -1,75 +0,0 @@
-<window:StyleableWindow
- 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:window="clr-namespace:Ryujinx.Ava.UI.Windows"
- xmlns:viewModels="clr-namespace:Ryujinx.Ava.UI.ViewModels"
- xmlns:locale="clr-namespace:Ryujinx.Ava.Common.Locale"
- mc:Ignorable="d"
- d:DesignWidth="400"
- d:DesignHeight="350"
- x:Class="Ryujinx.Ava.UI.Windows.AmiiboWindow"
- x:DataType="viewModels:AmiiboWindowViewModel"
- CanResize="False"
- WindowStartupLocation="CenterOwner"
- Width="800"
- MinHeight="650"
- Height="650"
- SizeToContent="Manual"
- MinWidth="600"
- Focusable="True">
- <Design.DataContext>
- <viewModels:AmiiboWindowViewModel />
- </Design.DataContext>
- <Grid Margin="15" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
- <Grid.RowDefinitions>
- <RowDefinition Height="Auto" />
- <RowDefinition Height="Auto" />
- <RowDefinition Height="*" />
- <RowDefinition Height="Auto" />
- </Grid.RowDefinitions>
- <Grid Grid.Row="1" HorizontalAlignment="Stretch">
- <Grid.ColumnDefinitions>
- <ColumnDefinition />
- <ColumnDefinition />
- </Grid.ColumnDefinitions>
- <StackPanel Spacing="10" Orientation="Horizontal" HorizontalAlignment="Left">
- <TextBlock VerticalAlignment="Center" Text="{locale:Locale AmiiboSeriesLabel}" />
- <ComboBox SelectedIndex="{Binding SeriesSelectedIndex}" ItemsSource="{Binding AmiiboSeries}" MinWidth="100" />
- </StackPanel>
- <StackPanel Spacing="10" Grid.Column="1" Orientation="Horizontal" HorizontalAlignment="Right">
- <TextBlock VerticalAlignment="Center" Text="{locale:Locale AmiiboCharacterLabel}" />
- <ComboBox SelectedIndex="{Binding AmiiboSelectedIndex}" MinWidth="100" ItemsSource="{Binding AmiiboList}" />
- </StackPanel>
- </Grid>
- <StackPanel Margin="20" Grid.Row="2">
- <Image Source="{Binding AmiiboImage}" Height="350" Width="350" HorizontalAlignment="Center" />
- <ScrollViewer MaxHeight="120" HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Auto"
- Margin="20" VerticalAlignment="Top" HorizontalAlignment="Stretch">
- <TextBlock TextWrapping="Wrap" Text="{Binding Usage}" HorizontalAlignment="Center"
- TextAlignment="Center" />
- </ScrollViewer>
- </StackPanel>
- <Grid Grid.Row="3">
- <Grid.ColumnDefinitions>
- <ColumnDefinition Width="Auto" />
- <ColumnDefinition Width="Auto" />
- <ColumnDefinition Width="*" />
- <ColumnDefinition Width="Auto" />
- <ColumnDefinition Width="Auto" />
- </Grid.ColumnDefinitions>
- <CheckBox Margin="10" Grid.Column="0" VerticalContentAlignment="Center" IsChecked="{Binding ShowAllAmiibo}"
- Content="{locale:Locale AmiiboOptionsShowAllLabel}" />
- <CheckBox Margin="10" VerticalContentAlignment="Center" Grid.Column="1" IsChecked="{Binding UseRandomUuid}"
- Content="{locale:Locale AmiiboOptionsUsRandomTagLabel}" />
-
- <Button Grid.Column="3" IsEnabled="{Binding EnableScanning}" Width="80"
- Content="{locale:Locale AmiiboScanButtonLabel}" Name="ScanButton"
- Click="ScanButton_Click" />
- <Button Grid.Column="4" Margin="10,0" Width="80" Content="{locale:Locale InputDialogCancel}"
- Name="CancelButton"
- Click="CancelButton_Click" />
- </Grid>
- </Grid>
-</window:StyleableWindow>
diff --git a/src/Ryujinx.Ava/UI/Windows/AmiiboWindow.axaml.cs b/src/Ryujinx.Ava/UI/Windows/AmiiboWindow.axaml.cs
deleted file mode 100644
index 8829cb10..00000000
--- a/src/Ryujinx.Ava/UI/Windows/AmiiboWindow.axaml.cs
+++ /dev/null
@@ -1,60 +0,0 @@
-using Avalonia.Interactivity;
-using Ryujinx.Ava.Common.Locale;
-using Ryujinx.Ava.UI.ViewModels;
-using Ryujinx.UI.Common.Models.Amiibo;
-
-namespace Ryujinx.Ava.UI.Windows
-{
- public partial class AmiiboWindow : StyleableWindow
- {
- public AmiiboWindow(bool showAll, string lastScannedAmiiboId, string titleId)
- {
- ViewModel = new AmiiboWindowViewModel(this, lastScannedAmiiboId, titleId)
- {
- ShowAllAmiibo = showAll,
- };
-
- DataContext = ViewModel;
-
- InitializeComponent();
-
- Title = $"Ryujinx {Program.Version} - " + LocaleManager.Instance[LocaleKeys.Amiibo];
- }
-
- public AmiiboWindow()
- {
- ViewModel = new AmiiboWindowViewModel(this, string.Empty, string.Empty);
-
- DataContext = ViewModel;
-
- InitializeComponent();
-
- if (Program.PreviewerDetached)
- {
- Title = $"Ryujinx {Program.Version} - " + LocaleManager.Instance[LocaleKeys.Amiibo];
- }
- }
-
- public bool IsScanned { get; set; }
- public AmiiboApi ScannedAmiibo { get; set; }
- public AmiiboWindowViewModel ViewModel { get; set; }
-
- private void ScanButton_Click(object sender, RoutedEventArgs e)
- {
- if (ViewModel.AmiiboSelectedIndex > -1)
- {
- AmiiboApi amiibo = ViewModel.AmiiboList[ViewModel.AmiiboSelectedIndex];
- ScannedAmiibo = amiibo;
- IsScanned = true;
- Close();
- }
- }
-
- private void CancelButton_Click(object sender, RoutedEventArgs e)
- {
- IsScanned = false;
-
- Close();
- }
- }
-}
diff --git a/src/Ryujinx.Ava/UI/Windows/CheatWindow.axaml b/src/Ryujinx.Ava/UI/Windows/CheatWindow.axaml
deleted file mode 100644
index 57d5f7ef..00000000
--- a/src/Ryujinx.Ava/UI/Windows/CheatWindow.axaml
+++ /dev/null
@@ -1,126 +0,0 @@
-<window:StyleableWindow
- x:Class="Ryujinx.Ava.UI.Windows.CheatWindow"
- xmlns="https://github.com/avaloniaui"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
- xmlns:locale="clr-namespace:Ryujinx.Ava.Common.Locale"
- xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
- xmlns:model="clr-namespace:Ryujinx.Ava.UI.Models"
- xmlns:window="clr-namespace:Ryujinx.Ava.UI.Windows"
- Width="500"
- Height="500"
- MinWidth="500"
- MinHeight="500"
- x:DataType="window:CheatWindow"
- WindowStartupLocation="CenterOwner"
- mc:Ignorable="d"
- Focusable="True">
- <Window.Styles>
- <Style Selector="TreeViewItem">
- <Setter Property="IsExpanded" Value="True" />
- </Style>
- </Window.Styles>
- <Grid Name="CheatGrid" Margin="15">
- <Grid.RowDefinitions>
- <RowDefinition Height="Auto" />
- <RowDefinition Height="Auto" />
- <RowDefinition Height="Auto" />
- <RowDefinition Height="*" />
- <RowDefinition Height="Auto" />
- </Grid.RowDefinitions>
- <Grid.ColumnDefinitions>
- <ColumnDefinition Width="*" />
- <ColumnDefinition Width="*" />
- </Grid.ColumnDefinitions>
- <TextBlock
- Grid.Row="1"
- Grid.Column="0"
- Grid.ColumnSpan="2"
- MaxWidth="500"
- Margin="20,15,20,5"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- LineHeight="18"
- Text="{Binding Heading}"
- TextAlignment="Center"
- TextWrapping="Wrap" />
- <TextBlock
- Grid.Row="2"
- Grid.Column="0"
- MaxWidth="500"
- Margin="140,15,20,5"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- LineHeight="30"
- Text="{locale:Locale BuildId}"
- TextAlignment="Center"
- TextWrapping="Wrap" />
- <TextBox
- Grid.Row="2"
- Grid.Column="1"
- Margin="0,5,110,5"
- MinWidth="160"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- Text="{Binding BuildId}"
- IsReadOnly="True" />
- <Border
- Grid.Row="3"
- Grid.Column="0"
- Grid.ColumnSpan="2"
- Margin="5"
- HorizontalAlignment="Stretch"
- VerticalAlignment="Stretch"
- BorderBrush="Gray"
- BorderThickness="1">
- <TreeView
- Name="CheatsView"
- MinHeight="300"
- HorizontalAlignment="Stretch"
- VerticalAlignment="Stretch"
- ItemsSource="{Binding LoadedCheats}">
- <TreeView.Styles>
- <Styles>
- <Style Selector="TreeViewItem:empty /template/ ItemsPresenter">
- <Setter Property="IsVisible" Value="False" />
- </Style>
- </Styles>
- </TreeView.Styles>
- <TreeView.ItemTemplate>
- <TreeDataTemplate ItemsSource="{Binding SubNodes}">
- <StackPanel HorizontalAlignment="Left" Orientation="Horizontal">
- <CheckBox MinWidth="20" IsChecked="{Binding IsEnabled}" />
- <TextBlock Width="150" Text="{Binding CleanName}" IsVisible="{Binding !IsRootNode}" />
- <TextBlock Width="150" Text="{Binding BuildId}" IsVisible="{Binding IsRootNode}" />
- <TextBlock Text="{Binding Path}" IsVisible="{Binding IsRootNode}" />
- </StackPanel>
- </TreeDataTemplate>
- </TreeView.ItemTemplate>
- </TreeView>
- </Border>
- <DockPanel
- Grid.Row="4"
- Grid.Column="0"
- Grid.ColumnSpan="2"
- Margin="0"
- HorizontalAlignment="Stretch">
- <DockPanel Margin="0" HorizontalAlignment="Right">
- <Button
- Name="SaveButton"
- MinWidth="90"
- Margin="5"
- Command="{Binding Save}"
- IsVisible="{Binding !NoCheatsFound}">
- <TextBlock Text="{locale:Locale SettingsButtonSave}" />
- </Button>
- <Button
- Name="CancelButton"
- MinWidth="90"
- Margin="5"
- Command="{Binding Close}">
- <TextBlock Text="{locale:Locale InputDialogCancel}" />
- </Button>
- </DockPanel>
- </DockPanel>
- </Grid>
-</window:StyleableWindow>
diff --git a/src/Ryujinx.Ava/UI/Windows/CheatWindow.axaml.cs b/src/Ryujinx.Ava/UI/Windows/CheatWindow.axaml.cs
deleted file mode 100644
index d78e48a4..00000000
--- a/src/Ryujinx.Ava/UI/Windows/CheatWindow.axaml.cs
+++ /dev/null
@@ -1,123 +0,0 @@
-using Avalonia.Collections;
-using Ryujinx.Ava.Common.Locale;
-using Ryujinx.Ava.UI.Models;
-using Ryujinx.HLE.FileSystem;
-using Ryujinx.HLE.HOS;
-using Ryujinx.UI.App.Common;
-using System;
-using System.Collections.Generic;
-using System.Globalization;
-using System.IO;
-using System.Linq;
-
-namespace Ryujinx.Ava.UI.Windows
-{
- public partial class CheatWindow : StyleableWindow
- {
- private readonly string _enabledCheatsPath;
- public bool NoCheatsFound { get; }
-
- public AvaloniaList<CheatNode> LoadedCheats { get; }
-
- public string Heading { get; }
- public string BuildId { get; }
-
- public CheatWindow()
- {
- DataContext = this;
-
- InitializeComponent();
-
- Title = $"Ryujinx {Program.Version} - " + LocaleManager.Instance[LocaleKeys.CheatWindowTitle];
- }
-
- public CheatWindow(VirtualFileSystem virtualFileSystem, string titleId, string titleName, string titlePath)
- {
- LoadedCheats = new AvaloniaList<CheatNode>();
-
- Heading = LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.CheatWindowHeading, titleName, titleId.ToUpper());
- BuildId = ApplicationData.GetApplicationBuildId(virtualFileSystem, titlePath);
-
- InitializeComponent();
-
- string modsBasePath = ModLoader.GetModsBasePath();
- string titleModsPath = ModLoader.GetApplicationDir(modsBasePath, titleId);
- ulong titleIdValue = ulong.Parse(titleId, NumberStyles.HexNumber);
-
- _enabledCheatsPath = Path.Combine(titleModsPath, "cheats", "enabled.txt");
-
- string[] enabled = Array.Empty<string>();
-
- if (File.Exists(_enabledCheatsPath))
- {
- enabled = File.ReadAllLines(_enabledCheatsPath);
- }
-
- int cheatAdded = 0;
-
- var mods = new ModLoader.ModCache();
-
- ModLoader.QueryContentsDir(mods, new DirectoryInfo(Path.Combine(modsBasePath, "contents")), titleIdValue);
-
- string currentCheatFile = string.Empty;
- string buildId = string.Empty;
-
- CheatNode currentGroup = null;
-
- foreach (var cheat in mods.Cheats)
- {
- if (cheat.Path.FullName != currentCheatFile)
- {
- currentCheatFile = cheat.Path.FullName;
- string parentPath = currentCheatFile.Replace(titleModsPath, "");
-
- buildId = Path.GetFileNameWithoutExtension(currentCheatFile).ToUpper();
- currentGroup = new CheatNode("", buildId, parentPath, true);
-
- LoadedCheats.Add(currentGroup);
- }
-
- var model = new CheatNode(cheat.Name, buildId, "", false, enabled.Contains($"{buildId}-{cheat.Name}"));
- currentGroup?.SubNodes.Add(model);
-
- cheatAdded++;
- }
-
- if (cheatAdded == 0)
- {
- NoCheatsFound = true;
- }
-
- DataContext = this;
-
- Title = $"Ryujinx {Program.Version} - " + LocaleManager.Instance[LocaleKeys.CheatWindowTitle];
- }
-
- public void Save()
- {
- if (NoCheatsFound)
- {
- return;
- }
-
- List<string> enabledCheats = new();
-
- foreach (var cheats in LoadedCheats)
- {
- foreach (var cheat in cheats.SubNodes)
- {
- if (cheat.IsEnabled)
- {
- enabledCheats.Add(cheat.BuildIdKey);
- }
- }
- }
-
- Directory.CreateDirectory(Path.GetDirectoryName(_enabledCheatsPath));
-
- File.WriteAllLines(_enabledCheatsPath, enabledCheats);
-
- Close();
- }
- }
-}
diff --git a/src/Ryujinx.Ava/UI/Windows/ContentDialogOverlayWindow.axaml b/src/Ryujinx.Ava/UI/Windows/ContentDialogOverlayWindow.axaml
deleted file mode 100644
index 8b52bade..00000000
--- a/src/Ryujinx.Ava/UI/Windows/ContentDialogOverlayWindow.axaml
+++ /dev/null
@@ -1,25 +0,0 @@
-<window:StyleableWindow
- 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:window="clr-namespace:Ryujinx.Ava.UI.Windows"
- mc:Ignorable="d"
- d:DesignWidth="800"
- d:DesignHeight="450"
- x:Class="Ryujinx.Ava.UI.Windows.ContentDialogOverlayWindow"
- Title="ContentDialogOverlayWindow"
- Focusable="False">
- <window:StyleableWindow.Styles>
- <Style Selector="ui|ContentDialog /template/ Panel#LayoutRoot">
- <Setter Property="Background"
- Value="Transparent" />
- </Style>
- </window:StyleableWindow.Styles>
- <ui:ContentDialog Name="ContentDialog"
- IsPrimaryButtonEnabled="True"
- IsSecondaryButtonEnabled="True"
- IsVisible="False"
- Focusable="True"/>
-</window:StyleableWindow>
diff --git a/src/Ryujinx.Ava/UI/Windows/ContentDialogOverlayWindow.axaml.cs b/src/Ryujinx.Ava/UI/Windows/ContentDialogOverlayWindow.axaml.cs
deleted file mode 100644
index 2b12d72f..00000000
--- a/src/Ryujinx.Ava/UI/Windows/ContentDialogOverlayWindow.axaml.cs
+++ /dev/null
@@ -1,21 +0,0 @@
-using Avalonia.Controls;
-using Avalonia.Media;
-
-namespace Ryujinx.Ava.UI.Windows
-{
- public partial class ContentDialogOverlayWindow : StyleableWindow
- {
- public ContentDialogOverlayWindow()
- {
- InitializeComponent();
-
- ExtendClientAreaToDecorationsHint = true;
- TransparencyLevelHint = new[] { WindowTransparencyLevel.Transparent };
- WindowStartupLocation = WindowStartupLocation.Manual;
- SystemDecorations = SystemDecorations.None;
- ExtendClientAreaTitleBarHeightHint = 0;
- Background = Brushes.Transparent;
- CanResize = false;
- }
- }
-}
diff --git a/src/Ryujinx.Ava/UI/Windows/DownloadableContentManagerWindow.axaml b/src/Ryujinx.Ava/UI/Windows/DownloadableContentManagerWindow.axaml
deleted file mode 100644
index 99cf28e7..00000000
--- a/src/Ryujinx.Ava/UI/Windows/DownloadableContentManagerWindow.axaml
+++ /dev/null
@@ -1,192 +0,0 @@
-<UserControl
- x:Class="Ryujinx.Ava.UI.Windows.DownloadableContentManagerWindow"
- xmlns="https://github.com/avaloniaui"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
- xmlns:locale="clr-namespace:Ryujinx.Ava.Common.Locale"
- xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
- xmlns:viewModels="clr-namespace:Ryujinx.Ava.UI.ViewModels"
- xmlns:models="clr-namespace:Ryujinx.Ava.UI.Models"
- xmlns:ui="clr-namespace:FluentAvalonia.UI.Controls;assembly=FluentAvalonia"
- Width="500"
- Height="380"
- mc:Ignorable="d"
- x:DataType="viewModels:DownloadableContentManagerViewModel"
- Focusable="True">
- <Grid>
- <Grid.RowDefinitions>
- <RowDefinition Height="Auto" />
- <RowDefinition Height="*" />
- <RowDefinition Height="Auto" />
- </Grid.RowDefinitions>
- <Panel
- Margin="0 0 0 10"
- Grid.Row="0">
- <Grid>
- <Grid.ColumnDefinitions>
- <ColumnDefinition Width="Auto" />
- <ColumnDefinition Width="Auto" />
- <ColumnDefinition Width="*" />
- </Grid.ColumnDefinitions>
- <TextBlock
- Grid.Column="0"
- Text="{Binding UpdateCount}" />
- <StackPanel
- Margin="10 0"
- Grid.Column="1"
- Orientation="Horizontal">
- <Button
- Name="EnableAllButton"
- MinWidth="90"
- Margin="5"
- Command="{Binding EnableAll}">
- <TextBlock Text="{locale:Locale DlcManagerEnableAllButton}" />
- </Button>
- <Button
- Name="DisableAllButton"
- MinWidth="90"
- Margin="5"
- Command="{Binding DisableAll}">
- <TextBlock Text="{locale:Locale DlcManagerDisableAllButton}" />
- </Button>
- </StackPanel>
- <TextBox
- Grid.Column="2"
- MinHeight="29"
- MaxHeight="29"
- HorizontalAlignment="Stretch"
- Watermark="{locale:Locale Search}"
- Text="{Binding Search}" />
- </Grid>
- </Panel>
- <Border
- Grid.Row="1"
- Margin="0 0 0 24"
- HorizontalAlignment="Stretch"
- VerticalAlignment="Stretch"
- BorderBrush="{DynamicResource AppListHoverBackgroundColor}"
- BorderThickness="1"
- CornerRadius="5"
- Padding="2.5">
- <ListBox
- AutoScrollToSelectedItem="False"
- SelectionMode="Multiple, Toggle"
- Background="Transparent"
- SelectionChanged="OnSelectionChanged"
- SelectedItems="{Binding SelectedDownloadableContents, Mode=TwoWay}"
- ItemsSource="{Binding Views}">
- <ListBox.DataTemplates>
- <DataTemplate
- DataType="models:DownloadableContentModel">
- <Panel Margin="10">
- <Grid>
- <Grid.ColumnDefinitions>
- <ColumnDefinition Width="*" />
- <ColumnDefinition Width="Auto" />
- </Grid.ColumnDefinitions>
- <Grid
- Grid.Column="0">
- <Grid.ColumnDefinitions>
- <ColumnDefinition Width="*" />
- <ColumnDefinition Width="Auto" />
- </Grid.ColumnDefinitions>
- <TextBlock
- Grid.Column="0"
- HorizontalAlignment="Left"
- VerticalAlignment="Center"
- MaxLines="2"
- TextWrapping="Wrap"
- TextTrimming="CharacterEllipsis"
- Text="{Binding FileName}" />
- <TextBlock
- Grid.Column="1"
- Margin="10 0"
- HorizontalAlignment="Left"
- VerticalAlignment="Center"
- Text="{Binding TitleId}" />
- </Grid>
- <StackPanel
- Grid.Column="1"
- Spacing="10"
- Orientation="Horizontal"
- HorizontalAlignment="Right">
- <Button
- VerticalAlignment="Center"
- HorizontalAlignment="Right"
- Padding="10"
- MinWidth="0"
- MinHeight="0"
- Click="OpenLocation">
- <ui:SymbolIcon
- Symbol="OpenFolder"
- HorizontalAlignment="Center"
- VerticalAlignment="Center" />
- </Button>
- <Button
- VerticalAlignment="Center"
- HorizontalAlignment="Right"
- Padding="10"
- MinWidth="0"
- MinHeight="0"
- Click="RemoveDLC">
- <ui:SymbolIcon
- Symbol="Cancel"
- HorizontalAlignment="Center"
- VerticalAlignment="Center" />
- </Button>
- </StackPanel>
- </Grid>
- </Panel>
- </DataTemplate>
- </ListBox.DataTemplates>
- <ListBox.Styles>
- <Style Selector="ListBoxItem">
- <Setter Property="Background" Value="Transparent" />
- </Style>
- </ListBox.Styles>
- </ListBox>
- </Border>
- <Panel
- Grid.Row="2"
- HorizontalAlignment="Stretch">
- <StackPanel
- Orientation="Horizontal"
- Spacing="10"
- HorizontalAlignment="Left">
- <Button
- Name="AddButton"
- MinWidth="90"
- Margin="5"
- Command="{Binding Add}">
- <TextBlock Text="{locale:Locale SettingsTabGeneralAdd}" />
- </Button>
- <Button
- Name="RemoveAllButton"
- MinWidth="90"
- Margin="5"
- Command="{Binding RemoveAll}">
- <TextBlock Text="{locale:Locale DlcManagerRemoveAllButton}" />
- </Button>
- </StackPanel>
- <StackPanel
- Orientation="Horizontal"
- Spacing="10"
- HorizontalAlignment="Right">
- <Button
- Name="SaveButton"
- MinWidth="90"
- Margin="5"
- Click="SaveAndClose">
- <TextBlock Text="{locale:Locale SettingsButtonSave}" />
- </Button>
- <Button
- Name="CancelButton"
- MinWidth="90"
- Margin="5"
- Click="Close">
- <TextBlock Text="{locale:Locale InputDialogCancel}" />
- </Button>
- </StackPanel>
- </Panel>
- </Grid>
-</UserControl>
diff --git a/src/Ryujinx.Ava/UI/Windows/DownloadableContentManagerWindow.axaml.cs b/src/Ryujinx.Ava/UI/Windows/DownloadableContentManagerWindow.axaml.cs
deleted file mode 100644
index 0c02fa0f..00000000
--- a/src/Ryujinx.Ava/UI/Windows/DownloadableContentManagerWindow.axaml.cs
+++ /dev/null
@@ -1,115 +0,0 @@
-using Avalonia.Controls;
-using Avalonia.Interactivity;
-using Avalonia.Styling;
-using FluentAvalonia.UI.Controls;
-using Ryujinx.Ava.Common.Locale;
-using Ryujinx.Ava.UI.Helpers;
-using Ryujinx.Ava.UI.Models;
-using Ryujinx.Ava.UI.ViewModels;
-using Ryujinx.HLE.FileSystem;
-using Ryujinx.UI.Common.Helper;
-using System.Threading.Tasks;
-using Button = Avalonia.Controls.Button;
-
-namespace Ryujinx.Ava.UI.Windows
-{
- public partial class DownloadableContentManagerWindow : UserControl
- {
- public DownloadableContentManagerViewModel ViewModel;
-
- public DownloadableContentManagerWindow()
- {
- DataContext = this;
-
- InitializeComponent();
- }
-
- public DownloadableContentManagerWindow(VirtualFileSystem virtualFileSystem, ulong titleId)
- {
- DataContext = ViewModel = new DownloadableContentManagerViewModel(virtualFileSystem, titleId);
-
- InitializeComponent();
- }
-
- public static async Task Show(VirtualFileSystem virtualFileSystem, ulong titleId, string titleName)
- {
- ContentDialog contentDialog = new()
- {
- PrimaryButtonText = "",
- SecondaryButtonText = "",
- CloseButtonText = "",
- Content = new DownloadableContentManagerWindow(virtualFileSystem, titleId),
- Title = string.Format(LocaleManager.Instance[LocaleKeys.DlcWindowTitle], titleName, titleId.ToString("X16")),
- };
-
- Style bottomBorder = new(x => x.OfType<Grid>().Name("DialogSpace").Child().OfType<Border>());
- bottomBorder.Setters.Add(new Setter(IsVisibleProperty, false));
-
- contentDialog.Styles.Add(bottomBorder);
-
- await ContentDialogHelper.ShowAsync(contentDialog);
- }
-
- private void SaveAndClose(object sender, RoutedEventArgs routedEventArgs)
- {
- ViewModel.Save();
- ((ContentDialog)Parent).Hide();
- }
-
- private void Close(object sender, RoutedEventArgs e)
- {
- ((ContentDialog)Parent).Hide();
- }
-
- private void RemoveDLC(object sender, RoutedEventArgs e)
- {
- if (sender is Button button)
- {
- if (button.DataContext is DownloadableContentModel model)
- {
- ViewModel.Remove(model);
- }
- }
- }
-
- private void OpenLocation(object sender, RoutedEventArgs e)
- {
- if (sender is Button button)
- {
- if (button.DataContext is DownloadableContentModel model)
- {
- OpenHelper.LocateFile(model.ContainerPath);
- }
- }
- }
-
- private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
- {
- foreach (var content in e.AddedItems)
- {
- if (content is DownloadableContentModel model)
- {
- var index = ViewModel.DownloadableContents.IndexOf(model);
-
- if (index != -1)
- {
- ViewModel.DownloadableContents[index].Enabled = true;
- }
- }
- }
-
- foreach (var content in e.RemovedItems)
- {
- if (content is DownloadableContentModel model)
- {
- var index = ViewModel.DownloadableContents.IndexOf(model);
-
- if (index != -1)
- {
- ViewModel.DownloadableContents[index].Enabled = false;
- }
- }
- }
- }
- }
-}
diff --git a/src/Ryujinx.Ava/UI/Windows/IconColorPicker.cs b/src/Ryujinx.Ava/UI/Windows/IconColorPicker.cs
deleted file mode 100644
index 4c75a5ff..00000000
--- a/src/Ryujinx.Ava/UI/Windows/IconColorPicker.cs
+++ /dev/null
@@ -1,194 +0,0 @@
-using SixLabors.ImageSharp;
-using SixLabors.ImageSharp.PixelFormats;
-using System;
-using System.Collections.Generic;
-
-namespace Ryujinx.Ava.UI.Windows
-{
- static class IconColorPicker
- {
- private const int ColorsPerLine = 64;
- private const int TotalColors = ColorsPerLine * ColorsPerLine;
-
- private const int UvQuantBits = 3;
- private const int UvQuantShift = BitsPerComponent - UvQuantBits;
-
- private const int SatQuantBits = 5;
- private const int SatQuantShift = BitsPerComponent - SatQuantBits;
-
- private const int BitsPerComponent = 8;
-
- private const int CutOffLuminosity = 64;
-
- private readonly struct PaletteColor
- {
- public int Qck { get; }
- public byte R { get; }
- public byte G { get; }
- public byte B { get; }
-
- public PaletteColor(int qck, byte r, byte g, byte b)
- {
- Qck = qck;
- R = r;
- G = g;
- B = b;
- }
- }
-
- public static Color GetFilteredColor(Image<Bgra32> image)
- {
- var color = GetColor(image).ToPixel<Bgra32>();
-
- // We don't want colors that are too dark.
- // If the color is too dark, make it brighter by reducing the range
- // and adding a constant color.
- int luminosity = GetColorApproximateLuminosity(color.R, color.G, color.B);
- if (luminosity < CutOffLuminosity)
- {
- color = Color.FromRgb(
- (byte)Math.Min(CutOffLuminosity + color.R, byte.MaxValue),
- (byte)Math.Min(CutOffLuminosity + color.G, byte.MaxValue),
- (byte)Math.Min(CutOffLuminosity + color.B, byte.MaxValue));
- }
-
- return color;
- }
-
- public static Color GetColor(Image<Bgra32> image)
- {
- var colors = new PaletteColor[TotalColors];
-
- var dominantColorBin = new Dictionary<int, int>();
-
- var buffer = GetBuffer(image);
-
- int w = image.Width;
-
- int w8 = w << 8;
- int h8 = image.Height << 8;
-
-#pragma warning disable IDE0059 // Unnecessary assignment
- int xStep = w8 / ColorsPerLine;
- int yStep = h8 / ColorsPerLine;
-#pragma warning restore IDE0059
-
- int i = 0;
- int maxHitCount = 0;
-
- for (int y = 0; y < image.Height; y++)
- {
- int yOffset = y * image.Width;
-
- for (int x = 0; x < image.Width && i < TotalColors; x++)
- {
- int offset = x + yOffset;
-
- byte cb = buffer[offset].B;
- byte cg = buffer[offset].G;
- byte cr = buffer[offset].R;
-
- var qck = GetQuantizedColorKey(cr, cg, cb);
-
- if (dominantColorBin.TryGetValue(qck, out int hitCount))
- {
- dominantColorBin[qck] = hitCount + 1;
-
- if (maxHitCount < hitCount)
- {
- maxHitCount = hitCount;
- }
- }
- else
- {
- dominantColorBin.Add(qck, 1);
- }
-
- colors[i++] = new PaletteColor(qck, cr, cg, cb);
- }
- }
-
- int highScore = -1;
- PaletteColor bestCandidate = default;
-
- for (i = 0; i < TotalColors; i++)
- {
- var score = GetColorScore(dominantColorBin, maxHitCount, colors[i]);
-
- if (highScore < score)
- {
- highScore = score;
- bestCandidate = colors[i];
- }
- }
-
- return Color.FromRgb(bestCandidate.R, bestCandidate.G, bestCandidate.B);
- }
-
- public static Bgra32[] GetBuffer(Image<Bgra32> image)
- {
- return image.TryGetSinglePixelSpan(out var data) ? data.ToArray() : Array.Empty<Bgra32>();
- }
-
- private static int GetColorScore(Dictionary<int, int> dominantColorBin, int maxHitCount, PaletteColor color)
- {
- var hitCount = dominantColorBin[color.Qck];
- var balancedHitCount = BalanceHitCount(hitCount, maxHitCount);
- var quantSat = (GetColorSaturation(color) >> SatQuantShift) << SatQuantShift;
- var value = GetColorValue(color);
-
- // If the color is rarely used on the image,
- // then chances are that theres a better candidate, even if the saturation value
- // is high. By multiplying the saturation value with a weight, we can lower
- // it if the color is almost never used (hit count is low).
- var satWeighted = quantSat;
- var satWeight = balancedHitCount << 5;
- if (satWeight < 0x100)
- {
- satWeighted = (satWeighted * satWeight) >> 8;
- }
-
- // Compute score from saturation and dominance of the color.
- // We prefer more vivid colors over dominant ones, so give more weight to the saturation.
- var score = ((satWeighted << 1) + balancedHitCount) * value;
-
- return score;
- }
-
- private static int BalanceHitCount(int hitCount, int maxHitCount)
- {
- return (hitCount << 8) / maxHitCount;
- }
-
- private static int GetColorApproximateLuminosity(byte r, byte g, byte b)
- {
- return (r + g + b) / 3;
- }
-
- private static int GetColorSaturation(PaletteColor color)
- {
- int cMax = Math.Max(Math.Max(color.R, color.G), color.B);
-
- if (cMax == 0)
- {
- return 0;
- }
-
- int cMin = Math.Min(Math.Min(color.R, color.G), color.B);
- int delta = cMax - cMin;
- return (delta << 8) / cMax;
- }
-
- private static int GetColorValue(PaletteColor color)
- {
- return Math.Max(Math.Max(color.R, color.G), color.B);
- }
-
- private static int GetQuantizedColorKey(byte r, byte g, byte b)
- {
- int u = ((-38 * r - 74 * g + 112 * b + 128) >> 8) + 128;
- int v = ((112 * r - 94 * g - 18 * b + 128) >> 8) + 128;
- return (v >> UvQuantShift) | ((u >> UvQuantShift) << UvQuantBits);
- }
- }
-}
diff --git a/src/Ryujinx.Ava/UI/Windows/MainWindow.axaml b/src/Ryujinx.Ava/UI/Windows/MainWindow.axaml
deleted file mode 100644
index 4def7c28..00000000
--- a/src/Ryujinx.Ava/UI/Windows/MainWindow.axaml
+++ /dev/null
@@ -1,205 +0,0 @@
-<window:StyleableWindow
- x:Class="Ryujinx.Ava.UI.Windows.MainWindow"
- 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:window="clr-namespace:Ryujinx.Ava.UI.Windows"
- xmlns:viewModels="clr-namespace:Ryujinx.Ava.UI.ViewModels"
- xmlns:helpers="clr-namespace:Ryujinx.Ava.UI.Helpers"
- xmlns:controls="clr-namespace:Ryujinx.Ava.UI.Controls"
- xmlns:main="clr-namespace:Ryujinx.Ava.UI.Views.Main"
- Cursor="{Binding Cursor}"
- Title="{Binding Title}"
- WindowState="{Binding WindowState}"
- Width="{Binding WindowWidth}"
- Height="{Binding WindowHeight}"
- MinWidth="1092"
- MinHeight="672"
- d:DesignHeight="720"
- d:DesignWidth="1280"
- x:DataType="viewModels:MainWindowViewModel"
- mc:Ignorable="d"
- WindowStartupLocation="Manual"
- Focusable="True">
- <Window.Styles>
- <Style Selector="TitleBar:fullscreen">
- <Setter Property="Background" Value="#000000" />
- </Style>
- </Window.Styles>
- <Design.DataContext>
- <viewModels:MainWindowViewModel />
- </Design.DataContext>
- <Window.Resources>
- <helpers:BitmapArrayValueConverter x:Key="ByteImage" />
- </Window.Resources>
- <Window.KeyBindings>
- <KeyBinding Gesture="Alt+Return" Command="{Binding ToggleFullscreen}" />
- <KeyBinding Gesture="F11" Command="{Binding ToggleFullscreen}" />
- <KeyBinding Gesture="Ctrl+Cmd+F" Command="{Binding ToggleFullscreen}" />
- <KeyBinding Gesture="F9" Command="{Binding ToggleDockMode}" />
- <KeyBinding Gesture="Escape" Command="{Binding ExitCurrentState}" />
- </Window.KeyBindings>
- <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
- <Grid.RowDefinitions>
- <RowDefinition Height="Auto" />
- <RowDefinition Height="*" />
- </Grid.RowDefinitions>
- <helpers:OffscreenTextBox Name="HiddenTextBox" Grid.Row="0" />
- <Grid
- Grid.Row="1"
- HorizontalAlignment="Stretch"
- VerticalAlignment="Stretch">
- <Grid.ColumnDefinitions>
- <ColumnDefinition Width="*" />
- </Grid.ColumnDefinitions>
- <Grid.RowDefinitions>
- <RowDefinition Height="Auto" />
- <RowDefinition Height="*" />
- <RowDefinition Height="Auto" />
- </Grid.RowDefinitions>
- <StackPanel
- Name="MenuBar"
- MinHeight="35"
- Grid.Row="0"
- Margin="0"
- HorizontalAlignment="Stretch"
- VerticalAlignment="Stretch"
- IsVisible="{Binding ShowMenuAndStatusBar}"
- Orientation="Vertical">
- <main:MainMenuBarView
- Name="MenuBarView" />
- </StackPanel>
- <ContentControl
- Name="MainContent"
- Grid.Row="1"
- Padding="0"
- HorizontalAlignment="Stretch"
- VerticalAlignment="Stretch"
- BorderBrush="{DynamicResource ThemeControlBorderColor}"
- BorderThickness="0,0,0,0"
- DockPanel.Dock="Top"
- IsVisible="{Binding ShowContent}">
- <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Name="GameLibrary">
- <Grid.RowDefinitions>
- <RowDefinition Height="Auto" />
- <RowDefinition Height="*" />
- </Grid.RowDefinitions>
- <main:MainViewControls
- Name="ViewControls"
- Grid.Row="0"/>
- <controls:ApplicationListView
- x:Name="ApplicationList"
- Grid.Row="1"
- HorizontalAlignment="Stretch"
- VerticalAlignment="Stretch"
- HorizontalContentAlignment="Stretch"
- VerticalContentAlignment="Stretch"
- IsVisible="{Binding IsList}" />
- <controls:ApplicationGridView
- x:Name="ApplicationGrid"
- Grid.Row="1"
- HorizontalAlignment="Stretch"
- VerticalAlignment="Stretch"
- HorizontalContentAlignment="Stretch"
- VerticalContentAlignment="Stretch"
- IsVisible="{Binding IsGrid}" />
- </Grid>
- </ContentControl>
- <Grid
- Grid.Row="1"
- HorizontalAlignment="Stretch"
- VerticalAlignment="Stretch"
- Background="{DynamicResource ThemeContentBackgroundColor}"
- IsVisible="{Binding ShowLoadProgress}"
- Name="LoadingView"
- ZIndex="1000">
- <Grid
- Margin="40"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- IsVisible="{Binding ShowLoadProgress}">
- <Grid.ColumnDefinitions>
- <ColumnDefinition Width="Auto" />
- <ColumnDefinition Width="*" />
- </Grid.ColumnDefinitions>
- <Border
- Grid.RowSpan="2"
- Grid.Column="0"
- Width="256"
- Height="256"
- Margin="10"
- Padding="4"
- BorderBrush="Black"
- BorderThickness="2"
- BoxShadow="4 4 32 8 #40000000"
- CornerRadius="3"
- IsVisible="{Binding ShowLoadProgress}">
- <Image
- Width="256"
- Height="256"
- IsVisible="{Binding ShowLoadProgress}"
- Source="{Binding SelectedIcon, Converter={StaticResource ByteImage}}" />
- </Border>
- <Grid
- Grid.Column="1"
- HorizontalAlignment="Stretch"
- VerticalAlignment="Center"
- IsVisible="{Binding ShowLoadProgress}">
- <Grid.RowDefinitions>
- <RowDefinition Height="Auto" />
- <RowDefinition Height="Auto" />
- <RowDefinition Height="Auto" />
- </Grid.RowDefinitions>
- <TextBlock
- Grid.Row="0"
- Margin="10"
- FontSize="30"
- FontWeight="Bold"
- IsVisible="{Binding ShowLoadProgress}"
- Text="{Binding LoadHeading}"
- TextAlignment="Start"
- TextWrapping="Wrap"
- MaxWidth="500" />
- <Border
- Grid.Row="1"
- Margin="10"
- Padding="0"
- HorizontalAlignment="Stretch"
- BorderBrush="{Binding ProgressBarBackgroundColor}"
- BorderThickness="1"
- ClipToBounds="True"
- CornerRadius="5"
- IsVisible="{Binding ShowLoadProgress}">
- <ProgressBar
- Height="10"
- MinWidth="500"
- Margin="0"
- Padding="0"
- HorizontalAlignment="Stretch"
- ClipToBounds="True"
- CornerRadius="5"
- Foreground="{Binding ProgressBarForegroundColor}"
- IsIndeterminate="{Binding IsLoadingIndeterminate}"
- IsVisible="{Binding ShowLoadProgress}"
- Maximum="{Binding ProgressMaximum}"
- Minimum="0"
- Value="{Binding ProgressValue}" />
- </Border>
- <TextBlock
- Grid.Row="2"
- Margin="10"
- FontSize="18"
- IsVisible="{Binding ShowLoadProgress}"
- Text="{Binding CacheLoadStatus}"
- TextAlignment="Start"
- MaxWidth="500" />
- </Grid>
- </Grid>
- </Grid>
- <main:MainStatusBarView
- Name="StatusBarView"
- Grid.Row="2" />
- </Grid>
- </Grid>
-</window:StyleableWindow>
diff --git a/src/Ryujinx.Ava/UI/Windows/MainWindow.axaml.cs b/src/Ryujinx.Ava/UI/Windows/MainWindow.axaml.cs
deleted file mode 100644
index 33a9af5b..00000000
--- a/src/Ryujinx.Ava/UI/Windows/MainWindow.axaml.cs
+++ /dev/null
@@ -1,551 +0,0 @@
-using Avalonia;
-using Avalonia.Controls;
-using Avalonia.Controls.Primitives;
-using Avalonia.Interactivity;
-using Avalonia.Threading;
-using FluentAvalonia.UI.Controls;
-using Ryujinx.Ava.Common;
-using Ryujinx.Ava.Common.Locale;
-using Ryujinx.Ava.Input;
-using Ryujinx.Ava.UI.Applet;
-using Ryujinx.Ava.UI.Helpers;
-using Ryujinx.Ava.UI.ViewModels;
-using Ryujinx.Common.Logging;
-using Ryujinx.Graphics.Gpu;
-using Ryujinx.HLE.FileSystem;
-using Ryujinx.HLE.HOS;
-using Ryujinx.HLE.HOS.Services.Account.Acc;
-using Ryujinx.Input.HLE;
-using Ryujinx.Input.SDL2;
-using Ryujinx.Modules;
-using Ryujinx.UI.App.Common;
-using Ryujinx.UI.Common;
-using Ryujinx.UI.Common.Configuration;
-using Ryujinx.UI.Common.Helper;
-using System;
-using System.IO;
-using System.Runtime.Versioning;
-using System.Threading;
-using System.Threading.Tasks;
-
-namespace Ryujinx.Ava.UI.Windows
-{
- public partial class MainWindow : StyleableWindow
- {
- internal static MainWindowViewModel MainWindowViewModel { get; private set; }
-
- private bool _isLoading;
-
- private UserChannelPersistence _userChannelPersistence;
- private static bool _deferLoad;
- private static string _launchPath;
- private static bool _startFullscreen;
- internal readonly AvaHostUIHandler UiHandler;
-
- public VirtualFileSystem VirtualFileSystem { get; private set; }
- public ContentManager ContentManager { get; private set; }
- public AccountManager AccountManager { get; private set; }
-
- public LibHacHorizonManager LibHacHorizonManager { get; private set; }
-
- public InputManager InputManager { get; private set; }
-
- internal MainWindowViewModel ViewModel { get; private set; }
- public SettingsWindow SettingsWindow { get; set; }
-
- public static bool ShowKeyErrorOnLoad { get; set; }
- public ApplicationLibrary ApplicationLibrary { get; set; }
-
- public MainWindow()
- {
- ViewModel = new MainWindowViewModel();
-
- MainWindowViewModel = ViewModel;
-
- DataContext = ViewModel;
-
- SetWindowSizePosition();
-
- InitializeComponent();
- Load();
-
- UiHandler = new AvaHostUIHandler(this);
-
- ViewModel.Title = $"Ryujinx {Program.Version}";
-
- // NOTE: Height of MenuBar and StatusBar is not usable here, since it would still be 0 at this point.
- double barHeight = MenuBar.MinHeight + StatusBarView.StatusBar.MinHeight;
- Height = ((Height - barHeight) / Program.WindowScaleFactor) + barHeight;
- Width /= Program.WindowScaleFactor;
-
- if (Program.PreviewerDetached)
- {
- InputManager = new InputManager(new AvaloniaKeyboardDriver(this), new SDL2GamepadDriver());
-
- this.GetObservable(IsActiveProperty).Subscribe(IsActiveChanged);
- this.ScalingChanged += OnScalingChanged;
- }
- }
-
- protected override void OnApplyTemplate(TemplateAppliedEventArgs e)
- {
- base.OnApplyTemplate(e);
-
- NotificationHelper.SetNotificationManager(this);
- }
-
- private void IsActiveChanged(bool obj)
- {
- ViewModel.IsActive = obj;
- }
-
- private void OnScalingChanged(object sender, EventArgs e)
- {
- Program.DesktopScaleFactor = this.RenderScaling;
- }
-
- private void ApplicationLibrary_ApplicationAdded(object sender, ApplicationAddedEventArgs e)
- {
- Dispatcher.UIThread.Post(() =>
- {
- ViewModel.Applications.Add(e.AppData);
- });
- }
-
- private void ApplicationLibrary_ApplicationCountUpdated(object sender, ApplicationCountUpdatedEventArgs e)
- {
- LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.StatusBarGamesLoaded, e.NumAppsLoaded, e.NumAppsFound);
-
- Dispatcher.UIThread.Post(() =>
- {
- ViewModel.StatusBarProgressValue = e.NumAppsLoaded;
- ViewModel.StatusBarProgressMaximum = e.NumAppsFound;
-
- if (e.NumAppsFound == 0)
- {
- StatusBarView.LoadProgressBar.IsVisible = false;
- }
-
- if (e.NumAppsLoaded == e.NumAppsFound)
- {
- StatusBarView.LoadProgressBar.IsVisible = false;
- }
- });
- }
-
- public void Application_Opened(object sender, ApplicationOpenedEventArgs args)
- {
- if (args.Application != null)
- {
- ViewModel.SelectedIcon = args.Application.Icon;
-
- string path = new FileInfo(args.Application.Path).FullName;
-
- ViewModel.LoadApplication(path).Wait();
- }
-
- args.Handled = true;
- }
-
- internal static void DeferLoadApplication(string launchPathArg, bool startFullscreenArg)
- {
- _deferLoad = true;
- _launchPath = launchPathArg;
- _startFullscreen = startFullscreenArg;
- }
-
- public void SwitchToGameControl(bool startFullscreen = false)
- {
- ViewModel.ShowLoadProgress = false;
- ViewModel.ShowContent = true;
- ViewModel.IsLoadingIndeterminate = false;
-
- if (startFullscreen && ViewModel.WindowState != WindowState.FullScreen)
- {
- ViewModel.ToggleFullscreen();
- }
- }
-
- public void ShowLoading(bool startFullscreen = false)
- {
- ViewModel.ShowContent = false;
- ViewModel.ShowLoadProgress = true;
- ViewModel.IsLoadingIndeterminate = true;
-
- if (startFullscreen && ViewModel.WindowState != WindowState.FullScreen)
- {
- ViewModel.ToggleFullscreen();
- }
- }
-
- private void Initialize()
- {
- _userChannelPersistence = new UserChannelPersistence();
- VirtualFileSystem = VirtualFileSystem.CreateInstance();
- LibHacHorizonManager = new LibHacHorizonManager();
- ContentManager = new ContentManager(VirtualFileSystem);
-
- LibHacHorizonManager.InitializeFsServer(VirtualFileSystem);
- LibHacHorizonManager.InitializeArpServer();
- LibHacHorizonManager.InitializeBcatServer();
- LibHacHorizonManager.InitializeSystemClients();
-
- ApplicationLibrary = new ApplicationLibrary(VirtualFileSystem);
-
- // Save data created before we supported extra data in directory save data will not work properly if
- // given empty extra data. Luckily some of that extra data can be created using the data from the
- // save data indexer, which should be enough to check access permissions for user saves.
- // Every single save data's extra data will be checked and fixed if needed each time the emulator is opened.
- // Consider removing this at some point in the future when we don't need to worry about old saves.
- VirtualFileSystem.FixExtraData(LibHacHorizonManager.RyujinxClient);
-
- AccountManager = new AccountManager(LibHacHorizonManager.RyujinxClient, CommandLineState.Profile);
-
- VirtualFileSystem.ReloadKeySet();
-
- ApplicationHelper.Initialize(VirtualFileSystem, AccountManager, LibHacHorizonManager.RyujinxClient);
- }
-
- [SupportedOSPlatform("linux")]
- private static async Task ShowVmMaxMapCountWarning()
- {
- LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.LinuxVmMaxMapCountWarningTextSecondary,
- LinuxHelper.VmMaxMapCount, LinuxHelper.RecommendedVmMaxMapCount);
-
- await ContentDialogHelper.CreateWarningDialog(
- LocaleManager.Instance[LocaleKeys.LinuxVmMaxMapCountWarningTextPrimary],
- LocaleManager.Instance[LocaleKeys.LinuxVmMaxMapCountWarningTextSecondary]
- );
- }
-
- [SupportedOSPlatform("linux")]
- private static async Task ShowVmMaxMapCountDialog()
- {
- LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.LinuxVmMaxMapCountDialogTextPrimary,
- LinuxHelper.RecommendedVmMaxMapCount);
-
- UserResult response = await ContentDialogHelper.ShowTextDialog(
- $"Ryujinx - {LocaleManager.Instance[LocaleKeys.LinuxVmMaxMapCountDialogTitle]}",
- LocaleManager.Instance[LocaleKeys.LinuxVmMaxMapCountDialogTextPrimary],
- LocaleManager.Instance[LocaleKeys.LinuxVmMaxMapCountDialogTextSecondary],
- LocaleManager.Instance[LocaleKeys.LinuxVmMaxMapCountDialogButtonUntilRestart],
- LocaleManager.Instance[LocaleKeys.LinuxVmMaxMapCountDialogButtonPersistent],
- LocaleManager.Instance[LocaleKeys.InputDialogNo],
- (int)Symbol.Help
- );
-
- int rc;
-
- switch (response)
- {
- case UserResult.Ok:
- rc = LinuxHelper.RunPkExec($"echo {LinuxHelper.RecommendedVmMaxMapCount} > {LinuxHelper.VmMaxMapCountPath}");
- if (rc == 0)
- {
- Logger.Info?.Print(LogClass.Application, $"vm.max_map_count set to {LinuxHelper.VmMaxMapCount} until the next restart.");
- }
- else
- {
- Logger.Error?.Print(LogClass.Application, $"Unable to change vm.max_map_count. Process exited with code: {rc}");
- }
- break;
- case UserResult.No:
- rc = LinuxHelper.RunPkExec($"echo \"vm.max_map_count = {LinuxHelper.RecommendedVmMaxMapCount}\" > {LinuxHelper.SysCtlConfigPath} && sysctl -p {LinuxHelper.SysCtlConfigPath}");
- if (rc == 0)
- {
- Logger.Info?.Print(LogClass.Application, $"vm.max_map_count set to {LinuxHelper.VmMaxMapCount}. Written to config: {LinuxHelper.SysCtlConfigPath}");
- }
- else
- {
- Logger.Error?.Print(LogClass.Application, $"Unable to write new value for vm.max_map_count to config. Process exited with code: {rc}");
- }
- break;
- }
- }
-
- private async Task CheckLaunchState()
- {
- if (OperatingSystem.IsLinux() && LinuxHelper.VmMaxMapCount < LinuxHelper.RecommendedVmMaxMapCount)
- {
- Logger.Warning?.Print(LogClass.Application, $"The value of vm.max_map_count is lower than {LinuxHelper.RecommendedVmMaxMapCount}. ({LinuxHelper.VmMaxMapCount})");
-
- if (LinuxHelper.PkExecPath is not null)
- {
- await Dispatcher.UIThread.InvokeAsync(ShowVmMaxMapCountDialog);
- }
- else
- {
- await Dispatcher.UIThread.InvokeAsync(ShowVmMaxMapCountWarning);
- }
- }
-
- if (!ShowKeyErrorOnLoad)
- {
- if (_deferLoad)
- {
- _deferLoad = false;
-
- ViewModel.LoadApplication(_launchPath, _startFullscreen).Wait();
- }
- }
- else
- {
- ShowKeyErrorOnLoad = false;
-
- await Dispatcher.UIThread.InvokeAsync(async () => await UserErrorDialog.ShowUserErrorDialog(UserError.NoKeys));
- }
-
- if (ConfigurationState.Instance.CheckUpdatesOnStart.Value && Updater.CanUpdate(false))
- {
- await Updater.BeginParse(this, false).ContinueWith(task =>
- {
- Logger.Error?.Print(LogClass.Application, $"Updater Error: {task.Exception}");
- }, TaskContinuationOptions.OnlyOnFaulted);
- }
- }
-
- private void Load()
- {
- StatusBarView.VolumeStatus.Click += VolumeStatus_CheckedChanged;
-
- ApplicationGrid.ApplicationOpened += Application_Opened;
-
- ApplicationGrid.DataContext = ViewModel;
-
- ApplicationList.ApplicationOpened += Application_Opened;
-
- ApplicationList.DataContext = ViewModel;
- }
-
- private void SetWindowSizePosition()
- {
- PixelPoint savedPoint = new(ConfigurationState.Instance.UI.WindowStartup.WindowPositionX,
- ConfigurationState.Instance.UI.WindowStartup.WindowPositionY);
-
- ViewModel.WindowHeight = ConfigurationState.Instance.UI.WindowStartup.WindowSizeHeight * Program.WindowScaleFactor;
- ViewModel.WindowWidth = ConfigurationState.Instance.UI.WindowStartup.WindowSizeWidth * Program.WindowScaleFactor;
-
- ViewModel.WindowState = ConfigurationState.Instance.UI.WindowStartup.WindowMaximized.Value ? WindowState.Maximized : WindowState.Normal;
-
- if (CheckScreenBounds(savedPoint))
- {
- Position = savedPoint;
- }
- else
- {
- WindowStartupLocation = WindowStartupLocation.CenterScreen;
- }
- }
-
- private bool CheckScreenBounds(PixelPoint configPoint)
- {
- for (int i = 0; i < Screens.ScreenCount; i++)
- {
- if (Screens.All[i].Bounds.Contains(configPoint))
- {
- return true;
- }
- }
-
- Logger.Warning?.Print(LogClass.Application, "Failed to find valid start-up coordinates. Defaulting to primary monitor center.");
- return false;
- }
-
- private void SaveWindowSizePosition()
- {
- ConfigurationState.Instance.UI.WindowStartup.WindowSizeHeight.Value = (int)Height;
- ConfigurationState.Instance.UI.WindowStartup.WindowSizeWidth.Value = (int)Width;
-
- ConfigurationState.Instance.UI.WindowStartup.WindowPositionX.Value = Position.X;
- ConfigurationState.Instance.UI.WindowStartup.WindowPositionY.Value = Position.Y;
-
- ConfigurationState.Instance.UI.WindowStartup.WindowMaximized.Value = WindowState == WindowState.Maximized;
-
- MainWindowViewModel.SaveConfig();
- }
-
- protected override void OnOpened(EventArgs e)
- {
- base.OnOpened(e);
-
- Initialize();
-
- ViewModel.Initialize(
- ContentManager,
- StorageProvider,
- ApplicationLibrary,
- VirtualFileSystem,
- AccountManager,
- InputManager,
- _userChannelPersistence,
- LibHacHorizonManager,
- UiHandler,
- ShowLoading,
- SwitchToGameControl,
- SetMainContent,
- this);
-
- ApplicationLibrary.ApplicationCountUpdated += ApplicationLibrary_ApplicationCountUpdated;
- ApplicationLibrary.ApplicationAdded += ApplicationLibrary_ApplicationAdded;
-
- ViewModel.RefreshFirmwareStatus();
-
- LoadApplications();
-
-#pragma warning disable CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed
- CheckLaunchState();
-#pragma warning restore CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed
- }
-
- private void SetMainContent(Control content = null)
- {
- content ??= GameLibrary;
-
- if (MainContent.Content != content)
- {
- MainContent.Content = content;
- }
- }
-
- public static void UpdateGraphicsConfig()
- {
-#pragma warning disable IDE0055 // Disable formatting
- GraphicsConfig.ResScale = ConfigurationState.Instance.Graphics.ResScale == -1 ? ConfigurationState.Instance.Graphics.ResScaleCustom : ConfigurationState.Instance.Graphics.ResScale;
- GraphicsConfig.MaxAnisotropy = ConfigurationState.Instance.Graphics.MaxAnisotropy;
- GraphicsConfig.ShadersDumpPath = ConfigurationState.Instance.Graphics.ShadersDumpPath;
- GraphicsConfig.EnableShaderCache = ConfigurationState.Instance.Graphics.EnableShaderCache;
- GraphicsConfig.EnableTextureRecompression = ConfigurationState.Instance.Graphics.EnableTextureRecompression;
- GraphicsConfig.EnableMacroHLE = ConfigurationState.Instance.Graphics.EnableMacroHLE;
-#pragma warning restore IDE0055
- }
-
- private void VolumeStatus_CheckedChanged(object sender, RoutedEventArgs e)
- {
- var volumeSplitButton = sender as ToggleSplitButton;
- if (ViewModel.IsGameRunning)
- {
- if (!volumeSplitButton.IsChecked)
- {
- ViewModel.AppHost.Device.SetVolume(ViewModel.VolumeBeforeMute);
- }
- else
- {
- ViewModel.VolumeBeforeMute = ViewModel.AppHost.Device.GetVolume();
- ViewModel.AppHost.Device.SetVolume(0);
- }
-
- ViewModel.Volume = ViewModel.AppHost.Device.GetVolume();
- }
- }
-
- protected override void OnClosing(WindowClosingEventArgs e)
- {
- if (!ViewModel.IsClosing && ViewModel.AppHost != null && ConfigurationState.Instance.ShowConfirmExit)
- {
- e.Cancel = true;
-
- ConfirmExit();
-
- return;
- }
-
- ViewModel.IsClosing = true;
-
- if (ViewModel.AppHost != null)
- {
- ViewModel.AppHost.AppExit -= ViewModel.AppHost_AppExit;
- ViewModel.AppHost.AppExit += (sender, e) =>
- {
- ViewModel.AppHost = null;
-
- Dispatcher.UIThread.Post(() =>
- {
- MainContent = null;
-
- Close();
- });
- };
- ViewModel.AppHost?.Stop();
-
- e.Cancel = true;
-
- return;
- }
-
- SaveWindowSizePosition();
-
- ApplicationLibrary.CancelLoading();
- InputManager.Dispose();
- Program.Exit();
-
- base.OnClosing(e);
- }
-
- private void ConfirmExit()
- {
- Dispatcher.UIThread.InvokeAsync(async () =>
- {
- ViewModel.IsClosing = await ContentDialogHelper.CreateExitDialog();
-
- if (ViewModel.IsClosing)
- {
- Close();
- }
- });
- }
-
- public void LoadApplications()
- {
- ViewModel.Applications.Clear();
-
- StatusBarView.LoadProgressBar.IsVisible = true;
- ViewModel.StatusBarProgressMaximum = 0;
- ViewModel.StatusBarProgressValue = 0;
-
- LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.StatusBarGamesLoaded, 0, 0);
-
- ReloadGameList();
- }
-
- public void ToggleFileType(string fileType)
- {
- _ = fileType switch
- {
-#pragma warning disable IDE0055 // Disable formatting
- "NSP" => ConfigurationState.Instance.UI.ShownFileTypes.NSP.Value = !ConfigurationState.Instance.UI.ShownFileTypes.NSP,
- "PFS0" => ConfigurationState.Instance.UI.ShownFileTypes.PFS0.Value = !ConfigurationState.Instance.UI.ShownFileTypes.PFS0,
- "XCI" => ConfigurationState.Instance.UI.ShownFileTypes.XCI.Value = !ConfigurationState.Instance.UI.ShownFileTypes.XCI,
- "NCA" => ConfigurationState.Instance.UI.ShownFileTypes.NCA.Value = !ConfigurationState.Instance.UI.ShownFileTypes.NCA,
- "NRO" => ConfigurationState.Instance.UI.ShownFileTypes.NRO.Value = !ConfigurationState.Instance.UI.ShownFileTypes.NRO,
- "NSO" => ConfigurationState.Instance.UI.ShownFileTypes.NSO.Value = !ConfigurationState.Instance.UI.ShownFileTypes.NSO,
- _ => throw new ArgumentOutOfRangeException(fileType),
-#pragma warning restore IDE0055
- };
-
- ConfigurationState.Instance.ToFileFormat().SaveConfig(Program.ConfigurationPath);
- LoadApplications();
- }
-
- private void ReloadGameList()
- {
- if (_isLoading)
- {
- return;
- }
-
- _isLoading = true;
-
- Thread applicationLibraryThread = new(() =>
- {
- ApplicationLibrary.LoadApplications(ConfigurationState.Instance.UI.GameDirs, ConfigurationState.Instance.System.Language);
-
- _isLoading = false;
- })
- {
- Name = "GUI.ApplicationLibraryThread",
- IsBackground = true,
- };
- applicationLibraryThread.Start();
- }
- }
-}
diff --git a/src/Ryujinx.Ava/UI/Windows/ModManagerWindow.axaml b/src/Ryujinx.Ava/UI/Windows/ModManagerWindow.axaml
deleted file mode 100644
index 0ed05ce3..00000000
--- a/src/Ryujinx.Ava/UI/Windows/ModManagerWindow.axaml
+++ /dev/null
@@ -1,179 +0,0 @@
-<UserControl
- xmlns="https://github.com/avaloniaui"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
- xmlns:locale="clr-namespace:Ryujinx.Ava.Common.Locale"
- xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
- xmlns:viewModels="clr-namespace:Ryujinx.Ava.UI.ViewModels"
- xmlns:models="clr-namespace:Ryujinx.Ava.UI.Models"
- xmlns:ui="clr-namespace:FluentAvalonia.UI.Controls;assembly=FluentAvalonia"
- Width="500"
- Height="380"
- mc:Ignorable="d"
- x:Class="Ryujinx.Ava.UI.Windows.ModManagerWindow"
- x:CompileBindings="True"
- x:DataType="viewModels:ModManagerViewModel"
- Focusable="True">
- <Grid>
- <Grid.RowDefinitions>
- <RowDefinition Height="Auto" />
- <RowDefinition Height="*" />
- <RowDefinition Height="Auto" />
- </Grid.RowDefinitions>
- <Panel
- Margin="0 0 0 10"
- Grid.Row="0">
- <Grid>
- <Grid.ColumnDefinitions>
- <ColumnDefinition Width="Auto" />
- <ColumnDefinition Width="Auto" />
- <ColumnDefinition Width="*" />
- </Grid.ColumnDefinitions>
- <TextBlock
- Grid.Column="0"
- Text="{Binding ModCount}" />
- <StackPanel
- Margin="10 0"
- Grid.Column="1"
- Orientation="Horizontal">
- <Button
- Name="EnableAllButton"
- MinWidth="90"
- Margin="5"
- Command="{Binding EnableAll}">
- <TextBlock Text="{locale:Locale DlcManagerEnableAllButton}" />
- </Button>
- <Button
- Name="DisableAllButton"
- MinWidth="90"
- Margin="5"
- Command="{Binding DisableAll}">
- <TextBlock Text="{locale:Locale DlcManagerDisableAllButton}" />
- </Button>
- </StackPanel>
- <TextBox
- Grid.Column="2"
- MinHeight="27"
- MaxHeight="27"
- HorizontalAlignment="Stretch"
- Watermark="{locale:Locale Search}"
- Text="{Binding Search}" />
- </Grid>
- </Panel>
- <Border
- Grid.Row="1"
- Margin="0 0 0 24"
- HorizontalAlignment="Stretch"
- VerticalAlignment="Stretch"
- BorderBrush="{DynamicResource AppListHoverBackgroundColor}"
- BorderThickness="1"
- CornerRadius="5"
- Padding="2.5">
- <ListBox
- AutoScrollToSelectedItem="False"
- SelectionMode="Multiple, Toggle"
- Background="Transparent"
- SelectionChanged="OnSelectionChanged"
- SelectedItems="{Binding SelectedMods, Mode=TwoWay}"
- ItemsSource="{Binding Views}">
- <ListBox.DataTemplates>
- <DataTemplate
- DataType="models:ModModel">
- <Panel Margin="10">
- <Grid>
- <Grid.ColumnDefinitions>
- <ColumnDefinition Width="*" />
- <ColumnDefinition Width="Auto" />
- </Grid.ColumnDefinitions>
- <TextBlock
- HorizontalAlignment="Left"
- VerticalAlignment="Center"
- MaxLines="2"
- TextWrapping="Wrap"
- TextTrimming="CharacterEllipsis"
- Text="{Binding Name}" />
- <StackPanel
- Grid.Column="1"
- Spacing="10"
- Orientation="Horizontal"
- HorizontalAlignment="Right">
- <Button
- VerticalAlignment="Center"
- HorizontalAlignment="Right"
- Padding="10"
- MinWidth="0"
- MinHeight="0"
- Click="OpenLocation">
- <ui:SymbolIcon
- Symbol="OpenFolder"
- HorizontalAlignment="Center"
- VerticalAlignment="Center" />
- </Button>
- <Button
- VerticalAlignment="Center"
- HorizontalAlignment="Right"
- Padding="10"
- MinWidth="0"
- MinHeight="0"
- Click="DeleteMod">
- <ui:SymbolIcon
- Symbol="Cancel"
- HorizontalAlignment="Center"
- VerticalAlignment="Center" />
- </Button>
- </StackPanel>
- </Grid>
- </Panel>
- </DataTemplate>
- </ListBox.DataTemplates>
- <ListBox.Styles>
- <Style Selector="ListBoxItem">
- <Setter Property="Background" Value="Transparent" />
- </Style>
- </ListBox.Styles>
- </ListBox>
- </Border>
- <Panel
- Grid.Row="2"
- HorizontalAlignment="Stretch">
- <StackPanel
- Orientation="Horizontal"
- Spacing="10"
- HorizontalAlignment="Left">
- <Button
- Name="AddButton"
- MinWidth="90"
- Margin="5"
- Command="{Binding Add}">
- <TextBlock Text="{locale:Locale SettingsTabGeneralAdd}" />
- </Button>
- <Button
- Name="RemoveAllButton"
- MinWidth="90"
- Margin="5"
- Click="DeleteAll">
- <TextBlock Text="{locale:Locale ModManagerDeleteAllButton}" />
- </Button>
- </StackPanel>
- <StackPanel
- Orientation="Horizontal"
- Spacing="10"
- HorizontalAlignment="Right">
- <Button
- Name="SaveButton"
- MinWidth="90"
- Margin="5"
- Click="SaveAndClose">
- <TextBlock Text="{locale:Locale SettingsButtonSave}" />
- </Button>
- <Button
- Name="CancelButton"
- MinWidth="90"
- Margin="5"
- Click="Close">
- <TextBlock Text="{locale:Locale InputDialogCancel}" />
- </Button>
- </StackPanel>
- </Panel>
- </Grid>
-</UserControl>
diff --git a/src/Ryujinx.Ava/UI/Windows/ModManagerWindow.axaml.cs b/src/Ryujinx.Ava/UI/Windows/ModManagerWindow.axaml.cs
deleted file mode 100644
index d9ae0d4f..00000000
--- a/src/Ryujinx.Ava/UI/Windows/ModManagerWindow.axaml.cs
+++ /dev/null
@@ -1,139 +0,0 @@
-using Avalonia.Controls;
-using Avalonia.Interactivity;
-using Avalonia.Styling;
-using FluentAvalonia.UI.Controls;
-using Ryujinx.Ava.Common.Locale;
-using Ryujinx.Ava.UI.Helpers;
-using Ryujinx.Ava.UI.Models;
-using Ryujinx.Ava.UI.ViewModels;
-using Ryujinx.UI.Common.Helper;
-using System.Threading.Tasks;
-using Button = Avalonia.Controls.Button;
-
-namespace Ryujinx.Ava.UI.Windows
-{
- public partial class ModManagerWindow : UserControl
- {
- public ModManagerViewModel ViewModel;
-
- public ModManagerWindow()
- {
- DataContext = this;
-
- InitializeComponent();
- }
-
- public ModManagerWindow(ulong titleId)
- {
- DataContext = ViewModel = new ModManagerViewModel(titleId);
-
- InitializeComponent();
- }
-
- public static async Task Show(ulong titleId, string titleName)
- {
- ContentDialog contentDialog = new()
- {
- PrimaryButtonText = "",
- SecondaryButtonText = "",
- CloseButtonText = "",
- Content = new ModManagerWindow(titleId),
- Title = string.Format(LocaleManager.Instance[LocaleKeys.ModWindowHeading], titleName, titleId.ToString("X16")),
- };
-
- Style bottomBorder = new(x => x.OfType<Grid>().Name("DialogSpace").Child().OfType<Border>());
- bottomBorder.Setters.Add(new Setter(IsVisibleProperty, false));
-
- contentDialog.Styles.Add(bottomBorder);
-
- await contentDialog.ShowAsync();
- }
-
- private void SaveAndClose(object sender, RoutedEventArgs e)
- {
- ViewModel.Save();
- ((ContentDialog)Parent).Hide();
- }
-
- private void Close(object sender, RoutedEventArgs e)
- {
- ((ContentDialog)Parent).Hide();
- }
-
- private async void DeleteMod(object sender, RoutedEventArgs e)
- {
- if (sender is Button button)
- {
- if (button.DataContext is ModModel model)
- {
- var result = await ContentDialogHelper.CreateConfirmationDialog(
- LocaleManager.Instance[LocaleKeys.DialogWarning],
- LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogModManagerDeletionWarningMessage, model.Name),
- LocaleManager.Instance[LocaleKeys.InputDialogYes],
- LocaleManager.Instance[LocaleKeys.InputDialogNo],
- LocaleManager.Instance[LocaleKeys.RyujinxConfirm]);
-
- if (result == UserResult.Yes)
- {
- ViewModel.Delete(model);
- }
- }
- }
- }
-
- private async void DeleteAll(object sender, RoutedEventArgs e)
- {
- var result = await ContentDialogHelper.CreateConfirmationDialog(
- LocaleManager.Instance[LocaleKeys.DialogWarning],
- LocaleManager.Instance[LocaleKeys.DialogModManagerDeletionAllWarningMessage],
- LocaleManager.Instance[LocaleKeys.InputDialogYes],
- LocaleManager.Instance[LocaleKeys.InputDialogNo],
- LocaleManager.Instance[LocaleKeys.RyujinxConfirm]);
-
- if (result == UserResult.Yes)
- {
- ViewModel.DeleteAll();
- }
- }
-
- private void OpenLocation(object sender, RoutedEventArgs e)
- {
- if (sender is Button button)
- {
- if (button.DataContext is ModModel model)
- {
- OpenHelper.OpenFolder(model.Path);
- }
- }
- }
-
- private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
- {
- foreach (var content in e.AddedItems)
- {
- if (content is ModModel model)
- {
- var index = ViewModel.Mods.IndexOf(model);
-
- if (index != -1)
- {
- ViewModel.Mods[index].Enabled = true;
- }
- }
- }
-
- foreach (var content in e.RemovedItems)
- {
- if (content is ModModel model)
- {
- var index = ViewModel.Mods.IndexOf(model);
-
- if (index != -1)
- {
- ViewModel.Mods[index].Enabled = false;
- }
- }
- }
- }
- }
-}
diff --git a/src/Ryujinx.Ava/UI/Windows/SettingsWindow.axaml b/src/Ryujinx.Ava/UI/Windows/SettingsWindow.axaml
deleted file mode 100644
index 40cac90d..00000000
--- a/src/Ryujinx.Ava/UI/Windows/SettingsWindow.axaml
+++ /dev/null
@@ -1,130 +0,0 @@
-<window:StyleableWindow
- x:Class="Ryujinx.Ava.UI.Windows.SettingsWindow"
- xmlns="https://github.com/avaloniaui"
- xmlns:ui="clr-namespace:FluentAvalonia.UI.Controls;assembly=FluentAvalonia"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- 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: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"
- MinWidth="800"
- MinHeight="480"
- WindowStartupLocation="CenterOwner"
- x:DataType="viewModels:SettingsViewModel"
- mc:Ignorable="d"
- Focusable="True">
- <Design.DataContext>
- <viewModels:SettingsViewModel />
- </Design.DataContext>
- <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" MinWidth="600">
- <Grid.RowDefinitions>
- <RowDefinition Height="Auto" />
- <RowDefinition />
- <RowDefinition Height="Auto" />
- </Grid.RowDefinitions>
- <ContentPresenter
- x:Name="ContentPresenter"
- Grid.Row="1"
- IsVisible="False"
- KeyboardNavigation.IsTabStop="False"/>
- <Grid Name="Pages" IsVisible="False" Grid.Row="2">
- <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"
- Name="NavPanel"
- IsBackEnabled="False"
- PaneDisplayMode="Left"
- Margin="2,10,10,0"
- VerticalAlignment="Stretch"
- HorizontalAlignment="Stretch"
- OpenPaneLength="200">
- <ui:NavigationView.MenuItems>
- <ui:NavigationViewItem
- IsSelected="True"
- Content="{locale:Locale SettingsTabGeneral}"
- Tag="UiPage"
- IconSource="New" />
- <ui:NavigationViewItem
- Content="{locale:Locale SettingsTabInput}"
- Tag="InputPage"
- IconSource="Games" />
- <ui:NavigationViewItem
- Content="{locale:Locale SettingsTabHotkeys}"
- Tag="HotkeysPage"
- IconSource="Keyboard" />
- <ui:NavigationViewItem
- Content="{locale:Locale SettingsTabSystem}"
- Tag="SystemPage"
- IconSource="Settings" />
- <ui:NavigationViewItem
- Content="{locale:Locale SettingsTabCpu}"
- Tag="CpuPage">
- <ui:NavigationViewItem.IconSource>
- <ui:FontIconSource
- FontFamily="avares://Ryujinx.Ava/Assets/Fonts#Segoe Fluent Icons"
- Glyph="{helpers:GlyphValueConverter Chip}" />
- </ui:NavigationViewItem.IconSource>
- </ui:NavigationViewItem>
- <ui:NavigationViewItem
- Content="{locale:Locale SettingsTabGraphics}"
- Tag="GraphicsPage"
- IconSource="Image" />
- <ui:NavigationViewItem
- Content="{locale:Locale SettingsTabAudio}"
- IconSource="Audio"
- Tag="AudioPage" />
- <ui:NavigationViewItem
- Content="{locale:Locale SettingsTabNetwork}"
- Tag="NetworkPage"
- IconSource="Globe" />
- <ui:NavigationViewItem
- Content="{locale:Locale SettingsTabLogging}"
- Tag="LoggingPage"
- IconSource="Document" />
- </ui:NavigationView.MenuItems>
- <ui:NavigationView.Styles>
- <Style Selector="Grid#PlaceholderGrid">
- <Setter Property="Height" Value="40" />
- </Style>
- <Style Selector="ui|NavigationViewItem ui|SymbolIcon">
- <Setter Property="FlowDirection" Value="LeftToRight" />
- </Style>
- </ui:NavigationView.Styles>
- </ui:NavigationView>
- <ReversibleStackPanel
- Grid.Row="2"
- Margin="10"
- Spacing="10"
- Orientation="Horizontal"
- HorizontalAlignment="Right"
- ReverseOrder="{Binding IsMacOS}">
- <Button
- HotKey="Enter"
- Classes="accent"
- Content="{locale:Locale SettingsButtonOk}"
- Command="{Binding OkButton}" />
- <Button
- HotKey="Escape"
- Content="{locale:Locale SettingsButtonCancel}"
- Command="{Binding CancelButton}" />
- <Button
- Content="{locale:Locale SettingsButtonApply}"
- Command="{Binding ApplyButton}" />
- </ReversibleStackPanel>
- </Grid>
-</window:StyleableWindow>
diff --git a/src/Ryujinx.Ava/UI/Windows/SettingsWindow.axaml.cs b/src/Ryujinx.Ava/UI/Windows/SettingsWindow.axaml.cs
deleted file mode 100644
index d7bb0b88..00000000
--- a/src/Ryujinx.Ava/UI/Windows/SettingsWindow.axaml.cs
+++ /dev/null
@@ -1,103 +0,0 @@
-using Avalonia.Controls;
-using FluentAvalonia.Core;
-using FluentAvalonia.UI.Controls;
-using Ryujinx.Ava.Common.Locale;
-using Ryujinx.Ava.UI.ViewModels;
-using Ryujinx.HLE.FileSystem;
-using System;
-
-namespace Ryujinx.Ava.UI.Windows
-{
- public partial class SettingsWindow : StyleableWindow
- {
- internal SettingsViewModel ViewModel { get; set; }
-
- public SettingsWindow(VirtualFileSystem virtualFileSystem, ContentManager contentManager)
- {
- Title = $"Ryujinx {Program.Version} - {LocaleManager.Instance[LocaleKeys.Settings]}";
-
- ViewModel = new SettingsViewModel(virtualFileSystem, contentManager);
- DataContext = ViewModel;
-
- ViewModel.CloseWindow += Close;
- ViewModel.SaveSettingsEvent += SaveSettings;
-
- InitializeComponent();
- Load();
- }
-
- public SettingsWindow()
- {
- ViewModel = new SettingsViewModel();
- DataContext = ViewModel;
-
- InitializeComponent();
- Load();
- }
-
- public void SaveSettings()
- {
- InputPage.ControllerSettings?.SaveCurrentProfile();
-
- if (Owner is MainWindow window && ViewModel.DirectoryChanged)
- {
- window.LoadApplications();
- }
- }
-
- private void Load()
- {
- 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 && navItem.Tag is not null)
- {
- switch (navItem.Tag.ToString())
- {
- 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();
- }
- }
- }
-
- protected override void OnClosing(WindowClosingEventArgs e)
- {
- HotkeysPage.Dispose();
- InputPage.Dispose();
- base.OnClosing(e);
- }
- }
-}
diff --git a/src/Ryujinx.Ava/UI/Windows/StyleableWindow.cs b/src/Ryujinx.Ava/UI/Windows/StyleableWindow.cs
deleted file mode 100644
index a12d2b3e..00000000
--- a/src/Ryujinx.Ava/UI/Windows/StyleableWindow.cs
+++ /dev/null
@@ -1,44 +0,0 @@
-using Avalonia.Controls;
-using Avalonia.Controls.Primitives;
-using Avalonia.Media;
-using Avalonia.Media.Imaging;
-using Avalonia.Platform;
-using Ryujinx.Ava.Common.Locale;
-using Ryujinx.UI.Common.Configuration;
-using System.IO;
-using System.Reflection;
-
-namespace Ryujinx.Ava.UI.Windows
-{
- public class StyleableWindow : Window
- {
- public Bitmap IconImage { get; set; }
-
- public StyleableWindow()
- {
- WindowStartupLocation = WindowStartupLocation.CenterOwner;
- TransparencyLevelHint = new[] { WindowTransparencyLevel.None };
-
- using Stream stream = Assembly.GetAssembly(typeof(ConfigurationState)).GetManifestResourceStream("Ryujinx.UI.Common.Resources.Logo_Ryujinx.png");
-
- Icon = new WindowIcon(stream);
- stream.Position = 0;
- IconImage = new Bitmap(stream);
-
- LocaleManager.Instance.LocaleChanged += LocaleChanged;
- LocaleChanged();
- }
-
- private void LocaleChanged()
- {
- FlowDirection = LocaleManager.Instance.IsRTL() ? FlowDirection.RightToLeft : FlowDirection.LeftToRight;
- }
-
- protected override void OnApplyTemplate(TemplateAppliedEventArgs e)
- {
- base.OnApplyTemplate(e);
-
- ExtendClientAreaChromeHints = ExtendClientAreaChromeHints.SystemChrome | ExtendClientAreaChromeHints.OSXThickTitleBar;
- }
- }
-}
diff --git a/src/Ryujinx.Ava/UI/Windows/TitleUpdateWindow.axaml b/src/Ryujinx.Ava/UI/Windows/TitleUpdateWindow.axaml
deleted file mode 100644
index 3eff389f..00000000
--- a/src/Ryujinx.Ava/UI/Windows/TitleUpdateWindow.axaml
+++ /dev/null
@@ -1,133 +0,0 @@
-<UserControl
- x:Class="Ryujinx.Ava.UI.Windows.TitleUpdateWindow"
- xmlns="https://github.com/avaloniaui"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
- xmlns:locale="clr-namespace:Ryujinx.Ava.Common.Locale"
- xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
- xmlns:viewModels="clr-namespace:Ryujinx.Ava.UI.ViewModels"
- xmlns:models="clr-namespace:Ryujinx.Ava.UI.Models"
- xmlns:ui="clr-namespace:FluentAvalonia.UI.Controls;assembly=FluentAvalonia"
- Width="500"
- Height="300"
- mc:Ignorable="d"
- x:DataType="viewModels:TitleUpdateViewModel"
- Focusable="True">
- <Grid>
- <Grid.RowDefinitions>
- <RowDefinition Height="*" />
- <RowDefinition Height="Auto" />
- </Grid.RowDefinitions>
- <Border
- Grid.Row="0"
- Margin="0 0 0 24"
- HorizontalAlignment="Stretch"
- VerticalAlignment="Stretch"
- BorderBrush="{DynamicResource AppListHoverBackgroundColor}"
- BorderThickness="1"
- CornerRadius="5"
- Padding="2.5">
- <ListBox
- Background="Transparent"
- SelectedItem="{Binding SelectedUpdate, Mode=TwoWay}"
- ItemsSource="{Binding Views}">
- <ListBox.DataTemplates>
- <DataTemplate
- DataType="models:TitleUpdateModel">
- <Panel Margin="10">
- <TextBlock
- HorizontalAlignment="Left"
- VerticalAlignment="Center"
- TextWrapping="Wrap"
- Text="{Binding Label}" />
- <StackPanel
- Spacing="10"
- Orientation="Horizontal"
- HorizontalAlignment="Right">
- <Button
- VerticalAlignment="Center"
- HorizontalAlignment="Right"
- Padding="10"
- MinWidth="0"
- MinHeight="0"
- Click="OpenLocation">
- <ui:SymbolIcon
- Symbol="OpenFolder"
- HorizontalAlignment="Center"
- VerticalAlignment="Center" />
- </Button>
- <Button
- VerticalAlignment="Center"
- HorizontalAlignment="Right"
- Padding="10"
- MinWidth="0"
- MinHeight="0"
- Click="RemoveUpdate">
- <ui:SymbolIcon
- Symbol="Cancel"
- HorizontalAlignment="Center"
- VerticalAlignment="Center" />
- </Button>
- </StackPanel>
- </Panel>
- </DataTemplate>
- <DataTemplate
- DataType="viewModels:BaseModel">
- <Panel
- Height="33"
- Margin="10">
- <TextBlock
- HorizontalAlignment="Left"
- VerticalAlignment="Center"
- TextWrapping="Wrap"
- Text="{locale:Locale NoUpdate}" />
- </Panel>
- </DataTemplate>
- </ListBox.DataTemplates>
- <ListBox.Styles>
- <Style Selector="ListBoxItem">
- <Setter Property="Background" Value="Transparent" />
- </Style>
- </ListBox.Styles>
- </ListBox>
- </Border>
- <Panel
- Grid.Row="1"
- HorizontalAlignment="Stretch">
- <StackPanel
- Orientation="Horizontal"
- Spacing="10"
- HorizontalAlignment="Left">
- <Button
- Name="AddButton"
- MinWidth="90"
- Command="{Binding Add}">
- <TextBlock Text="{locale:Locale SettingsTabGeneralAdd}" />
- </Button>
- <Button
- Name="RemoveAllButton"
- MinWidth="90"
- Click="RemoveAll">
- <TextBlock Text="{locale:Locale DlcManagerRemoveAllButton}" />
- </Button>
- </StackPanel>
- <StackPanel
- Orientation="Horizontal"
- Spacing="10"
- HorizontalAlignment="Right">
- <Button
- Name="SaveButton"
- MinWidth="90"
- Click="Save">
- <TextBlock Text="{locale:Locale SettingsButtonSave}" />
- </Button>
- <Button
- Name="CancelButton"
- MinWidth="90"
- Click="Close">
- <TextBlock Text="{locale:Locale InputDialogCancel}" />
- </Button>
- </StackPanel>
- </Panel>
- </Grid>
-</UserControl>
diff --git a/src/Ryujinx.Ava/UI/Windows/TitleUpdateWindow.axaml.cs b/src/Ryujinx.Ava/UI/Windows/TitleUpdateWindow.axaml.cs
deleted file mode 100644
index f3ac6960..00000000
--- a/src/Ryujinx.Ava/UI/Windows/TitleUpdateWindow.axaml.cs
+++ /dev/null
@@ -1,96 +0,0 @@
-using Avalonia.Controls;
-using Avalonia.Interactivity;
-using Avalonia.Styling;
-using FluentAvalonia.UI.Controls;
-using Ryujinx.Ava.Common.Locale;
-using Ryujinx.Ava.UI.Helpers;
-using Ryujinx.Ava.UI.Models;
-using Ryujinx.Ava.UI.ViewModels;
-using Ryujinx.HLE.FileSystem;
-using Ryujinx.UI.Common.Helper;
-using System.Threading.Tasks;
-using Button = Avalonia.Controls.Button;
-
-namespace Ryujinx.Ava.UI.Windows
-{
- public partial class TitleUpdateWindow : UserControl
- {
- public TitleUpdateViewModel ViewModel;
-
- public TitleUpdateWindow()
- {
- DataContext = this;
-
- InitializeComponent();
- }
-
- public TitleUpdateWindow(VirtualFileSystem virtualFileSystem, ulong titleId)
- {
- DataContext = ViewModel = new TitleUpdateViewModel(virtualFileSystem, titleId);
-
- InitializeComponent();
- }
-
- public static async Task Show(VirtualFileSystem virtualFileSystem, ulong titleId, string titleName)
- {
- ContentDialog contentDialog = new()
- {
- PrimaryButtonText = "",
- SecondaryButtonText = "",
- CloseButtonText = "",
- Content = new TitleUpdateWindow(virtualFileSystem, titleId),
- Title = LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.GameUpdateWindowHeading, titleName, titleId.ToString("X16")),
- };
-
- Style bottomBorder = new(x => x.OfType<Grid>().Name("DialogSpace").Child().OfType<Border>());
- bottomBorder.Setters.Add(new Setter(IsVisibleProperty, false));
-
- contentDialog.Styles.Add(bottomBorder);
-
- await ContentDialogHelper.ShowAsync(contentDialog);
- }
-
- private void Close(object sender, RoutedEventArgs e)
- {
- ((ContentDialog)Parent).Hide();
- }
-
- public void Save(object sender, RoutedEventArgs e)
- {
- ViewModel.Save();
-
- if (VisualRoot is MainWindow window)
- {
- window.LoadApplications();
- }
-
- ((ContentDialog)Parent).Hide();
- }
-
- private void OpenLocation(object sender, RoutedEventArgs e)
- {
- if (sender is Button button)
- {
- if (button.DataContext is TitleUpdateModel model)
- {
- OpenHelper.LocateFile(model.Path);
- }
- }
- }
-
- private void RemoveUpdate(object sender, RoutedEventArgs e)
- {
- if (sender is Button button)
- {
- ViewModel.RemoveUpdate((TitleUpdateModel)button.DataContext);
- }
- }
-
- private void RemoveAll(object sender, RoutedEventArgs e)
- {
- ViewModel.TitleUpdates.Clear();
-
- ViewModel.SortUpdates();
- }
- }
-}