66 lines
2.1 KiB
C#
66 lines
2.1 KiB
C#
using UnityEngine;
|
|
using UnityEngine.UIElements;
|
|
|
|
namespace DanieleMarotta.RiversongCodeShowcase
|
|
{
|
|
public class DraggableManipulator : PointerManipulator
|
|
{
|
|
private const string DraggedUssClassName = "dragged";
|
|
|
|
private Vector2 _startMousePosition;
|
|
|
|
private Vector2 _startElementPosition;
|
|
|
|
private VisualElement _draggedElement;
|
|
|
|
public DraggableManipulator(VisualElement draggedElement)
|
|
{
|
|
_draggedElement = draggedElement;
|
|
}
|
|
|
|
protected override void RegisterCallbacksOnTarget()
|
|
{
|
|
target.RegisterCallback<PointerDownEvent>(OnPointerDown);
|
|
target.RegisterCallback<PointerMoveEvent>(OnPointerMove);
|
|
target.RegisterCallback<PointerUpEvent>(OnPointerUp);
|
|
}
|
|
|
|
protected override void UnregisterCallbacksFromTarget()
|
|
{
|
|
target.UnregisterCallback<PointerDownEvent>(OnPointerDown);
|
|
target.UnregisterCallback<PointerMoveEvent>(OnPointerMove);
|
|
target.UnregisterCallback<PointerUpEvent>(OnPointerUp);
|
|
}
|
|
|
|
private void OnPointerDown(PointerDownEvent evt)
|
|
{
|
|
if (evt.button != 0) return;
|
|
|
|
target.CapturePointer(evt.pointerId);
|
|
evt.StopPropagation();
|
|
|
|
_startMousePosition = evt.position;
|
|
_startElementPosition = new Vector2(_draggedElement.resolvedStyle.left, _draggedElement.resolvedStyle.top);
|
|
|
|
_draggedElement.AddToClassList(DraggedUssClassName);
|
|
}
|
|
|
|
private void OnPointerMove(PointerMoveEvent evt)
|
|
{
|
|
if (!target.HasPointerCapture(evt.pointerId)) return;
|
|
|
|
var delta = (Vector2)evt.position - _startMousePosition;
|
|
_draggedElement.style.left = _startElementPosition.x + delta.x;
|
|
_draggedElement.style.top = _startElementPosition.y + delta.y;
|
|
}
|
|
|
|
private void OnPointerUp(PointerUpEvent evt)
|
|
{
|
|
if (!target.HasPointerCapture(evt.pointerId)) return;
|
|
|
|
target.ReleasePointer(evt.pointerId);
|
|
|
|
_draggedElement.RemoveFromClassList(DraggedUssClassName);
|
|
}
|
|
}
|
|
} |