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