Singularity/Library/PackageCache/com.unity.2d.animation@7.0.10/Editor/SkinningModule/IMGUI/Slider2D.cs
2024-05-06 11:45:45 -07:00

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