Browse Source

Include nodes connected to start pair nodes in the node zone

CPKreuz 1 month ago
parent
commit
281e002762

+ 54 - 0
src/PixiEditor/ViewModels/Document/NodeGraphViewModel.cs

@@ -108,10 +108,34 @@ internal class NodeGraphViewModel : ViewModelBase, INodeGraphHandler, IDisposabl
         connection.OutputProperty.ConnectedInputs.Add(connection.InputProperty);
 
         Connections.Add(connection);
+        
+        AddToFramesPartOf(connection.InputNode);
+        AddToFramesPartOf(connection.OutputNode);
 
         StructureTree.Update(this);
     }
 
+    private void AddToFramesPartOf(INodeHandler node)
+    {
+        node.TraverseBackwards(x =>
+        {
+            if (x is IPairNodeEndViewModel)
+                return false;
+
+            if (x is not IPairNodeStartViewModel)
+                return true;
+
+            var zone = Frames
+                .OfType<NodeZoneViewModel>()
+                .First(z => z.Start == x);
+
+            if (!zone.Nodes.Contains(node))
+                zone.Nodes.Add(node);
+
+            return true;
+        });
+    }
+
     public void RemoveConnection(Guid nodeId, string property)
     {
         var connection = Connections.FirstOrDefault(x =>
@@ -123,6 +147,9 @@ internal class NodeGraphViewModel : ViewModelBase, INodeGraphHandler, IDisposabl
             Connections.Remove(connection);
         }
 
+        RemoveFromFramesNotPartOf(connection.InputNode);
+        RemoveFromFramesNotPartOf(connection.OutputNode);
+        
         var node = AllNodes.FirstOrDefault(x => x.Id == nodeId);
         if (node != null)
         {
@@ -136,6 +163,33 @@ internal class NodeGraphViewModel : ViewModelBase, INodeGraphHandler, IDisposabl
         StructureTree.Update(this);
     }
 
+    private void RemoveFromFramesNotPartOf(INodeHandler node)
+    {
+        var framesPartOf =
+            Frames.OfType<NodeZoneViewModel>().Where(x => x.Nodes.Contains(node));
+
+        foreach (var frame in framesPartOf)
+        {
+            var stillConnected = false;
+
+            node.TraverseBackwards(x =>
+            {
+                if (x is not IPairNodeStartViewModel || frame.Start != x)
+                {
+                    return true;
+                }
+
+                stillConnected = true;
+                return false;
+            });
+
+            if (!stillConnected)
+            {
+                frame.Nodes.Remove(node);
+            }
+        }
+    }
+
     public void RemoveConnections(Guid nodeId)
     {
         var connections = Connections

+ 1 - 1
src/PixiEditor/ViewModels/Document/Nodes/ModifyImageLeftNodeViewModel.cs

@@ -5,4 +5,4 @@ using PixiEditor.ViewModels.Nodes;
 namespace PixiEditor.ViewModels.Document.Nodes;
 
 [NodeViewModel("MODIFY_IMAGE_LEFT_NODE", "IMAGE", PixiPerfectIcons.PutImage)]
-internal class ModifyImageLeftNodeViewModel : NodeViewModel<ModifyImageLeftNode>;
+internal class ModifyImageLeftNodeViewModel : NodeViewModel<ModifyImageLeftNode>, IPairNodeStartViewModel;

+ 1 - 1
src/PixiEditor/ViewModels/Document/Nodes/ModifyImageRightNodeViewModel.cs

@@ -4,4 +4,4 @@ using PixiEditor.ViewModels.Nodes;
 namespace PixiEditor.ViewModels.Document.Nodes;
 
 [NodeViewModel("MODIFY_IMAGE_RIGHT_NODE", "IMAGE", null)]
-internal class ModifyImageRightNodeViewModel : NodeViewModel<ModifyImageRightNode>;
+internal class ModifyImageRightNodeViewModel : NodeViewModel<ModifyImageRightNode>, IPairNodeEndViewModel;

+ 6 - 0
src/PixiEditor/ViewModels/Nodes/IPairNodeEndViewModel.cs

@@ -0,0 +1,6 @@
+namespace PixiEditor.ViewModels.Nodes;
+
+public interface IPairNodeEndViewModel
+{
+    
+}

+ 6 - 0
src/PixiEditor/ViewModels/Nodes/IPairNodeStartViewModel.cs

@@ -0,0 +1,6 @@
+namespace PixiEditor.ViewModels.Nodes;
+
+public interface IPairNodeStartViewModel
+{
+    
+}

+ 5 - 2
src/PixiEditor/ViewModels/Nodes/NodeFrameViewModelBase.cs

@@ -49,8 +49,11 @@ public abstract class NodeFrameViewModelBase : ObservableObject
             return;
         }
         
-        AddHandlers((IEnumerable<NodeViewModel>)e.NewItems);
-        RemoveHandlers((IEnumerable<NodeViewModel>)e.OldItems);
+        if (e.NewItems != null)
+            AddHandlers(e.NewItems.Cast<INodeHandler>());
+        
+        if (e.OldItems != null)
+            RemoveHandlers(e.OldItems.Cast<INodeHandler>());
     }
 
     private void AddHandlers(IEnumerable<INodeHandler> nodes)

+ 8 - 7
src/PixiEditor/ViewModels/Nodes/NodeZoneViewModel.cs

@@ -9,16 +9,17 @@ namespace PixiEditor.ViewModels.Nodes;
 
 public sealed class NodeZoneViewModel : NodeFrameViewModelBase
 {
-    private INodeHandler start;
-    private INodeHandler end;
+    public INodeHandler Start { get; }
+    
+    public INodeHandler End { get; }
 
     public NodeZoneViewModel(Guid id, string internalName, INodeHandler start, INodeHandler end) : base(id,
         [start, end])
     {
         InternalName = internalName;
 
-        this.start = start.Metadata.IsPairNodeStart ? start : end;
-        this.end = start.Metadata.IsPairNodeStart ? end : start;
+        this.Start = start.Metadata.IsPairNodeStart ? start : end;
+        this.End = start.Metadata.IsPairNodeStart ? end : start;
 
         CalculateBounds();
     }
@@ -223,7 +224,7 @@ public sealed class NodeZoneViewModel : NodeFrameViewModelBase
             var pos = node.PositionBindable;
             var size = new VecD(node.UiSize.Size.Width, node.UiSize.Size.Height);
 
-            if (node == start)
+            if (node == Start)
             {
                 var twoThirdsX = size.X * (2.0 / 3.0);
 
@@ -235,7 +236,7 @@ public sealed class NodeZoneViewModel : NodeFrameViewModelBase
                 continue;
             }
 
-            if (node == end)
+            if (node == End)
             {
                 var oneThirdX = size.X / 3.0;
 
@@ -252,7 +253,7 @@ public sealed class NodeZoneViewModel : NodeFrameViewModelBase
 
             list.Add(pos + new VecD(-defaultXOffset, -defaultYOffset));
             list.Add(pos + new VecD(right, -defaultYOffset));
-            list.Add(pos + new VecD(-defaultXOffset, -bottom));
+            list.Add(pos + new VecD(-defaultXOffset, bottom));
             list.Add(pos + new VecD(right, bottom));
         }