74 lines
1.5 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|