Singularity/Library/PackageCache/com.unity.2d.animation@7.0.10/Editor/LayoutOverlay/Manipulators/Draggable.cs
2024-05-06 11:45:45 -07:00

147 lines
4.2 KiB
C#

using UnityEngine;
using UnityEngine.UIElements;
namespace UnityEditor.U2D.Layout
{
internal interface IDraggable
{
bool IsMovableNow();
void UpdatePresenterPosition();
}
internal class Draggable : MouseManipulator
{
private Vector2 m_Start;
protected bool m_Active;
public Vector2 panSpeed { get; set; }
public bool clampToParentEdges { get; set; }
public Draggable(bool clampToParentEdges = false)
{
activators.Add(new ManipulatorActivationFilter {button = MouseButton.LeftMouse});
panSpeed = Vector2.one;
this.clampToParentEdges = clampToParentEdges;
m_Active = false;
}
protected Rect CalculatePosition(float x, float y, float width, float height)
{
var rect = new Rect(x, y, width, height);
if (clampToParentEdges)
{
if (rect.x < 0f)
rect.x = 0f;
else if (rect.xMax > target.parent.layout.width)
rect.x = target.parent.layout.width - rect.width;
if (rect.y < 0f)
rect.y = 0f;
else if (rect.yMax > target.parent.layout.height)
rect.y = target.parent.layout.height - rect.height;
// Reset size, we never intended to change them in the first place
rect.width = width;
rect.height = height;
}
return rect;
}
protected override void RegisterCallbacksOnTarget()
{
target.RegisterCallback<MouseDownEvent>(OnMouseDown);
target.RegisterCallback<MouseMoveEvent>(OnMouseMove);
target.RegisterCallback<MouseUpEvent>(OnMouseUp);
}
protected override void UnregisterCallbacksFromTarget()
{
target.UnregisterCallback<MouseDownEvent>(OnMouseDown);
target.UnregisterCallback<MouseMoveEvent>(OnMouseMove);
target.UnregisterCallback<MouseUpEvent>(OnMouseUp);
}
protected void OnMouseDown(MouseDownEvent e)
{
if (m_Active)
{
e.StopImmediatePropagation();
return;
}
/*
IDraggable ce = e.target as IDraggable;
if (ce == null || !ce.IsMovableNow())
{
return;
}
*/
if (CanStartManipulation(e))
{
m_Start = e.localMousePosition;
m_Active = true;
target.CaptureMouse();
e.StopPropagation();
}
}
protected void OnMouseMove(MouseMoveEvent e)
{
/*
IDraggable ce = e.target as IDraggable;
if (ce == null || !ce.IsMovableNow())
{
return;
}
*/
if (m_Active)
{
Vector2 diff = e.localMousePosition - m_Start;
Rect rect = CalculatePosition(target.layout.x + diff.x, target.layout.y + diff.y, target.layout.width, target.layout.height);
if (target.style.position == Position.Relative)
{
target.style.left = rect.xMin;
target.style.top = rect.yMin;
target.style.right = rect.xMax;
target.style.bottom = rect.yMax;
}
else if (target.style.position == Position.Absolute)
{
target.style.left = rect.x;
target.style.top = rect.y;
}
e.StopPropagation();
}
}
protected void OnMouseUp(MouseUpEvent e)
{
/*
IDraggable ce = e.target as IDraggable;
if (ce == null || !ce.IsMovableNow())
{
return;
}
*/
if (m_Active)
{
if (CanStopManipulation(e))
{
//ce.UpdatePresenterPosition();
m_Active = false;
target.ReleaseMouse();
e.StopPropagation();
}
}
}
}
}