瀏覽代碼

Fixed clipboard not working reliably on linux

flabbet 1 周之前
父節點
當前提交
9ef128708b

+ 3 - 1
src/PixiEditor/Models/Clipboard/PixiEditorClipboard.cs

@@ -1,4 +1,5 @@
-using Avalonia.Input;
+using System.Collections.Concurrent;
+using Avalonia.Input;
 using Avalonia.Input.Platform;
 using Avalonia.Input.Platform;
 using Avalonia.Platform.Storage;
 using Avalonia.Platform.Storage;
 
 
@@ -7,6 +8,7 @@ namespace PixiEditor.Models.Clipboard;
 public class PixiEditorClipboard : IPixiEditorClipboard
 public class PixiEditorClipboard : IPixiEditorClipboard
 {
 {
     private IClipboard avaloniaClipboard;
     private IClipboard avaloniaClipboard;
+    private List<IAsyncDataTransferItem>? lastProcessingDataTransfers;
 
 
     public PixiEditorClipboard(IClipboard avaloniaClipboard)
     public PixiEditorClipboard(IClipboard avaloniaClipboard)
     {
     {

+ 33 - 21
src/PixiEditor/Models/Controllers/ClipboardController.cs

@@ -64,7 +64,8 @@ internal static class ClipboardController
     /// </summary>
     /// </summary>
     public static async Task CopyToClipboard(DocumentViewModel document, RectD? lastTransform)
     public static async Task CopyToClipboard(DocumentViewModel document, RectD? lastTransform)
     {
     {
-        await Clipboard.ClearAsync();
+        // This breaks often on X11 and macos
+        //await Clipboard.ClearAsync();
 
 
         DataTransfer transfer = new DataTransfer();
         DataTransfer transfer = new DataTransfer();
 
 
@@ -145,7 +146,8 @@ internal static class ClipboardController
 
 
     public static async Task CopyVisibleToClipboard(DocumentViewModel document, string? output = null)
     public static async Task CopyVisibleToClipboard(DocumentViewModel document, string? output = null)
     {
     {
-        await Clipboard.ClearAsync();
+        // This breaks often on X11 and macos
+        //await Clipboard.ClearAsync();
 
 
         DataTransfer data = new DataTransfer();
         DataTransfer data = new DataTransfer();
 
 
@@ -255,6 +257,7 @@ internal static class ClipboardController
             List<Guid> adjustedLayerIds = AdjustIdsForImport(layerIds, targetDoc);
             List<Guid> adjustedLayerIds = AdjustIdsForImport(layerIds, targetDoc);
             List<Guid?> newIds = new();
             List<Guid?> newIds = new();
             using var block = document.Operations.StartChangeBlock();
             using var block = document.Operations.StartChangeBlock();
+            manager.Owner.ToolsSubViewModel.SetActiveTool<MoveToolViewModel>(false);
             foreach (var layerId in adjustedLayerIds)
             foreach (var layerId in adjustedLayerIds)
             {
             {
                 if (targetDoc.StructureHelper.Find(layerId) == null)
                 if (targetDoc.StructureHelper.Find(layerId) == null)
@@ -270,7 +273,6 @@ internal static class ClipboardController
                 }
                 }
             }
             }
 
 
-            manager.Owner.ToolsSubViewModel.SetActiveTool<MoveToolViewModel>(false);
             Guid? mainGuid = newIds.FirstOrDefault(x => x != null);
             Guid? mainGuid = newIds.FirstOrDefault(x => x != null);
             if (mainGuid != null)
             if (mainGuid != null)
             {
             {
@@ -293,29 +295,37 @@ internal static class ClipboardController
         List<DataImage> images = await GetImage(data);
         List<DataImage> images = await GetImage(data);
         if (images.Count == 0 || pasteAsNew)
         if (images.Count == 0 || pasteAsNew)
         {
         {
-            return await TryPasteNestedDocument(document, manager, data);
+            if (await TryPasteNestedDocument(document, manager, data))
+            {
+                return true;
+            }
         }
         }
 
 
-        if (images.Count == 1 || (images.Count > 1 && !pasteAsNew))
+        if (images.Count > 0)
         {
         {
-            var dataImage = images[0];
-            var position = dataImage.Position;
-
-            if (document.SizeBindable.X < position.X || document.SizeBindable.Y < position.Y || !hasPos)
+            if (!pasteAsNew)
             {
             {
-                position = VecI.Zero;
-            }
+                var dataImage = images[0];
+                var position = dataImage.Position;
 
 
-            manager.Owner.ToolsSubViewModel.SetActiveTool<MoveToolViewModel>(false);
-            document.Operations.InvokeCustomAction(() =>
-            {
-                document.Operations.PasteImageWithTransform(dataImage.Image, position);
-            });
+                if (document.SizeBindable.X < position.X || document.SizeBindable.Y < position.Y || !hasPos)
+                {
+                    position = VecI.Zero;
+                }
 
 
-            return true;
+                manager.Owner.ToolsSubViewModel.SetActiveTool<MoveToolViewModel>(false);
+                document.Operations.InvokeCustomAction(() =>
+                {
+                    document.Operations.PasteImageWithTransform(dataImage.Image, position);
+                });
+            }
+            else
+            {
+                manager.Owner.ToolsSubViewModel.SetActiveTool<MoveToolViewModel>(false);
+                document.Operations.PasteImagesAsLayers(images, document.AnimationDataViewModel.ActiveFrameBindable, images.Count > 1);
+            }
         }
         }
 
 
-        document.Operations.PasteImagesAsLayers(images, document.AnimationDataViewModel.ActiveFrameBindable);
         return true;
         return true;
     }
     }
 
 
@@ -346,7 +356,7 @@ internal static class ClipboardController
                 }
                 }
 
 
                 bool imported = TryPlaceNestedDocument(document, manager, path, out _);
                 bool imported = TryPlaceNestedDocument(document, manager, path, out _);
-                if(!imported)
+                if (!imported)
                 {
                 {
                     continue;
                     continue;
                 }
                 }
@@ -360,7 +370,8 @@ internal static class ClipboardController
         return false;
         return false;
     }
     }
 
 
-    public static bool TryPlaceNestedDocument(DocumentViewModel document, DocumentManagerViewModel manager, string path, out string? error)
+    public static bool TryPlaceNestedDocument(DocumentViewModel document, DocumentManagerViewModel manager, string path,
+        out string? error)
     {
     {
         try
         try
         {
         {
@@ -980,7 +991,8 @@ internal static class ClipboardController
 
 
     public static async Task CopyIds(Guid[] ids, DataFormat<byte[]> format, Guid docId)
     public static async Task CopyIds(Guid[] ids, DataFormat<byte[]> format, Guid docId)
     {
     {
-        await Clipboard.ClearAsync();
+        // This breaks often on X11 and macos
+        //await Clipboard.ClearAsync();
 
 
         DataTransfer data = new DataTransfer();
         DataTransfer data = new DataTransfer();
 
 

+ 10 - 7
src/PixiEditor/Models/DocumentModels/Public/DocumentOperationsModule.cs

@@ -189,7 +189,7 @@ internal class DocumentOperationsModule : IDocumentOperations
     /// Pastes the <paramref name="images"/> as new layers
     /// Pastes the <paramref name="images"/> as new layers
     /// </summary>
     /// </summary>
     /// <param name="images">The images to paste</param>
     /// <param name="images">The images to paste</param>
-    public void PasteImagesAsLayers(List<DataImage> images, int frame)
+    public void PasteImagesAsLayers(List<DataImage> images, int frame, bool resizeCanvasIfNeeded = true)
     {
     {
         if (Internals.ChangeController.IsBlockingChangeActive)
         if (Internals.ChangeController.IsBlockingChangeActive)
             return;
             return;
@@ -198,14 +198,17 @@ internal class DocumentOperationsModule : IDocumentOperations
 
 
         var changeBlock = Document.Operations.StartChangeBlock();
         var changeBlock = Document.Operations.StartChangeBlock();
 
 
-        RectI maxSize = new RectI(VecI.Zero, Document.SizeBindable);
-        foreach (var imageWithName in images)
+        if (resizeCanvasIfNeeded)
         {
         {
-            maxSize = maxSize.Union(new RectI(imageWithName.Position, imageWithName.Image.Size));
-        }
+            RectI maxSize = new RectI(VecI.Zero, Document.SizeBindable);
+            foreach (var imageWithName in images)
+            {
+                maxSize = maxSize.Union(new RectI(imageWithName.Position, imageWithName.Image.Size));
+            }
 
 
-        if (maxSize.Size != Document.SizeBindable)
-            Internals.ActionAccumulator.AddActions(new ResizeCanvas_Action(maxSize.Size, ResizeAnchor.TopLeft));
+            if (maxSize.Size != Document.SizeBindable)
+                Internals.ActionAccumulator.AddActions(new ResizeCanvas_Action(maxSize.Size, ResizeAnchor.TopLeft));
+        }
 
 
         foreach (var imageWithName in images)
         foreach (var imageWithName in images)
         {
         {