瀏覽代碼

Merge pull request #884 from PixiEditor/duplicate-init-fix

Fixed not being able to duplicate layer
Krzysztof Krysiński 5 月之前
父節點
當前提交
bfb58cb652

+ 5 - 5
src/PixiEditor.ChangeableDocument/Changeables/Document.cs

@@ -350,17 +350,17 @@ internal class Document : IChangeable, IReadOnlyDocument
     }
     }
 
 
     /// <summary>
     /// <summary>
-    /// Finds a member with the <paramref name="childGuid"/> and its parent
+    /// Finds a node with the <paramref name="childGuid"/> and its parent
     /// </summary>
     /// </summary>
     /// <param name="childGuid">The <see cref="StructureNode.Id"/> of the member</param>
     /// <param name="childGuid">The <see cref="StructureNode.Id"/> of the member</param>
     /// <returns>A value tuple consisting of child (<see cref="ValueTuple{T, T}.Item1"/>) and parent (<see cref="ValueTuple{T, T}.Item2"/>)<para>Child and parent can be null if not found!</para></returns>
     /// <returns>A value tuple consisting of child (<see cref="ValueTuple{T, T}.Item1"/>) and parent (<see cref="ValueTuple{T, T}.Item2"/>)<para>Child and parent can be null if not found!</para></returns>
-    public (StructureNode?, FolderNode?) FindChildAndParent(Guid childGuid)
+    public (StructureNode?, Node?) FindChildAndParent(Guid childGuid)
     {
     {
-        var path = FindMemberPath(childGuid);
+        var path = FindNodePath(childGuid);
         return path.Count switch
         return path.Count switch
         {
         {
-            1 => (path[0], null),
-            > 1 => (path[0], (FolderNode)path[1]),
+            1 => (path[0] as StructureNode, null),
+            > 1 => (path[0] as StructureNode, path[1]),
             _ => (null, null),
             _ => (null, null),
         };
         };
     }
     }

+ 18 - 9
src/PixiEditor.ChangeableDocument/Changes/Structure/DuplicateLayer_Change.cs

@@ -11,7 +11,7 @@ internal class DuplicateLayer_Change : Change
 {
 {
     private readonly Guid layerGuid;
     private readonly Guid layerGuid;
     private Guid duplicateGuid;
     private Guid duplicateGuid;
-    
+
     private ConnectionsData? connectionsData;
     private ConnectionsData? connectionsData;
     private Dictionary<Guid, VecD> originalPositions;
     private Dictionary<Guid, VecD> originalPositions;
 
 
@@ -26,10 +26,18 @@ internal class DuplicateLayer_Change : Change
     {
     {
         if (!target.TryFindMember<LayerNode>(layerGuid, out LayerNode? layer))
         if (!target.TryFindMember<LayerNode>(layerGuid, out LayerNode? layer))
             return false;
             return false;
-        
+
+        (_, Node parent) = ((LayerNode, Node))target.FindChildAndParent(layerGuid);
+
         connectionsData = NodeOperations.CreateConnectionsData(layer);
         connectionsData = NodeOperations.CreateConnectionsData(layer);
 
 
-        var targetInput = layer.InputProperties.FirstOrDefault(x =>
+        if(parent == null)
+        {
+            FailedMessage = "GRAPH_STATE_UNABLE_TO_CREATE_MEMBER";
+            return false;
+        }
+
+        var targetInput = parent.InputProperties.FirstOrDefault(x =>
             x.ValueType == typeof(Painter) &&
             x.ValueType == typeof(Painter) &&
             x.Connection is { Node: StructureNode }) as InputProperty<Painter?>;
             x.Connection is { Node: StructureNode }) as InputProperty<Painter?>;
 
 
@@ -54,7 +62,7 @@ internal class DuplicateLayer_Change : Change
         InputProperty<Painter?> targetInput = parent.InputProperties.FirstOrDefault(x =>
         InputProperty<Painter?> targetInput = parent.InputProperties.FirstOrDefault(x =>
             x.ValueType == typeof(Painter) &&
             x.ValueType == typeof(Painter) &&
             x.Connection is { Node: StructureNode }) as InputProperty<Painter?>;
             x.Connection is { Node: StructureNode }) as InputProperty<Painter?>;
-        
+
         var previousConnection = targetInput?.Connection;
         var previousConnection = targetInput?.Connection;
 
 
         List<IChangeInfo> operations = new();
         List<IChangeInfo> operations = new();
@@ -62,7 +70,7 @@ internal class DuplicateLayer_Change : Change
         target.NodeGraph.AddNode(clone);
         target.NodeGraph.AddNode(clone);
 
 
         operations.Add(CreateLayer_ChangeInfo.FromLayer(clone));
         operations.Add(CreateLayer_ChangeInfo.FromLayer(clone));
-        
+
         operations.AddRange(NodeOperations.AppendMember(targetInput, clone.Output, clone.Background, clone.Id));
         operations.AddRange(NodeOperations.AppendMember(targetInput, clone.Output, clone.Background, clone.Id));
 
 
         operations.AddRange(NodeOperations.AdjustPositionsAfterAppend(clone, targetInput.Node,
         operations.AddRange(NodeOperations.AdjustPositionsAfterAppend(clone, targetInput.Node,
@@ -84,15 +92,16 @@ internal class DuplicateLayer_Change : Change
 
 
         changes.AddRange(NodeOperations.DetachStructureNode(member));
         changes.AddRange(NodeOperations.DetachStructureNode(member));
         changes.Add(new DeleteStructureMember_ChangeInfo(member.Id));
         changes.Add(new DeleteStructureMember_ChangeInfo(member.Id));
-        
+
         if (connectionsData is not null)
         if (connectionsData is not null)
         {
         {
             Node originalNode = target.FindNodeOrThrow<Node>(layerGuid);
             Node originalNode = target.FindNodeOrThrow<Node>(layerGuid);
-            changes.AddRange(NodeOperations.ConnectStructureNodeProperties(connectionsData, originalNode, target.NodeGraph));
+            changes.AddRange(
+                NodeOperations.ConnectStructureNodeProperties(connectionsData, originalNode, target.NodeGraph));
         }
         }
-        
+
         changes.AddRange(NodeOperations.RevertPositions(originalPositions, target));
         changes.AddRange(NodeOperations.RevertPositions(originalPositions, target));
-        
+
         return changes;
         return changes;
     }
     }
 }
 }