GenericInspector.cs 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using BansheeEngine;
  7. namespace BansheeEditor
  8. {
  9. /// <summary>
  10. /// Default implementation of the inspector used when no specified inspector is provided for the type. Inspector
  11. /// displays GUI for all the inspectable fields in the object.
  12. /// </summary>
  13. internal sealed class GenericInspector : Inspector
  14. {
  15. private bool isInitialized;
  16. private bool isEmpty = true;
  17. private List<InspectableField> inspectableFields = new List<InspectableField>();
  18. /// <summary>
  19. /// Initializes required data the first time <see cref="Refresh"/> is called.
  20. /// </summary>
  21. private void Initialize()
  22. {
  23. if (referencedObject != null)
  24. {
  25. SerializableObject serializableObject = new SerializableObject(referencedObject.GetType(), referencedObject);
  26. foreach (var field in serializableObject.Fields)
  27. {
  28. if (!field.Inspectable)
  29. continue;
  30. inspectableFields.Add(InspectableField.CreateInspectable(field.Name, 0, new InspectableFieldLayout(layout), field.GetProperty()));
  31. isEmpty = false;
  32. }
  33. }
  34. isInitialized = true;
  35. }
  36. /// <inheritdoc/>
  37. internal override bool Refresh()
  38. {
  39. if (!isInitialized)
  40. Initialize();
  41. bool anythingModified = false;
  42. int currentIndex = 0;
  43. foreach (var field in inspectableFields)
  44. {
  45. anythingModified |= field.Refresh(currentIndex);
  46. currentIndex += field.GetNumLayoutElements();
  47. }
  48. return anythingModified;
  49. }
  50. /// <inheritdoc/>
  51. internal override void SetVisible(bool visible)
  52. {
  53. RootGUI.Visible = !isEmpty && visible;
  54. }
  55. }
  56. }