riversong code showcase
This commit is contained in:
66
Source/Riversong/Game/UI/Helpers/DraggableManipulator.cs
Normal file
66
Source/Riversong/Game/UI/Helpers/DraggableManipulator.cs
Normal file
@@ -0,0 +1,66 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user