Browse Source

Fixed clipboard pasting errors

Krzysztof Krysiński 1 year ago
parent
commit
3c10aa3e08

+ 8 - 5
src/PixiEditor.AvaloniaUI/Helpers/Extensions/DataObjectExtensions.cs

@@ -1,5 +1,8 @@
-using System.Collections.Generic;
+using System.Collections;
+using System.Collections.Generic;
+using System.Linq;
 using Avalonia.Input;
+using Avalonia.Platform.Storage;
 using PixiEditor.DrawingApi.Core.Numerics;
 
 namespace PixiEditor.AvaloniaUI.Helpers.Extensions;
@@ -16,15 +19,15 @@ public static class DataObjectExtensions
         data.Set(DataFormats.Files, files);
     }
 
-    public static string[] GetFileDropList(this DataObject data)
+    public static IStorageItem[] GetFileDropList(this IDataObject data)
     {
         if (!data.Contains(DataFormats.Files))
-            return Array.Empty<string>();
+            return Array.Empty<IStorageItem>();
 
-        return (string[])data.Get(DataFormats.Files);
+        return ((IEnumerable<IStorageItem>)data.Get(DataFormats.Files)).ToArray();
     }
 
-    public static VecI GetVecI(this DataObject data, string format)
+    public static VecI GetVecI(this IDataObject data, string format)
     {
         if (!data.Contains(format))
             return VecI.NegativeOne;

+ 10 - 8
src/PixiEditor.AvaloniaUI/Models/Controllers/ClipboardController.cs

@@ -8,6 +8,7 @@ using Avalonia.Input;
 using Avalonia.Input.Platform;
 using Avalonia.Media.Imaging;
 using Avalonia.Platform;
+using Avalonia.Platform.Storage;
 using ChunkyImageLib;
 using PixiEditor.AvaloniaUI.Helpers;
 using PixiEditor.AvaloniaUI.Helpers.Constants;
@@ -91,7 +92,7 @@ internal static class ClipboardController
     /// <summary>
     ///     Pastes image from clipboard into new layer.
     /// </summary>
-    public static bool TryPaste(DocumentViewModel document, DataObject data, bool pasteAsNew = false)
+    public static bool TryPaste(DocumentViewModel document, IDataObject data, bool pasteAsNew = false)
     {
         List<DataImage> images = GetImage(data);
         if (images.Count == 0)
@@ -170,7 +171,7 @@ internal static class ClipboardController
     /// <summary>
     /// Gets images from clipboard, supported PNG, Dib and Bitmap.
     /// </summary>
-    public static List<DataImage> GetImage(DataObject? data)
+    public static List<DataImage> GetImage(IDataObject? data)
     {
         List<DataImage> surfaces = new();
 
@@ -188,7 +189,8 @@ internal static class ClipboardController
             return surfaces;
         }
 
-        foreach (string? path in data.GetFileDropList())
+        var paths = data.GetFileDropList().Select(x => x.Path.AbsolutePath).ToArray();
+        foreach (string? path in paths)
         {
             if (path is null || !Importer.IsSupportedFile(path))
                 continue;
@@ -250,7 +252,7 @@ internal static class ClipboardController
         return IsImageFormat(fileArray);
     }
 
-    public static bool IsImage(DataObject? dataObject)
+    public static bool IsImage(IDataObject? dataObject)
     {
         if (dataObject == null)
             return false;
@@ -260,7 +262,7 @@ internal static class ClipboardController
             var files = dataObject.GetFileDropList();
             if (files != null)
             {
-                if (IsImageFormat(files))
+                if (IsImageFormat(files.Select(x => x.Path.AbsolutePath).ToArray()))
                 {
                     return true;
                 }
@@ -287,16 +289,16 @@ internal static class ClipboardController
         return false;
     }
 
-    private static Bitmap FromPNG(DataObject data)
+    private static Bitmap FromPNG(IDataObject data)
     {
         MemoryStream pngStream = (MemoryStream)data.Get("PNG");
         Bitmap bitmap = new Bitmap(pngStream);
         return bitmap;
     }
 
-    private static bool HasData(DataObject dataObject, params string[] formats) => formats.Any(dataObject.Contains);
+    private static bool HasData(IDataObject dataObject, params string[] formats) => formats.Any(dataObject.Contains);
     
-    private static bool TryExtractSingleImage(DataObject data, [NotNullWhen(true)] out Surface? result)
+    private static bool TryExtractSingleImage(IDataObject data, [NotNullWhen(true)] out Surface? result)
     {
         try
         {

+ 3 - 3
src/PixiEditor.AvaloniaUI/ViewModels/SubViewModels/ClipboardViewModel.cs

@@ -49,7 +49,7 @@ internal class ClipboardViewModel : SubViewModel<ViewModelMain>
     }
     
     [Command.Basic("PixiEditor.Clipboard.PasteReferenceLayer", "PASTE_REFERENCE_LAYER", "PASTE_REFERENCE_LAYER_DESCRIPTIVE", CanExecute = "PixiEditor.Clipboard.CanPaste")]
-    public async Task PasteReferenceLayer(DataObject data)
+    public async Task PasteReferenceLayer(IDataObject data)
     {
         var doc = Owner.DocumentManagerSubViewModel.ActiveDocument;
 
@@ -138,9 +138,9 @@ internal class ClipboardViewModel : SubViewModel<ViewModelMain>
     }
 
     [Evaluator.CanExecute("PixiEditor.Clipboard.CanPaste")]
-    public async Task<bool> CanPaste(object parameter)
+    public bool CanPaste(object parameter)
     {
-        return Owner.DocumentIsNotNull(null) && parameter is DataObject data ? ClipboardController.IsImage(data) : await ClipboardController.IsImageInClipboard();
+        return Owner.DocumentIsNotNull(null) && parameter is IDataObject data ? ClipboardController.IsImage(data) : ClipboardController.IsImageInClipboard().Result;
     }
 
     [Evaluator.CanExecute("PixiEditor.Clipboard.CanPasteColor")]

+ 2 - 2
src/PixiEditor.AvaloniaUI/Views/Layers/LayersManager.axaml.cs

@@ -137,7 +137,7 @@ internal partial class LayersManager : UserControl
             e.Handled = true;
         }
 
-        if (ClipboardController.TryPaste(ActiveDocument, (DataObject)e.Data, true))
+        if (ClipboardController.TryPaste(ActiveDocument, (IDataObject)e.Data, true))
         {
             e.Handled = true;
         }
@@ -154,7 +154,7 @@ internal partial class LayersManager : UserControl
 
         if (member == null)
         {
-            if (!ClipboardController.IsImage((DataObject)e.Data))
+            if (!ClipboardController.IsImage((IDataObject)e.Data))
             {
                 return;
             }