Files
2026-02-21 16:45:37 +08:00

96 lines
1.6 KiB
C#

using System;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Events;
using UnityEngine.UI;
namespace SRF.UI
{
[AddComponentMenu("SRF/UI/Spinner")]
public class SRSpinner : Selectable, IDragHandler, IBeginDragHandler, IEventSystemHandler
{
[Serializable]
public class SpinEvent : UnityEvent
{
}
private float _dragDelta;
[SerializeField]
private SpinEvent _onSpinDecrement = new SpinEvent();
[SerializeField]
private SpinEvent _onSpinIncrement = new SpinEvent();
public float DragThreshold = 20f;
public SpinEvent OnSpinIncrement
{
get
{
return _onSpinIncrement;
}
set
{
_onSpinIncrement = value;
}
}
public SpinEvent OnSpinDecrement
{
get
{
return _onSpinDecrement;
}
set
{
_onSpinDecrement = value;
}
}
public void OnBeginDrag(PointerEventData eventData)
{
_dragDelta = 0f;
}
public void OnDrag(PointerEventData eventData)
{
if (!base.interactable)
{
return;
}
_dragDelta += eventData.delta.x;
if (Mathf.Abs(_dragDelta) > DragThreshold)
{
float num = Mathf.Sign(_dragDelta);
int num2 = Mathf.FloorToInt(Mathf.Abs(_dragDelta) / DragThreshold);
if (num > 0f)
{
OnIncrement(num2);
}
else
{
OnDecrement(num2);
}
_dragDelta -= (float)num2 * DragThreshold * num;
}
}
private void OnIncrement(int amount)
{
for (int i = 0; i < amount; i++)
{
OnSpinIncrement.Invoke();
}
}
private void OnDecrement(int amount)
{
for (int i = 0; i < amount; i++)
{
OnSpinDecrement.Invoke();
}
}
}
}