UserProfileImageSelectorView.axaml.cs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. using Avalonia.Controls;
  2. using Avalonia.Interactivity;
  3. using Avalonia.VisualTree;
  4. using FluentAvalonia.UI.Controls;
  5. using FluentAvalonia.UI.Navigation;
  6. using Ryujinx.Ava.Common.Locale;
  7. using Ryujinx.Ava.UI.Controls;
  8. using Ryujinx.Ava.UI.Models;
  9. using Ryujinx.Ava.UI.ViewModels;
  10. using Ryujinx.HLE.FileSystem;
  11. using SixLabors.ImageSharp;
  12. using SixLabors.ImageSharp.Processing;
  13. using System.IO;
  14. using Image = SixLabors.ImageSharp.Image;
  15. namespace Ryujinx.Ava.UI.Views.User
  16. {
  17. public partial class UserProfileImageSelectorView : UserControl
  18. {
  19. private ContentManager _contentManager;
  20. private NavigationDialogHost _parent;
  21. private TempProfile _profile;
  22. internal UserProfileImageSelectorViewModel ViewModel { get; private set; }
  23. public UserProfileImageSelectorView()
  24. {
  25. InitializeComponent();
  26. AddHandler(Frame.NavigatedToEvent, (s, e) =>
  27. {
  28. NavigatedTo(e);
  29. }, RoutingStrategies.Direct);
  30. }
  31. private void NavigatedTo(NavigationEventArgs arg)
  32. {
  33. if (Program.PreviewerDetached)
  34. {
  35. switch (arg.NavigationMode)
  36. {
  37. case NavigationMode.New:
  38. (_parent, _profile) = ((NavigationDialogHost, TempProfile))arg.Parameter;
  39. _contentManager = _parent.ContentManager;
  40. ((ContentDialog)_parent.Parent).Title = $"{LocaleManager.Instance[LocaleKeys.UserProfileWindowTitle]} - {LocaleManager.Instance[LocaleKeys.ProfileImageSelectionHeader]}";
  41. if (Program.PreviewerDetached)
  42. {
  43. DataContext = ViewModel = new UserProfileImageSelectorViewModel();
  44. ViewModel.FirmwareFound = _contentManager.GetCurrentFirmwareVersion() != null;
  45. }
  46. break;
  47. case NavigationMode.Back:
  48. if (_profile.Image != null)
  49. {
  50. _parent.GoBack();
  51. }
  52. break;
  53. }
  54. }
  55. }
  56. private async void Import_OnClick(object sender, RoutedEventArgs e)
  57. {
  58. OpenFileDialog dialog = new();
  59. dialog.Filters.Add(new FileDialogFilter
  60. {
  61. Name = LocaleManager.Instance[LocaleKeys.AllSupportedFormats],
  62. Extensions = { "jpg", "jpeg", "png", "bmp" }
  63. });
  64. dialog.Filters.Add(new FileDialogFilter { Name = "JPEG", Extensions = { "jpg", "jpeg" } });
  65. dialog.Filters.Add(new FileDialogFilter { Name = "PNG", Extensions = { "png" } });
  66. dialog.Filters.Add(new FileDialogFilter { Name = "BMP", Extensions = { "bmp" } });
  67. dialog.AllowMultiple = false;
  68. string[] image = await dialog.ShowAsync(((TopLevel)_parent.GetVisualRoot()) as Window);
  69. if (image != null)
  70. {
  71. if (image.Length > 0)
  72. {
  73. string imageFile = image[0];
  74. _profile.Image = ProcessProfileImage(File.ReadAllBytes(imageFile));
  75. if (_profile.Image != null)
  76. {
  77. _parent.GoBack();
  78. }
  79. }
  80. }
  81. }
  82. private void GoBack(object sender, RoutedEventArgs e)
  83. {
  84. _parent.GoBack();
  85. }
  86. private void SelectFirmwareImage_OnClick(object sender, RoutedEventArgs e)
  87. {
  88. if (ViewModel.FirmwareFound)
  89. {
  90. _parent.Navigate(typeof(UserFirmwareAvatarSelectorView), (_parent, _profile));
  91. }
  92. }
  93. private static byte[] ProcessProfileImage(byte[] buffer)
  94. {
  95. using (Image image = Image.Load(buffer))
  96. {
  97. image.Mutate(x => x.Resize(256, 256));
  98. using (MemoryStream streamJpg = new())
  99. {
  100. image.SaveAsJpeg(streamJpg);
  101. return streamJpg.ToArray();
  102. }
  103. }
  104. }
  105. }
  106. }