177 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			C#
		
	
	
	
		
		
			
		
	
	
			177 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			C#
		
	
	
	
|  | namespace SRDebugger.UI.Controls | |||
|  | { | |||
|  |     using System.Collections.Generic; | |||
|  |     using System.Collections.ObjectModel; | |||
|  |     using SRF; | |||
|  |     using UnityEngine; | |||
|  |     using UnityEngine.UI; | |||
|  | 
 | |||
|  |     public delegate void PinEntryControlCallback(IList<int> result, bool didCancel); | |||
|  | 
 | |||
|  |     public class PinEntryControl : SRMonoBehaviourEx | |||
|  |     { | |||
|  |         private bool _isVisible = true; | |||
|  |         private List<int> _numbers = new List<int>(4); | |||
|  | 
 | |||
|  |         [RequiredField] public Image Background; | |||
|  | 
 | |||
|  |         public bool CanCancel = true; | |||
|  | 
 | |||
|  |         [RequiredField] public UnityEngine.UI.Button CancelButton; | |||
|  | 
 | |||
|  |         [RequiredField] public Text CancelButtonText; | |||
|  | 
 | |||
|  |         [RequiredField] public CanvasGroup CanvasGroup; | |||
|  | 
 | |||
|  |         [RequiredField] public Animator DotAnimator; | |||
|  | 
 | |||
|  |         public UnityEngine.UI.Button[] NumberButtons; | |||
|  |         public Toggle[] NumberDots; | |||
|  | 
 | |||
|  |         [RequiredField] public Text PromptText; | |||
|  | 
 | |||
|  |         public event PinEntryControlCallback Complete; | |||
|  | 
 | |||
|  |         protected override void Awake() | |||
|  |         { | |||
|  |             base.Awake(); | |||
|  | 
 | |||
|  |             for (var i = 0; i < NumberButtons.Length; i++) | |||
|  |             { | |||
|  |                 var number = i; | |||
|  | 
 | |||
|  |                 NumberButtons[i].onClick.AddListener(() => { PushNumber(number); }); | |||
|  |             } | |||
|  | 
 | |||
|  |             CancelButton.onClick.AddListener(CancelButtonPressed); | |||
|  | 
 | |||
|  |             RefreshState(); | |||
|  |         } | |||
|  | 
 | |||
|  |         protected override void Update() | |||
|  |         { | |||
|  |             base.Update(); | |||
|  | 
 | |||
|  |             if (!_isVisible) | |||
|  |             { | |||
|  |                 return; | |||
|  |             } | |||
|  | 
 | |||
|  |             if (_numbers.Count > 0 && (Input.GetKeyDown(KeyCode.Backspace) || Input.GetKeyDown(KeyCode.Delete))) | |||
|  |             { | |||
|  |                 _numbers.PopLast(); | |||
|  |                 RefreshState(); | |||
|  |             } | |||
|  | 
 | |||
|  |             var input = Input.inputString; | |||
|  | 
 | |||
|  |             for (var i = 0; i < input.Length; i++) | |||
|  |             { | |||
|  |                 if (!char.IsNumber(input, i)) | |||
|  |                 { | |||
|  |                     continue; | |||
|  |                 } | |||
|  | 
 | |||
|  |                 var num = (int) char.GetNumericValue(input, i); | |||
|  | 
 | |||
|  |                 if (num > 9 || num < 0) | |||
|  |                 { | |||
|  |                     continue; | |||
|  |                 } | |||
|  | 
 | |||
|  |                 PushNumber(num); | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         public void Show() | |||
|  |         { | |||
|  |             CanvasGroup.alpha = 1f; | |||
|  |             CanvasGroup.blocksRaycasts = CanvasGroup.interactable = true; | |||
|  |             _isVisible = true; | |||
|  |         } | |||
|  | 
 | |||
|  |         public void Hide() | |||
|  |         { | |||
|  |             CanvasGroup.alpha = 0f; | |||
|  |             CanvasGroup.blocksRaycasts = CanvasGroup.interactable = false; | |||
|  |             _isVisible = false; | |||
|  |         } | |||
|  | 
 | |||
|  |         public void Clear() | |||
|  |         { | |||
|  |             _numbers.Clear(); | |||
|  |             RefreshState(); | |||
|  |         } | |||
|  | 
 | |||
|  |         public void PlayInvalidCodeAnimation() | |||
|  |         { | |||
|  |             DotAnimator.SetTrigger("Invalid"); | |||
|  |         } | |||
|  | 
 | |||
|  |         protected void OnComplete() | |||
|  |         { | |||
|  |             if (Complete != null) | |||
|  |             { | |||
|  |                 Complete(new ReadOnlyCollection<int>(_numbers), false); | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         protected void OnCancel() | |||
|  |         { | |||
|  |             if (Complete != null) | |||
|  |             { | |||
|  |                 Complete(new int[] {}, true); | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         private void CancelButtonPressed() | |||
|  |         { | |||
|  |             if (_numbers.Count > 0) | |||
|  |             { | |||
|  |                 _numbers.PopLast(); | |||
|  |             } | |||
|  |             else | |||
|  |             { | |||
|  |                 OnCancel(); | |||
|  |             } | |||
|  | 
 | |||
|  |             RefreshState(); | |||
|  |         } | |||
|  | 
 | |||
|  |         public void PushNumber(int number) | |||
|  |         { | |||
|  |             if (_numbers.Count >= 4) | |||
|  |             { | |||
|  |                 Debug.LogWarning("[PinEntry] Expected 4 numbers"); | |||
|  |                 return; | |||
|  |             } | |||
|  | 
 | |||
|  |             _numbers.Add(number); | |||
|  | 
 | |||
|  |             if (_numbers.Count >= 4) | |||
|  |             { | |||
|  |                 OnComplete(); | |||
|  |             } | |||
|  | 
 | |||
|  |             RefreshState(); | |||
|  |         } | |||
|  | 
 | |||
|  |         private void RefreshState() | |||
|  |         { | |||
|  |             for (var i = 0; i < NumberDots.Length; i++) | |||
|  |             { | |||
|  |                 NumberDots[i].isOn = i < _numbers.Count; | |||
|  |             } | |||
|  | 
 | |||
|  |             if (_numbers.Count > 0) | |||
|  |             { | |||
|  |                 CancelButtonText.text = "Delete"; | |||
|  |             } | |||
|  |             else | |||
|  |             { | |||
|  |                 CancelButtonText.text = CanCancel ? "Cancel" : ""; | |||
|  |             } | |||
|  |         } | |||
|  |     } | |||
|  | } |