UserProfileImageSelectorView.axaml.cs 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  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 SixLabors.ImageSharp;
  13. using SixLabors.ImageSharp.Processing;
  14. using System.Collections.Generic;
  15. using System.IO;
  16. using Image = SixLabors.ImageSharp.Image;
  17. namespace Ryujinx.Ava.UI.Views.User
  18. {
  19. public partial class UserProfileImageSelectorView : UserControl
  20. {
  21. private ContentManager _contentManager;
  22. private NavigationDialogHost _parent;
  23. private TempProfile _profile;
  24. internal UserProfileImageSelectorViewModel ViewModel { get; private set; }
  25. public UserProfileImageSelectorView()
  26. {
  27. InitializeComponent();
  28. AddHandler(Frame.NavigatedToEvent, (s, e) =>
  29. {
  30. NavigatedTo(e);
  31. }, RoutingStrategies.Direct);
  32. }
  33. private void NavigatedTo(NavigationEventArgs arg)
  34. {
  35. if (Program.PreviewerDetached)
  36. {
  37. switch (arg.NavigationMode)
  38. {
  39. case NavigationMode.New:
  40. (_parent, _profile) = ((NavigationDialogHost, TempProfile))arg.Parameter;
  41. _contentManager = _parent.ContentManager;
  42. ((ContentDialog)_parent.Parent).Title = $"{LocaleManager.Instance[LocaleKeys.UserProfileWindowTitle]} - {LocaleManager.Instance[LocaleKeys.ProfileImageSelectionHeader]}";
  43. if (Program.PreviewerDetached)
  44. {
  45. DataContext = ViewModel = new UserProfileImageSelectorViewModel();
  46. ViewModel.FirmwareFound = _contentManager.GetCurrentFirmwareVersion() != null;
  47. }
  48. break;
  49. case NavigationMode.Back:
  50. if (_profile.Image != null)
  51. {
  52. _parent.GoBack();
  53. }
  54. break;
  55. }
  56. }
  57. }
  58. private async void Import_OnClick(object sender, RoutedEventArgs e)
  59. {
  60. var window = this.GetVisualRoot() as Window;
  61. var result = await window.StorageProvider.OpenFilePickerAsync(new FilePickerOpenOptions
  62. {
  63. AllowMultiple = false,
  64. FileTypeFilter = new List<FilePickerFileType>
  65. {
  66. new(LocaleManager.Instance[LocaleKeys.AllSupportedFormats])
  67. {
  68. Patterns = new[] { "*.jpg", "*.jpeg", "*.png", "*.bmp" },
  69. AppleUniformTypeIdentifiers = new[] { "public.jpeg", "public.png", "com.microsoft.bmp" },
  70. MimeTypes = new[] { "image/jpeg", "image/png", "image/bmp" },
  71. },
  72. },
  73. });
  74. if (result.Count > 0)
  75. {
  76. _profile.Image = ProcessProfileImage(File.ReadAllBytes(result[0].Path.LocalPath));
  77. _parent.GoBack();
  78. }
  79. }
  80. private void GoBack(object sender, RoutedEventArgs e)
  81. {
  82. _parent.GoBack();
  83. }
  84. private void SelectFirmwareImage_OnClick(object sender, RoutedEventArgs e)
  85. {
  86. if (ViewModel.FirmwareFound)
  87. {
  88. _parent.Navigate(typeof(UserFirmwareAvatarSelectorView), (_parent, _profile));
  89. }
  90. }
  91. private static byte[] ProcessProfileImage(byte[] buffer)
  92. {
  93. using Image image = Image.Load(buffer);
  94. image.Mutate(x => x.Resize(256, 256));
  95. using MemoryStream streamJpg = new();
  96. image.SaveAsJpeg(streamJpg);
  97. return streamJpg.ToArray();
  98. }
  99. }
  100. }