diff options
| author | Mary Guillemard <mary@mary.zone> | 2024-03-02 12:51:05 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-03-02 12:51:05 +0100 |
| commit | ec6cb0abb4b7669895b6e96fd7581c93b5abd691 (patch) | |
| tree | 128c862ff5faea0b219467656d4023bee7faefb5 /src/Ryujinx.Ava/UI/Windows | |
| parent | 53b5985da6b9d7b281d9fc25b93bfd1d1918a107 (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')
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(); - } - } -} |
