BaseEdgeConnector.cs 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEditor.Experimental.GraphView;
  5. using UnityEngine.UIElements;
  6. using System;
  7. namespace GraphProcessor
  8. {
  9. public class BaseEdgeConnector : EdgeConnector
  10. {
  11. protected BaseEdgeDragHelper dragHelper;
  12. Edge edgeCandidate;
  13. protected bool active;
  14. Vector2 mouseDownPosition;
  15. protected BaseGraphView graphView;
  16. internal const float k_ConnectionDistanceTreshold = 10f;
  17. public BaseEdgeConnector(IEdgeConnectorListener listener) : base()
  18. {
  19. graphView = (listener as BaseEdgeConnectorListener)?.graphView;
  20. active = false;
  21. InitEdgeConnector(listener);
  22. }
  23. protected virtual void InitEdgeConnector(IEdgeConnectorListener listener)
  24. {
  25. dragHelper = new BaseEdgeDragHelper(listener);
  26. activators.Add(new ManipulatorActivationFilter { button = MouseButton.LeftMouse });
  27. }
  28. public override EdgeDragHelper edgeDragHelper => dragHelper;
  29. protected override void RegisterCallbacksOnTarget()
  30. {
  31. target.RegisterCallback<MouseDownEvent>(OnMouseDown);
  32. target.RegisterCallback<MouseMoveEvent>(OnMouseMove);
  33. target.RegisterCallback<MouseUpEvent>(OnMouseUp);
  34. target.RegisterCallback<KeyDownEvent>(OnKeyDown);
  35. target.RegisterCallback<MouseCaptureOutEvent>(OnCaptureOut);
  36. }
  37. protected override void UnregisterCallbacksFromTarget()
  38. {
  39. target.UnregisterCallback<MouseDownEvent>(OnMouseDown);
  40. target.UnregisterCallback<MouseMoveEvent>(OnMouseMove);
  41. target.UnregisterCallback<MouseUpEvent>(OnMouseUp);
  42. target.UnregisterCallback<KeyDownEvent>(OnKeyDown);
  43. }
  44. protected virtual void OnMouseDown(MouseDownEvent e)
  45. {
  46. if (active)
  47. {
  48. e.StopImmediatePropagation();
  49. return;
  50. }
  51. if (!CanStartManipulation(e))
  52. {
  53. return;
  54. }
  55. var graphElement = target as Port;
  56. if (graphElement == null)
  57. {
  58. return;
  59. }
  60. mouseDownPosition = e.localMousePosition;
  61. edgeCandidate = graphView != null ? graphView.CreateEdgeView() : new EdgeView();
  62. edgeDragHelper.draggedPort = graphElement;
  63. edgeDragHelper.edgeCandidate = edgeCandidate;
  64. if (edgeDragHelper.HandleMouseDown(e))
  65. {
  66. active = true;
  67. target.CaptureMouse();
  68. e.StopPropagation();
  69. }
  70. else
  71. {
  72. edgeDragHelper.Reset();
  73. edgeCandidate = null;
  74. }
  75. }
  76. void OnCaptureOut(MouseCaptureOutEvent e)
  77. {
  78. active = false;
  79. if (edgeCandidate != null)
  80. Abort();
  81. }
  82. protected virtual void OnMouseMove(MouseMoveEvent e)
  83. {
  84. if (!active) return;
  85. edgeDragHelper.HandleMouseMove(e);
  86. edgeCandidate.candidatePosition = e.mousePosition;
  87. edgeCandidate.UpdateEdgeControl();
  88. e.StopPropagation();
  89. }
  90. protected virtual void OnMouseUp(MouseUpEvent e)
  91. {
  92. if (!active || !CanStopManipulation(e))
  93. return;
  94. if (CanPerformConnection(e.localMousePosition))
  95. edgeDragHelper.HandleMouseUp(e);
  96. else
  97. Abort();
  98. active = false;
  99. edgeCandidate = null;
  100. target.ReleaseMouse();
  101. e.StopPropagation();
  102. }
  103. private void OnKeyDown(KeyDownEvent e)
  104. {
  105. if (e.keyCode != KeyCode.Escape || !active)
  106. return;
  107. Abort();
  108. active = false;
  109. target.ReleaseMouse();
  110. e.StopPropagation();
  111. }
  112. void Abort()
  113. {
  114. var graphView = target?.GetFirstAncestorOfType<GraphView>();
  115. graphView?.RemoveElement(edgeCandidate);
  116. edgeCandidate.input = null;
  117. edgeCandidate.output = null;
  118. edgeCandidate = null;
  119. edgeDragHelper.Reset();
  120. }
  121. bool CanPerformConnection(Vector2 mousePosition)
  122. {
  123. return Vector2.Distance(mouseDownPosition, mousePosition) > k_ConnectionDistanceTreshold;
  124. }
  125. }
  126. }