Files
riversong-code-showcase/Source/Riversong/Game/UI/Helpers/DraggableManipulator.cs
2026-05-21 16:04:49 +02:00

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