SRSpinner.cs 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. using System;
  2. using UnityEngine;
  3. using UnityEngine.Events;
  4. using UnityEngine.EventSystems;
  5. using UnityEngine.UI;
  6. namespace SRF.UI
  7. {
  8. [AddComponentMenu("SRF/UI/Spinner")]
  9. public class SRSpinner : Selectable, IEventSystemHandler, IBeginDragHandler, IDragHandler
  10. {
  11. public SRSpinner.SpinEvent OnSpinIncrement
  12. {
  13. get
  14. {
  15. return this._onSpinIncrement;
  16. }
  17. set
  18. {
  19. this._onSpinIncrement = value;
  20. }
  21. }
  22. public SRSpinner.SpinEvent OnSpinDecrement
  23. {
  24. get
  25. {
  26. return this._onSpinDecrement;
  27. }
  28. set
  29. {
  30. this._onSpinDecrement = value;
  31. }
  32. }
  33. public void OnBeginDrag(PointerEventData eventData)
  34. {
  35. this._dragDelta = 0f;
  36. }
  37. public void OnDrag(PointerEventData eventData)
  38. {
  39. if (!base.interactable)
  40. {
  41. return;
  42. }
  43. this._dragDelta += eventData.delta.x;
  44. if (Mathf.Abs(this._dragDelta) > this.DragThreshold)
  45. {
  46. float num = Mathf.Sign(this._dragDelta);
  47. int num2 = Mathf.FloorToInt(Mathf.Abs(this._dragDelta) / this.DragThreshold);
  48. if (num > 0f)
  49. {
  50. this.OnIncrement(num2);
  51. }
  52. else
  53. {
  54. this.OnDecrement(num2);
  55. }
  56. this._dragDelta -= (float)num2 * this.DragThreshold * num;
  57. }
  58. }
  59. private void OnIncrement(int amount)
  60. {
  61. for (int i = 0; i < amount; i++)
  62. {
  63. this.OnSpinIncrement.Invoke();
  64. }
  65. }
  66. private void OnDecrement(int amount)
  67. {
  68. for (int i = 0; i < amount; i++)
  69. {
  70. this.OnSpinDecrement.Invoke();
  71. }
  72. }
  73. private float _dragDelta;
  74. [SerializeField]
  75. private SRSpinner.SpinEvent _onSpinDecrement = new SRSpinner.SpinEvent();
  76. [SerializeField]
  77. private SRSpinner.SpinEvent _onSpinIncrement = new SRSpinner.SpinEvent();
  78. public float DragThreshold = 20f;
  79. [Serializable]
  80. public class SpinEvent : UnityEvent
  81. {
  82. }
  83. }
  84. }