Browse Source

Fixed nodes deserialization not pass changes

Krzysztof Krysiński 4 months ago
parent
commit
4d3920db27

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

@@ -516,10 +516,10 @@ public abstract class Node : IReadOnlyNode, IDisposable
     {
     }
 
-    internal virtual OneOf<None, IChangeInfo, List<IChangeInfo>> DeserializeAdditionalData(IReadOnlyDocument target,
-        IReadOnlyDictionary<string, object> data)
+    internal virtual void DeserializeAdditionalData(IReadOnlyDocument target,
+        IReadOnlyDictionary<string, object> data, List<IChangeInfo> infos)
     {
-        return new None();
+
     }
 
     private void InvokeConnectionsChanged()

+ 3 - 4
src/PixiEditor.ChangeableDocument/Changeables/Graph/Nodes/RenderNode.cs

@@ -6,6 +6,7 @@ using Drawie.Backend.Core.Surfaces;
 using Drawie.Backend.Core.Surfaces.ImageData;
 using Drawie.Numerics;
 using PixiEditor.ChangeableDocument.Changeables.Interfaces;
+using PixiEditor.ChangeableDocument.Changes.Structure;
 
 namespace PixiEditor.ChangeableDocument.Changeables.Graph.Nodes;
 
@@ -85,14 +86,12 @@ public abstract class RenderNode : Node, IPreviewRenderable, IHighDpiRenderNode
         additionalData["AllowHighDpiRendering"] = AllowHighDpiRendering;
     }
 
-    internal override OneOf<None, IChangeInfo, List<IChangeInfo>> DeserializeAdditionalData(IReadOnlyDocument target, IReadOnlyDictionary<string, object> data)
+    internal override void DeserializeAdditionalData(IReadOnlyDocument target, IReadOnlyDictionary<string, object> data, List<IChangeInfo> infos)
     {
-        base.DeserializeAdditionalData(target, data);
+        base.DeserializeAdditionalData(target, data, infos);
 
         if(data.TryGetValue("AllowHighDpiRendering", out var value))
             AllowHighDpiRendering = (bool)value;
-
-        return new None();
     }
 
     public override void Dispose()

+ 12 - 10
src/PixiEditor.ChangeableDocument/Changeables/Graph/Nodes/StructureNode.cs

@@ -80,6 +80,7 @@ public abstract class StructureNode : RenderNode, IReadOnlyStructureNode, IRende
     };
 
     private int maskCacheHash = 0;
+    private int clipCacheHash = 0;
 
     protected StructureNode()
     {
@@ -214,13 +215,15 @@ public abstract class StructureNode : RenderNode, IReadOnlyStructureNode, IRende
     protected override bool CacheChanged(RenderContext context)
     {
         int cacheHash = EmbeddedMask?.GetCacheHash() ?? 0;
-        return base.CacheChanged(context) || maskCacheHash != cacheHash;
+        int clipHash = ClipToPreviousMember ? 1 : 0;
+        return base.CacheChanged(context) || maskCacheHash != cacheHash || clipHash != clipCacheHash;
     }
 
     protected override void UpdateCache(RenderContext context)
     {
         base.UpdateCache(context);
         maskCacheHash = EmbeddedMask?.GetCacheHash() ?? 0;
+        clipCacheHash = ClipToPreviousMember ? 1 : 0;
     }
 
     public virtual void RenderChunk(VecI chunkPos, ChunkResolution resolution, KeyFrameTime frameTime, ColorSpace processingColorSpace)
@@ -297,10 +300,11 @@ public abstract class StructureNode : RenderNode, IReadOnlyStructureNode, IRende
         }
     }
 
-    internal override OneOf<None, IChangeInfo, List<IChangeInfo>> DeserializeAdditionalData(IReadOnlyDocument target,
-        IReadOnlyDictionary<string, object> data)
+    internal override void DeserializeAdditionalData(IReadOnlyDocument target,
+        IReadOnlyDictionary<string, object> data, List<IChangeInfo> infos)
     {
-        base.DeserializeAdditionalData(target, data);
+        base.DeserializeAdditionalData(target, data, infos);
+
         bool hasMask = data.ContainsKey("embeddedMask");
         if (hasMask)
         {
@@ -309,16 +313,14 @@ public abstract class StructureNode : RenderNode, IReadOnlyStructureNode, IRende
             EmbeddedMask?.Dispose();
             EmbeddedMask = mask;
 
-            return new List<IChangeInfo> { new StructureMemberMask_ChangeInfo(Id, mask != null) };
+            infos.Add(new StructureMemberMask_ChangeInfo(Id, mask != null));
         }
         
-        if (data.ContainsKey("clipToPreviousMember"))
+        if (data.TryGetValue("clipToPreviousMember", out var clip))
         {
-            ClipToPreviousMember = (bool)data["clipToPreviousMember"];
-            return new List<IChangeInfo> { new StructureMemberClipToMemberBelow_ChangeInfo(Id, ClipToPreviousMember) };
+            ClipToPreviousMember = (bool)clip;
+            infos.Add(new StructureMemberClipToMemberBelow_ChangeInfo(Id, ClipToPreviousMember));
         }
-
-        return new None();
     }
 
     public override RectD? GetPreviewBounds(int frame, string elementFor = "")

+ 6 - 6
src/PixiEditor.ChangeableDocument/Changeables/Graph/Nodes/VectorLayerNode.cs

@@ -125,21 +125,21 @@ public class VectorLayerNode : LayerNode, ITransformableObject, IReadOnlyVectorN
         additionalData["ShapeData"] = ShapeData;
     }
 
-    internal override OneOf<None, IChangeInfo, List<IChangeInfo>> DeserializeAdditionalData(IReadOnlyDocument target,
-        IReadOnlyDictionary<string, object> data)
+    internal override void DeserializeAdditionalData(IReadOnlyDocument target,
+        IReadOnlyDictionary<string, object> data, List<IChangeInfo> infos)
     {
-        base.DeserializeAdditionalData(target, data);
+        base.DeserializeAdditionalData(target, data, infos);
         ShapeData = (ShapeVectorData)data["ShapeData"];
 
         if (ShapeData == null)
         {
-            return new None();
+            return;
         }
-        
+
         var affected = new AffectedArea(OperationHelper.FindChunksTouchingRectangle(
             (RectI)ShapeData.TransformedAABB, ChunkyImage.FullChunkSize));
 
-        return new VectorShape_ChangeInfo(Id, affected);
+        infos.Add(new VectorShape_ChangeInfo(Id, affected));
     }
 
     protected override bool CacheChanged(RenderContext context)

+ 4 - 3
src/PixiEditor.ChangeableDocument/Changes/NodeGraph/DeserializeNodeAdditionalData_Change.cs

@@ -22,10 +22,11 @@ internal class DeserializeNodeAdditionalData_Change : Change
     public override OneOf<None, IChangeInfo, List<IChangeInfo>> Apply(Document target, bool firstApply, out bool ignoreInUndo)
     {
         Node node = target.FindNode<Node>(nodeId);
-        
-        var changeInfos = node.DeserializeAdditionalData(target, data);
+
+        List<IChangeInfo> infos = new();
+        node.DeserializeAdditionalData(target, data, infos);
         ignoreInUndo = false;
-        return changeInfos;
+        return infos;
     }
 
     public override OneOf<None, IChangeInfo, List<IChangeInfo>> Revert(Document target)

+ 1 - 0
src/PixiEditor.ChangeableDocument/Changes/Vectors/SetShapeGeometry_UpdateableChange.cs

@@ -26,6 +26,7 @@ internal class SetShapeGeometry_UpdateableChange : InterruptableUpdateableChange
     {
         if (target.TryFindNode<VectorLayerNode>(TargetId, out var node))
         {
+            // TODO: Add is identical check
             originalData = (ShapeVectorData?)node.ShapeData?.Clone();
             return true;
         }