private void Reset() { m_Active = false; m_Edge = null; m_ConnectedPort = null; m_ConnectedEdgeDragHelper = null; m_DetachedPort = null; m_DetachedFromInputPort = false; }
protected void OnMouseMove(MouseMoveEvent evt) { /// If the left mouse button is not down then return if (m_Edge == null) { return; } evt.StopPropagation(); bool alreadyDetached = (m_DetachedPort != null); // If one end of the edge is not already detached then if (!alreadyDetached) { float delta = (evt.mousePosition - m_PressPos).sqrMagnitude; if (delta < (s_StartDragDistance * s_StartDragDistance)) { return; } /// Determine which end is the nearest to the mouse position then detach it. Vector2 outputPos = new Vector2(m_Edge.output.GetGlobalCenter().x, m_Edge.output.GetGlobalCenter().y); Vector2 inputPos = new Vector2(m_Edge.input.GetGlobalCenter().x, m_Edge.input.GetGlobalCenter().y); float distanceFromOutput = (m_PressPos - outputPos).sqrMagnitude; float distanceFromInput = (m_PressPos - inputPos).sqrMagnitude; m_DetachedFromInputPort = distanceFromInput < distanceFromOutput; if (m_DetachedFromInputPort) { m_ConnectedPort = m_Edge.output; m_DetachedPort = m_Edge.input; m_DetachedPort.Disconnect(m_Edge); m_Edge.input = null; } else { m_ConnectedPort = m_Edge.input; m_DetachedPort = m_Edge.output; m_DetachedPort.Disconnect(m_Edge); m_Edge.output = null; } // Use the edge drag helper of the still connected port m_ConnectedEdgeDragHelper = m_ConnectedPort.edgeConnector.edgeDragHelper; m_ConnectedEdgeDragHelper.draggedPort = m_ConnectedPort; m_ConnectedEdgeDragHelper.edgeCandidate = m_Edge; m_AdditionalEdgeDragHelpers = new List <EdgeDragHelper>(); m_AdditionalEdges = new List <Edge>(); GraphView gv = m_DetachedPort.GetFirstAncestorOfType <GraphView>(); if (m_DetachedPort.allowMultiDrag) { foreach (var edge in m_DetachedPort.connections) { if (edge != m_Edge && edge.IsSelected(gv)) { var otherPort = m_DetachedPort == edge.input ? edge.output : edge.input; var edgeDragHelper = otherPort.edgeConnector.edgeDragHelper; edgeDragHelper.draggedPort = otherPort; edgeDragHelper.edgeCandidate = edge; if (m_DetachedPort == edge.input) { edge.input = null; } else { edge.output = null; } m_AdditionalEdgeDragHelpers.Add(edgeDragHelper); m_AdditionalEdges.Add(edge); } } foreach (var edge in m_AdditionalEdges) { m_DetachedPort.Disconnect(edge); } } m_Edge.candidatePosition = evt.mousePosition; // Redirect the last mouse down event to active the drag helper if (m_ConnectedEdgeDragHelper.HandleMouseDown(m_LastMouseDownEvent)) { m_Active = true; foreach (var edgeDrag in m_AdditionalEdgeDragHelpers) { edgeDrag.HandleMouseDown(m_LastMouseDownEvent); } } else { Reset(); } m_LastMouseDownEvent = null; } if (m_Active) { m_ConnectedEdgeDragHelper.HandleMouseMove(evt); foreach (var edgeDrag in m_AdditionalEdgeDragHelpers) { edgeDrag.HandleMouseMove(evt); } } }
protected void OnMouseMove(MouseMoveEvent evt) { /// If the left mouse button is not down then return if (m_Edge == null) { return; } evt.StopPropagation(); bool alreadyDetached = (m_DetachedPort != null); // If one end of the edge is not already detached then if (!alreadyDetached) { float delta = (evt.mousePosition - m_PressPos).sqrMagnitude; if (delta < (s_StartDragDistance * s_StartDragDistance)) { return; } /// Determine which end is the nearest to the mouse position then detach it. Vector2 outputPos = new Vector2(m_Edge.output.GetGlobalCenter().x, m_Edge.output.GetGlobalCenter().y); Vector2 inputPos = new Vector2(m_Edge.input.GetGlobalCenter().x, m_Edge.input.GetGlobalCenter().y); float distanceFromOutput = (m_PressPos - outputPos).sqrMagnitude; float distanceFromInput = (m_PressPos - inputPos).sqrMagnitude; m_DetachedFromInputPort = distanceFromInput < distanceFromOutput; if (m_DetachedFromInputPort) { m_ConnectedPort = m_Edge.output; m_DetachedPort = m_Edge.input; m_DetachedPort.Disconnect(m_Edge); m_Edge.input = null; } else { m_ConnectedPort = m_Edge.input; m_DetachedPort = m_Edge.output; m_DetachedPort.Disconnect(m_Edge); m_Edge.output = null; } // Use the edge drag helper of the still connected port m_ConnectedEdgeDragHelper = m_ConnectedPort.edgeConnector.edgeDragHelper; m_ConnectedEdgeDragHelper.draggedPort = m_ConnectedPort; m_ConnectedEdgeDragHelper.edgeCandidate = m_Edge; m_Edge.candidatePosition = evt.mousePosition; // Redirect the last mouse down event to active the drag helper if (m_ConnectedEdgeDragHelper.HandleMouseDown(m_LastMouseDownEvent)) { m_Active = true; } else { Reset(); } m_LastMouseDownEvent = null; } if (m_Active) { m_ConnectedEdgeDragHelper.HandleMouseMove(evt); } }