Browse Source

Merge pull request #917 from PixiEditor/fixes/30.04.2025

Fixed importing images and deleting keyframes
Krzysztof Krysiński 3 months ago
parent
commit
b0fe541332

+ 3 - 2
src/PixiEditor.ChangeableDocument/Changeables/Graph/Nodes/Node.cs

@@ -509,7 +509,8 @@ public abstract class Node : IReadOnlyNode, IDisposable
 
 
         foreach (var keyFrame in keyFrames)
         foreach (var keyFrame in keyFrames)
         {
         {
-            KeyFrameData newKeyFrame = new KeyFrameData(keyFrame.KeyFrameGuid, keyFrame.StartFrame, keyFrame.Duration,
+            Guid newGuid = Guid.NewGuid();
+            KeyFrameData newKeyFrame = new KeyFrameData(newGuid, keyFrame.StartFrame, keyFrame.Duration,
                 keyFrame.AffectedElement)
                 keyFrame.AffectedElement)
             {
             {
                 IsVisible = keyFrame.IsVisible,
                 IsVisible = keyFrame.IsVisible,
@@ -517,7 +518,7 @@ public abstract class Node : IReadOnlyNode, IDisposable
                 Data = keyFrame.Data is ICloneable cloneable ? cloneable.Clone() : keyFrame.Data
                 Data = keyFrame.Data is ICloneable cloneable ? cloneable.Clone() : keyFrame.Data
             };
             };
 
 
-            clone.AddFrame(newKeyFrame.KeyFrameGuid, newKeyFrame);
+            clone.AddFrame(newGuid, newKeyFrame);
         }
         }
 
 
         return clone;
         return clone;

+ 1 - 1
src/PixiEditor.ChangeableDocument/Changes/Animation/CreateAnimationDataFromLayer_Change.cs

@@ -27,7 +27,7 @@ internal class CreateAnimationDataFromLayer_Change : Change
         List<IChangeInfo> infos = new List<IChangeInfo>();
         List<IChangeInfo> infos = new List<IChangeInfo>();
         foreach (var frame in layer.KeyFrames)
         foreach (var frame in layer.KeyFrames)
         {
         {
-            Guid keyFrameId = Guid.NewGuid();
+            Guid keyFrameId = frame.KeyFrameGuid;
             target.AnimationData.AddKeyFrame(new RasterKeyFrame(keyFrameId, layer.Id, frame.StartFrame, target)
             target.AnimationData.AddKeyFrame(new RasterKeyFrame(keyFrameId, layer.Id, frame.StartFrame, target)
             {
             {
                 Duration = frame.Duration
                 Duration = frame.Duration

+ 13 - 0
src/PixiEditor.ChangeableDocument/Changes/Structure/ImportLayer_Change.cs

@@ -58,6 +58,7 @@ internal class ImportLayer_Change : Change
 
 
         var clone = (LayerNode)layerNode.Clone();
         var clone = (LayerNode)layerNode.Clone();
         clone.Id = duplicateGuid;
         clone.Id = duplicateGuid;
+        ResizeImageData(clone, target.Size);
 
 
         var targetInput = target.NodeGraph.OutputNode?.InputProperties.FirstOrDefault(x =>
         var targetInput = target.NodeGraph.OutputNode?.InputProperties.FirstOrDefault(x =>
             x.ValueType == typeof(Painter)) as InputProperty<Painter?>;
             x.ValueType == typeof(Painter)) as InputProperty<Painter?>;
@@ -108,5 +109,17 @@ internal class ImportLayer_Change : Change
     {
     {
         sourceDocumentPipe?.Dispose();
         sourceDocumentPipe?.Dispose();
     }
     }
+
+    private void ResizeImageData(LayerNode layerNode, VecI docSize)
+    {
+        foreach (var imageData in layerNode.KeyFrames)
+        {
+            if (imageData.Data is ChunkyImage img)
+            {
+                img.EnqueueResize(docSize);
+                img.CommitChanges();
+            }
+        }
+    }
 }
 }
 
 

+ 17 - 16
src/PixiEditor/Helpers/GeometryHelper.cs

@@ -6,31 +6,32 @@ public static class GeometryHelper
 {
 {
     public static VecD Get45IncrementedPosition(VecD startPos, VecD curPos)
     public static VecD Get45IncrementedPosition(VecD startPos, VecD curPos)
     {
     {
-        Span<VecD> positions =
+
+        VecD delta = curPos - startPos;
+        VecD signs = delta.Signs();
+        VecD offset = new VecD(0).Multiply(signs);
+
+        VecD[] positions =
         [
         [
-            (curPos.ProjectOntoLine(startPos, startPos + new VecD(1, 1)) -
-                   new VecD(0.25).Multiply((curPos - startPos).Signs())),
-            (curPos.ProjectOntoLine(startPos, startPos + new VecD(1, -1)) -
-                   new VecD(0.25).Multiply((curPos - startPos).Signs())),
-            (curPos.ProjectOntoLine(startPos, startPos + new VecD(1, 0)) -
-                   new VecD(0.25).Multiply((curPos - startPos).Signs())),
-            (curPos.ProjectOntoLine(startPos, startPos + new VecD(0, 1)) -
-                   new VecD(0.25).Multiply((curPos - startPos).Signs()))
+            curPos.ProjectOntoLine(startPos, startPos + new VecD(1, 1)),
+            curPos.ProjectOntoLine(startPos, startPos + new VecD(1, -1)),
+            curPos.ProjectOntoLine(startPos, startPos + new VecD(1, 0)),
+            curPos.ProjectOntoLine(startPos, startPos + new VecD(0, 1))
         ];
         ];
 
 
-        VecD max = positions[0];
-        double maxLength = double.MaxValue;
+        VecD closest = positions[0];
+        double minDistSq = double.MaxValue;
         foreach (var pos in positions)
         foreach (var pos in positions)
         {
         {
-            double length = (pos - curPos).LengthSquared;
-            if (length < maxLength)
+            double distSq = (pos - curPos).LengthSquared;
+            if (distSq < minDistSq)
             {
             {
-                maxLength = length;
-                max = pos;
+                minDistSq = distSq;
+                closest = pos;
             }
             }
         }
         }
 
 
-        return max;
+        return closest;
     }
     }
 
 
     public static VecI Get45IncrementedPositionAligned(VecD startPos, VecD curPos)
     public static VecI Get45IncrementedPositionAligned(VecD startPos, VecD curPos)

+ 1 - 1
src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/LineExecutor.cs

@@ -155,7 +155,7 @@ internal abstract class LineExecutor<T> : SimpleShapeToolExecutor where T : ILin
             startDrawingPos = center + (center - snapped);
             startDrawingPos = center + (center - snapped);
         }
         }
 
 
-        HighlightSnapping(snapX, snapY);
+        HighlightSnapping(snapX, snapY, !string.IsNullOrEmpty(snapX) || !string.IsNullOrEmpty(snapY) ? snapped : null);
         document!.LineToolOverlayHandler.LineEnd = snapped;
         document!.LineToolOverlayHandler.LineEnd = snapped;
 
 
         curPos = snapped;
         curPos = snapped;

+ 15 - 8
src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/SimpleShapeToolExecutor.cs

@@ -73,7 +73,11 @@ internal abstract class SimpleShapeToolExecutor : UpdateableChangeExecutor,
             ActiveMode = ShapeToolMode.Preview;
             ActiveMode = ShapeToolMode.Preview;
         }
         }
 
 
-        restoreSnapping = DisableSelfSnapping(memberId, document);
+        if (controller.LeftMousePressed)
+        {
+            restoreSnapping?.Dispose();
+            restoreSnapping = DisableSelfSnapping(memberId, document);
+        }
 
 
         return ExecutionState.Success;
         return ExecutionState.Success;
     }
     }
@@ -127,6 +131,9 @@ internal abstract class SimpleShapeToolExecutor : UpdateableChangeExecutor,
         {
         {
             ActiveMode = ShapeToolMode.Drawing;
             ActiveMode = ShapeToolMode.Drawing;
         }
         }
+
+        restoreSnapping?.Dispose();
+        restoreSnapping = DisableSelfSnapping(memberId, document);
     }
     }
 
 
     public override void OnPrecisePositionChange(VecD pos)
     public override void OnPrecisePositionChange(VecD pos)
@@ -147,7 +154,7 @@ internal abstract class SimpleShapeToolExecutor : UpdateableChangeExecutor,
 
 
     public override void OnLeftMouseButtonUp(VecD argsPositionOnCanvas)
     public override void OnLeftMouseButtonUp(VecD argsPositionOnCanvas)
     {
     {
-        HighlightSnapping(null, null);
+        HighlightSnapping(null, null, null);
         ActiveMode = ShapeToolMode.Transform;
         ActiveMode = ShapeToolMode.Transform;
     }
     }
 
 
@@ -161,7 +168,7 @@ internal abstract class SimpleShapeToolExecutor : UpdateableChangeExecutor,
     {
     {
         ActiveMode = ShapeToolMode.Preview;
         ActiveMode = ShapeToolMode.Preview;
         AddMembersToSnapping();
         AddMembersToSnapping();
-        HighlightSnapping(null, null);
+        HighlightSnapping(null, null, null);
     }
     }
 
 
     public virtual void OnLineOverlayMoved(VecD start, VecD end)
     public virtual void OnLineOverlayMoved(VecD start, VecD end)
@@ -176,14 +183,14 @@ internal abstract class SimpleShapeToolExecutor : UpdateableChangeExecutor,
     {
     {
         StopMode(activeMode);
         StopMode(activeMode);
         AddMembersToSnapping();
         AddMembersToSnapping();
-        HighlightSnapping(null, null);
+        HighlightSnapping(null, null, null);
     }
     }
 
 
-    protected void HighlightSnapping(string? snapX, string? snapY)
+    protected void HighlightSnapping(string? snapX, string? snapY, VecD? snapPoint)
     {
     {
         document!.SnappingHandler.SnappingController.HighlightedXAxis = snapX;
         document!.SnappingHandler.SnappingController.HighlightedXAxis = snapX;
         document!.SnappingHandler.SnappingController.HighlightedYAxis = snapY;
         document!.SnappingHandler.SnappingController.HighlightedYAxis = snapY;
-        document.SnappingHandler.SnappingController.HighlightedPoint = null;
+        document.SnappingHandler.SnappingController.HighlightedPoint = snapPoint;
     }
     }
 
 
     protected void AddMembersToSnapping()
     protected void AddMembersToSnapping()
@@ -195,7 +202,7 @@ internal abstract class SimpleShapeToolExecutor : UpdateableChangeExecutor,
     {
     {
         VecD snapped =
         VecD snapped =
             document.SnappingHandler.SnappingController.GetSnapPoint(pos, out string snapX, out string snapY);
             document.SnappingHandler.SnappingController.GetSnapPoint(pos, out string snapX, out string snapY);
-        HighlightSnapping(snapX, snapY);
+        HighlightSnapping(snapX, snapY, snapped);
         return snapped;
         return snapped;
     }
     }
 
 
@@ -204,7 +211,7 @@ internal abstract class SimpleShapeToolExecutor : UpdateableChangeExecutor,
         VecD mouseSnap =
         VecD mouseSnap =
             document.SnappingHandler.SnappingController.GetSnapPoint(pos, out string snapXAxis,
             document.SnappingHandler.SnappingController.GetSnapPoint(pos, out string snapXAxis,
                 out string snapYAxis);
                 out string snapYAxis);
-        HighlightSnapping(snapXAxis, snapYAxis);
+        HighlightSnapping(snapXAxis, snapYAxis, null);
 
 
         if (!string.IsNullOrEmpty(snapXAxis) || !string.IsNullOrEmpty(snapYAxis))
         if (!string.IsNullOrEmpty(snapXAxis) || !string.IsNullOrEmpty(snapYAxis))
         {
         {

+ 4 - 14
src/PixiEditor/ViewModels/SubViewModels/ToolsViewModel.cs

@@ -135,7 +135,7 @@ internal class ToolsViewModel : SubViewModel<ViewModelMain>, IToolsHandler
                 var foundToolSet = toolsets.FirstOrDefault(x => x.Name == toolSetConfig.Name);
                 var foundToolSet = toolsets.FirstOrDefault(x => x.Name == toolSetConfig.Name);
                 if (foundToolSet is not null)
                 if (foundToolSet is not null)
                 {
                 {
-                   AllToolSets.Add(foundToolSet);
+                    AllToolSets.Add(foundToolSet);
                 }
                 }
             }
             }
 
 
@@ -424,6 +424,7 @@ internal class ToolsViewModel : SubViewModel<ViewModelMain>, IToolsHandler
         {
         {
             if (ActiveTool.LayerTypeToCreateOnEmptyUse == null) return;
             if (ActiveTool.LayerTypeToCreateOnEmptyUse == null) return;
 
 
+            using var changeBlock = Owner.DocumentManagerSubViewModel.ActiveDocument.Operations.StartChangeBlock();
             Guid? createdLayer = Owner.LayersSubViewModel.NewLayer(
             Guid? createdLayer = Owner.LayersSubViewModel.NewLayer(
                 ActiveTool.LayerTypeToCreateOnEmptyUse,
                 ActiveTool.LayerTypeToCreateOnEmptyUse,
                 ActionSource.Automated,
                 ActionSource.Automated,
@@ -433,21 +434,10 @@ internal class ToolsViewModel : SubViewModel<ViewModelMain>, IToolsHandler
                 Owner.DocumentManagerSubViewModel.ActiveDocument.Operations.SetSelectedMember(createdLayer.Value);
                 Owner.DocumentManagerSubViewModel.ActiveDocument.Operations.SetSelectedMember(createdLayer.Value);
             }
             }
 
 
-            waitForChange = true;
+            changeBlock.ExecuteQueuedActions();
         }
         }
 
 
-        if (waitForChange)
-        {
-            Owner.DocumentManagerSubViewModel.ActiveDocument.Operations
-                .InvokeCustomAction(() =>
-                {
-                    ActiveTool.UseTool(canvasPos);
-                });
-        }
-        else
-        {
-            ActiveTool.UseTool(canvasPos);
-        }
+        ActiveTool.UseTool(canvasPos);
     }
     }
 
 
     public void ConvertedKeyDownInlet(FilteredKeyEventArgs args)
     public void ConvertedKeyDownInlet(FilteredKeyEventArgs args)