A game about forced loneliness, made by TACStudios
1using UnityEngine;
2
3namespace UnityEditor.U2D.Animation
4{
5 internal class Slider2D
6 {
7 private static Vector2 s_CurrentMousePosition;
8 private static Vector2 s_DragStartScreenPosition;
9 private static Vector2 s_DragScreenOffset;
10 private static double s_Time;
11
12 public static Vector2 Do(int controlID, Vector2 position, Handles.CapFunction drawCapFunction = null)
13 {
14 EventType type = Event.current.GetTypeForControl(controlID);
15
16 switch (type)
17 {
18 case EventType.MouseDown:
19 if (Event.current.button == 0 && HandleUtility.nearestControl == controlID && !Event.current.alt)
20 {
21 s_Time = EditorApplication.timeSinceStartup;
22
23 GUIUtility.keyboardControl = controlID;
24 GUIUtility.hotControl = controlID;
25 s_CurrentMousePosition = Event.current.mousePosition;
26 s_DragStartScreenPosition = Event.current.mousePosition;
27 Vector2 b = HandleUtility.WorldToGUIPoint(position);
28 s_DragScreenOffset = s_CurrentMousePosition - b;
29
30 Event.current.Use();
31 }
32 break;
33 case EventType.MouseUp:
34 if (GUIUtility.hotControl == controlID && (Event.current.button == 0 || Event.current.button == 2))
35 {
36 GUIUtility.hotControl = 0;
37 Event.current.Use();
38 }
39 break;
40 case EventType.MouseDrag:
41 if (GUIUtility.hotControl == controlID)
42 {
43 s_CurrentMousePosition = Event.current.mousePosition;
44 float screenDisplacement = (s_CurrentMousePosition - s_DragStartScreenPosition).magnitude;
45 Vector2 center = position;
46 Vector2 screenPosition = s_CurrentMousePosition - s_DragScreenOffset;
47 position = Handles.inverseMatrix.MultiplyPoint(screenPosition);
48 float displacement = (center - position).magnitude;
49
50 if (!Mathf.Approximately(displacement, 0f) && (EditorApplication.timeSinceStartup - s_Time > 0.15 || screenDisplacement >= 10f))
51 GUI.changed = true;
52
53 Event.current.Use();
54 }
55 break;
56 case EventType.KeyDown:
57 if (GUIUtility.hotControl == controlID && Event.current.keyCode == KeyCode.Escape)
58 {
59 position = Handles.inverseMatrix.MultiplyPoint(s_DragStartScreenPosition - s_DragScreenOffset);
60 GUIUtility.hotControl = 0;
61 GUI.changed = true;
62 Event.current.Use();
63 }
64 break;
65 case EventType.Layout:
66 if (drawCapFunction != null)
67 drawCapFunction(controlID, position, Quaternion.identity, 1f, EventType.Layout);
68 break;
69 case EventType.Repaint:
70 if (drawCapFunction != null)
71 drawCapFunction(controlID, position, Quaternion.identity, 1f, EventType.Repaint);
72 break;
73 }
74
75 return position;
76 }
77 }
78}