Browse Source

Refactor rename, faster image switching, misc

Ruben 1 year ago
parent
commit
29678daf0d

+ 6 - 6
src/PicView.Avalonia/FileSystem/FilePickerHelper.cs → src/PicView.Avalonia/FileSystem/FilePicker.cs

@@ -10,7 +10,7 @@ using PicView.Core.Localization;
 
 namespace PicView.Avalonia.FileSystem;
 
-public static class FilePickerHelper
+public static class FilePicker
 {
     public static async Task SelectAndLoadFile(MainViewModel vm)
     {
@@ -68,15 +68,15 @@ public static class FilePickerHelper
     private static FilePickerFileType AllFileType { get; } = new(TranslationHelper.GetTranslation("SupportedFiles"))
     {
         Patterns = SupportedFiles.ConvertFilesToGlobFormat(),
-        AppleUniformTypeIdentifiers = new[] { "public.image" },
-        MimeTypes = new[] { "image/*" },
+        AppleUniformTypeIdentifiers = ["public.image"],
+        MimeTypes = ["image/*"],
     };
 
     private static FilePickerFileType ArchiveFileType { get; } = new(TranslationHelper.GetTranslation("SupportedFiles"))
     {
         Patterns = SupportedFiles.ConvertArchivesToGlobFormat(),
-        AppleUniformTypeIdentifiers = new[] { "public.archive" },
-        MimeTypes = new[] { "archive/*" }
+        AppleUniformTypeIdentifiers = ["public.archive"],
+        MimeTypes = ["archive/*"]
     };
 
     public static async Task PickAndSaveFileAsAsync(string? fileName, MainViewModel vm)
@@ -95,7 +95,7 @@ public static class FilePickerHelper
             var options = new FilePickerSaveOptions
             {
                 Title = $"{TranslationHelper.Translation.OpenFileDialog} - PicView",
-                FileTypeChoices  = new[] { AllFileType, FilePickerFileTypes.ImageAll, ArchiveFileType },
+                FileTypeChoices  = [AllFileType, FilePickerFileTypes.ImageAll, ArchiveFileType],
                 SuggestedFileName = string.IsNullOrWhiteSpace(fileName) ? Path.GetRandomFileName() : fileName,
                 SuggestedStartLocation = await desktop.MainWindow.StorageProvider.TryGetFolderFromPathAsync(fileName)
             

+ 1 - 1
src/PicView.Avalonia/FileSystem/FileSaverHelper.cs

@@ -23,7 +23,7 @@ public static class FileSaverHelper
             }
             else
             {
-                await FilePickerHelper.PickAndSaveFileAsAsync(vm.FileInfo.FullName, vm);
+                await FilePicker.PickAndSaveFileAsAsync(vm.FileInfo.FullName, vm);
             }
             
         }

+ 93 - 95
src/PicView.Avalonia/Navigation/ImageIterator.cs

@@ -332,7 +332,7 @@ public sealed class ImageIterator : IDisposable
         {
             _vm.FileInfo = fileInfo;
         }
-        
+
         SetTitleHelper.SetTitle(_vm);
 
         _isRunning = false;
@@ -365,7 +365,7 @@ public sealed class ImageIterator : IDisposable
     {
         return PreLoader.Get(index, ImagePaths);
     }
-    
+
     public async Task<PreLoader.PreLoadValue?> GetPreLoadValueAsync(int index)
     {
         return await PreLoader.GetAsync(index, ImagePaths);
@@ -494,55 +494,25 @@ public sealed class ImageIterator : IDisposable
             return;
         }
 
-        await Task.Run(async () =>
+        try
         {
-            try
+            lock (_lock)
             {
-                lock (_lock)
-                {
-                    CurrentIndex = index;
-                }
-
-                // ReSharper disable once MethodHasAsyncOverload
-                var preloadValue = PreLoader.Get(index, ImagePaths);
-                if (preloadValue is not null)
-                {
-                    if (preloadValue.IsLoading)
-                    {
-                        TryShowPreview(preloadValue);
-                    }
+                CurrentIndex = index;
+            }
 
-                    while (preloadValue.IsLoading)
-                    {
-                        await Task.Delay(20).ConfigureAwait(false);
-                        lock (_lock)
-                        {
-                            if (CurrentIndex != index)
-                            {
-                                // Skip loading if user went to next value
-                                return;
-                            }
-                        }
-                    }
-                }
-                else
+            // ReSharper disable once MethodHasAsyncOverload
+            var preloadValue = PreLoader.Get(index, ImagePaths);
+            if (preloadValue is not null)
+            {
+                if (preloadValue.IsLoading)
                 {
                     TryShowPreview(preloadValue);
-                    preloadValue = await PreLoader.GetAsync(CurrentIndex, ImagePaths).ConfigureAwait(false);
-                }
-
-                lock (_lock)
-                {
-                    if (CurrentIndex != index)
-                    {
-                        // Skip loading if user went to next value
-                        return;
-                    }
                 }
 
-                if (SettingsHelper.Settings.ImageScaling.ShowImageSideBySide)
+                while (preloadValue.IsLoading)
                 {
-                    var nextPreloadValue = await GetNextPreLoadValueAsync().ConfigureAwait(false);
+                    await Task.Delay(20).ConfigureAwait(false);
                     lock (_lock)
                     {
                         if (CurrentIndex != index)
@@ -551,81 +521,109 @@ public sealed class ImageIterator : IDisposable
                             return;
                         }
                     }
-
-                    _vm.SecondaryImageSource = nextPreloadValue.ImageModel.Image;
-                    await UpdateImage.UpdateSource(_vm, index, ImagePaths, IsReversed, preloadValue, nextPreloadValue).ConfigureAwait(false);
                 }
-                else
+            }
+            else
+            {
+                TryShowPreview(preloadValue);
+                preloadValue = await PreLoader.GetAsync(CurrentIndex, ImagePaths).ConfigureAwait(false);
+            }
+
+            lock (_lock)
+            {
+                if (CurrentIndex != index)
                 {
-                    await UpdateImage.UpdateSource(_vm, index, ImagePaths, IsReversed, preloadValue).ConfigureAwait(false);
+                    // Skip loading if user went to next value
+                    return;
                 }
+            }
 
-                if (ImagePaths.Count > 1)
+            if (SettingsHelper.Settings.ImageScaling.ShowImageSideBySide)
+            {
+                var nextPreloadValue = await GetNextPreLoadValueAsync().ConfigureAwait(false);
+                lock (_lock)
                 {
-                    if (SettingsHelper.Settings.UIProperties.IsTaskbarProgressEnabled)
+                    if (CurrentIndex != index)
                     {
-                        await Dispatcher.UIThread.InvokeAsync(() =>
-                        {
-                            _vm.PlatformService.SetTaskbarProgress((ulong)CurrentIndex, (ulong)ImagePaths.Count);
-                        });
+                        // Skip loading if user went to next value
+                        return;
                     }
-
-                    await PreLoader.PreLoadAsync(CurrentIndex, ImagePaths.Count, IsReversed, ImagePaths)
-                        .ConfigureAwait(false);
                 }
 
-                await AddAsync(index, preloadValue.ImageModel).ConfigureAwait(false);
+                _vm.SecondaryImageSource = nextPreloadValue.ImageModel.Image;
+                await UpdateImage.UpdateSource(_vm, index, ImagePaths, IsReversed, preloadValue, nextPreloadValue)
+                    .ConfigureAwait(false);
+            }
+            else
+            {
+                await UpdateImage.UpdateSource(_vm, index, ImagePaths, IsReversed, preloadValue).ConfigureAwait(false);
+            }
 
-                // Add recent files, except when browsing archive
-                if (string.IsNullOrWhiteSpace(TempFileHelper.TempFilePath) && ImagePaths.Count > index)
+            if (ImagePaths.Count > 1)
+            {
+                if (SettingsHelper.Settings.UIProperties.IsTaskbarProgressEnabled)
                 {
-                    FileHistoryNavigation.Add(ImagePaths[index]);
+                    await Dispatcher.UIThread.InvokeAsync(() =>
+                    {
+                        _vm.PlatformService.SetTaskbarProgress((ulong)CurrentIndex, (ulong)ImagePaths.Count);
+                    });
                 }
+
+                await PreLoader.PreLoadAsync(CurrentIndex, ImagePaths.Count, IsReversed, ImagePaths)
+                    .ConfigureAwait(false);
             }
-            catch (Exception e)
+
+            await AddAsync(index, preloadValue.ImageModel).ConfigureAwait(false);
+
+            // Add recent files, except when browsing archive
+            if (string.IsNullOrWhiteSpace(TempFileHelper.TempFilePath) && ImagePaths.Count > index)
             {
+                FileHistoryNavigation.Add(ImagePaths[index]);
+            }
+        }
+        catch (Exception e)
+        {
 #if DEBUG
-                Console.WriteLine($"{nameof(IterateToIndex)} exception: \n{e.Message}");
-                await TooltipHelper.ShowTooltipMessageAsync(e.Message);
+            Console.WriteLine($"{nameof(IterateToIndex)} exception: \n{e.Message}");
+            await TooltipHelper.ShowTooltipMessageAsync(e.Message);
 #endif
-            }
-            finally
-            {
-                _vm.IsLoading = false;
-            }
+        }
+        finally
+        {
+            _vm.IsLoading = false;
+        }
 
-            return;
+        return;
 
-            void TryShowPreview(PreLoader.PreLoadValue preloadValue)
+        void TryShowPreview(PreLoader.PreLoadValue preloadValue)
+        {
+            if (preloadValue is null)
             {
-                if (preloadValue is null)
-                {
-                    return;
-                }
+                return;
+            }
 
-                if (!preloadValue.IsLoading)
-                {
-                    return;
-                }
+            if (!preloadValue.IsLoading)
+            {
+                return;
+            }
 
-                if (index != CurrentIndex)
-                {
-                    return;
-                }
+            if (index != CurrentIndex)
+            {
+                return;
+            }
 
-                if (SettingsHelper.Settings.ImageScaling.ShowImageSideBySide)
-                {
-                    SetTitleHelper.SetLoadingTitle(_vm);
-                    _vm.IsLoading = true;
-                    _vm.ImageSource = null;
-                    _vm.SecondaryImageSource = null;
-                }
-                else
-                {
-                    UpdateImage.LoadingPreview(_vm, index);
-                }
+            if (SettingsHelper.Settings.ImageScaling.ShowImageSideBySide)
+            {
+                SetTitleHelper.SetLoadingTitle(_vm);
+                _vm.IsLoading = true;
+                _vm.ImageSource = null;
+                _vm.SecondaryImageSource = null;
             }
-        });
+            else
+            {
+                UpdateImage.LoadingPreview(_vm, index);
+            }
+        }
     }
 
     private static Timer? _timer;

+ 2 - 3
src/PicView.Avalonia/Navigation/UpdateImage.cs

@@ -61,9 +61,10 @@ public static class UpdateImage
             WindowHelper.SetSize(preLoadValue.ImageModel.PixelWidth, preLoadValue.ImageModel.PixelHeight,
                 nextPreloadValue?.ImageModel?.PixelWidth ?? 0, nextPreloadValue?.ImageModel?.PixelHeight ?? 0,
                 preLoadValue.ImageModel.Rotation, vm);
+            
+            UIHelper.GetToolTipMessage.IsVisible = false;
         }, DispatcherPriority.Send);
 
-
         SetTitleHelper.SetTitle(vm, preLoadValue.ImageModel);
 
         if (SettingsHelper.Settings.WindowProperties.KeepCentered)
@@ -86,8 +87,6 @@ public static class UpdateImage
         vm.PixelWidth = preLoadValue.ImageModel.PixelWidth;
         vm.PixelHeight = preLoadValue.ImageModel.PixelHeight;
         ExifHandling.UpdateExifValues(preLoadValue.ImageModel, vm);
-
-        await Dispatcher.UIThread.InvokeAsync(TooltipHelper.CloseToolTipMessage);
     }
 
     /// <summary>

+ 1 - 1
src/PicView.Avalonia/UI/FunctionsHelper.cs

@@ -573,7 +573,7 @@ public static class FunctionsHelper
 
     public static async Task Open()
     {
-        await FilePickerHelper.SelectAndLoadFile(Vm);
+        await FilePicker.SelectAndLoadFile(Vm);
     }
 
     public static Task OpenWith()

+ 0 - 1
src/PicView.Avalonia/UI/StartUpHelper.cs

@@ -162,7 +162,6 @@ public static class StartUpHelper
             : TranslationHelper.Translation.ScrollToZoom;
         
         UIHelper.AddMenus();
-        UIHelper.AddToolTipMessage();
 
         w.KeyDown += async (_, e) => await MainKeyboardShortcuts.MainWindow_KeysDownAsync(e).ConfigureAwait(false);
         w.KeyUp += (_, e) => MainKeyboardShortcuts.MainWindow_KeysUp(e);

+ 15 - 51
src/PicView.Avalonia/UI/TooltipHelper.cs

@@ -1,7 +1,6 @@
 using Avalonia;
 using Avalonia.Threading;
 using PicView.Avalonia.Animations;
-using PicView.Avalonia.Views.UC;
 using VerticalAlignment = Avalonia.Layout.VerticalAlignment;
 
 namespace PicView.Avalonia.UI;
@@ -23,6 +22,7 @@ public static class TooltipHelper
     {
         try
         {
+            var toolTip = UIHelper.GetToolTipMessage;
             var startAnimation = AnimationsHelper.OpacityAnimation(0, 1, .6);
             var endAnimation = AnimationsHelper.OpacityAnimation(1, 0, .5);
         
@@ -30,13 +30,13 @@ public static class TooltipHelper
             {
                 await Dispatcher.UIThread.InvokeAsync(() =>
                 {
-                    GetToolTipMessage.Opacity = 1;
-                    GetToolTipMessage.ToolTipMessageText.Text = message.ToString();
-                    GetToolTipMessage.Margin = center ? new Thickness(0) : new Thickness(0, 0, 0, 15);
-                    GetToolTipMessage.VerticalAlignment = center ? VerticalAlignment.Center : VerticalAlignment.Bottom;
+                    UIHelper.GetToolTipMessage.Opacity = 1;
+                    toolTip.ToolTipMessageText.Text = message.ToString();
+                    toolTip.Margin = center ? new Thickness(0) : new Thickness(0, 0, 0, 15);
+                    toolTip.VerticalAlignment = center ? VerticalAlignment.Center : VerticalAlignment.Bottom;
                 });
                 await Task.Delay(interval);
-                await endAnimation.RunAsync(GetToolTipMessage);
+                await endAnimation.RunAsync(UIHelper.GetToolTipMessage);
                 _isRunning = false;
                 return;
             }
@@ -44,15 +44,15 @@ public static class TooltipHelper
             await Dispatcher.UIThread.InvokeAsync(() =>
             {
                 _isRunning = true;
-                GetToolTipMessage.IsVisible = true;
-                GetToolTipMessage.ToolTipMessageText.Text = message.ToString();
-                GetToolTipMessage.Margin = center ? new Thickness(0) : new Thickness(0, 0, 0, 15);
-                GetToolTipMessage.VerticalAlignment = center ? VerticalAlignment.Center : VerticalAlignment.Bottom;
-                GetToolTipMessage.Opacity = 0;
+                UIHelper.GetToolTipMessage.IsVisible = true;
+                UIHelper.GetToolTipMessage.ToolTipMessageText.Text = message.ToString();
+                UIHelper.GetToolTipMessage.Margin = center ? new Thickness(0) : new Thickness(0, 0, 0, 15);
+                UIHelper.GetToolTipMessage.VerticalAlignment = center ? VerticalAlignment.Center : VerticalAlignment.Bottom;
+                UIHelper.GetToolTipMessage.Opacity = 0;
             });
-            await startAnimation.RunAsync(GetToolTipMessage);
+            await startAnimation.RunAsync(UIHelper.GetToolTipMessage);
             await Task.Delay(interval);
-            await endAnimation.RunAsync(GetToolTipMessage);
+            await endAnimation.RunAsync(UIHelper.GetToolTipMessage);
             _isRunning = false;
         }
         catch (Exception e)
@@ -78,7 +78,7 @@ public static class TooltipHelper
             {
                 Dispatcher.UIThread.Invoke(() =>
                 {
-                    var toolTip = GetToolTipMessage;
+                    var toolTip = UIHelper.GetToolTipMessage;
                     if (toolTip != null)
                     {
                         toolTip.Opacity = 0;
@@ -94,7 +94,7 @@ public static class TooltipHelper
         {
             Dispatcher.UIThread.Invoke(() =>
             {
-                var toolTip = GetToolTipMessage;
+                var toolTip = UIHelper.GetToolTipMessage;
                 if (toolTip is null)
                 {
                     return;
@@ -134,40 +134,4 @@ public static class TooltipHelper
     {
         await ShowTooltipMessageAsync(message, center, TimeSpan.FromSeconds(2));
     }
-
-    /// <summary>
-    /// Gets the tooltip message control from the main view.
-    /// </summary>
-    private static ToolTipMessage? GetToolTipMessage
-    {
-        get
-        {
-            return Dispatcher.UIThread.Invoke(() =>
-            {
-                var mainView = UIHelper.GetMainView;
-                return mainView.MainGrid.Children.OfType<ToolTipMessage>().FirstOrDefault();
-            });
-        }
-    }
-
-    /// <summary>
-    /// Closes the tooltip message.
-    /// </summary>
-    internal static void CloseToolTipMessage()
-    {
-        var toolTip = GetToolTipMessage;
-        if (toolTip == null)
-        {
-            return;
-        }
-
-        if (toolTip.CheckAccess())
-        {
-            toolTip.IsVisible = false;
-        }
-        else
-        {
-            Dispatcher.UIThread.Invoke(() => toolTip.IsVisible = false);
-        }
-    }
 }

+ 3 - 17
src/PicView.Avalonia/UI/UIHelper.cs

@@ -18,23 +18,6 @@ namespace PicView.Avalonia.UI
 {
     public static class UIHelper
     {
-        #region Add Controls
-
-        public static void AddToolTipMessage()
-        {
-            var mainView = GetMainView;
-            var toolTipMessage = new ToolTipMessage
-            {
-                VerticalAlignment = VerticalAlignment.Center,
-                HorizontalAlignment = HorizontalAlignment.Center,
-                Opacity = 0
-            };
-
-            mainView.MainGrid.Children.Add(toolTipMessage);
-        }
-
-        #endregion
-
         #region GetControls
 
         public static MainView? GetMainView { get; private set; }
@@ -43,6 +26,8 @@ namespace PicView.Avalonia.UI
         public static GalleryAnimationControlView? GetGalleryView { get; private set; }
 
         public static BottomBar? GetBottomBar { get; private set; }
+        
+        public static ToolTipMessage? GetToolTipMessage { get; private set; }
 
         public static void SetControls(IClassicDesktopStyleApplicationLifetime desktop)
         {
@@ -51,6 +36,7 @@ namespace PicView.Avalonia.UI
             GetEditableTitlebar = GetTitlebar.FindControl<EditableTitlebar>("EditableTitlebar");
             GetGalleryView = GetMainView.MainGrid.GetControl<GalleryAnimationControlView>("GalleryView");
             GetBottomBar = desktop.MainWindow.FindControl<BottomBar>("BottomBar");
+            GetToolTipMessage = GetMainView.MainGrid.FindControl<ToolTipMessage>("ToolTipMessage");
         }
 
         #endregion

+ 5 - 0
src/PicView.Avalonia/Views/MainView.axaml

@@ -754,5 +754,10 @@
             Width="{CompiledBinding GalleryWidth,
                                     Mode=OneWay}"
             x:Name="GalleryView" />
+        <uc:ToolTipMessage
+            HorizontalAlignment="Center"
+            Opacity="0"
+            VerticalAlignment="Center"
+            x:Name="ToolTipMessage" />
     </Panel>
 </UserControl>