123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153 |
- 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<MouseDownEvent>(OnMouseDown);
- target.RegisterCallback<MouseMoveEvent>(OnMouseMove);
- target.RegisterCallback<MouseUpEvent>(OnMouseUp);
- target.RegisterCallback<KeyDownEvent>(OnKeyDown);
- target.RegisterCallback<MouseCaptureOutEvent>(OnCaptureOut);
- }
- protected override void UnregisterCallbacksFromTarget()
- {
- target.UnregisterCallback<MouseDownEvent>(OnMouseDown);
- target.UnregisterCallback<MouseMoveEvent>(OnMouseMove);
- target.UnregisterCallback<MouseUpEvent>(OnMouseUp);
- target.UnregisterCallback<KeyDownEvent>(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>();
- graphView?.RemoveElement(edgeCandidate);
- edgeCandidate.input = null;
- edgeCandidate.output = null;
- edgeCandidate = null;
- edgeDragHelper.Reset();
- }
- bool CanPerformConnection(Vector2 mousePosition)
- {
- return Vector2.Distance(mouseDownPosition, mousePosition) > k_ConnectionDistanceTreshold;
- }
- }
- }
|