/ src / Ryujinx / UI / Views / User / UserProfileImageSelectorView.axaml.cs
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  }