You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
CrowdControl/Assets/3rd/StompyRobot/SRF/Scripts/UI/SRNumberButton.cs

82 lines
2.2 KiB
C#

1 month ago
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);
}
}
}