using System;
|
using System.Collections.Generic;
|
using System.Text;
|
using System.Text.RegularExpressions;
|
using UnityEngine.Events;
|
using Snxxz.UI;
|
namespace UnityEngine.UI
|
{
|
[AddComponentMenu("UI/NumKeyBoard")]
|
[RequireComponent(typeof(RectTransform))]
|
public class NumKeyBoard : MonoBehaviour
|
{
|
[SerializeField]
|
NumKeyBoardType m_Type;
|
public NumKeyBoardType type
|
{
|
get { return m_Type; }
|
}
|
[SerializeField]
|
bool deActiveConfirm = false;
|
[SerializeField]
|
private uint m_Min;
|
public uint min
|
{
|
get { return m_Min; }
|
set { m_Min = value; }
|
}
|
[SerializeField]
|
private uint m_Max;
|
public uint max { get { return m_Max; } set { m_Max = value; } }
|
[SerializeField]
|
private int m_NumLimit;
|
public int limit { get { return m_NumLimit; } set { m_NumLimit = value; } }
|
[SerializeField]
|
private Button[] m_NumBtns = new Button[10];
|
[SerializeField]
|
private Button okBtn;
|
[SerializeField]
|
private Button cancelBtn;
|
[Serializable]
|
public class NumKeyboardEvent : UnityEvent { }
|
private NumKeyboardEvent m_OnValueChange = new NumKeyboardEvent();
|
public NumKeyboardEvent onValueChange
|
{
|
get { return m_OnValueChange; }
|
}
|
[Serializable]
|
public class NumKeyboardConfirmEvent : UnityEvent<bool> { }
|
private NumKeyboardConfirmEvent m_OnConfirm = new NumKeyboardConfirmEvent();
|
public NumKeyboardConfirmEvent onConfirm
|
{
|
get { return m_OnConfirm; }
|
}
|
public bool displayOutValue = true;
|
private StringBuilder m_Value = new StringBuilder();
|
|
[SerializeField] ClickScreenOtherSpace m_ClickOther;
|
|
public string Value
|
{
|
get { return m_Value.ToString(); }
|
set
|
{
|
switch (type)
|
{
|
case NumKeyBoardType.Math:
|
{
|
if (!Regex.IsMatch(value, "[0-9]+"))
|
{
|
throw new Exception("No Correct Format!");
|
}
|
m_IntValue = uint.Parse(value);
|
m_RealIntValue = m_IntValue;
|
}
|
break;
|
case NumKeyBoardType.Password:
|
{
|
if (!Regex.IsMatch(value, "[0-9]*"))
|
{
|
throw new Exception("No Correct Format!");
|
}
|
}
|
break;
|
}
|
m_Value.Length = 0;
|
m_Value.Append(value);
|
SetTargetTextValue();
|
}
|
}
|
private uint m_IntValue = 0;
|
private uint m_RealIntValue = 0;
|
private bool resetValue = false;
|
/// <summary>
|
/// 目标显示文本组件
|
/// </summary>
|
public Text targetText;
|
|
private void Awake()
|
{
|
for (int i = 0; i < m_NumBtns.Length; i++)
|
{
|
if (m_NumBtns[i] != null)
|
{
|
uint index = (uint)i;
|
m_NumBtns[i].onClick.AddListener(() =>
|
{
|
OnClickNum(index);
|
});
|
}
|
}
|
okBtn.onClick.AddListener(OnOkBtn);
|
cancelBtn.onClick.AddListener(OnCancelBtn);
|
ResetValue();
|
if (m_ClickOther != null)
|
{
|
m_ClickOther.AddListener(OnOkBtn);
|
}
|
}
|
|
private void ResetValue()
|
{
|
switch (type)
|
{
|
case NumKeyBoardType.Math:
|
m_IntValue = (uint)Mathf.Max(0, min);
|
m_RealIntValue = m_IntValue;
|
m_Value.Length = 0;
|
m_Value.Append(m_IntValue);
|
break;
|
case NumKeyBoardType.Password:
|
m_Value.Length = 0;
|
break;
|
}
|
SetTargetTextValue();
|
resetValue = true;
|
}
|
|
private void OnEnable()
|
{
|
resetValue = true;
|
}
|
|
private void OnCancelBtn()
|
{
|
ResetValue();
|
onValueChange.Invoke();
|
onConfirm.Invoke(false);
|
}
|
|
private void OnOkBtn()
|
{
|
onConfirm.Invoke(true);
|
if (deActiveConfirm) gameObject.SetActive(false);
|
}
|
|
private void OnClickNum(uint index)
|
{
|
switch (type)
|
{
|
case NumKeyBoardType.Math:
|
{
|
if (resetValue)
|
{
|
m_RealIntValue = index;
|
if (max > 0 && index > max)
|
{
|
index = max;
|
}
|
if (!displayOutValue && min > 0 && index < min)
|
{
|
index = min;
|
}
|
m_IntValue = index;
|
resetValue = false;
|
}
|
else
|
{
|
uint _value = m_RealIntValue * 10 + index;
|
m_RealIntValue = _value;
|
if (max > 0 && _value > max) _value = max;
|
if (min > 0 && _value < min) _value = min;
|
if (_value == m_IntValue) return;
|
m_IntValue = _value;
|
}
|
m_Value.Length = 0;
|
m_Value.Append(m_IntValue);
|
SetTargetTextValue();
|
}
|
break;
|
case NumKeyBoardType.Password:
|
if (limit != 0 && m_Value.Length >= limit) return;
|
m_Value.Append(index);
|
SetTargetTextValue();
|
break;
|
}
|
m_OnValueChange.Invoke();
|
}
|
|
void SetTargetTextValue()
|
{
|
if (targetText != null)
|
{
|
targetText.text = Value;
|
}
|
}
|
}
|
public enum NumKeyBoardType
|
{
|
Math,
|
Password,
|
}
|
}
|