Browse Source

Fixed mask not serializing

flabbet 11 months ago
parent
commit
9a945fc7e4

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

@@ -420,7 +420,8 @@ public abstract class Node : IReadOnlyNode, IDisposable
     {
     }
 
-    internal virtual void DeserializeData(IReadOnlyDocument target, IReadOnlyDictionary<string, object> data)
+    internal virtual OneOf<None, IChangeInfo, List<IChangeInfo>> DeserializeAdditionalData(IReadOnlyDocument target, IReadOnlyDictionary<string, object> data)
     {
+        return new None();
     }
 }

+ 29 - 0
src/PixiEditor.ChangeableDocument/Changeables/Graph/Nodes/StructureNode.cs

@@ -1,6 +1,8 @@
 using ChunkyImageLib.Operations;
 using PixiEditor.ChangeableDocument.Changeables.Animations;
 using PixiEditor.ChangeableDocument.Changeables.Graph.Interfaces;
+using PixiEditor.ChangeableDocument.Changeables.Interfaces;
+using PixiEditor.ChangeableDocument.ChangeInfos.Properties;
 using PixiEditor.ChangeableDocument.Enums;
 using PixiEditor.ChangeableDocument.Helpers;
 using PixiEditor.ChangeableDocument.Rendering;
@@ -169,6 +171,33 @@ public abstract class StructureNode : Node, IReadOnlyStructureNode, IBackgroundI
 
     public abstract RectD? GetTightBounds(KeyFrameTime frameTime);
 
+
+    public override void SerializeAdditionalData(Dictionary<string, object> additionalData)
+    {
+        base.SerializeAdditionalData(additionalData);
+        if (EmbeddedMask != null)
+        {
+            additionalData["embeddedMask"] = EmbeddedMask;
+        }
+    }
+
+    internal override OneOf<None, IChangeInfo, List<IChangeInfo>> DeserializeAdditionalData(IReadOnlyDocument target, IReadOnlyDictionary<string, object> data)
+    {
+        base.DeserializeAdditionalData(target, data);
+        bool hasMask = data.ContainsKey("embeddedMask");
+        if (hasMask)
+        {
+            ChunkyImage? mask = (ChunkyImage?)data["embeddedMask"];
+            
+            EmbeddedMask?.Dispose();
+            EmbeddedMask = mask; 
+            
+            return new List<IChangeInfo> { new StructureMemberMask_ChangeInfo(Id, mask != null) };
+        }
+
+        return new None();
+    }
+
     public override void Dispose()
     {
         base.Dispose();

+ 2 - 2
src/PixiEditor.ChangeableDocument/Changes/NodeGraph/DeserializeNodeAdditionalData_Change.cs

@@ -23,9 +23,9 @@ internal class DeserializeNodeAdditionalData_Change : Change
     {
         Node node = target.FindNode<Node>(nodeId);
         
-        node.DeserializeData(target, data);
+        var changeInfos = node.DeserializeAdditionalData(target, data);
         ignoreInUndo = false;
-        return new None();
+        return changeInfos;
     }
 
     public override OneOf<None, IChangeInfo, List<IChangeInfo>> Revert(Document target)

+ 15 - 8
src/PixiEditor/Helpers/SerializationUtil.cs

@@ -86,16 +86,23 @@ public static class SerializationUtil
         {
             if (value is object[] objArr && objArr.Length > 0)
             {
-                var deserialized = Deserialize(objArr[0], config, allFactories);
-                var targetArr = Array.CreateInstance(deserialized.GetType(), objArr.Length);
-                targetArr.SetValue(deserialized, 0);
-                
-                for (int i = 1; i < objArr.Length; i++)
+                if (IsComplexObject(value))
                 {
-                    targetArr.SetValue(Deserialize(objArr[i], config, allFactories), i);
+                    dict[key] = Deserialize(value, config, allFactories);
+                }
+                else
+                {
+                    var deserialized = Deserialize(objArr[0], config, allFactories);
+                    var targetArr = Array.CreateInstance(deserialized.GetType(), objArr.Length);
+                    targetArr.SetValue(deserialized, 0);
+
+                    for (int i = 1; i < objArr.Length; i++)
+                    {
+                        targetArr.SetValue(Deserialize(objArr[i], config, allFactories), i);
+                    }
+
+                    dict[key] = targetArr;
                 }
-                
-                dict[key] = targetArr;
             }
             else
             {