A game about forced loneliness, made by TACStudios
at master 78 lines 3.5 kB view raw
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}