SRNumberSpinner.cs 5.0 KB

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