Code/UI/Spatial/Node.Track.cs
namespace Nodebox.UI.Spatial;
public partial class Node {
private HashSet<Graph> _graphs = [];
public IReadOnlySet<Graph> Graphs => _graphs;
private void Rescan() {
var newGraphs = GetComponentsInParent<Graph>(false, false).ToHashSet();
var toRemove = new HashSet<Graph>(_graphs);
toRemove.ExceptWith(newGraphs);
var toAdd = new HashSet<Graph>(newGraphs);
toAdd.ExceptWith(_graphs);
foreach (var from in toRemove) {
if (_inner.IsValid()) {
from.Inner?.Remove(_inner);
}
from.Inner?.OnDestroy -= OnGraphDestroy;
}
foreach (var to in toAdd) {
if (_inner.IsValid()) {
to.Inner?.Add(_inner);
}
to.Inner?.OnDestroy += OnGraphDestroy;
}
_graphs = newGraphs;
}
private void OnGraphDestroy(Nodebox.Graph innerGraph) {
_graphs.Remove(innerGraph.Spatial);
}
private void RegisterInner() {
Assert.IsValid(_inner);
foreach (var graph in _graphs) {
if (graph.IsValid() && graph.Inner.IsValid()) {
graph.Inner.Add(_inner);
}
}
}
private void UnRegisterInner() {
if (_inner.IsValid()) {
foreach (var graph in _graphs) {
if (graph.IsValid() && graph.Inner.IsValid()) {
graph.Inner.Remove(_inner);
}
}
}
_graphs.Clear();
}
}