Browse Source

Fixed merging vectors with transform matrix and undo indicators

Krzysztof Krysiński 4 months ago
parent
commit
a5c3553644

+ 1 - 1
src/PixiEditor.ChangeableDocument/Changeables/Graph/Interfaces/IReadOnlyShapeVectorData.cs

@@ -16,5 +16,5 @@ public interface IReadOnlyShapeVectorData
     public RectD GeometryAABB { get; }
     public RectD TransformedAABB { get; }
     public ShapeCorners TransformationCorners { get; }
-    public VectorPath ToPath();
+    public VectorPath ToPath(bool transformed = false);
 }

+ 6 - 3
src/PixiEditor.ChangeableDocument/Changeables/Graph/Nodes/Shapes/Data/EllipseVectorData.cs

@@ -85,14 +85,17 @@ public class EllipseVectorData : ShapeVectorData, IReadOnlyEllipseData
 
     protected override void AdjustCopy(ShapeVectorData copy)
     {
-       
     }
 
-    public override VectorPath ToPath()
+    public override VectorPath ToPath(bool transformed = false)
     {
-        // TODO: Apply transformation matrix
         VectorPath path = new VectorPath();
         path.AddOval(RectD.FromCenterAndSize(Center, Radius * 2));
+        if (transformed)
+        {
+            path.Transform(TransformationMatrix);
+        }
+
         return path;
     }
 }

+ 7 - 4
src/PixiEditor.ChangeableDocument/Changeables/Graph/Nodes/Shapes/Data/LineVectorData.cs

@@ -58,7 +58,7 @@ public class LineVectorData : ShapeVectorData, IReadOnlyLineData
     {
         Start = startPos;
         End = endPos;
-        
+
         Fill = false;
     }
 
@@ -108,13 +108,16 @@ public class LineVectorData : ShapeVectorData, IReadOnlyLineData
         return hash.ToHashCode();
     }
 
-    public override VectorPath ToPath()
+    public override VectorPath ToPath(bool transformed = false)
     {
-        // TODO: Apply transformation matrix
-
         VectorPath path = new VectorPath();
         path.MoveTo((VecF)Start);
         path.LineTo((VecF)End);
+        if (transformed)
+        {
+            path.Transform(TransformationMatrix);
+        }
+
         return path;
     }
 }

+ 11 - 5
src/PixiEditor.ChangeableDocument/Changeables/Graph/Nodes/Shapes/Data/PathVectorData.cs

@@ -18,7 +18,7 @@ public class PathVectorData : ShapeVectorData, IReadOnlyPathData
         new ShapeCorners(GeometryAABB).WithMatrix(TransformationMatrix);
 
     public StrokeCap StrokeLineCap { get; set; } = StrokeCap.Round;
-    
+
     public StrokeJoin StrokeLineJoin { get; set; } = StrokeJoin.Round;
 
     public PathVectorData(VectorPath path)
@@ -42,7 +42,7 @@ public class PathVectorData : ShapeVectorData, IReadOnlyPathData
 
     private void Rasterize(Canvas canvas, bool applyTransform)
     {
-        if(Path == null)
+        if (Path == null)
         {
             return;
         }
@@ -72,7 +72,7 @@ public class PathVectorData : ShapeVectorData, IReadOnlyPathData
             paint.SetPaintable(Stroke);
             paint.Style = PaintStyle.Stroke;
             paint.StrokeWidth = StrokeWidth;
-            
+
             canvas.DrawPath(Path, paint);
         }
 
@@ -105,8 +105,14 @@ public class PathVectorData : ShapeVectorData, IReadOnlyPathData
         }
     }
 
-    public override VectorPath ToPath()
+    public override VectorPath ToPath(bool transformed = false)
     {
-        return new VectorPath(Path);
+        VectorPath newPath = new VectorPath(Path);
+        if (transformed)
+        {
+            newPath.Transform(TransformationMatrix);
+        }
+
+        return newPath;
     }
 }

+ 8 - 3
src/PixiEditor.ChangeableDocument/Changeables/Graph/Nodes/Shapes/Data/PointsVectorData.cs

@@ -76,15 +76,20 @@ public class PointsVectorData : ShapeVectorData
         }
     }
 
-    public override VectorPath ToPath()
+    public override VectorPath ToPath(bool transformed = false)
     {
         VectorPath path = new VectorPath();
-        
+
         foreach (VecD point in Points)
         {
             path.LineTo((VecF)point);
         }
-        
+
+        if (transformed)
+        {
+            path.Transform(TransformationMatrix);
+        }
+
         return path;
     }
 }

+ 7 - 2
src/PixiEditor.ChangeableDocument/Changeables/Graph/Nodes/Shapes/Data/RectangleVectorData.cs

@@ -34,7 +34,7 @@ public class RectangleVectorData : ShapeVectorData, IReadOnlyRectangleData
         Center = center;
         Size = size;
     }
-    
+
     public RectangleVectorData(double x, double y, double width, double height)
     {
         Center = new VecD(x + width / 2, y + height / 2);
@@ -95,10 +95,15 @@ public class RectangleVectorData : ShapeVectorData, IReadOnlyRectangleData
         return HashCode.Combine(Center, Size);
     }
 
-    public override VectorPath ToPath()
+    public override VectorPath ToPath(bool transformed = false)
     {
         VectorPath path = new VectorPath();
         path.AddRect(RectD.FromCenterAndSize(Center, Size));
+        if (transformed)
+        {
+            path.Transform(TransformationMatrix);
+        }
+
         return path;
     }
 }

+ 1 - 1
src/PixiEditor.ChangeableDocument/Changeables/Graph/Nodes/Shapes/Data/ShapeVectorData.cs

@@ -81,5 +81,5 @@ public abstract class ShapeVectorData : ICacheable, ICloneable, IReadOnlyShapeVe
         return GetCacheHash();
     }
 
-    public abstract VectorPath ToPath();
+    public abstract VectorPath ToPath(bool transformed = false);
 }

+ 8 - 4
src/PixiEditor.ChangeableDocument/Changeables/Graph/Nodes/Shapes/Data/TextVectorData.cs

@@ -88,12 +88,12 @@ public class TextVectorData : ShapeVectorData, IReadOnlyTextData
             lastBounds = richText.MeasureBounds(Font);
         }
     }
-    
+
     public bool AntiAlias { get; set; } = true;
 
     protected override void OnStrokeWidthChanged()
     {
-        if(richText == null)
+        if (richText == null)
         {
             return;
         }
@@ -135,7 +135,6 @@ public class TextVectorData : ShapeVectorData, IReadOnlyTextData
 
     public TextVectorData()
     {
-
     }
 
     public TextVectorData(string text)
@@ -144,11 +143,16 @@ public class TextVectorData : ShapeVectorData, IReadOnlyTextData
     }
 
 
-    public override VectorPath ToPath()
+    public override VectorPath ToPath(bool transformed = false)
     {
         var path = richText.ToPath(Font);
         path.Offset(Position);
 
+        if (transformed)
+        {
+            path.Transform(TransformationMatrix);
+        }
+
         return path;
     }
 

+ 5 - 3
src/PixiEditor.ChangeableDocument/Changes/Drawing/CombineStructureMembersOnto_Change.cs

@@ -205,7 +205,8 @@ internal class CombineStructureMembersOnto_Change : Change
             if (targetData == null)
             {
                 targetData = vectorNode.ShapeData;
-                targetPath = path;
+                targetPath = new VectorPath();
+                targetPath.AddPath(path, vectorNode.ShapeData.TransformationMatrix, AddPathMode.Append);
 
                 if (originalPaths.ContainsKey(frame))
                     originalPaths[frame].Dispose();
@@ -214,7 +215,7 @@ internal class CombineStructureMembersOnto_Change : Change
             }
             else
             {
-                targetPath.AddPath(path, AddPathMode.Append);
+                targetPath.AddPath(path, vectorNode.ShapeData.TransformationMatrix, AddPathMode.Append);
                 path.Dispose();
             }
         }
@@ -230,12 +231,13 @@ internal class CombineStructureMembersOnto_Change : Change
                 FillPaintable = shape.FillPaintable,
                 StrokeWidth = shape.StrokeWidth,
                 Fill = shape.Fill,
-                TransformationMatrix = shape.TransformationMatrix,
+                TransformationMatrix = Matrix3X3.Identity
             };
         }
         else
         {
             data = vectorData;
+            data.TransformationMatrix = Matrix3X3.Identity;
             data.Path = targetPath;
         }
 

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

@@ -540,6 +540,8 @@ internal class DocumentOperationsModule : IDocumentOperations
 
         Guid newGuid = Guid.NewGuid();
 
+        Internals.ActionAccumulator.StartChangeBlock();
+
         //make a new layer, put combined image onto it, delete layers that were merged
         bool allVectorNodes = members.All(x => Document.StructureHelper.Find(x) is IVectorLayerHandler);
         Type layerToCreate = allVectorNodes ? typeof(VectorLayerNode) : typeof(ImageLayerNode);
@@ -549,7 +551,7 @@ internal class DocumentOperationsModule : IDocumentOperations
             new CombineStructureMembersOnto_Action(members.ToHashSet(), newGuid));
         foreach (var member in members)
             Internals.ActionAccumulator.AddActions(new DeleteStructureMember_Action(member));
-        Internals.ActionAccumulator.AddActions(new ChangeBoundary_Action());
+        Internals.ActionAccumulator.EndChangeBlock();
     }
 
     /// <summary>

+ 2 - 0
src/PixiEditor/ViewModels/Document/DocumentViewModel.cs

@@ -947,6 +947,8 @@ internal partial class DocumentViewModel : PixiObservableObject, IDocument
     public void UpdateSavedState()
     {
         OnPropertyChanged(nameof(AllChangesSaved));
+        OnPropertyChanged(nameof(HasSavedUndo));
+        OnPropertyChanged(nameof(HasSavedRedo));
     }
 
     private void ExtractSelectedLayers(IFolderHandler folder, HashSet<Guid> list,

+ 4 - 1
src/PixiEditor/ViewModels/Tools/ToolSettings/Toolbars/Toolbar.cs

@@ -18,7 +18,10 @@ internal abstract class Toolbar : ObservableObject, IToolbar
     {
         setting.ValueChanged += (sender, args) =>
         {
-            SettingChanged?.Invoke(setting.Name, setting.Value);
+            if (args.OldValue != args.NewValue)
+            {
+                SettingChanged?.Invoke(setting.Name, setting.Value);
+            }
         };
         
         settings.Add(setting);