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.
109 lines
2.7 KiB
C#
109 lines
2.7 KiB
C#
// 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));
|
|
}
|
|
}
|
|
}
|