Browse Source

Undo create layer works

flabbet 1 year ago
parent
commit
6b22e385fa

+ 1 - 1
src/PixiEditor.AvaloniaUI/Models/DocumentModels/DocumentStructureHelper.cs

@@ -69,7 +69,7 @@ internal class DocumentStructureHelper
             List<IStructureMemberHandler> path = doc.StructureHelper.FindPath(layer.Id);
             if (path.Count < 1)
                 throw new InvalidOperationException("Couldn't find a path to the selected member");
-            INodeHandler parent = path[0];
+            INodeHandler parent = path.Count == 1 ? doc.NodeGraphHandler.OutputNode : path[1];
             internals.ActionAccumulator.AddActions(new CreateStructureMember_Action(parent.Id, guid, type));
             name ??= GetUniqueName(type == StructureMemberType.Layer ? new LocalizedString("NEW_LAYER") : new LocalizedString("NEW_FOLDER"), parent);
             internals.ActionAccumulator.AddActions(new StructureMemberName_Action(guid, name));

+ 3 - 1
src/PixiEditor.AvaloniaUI/Models/DocumentModels/DocumentUpdater.cs

@@ -65,6 +65,7 @@ internal class DocumentUpdater
                 ProcessCreateStructureMember(info);
                 break;
             case DeleteStructureMember_ChangeInfo info:
+                ProcessDeleteNode(info);
                 ProcessDeleteStructureMember(info);
                 break;
             case StructureMemberName_ChangeInfo info:
@@ -401,7 +402,7 @@ internal class DocumentUpdater
 
     private void ProcessDeleteStructureMember(DeleteStructureMember_ChangeInfo info)
     {
-        (IStructureMemberHandler memberVM, IFolderHandler folderVM) = doc.StructureHelper.FindChildAndParentOrThrow(info.Id);
+        IStructureMemberHandler memberVM = doc.StructureHelper.Find(info.Id);
         //folderVM.Children.Remove(memberVM);
         if (doc.SelectedStructureMember == memberVM)
             doc.SetSelectedMember(null);
@@ -513,6 +514,7 @@ internal class DocumentUpdater
     
     private void ProcessDeleteNode(DeleteNode_ChangeInfo info)
     {
+        doc.NodeGraphHandler.RemoveConnections(info.Id);
         doc.NodeGraphHandler.RemoveNode(info.Id);
     }
     

+ 1 - 0
src/PixiEditor.AvaloniaUI/Models/Handlers/INodeGraphHandler.cs

@@ -13,4 +13,5 @@ internal interface INodeGraphHandler
    public void RemoveNode(Guid nodeId);
    public void SetConnection(NodeConnectionViewModel connection);
    public void RemoveConnection(Guid nodeId, string property);
+   public void RemoveConnections(Guid nodeId);
 }

+ 11 - 0
src/PixiEditor.AvaloniaUI/ViewModels/Document/NodeGraphViewModel.cs

@@ -67,6 +67,17 @@ internal class NodeGraphViewModel : ViewModelBase, INodeGraphHandler
             Connections.Remove(connection);
         }
     }
+    
+    public void RemoveConnections(Guid nodeId)
+    {
+        var connections = Connections.Where(x => x.InputProperty.Node.Id == nodeId || x.OutputProperty.Node.Id == nodeId).ToList();
+        foreach (var connection in connections)
+        {
+            connection.InputProperty.ConnectedOutput = null;
+            connection.OutputProperty.ConnectedInputs.Remove(connection.InputProperty);
+            Connections.Remove(connection);
+        }
+    }
 
     public bool TryTraverse(Func<INodeHandler, bool> func)
     {

+ 4 - 2
src/PixiEditor.ChangeableDocument/ChangeInfos/Structure/DeleteStructureMember_ChangeInfo.cs

@@ -1,3 +1,5 @@
-namespace PixiEditor.ChangeableDocument.ChangeInfos.Structure;
+using PixiEditor.ChangeableDocument.ChangeInfos.NodeGraph;
 
-public record class DeleteStructureMember_ChangeInfo(Guid Id, Guid ParentGuid) : IChangeInfo;
+namespace PixiEditor.ChangeableDocument.ChangeInfos.Structure;
+
+public record class DeleteStructureMember_ChangeInfo(Guid Id, Guid ParentGuid) : DeleteNode_ChangeInfo(Id);

+ 12 - 2
src/PixiEditor.ChangeableDocument/Changes/Structure/CreateStructureMember_Change.cs

@@ -82,9 +82,19 @@ internal class CreateStructureMember_Change : Change
 
         document.NodeGraph.RemoveNode(child);
 
-        childBackgroundConnection?.ConnectTo(backgroundInput.Background);
+        List<IChangeInfo> changes = new()
+        {
+            new DeleteStructureMember_ChangeInfo(newMemberGuid, parentFolderGuid),
+        };
 
-        return new DeleteStructureMember_ChangeInfo(newMemberGuid, parentFolderGuid);
+        if (childBackgroundConnection != null)
+        {
+            childBackgroundConnection?.ConnectTo(backgroundInput.Background);
+            ConnectProperty_ChangeInfo change = new(childBackgroundConnection.Node.Id, backgroundInput.Background.Node.Id, childBackgroundConnection.InternalPropertyName, backgroundInput.Background.InternalPropertyName);
+            changes.Add(change);
+        }
+
+        return changes;
     }
 
     private static List<ConnectProperty_ChangeInfo> AppendMember(IBackgroundInput backgroundInput, StructureNode member)