177 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			C#
		
	
	
	
		
		
			
		
	
	
			177 lines
		
	
	
		
			5.1 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(); | |||
|  |             } | |||
|  |         } | |||
|  |     } | |||
|  | } |