Browse Source

Add support for copying files to clipboard on macOS

Remove `MainViewModel` dependency from `CopyFileToClipboard`

- Refactored `CopyFileToClipboard` to eliminate the `MainViewModel` parameter, simplifying method usage.
- Added checks for clipboard and storage provider availability.
- Updated method to handle clipboard file operations natively using Avalonia's APIs.
Ruben 3 days ago
parent
commit
eedc6dd7a5

+ 14 - 16
src/PicView.Avalonia/Clipboard/ClipboardFileOperations.cs

@@ -1,4 +1,7 @@
 using System.Runtime.InteropServices;
+using Avalonia;
+using Avalonia.Controls.ApplicationLifetimes;
+using Avalonia.Input.Platform;
 using Avalonia.Platform.Storage;
 using PicView.Avalonia.Animations;
 using PicView.Avalonia.Navigation;
@@ -115,27 +118,22 @@ public static class ClipboardFileOperations
     /// Copies a file to the clipboard
     /// </summary>
     /// <param name="filePath">Path to the file</param>
-    /// <param name="vm">The main view model</param>
     /// <returns>A task representing the asynchronous operation</returns>
-    public static async Task CopyFileToClipboard(string? filePath, MainViewModel vm)
+    public static async Task CopyFileToClipboard(string? filePath)
     {
-        if (string.IsNullOrWhiteSpace(filePath))
-        {
-            return;
-        }
-
-        if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
+        if (string.IsNullOrWhiteSpace(filePath) ||
+            Application.Current?.ApplicationLifetime is not IClassicDesktopStyleApplicationLifetime desktop ||
+            desktop.MainWindow?.Clipboard is not { } clipboard ||
+            desktop.MainWindow?.StorageProvider is not { } storageProvider)
         {
-            // TODO add clipboard file copy on macOS 
             return;
         }
-
-        var tasks = new[]
-        {
-            AnimationsHelper.CopyAnimation(),
-            Task.Run(() => vm.PlatformService.CopyFile(filePath))
-        };
-        await Task.WhenAll(tasks);
+        
+        var animTask = AnimationsHelper.CopyAnimation();
+        var storageFile = await storageProvider.TryGetFileFromPathAsync(filePath);
+        var fileTask = clipboard.SetFileAsync(storageFile);
+        
+        await Task.WhenAll(animTask, fileTask);
     }
 
     /// <summary>

+ 1 - 1
src/PicView.Avalonia/Functions/FunctionsMapper.cs

@@ -590,7 +590,7 @@ public static class FunctionsMapper
 
     /// <inheritdoc cref="ClipboardFileOperations.CopyFileToClipboard(string, MainViewModel)" />
     public static async ValueTask CopyFile() =>
-        await ClipboardFileOperations.CopyFileToClipboard(Vm?.PicViewer.FileInfo?.CurrentValue.FullName, Vm).ConfigureAwait(false);
+        await ClipboardFileOperations.CopyFileToClipboard(Vm?.PicViewer.FileInfo?.CurrentValue.FullName).ConfigureAwait(false);
     
     /// <inheritdoc cref="ClipboardTextOperations.CopyTextToClipboard(string)" />
     public static async ValueTask CopyFilePath() => 

+ 1 - 4
src/PicView.Avalonia/ViewModels/ToolsViewModel.cs

@@ -128,10 +128,7 @@ public class ToolsViewModel : IDisposable
 
     public ReactiveCommand<string> CopyFileCommand { get; } = new(async (path, _) =>
     {
-        if (UIHelper.GetMainView.DataContext is MainViewModel vm)
-        {
-            await ClipboardFileOperations.CopyFileToClipboard(path, vm).ConfigureAwait(false);
-        }
+        await ClipboardFileOperations.CopyFileToClipboard(path).ConfigureAwait(false);
     });
 
     public ReactiveCommand<string> CopyFilePathCommand { get; } = new(async (path, _) =>