Browse Source

Added pair node serialization

Krzysztof Krysiński 4 months ago
parent
commit
e4647ec72a

+ 4 - 2
src/PixiEditor.ChangeableDocument/Changes/NodeGraph/CreateNodeFromName_Change.cs

@@ -4,6 +4,7 @@ internal class CreateNodeFromName_Change : Change
 {
     private string nodeUniqueName;
     private Guid id;
+    private Guid pairId;
 
     private Type typeToCreate;
 
@@ -11,10 +12,11 @@ internal class CreateNodeFromName_Change : Change
     private CreateNode_Change change;
 
     [GenerateMakeChangeAction]
-    public CreateNodeFromName_Change(string nodeUniqueName, Guid id)
+    public CreateNodeFromName_Change(string nodeUniqueName, Guid id, Guid pairId)
     {
         this.id = id;
         this.nodeUniqueName = nodeUniqueName;
+        this.pairId = pairId;
     }
 
     public override bool InitializeAndValidate(Document target)
@@ -26,7 +28,7 @@ internal class CreateNodeFromName_Change : Change
         }
 
         typeToCreate = nodeType;
-        change = new CreateNode_Change(nodeType, id);
+        change = new CreateNode_Change(nodeType, id, pairId);
         return true;
     }
 

+ 7 - 1
src/PixiEditor.ChangeableDocument/Changes/NodeGraph/CreateNode_Change.cs

@@ -15,12 +15,14 @@ internal class CreateNode_Change : Change
 {
     private Type nodeType;
     private Guid id;
+    private Guid? pairId;
 
     [GenerateMakeChangeAction]
-    public CreateNode_Change(Type nodeType, Guid id)
+    public CreateNode_Change(Type nodeType, Guid id, Guid pairId)
     {
         this.id = id;
         this.nodeType = nodeType;
+        this.pairId = pairId == Guid.Empty ? null : pairId;
     }
 
     public override bool InitializeAndValidate(Document target)
@@ -36,6 +38,10 @@ internal class CreateNode_Change : Change
             id = Guid.NewGuid();
 
         Node node = NodeOperations.CreateNode(nodeType, target);
+        if (pairId.HasValue && node is IPairNode pairNode)
+        {
+            pairNode.OtherNode = pairId.Value;
+        }
 
         node.Position = new VecD(0, 0);
         node.Id = id;

+ 7 - 0
src/PixiEditor/Helpers/DocumentViewModelBuilder.cs

@@ -429,6 +429,7 @@ internal class NodeGraphBuilder
         public KeyFrameData[] KeyFrames { get; set; }
         public Dictionary<string, object> AdditionalData { get; set; }
         public Dictionary<int, List<(string inputPropName, string outputPropName)>> InputConnections { get; set; }
+        public int? PairId { get; set; }
 
         public NodeBuilder WithId(int id)
         {
@@ -489,5 +490,11 @@ internal class NodeGraphBuilder
             KeyFrames = keyFrames;
             return this;
         }
+
+        public NodeBuilder WithPairId(int? nodePairId)
+        {
+            PairId = nodePairId;
+            return this;
+        }
     }
 }

+ 2 - 0
src/PixiEditor/Helpers/Extensions/PixiParserDocumentEx.cs

@@ -1,6 +1,7 @@
 using Drawie.Backend.Core;
 using PixiEditor.Extensions.CommonApi.Palettes;
 using Drawie.Numerics;
+using PixiEditor.ChangeableDocument.Changeables.Graph.Interfaces;
 using PixiEditor.Models.IO;
 using PixiEditor.Parser;
 using PixiEditor.Parser.Graph;
@@ -57,6 +58,7 @@ internal static class PixiParserDocumentEx
                     .WithKeyFrames(node.KeyFrames)
                     .WithInputValues(ToDictionary(node.InputPropertyValues))
                     .WithAdditionalData(node.AdditionalData)
+                    .WithPairId(node.PairId)
                     .WithConnections(node.InputConnections));
             }
         }

+ 13 - 2
src/PixiEditor/ViewModels/Document/DocumentViewModel.Serialization.cs

@@ -444,6 +444,16 @@ internal partial class DocumentViewModel
                 }
             }
 
+            int? pairNodeId = null;
+            if (node is IPairNode pairNode)
+            {
+                if (pairNode.OtherNode != Guid.Empty &&
+                    nodeIdMap.TryGetValue(pairNode.OtherNode, out var value))
+                {
+                    pairNodeId = value;
+                }
+            }
+
             Node parserNode = new Node()
             {
                 Id = nodeIdMap[node.Id],
@@ -453,7 +463,8 @@ internal partial class DocumentViewModel
                 InputPropertyValues = properties,
                 AdditionalData = converted,
                 KeyFrames = keyFrames,
-                InputConnections = connections.ToArray()
+                InputConnections = connections.ToArray(),
+                PairId = pairNodeId,
             };
 
             targetGraph.AllNodes.Add(parserNode);
@@ -553,7 +564,7 @@ internal partial class DocumentViewModel
                     if (child is IReadOnlyRasterKeyFrame rasterKeyFrame)
                     {
                         if (!nodeIdMap.ContainsKey(rasterKeyFrame.NodeId)) continue;
-                        if(!keyFrameIds.ContainsKey(rasterKeyFrame.Id)) continue;
+                        if (!keyFrameIds.ContainsKey(rasterKeyFrame.Id)) continue;
 
                         BuildRasterKeyFrame(rasterKeyFrame, graph, group, nodeIdMap, keyFrameIds);
                     }

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

@@ -50,6 +50,7 @@ using PixiEditor.Models.Serialization.Factories;
 using PixiEditor.Models.Structures;
 using PixiEditor.Models.Tools;
 using Drawie.Numerics;
+using PixiEditor.ChangeableDocument.ChangeInfos.NodeGraph;
 using PixiEditor.Models.IO;
 using PixiEditor.Parser;
 using PixiEditor.Parser.Skia;
@@ -374,7 +375,7 @@ internal partial class DocumentViewModel : PixiObservableObject, IDocument
         if (builderInstance.Graph.AllNodes.Count == 0 || !builderInstance.Graph.AllNodes.Any(x => x is OutputNode))
         {
             Guid outputNodeGuid = Guid.NewGuid();
-            acc.AddActions(new CreateNode_Action(typeof(OutputNode), outputNodeGuid));
+            acc.AddActions(new CreateNode_Action(typeof(OutputNode), outputNodeGuid, Guid.Empty));
         }
 
         AddAnimationData(builderInstance.AnimationData, mappedNodeIds, mappedKeyFrameIds);
@@ -434,7 +435,14 @@ internal partial class DocumentViewModel : PixiObservableObject, IDocument
         {
             Guid guid = Guid.NewGuid();
             mappedNodeIds.Add(id, guid);
-            acc.AddActions(new CreateNodeFromName_Action(serializedNode.UniqueNodeName, guid));
+            Guid pairGuid = Guid.Empty;
+
+            if (serializedNode.PairId != null && mappedNodeIds.TryGetValue(serializedNode.PairId.Value, out Guid pairId))
+            {
+                pairGuid = pairId;
+            }
+
+            acc.AddActions(new CreateNodeFromName_Action(serializedNode.UniqueNodeName, guid, pairGuid));
             acc.AddFinishedActions(new NodePosition_Action([guid], serializedNode.Position.ToVecD()),
                 new EndNodePosition_Action());
 

+ 1 - 1
src/PixiEditor/ViewModels/Document/NodeGraphViewModel.cs

@@ -253,7 +253,7 @@ internal class NodeGraphViewModel : ViewModelBase, INodeGraphHandler
         else
         {
             Guid nodeId = Guid.NewGuid();
-            changes.Add(new CreateNode_Action(nodeType, nodeId));
+            changes.Add(new CreateNode_Action(nodeType, nodeId, Guid.Empty));
 
             if (pos != default)
             {

+ 1 - 1
src/PixiParser

@@ -1 +1 @@
-Subproject commit f3475837fbd05e8ba11bcc5f4fc8cca1458d73d9
+Subproject commit bb5706ab9492d85c10abc24283f00dcba8d29aba