79 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			79 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
|  | using UnityEngine; | ||
|  | 
 | ||
|  | namespace UnityEditor.U2D.Animation | ||
|  | { | ||
|  |     internal class Slider2D | ||
|  |     { | ||
|  |         private static Vector2 s_CurrentMousePosition; | ||
|  |         private static Vector2 s_DragStartScreenPosition; | ||
|  |         private static Vector2 s_DragScreenOffset; | ||
|  |         private static double s_Time; | ||
|  | 
 | ||
|  |         public static Vector2 Do(int controlID, Vector2 position, Handles.CapFunction drawCapFunction = null) | ||
|  |         { | ||
|  |             EventType type = Event.current.GetTypeForControl(controlID); | ||
|  | 
 | ||
|  |             switch (type) | ||
|  |             { | ||
|  |                 case EventType.MouseDown: | ||
|  |                     if (Event.current.button == 0 && HandleUtility.nearestControl == controlID && !Event.current.alt) | ||
|  |                     { | ||
|  |                         s_Time = EditorApplication.timeSinceStartup; | ||
|  | 
 | ||
|  |                         GUIUtility.keyboardControl = controlID; | ||
|  |                         GUIUtility.hotControl = controlID; | ||
|  |                         s_CurrentMousePosition = Event.current.mousePosition; | ||
|  |                         s_DragStartScreenPosition = Event.current.mousePosition; | ||
|  |                         Vector2 b = HandleUtility.WorldToGUIPoint(position); | ||
|  |                         s_DragScreenOffset = s_CurrentMousePosition - b; | ||
|  | 
 | ||
|  |                         Event.current.Use(); | ||
|  |                     } | ||
|  |                     break; | ||
|  |                 case EventType.MouseUp: | ||
|  |                     if (GUIUtility.hotControl == controlID && (Event.current.button == 0 || Event.current.button == 2)) | ||
|  |                     { | ||
|  |                         GUIUtility.hotControl = 0; | ||
|  |                         Event.current.Use(); | ||
|  |                     } | ||
|  |                     break; | ||
|  |                 case EventType.MouseDrag: | ||
|  |                     if (GUIUtility.hotControl == controlID) | ||
|  |                     { | ||
|  |                         s_CurrentMousePosition = Event.current.mousePosition; | ||
|  |                         float screenDisplacement = (s_CurrentMousePosition - s_DragStartScreenPosition).magnitude; | ||
|  |                         Vector2 center = position; | ||
|  |                         Vector2 screenPosition = s_CurrentMousePosition - s_DragScreenOffset; | ||
|  |                         position = Handles.inverseMatrix.MultiplyPoint(screenPosition); | ||
|  |                         float displacement = (center - position).magnitude; | ||
|  | 
 | ||
|  |                         if (!Mathf.Approximately(displacement, 0f) && (EditorApplication.timeSinceStartup - s_Time > 0.15 || screenDisplacement >= 10f)) | ||
|  |                             GUI.changed = true; | ||
|  | 
 | ||
|  |                         Event.current.Use(); | ||
|  |                     } | ||
|  |                     break; | ||
|  |                 case EventType.KeyDown: | ||
|  |                     if (GUIUtility.hotControl == controlID && Event.current.keyCode == KeyCode.Escape) | ||
|  |                     { | ||
|  |                         position = Handles.inverseMatrix.MultiplyPoint(s_DragStartScreenPosition - s_DragScreenOffset); | ||
|  |                         GUIUtility.hotControl = 0; | ||
|  |                         GUI.changed = true; | ||
|  |                         Event.current.Use(); | ||
|  |                     } | ||
|  |                     break; | ||
|  |                 case EventType.Layout: | ||
|  |                     if (drawCapFunction != null) | ||
|  |                         drawCapFunction(controlID, position, Quaternion.identity, 1f, EventType.Layout); | ||
|  |                     break; | ||
|  |                 case EventType.Repaint: | ||
|  |                     if (drawCapFunction != null) | ||
|  |                         drawCapFunction(controlID, position, Quaternion.identity, 1f, EventType.Repaint); | ||
|  |                     break; | ||
|  |             } | ||
|  | 
 | ||
|  |             return position; | ||
|  |         } | ||
|  |     } | ||
|  | } |