private void StoreConnections(TNode node, bool register) { if (!register) { if (m_connectionDeregisterActions.ContainsKey(node)) { foreach (var deregister in m_connectionDeregisterActions[node]) { deregister(); } } return; } foreach (var connector in node.Data.Connectors) { var connectorTemp = connector; Action <Output, bool> connected = (connection, mustExist) => { ConnectionUpdate(connection, connectorTemp, mustExist); }; connectorTemp.Connected += c => connected(c, true); connectorTemp.Disconnected += connection => { DisconnectionUpdate(connection, connectorTemp, UIInfo(connection).Area.Value); }; foreach (var connection in connectorTemp.Connections) { connected(connection, false); } Action deregister = UIInfo(connectorTemp).Area.Changed.Register(change => { foreach (var connection in connectorTemp.Connections) { var other = UIInfo(connection); //The nature of the bezier splines means they will never reach outside the bounding rectangle which includes their endpoints RectangleF fromBounds = RectangleF.Union(change.From, other.Area.Value); var pair = UnorderedTuple.Make(connectorTemp, connection); SpatiallyOrderedConnections.Remove(Tuple.Create(pair, fromBounds)); RectangleF toBounds = RectangleF.Union(change.To, other.Area.Value); SpatiallyOrderedConnections.Add(Tuple.Create(pair, toBounds), toBounds); } }); if (!m_connectionDeregisterActions.ContainsKey(node)) { m_connectionDeregisterActions[node] = new List <Action>(); } m_connectionDeregisterActions[node].Add(deregister); } }
private void DisconnectionUpdate(Output connection, Output connectorTemp, RectangleF connectorPosition) { var ui1 = UIInfo(connectorTemp); //The nature of the bezier splines means they will never reach outside the bounding rectangle which includes their endpoints RectangleF bounds = RectangleF.Union(ui1.Area.Value, connectorPosition); var pair = UnorderedTuple.Make(connectorTemp, connection); bool exists = SpatiallyOrderedConnections.FindTouchingRegion(bounds).Contains(Tuple.Create(pair, bounds)); if (exists) { SpatiallyOrderedConnections.Remove(Tuple.Create(pair, bounds)); } }