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();
    }
}