Browse Source

Allow transform on dropped image

CPKreuz 2 years ago
parent
commit
f876b789cc

+ 13 - 2
src/PixiEditor/Models/Controllers/ClipboardController.cs

@@ -7,6 +7,7 @@ using System.Windows.Media;
 using System.Windows.Media.Imaging;
 using System.Windows.Media.Imaging;
 using ChunkyImageLib;
 using ChunkyImageLib;
 using ChunkyImageLib.DataHolders;
 using ChunkyImageLib.DataHolders;
+using PixiEditor.ChangeableDocument.Enums;
 using PixiEditor.DrawingApi.Core.Numerics;
 using PixiEditor.DrawingApi.Core.Numerics;
 using PixiEditor.DrawingApi.Core.Surface.ImageData;
 using PixiEditor.DrawingApi.Core.Surface.ImageData;
 using PixiEditor.Helpers;
 using PixiEditor.Helpers;
@@ -74,9 +75,19 @@ internal static class ClipboardController
         if (images.Count == 0)
         if (images.Count == 0)
             return false;
             return false;
 
 
-        if (images.Count == 1 && !pasteAsNew)
+        if (images.Count == 1)
         {
         {
-            document.Operations.PasteImageWithTransform(images[0].image, VecI.Zero);
+            if (pasteAsNew)
+            {
+                var guid = document.Operations.CreateStructureMember(StructureMemberType.Layer, "New Layer", false).Value;
+                document.Operations.SetSelectedMember(guid);
+                document.Operations.PasteImageWithTransform(images[0].image, VecI.Zero, guid, false);
+            }
+            else
+            {
+                document.Operations.PasteImageWithTransform(images[0].image, VecI.Zero);
+            }
+            
             return true;
             return true;
         }
         }
 
 

+ 15 - 3
src/PixiEditor/Models/DocumentModels/Public/DocumentOperationsModule.cs

@@ -119,7 +119,7 @@ internal class DocumentOperationsModule
 
 
         foreach (var imageWithName in images)
         foreach (var imageWithName in images)
         {
         {
-            var layerGuid = Internals.StructureHelper.CreateNewStructureMember(StructureMemberType.Layer, imageWithName.name, true);
+            var layerGuid = Internals.StructureHelper.CreateNewStructureMember(StructureMemberType.Layer, imageWithName.name);
             DrawImage(imageWithName.image, new ShapeCorners(new RectD(VecD.Zero, imageWithName.image.Size)), layerGuid, true, false, false);
             DrawImage(imageWithName.image, new ShapeCorners(new RectD(VecD.Zero, imageWithName.image.Size)), layerGuid, true, false, false);
         }
         }
         Internals.ActionAccumulator.AddFinishedActions();
         Internals.ActionAccumulator.AddFinishedActions();
@@ -131,11 +131,11 @@ internal class DocumentOperationsModule
     /// <param name="type">The type of the member</param>
     /// <param name="type">The type of the member</param>
     /// <param name="name">The name of the member</param>
     /// <param name="name">The name of the member</param>
     /// <returns>The Guid of the new structure member</returns>
     /// <returns>The Guid of the new structure member</returns>
-    public Guid? CreateStructureMember(StructureMemberType type, string? name = null)
+    public Guid? CreateStructureMember(StructureMemberType type, string? name = null, bool finish = true)
     {
     {
         if (Internals.ChangeController.IsChangeActive)
         if (Internals.ChangeController.IsChangeActive)
             return null;
             return null;
-        return Internals.StructureHelper.CreateNewStructureMember(type, name, true);
+        return Internals.StructureHelper.CreateNewStructureMember(type, name, finish);
     }
     }
 
 
     /// <summary>
     /// <summary>
@@ -361,6 +361,18 @@ internal class DocumentOperationsModule
         Internals.ChangeController.TryStartExecutor(new PasteImageExecutor(image, startPos));
         Internals.ChangeController.TryStartExecutor(new PasteImageExecutor(image, startPos));
     }
     }
 
 
+    /// <summary>
+    /// Starts a image transform and pastes the transformed image on the currently selected layer
+    /// </summary>
+    /// <param name="image">The image to paste</param>
+    /// <param name="startPos">Where the transform should start</param>
+    public void PasteImageWithTransform(Surface image, VecI startPos, Guid memberGuid, bool drawOnMask)
+    {
+        if (Document.SelectedStructureMember is null)
+            return;
+        Internals.ChangeController.TryStartExecutor(new PasteImageExecutor(image, startPos, memberGuid, drawOnMask));
+    }
+
     /// <summary>
     /// <summary>
     /// Starts a transform on the selected area
     /// Starts a transform on the selected area
     /// </summary>
     /// </summary>

+ 27 - 13
src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/PasteImageExecutor.cs

@@ -11,7 +11,7 @@ internal class PasteImageExecutor : UpdateableChangeExecutor
     private readonly Surface image;
     private readonly Surface image;
     private readonly VecI pos;
     private readonly VecI pos;
     private bool drawOnMask;
     private bool drawOnMask;
-    private Guid memberGuid;
+    private Guid? memberGuid;
 
 
     public PasteImageExecutor(Surface image, VecI pos)
     public PasteImageExecutor(Surface image, VecI pos)
     {
     {
@@ -19,22 +19,36 @@ internal class PasteImageExecutor : UpdateableChangeExecutor
         this.pos = pos;
         this.pos = pos;
     }
     }
 
 
+    public PasteImageExecutor(Surface image, VecI pos, Guid memberGuid, bool drawOnMask)
+    {
+        this.image = image;
+        this.pos = pos;
+        this.memberGuid = memberGuid;
+        this.drawOnMask = drawOnMask;
+    }
+    
     public override ExecutionState Start()
     public override ExecutionState Start()
     {
     {
-        var member = document!.SelectedStructureMember;
-
-        if (member is null)
-            return ExecutionState.Error;
-        drawOnMask = member is LayerViewModel layer ? layer.ShouldDrawOnMask : true;
-        if (drawOnMask && !member.HasMaskBindable)
-            return ExecutionState.Error;
-        if (!drawOnMask && member is not LayerViewModel)
-            return ExecutionState.Error;
+        if (memberGuid == null)
+        {
+            var member = document!.SelectedStructureMember;
 
 
-        memberGuid = member.GuidValue;
+            if (member is null)
+                return ExecutionState.Error;
+            drawOnMask = member is not LayerViewModel layer || layer.ShouldDrawOnMask;
+            
+            switch (drawOnMask)
+            {
+                case true when !member.HasMaskBindable:
+                case false when member is not LayerViewModel:
+                    return ExecutionState.Error;
+            }
+            
+            memberGuid = member.GuidValue;
+        }
 
 
         ShapeCorners corners = new(new RectD(pos, image.Size));
         ShapeCorners corners = new(new RectD(pos, image.Size));
-        internals!.ActionAccumulator.AddActions(new PasteImage_Action(image, corners, memberGuid, false, drawOnMask));
+        internals!.ActionAccumulator.AddActions(new PasteImage_Action(image, corners, memberGuid.Value, false, drawOnMask));
         document.TransformViewModel.ShowTransform(DocumentTransformMode.Scale_Rotate_Shear_Perspective, true, corners, true);
         document.TransformViewModel.ShowTransform(DocumentTransformMode.Scale_Rotate_Shear_Perspective, true, corners, true);
 
 
         return ExecutionState.Success;
         return ExecutionState.Success;
@@ -42,7 +56,7 @@ internal class PasteImageExecutor : UpdateableChangeExecutor
 
 
     public override void OnTransformMoved(ShapeCorners corners)
     public override void OnTransformMoved(ShapeCorners corners)
     {
     {
-        internals!.ActionAccumulator.AddActions(new PasteImage_Action(image, corners, memberGuid, false, drawOnMask));
+        internals!.ActionAccumulator.AddActions(new PasteImage_Action(image, corners, memberGuid.Value, false, drawOnMask));
     }
     }
 
 
     public override void OnTransformApplied()
     public override void OnTransformApplied()