SRNumberButton.cs 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. using UnityEngine.UI;
  2. namespace SRF.UI
  3. {
  4. using Internal;
  5. using UnityEngine;
  6. using UnityEngine.EventSystems;
  7. [AddComponentMenu(ComponentMenuPaths.NumberButton)]
  8. public class SRNumberButton : UnityEngine.UI.Button, IPointerClickHandler, IPointerDownHandler, IPointerUpHandler
  9. {
  10. private const float ExtraThreshold = 3f;
  11. public const float Delay = 0.4f;
  12. private float _delayTime;
  13. private float _downTime;
  14. private bool _isDown;
  15. public double Amount = 1;
  16. public SRNumberSpinner TargetField;
  17. public override void OnPointerDown(PointerEventData eventData)
  18. {
  19. base.OnPointerDown(eventData);
  20. if (!interactable)
  21. {
  22. return;
  23. }
  24. Apply();
  25. _isDown = true;
  26. _downTime = Time.realtimeSinceStartup;
  27. _delayTime = _downTime + Delay;
  28. }
  29. public override void OnPointerUp(PointerEventData eventData)
  30. {
  31. base.OnPointerUp(eventData);
  32. _isDown = false;
  33. }
  34. protected virtual void Update()
  35. {
  36. if (_isDown)
  37. {
  38. if (_delayTime <= Time.realtimeSinceStartup)
  39. {
  40. Apply();
  41. var newDelay = Delay*0.5f;
  42. var extra = Mathf.RoundToInt((Time.realtimeSinceStartup - _downTime)/ExtraThreshold);
  43. for (var i = 0; i < extra; i++)
  44. {
  45. newDelay *= 0.5f;
  46. }
  47. _delayTime = Time.realtimeSinceStartup + newDelay;
  48. }
  49. }
  50. }
  51. private void Apply()
  52. {
  53. var currentValue = double.Parse(TargetField.text);
  54. currentValue += Amount;
  55. if (currentValue > TargetField.MaxValue)
  56. {
  57. currentValue = TargetField.MaxValue;
  58. }
  59. if (currentValue < TargetField.MinValue)
  60. {
  61. currentValue = TargetField.MinValue;
  62. }
  63. TargetField.text = currentValue.ToString();
  64. TargetField.onEndEdit.Invoke(TargetField.text);
  65. }
  66. }
  67. }