-
Notifications
You must be signed in to change notification settings - Fork 827
/
Copy pathDraggable.cs
83 lines (71 loc) · 2.25 KB
/
Draggable.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
using System;
using UnityEditor.ShaderGraph.Drawing;
using UnityEngine;
using UnityEngine.UIElements;
namespace UnityEditor.ShaderGraph.GraphUI
{
class Draggable : MouseManipulator
{
Action<Vector2> m_Handler;
bool m_Active;
bool m_OutputDeltaMovement;
public Draggable(Action<Vector2> handler, bool outputDeltaMovement = false)
{
m_Handler = handler;
m_Active = false;
m_OutputDeltaMovement = outputDeltaMovement;
activators.Add(new ManipulatorActivationFilter()
{
button = MouseButton.LeftMouse
});
}
protected override void RegisterCallbacksOnTarget()
{
target.RegisterCallback<MouseDownEvent>(OnMouseDown);
target.RegisterCallback<MouseUpEvent>(OnMouseUp);
target.RegisterCallback<MouseCaptureOutEvent>(OnCaptureLost);
}
protected override void UnregisterCallbacksFromTarget()
{
target.UnregisterCallback<MouseCaptureOutEvent>(OnCaptureLost);
target.UnregisterCallback<MouseDownEvent>(OnMouseDown);
target.UnregisterCallback<MouseUpEvent>(OnMouseUp);
}
void OnCaptureLost(MouseCaptureOutEvent e)
{
m_Active = false;
target.UnregisterCallback<MouseMoveEvent>(OnMouseMove);
}
void OnMouseDown(MouseDownEvent evt)
{
target.CaptureMouse();
m_Active = true;
target.RegisterCallback<MouseMoveEvent>(OnMouseMove);
evt.StopPropagation();
}
void OnMouseMove(MouseMoveEvent evt)
{
if (m_Active)
{
if (m_OutputDeltaMovement)
{
m_Handler(evt.mouseDelta);
}
else
{
m_Handler(evt.localMousePosition);
}
}
}
void OnMouseUp(MouseUpEvent evt)
{
m_Active = false;
target.UnregisterCallback<MouseMoveEvent>(OnMouseMove);
if (target.HasMouseCapture())
{
target.ReleaseMouse();
}
evt.StopPropagation();
}
}
}