From 3620c76cc124e6934c2526960d5ae6813bae04fb Mon Sep 17 00:00:00 2001 From: _Neo_ Date: Mon, 29 Dec 2025 12:36:37 +0200 Subject: [PATCH] Initial cleanup --- .../UI/Views/User/UserEditorView.axaml | 44 +----- .../UI/Views/User/UserEditorView.axaml.cs | 137 ++++++++---------- .../UserFirmwareAvatarSelectorView.axaml.cs | 111 +++++++------- 3 files changed, 126 insertions(+), 166 deletions(-) diff --git a/src/Ryujinx/UI/Views/User/UserEditorView.axaml b/src/Ryujinx/UI/Views/User/UserEditorView.axaml index 8165b4792..0f13abe69 100644 --- a/src/Ryujinx/UI/Views/User/UserEditorView.axaml +++ b/src/Ryujinx/UI/Views/User/UserEditorView.axaml @@ -8,25 +8,17 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:helpers="clr-namespace:Ryujinx.Ava.UI.Helpers" xmlns:models="clr-namespace:Ryujinx.Ava.UI.Models" - Margin="0" MinWidth="500" - Padding="0" mc:Ignorable="d" Focusable="True" x:DataType="models:TempProfile"> - + @@ -34,16 +26,10 @@ - + - - diff --git a/src/Ryujinx/UI/Views/User/UserEditorView.axaml.cs b/src/Ryujinx/UI/Views/User/UserEditorView.axaml.cs index 2b8f0bf09..51ed6427d 100644 --- a/src/Ryujinx/UI/Views/User/UserEditorView.axaml.cs +++ b/src/Ryujinx/UI/Views/User/UserEditorView.axaml.cs @@ -1,6 +1,7 @@ using Avalonia.Controls; using Avalonia.Data; using Avalonia.Interactivity; +using Avalonia.Markup.Xaml.MarkupExtensions; using Avalonia.Media; using Avalonia.Platform.Storage; using Avalonia.VisualTree; @@ -32,84 +33,65 @@ namespace Ryujinx.Ava.UI.Views.User public UserEditorView() { InitializeComponent(); - AddHandler(Frame.NavigatedToEvent, (s, e) => - { - NavigatedTo(e); - }, RoutingStrategies.Direct); + AddHandler(Frame.NavigatedToEvent, (s, e) => NavigatedTo(e), RoutingStrategies.Direct); } private void NavigatedTo(NavigationEventArgs arg) { - if (Program.PreviewerDetached) + if (!Program.PreviewerDetached) + return; + + if (arg.NavigationMode == NavigationMode.New) { - switch (arg.NavigationMode) - { - case NavigationMode.New: - (NavigationDialogHost parent, UserProfile profile, bool isNewUser) = ((NavigationDialogHost parent, UserProfile profile, bool isNewUser))arg.Parameter; - _isNewUser = isNewUser; - _profile = profile; - ViewModel = new TempProfile(_profile); - _tempProfile = ViewModel; // <-- this is critical + (NavigationDialogHost parent, UserProfile profile, bool isNewUser) = + ((NavigationDialogHost parent, UserProfile profile, bool isNewUser))arg.Parameter; - _parent = parent; + _parent = parent; + _profile = profile; + _isNewUser = isNewUser; - _contentManager = _parent.ContentManager; - ViewModel.FirmwareFound = _contentManager.GetCurrentFirmwareVersion() != null; + DataValidationErrors.ClearErrors(NameBox); + DataValidationErrors.ClearErrors(ImageBox); + ImageBox.Bind(Border.BorderBrushProperty, new DynamicResourceExtension("AppListHoverBackgroundColor")); - break; - } + ViewModel = new TempProfile(_profile); + _tempProfile = ViewModel; - ((ContentDialog)_parent.Parent).Title = $"{LocaleManager.Instance[LocaleKeys.UserProfileWindowTitle]} - " + - $"{(_isNewUser ? LocaleManager.Instance[LocaleKeys.UserEditorTitleNewUser] : UserEditorTitle)}"; - - IdLabel.IsVisible = _profile != null; - IdText.IsVisible = _profile != null; - if (!_isNewUser && IsDeletable) - { - DeleteButton.IsVisible = true; - } - else - { - DeleteButton.IsVisible = false; - } + _contentManager = _parent.ContentManager; + ViewModel.FirmwareFound = _contentManager.GetCurrentFirmwareVersion() != null; } + + ((ContentDialog)_parent.Parent).Title = + $"{LocaleManager.Instance[LocaleKeys.UserProfileWindowTitle]} - " + + $"{(_isNewUser ? LocaleManager.Instance[LocaleKeys.UserEditorTitleNewUser] : UserEditorTitle)}"; + + bool hasProfile = _profile != null; + IdLabel.IsVisible = hasProfile; + IdText.IsVisible = hasProfile; + + DeleteButton.IsVisible = !_isNewUser && IsDeletable; } private async void BackButton_Click(object sender, RoutedEventArgs e) { - if (_isNewUser) + bool hasUnsavedChanges = + _isNewUser + ? (ViewModel.Name != string.Empty || ViewModel.Image != null) + : (_profile.Name != ViewModel.Name || _profile.Image != ViewModel.Image); + + if (hasUnsavedChanges) { - if (ViewModel.Name != string.Empty || ViewModel.Image != null) - { - if (await ContentDialogHelper.CreateChoiceDialog( - LocaleManager.Instance[LocaleKeys.DialogUserProfileUnsavedChangesTitle], - LocaleManager.Instance[LocaleKeys.DialogUserProfileUnsavedChangesMessage], - LocaleManager.Instance[LocaleKeys.DialogUserProfileUnsavedChangesSubMessage])) - { - _parent?.GoBack(); - } - } - else - { + bool confirm = await ContentDialogHelper.CreateChoiceDialog( + LocaleManager.Instance[LocaleKeys.DialogUserProfileUnsavedChangesTitle], + LocaleManager.Instance[LocaleKeys.DialogUserProfileUnsavedChangesMessage], + LocaleManager.Instance[LocaleKeys.DialogUserProfileUnsavedChangesSubMessage]); + + if (confirm) _parent?.GoBack(); - } } else { - if (_profile.Name != ViewModel.Name || _profile.Image != ViewModel.Image) - { - if (await ContentDialogHelper.CreateChoiceDialog( - LocaleManager.Instance[LocaleKeys.DialogUserProfileUnsavedChangesTitle], - LocaleManager.Instance[LocaleKeys.DialogUserProfileUnsavedChangesMessage], - LocaleManager.Instance[LocaleKeys.DialogUserProfileUnsavedChangesSubMessage])) - { - _parent?.GoBack(); - } - } - else - { - _parent?.GoBack(); - } + _parent?.GoBack(); } } @@ -122,19 +104,27 @@ namespace Ryujinx.Ava.UI.Views.User { DataValidationErrors.ClearErrors(NameBox); DataValidationErrors.ClearErrors(ImageBox); + ImageBox.Bind(Border.BorderBrushProperty, new DynamicResourceExtension("AppListHoverBackgroundColor")); - if (string.IsNullOrWhiteSpace(ViewModel.Name)) + bool nameEmpty = string.IsNullOrWhiteSpace(ViewModel.Name); + bool imageMissing = ViewModel.Image == null; + + if (nameEmpty && imageMissing) + { + DataValidationErrors.SetError(NameBox, new DataValidationException(LocaleManager.Instance[LocaleKeys.UserProfileEmptyNameError])); + DataValidationErrors.SetError(ImageBox, new DataValidationException("")); + ImageBox.BorderBrush = Brush.Parse("#ff99a4"); + return; + } + else if (nameEmpty) { - DataValidationErrors.SetError(NameBox, new DataValidationException(LocaleManager.Instance[LocaleKeys.UserProfileEmptyNameError])); - + DataValidationErrors.SetError(NameBox,new DataValidationException(LocaleManager.Instance[LocaleKeys.UserProfileEmptyNameError])); return; } - - if (ViewModel.Image == null) + else if (imageMissing) { - DataValidationErrors.SetError(ImageBox, null); - ImageBox.BorderBrush = Brushes.Red; - + DataValidationErrors.SetError(ImageBox, new DataValidationException("")); + ImageBox.BorderBrush = Brush.Parse("#ff99a4"); return; } @@ -143,6 +133,7 @@ namespace Ryujinx.Ava.UI.Views.User _profile.Name = ViewModel.Name; _profile.Image = ViewModel.Image; _profile.UpdateState(); + _parent.AccountManager.SetUserName(_profile.UserId, _profile.Name); _parent.AccountManager.SetUserImage(_profile.UserId, _profile.Image); } @@ -158,7 +149,7 @@ namespace Ryujinx.Ava.UI.Views.User _parent?.GoBack(); } - private async void SelectFirmwareImage_OnClick(object sender, RoutedEventArgs e) + private void SelectFirmwareImage_OnClick(object sender, RoutedEventArgs e) { if (ViewModel.FirmwareFound) { @@ -168,7 +159,8 @@ namespace Ryujinx.Ava.UI.Views.User private async void Import_OnClick(object sender, RoutedEventArgs e) { - var result = await ((Window)this.GetVisualRoot()!).StorageProvider.OpenFilePickerAsync(new FilePickerOpenOptions + var window = (Window)this.GetVisualRoot()!; + var result = await window.StorageProvider.OpenFilePickerAsync(new FilePickerOpenOptions { Title = LocaleManager.Instance[LocaleKeys.LoadSupportedImageFormatDialogTitle], AllowMultiple = false, @@ -183,10 +175,7 @@ namespace Ryujinx.Ava.UI.Views.User }, }); - if (result.Count == 0) - return; - - if (DataContext is not TempProfile temp) + if (result.Count == 0 || DataContext is not TempProfile temp) return; temp.Image = ProcessProfileImage(File.ReadAllBytes(result[0].Path.LocalPath)); @@ -198,7 +187,6 @@ namespace Ryujinx.Ava.UI.Views.User private static byte[] ProcessProfileImage(byte[] buffer) { using SKBitmap bitmap = SKBitmap.Decode(buffer); - SKBitmap resizedBitmap = bitmap.Resize(new SKImageInfo(256, 256), SKFilterQuality.High); using MemoryStream streamJpg = new(); @@ -207,7 +195,6 @@ namespace Ryujinx.Ava.UI.Views.User { using SKImage image = SKImage.FromBitmap(resizedBitmap); using SKData dataJpeg = image.Encode(SKEncodedImageFormat.Jpeg, 100); - dataJpeg.SaveTo(streamJpg); } diff --git a/src/Ryujinx/UI/Views/User/UserFirmwareAvatarSelectorView.axaml.cs b/src/Ryujinx/UI/Views/User/UserFirmwareAvatarSelectorView.axaml.cs index 77a015562..0473fd511 100644 --- a/src/Ryujinx/UI/Views/User/UserFirmwareAvatarSelectorView.axaml.cs +++ b/src/Ryujinx/UI/Views/User/UserFirmwareAvatarSelectorView.axaml.cs @@ -1,4 +1,5 @@ using Avalonia.Interactivity; +using Avalonia.Threading; using FluentAvalonia.UI.Controls; using FluentAvalonia.UI.Navigation; using Ryujinx.Ava.UI.Controls; @@ -8,6 +9,7 @@ using Ryujinx.Ava.UI.ViewModels; using Ryujinx.HLE.FileSystem; using SkiaSharp; using System.IO; +using System.Threading.Tasks; namespace Ryujinx.Ava.UI.Views.User { @@ -15,49 +17,51 @@ namespace Ryujinx.Ava.UI.Views.User { private NavigationDialogHost _parent; private TempProfile _profile; - + public ContentManager ContentManager { get; private set; } + public UserFirmwareAvatarSelectorView() + { + InitializeComponent(); + ViewModel = new UserFirmwareAvatarSelectorViewModel(); + DataContext = ViewModel; + AddHandler(Frame.NavigatedToEvent, (s, e) => NavigatedTo(e), RoutingStrategies.Direct); + } + public UserFirmwareAvatarSelectorView(ContentManager contentManager) { ContentManager = contentManager; InitializeComponent(); + ViewModel = new UserFirmwareAvatarSelectorViewModel(); + DataContext = ViewModel; AddHandler(Frame.NavigatedToEvent, (s, e) => NavigatedTo(e), RoutingStrategies.Direct); } - public UserFirmwareAvatarSelectorView() - { - InitializeComponent(); - - AddHandler(Frame.NavigatedToEvent, (s, e) => - { - NavigatedTo(e); - }, RoutingStrategies.Direct); - } - private void NavigatedTo(NavigationEventArgs arg) { - if (Program.PreviewerDetached) + if (!Program.PreviewerDetached) + return; + + if (arg.NavigationMode != NavigationMode.New) + return; + + (_parent, _profile) = ((NavigationDialogHost, TempProfile))arg.Parameter; + ContentManager = _parent.ContentManager; + + ((ContentDialog)_parent.Parent).Title = + $"{LocaleManager.Instance[LocaleKeys.UserProfileWindowTitle]} - " + + $"{LocaleManager.Instance[LocaleKeys.ProfileImageSelectionHeader]}"; + + _ = Task.Run(() => { - if (arg.NavigationMode == NavigationMode.New) + bool found = ContentManager.GetCurrentFirmwareVersion() != null; + + Dispatcher.UIThread.Post(() => { - (_parent, _profile) = ((NavigationDialogHost, TempProfile))arg.Parameter; - ContentManager = _parent.ContentManager; - - ((ContentDialog)_parent.Parent).Title = $"{LocaleManager.Instance[LocaleKeys.UserProfileWindowTitle]} - {LocaleManager.Instance[LocaleKeys.ProfileImageSelectionHeader]}"; - - if (Program.PreviewerDetached) - { - ViewModel = new UserFirmwareAvatarSelectorViewModel(); - ViewModel.FirmwareFound = ContentManager.GetCurrentFirmwareVersion() != null; - } - - DataContext = ViewModel; - } - } + ViewModel.FirmwareFound = found; + }); + }); } - public ContentManager ContentManager { get; private set; } - private void GoBack(object sender, RoutedEventArgs e) { _parent.GoBack(); @@ -65,32 +69,31 @@ namespace Ryujinx.Ava.UI.Views.User private void ChooseButton_OnClick(object sender, RoutedEventArgs e) { - if (ViewModel.SelectedImage != null) + if (ViewModel.SelectedImage == null) + return; + + using MemoryStream streamJpg = new(); + using SKBitmap bitmap = SKBitmap.Decode(ViewModel.SelectedImage); + using SKBitmap newBitmap = new(bitmap.Width, bitmap.Height); + + using (SKCanvas canvas = new(newBitmap)) { - using MemoryStream streamJpg = new(); - using SKBitmap bitmap = SKBitmap.Decode(ViewModel.SelectedImage); - using SKBitmap newBitmap = new(bitmap.Width, bitmap.Height); - - using (SKCanvas canvas = new(newBitmap)) - { - canvas.Clear(new SKColor( - ViewModel.BackgroundColor.R, - ViewModel.BackgroundColor.G, - ViewModel.BackgroundColor.B, - ViewModel.BackgroundColor.A)); - canvas.DrawBitmap(bitmap, 0, 0); - } - - using (SKImage image = SKImage.FromBitmap(newBitmap)) - using (SKData dataJpeg = image.Encode(SKEncodedImageFormat.Jpeg, 100)) - { - dataJpeg.SaveTo(streamJpg); - } - - _profile.Image = streamJpg.ToArray(); - - _parent.GoBack(); + canvas.Clear(new SKColor( + ViewModel.BackgroundColor.R, + ViewModel.BackgroundColor.G, + ViewModel.BackgroundColor.B, + ViewModel.BackgroundColor.A)); + canvas.DrawBitmap(bitmap, 0, 0); } + + using (SKImage image = SKImage.FromBitmap(newBitmap)) + using (SKData dataJpeg = image.Encode(SKEncodedImageFormat.Jpeg, 100)) + { + dataJpeg.SaveTo(streamJpg); + } + + _profile.Image = streamJpg.ToArray(); + _parent.GoBack(); } } -} +} \ No newline at end of file