using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor.Experimental.GraphView; using UnityEngine.UIElements; using System; namespace GraphProcessor { public class BaseEdgeConnector : EdgeConnector { protected BaseEdgeDragHelper dragHelper; Edge edgeCandidate; protected bool active; Vector2 mouseDownPosition; protected BaseGraphView graphView; internal const float k_ConnectionDistanceTreshold = 10f; public BaseEdgeConnector(IEdgeConnectorListener listener) : base() { graphView = (listener as BaseEdgeConnectorListener)?.graphView; active = false; InitEdgeConnector(listener); } protected virtual void InitEdgeConnector(IEdgeConnectorListener listener) { dragHelper = new BaseEdgeDragHelper(listener); activators.Add(new ManipulatorActivationFilter { button = MouseButton.LeftMouse }); } public override EdgeDragHelper edgeDragHelper => dragHelper; protected override void RegisterCallbacksOnTarget() { target.RegisterCallback(OnMouseDown); target.RegisterCallback(OnMouseMove); target.RegisterCallback(OnMouseUp); target.RegisterCallback(OnKeyDown); target.RegisterCallback(OnCaptureOut); } protected override void UnregisterCallbacksFromTarget() { target.UnregisterCallback(OnMouseDown); target.UnregisterCallback(OnMouseMove); target.UnregisterCallback(OnMouseUp); target.UnregisterCallback(OnKeyDown); } protected virtual void OnMouseDown(MouseDownEvent e) { if (active) { e.StopImmediatePropagation(); return; } if (!CanStartManipulation(e)) { return; } var graphElement = target as Port; if (graphElement == null) { return; } mouseDownPosition = e.localMousePosition; edgeCandidate = graphView != null ? graphView.CreateEdgeView() : new EdgeView(); edgeDragHelper.draggedPort = graphElement; edgeDragHelper.edgeCandidate = edgeCandidate; if (edgeDragHelper.HandleMouseDown(e)) { active = true; target.CaptureMouse(); e.StopPropagation(); } else { edgeDragHelper.Reset(); edgeCandidate = null; } } void OnCaptureOut(MouseCaptureOutEvent e) { active = false; if (edgeCandidate != null) Abort(); } protected virtual void OnMouseMove(MouseMoveEvent e) { if (!active) return; edgeDragHelper.HandleMouseMove(e); edgeCandidate.candidatePosition = e.mousePosition; edgeCandidate.UpdateEdgeControl(); e.StopPropagation(); } protected virtual void OnMouseUp(MouseUpEvent e) { if (!active || !CanStopManipulation(e)) return; if (CanPerformConnection(e.localMousePosition)) edgeDragHelper.HandleMouseUp(e); else Abort(); active = false; edgeCandidate = null; target.ReleaseMouse(); e.StopPropagation(); } private void OnKeyDown(KeyDownEvent e) { if (e.keyCode != KeyCode.Escape || !active) return; Abort(); active = false; target.ReleaseMouse(); e.StopPropagation(); } void Abort() { var graphView = target?.GetFirstAncestorOfType(); graphView?.RemoveElement(edgeCandidate); edgeCandidate.input = null; edgeCandidate.output = null; edgeCandidate = null; edgeDragHelper.Reset(); } bool CanPerformConnection(Vector2 mousePosition) { return Vector2.Distance(mouseDownPosition, mousePosition) > k_ConnectionDistanceTreshold; } } }