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.
177 lines
5.0 KiB
C#
177 lines
5.0 KiB
C#
namespace SRF.UI
|
|
{
|
|
using System;
|
|
using Internal;
|
|
using UnityEngine;
|
|
using UnityEngine.EventSystems;
|
|
using UnityEngine.UI;
|
|
|
|
[AddComponentMenu(ComponentMenuPaths.NumberSpinner)]
|
|
public class SRNumberSpinner : InputField
|
|
{
|
|
private double _currentValue;
|
|
private double _dragStartAmount;
|
|
private double _dragStep;
|
|
public float DragSensitivity = 0.01f;
|
|
public double MaxValue = double.MaxValue;
|
|
public double MinValue = double.MinValue;
|
|
|
|
protected override void Awake()
|
|
{
|
|
base.Awake();
|
|
|
|
if (contentType != ContentType.IntegerNumber && contentType != ContentType.DecimalNumber)
|
|
{
|
|
Debug.LogError("[SRNumberSpinner] contentType must be integer or decimal. Defaulting to integer");
|
|
contentType = ContentType.DecimalNumber;
|
|
}
|
|
}
|
|
|
|
public override void OnPointerClick(PointerEventData eventData)
|
|
{
|
|
//Debug.Log("OnPointerClick (isFocused: {0}, isUsed: {1}, isDragging: {2})".Fmt(isFocused, eventData.used, eventData.dragging));
|
|
|
|
if (!interactable)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (eventData.dragging)
|
|
{
|
|
return;
|
|
}
|
|
|
|
EventSystem.current.SetSelectedGameObject(gameObject, eventData);
|
|
|
|
base.OnPointerClick(eventData);
|
|
|
|
if ((m_Keyboard == null || !m_Keyboard.active))
|
|
{
|
|
OnSelect(eventData);
|
|
}
|
|
else
|
|
{
|
|
UpdateLabel();
|
|
eventData.Use();
|
|
}
|
|
}
|
|
|
|
public override void OnPointerDown(PointerEventData eventData)
|
|
{
|
|
//Debug.Log("OnPointerDown (isFocused: {0}, isUsed: {1})".Fmt(isFocused, eventData.used));
|
|
|
|
//base.OnPointerDown(eventData);
|
|
}
|
|
|
|
public override void OnPointerUp(PointerEventData eventData)
|
|
{
|
|
//Debug.Log("OnPointerUp (isFocused: {0}, isUsed: {1})".Fmt(isFocused, eventData.used));
|
|
|
|
//base.OnPointerUp(eventData);
|
|
}
|
|
|
|
public override void OnBeginDrag(PointerEventData eventData)
|
|
{
|
|
if (!interactable)
|
|
{
|
|
return;
|
|
}
|
|
|
|
//Debug.Log("OnBeginDrag (isFocused: {0}, isUsed: {1}, delta: {2})".Fmt(isFocused, eventData.used, eventData.delta));
|
|
|
|
// Pass event to parent if it is a vertical drag
|
|
if (Mathf.Abs(eventData.delta.y) > Mathf.Abs(eventData.delta.x))
|
|
{
|
|
//Debug.Log("Passing To Parent");
|
|
|
|
var parent = transform.parent;
|
|
|
|
if (parent != null)
|
|
{
|
|
eventData.pointerDrag = ExecuteEvents.GetEventHandler<IBeginDragHandler>(parent.gameObject);
|
|
|
|
if (eventData.pointerDrag != null)
|
|
{
|
|
ExecuteEvents.Execute(eventData.pointerDrag, eventData, ExecuteEvents.beginDragHandler);
|
|
}
|
|
}
|
|
|
|
return;
|
|
}
|
|
eventData.Use();
|
|
|
|
_dragStartAmount = double.Parse(text);
|
|
_currentValue = _dragStartAmount;
|
|
|
|
var minStep = 1f;
|
|
|
|
// Use a larger minimum step for integer numbers, since there are no fractional values
|
|
if (contentType == ContentType.IntegerNumber)
|
|
{
|
|
minStep *= 10;
|
|
}
|
|
|
|
_dragStep = Math.Max(minStep, _dragStartAmount*0.05f);
|
|
|
|
if (isFocused)
|
|
{
|
|
DeactivateInputField();
|
|
}
|
|
}
|
|
|
|
public override void OnDrag(PointerEventData eventData)
|
|
{
|
|
if (!interactable)
|
|
{
|
|
return;
|
|
}
|
|
|
|
//Debug.Log("OnDrag (isFocused: {0}, isUsed: {1})".Fmt(isFocused, eventData.used));
|
|
|
|
var diff = eventData.delta.x;
|
|
|
|
_currentValue += Math.Abs(_dragStep)*diff*DragSensitivity;
|
|
_currentValue = Math.Round(_currentValue, 2);
|
|
|
|
if (_currentValue > MaxValue)
|
|
{
|
|
_currentValue = MaxValue;
|
|
}
|
|
|
|
if (_currentValue < MinValue)
|
|
{
|
|
_currentValue = MinValue;
|
|
}
|
|
|
|
if (contentType == ContentType.IntegerNumber)
|
|
{
|
|
text = ((int) Math.Round(_currentValue)).ToString();
|
|
}
|
|
else
|
|
{
|
|
text = _currentValue.ToString();
|
|
}
|
|
}
|
|
|
|
public override void OnEndDrag(PointerEventData eventData)
|
|
{
|
|
if (!interactable)
|
|
{
|
|
return;
|
|
}
|
|
|
|
//Debug.Log("OnEndDrag (isFocused: {0}, isUsed: {1})".Fmt(isFocused, eventData.used));
|
|
|
|
//base.OnEndDrag(eventData);
|
|
|
|
eventData.Use();
|
|
|
|
if (_dragStartAmount != _currentValue)
|
|
{
|
|
DeactivateInputField();
|
|
SendOnSubmit();
|
|
}
|
|
}
|
|
}
|
|
}
|