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;
|
||
|
}
|
||
|
}
|
||
|
}
|