82 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			82 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C#
		
	
	
	
| namespace SRF.UI
 | |
| {
 | |
|     using Internal;
 | |
|     using UnityEngine;
 | |
|     using UnityEngine.EventSystems;
 | |
| 
 | |
|     [AddComponentMenu(ComponentMenuPaths.NumberButton)]
 | |
|     public class SRNumberButton : UnityEngine.UI.Button, IPointerClickHandler, IPointerDownHandler, IPointerUpHandler
 | |
|     {
 | |
|         private const float ExtraThreshold = 3f;
 | |
|         public const float Delay = 0.4f;
 | |
|         private float _delayTime;
 | |
|         private float _downTime;
 | |
|         private bool _isDown;
 | |
|         public double Amount = 1;
 | |
|         public SRNumberSpinner TargetField;
 | |
| 
 | |
|         public override void OnPointerDown(PointerEventData eventData)
 | |
|         {
 | |
|             base.OnPointerDown(eventData);
 | |
| 
 | |
|             if (!interactable)
 | |
|             {
 | |
|                 return;
 | |
|             }
 | |
| 
 | |
|             Apply();
 | |
| 
 | |
|             _isDown = true;
 | |
|             _downTime = Time.realtimeSinceStartup;
 | |
|             _delayTime = _downTime + Delay;
 | |
|         }
 | |
| 
 | |
|         public override void OnPointerUp(PointerEventData eventData)
 | |
|         {
 | |
|             base.OnPointerUp(eventData);
 | |
| 
 | |
|             _isDown = false;
 | |
|         }
 | |
| 
 | |
|         protected virtual void Update()
 | |
|         {
 | |
|             if (_isDown)
 | |
|             {
 | |
|                 if (_delayTime <= Time.realtimeSinceStartup)
 | |
|                 {
 | |
|                     Apply();
 | |
| 
 | |
|                     var newDelay = Delay*0.5f;
 | |
| 
 | |
|                     var extra = Mathf.RoundToInt((Time.realtimeSinceStartup - _downTime)/ExtraThreshold);
 | |
| 
 | |
|                     for (var i = 0; i < extra; i++)
 | |
|                     {
 | |
|                         newDelay *= 0.5f;
 | |
|                     }
 | |
| 
 | |
|                     _delayTime = Time.realtimeSinceStartup + newDelay;
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private void Apply()
 | |
|         {
 | |
|             var currentValue = double.Parse(TargetField.text);
 | |
|             currentValue += Amount;
 | |
| 
 | |
|             if (currentValue > TargetField.MaxValue)
 | |
|             {
 | |
|                 currentValue = TargetField.MaxValue;
 | |
|             }
 | |
|             if (currentValue < TargetField.MinValue)
 | |
|             {
 | |
|                 currentValue = TargetField.MinValue;
 | |
|             }
 | |
| 
 | |
|             TargetField.text = currentValue.ToString();
 | |
|             TargetField.onEndEdit.Invoke(TargetField.text);
 | |
|         }
 | |
|     }
 | |
| }
 |