Browse Source

Moving sets positions

flabbet 6 months ago
parent
commit
46454dfa5e

+ 35 - 9
src/PixiEditor.ChangeableDocument/Changes/NodeGraph/NodeOperations.cs

@@ -135,17 +135,18 @@ public static class NodeOperations
         return changes;
     }
 
-    public static List<IChangeInfo> AdjustPositionsAfterAppend(Node member, Node appendedTo, Node? previouslyConnected, out Dictionary<Guid, VecD> originalPositions)
+    public static List<IChangeInfo> AdjustPositionsAfterAppend(Node member, Node appendedTo, Node? previouslyConnected,
+        out Dictionary<Guid, VecD> originalPositions)
     {
         List<IChangeInfo> changes = new();
         Dictionary<Guid, VecD> originalPositionDict = new();
 
-        member.Position = new VecD(appendedTo.Position.X - 250, appendedTo.Position.Y);
-
-        changes.Add(new NodePosition_ChangeInfo(member.Id, member.Position));
-
         if (previouslyConnected != null)
         {
+            member.Position = new VecD(appendedTo.Position.X - 250, appendedTo.Position.Y);
+
+            changes.Add(new NodePosition_ChangeInfo(member.Id, member.Position));
+
             previouslyConnected.TraverseBackwards((aNode, previousNode, _) =>
             {
                 if (aNode is Node toMove)
@@ -160,19 +161,44 @@ public static class NodeOperations
                 return true;
             });
         }
-        
+        else
+        {
+            member.TraverseBackwards((aNode, previousNode, _) =>
+            {
+                if (aNode is Node toMove)
+                {
+                    originalPositionDict.Add(toMove.Id, toMove.Position);
+                    var y = toMove.Position.Y;
+                    VecD pos = member.Position + new VecD(250, 0);
+                    if(previousNode != null)
+                    {
+                        pos = previousNode.Position - new VecD(250, 0);
+                    }
+                    toMove.Position = pos;
+                    toMove.Position = new VecD(toMove.Position.X, y);
+                    changes.Add(new NodePosition_ChangeInfo(toMove.Id, toMove.Position));
+                }
+
+                return true;
+            });
+            
+            member.Position = new VecD(appendedTo.Position.X - 250, appendedTo.Position.Y);
+            changes.Add(new NodePosition_ChangeInfo(member.Id, member.Position));
+        }
+
+
         originalPositions = originalPositionDict;
         return changes;
     }
-    
+
     public static List<IChangeInfo> RevertPositions(Dictionary<Guid, VecD> positions, IReadOnlyDocument target)
     {
         List<IChangeInfo> changes = new();
         foreach (var (guid, position) in positions)
         {
             var node = target.FindNode(guid) as Node;
-            if(node == null) continue;
-            
+            if (node == null) continue;
+
             node.Position = position;
             changes.Add(new NodePosition_ChangeInfo(guid, position));
         }

+ 26 - 15
src/PixiEditor.ChangeableDocument/Changes/Structure/MoveStructureMember_Change.cs

@@ -15,9 +15,9 @@ internal class MoveStructureMember_Change : Change
 
     private Guid originalFolderGuid;
 
-    private ConnectionsData originalConnections; 
+    private ConnectionsData originalConnections;
     private Dictionary<Guid, VecD> originalPositions;
-    
+
     private bool putInsideFolder;
 
 
@@ -36,12 +36,13 @@ internal class MoveStructureMember_Change : Change
         if (member is null || targetFolder is null)
             return false;
 
-        originalConnections = NodeOperations.CreateConnectionsData(member); 
-          
+        originalConnections = NodeOperations.CreateConnectionsData(member);
+
         return true;
     }
 
-    private static List<IChangeInfo> Move(Document document, Guid sourceNodeGuid, Guid targetNodeGuid, bool putInsideFolder, out Dictionary<Guid, VecD> originalPositions)
+    private static List<IChangeInfo> Move(Document document, Guid sourceNodeGuid, Guid targetNodeGuid,
+        bool putInsideFolder, out Dictionary<Guid, VecD> originalPositions)
     {
         var sourceNode = document.FindMember(sourceNodeGuid);
         var targetNode = document.FindNode(targetNodeGuid);
@@ -50,7 +51,7 @@ internal class MoveStructureMember_Change : Change
             return [];
 
         List<IChangeInfo> changes = new();
-        
+
         Guid oldBackgroundId = sourceNode.Background.Node.Id;
 
         InputProperty<Painter?> inputProperty = backgroundInput.Background;
@@ -61,16 +62,26 @@ internal class MoveStructureMember_Change : Change
         }
 
         MoveStructureMember_ChangeInfo changeInfo = new(sourceNodeGuid, oldBackgroundId, targetNodeGuid);
-        
+
         var previouslyConnected = inputProperty.Connection;
-        
+
+        if (previouslyConnected == null)
+        {
+            changes.AddRange(NodeOperations.AdjustPositionsAfterAppend(sourceNode, inputProperty.Node,
+                null, out originalPositions));
+        }
+
         changes.AddRange(NodeOperations.DetachStructureNode(sourceNode));
         changes.AddRange(NodeOperations.AppendMember(inputProperty, sourceNode.Output,
             sourceNode.Background,
             sourceNode.Id));
-        
-        changes.AddRange(NodeOperations.AdjustPositionsAfterAppend(sourceNode, inputProperty.Node, previouslyConnected?.Node as Node, out originalPositions));
-        
+
+        if (previouslyConnected != null)
+        {
+            changes.AddRange(NodeOperations.AdjustPositionsAfterAppend(sourceNode, inputProperty.Node,
+                previouslyConnected?.Node as Node, out originalPositions));
+        }
+
         changes.Add(changeInfo);
 
         return changes;
@@ -89,15 +100,15 @@ internal class MoveStructureMember_Change : Change
         StructureNode member = target.FindMember(memberGuid);
 
         List<IChangeInfo> changes = new List<IChangeInfo>();
-        
+
         MoveStructureMember_ChangeInfo changeInfo = new(memberGuid, targetNodeGuid, originalFolderGuid);
-        
+
         changes.AddRange(NodeOperations.DetachStructureNode(member));
         changes.AddRange(NodeOperations.ConnectStructureNodeProperties(originalConnections, member, target.NodeGraph));
         changes.AddRange(NodeOperations.RevertPositions(originalPositions, target));
-        
+
         changes.Add(changeInfo);
-        
+
         return changes;
     }
 }

+ 11 - 3
src/PixiEditor/Views/Nodes/NodeGraphView.cs

@@ -250,6 +250,12 @@ internal class NodeGraphView : Zoombox.Zoombox
 
                 nodeViewsCache.Add(presenter);
                 presenter.PropertyChanged += OnPresenterPropertyChanged;
+
+                if (presenter.Content is NodeViewModel nvm)
+                {
+                    nvm.PropertyChanged += Node_PropertyChanged;
+                }
+                
                 if (presenter.Child == null)
                 {
                     continue;
@@ -257,7 +263,6 @@ internal class NodeGraphView : Zoombox.Zoombox
 
                 NodeView nodeView = (NodeView)presenter.Child;
                 nodeView.PropertyChanged += NodeView_PropertyChanged;
-                nodeView.Node.PropertyChanged += Node_PropertyChanged;
             }
         }
         else if (e.Action == NotifyCollectionChangedAction.Remove)
@@ -272,15 +277,18 @@ internal class NodeGraphView : Zoombox.Zoombox
                 nodeViewsCache.Remove(presenter);
 
                 presenter.PropertyChanged -= OnPresenterPropertyChanged;
+                if (presenter.Content is NodeViewModel nvm)
+                {
+                    nvm.PropertyChanged -= Node_PropertyChanged;
+                }
+                
                 if (presenter.Child == null)
                 {
                     continue;
                 }
 
-
                 NodeView nodeView = (NodeView)presenter.Child;
                 nodeView.PropertyChanged -= NodeView_PropertyChanged;
-                nodeView.Node.PropertyChanged -= Node_PropertyChanged;
             }
         }
         else if (e.Action == NotifyCollectionChangedAction.Reset)