UserProfileImageSelectorView.axaml.cs
1 using Avalonia.Controls; 2 using Avalonia.Interactivity; 3 using Avalonia.Platform.Storage; 4 using Avalonia.VisualTree; 5 using FluentAvalonia.UI.Controls; 6 using FluentAvalonia.UI.Navigation; 7 using Ryujinx.Ava.Common.Locale; 8 using Ryujinx.Ava.UI.Controls; 9 using Ryujinx.Ava.UI.Models; 10 using Ryujinx.Ava.UI.ViewModels; 11 using Ryujinx.HLE.FileSystem; 12 using SkiaSharp; 13 using System.Collections.Generic; 14 using System.IO; 15 16 namespace Ryujinx.Ava.UI.Views.User 17 { 18 public partial class UserProfileImageSelectorView : UserControl 19 { 20 private ContentManager _contentManager; 21 private NavigationDialogHost _parent; 22 private TempProfile _profile; 23 24 internal UserProfileImageSelectorViewModel ViewModel { get; private set; } 25 26 public UserProfileImageSelectorView() 27 { 28 InitializeComponent(); 29 AddHandler(Frame.NavigatedToEvent, (s, e) => 30 { 31 NavigatedTo(e); 32 }, RoutingStrategies.Direct); 33 } 34 35 private void NavigatedTo(NavigationEventArgs arg) 36 { 37 if (Program.PreviewerDetached) 38 { 39 switch (arg.NavigationMode) 40 { 41 case NavigationMode.New: 42 (_parent, _profile) = ((NavigationDialogHost, TempProfile))arg.Parameter; 43 _contentManager = _parent.ContentManager; 44 45 ((ContentDialog)_parent.Parent).Title = $"{LocaleManager.Instance[LocaleKeys.UserProfileWindowTitle]} - {LocaleManager.Instance[LocaleKeys.ProfileImageSelectionHeader]}"; 46 47 if (Program.PreviewerDetached) 48 { 49 DataContext = ViewModel = new UserProfileImageSelectorViewModel(); 50 ViewModel.FirmwareFound = _contentManager.GetCurrentFirmwareVersion() != null; 51 } 52 53 break; 54 case NavigationMode.Back: 55 if (_profile.Image != null) 56 { 57 _parent.GoBack(); 58 } 59 break; 60 } 61 } 62 } 63 64 private async void Import_OnClick(object sender, RoutedEventArgs e) 65 { 66 var window = this.GetVisualRoot() as Window; 67 var result = await window.StorageProvider.OpenFilePickerAsync(new FilePickerOpenOptions 68 { 69 AllowMultiple = false, 70 FileTypeFilter = new List<FilePickerFileType> 71 { 72 new(LocaleManager.Instance[LocaleKeys.AllSupportedFormats]) 73 { 74 Patterns = new[] { "*.jpg", "*.jpeg", "*.png", "*.bmp" }, 75 AppleUniformTypeIdentifiers = new[] { "public.jpeg", "public.png", "com.microsoft.bmp" }, 76 MimeTypes = new[] { "image/jpeg", "image/png", "image/bmp" }, 77 }, 78 }, 79 }); 80 81 if (result.Count > 0) 82 { 83 _profile.Image = ProcessProfileImage(File.ReadAllBytes(result[0].Path.LocalPath)); 84 _parent.GoBack(); 85 } 86 } 87 88 private void GoBack(object sender, RoutedEventArgs e) 89 { 90 _parent.GoBack(); 91 } 92 93 private void SelectFirmwareImage_OnClick(object sender, RoutedEventArgs e) 94 { 95 if (ViewModel.FirmwareFound) 96 { 97 _parent.Navigate(typeof(UserFirmwareAvatarSelectorView), (_parent, _profile)); 98 } 99 } 100 101 private static byte[] ProcessProfileImage(byte[] buffer) 102 { 103 using var bitmap = SKBitmap.Decode(buffer); 104 105 var resizedBitmap = bitmap.Resize(new SKImageInfo(256, 256), SKFilterQuality.High); 106 107 using var streamJpg = new MemoryStream(); 108 109 if (resizedBitmap != null) 110 { 111 using var image = SKImage.FromBitmap(resizedBitmap); 112 using var dataJpeg = image.Encode(SKEncodedImageFormat.Jpeg, 100); 113 114 dataJpeg.SaveTo(streamJpg); 115 } 116 117 return streamJpg.ToArray(); 118 } 119 } 120 }