QuickLoad.cs 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. using Avalonia.Threading;
  2. using PicView.Avalonia.Gallery;
  3. using PicView.Avalonia.ImageHandling;
  4. using PicView.Avalonia.Navigation;
  5. using PicView.Avalonia.Preloading;
  6. using PicView.Avalonia.UI;
  7. using PicView.Avalonia.ViewModels;
  8. using PicView.Avalonia.WindowBehavior;
  9. using PicView.Core.FileHandling;
  10. using PicView.Core.Gallery;
  11. using PicView.Core.ImageDecoding;
  12. namespace PicView.Avalonia.StartUp;
  13. public static class QuickLoad
  14. {
  15. public static async Task QuickLoadAsync(MainViewModel vm, string file)
  16. {
  17. var fileInfo = new FileInfo(file);
  18. if (!fileInfo.Exists) // If not file, try to load if URL, base64 or directory
  19. {
  20. await NavigationManager.LoadPicFromStringAsync(file, vm).ConfigureAwait(false);
  21. return;
  22. }
  23. if (file.IsArchive()) // Handle if file exist and is an archive
  24. {
  25. await NavigationManager.LoadPicFromArchiveAsync(file, vm).ConfigureAwait(false);
  26. return;
  27. }
  28. vm.FileInfo = fileInfo;
  29. var imageModel = await GetImageModel.GetImageModelAsync(fileInfo).ConfigureAwait(false);
  30. if (imageModel.ImageType is ImageType.AnimatedGif or ImageType.AnimatedWebp)
  31. {
  32. vm.ImageViewer.MainImage.InitialAnimatedSource = file;
  33. }
  34. vm.ImageSource = imageModel.Image;
  35. vm.ImageType = imageModel.ImageType;
  36. vm.ZoomValue = 1;
  37. vm.PixelWidth = imageModel.PixelWidth;
  38. vm.PixelHeight = imageModel.PixelHeight;
  39. PreLoadValue? secondaryPreloadValue = null;
  40. if (Settings.ImageScaling.ShowImageSideBySide)
  41. {
  42. NavigationManager.InitializeImageIterator(vm);
  43. secondaryPreloadValue = await NavigationManager.GetNextPreLoadValueAsync();
  44. vm.SecondaryImageSource = secondaryPreloadValue?.ImageModel?.Image;
  45. }
  46. await Dispatcher.UIThread.InvokeAsync(() =>
  47. {
  48. vm.ImageViewer.SetTransform(imageModel.EXIFOrientation);
  49. if (!Settings.Zoom.ScrollEnabled)
  50. {
  51. WindowResizing.SetSize(imageModel.PixelWidth, imageModel.PixelHeight, secondaryPreloadValue?.ImageModel?.PixelWidth ?? 0, secondaryPreloadValue?.ImageModel?.PixelHeight ?? 0, imageModel.Rotation, vm);
  52. }
  53. if (Settings.WindowProperties.AutoFit)
  54. {
  55. WindowFunctions.CenterWindowOnScreen();
  56. }
  57. }, DispatcherPriority.Send);
  58. vm.IsLoading = false;
  59. NavigationManager.InitializeImageIterator(vm);
  60. vm.GetIndex = NavigationManager.GetNonZeroIndex;
  61. if (Settings.ImageScaling.ShowImageSideBySide)
  62. {
  63. SetTitleHelper.SetSideBySideTitle(vm, imageModel, secondaryPreloadValue?.ImageModel);
  64. // Sometimes the images are not rendered in side by side, this fixes it
  65. // TODO: Improve and fix side by side and remove this hack
  66. Dispatcher.UIThread.Post(() =>
  67. {
  68. vm.ImageViewer?.MainImage?.InvalidateVisual();
  69. });
  70. }
  71. else
  72. {
  73. if (TiffManager.IsTiff(imageModel.FileInfo.FullName))
  74. {
  75. SetTitleHelper.TrySetTiffTitle(imageModel.PixelWidth, imageModel.PixelHeight, NavigationManager.GetCurrentIndex, fileInfo, vm);
  76. }
  77. else
  78. {
  79. SetTitleHelper.SetTitle(vm, imageModel);
  80. }
  81. }
  82. vm.ExifOrientation = imageModel.EXIFOrientation;
  83. if (Settings.Zoom.ScrollEnabled)
  84. {
  85. // Bad fix for scrolling
  86. // TODO: Implement proper startup scrolling fix
  87. Settings.Zoom.ScrollEnabled = false;
  88. await Dispatcher.UIThread.InvokeAsync(() =>
  89. {
  90. WindowResizing.SetSize(imageModel.PixelWidth, imageModel.PixelHeight, secondaryPreloadValue?.ImageModel?.PixelWidth ?? 0, secondaryPreloadValue?.ImageModel?.PixelHeight ?? 0, imageModel.Rotation, vm);
  91. }, DispatcherPriority.Background);
  92. Settings.Zoom.ScrollEnabled = true;
  93. await Dispatcher.UIThread.InvokeAsync(() =>
  94. {
  95. WindowResizing.SetSize(imageModel.PixelWidth, imageModel.PixelHeight, secondaryPreloadValue?.ImageModel?.PixelWidth ?? 0, secondaryPreloadValue?.ImageModel?.PixelHeight ?? 0, imageModel.Rotation, vm);
  96. }, DispatcherPriority.Send);
  97. }
  98. // Add recent files, except when browsing archive
  99. if (string.IsNullOrWhiteSpace(TempFileHelper.TempFilePath))
  100. {
  101. FileHistoryNavigation.Add(fileInfo.FullName);
  102. }
  103. NavigationManager.AddToPreloader(NavigationManager.GetCurrentIndex, imageModel);
  104. var tasks = new List<Task>();
  105. if (NavigationManager.GetCount > 1)
  106. {
  107. if (Settings.UIProperties.IsTaskbarProgressEnabled)
  108. {
  109. await Dispatcher.UIThread.InvokeAsync(() =>
  110. {
  111. vm.PlatformService.SetTaskbarProgress((ulong)NavigationManager.GetCurrentIndex, (ulong)NavigationManager.GetCount);
  112. });
  113. }
  114. tasks.Add(NavigationManager.PreloadAsync());
  115. }
  116. if (Settings.Gallery.IsBottomGalleryShown)
  117. {
  118. if (vm.IsUIShown)
  119. {
  120. vm.GalleryMode = GalleryMode.BottomNoAnimation;
  121. tasks.Add(GalleryLoad.LoadGallery(vm, fileInfo.DirectoryName));
  122. }
  123. else if (Settings.Gallery.ShowBottomGalleryInHiddenUI)
  124. {
  125. vm.GalleryMode = GalleryMode.BottomNoAnimation;
  126. tasks.Add(GalleryLoad.LoadGallery(vm, fileInfo.DirectoryName));
  127. }
  128. else if (Settings.WindowProperties.Fullscreen)
  129. {
  130. vm.GalleryMode = GalleryMode.BottomNoAnimation;
  131. tasks.Add(GalleryLoad.LoadGallery(vm, fileInfo.DirectoryName));
  132. }
  133. }
  134. await Task.WhenAll(tasks).ConfigureAwait(false);
  135. }
  136. }