浏览代码

Update startup logic

Ruben 6 月之前
父节点
当前提交
2cd898fc15

+ 1 - 2
src/PicView.Avalonia.MacOS/App.axaml.cs

@@ -70,9 +70,8 @@ public class App : Application, IPlatformSpecificService
         
             await Dispatcher.UIThread.InvokeAsync(() =>
             {
-                
                 _mainWindow.DataContext = _vm;
-                StartUpHelper.Start(_vm, settingsExists, desktop, _mainWindow);
+                StartUpHelper.StartWithoutArguments(_vm, settingsExists, desktop, _mainWindow);
             },DispatcherPriority.Send);
         }
         catch (Exception)

+ 1 - 1
src/PicView.Avalonia.Win32/App.axaml.cs

@@ -85,7 +85,7 @@ public partial class App : Application, IPlatformSpecificService
             await Dispatcher.UIThread.InvokeAsync(() =>
             {
                 _mainWindow.DataContext = _vm;
-                StartUpHelper.Start(_vm, settingsExists, desktop, _mainWindow);
+                StartUpHelper.StartWithArguments(_vm, settingsExists, desktop, _mainWindow);
             },DispatcherPriority.Send);
         }
         catch (Exception e)

+ 11 - 4
src/PicView.Avalonia/ImageHandling/GetImageModel.cs

@@ -24,7 +24,7 @@ public static class GetImageModel
         { ".b64", new Base64Handler() }
     };
 
-    public static async Task<ImageModel> GetImageModelAsync(FileInfo fileInfo)
+    public static async Task<ImageModel> GetImageModelAsync(FileInfo fileInfo, MagickImage? magickImage = null)
     {
         if (fileInfo is null)
         {
@@ -38,9 +38,12 @@ public static class GetImageModel
         {
             // Get extension and prepare MagickImage for metadata
             var ext = fileInfo.Extension.ToLower();
-            using var magickImage = new MagickImage();
-            magickImage.Ping(fileInfo);
-            
+            if (magickImage is null)
+            {
+                magickImage = new MagickImage();
+                magickImage.Ping(fileInfo);
+            }
+
             // Extract EXIF orientation early
             imageModel.EXIFOrientation = EXIFHelper.GetImageOrientation(magickImage);
 
@@ -62,6 +65,10 @@ public static class GetImageModel
             LogError($"Error processing {fileInfo.Name}: {e.Message}");
             return CreateErrorImageModel(fileInfo);
         }
+        finally
+        {
+            magickImage.Dispose();
+        }
     }
 
     private static void LogError(string message)

+ 20 - 9
src/PicView.Avalonia/StartUp/QuickLoad.cs

@@ -1,4 +1,5 @@
 using Avalonia.Threading;
+using ImageMagick;
 using PicView.Avalonia.Gallery;
 using PicView.Avalonia.ImageHandling;
 using PicView.Avalonia.Navigation;
@@ -19,37 +20,47 @@ public static class QuickLoad
         var fileInfo = new FileInfo(file);
         if (!fileInfo.Exists) // If not file, try to load if URL, base64 or directory
         {
+            vm.IsLoading = true;
             await NavigationManager.LoadPicFromStringAsync(file, vm).ConfigureAwait(false);
             return;
         }
 
         if (file.IsArchive()) // Handle if file exist and is an archive
         {
+            vm.IsLoading = true;
             await NavigationManager.LoadPicFromArchiveAsync(file, vm).ConfigureAwait(false);
             return;
         }
-        
+
+        var magickImage = new MagickImage();
+        magickImage.Ping(fileInfo);
         vm.PicViewer.FileInfo = fileInfo;
+        var isLargeImage = magickImage.Width * magickImage.Height > 5000000; // ~5 megapixels threshold
+        if (isLargeImage || Settings.ImageScaling.ShowImageSideBySide)
+        {
+            // Don't show loading indicator if image is too small
+            vm.IsLoading = true;
+        }
 
         if (Settings.ImageScaling.ShowImageSideBySide)
         {
-            await SideBySideLoadingAsync(vm, fileInfo).ConfigureAwait(false);
+            await SideBySideLoadingAsync(vm, fileInfo, magickImage).ConfigureAwait(false);
         }
         else
         {
-            await SingeImageLoadingAsync(vm, fileInfo).ConfigureAwait(false);
+            await SingeImageLoadingAsync(vm, fileInfo, magickImage).ConfigureAwait(false);
         }
 
         vm.IsLoading = false;
     }
 
-    private static async Task SingeImageLoadingAsync(MainViewModel vm, FileInfo fileInfo)
+    private static async Task SingeImageLoadingAsync(MainViewModel vm, FileInfo fileInfo, MagickImage? magickImage)
     {
         var cancellationTokenSource = new CancellationTokenSource();
         ImageModel? imageModel = null;
         await Task.WhenAll(
             Task.Run(() => { NavigationManager.InitializeImageIterator(vm); }, cancellationTokenSource.Token),
-            Task.Run(async () => imageModel = await SetSingleImageAsync(vm, fileInfo), cancellationTokenSource.Token))
+            Task.Run(async () => imageModel = await SetSingleImageAsync(vm, fileInfo, magickImage), cancellationTokenSource.Token))
             .ConfigureAwait(false);
         if (TiffManager.IsTiff(imageModel.FileInfo.FullName))
         {
@@ -63,9 +74,9 @@ public static class QuickLoad
         cancellationTokenSource.Dispose();
     }
 
-    private static async Task<ImageModel> SetSingleImageAsync(MainViewModel vm, FileInfo fileInfo)
+    private static async Task<ImageModel> SetSingleImageAsync(MainViewModel vm, FileInfo fileInfo, MagickImage? magickImage)
     {
-        var imageModel = await GetImageModel.GetImageModelAsync(fileInfo).ConfigureAwait(false);
+        var imageModel = await GetImageModel.GetImageModelAsync(fileInfo, magickImage).ConfigureAwait(false);
         SetPicViewerValues(vm, imageModel, fileInfo);
         vm.IsLoading = false;
         await Dispatcher.UIThread.InvokeAsync(() =>
@@ -76,10 +87,10 @@ public static class QuickLoad
         return imageModel;
     }
 
-    private static async Task SideBySideLoadingAsync(MainViewModel vm, FileInfo fileInfo)
+    private static async Task SideBySideLoadingAsync(MainViewModel vm, FileInfo fileInfo, MagickImage? magickImage)
     {
         NavigationManager.InitializeImageIterator(vm);
-        var imageModel = await GetImageModel.GetImageModelAsync(fileInfo);
+        var imageModel = await GetImageModel.GetImageModelAsync(fileInfo, magickImage);
         var secondaryPreloadValue = await NavigationManager.GetNextPreLoadValueAsync();
         vm.PicViewer.SecondaryImageSource = secondaryPreloadValue?.ImageModel?.Image;
         SetPicViewerValues(vm, imageModel, fileInfo);

+ 28 - 3
src/PicView.Avalonia/StartUp/StartUpHelper.cs

@@ -25,7 +25,7 @@ namespace PicView.Avalonia.StartUp;
 
 public static class StartUpHelper
 {
-    public static void Start(MainViewModel vm, bool settingsExists, IClassicDesktopStyleApplicationLifetime desktop,
+    public static void StartWithArguments(MainViewModel vm, bool settingsExists, IClassicDesktopStyleApplicationLifetime desktop,
         Window window)
     {
         var args = Environment.GetCommandLineArgs();
@@ -66,6 +66,28 @@ public static class StartUpHelper
         
         InitializeSettings(vm);
         
+        if (Settings.WindowProperties.AutoFit)
+        {
+            ScreenHelper.UpdateScreenSize(window);
+            HandleAutoFit(vm, window);
+        }
+        else
+        {
+            HandleNormalWindow(vm, window);
+        }
+        
+        vm.ImageViewer = new ImageViewer();
+        HandleStartUpMenuOrImage(vm, args);
+        window.Show();
+        
+        HandlePostWindowUpdates(vm, settingsExists, desktop, window);
+    }
+    
+        public static void StartWithoutArguments(MainViewModel vm, bool settingsExists, IClassicDesktopStyleApplicationLifetime desktop,
+        Window window)
+    {
+        InitializeSettings(vm);
+        
         if (Settings.WindowProperties.AutoFit)
         {
             ScreenHelper.UpdateScreenSize(window);
@@ -78,7 +100,11 @@ public static class StartUpHelper
         window.Show();
         vm.ImageViewer = new ImageViewer();
         
-        HandleStartUpMenuOrImage(vm, args);
+        HandlePostWindowUpdates(vm, settingsExists, desktop, window);
+    }
+
+    private static void HandlePostWindowUpdates(MainViewModel vm, bool settingsExists, IClassicDesktopStyleApplicationLifetime desktop, Window window)
+    {
         ResourceLimits.LimitMemory(new Percentage(90));
         
         Task.Run(() => LanguageUpdater.UpdateLanguageAsync(vm.Translation, vm.PicViewer, settingsExists));
@@ -288,7 +314,6 @@ public static class StartUpHelper
             vm.BottomCornerRadius = new CornerRadius(0, 0, 8, 8);
         }
         
-        vm.IsLoading = true;
         vm.TitlebarHeight = Settings.WindowProperties.Fullscreen
             || !Settings.UIProperties.ShowInterface
             ? 0