using System; using UnityEditor; using UnityEngine; using UnityEngine.UIElements; namespace KitsuneCafe.UI { public class DragManipulator : PointerManipulator { public event Action Started = delegate { }; public event Action Stopped = delegate { }; public event Action Dragged = delegate { }; private bool isDragging = false; private bool globalDrag = true; private VisualElement releaseTarget; public DragManipulator(VisualElement element, bool globalDrag = true) { target = element; this.globalDrag = globalDrag; } protected override void RegisterCallbacksOnTarget() { target.RegisterCallback(OnAttachToPanel); } private void OnAttachToPanel(AttachToPanelEvent evt) { releaseTarget = globalDrag ? target.panel.visualTree : target; target.RegisterCallback(OnPointerDown); releaseTarget.RegisterCallback(OnPointerMove); releaseTarget.RegisterCallback(OnPointerUp); } protected override void UnregisterCallbacksFromTarget() { target.UnregisterCallback(OnAttachToPanel); target.UnregisterCallback(OnPointerDown); releaseTarget?.UnregisterCallback(OnPointerMove); releaseTarget?.UnregisterCallback(OnPointerUp); } private void OnPointerDown(PointerDownEvent _) { isDragging = true; Started?.Invoke(); } private void OnPointerMove(PointerMoveEvent evt) { if (isDragging) { Dragged?.Invoke(evt.deltaPosition); } } private void OnPointerUp(PointerUpEvent evt) { isDragging = false; Stopped?.Invoke(); } } }