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.
CrowdControl/Assets/3rd/StompyRobot/SRDebugger/Scripts/UI/Controls/Data/EnumControl.cs

109 lines
2.7 KiB
C#

2 months ago
// ReSharper disable once RedundantUsingDirective
using System.Reflection;
namespace SRDebugger.UI.Controls.Data
{
using System;
using SRF;
using SRF.UI;
using UnityEngine;
using UnityEngine.UI;
public class EnumControl : DataBoundControl
{
private object _lastValue;
private string[] _names;
private Array _values;
[RequiredField] public LayoutElement ContentLayoutElement;
public GameObject[] DisableOnReadOnly;
[RequiredField] public SRSpinner Spinner;
[RequiredField] public Text Title;
[RequiredField] public Text Value;
protected override void Start()
{
base.Start();
}
protected override void OnBind(string propertyName, Type t)
{
base.OnBind(propertyName, t);
Title.text = propertyName;
Spinner.interactable = !IsReadOnly;
if (DisableOnReadOnly != null)
{
foreach (var child in DisableOnReadOnly)
{
child.SetActive(!IsReadOnly);
}
}
_names = Enum.GetNames(t);
_values = Enum.GetValues(t);
var longestName = "";
for (var i = 0; i < _names.Length; i++)
{
if (_names[i].Length > longestName.Length)
{
longestName = _names[i];
}
}
if (_names.Length == 0)
{
return;
}
// Set preferred width of content to the largest possible value size
var width = Value.cachedTextGeneratorForLayout.GetPreferredWidth(longestName,
Value.GetGenerationSettings(new Vector2(float.MaxValue, Value.preferredHeight)));
ContentLayoutElement.preferredWidth = width;
}
protected override void OnValueUpdated(object newValue)
{
_lastValue = newValue;
Value.text = newValue.ToString();
}
public override bool CanBind(Type type, bool isReadOnly)
{
#if NETFX_CORE
return type.GetTypeInfo().IsEnum;
#else
return type.IsEnum;
#endif
}
private void SetIndex(int i)
{
UpdateValue(_values.GetValue(i));
Refresh();
}
public void GoToNext()
{
var currentIndex = Array.IndexOf(_values, _lastValue);
SetIndex(SRMath.Wrap(_values.Length, currentIndex + 1));
}
public void GoToPrevious()
{
var currentIndex = Array.IndexOf(_values, _lastValue);
SetIndex(SRMath.Wrap(_values.Length, currentIndex - 1));
}
}
}