DebugUIHandlerCanvasEditor.cs 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. using System;
  2. using System.Linq;
  3. using UnityEditor;
  4. using UnityEditor.Rendering;
  5. using UnityEditorInternal;
  6. using UnityEngine.Rendering;
  7. namespace UnityEngine.Rendering.UI
  8. {
  9. [CustomEditor(typeof(DebugUIHandlerCanvas))]
  10. sealed class DebugUIHandlerCanvasEditor : Editor
  11. {
  12. SerializedProperty m_PanelPrefab;
  13. SerializedProperty m_Prefabs;
  14. ReorderableList m_PrefabList;
  15. static string[] s_Types; // Assembly qualified names
  16. static string[] s_DisplayTypes; // Pretty names
  17. static DebugUIHandlerCanvasEditor()
  18. {
  19. s_Types = CoreUtils.GetAllTypesDerivedFrom<DebugUI.Widget>()
  20. .Where(t => !t.IsAbstract)
  21. .Select(t => t.AssemblyQualifiedName)
  22. .ToArray();
  23. s_DisplayTypes = new string[s_Types.Length];
  24. for (int i = 0; i < s_Types.Length; i++)
  25. s_DisplayTypes[i] = Type.GetType(s_Types[i]).Name;
  26. }
  27. void OnEnable()
  28. {
  29. var o = new PropertyFetcher<DebugUIHandlerCanvas>(serializedObject);
  30. m_PanelPrefab = o.Find(x => x.panelPrefab);
  31. m_Prefabs = o.Find(x => x.prefabs);
  32. m_PrefabList = new ReorderableList(serializedObject, m_Prefabs, true, true, true, true)
  33. {
  34. drawHeaderCallback = rect => EditorGUI.LabelField(rect, "Widget Prefabs"),
  35. drawElementCallback = (rect, index, isActive, isFocused) =>
  36. {
  37. var element = m_PrefabList.serializedProperty.GetArrayElementAtIndex(index);
  38. rect.y += 2f;
  39. const float kTypeWidth = 100f;
  40. // Type selector
  41. var typeProp = element.FindPropertyRelative("type");
  42. int typeIndex = ArrayUtility.IndexOf(s_Types, typeProp.stringValue);
  43. typeIndex = Mathf.Max(typeIndex, 0);
  44. typeIndex = EditorGUI.Popup(new Rect(rect.x, rect.y, kTypeWidth, EditorGUIUtility.singleLineHeight), typeIndex, s_DisplayTypes);
  45. typeProp.stringValue = s_Types[typeIndex];
  46. // Prefab
  47. EditorGUI.PropertyField(
  48. new Rect(rect.x + kTypeWidth + 2f, rect.y, rect.width - kTypeWidth - 2f, EditorGUIUtility.singleLineHeight),
  49. element.FindPropertyRelative("prefab"), GUIContent.none);
  50. },
  51. onSelectCallback = list =>
  52. {
  53. var prefab = list.serializedProperty.GetArrayElementAtIndex(list.index).FindPropertyRelative("prefab").objectReferenceValue as GameObject;
  54. if (prefab)
  55. EditorGUIUtility.PingObject(prefab.gameObject);
  56. }
  57. };
  58. }
  59. public override void OnInspectorGUI()
  60. {
  61. serializedObject.Update();
  62. EditorGUILayout.PropertyField(m_PanelPrefab);
  63. EditorGUILayout.Space();
  64. m_PrefabList.DoLayoutList();
  65. serializedObject.ApplyModifiedProperties();
  66. }
  67. }
  68. }