InspectorWindow.cs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. using System;
  2. using System.Collections.Generic;
  3. using BansheeEngine;
  4. namespace BansheeEditor
  5. {
  6. internal sealed class InspectorWindow : EditorWindow
  7. {
  8. private class InspectorData
  9. {
  10. public GUIComponentFoldout foldout;
  11. public GUIPanelContainer container;
  12. public Inspector inspector;
  13. public bool expanded = true;
  14. }
  15. private List<InspectorData> inspectorData = new List<InspectorData>();
  16. private GUIScrollArea inspectorScrollArea;
  17. private GUILayout inspectorLayout;
  18. internal void SetObjectToInspect(SceneObject so)
  19. {
  20. Clear();
  21. // TODO - Create SceneObject gui elements (name + transform)
  22. inspectorScrollArea = new GUIScrollArea();
  23. GUI.layout.AddElement(inspectorScrollArea);
  24. inspectorLayout = inspectorScrollArea.layout;
  25. Component[] allComponents = so.GetComponents();
  26. for (int i = 0; i < allComponents.Length; i++)
  27. {
  28. InspectorData data = new InspectorData();
  29. GUIPanel inspectorPanel = CreatePanel(0, 0, 0, 0);
  30. data.foldout = new GUIComponentFoldout(allComponents[i].GetType().Name);
  31. inspectorLayout.AddElement(data.foldout);
  32. data.container = new GUIPanelContainer(inspectorPanel);
  33. inspectorLayout.AddElement(data.container);
  34. data.inspector = GetInspector(allComponents[i].GetType());
  35. data.inspector.Initialize(inspectorPanel, allComponents[i]);
  36. data.foldout.SetExpanded(true);
  37. data.foldout.OnToggled += (bool expanded) => Foldout_OnToggled(data, expanded);
  38. inspectorData.Add(data);
  39. inspectorData[i].inspector.Refresh();
  40. }
  41. inspectorLayout.AddFlexibleSpace();
  42. RepositionInspectors();
  43. }
  44. void Foldout_OnToggled(InspectorData inspectorData, bool expanded)
  45. {
  46. inspectorData.expanded = expanded;
  47. inspectorData.inspector.SetVisible(expanded);
  48. RepositionInspectors();
  49. }
  50. internal void Refresh()
  51. {
  52. bool anythingModified = false;
  53. for (int i = 0; i < inspectorData.Count; i++)
  54. {
  55. anythingModified |= inspectorData[i].inspector.Refresh();
  56. }
  57. if (anythingModified)
  58. RepositionInspectors();
  59. }
  60. internal void Destroy()
  61. {
  62. // TODO - Destroy SceneObject GUI elements
  63. Clear();
  64. }
  65. internal void Clear()
  66. {
  67. for (int i = 0; i < inspectorData.Count; i++)
  68. {
  69. inspectorData[i].foldout.Destroy();
  70. inspectorData[i].inspector.Destroy();
  71. }
  72. inspectorData.Clear();
  73. if (inspectorScrollArea != null)
  74. {
  75. inspectorScrollArea.Destroy();
  76. inspectorScrollArea = null;
  77. }
  78. }
  79. protected override void WindowResized(int width, int height)
  80. {
  81. base.WindowResized(width, height);
  82. RepositionInspectors();
  83. }
  84. private void RepositionInspectors()
  85. {
  86. int curPosition = 0;
  87. for (int i = 0; i < inspectorData.Count; i++)
  88. {
  89. int inspectorHeight = inspectorData[i].inspector.GetOptimalHeight();
  90. if (!inspectorData[i].expanded)
  91. inspectorHeight = 0;
  92. inspectorData[i].inspector.SetArea(0, curPosition, width, inspectorHeight);
  93. inspectorData[i].container.SetLayoutOptions(GUIOption.FixedHeight(inspectorHeight));
  94. curPosition += inspectorHeight;
  95. }
  96. }
  97. private Inspector GetInspector(Type type)
  98. {
  99. // TODO - Check if type has a custom inspector
  100. // and return the custom inspector, otherwise create a generic one
  101. return new GenericInspector();
  102. }
  103. }
  104. }