Files
2026-02-21 16:45:37 +08:00

74 lines
1.5 KiB
C#

using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
namespace SRF.UI
{
[AddComponentMenu("SRF/UI/SRNumberButton")]
public class SRNumberButton : Button, IPointerClickHandler, IPointerDownHandler, IPointerUpHandler, IEventSystemHandler
{
private const float ExtraThreshold = 3f;
public const float Delay = 0.4f;
private float _delayTime;
private float _downTime;
private bool _isDown;
public double Amount = 1.0;
public SRNumberSpinner TargetField;
public override void OnPointerDown(PointerEventData eventData)
{
base.OnPointerDown(eventData);
if (base.interactable)
{
Apply();
_isDown = true;
_downTime = Time.realtimeSinceStartup;
_delayTime = _downTime + 0.4f;
}
}
public override void OnPointerUp(PointerEventData eventData)
{
base.OnPointerUp(eventData);
_isDown = false;
}
protected virtual void Update()
{
if (_isDown && _delayTime <= Time.realtimeSinceStartup)
{
Apply();
float num = 0.2f;
int num2 = Mathf.RoundToInt((Time.realtimeSinceStartup - _downTime) / 3f);
for (int i = 0; i < num2; i++)
{
num *= 0.5f;
}
_delayTime = Time.realtimeSinceStartup + num;
}
}
private void Apply()
{
double num = double.Parse(TargetField.text);
num += Amount;
if (num > TargetField.MaxValue)
{
num = TargetField.MaxValue;
}
if (num < TargetField.MinValue)
{
num = TargetField.MinValue;
}
TargetField.text = num.ToString();
TargetField.onEndEdit.Invoke(TargetField.text);
}
}
}