diff options
Diffstat (limited to 'Assets/Plugins/Editor/AdvancedInspector/FieldEditors/EnumEditor.cs')
-rw-r--r-- | Assets/Plugins/Editor/AdvancedInspector/FieldEditors/EnumEditor.cs | 192 |
1 files changed, 192 insertions, 0 deletions
diff --git a/Assets/Plugins/Editor/AdvancedInspector/FieldEditors/EnumEditor.cs b/Assets/Plugins/Editor/AdvancedInspector/FieldEditors/EnumEditor.cs new file mode 100644 index 00000000..627aba7c --- /dev/null +++ b/Assets/Plugins/Editor/AdvancedInspector/FieldEditors/EnumEditor.cs @@ -0,0 +1,192 @@ +using UnityEngine; +using UnityEditor; +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; + +namespace AdvancedInspector +{ + public class EnumEditor : FieldEditor + { + public override bool EditDerived + { + get { return true; } + } + + public override bool Expandable + { + get { return false; } + } + + public override Type[] EditedTypes + { + get { return new Type[] { typeof(Enum) }; } + } + + public override void Draw(InspectorField field, GUIStyle style) + { + EnumAttribute display = field.GetAttribute<EnumAttribute>(); + + EditorGUI.showMixedValue = field.Mixed; + + EditorGUI.BeginChangeCheck(); + + object result = null; + long value = Convert.ToInt64(GetValue(field)); + if (display == null || !display.Masked) + { + if (display == null || display.Display == EnumDisplay.DropDown) + result = DrawDropDown(field.Type, value, style, false); + else if (display.Display == EnumDisplay.Button) + result = DrawEnum(field.Type, value, display.MaxItemsPerRow, style == null ? EditorStyles.toolbarButton : style); + else if (display.Display == EnumDisplay.Checkbox) + result = DrawEnum(field.Type, value, display.MaxItemsPerRow, style == null ? EditorStyles.toggle : style); + } + else + { + if (display == null || display.Display == EnumDisplay.DropDown) + result = DrawDropDown(field.Type, value, style, true); + else if (display.Display == EnumDisplay.Button) + result = DrawMasked(field.Type, value, display.MaxItemsPerRow, style == null ? EditorStyles.toolbarButton : style); + else if (display.Display == EnumDisplay.Checkbox) + result = DrawMasked(field.Type, value, display.MaxItemsPerRow, style == null ? EditorStyles.toggle : style); + } + + if (EditorGUI.EndChangeCheck()) + field.SetValue(result); + } + + private int SelectedIndex(Array values, long value) + { + for (int i = 0; i < values.Length; i++) + if (Convert.ToInt64(values.GetValue(i)) == value) + return i; + + return 0; + } + + private string[] GetNames(Type type) + { + Array values = Enum.GetValues(type); + List<string> names = Enum.GetNames(type).ToList(); + + for (int i = 0; i < names.Count; i++) + { + DescriptorAttribute descriptor = ((Enum)values.GetValue(i)).GetAttribute<DescriptorAttribute>(); + if (descriptor != null && !string.IsNullOrEmpty(descriptor.Name)) + names[i] = descriptor.Name; + else + names[i] = ObjectNames.NicifyVariableName(names[i]); + } + + return names.ToArray(); + } + + private object DrawDropDown(Type type, long value, GUIStyle style, bool masked) + { + string[] names = GetNames(type); + Array values = Enum.GetValues(type); + + if (masked) + { + if (style == null) + value = EditorGUILayout.MaskField(Convert.ToInt32(value), names); + else + value = EditorGUILayout.MaskField(Convert.ToInt32(value), names, style); + + return Enum.ToObject(type, value); + } + else + { + int selected = SelectedIndex(values, value); + + if (style == null) + selected = EditorGUILayout.Popup(selected, names); + else + selected = EditorGUILayout.Popup(selected, names, style); + + return Enum.ToObject(type, values.GetValue(selected)); + } + } + + private object DrawEnum(Type type, long value, int max, GUIStyle style) + { + if (max < 1) + max = 6; + + string[] names = GetNames(type); + Array values = Enum.GetValues(type); + + int rows = Mathf.CeilToInt((float)names.Length / (float)max); + int count = (names.Length / rows); + if (count * rows < names.Length) + count++; + + int selected = SelectedIndex(values, value); + + GUILayout.BeginVertical(); + + for (int i = 0; i < rows; i++) + { + GUILayout.BeginHorizontal(); + + for (int j = count * i; j < count * (i + 1); j++) + { + if (j >= names.Length) + break; + + if (selected == j) + GUILayout.Toggle(true, names[j], style); + else if (GUILayout.Toggle(false, names[j], style)) + selected = j; + } + + GUILayout.EndHorizontal(); + } + + GUILayout.EndVertical(); + + return Enum.ToObject(type, values.GetValue(selected)); + } + + private object DrawMasked(Type type, long value, int max, GUIStyle style) + { + if (max < 1) + max = 6; + + Array values = Enum.GetValues(type); + string[] names = GetNames(type); + + int rows = Mathf.CeilToInt((float)names.Length / (float)max); + int count = (names.Length / rows); + if (count * rows < names.Length) + count++; + + int result = 0; + + GUILayout.BeginVertical(); + + for (int i = 0; i < rows; i++) + { + GUILayout.BeginHorizontal(); + + for (int j = count * i; j < count * (i + 1); j++) + { + if (j >= names.Length) + break; + + int v = (int)values.GetValue(j); + if (GUILayout.Toggle(((int)value & v) == v, names[j], style)) + result |= v; + } + + GUILayout.EndHorizontal(); + } + + GUILayout.EndVertical(); + + return Enum.ToObject(type, result); + } + } +}
\ No newline at end of file |