瀏覽代碼

Refactor file sorting and retrieval logic: replace `RetrieveFiles` return type with `List<FileInfo>`, integrate `platformService` for cross-platform sorting, refactor sorting methods into `FileSortOrder`, and update dependent classes and usages for consistency.

Ruben 4 月之前
父節點
當前提交
934759f90d

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

@@ -123,8 +123,7 @@ public class App : Application, IPlatformSpecificService, IPlatformWindowService
 
     public List<FileInfo> GetFiles(FileInfo fileInfo)
     {
-        var files = FileListRetriever.RetrieveFiles(fileInfo);
-        return FileListManager.SortIEnumerable(files, this);
+        return FileListRetriever.RetrieveFiles(fileInfo, CompareStrings);
     }
 
     public int CompareStrings(string str1, string str2)

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

@@ -7,7 +7,6 @@ using Avalonia.Threading;
 using Clowd.Clipboard;
 using PicView.Avalonia.ColorManagement;
 using PicView.Avalonia.Interfaces;
-using PicView.Avalonia.Navigation;
 using PicView.Avalonia.StartUp;
 using PicView.Avalonia.ViewModels;
 using PicView.Avalonia.Win32.Views;
@@ -143,8 +142,7 @@ public class App : Application, IPlatformSpecificService, IPlatformWindowService
 
     public List<FileInfo> GetFiles(FileInfo fileInfo)
     {
-        var files = FileListRetriever.RetrieveFiles(fileInfo);
-        return FileListManager.SortIEnumerable(files, this);
+        return FileListRetriever.RetrieveFiles(fileInfo, CompareStrings);
     }
 
     public int CompareStrings(string str1, string str2)

+ 1 - 2
src/PicView.Avalonia/Converters/SortFilesByToBoolConverter.cs

@@ -9,10 +9,9 @@ public class SortFilesByToBoolConverter : IValueConverter
 {
     public object Convert(object? value, Type targetType, object? parameter, CultureInfo culture)
     {
-        var sortOrder = FileSortOrder.GetSortOrder();
         if (Enum.TryParse<SortFilesBy>(parameter as string, true, out var result))
         {
-            return sortOrder == result;
+            return FileSortOrder.GetSortOrder == result;
         }
         return false;
     }

+ 0 - 2
src/PicView.Avalonia/Gallery/GalleryLoad.cs

@@ -35,8 +35,6 @@ public static class GalleryLoad
             {
                 return;
             }
-
-            return;
         }
 
         await Dispatcher.UIThread.InvokeAsync(() =>

+ 0 - 61
src/PicView.Avalonia/Navigation/FileListManager.cs

@@ -13,67 +13,6 @@ public static class FileListManager
 {
     private static CancellationTokenSource? _cancellationTokenSource;
 
-    /// <summary>
-    /// Sorts an enumerable collection of file paths based on the specified sort order and platform-specific string comparison.
-    /// </summary>
-    /// <param name="files">The collection of file paths to sort.</param>
-    /// <param name="platformService">Platform-specific service for string comparison.</param>
-    /// <returns>A sorted list of file paths.</returns>
-    public static List<FileInfo> SortIEnumerable(IEnumerable<FileInfo> files, IPlatformSpecificService? platformService)
-    {
-        var sortFilesBy = FileSortOrder.GetSortOrder();
-
-        switch (sortFilesBy)
-        {
-            default:
-            case SortFilesBy.Name: // Alphanumeric sort
-                var list = files.ToList();
-                if (Settings.Sorting.Ascending)
-                {
-                    list.Sort((x, y) => platformService.CompareStrings(x.Name, y.Name));
-                }
-                else
-                {
-                    list.Sort((x, y) => platformService.CompareStrings(y.Name, x.Name));
-                }
-
-                return list;
-
-            case SortFilesBy.FileSize: // Sort by file size
-                var sortedBySize = Settings.Sorting.Ascending
-                    ? files.OrderBy(x => x.Length)
-                    : files.OrderByDescending(x => x.Length);
-                return sortedBySize.ToList();
-
-            case SortFilesBy.Extension: // Sort by file extension
-                var sortedByExtension = Settings.Sorting.Ascending
-                    ? files.OrderBy(x => x.Extension)
-                    : files.OrderByDescending(x => x.Extension);
-                return sortedByExtension.ToList();
-
-            case SortFilesBy.CreationTime: // Sort by file creation time
-                var sortedByCreationTime = Settings.Sorting.Ascending
-                    ? files.OrderBy(x => x.CreationTime)
-                    : files.OrderByDescending(x => x.CreationTime);
-                return sortedByCreationTime.ToList();
-
-            case SortFilesBy.LastAccessTime: // Sort by file last access time
-                var sortedByLastAccessTime = Settings.Sorting.Ascending
-                    ? files.OrderBy(x => x.LastAccessTime)
-                    : files.OrderByDescending(x => x.LastAccessTime);
-                return sortedByLastAccessTime.ToList();
-
-            case SortFilesBy.LastWriteTime: // Sort by file last write time
-                var sortedByLastWriteTime = Settings.Sorting.Ascending
-                    ? files.OrderBy(x => x.LastWriteTime)
-                    : files.OrderByDescending(x => x.LastWriteTime);
-                return sortedByLastWriteTime.ToList();
-
-            case SortFilesBy.Random: // Sort files randomly
-                return files.OrderBy(f => Guid.NewGuid()).ToList();
-        }
-    }
-
     /// <summary>
     /// Updates the file list in the view model based on the specified sort order.
     /// </summary>

+ 23 - 6
src/PicView.Avalonia/Navigation/NavigationManager.cs

@@ -27,7 +27,6 @@ public static class NavigationManager
     // Should be updated to handle multiple iterators in the future when adding tab support
     public static ImageIterator? ImageIterator { get; private set; }
 
-
     /// <summary>
     /// Loads a picture from a given file, reloads the ImageIterator and loads the corresponding gallery from the file's
     /// directory.
@@ -157,15 +156,33 @@ public static class NavigationManager
             await GalleryNavigation.ScrollGallery(next);
             return;
         }
+        
+        var navigateTo = next ? NavigateTo.Next : NavigateTo.Previous;
+        int nextIteration;
 
         if (ImageIterator.CurrentIndex < 0 || ImageIterator.CurrentIndex >= ImageIterator.ImagePaths.Count)
         {
-            ErrorHandling.ShowStartUpMenu(vm);
-            return;
+            if (vm.PicViewer.FileInfo is not null)
+            {
+                var newIndex = ImageIterator.ImagePaths.FindIndex(x => x.FullName.Equals(vm.PicViewer.FileInfo.FullName));
+                if (newIndex == -1)
+                {
+                    ErrorHandling.ShowStartUpMenu(vm);
+                    return;
+                }
+                nextIteration = newIndex;
+            }
+            else
+            {
+                ErrorHandling.ShowStartUpMenu(vm);
+                return;
+            }
         }
-
-        var navigateTo = next ? NavigateTo.Next : NavigateTo.Previous;
-        var nextIteration = ImageIterator.GetIteration(ImageIterator.CurrentIndex, navigateTo);
+        else
+        {
+            nextIteration = ImageIterator.GetIteration(ImageIterator.CurrentIndex, navigateTo);
+        }
+         
         var currentFileName = ImageIterator.ImagePaths[ImageIterator.CurrentIndex].FullName;
         if (TiffManager.IsTiff(currentFileName))
         {

+ 6 - 3
src/PicView.Avalonia/Views/BatchResizeView.axaml.cs

@@ -12,7 +12,6 @@ using PicView.Avalonia.UI;
 using PicView.Avalonia.ViewModels;
 using PicView.Core.Extensions;
 using PicView.Core.FileHandling;
-using PicView.Core.FileSorting;
 using PicView.Core.ImageDecoding;
 using PicView.Core.Localization;
 using PicView.Core.Titles;
@@ -246,6 +245,11 @@ public partial class BatchResizeView : UserControl
 
     private async Task StartBatchResize()
     {
+        if (DataContext is not MainViewModel vm)
+        {
+            return;
+        }
+        
         try
         {
             _cancellationTokenSource = new CancellationTokenSource();
@@ -262,8 +266,7 @@ public partial class BatchResizeView : UserControl
 
             _isRunning = true;
 
-            var files = await Task.FromResult(
-                    FileListRetriever.RetrieveFiles(new FileInfo(SourceFolderTextBox.Text)))
+            var files = await Task.FromResult(vm.PlatformService.GetFiles(new FileInfo(SourceFolderTextBox.Text)))
                 .ConfigureAwait(true);
 
             if (!Directory.Exists(OutputFolderTextBox.Text))

+ 7 - 5
src/PicView.Core/FileSorting/FileListRetriever.cs

@@ -6,7 +6,7 @@ namespace PicView.Core.FileSorting;
 
 public static class FileListRetriever
 {
-    public static IEnumerable<FileInfo> RetrieveFiles(FileInfo fileInfo)
+    public static List<FileInfo> RetrieveFiles(FileInfo fileInfo, Func<string, string, int> platformService)
     {
         var directoryPath = fileInfo switch
         {
@@ -27,15 +27,17 @@ public static class FileListRetriever
         {
             if (recurseSubdirectories)
             {
-                return new DirectoryInfo(directoryPath)
+                var recurseList = new DirectoryInfo(directoryPath)
                     .DescendantsAndSelf()
                     .OfType<FileInfo>()
-                    .Where(x => x.Extension.IsSupported()).ToList();
+                    .Where(x => x.Extension.IsSupported());
+                return FileSortOrder.SortIEnumerable(recurseList, platformService);
             }
-            return new DirectoryInfo(directoryPath)
+            var list = new DirectoryInfo(directoryPath)
                 .ChildrenAndSelf()
                 .OfType<FileInfo>()
-                .Where(x => x.Extension.IsSupported()).ToList();
+                .Where(x => x.Extension.IsSupported());
+            return FileSortOrder.SortIEnumerable(list, platformService);
         }
         catch (Exception exception)
         {

+ 110 - 4
src/PicView.Core/FileSorting/FileSortOrder.cs

@@ -1,10 +1,13 @@
-namespace PicView.Core.FileSorting;
+using ZLinq;
+using ZLinq.Linq;
+using ZLinq.Traversables;
+
+namespace PicView.Core.FileSorting;
 
 public static class FileSortOrder
 {
-    public static SortFilesBy GetSortOrder()
-    {
-        return Settings.Sorting.SortPreference switch
+    public static SortFilesBy GetSortOrder =>
+        Settings.Sorting.SortPreference switch
         {
             0 => SortFilesBy.Name,
             1 => SortFilesBy.FileSize,
@@ -15,5 +18,108 @@ public static class FileSortOrder
             6 => SortFilesBy.Random,
             _ => SortFilesBy.Name,
         };
+
+    public static List<FileInfo> SortIEnumerable(ValueEnumerable<Where<OfType<Descendants<FileSystemInfoTraverser, FileSystemInfo>, FileSystemInfo, FileInfo>, FileInfo>, FileInfo> files, Func<string, string, int> platformService)
+    {
+        switch (GetSortOrder)
+        {
+            default:
+            case SortFilesBy.Name: // Alphanumeric sort
+                var list = files.ToList();
+                if (Settings.Sorting.Ascending)
+                {
+                    list.Sort((x, y) => platformService(x.Name, y.Name));
+                }
+                else
+                {
+                    list.Sort((x, y) => platformService(y.Name, x.Name));
+                }
+                return list;
+
+            case SortFilesBy.FileSize: // Sort by file size
+                var sortedBySize = Settings.Sorting.Ascending
+                    ? files.OrderBy(x => x.Length)
+                    : files.OrderByDescending(x => x.Length);
+                return sortedBySize.ToList();
+
+            case SortFilesBy.Extension: // Sort by file extension
+                var sortedByExtension = Settings.Sorting.Ascending
+                    ? files.OrderBy(x => x.Extension)
+                    : files.OrderByDescending(x => x.Extension);
+                return sortedByExtension.ToList();
+
+            case SortFilesBy.CreationTime: // Sort by file creation time
+                var sortedByCreationTime = Settings.Sorting.Ascending
+                    ? files.OrderBy(x => x.CreationTime)
+                    : files.OrderByDescending(x => x.CreationTime);
+                return sortedByCreationTime.ToList();
+
+            case SortFilesBy.LastAccessTime: // Sort by file last access time
+                var sortedByLastAccessTime = Settings.Sorting.Ascending
+                    ? files.OrderBy(x => x.LastAccessTime)
+                    : files.OrderByDescending(x => x.LastAccessTime);
+                return sortedByLastAccessTime.ToList();
+
+            case SortFilesBy.LastWriteTime: // Sort by file last write time
+                var sortedByLastWriteTime = Settings.Sorting.Ascending
+                    ? files.OrderBy(x => x.LastWriteTime)
+                    : files.OrderByDescending(x => x.LastWriteTime);
+                return sortedByLastWriteTime.ToList();
+
+            case SortFilesBy.Random: // Sort files randomly
+                return files.OrderBy(f => Guid.NewGuid()).ToList();
+        }
+    }
+
+    public static List<FileInfo> SortIEnumerable(ValueEnumerable<Where<OfType<Children<FileSystemInfoTraverser, FileSystemInfo>, FileSystemInfo, FileInfo>, FileInfo>, FileInfo> files, Func<string, string, int> platformService)
+    {
+        switch (GetSortOrder)
+        {
+            default:
+            case SortFilesBy.Name: // Alphanumeric sort
+                var list = files.ToList();
+                if (Settings.Sorting.Ascending)
+                {
+                    list.Sort((x, y) => platformService(x.Name, y.Name));
+                }
+                else
+                {
+                    list.Sort((x, y) => platformService(y.Name, x.Name));
+                }
+                return list;
+
+            case SortFilesBy.FileSize: // Sort by file size
+                var sortedBySize = Settings.Sorting.Ascending
+                    ? files.OrderBy(x => x.Length)
+                    : files.OrderByDescending(x => x.Length);
+                return sortedBySize.ToList();
+
+            case SortFilesBy.Extension: // Sort by file extension
+                var sortedByExtension = Settings.Sorting.Ascending
+                    ? files.OrderBy(x => x.Extension)
+                    : files.OrderByDescending(x => x.Extension);
+                return sortedByExtension.ToList();
+
+            case SortFilesBy.CreationTime: // Sort by file creation time
+                var sortedByCreationTime = Settings.Sorting.Ascending
+                    ? files.OrderBy(x => x.CreationTime)
+                    : files.OrderByDescending(x => x.CreationTime);
+                return sortedByCreationTime.ToList();
+
+            case SortFilesBy.LastAccessTime: // Sort by file last access time
+                var sortedByLastAccessTime = Settings.Sorting.Ascending
+                    ? files.OrderBy(x => x.LastAccessTime)
+                    : files.OrderByDescending(x => x.LastAccessTime);
+                return sortedByLastAccessTime.ToList();
+
+            case SortFilesBy.LastWriteTime: // Sort by file last write time
+                var sortedByLastWriteTime = Settings.Sorting.Ascending
+                    ? files.OrderBy(x => x.LastWriteTime)
+                    : files.OrderByDescending(x => x.LastWriteTime);
+                return sortedByLastWriteTime.ToList();
+
+            case SortFilesBy.Random: // Sort files randomly
+                return files.OrderBy(f => Guid.NewGuid()).ToList();
+        }
     }
 }