Browse Source

Fixed center content for non-image layers

flabbet 8 months ago
parent
commit
810f2d1354

+ 56 - 21
src/PixiEditor.ChangeableDocument/Changes/Root/CenterContent_Change.cs

@@ -1,7 +1,11 @@
-using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes;
+using ChunkyImageLib.Operations;
+using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes;
 using PixiEditor.ChangeableDocument.Changes.Drawing;
 using PixiEditor.ChangeableDocument.Changes.Drawing;
 using Drawie.Backend.Core.Numerics;
 using Drawie.Backend.Core.Numerics;
 using Drawie.Numerics;
 using Drawie.Numerics;
+using PixiEditor.ChangeableDocument.Changeables.Graph.Interfaces;
+using PixiEditor.ChangeableDocument.ChangeInfos.Objects;
+using PixiEditor.ChangeableDocument.ChangeInfos.Vectors;
 
 
 namespace PixiEditor.ChangeableDocument.Changes.Root;
 namespace PixiEditor.ChangeableDocument.Changes.Root;
 
 
@@ -11,6 +15,7 @@ internal class CenterContent_Change : Change
     private List<Guid> affectedLayers;
     private List<Guid> affectedLayers;
     private Dictionary<Guid, CommittedChunkStorage>? originalLayerChunks;
     private Dictionary<Guid, CommittedChunkStorage>? originalLayerChunks;
     private int frame;
     private int frame;
+    private VecD oldDelta;
 
 
     [GenerateMakeChangeAction]
     [GenerateMakeChangeAction]
     public CenterContent_Change(List<Guid> layers, int frame)
     public CenterContent_Change(List<Guid> layers, int frame)
@@ -18,7 +23,7 @@ internal class CenterContent_Change : Change
         this.frame = frame;
         this.frame = frame;
         affectedLayers = layers;
         affectedLayers = layers;
     }
     }
-    
+
     public override bool InitializeAndValidate(Document target)
     public override bool InitializeAndValidate(Document target)
     {
     {
         if (affectedLayers.Count == 0)
         if (affectedLayers.Count == 0)
@@ -34,7 +39,7 @@ internal class CenterContent_Change : Change
         }
         }
 
 
         _oldOffset = CalculateCurrentOffset(target);
         _oldOffset = CalculateCurrentOffset(target);
-        
+
         return true;
         return true;
     }
     }
 
 
@@ -54,31 +59,42 @@ internal class CenterContent_Change : Change
                     currentBounds.Value.Y + currentBounds.Value.Height / 2);
                     currentBounds.Value.Y + currentBounds.Value.Height / 2);
             }
             }
         }
         }
-        
+
         return currentCenter;
         return currentCenter;
     }
     }
 
 
-    public override OneOf<None, IChangeInfo, List<IChangeInfo>> Apply(Document target, bool firstApply, out bool ignoreInUndo)
+    public override OneOf<None, IChangeInfo, List<IChangeInfo>> Apply(Document target, bool firstApply,
+        out bool ignoreInUndo)
     {
     {
         VecI documentCenter = target.Size / 2;
         VecI documentCenter = target.Size / 2;
         VecI currentOffset = _oldOffset;
         VecI currentOffset = _oldOffset;
         
         
         VecI shift = documentCenter - currentOffset;
         VecI shift = documentCenter - currentOffset;
 
 
+        oldDelta = shift;
+        
         List<IChangeInfo> changes = new List<IChangeInfo>();
         List<IChangeInfo> changes = new List<IChangeInfo>();
         originalLayerChunks = new Dictionary<Guid, CommittedChunkStorage>();
         originalLayerChunks = new Dictionary<Guid, CommittedChunkStorage>();
-        
+
         foreach (var layerGuid in affectedLayers)
         foreach (var layerGuid in affectedLayers)
         {
         {
-            ImageLayerNode node = target.FindMemberOrThrow<ImageLayerNode>(layerGuid);
-            var chunks = ShiftLayerHelper.DrawShiftedLayer(target, layerGuid, false, shift, frame);
-            changes.Add(new LayerImageArea_ChangeInfo(layerGuid, chunks));
-
-            // TODO: Adding support for non-raster layer should be easy, add
-            
-            var image = node.GetLayerImageAtFrame(frame);
-            originalLayerChunks[layerGuid] = new CommittedChunkStorage(image, image.FindAffectedArea().Chunks);
-            image.CommitChanges();
+            LayerNode node = target.FindMemberOrThrow<LayerNode>(layerGuid);
+
+            if (node is ImageLayerNode imageLayerNode)
+            {
+                var chunks = ShiftLayerHelper.DrawShiftedLayer(target, layerGuid, false, shift, frame);
+                changes.Add(new LayerImageArea_ChangeInfo(layerGuid, chunks));
+                var image = imageLayerNode.GetLayerImageAtFrame(frame);
+                originalLayerChunks[layerGuid] = new CommittedChunkStorage(image, image.FindAffectedArea().Chunks);
+                image.CommitChanges();
+            }
+            else if (node is ITransformableObject transformable)
+            {
+                transformable.TransformationMatrix = transformable.TransformationMatrix.PostConcat(
+                    Matrix3X3.CreateTranslation(shift.X, shift.Y));
+                var affectedArea = FromSize(target);
+                changes.Add(new TransformObject_ChangeInfo(layerGuid, affectedArea));
+            }
         }
         }
 
 
         ignoreInUndo = shift.TaxicabLength == 0;
         ignoreInUndo = shift.TaxicabLength == 0;
@@ -90,15 +106,34 @@ internal class CenterContent_Change : Change
         List<IChangeInfo> changes = new List<IChangeInfo>();
         List<IChangeInfo> changes = new List<IChangeInfo>();
         foreach (var layerGuid in affectedLayers)
         foreach (var layerGuid in affectedLayers)
         {
         {
-            var image = target.FindMemberOrThrow<ImageLayerNode>(layerGuid).GetLayerImageAtFrame(frame);
-            CommittedChunkStorage? originalChunks = originalLayerChunks?[layerGuid];
-            var affected = DrawingChangeHelper.ApplyStoredChunksDisposeAndSetToNull(image, ref originalChunks);
-            changes.Add(new LayerImageArea_ChangeInfo(layerGuid, affected));
+            var layerNode = target.FindMemberOrThrow<LayerNode>(layerGuid);
+
+            if (layerNode is ImageLayerNode imageNode)
+            {
+                var image = imageNode.GetLayerImageAtFrame(frame);
+                CommittedChunkStorage? originalChunks = originalLayerChunks?[layerGuid];
+                var affected = DrawingChangeHelper.ApplyStoredChunksDisposeAndSetToNull(image, ref originalChunks);
+                changes.Add(new LayerImageArea_ChangeInfo(layerGuid, affected));
+            }
+            else if (layerNode is ITransformableObject transformable)
+            {
+                transformable.TransformationMatrix = transformable.TransformationMatrix.PostConcat(
+                    Matrix3X3.CreateTranslation((float)-oldDelta.X, (float)-oldDelta.Y));
+                
+                var affectedArea = FromSize(target);
+                changes.Add(new TransformObject_ChangeInfo(layerGuid, affectedArea));
+            }
         }
         }
-        
+
         return changes;
         return changes;
     }
     }
 
 
+    private AffectedArea FromSize(Document target)
+    {
+        RectI bounds = new RectI(VecI.Zero, target.Size);
+        return new AffectedArea(OperationHelper.FindChunksTouchingRectangle(bounds, ChunkyImage.FullChunkSize));
+    }
+
     public override void Dispose()
     public override void Dispose()
     {
     {
         if (originalLayerChunks == null)
         if (originalLayerChunks == null)
@@ -110,7 +145,7 @@ internal class CenterContent_Change : Change
         {
         {
             layerChunk.Value.Dispose();
             layerChunk.Value.Dispose();
         }
         }
-        
+
         originalLayerChunks = null;
         originalLayerChunks = null;
     }
     }
 }
 }

+ 4 - 1
src/PixiEditor.ChangeableDocument/DocumentChangeTracker.cs

@@ -97,7 +97,10 @@ public class DocumentChangeTracker : IDisposable
              (IsHomologous(undoStack.Peek()) &&
              (IsHomologous(undoStack.Peek()) &&
               undoStack.Peek().changes[^1].IsMergeableWith(activePacket[0].change))))
               undoStack.Peek().changes[^1].IsMergeableWith(activePacket[0].change))))
         {
         {
-            undoStack.Peek().changes.Add(activePacket[0].change);
+            var last = undoStack.Pop();
+            last.changes.Add(activePacket[0].change);
+            last.source = activePacket.Any(x => x.source == ActionSource.User) ? ActionSource.User : source;
+            undoStack.Push(last);
         }
         }
         else
         else
         {
         {