SRNumberSpinner.cs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. using System;
  2. using UnityEngine;
  3. using UnityEngine.EventSystems;
  4. using UnityEngine.UI;
  5. namespace SRF.UI
  6. {
  7. [AddComponentMenu("SRF/UI/SRNumberSpinner")]
  8. public class SRNumberSpinner : InputField
  9. {
  10. protected override void Awake()
  11. {
  12. base.Awake();
  13. if (base.contentType != InputField.ContentType.IntegerNumber && base.contentType != InputField.ContentType.DecimalNumber)
  14. {
  15. UnityEngine.Debug.LogError("[SRNumberSpinner] contentType must be integer or decimal. Defaulting to integer");
  16. base.contentType = InputField.ContentType.DecimalNumber;
  17. }
  18. }
  19. public override void OnPointerClick(PointerEventData eventData)
  20. {
  21. if (!base.interactable)
  22. {
  23. return;
  24. }
  25. if (eventData.dragging)
  26. {
  27. return;
  28. }
  29. EventSystem.current.SetSelectedGameObject(base.gameObject, eventData);
  30. base.OnPointerClick(eventData);
  31. if (this.m_Keyboard == null || !this.m_Keyboard.active)
  32. {
  33. this.OnSelect(eventData);
  34. }
  35. else
  36. {
  37. base.UpdateLabel();
  38. eventData.Use();
  39. }
  40. }
  41. public override void OnPointerDown(PointerEventData eventData)
  42. {
  43. }
  44. public override void OnPointerUp(PointerEventData eventData)
  45. {
  46. }
  47. public override void OnBeginDrag(PointerEventData eventData)
  48. {
  49. if (!base.interactable)
  50. {
  51. return;
  52. }
  53. if (Mathf.Abs(eventData.delta.y) > Mathf.Abs(eventData.delta.x))
  54. {
  55. Transform parent = base.transform.parent;
  56. if (parent != null)
  57. {
  58. eventData.pointerDrag = ExecuteEvents.GetEventHandler<IBeginDragHandler>(parent.gameObject);
  59. if (eventData.pointerDrag != null)
  60. {
  61. ExecuteEvents.Execute<IBeginDragHandler>(eventData.pointerDrag, eventData, ExecuteEvents.beginDragHandler);
  62. }
  63. }
  64. return;
  65. }
  66. eventData.Use();
  67. this._dragStartAmount = double.Parse(base.text);
  68. this._currentValue = this._dragStartAmount;
  69. float num = 1f;
  70. if (base.contentType == InputField.ContentType.IntegerNumber)
  71. {
  72. num *= 10f;
  73. }
  74. this._dragStep = Math.Max((double)num, this._dragStartAmount * 0.05000000074505806);
  75. if (base.isFocused)
  76. {
  77. base.DeactivateInputField();
  78. }
  79. }
  80. public override void OnDrag(PointerEventData eventData)
  81. {
  82. if (!base.interactable)
  83. {
  84. return;
  85. }
  86. float x = eventData.delta.x;
  87. this._currentValue += Math.Abs(this._dragStep) * (double)x * (double)this.DragSensitivity;
  88. this._currentValue = Math.Round(this._currentValue, 2);
  89. if (this._currentValue > this.MaxValue)
  90. {
  91. this._currentValue = this.MaxValue;
  92. }
  93. if (this._currentValue < this.MinValue)
  94. {
  95. this._currentValue = this.MinValue;
  96. }
  97. if (base.contentType == InputField.ContentType.IntegerNumber)
  98. {
  99. base.text = ((int)Math.Round(this._currentValue)).ToString();
  100. }
  101. else
  102. {
  103. base.text = this._currentValue.ToString();
  104. }
  105. }
  106. public override void OnEndDrag(PointerEventData eventData)
  107. {
  108. if (!base.interactable)
  109. {
  110. return;
  111. }
  112. eventData.Use();
  113. if (this._dragStartAmount != this._currentValue)
  114. {
  115. base.DeactivateInputField();
  116. base.SendOnSubmit();
  117. }
  118. }
  119. private double _currentValue;
  120. private double _dragStartAmount;
  121. private double _dragStep;
  122. public float DragSensitivity = 0.01f;
  123. public double MaxValue = double.MaxValue;
  124. public double MinValue = double.MinValue;
  125. }
  126. }