Skip to content

Commit 8a0e01f

Browse files
committed
commit changes
2 parents bc44eb5 + 0e5b4d9 commit 8a0e01f

File tree

6 files changed

+76
-26
lines changed

6 files changed

+76
-26
lines changed

src/DynamoCore/Graph/Connectors/ConnectorModel.cs

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -240,14 +240,9 @@ private void Connect(PortModel p)
240240
/// </summary>
241241
internal void Delete()
242242
{
243-
if (Start != null && Start.Connectors.Contains(this))
244-
{
245-
Start.Connectors.Remove(this);
246-
}
247-
if (End != null && End.Connectors.Contains(this))
248-
{
249-
End.Connectors.Remove(this);
250-
}
243+
Start?.Connectors.Remove(this);
244+
End?.Connectors.Remove(this);
245+
251246
OnDeleted();
252247
}
253248

src/DynamoCore/Graph/ModelBase.cs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,11 @@ public virtual Guid GUID
233233
}
234234
}
235235

236+
/// <summary>
237+
/// Has this <see cref="ModelBase"/> been disposed? Gets set when <see cref="Dispose"/> is called.
238+
/// </summary>
239+
protected bool HasBeenDisposed { get; private set; }
240+
236241
/// <summary>
237242
/// Protected constructor.
238243
/// </summary>
@@ -286,7 +291,11 @@ public void SetSize(double w, double h)
286291
/// </summary>
287292
public virtual void Dispose()
288293
{
289-
Disposed?.Invoke(this);
294+
if (!HasBeenDisposed)
295+
{
296+
HasBeenDisposed = true;
297+
Disposed?.Invoke(this);
298+
}
290299
}
291300

292301
/// <summary>

src/DynamoCore/Graph/Nodes/NodeModel.cs

Lines changed: 37 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1348,6 +1348,21 @@ protected NodeModel()
13481348
OutPorts.CollectionChanged += PortsCollectionChanged;
13491349
}
13501350

1351+
private void DisposePort(PortModel portModel, bool nodeDisposing = false)
1352+
{
1353+
portModel.PropertyChanged -= OnPortPropertyChanged;
1354+
portModel.ConnectorCollectionChanged -= ConnectorsCollectionChanged;
1355+
1356+
// if this node is being disposed, we don't need to set node state and destroy the connectors,
1357+
// as the connectors will be deleted elsewhere
1358+
if (!nodeDisposing)
1359+
{
1360+
portModel.DestroyConnectors();
1361+
SetNodeStateBasedOnConnectionAndDefaults();
1362+
}
1363+
portModel.Dispose();
1364+
}
1365+
13511366
private void PortsCollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
13521367
{
13531368
switch (e.Action)
@@ -1356,25 +1371,15 @@ private void PortsCollectionChanged(object sender, System.Collections.Specialize
13561371
ConfigureSnapEdges(sender == InPorts ? InPorts : OutPorts);
13571372
foreach (PortModel p in e.NewItems)
13581373
{
1359-
p.Connectors.CollectionChanged += (coll, args) =>
1360-
{
1361-
// Call the collection changed handler, replacing
1362-
// the 'sender' with the port, which is required
1363-
// for the disconnect operations.
1364-
ConnectorsCollectionChanged(p, args);
1365-
};
13661374
p.PropertyChanged += OnPortPropertyChanged;
1375+
p.ConnectorCollectionChanged += ConnectorsCollectionChanged;
13671376
SetNodeStateBasedOnConnectionAndDefaults();
13681377
}
13691378
break;
13701379
case System.Collections.Specialized.NotifyCollectionChangedAction.Remove:
13711380
foreach (PortModel p in e.OldItems)
13721381
{
1373-
p.PropertyChanged -= OnPortPropertyChanged;
1374-
1375-
p.DestroyConnectors();
1376-
1377-
SetNodeStateBasedOnConnectionAndDefaults();
1382+
DisposePort(p);
13781383
}
13791384
break;
13801385
}
@@ -2929,6 +2934,26 @@ private void OnRenderPackagesUpdated(RenderPackageCache packages)
29292934
RenderPackagesUpdated(this, packages);
29302935
}
29312936
}
2937+
2938+
2939+
public override void Dispose()
2940+
{
2941+
if (HasBeenDisposed) return;
2942+
2943+
base.Dispose();
2944+
2945+
InPorts.CollectionChanged -= PortsCollectionChanged;
2946+
foreach(var port in InPorts)
2947+
{
2948+
DisposePort(port, nodeDisposing: true);
2949+
}
2950+
2951+
OutPorts.CollectionChanged -= PortsCollectionChanged;
2952+
foreach(var port in OutPorts)
2953+
{
2954+
DisposePort(port, nodeDisposing: true);
2955+
}
2956+
}
29322957
}
29332958

29342959
/// <summary>

src/DynamoCore/Graph/Nodes/PortModel.cs

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Collections.ObjectModel;
3+
using System.Collections.Specialized;
34
using System.ComponentModel;
45
using System.Linq;
56
using System.Reflection;
@@ -362,6 +363,8 @@ internal PortModel(string name, string toolTip)
362363
Height = Math.Abs(Height) < 0.001 ? Configurations.PortHeightInPixels : Height;
363364
}
364365

366+
internal event NotifyCollectionChangedEventHandler ConnectorCollectionChanged;
367+
365368
/// <summary>
366369
/// Creates PortModel.
367370
/// </summary>
@@ -385,6 +388,12 @@ public PortModel(PortType portType, NodeModel owner, PortData data)
385388

386389
MarginThickness = new Thickness(0);
387390
Height = Math.Abs(data.Height) < 0.001 ? Configurations.PortHeightInPixels : data.Height;
391+
Connectors.CollectionChanged += Connectors_CollectionChanged;
392+
}
393+
394+
private void Connectors_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
395+
{
396+
ConnectorCollectionChanged?.Invoke(this, e);
388397
}
389398

390399
internal void RaisePortIsConnectedChanged()
@@ -400,10 +409,9 @@ internal void DestroyConnectors()
400409
if (Owner == null)
401410
return;
402411

403-
while (Connectors.Any())
412+
for (int i = Connectors.Count - 1; i >= 0; i--)
404413
{
405-
ConnectorModel connector = Connectors[0];
406-
connector.Delete();
414+
Connectors[i].Delete();
407415
}
408416
}
409417

@@ -550,6 +558,14 @@ internal string GetOutPortType()
550558

551559
return null;
552560
}
561+
562+
public override void Dispose()
563+
{
564+
if (HasBeenDisposed) return;
565+
566+
base.Dispose();
567+
Connectors.CollectionChanged -= Connectors_CollectionChanged;
568+
}
553569
}
554570

555571
/// <summary>

src/DynamoCore/Graph/Workspaces/WorkspaceModel.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1521,12 +1521,16 @@ public virtual void Clear()
15211521
// have invalid inputs, so these executions are meaningless and may
15221522
// cause invalid GC. See comments in MAGN-7229.
15231523
foreach (NodeModel node in Nodes)
1524+
{
15241525
node.RaisesModificationEvents = false;
1526+
// Dispose here so that all nodes stop listening to disconnect events before
1527+
// the connectors are deleted. Otherwise remaining undisposed nodes will react
1528+
// to delete events when an input connector is deleted.
1529+
node.Dispose();
1530+
}
15251531

15261532
foreach (NodeModel el in Nodes)
15271533
{
1528-
el.Dispose();
1529-
15301534
foreach (PortModel p in el.InPorts)
15311535
{
15321536
for (int i = p.Connectors.Count - 1; i >= 0; i--)

src/DynamoCore/PublicAPI.Unshipped.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -763,6 +763,7 @@ Dynamo.Graph.ModelBase.CenterY.set -> void
763763
Dynamo.Graph.ModelBase.DeletionStarted -> System.EventHandler<System.ComponentModel.CancelEventArgs>
764764
Dynamo.Graph.ModelBase.Deserialize(System.Xml.XmlElement element, Dynamo.Graph.SaveContext context) -> void
765765
Dynamo.Graph.ModelBase.Disposed -> System.Action<Dynamo.Graph.ModelBase>
766+
Dynamo.Graph.ModelBase.HasBeenDisposed.get -> bool
766767
Dynamo.Graph.ModelBase.IsSelected.get -> bool
767768
Dynamo.Graph.ModelBase.IsSelected.set -> void
768769
Dynamo.Graph.ModelBase.Log(Dynamo.Logging.ILogMessage obj) -> void

0 commit comments

Comments
 (0)