You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
CrowdControl/Assets/3rd/StompyRobot/SRF/Scripts/UI/SRSpinner.cs

88 lines
2.2 KiB
C#

3 months ago
namespace SRF.UI
{
using System;
using Internal;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
using UnityEngine.UI;
[AddComponentMenu(ComponentMenuPaths.SRSpinner)]
public class SRSpinner : Selectable, IDragHandler, IBeginDragHandler
{
private float _dragDelta;
[SerializeField] private SpinEvent _onSpinDecrement = new SpinEvent();
[SerializeField] private SpinEvent _onSpinIncrement = new SpinEvent();
/// <summary>
/// Number of units a drag must accumulate to trigger a change
/// </summary>
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 = 0;
}
public void OnDrag(PointerEventData eventData)
{
if (!interactable)
{
return;
}
_dragDelta += eventData.delta.x;
if (Mathf.Abs(_dragDelta) > DragThreshold)
{
var direction = Mathf.Sign(_dragDelta);
var quantity = Mathf.FloorToInt(Mathf.Abs(_dragDelta)/DragThreshold);
if (direction > 0)
{
OnIncrement(quantity);
}
else
{
OnDecrement(quantity);
}
_dragDelta -= quantity*DragThreshold*direction;
}
}
private void OnIncrement(int amount)
{
for (var i = 0; i < amount; i++)
{
OnSpinIncrement.Invoke();
}
}
private void OnDecrement(int amount)
{
for (var i = 0; i < amount; i++)
{
OnSpinDecrement.Invoke();
}
}
[Serializable]
public class SpinEvent : UnityEvent {}
}
}