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.
88 lines
2.2 KiB
C#
88 lines
2.2 KiB
C#
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 {}
|
|
}
|
|
}
|