SRSpinner.cs 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. namespace SRF.UI
  2. {
  3. using System;
  4. using Internal;
  5. using UnityEngine;
  6. using UnityEngine.Events;
  7. using UnityEngine.EventSystems;
  8. using UnityEngine.UI;
  9. [AddComponentMenu(ComponentMenuPaths.SRSpinner)]
  10. public class SRSpinner : Selectable, IDragHandler, IBeginDragHandler
  11. {
  12. private float _dragDelta;
  13. [SerializeField] private SpinEvent _onSpinDecrement = new SpinEvent();
  14. [SerializeField] private SpinEvent _onSpinIncrement = new SpinEvent();
  15. /// <summary>
  16. /// Number of units a drag must accumulate to trigger a change
  17. /// </summary>
  18. public float DragThreshold = 20f;
  19. public SpinEvent OnSpinIncrement
  20. {
  21. get { return _onSpinIncrement; }
  22. set { _onSpinIncrement = value; }
  23. }
  24. public SpinEvent OnSpinDecrement
  25. {
  26. get { return _onSpinDecrement; }
  27. set { _onSpinDecrement = value; }
  28. }
  29. public void OnBeginDrag(PointerEventData eventData)
  30. {
  31. _dragDelta = 0;
  32. }
  33. public void OnDrag(PointerEventData eventData)
  34. {
  35. if (!interactable)
  36. {
  37. return;
  38. }
  39. _dragDelta += eventData.delta.x;
  40. if (Mathf.Abs(_dragDelta) > DragThreshold)
  41. {
  42. var direction = Mathf.Sign(_dragDelta);
  43. var quantity = Mathf.FloorToInt(Mathf.Abs(_dragDelta)/DragThreshold);
  44. if (direction > 0)
  45. {
  46. OnIncrement(quantity);
  47. }
  48. else
  49. {
  50. OnDecrement(quantity);
  51. }
  52. _dragDelta -= quantity*DragThreshold*direction;
  53. }
  54. }
  55. private void OnIncrement(int amount)
  56. {
  57. for (var i = 0; i < amount; i++)
  58. {
  59. OnSpinIncrement.Invoke();
  60. }
  61. }
  62. private void OnDecrement(int amount)
  63. {
  64. for (var i = 0; i < amount; i++)
  65. {
  66. OnSpinDecrement.Invoke();
  67. }
  68. }
  69. [Serializable]
  70. public class SpinEvent : UnityEvent {}
  71. }
  72. }