|
|
|
|
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);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|