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