InspectableObject.cs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using BansheeEngine;
  6. namespace BansheeEditor
  7. {
  8. public sealed class InspectableObject
  9. {
  10. private const int IndentAmount = 15;
  11. private SerializableObject serializableObject;
  12. private SerializableArray serializableArray;
  13. public InspectableObject(SerializableObject serializableObject)
  14. {
  15. this.serializableObject = serializableObject;
  16. }
  17. public InspectableObject(SerializableArray serializableArray)
  18. {
  19. this.serializableArray = serializableArray;
  20. }
  21. public void CreateGUI(GUILayout layout)
  22. {
  23. if (serializableObject != null)
  24. {
  25. foreach (var field in serializableObject.fields)
  26. {
  27. CreateGUI(layout, field.Name, field.Type, field.GetValue());
  28. }
  29. }
  30. else if (serializableArray != null)
  31. {
  32. // TODO - Handle multi-rank arrays
  33. int length = serializableArray.GetDimension(0);
  34. for (int i = 0; i < length; i++)
  35. {
  36. CreateGUI(layout, i.ToString(), serializableArray.ElementType, serializableArray.GetValue(i));
  37. }
  38. }
  39. // TODO - Handle List & Dictionary
  40. }
  41. private void CreateGUI(GUILayout layout, string name, SerializableField.FieldType type, SerializableValue value)
  42. {
  43. switch (type)
  44. {
  45. case SerializableField.FieldType.Object:
  46. CreateComplexField(layout, name, type, value);
  47. break;
  48. case SerializableField.FieldType.Array:
  49. goto case SerializableField.FieldType.Object;
  50. case SerializableField.FieldType.List:
  51. goto case SerializableField.FieldType.Object;
  52. case SerializableField.FieldType.Dictionary:
  53. goto case SerializableField.FieldType.Object;
  54. default:
  55. CreatePrimitiveField(layout, name, type, value);
  56. break;
  57. }
  58. }
  59. private void CreatePrimitiveField(GUILayout layout, string name, SerializableField.FieldType type, SerializableValue value)
  60. {
  61. layout.AddElement(new GUILabel(name)); // TODO - Use an IntEditorField, or others for other types
  62. }
  63. private void CreateComplexField(GUILayout layout, string name, SerializableField.FieldType type, SerializableValue value)
  64. {
  65. layout.AddElement(new GUILabel(name)); // TODO - Add foldout and hook up its callbacks
  66. GUILayout childLayout = layout.AddLayoutX();
  67. childLayout.AddSpace(IndentAmount);
  68. GUILayout childContent = childLayout.AddLayoutY();
  69. switch (type)
  70. {
  71. case SerializableField.FieldType.Object:
  72. {
  73. SerializableObject childObj = new SerializableObject(value.GetValue<object>());
  74. InspectableObject childInspectable = new InspectableObject(childObj);
  75. childInspectable.CreateGUI(childContent);
  76. }
  77. break;
  78. case SerializableField.FieldType.Array:
  79. {
  80. SerializableArray childArr = new SerializableArray(value.GetValue<object>());
  81. InspectableObject childInspectable = new InspectableObject(childArr);
  82. childInspectable.CreateGUI(childContent);
  83. }
  84. break;
  85. case SerializableField.FieldType.List:
  86. // TODO
  87. break;
  88. case SerializableField.FieldType.Dictionary:
  89. // TODO
  90. break;
  91. default:
  92. throw new Exception("Invalid complex field type.");
  93. }
  94. }
  95. }
  96. }