AudioSourceInspector.cs 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. using BansheeEngine;
  4. namespace BansheeEditor
  5. {
  6. /** @addtogroup Inspectors
  7. * @{
  8. */
  9. /// <summary>
  10. /// Renders an inspector for the <see cref="AudioSource"/> component.
  11. /// </summary>
  12. [CustomInspector(typeof(AudioSource))]
  13. internal class AudioSourceInspector : Inspector
  14. {
  15. private GUIResourceField audioClipField = new GUIResourceField(typeof(AudioClip), new LocEdString("Clip"));
  16. private GUISliderField volumeField = new GUISliderField(0.0f, 1.0f, new LocEdString("Volume"));
  17. private GUIFloatField pitchField = new GUIFloatField(new LocEdString("Pitch"));
  18. private GUIToggleField loopField = new GUIToggleField(new LocEdString("Loop"));
  19. private GUIIntField priorityField = new GUIIntField(new LocEdString("Priority"));
  20. private GUIFloatField minDistanceField = new GUIFloatField(new LocEdString("Min. distance"));
  21. private GUIFloatField attenuationField = new GUIFloatField(new LocEdString("Attenuation"));
  22. private InspectableState modifyState;
  23. /// <inheritdoc/>
  24. protected internal override void Initialize()
  25. {
  26. BuildGUI();
  27. }
  28. /// <inheritdoc/>
  29. protected internal override InspectableState Refresh()
  30. {
  31. AudioSource source = InspectedObject as AudioSource;
  32. if (source == null)
  33. return InspectableState.NotModified;
  34. audioClipField.Value = source.Clip;
  35. volumeField.Value = source.Volume;
  36. pitchField.Value = source.Pitch;
  37. loopField.Value = source.Loop;
  38. priorityField.Value = (int)source.Priority;
  39. minDistanceField.Value = source.MinDistance;
  40. attenuationField.Value = source.Attenuation;
  41. InspectableState oldState = modifyState;
  42. if (modifyState.HasFlag(InspectableState.Modified))
  43. modifyState = InspectableState.NotModified;
  44. return oldState;
  45. }
  46. /// <summary>
  47. /// Recreates all the GUI elements used by this inspector.
  48. /// </summary>
  49. private void BuildGUI()
  50. {
  51. Layout.Clear();
  52. AudioSource source = InspectedObject as AudioSource;
  53. if (source == null)
  54. return;
  55. audioClipField.OnChanged += x =>
  56. {
  57. AudioClip clip = Resources.Load<AudioClip>(x);
  58. source.Clip = clip;
  59. MarkAsModified();
  60. ConfirmModify();
  61. };
  62. volumeField.OnChanged += x =>
  63. {
  64. source.Volume = x;
  65. MarkAsModified();
  66. ConfirmModify();
  67. };
  68. pitchField.OnChanged += x => { source.Pitch = x; MarkAsModified(); };
  69. pitchField.OnConfirmed += ConfirmModify;
  70. pitchField.OnFocusLost += ConfirmModify;
  71. loopField.OnChanged += x =>
  72. {
  73. source.Loop = x;
  74. MarkAsModified();
  75. ConfirmModify();
  76. };
  77. priorityField.OnChanged += x => { source.Priority = (uint)x; MarkAsModified(); };
  78. priorityField.OnConfirmed += ConfirmModify;
  79. priorityField.OnFocusLost += ConfirmModify;
  80. minDistanceField.OnChanged += x => { source.MinDistance = x; MarkAsModified(); };
  81. minDistanceField.OnConfirmed += ConfirmModify;
  82. minDistanceField.OnFocusLost += ConfirmModify;
  83. attenuationField.OnChanged += x => { source.Attenuation = x; MarkAsModified(); };
  84. attenuationField.OnConfirmed += ConfirmModify;
  85. attenuationField.OnFocusLost += ConfirmModify;
  86. Layout.AddElement(audioClipField);
  87. Layout.AddElement(volumeField);
  88. Layout.AddElement(pitchField);
  89. Layout.AddElement(loopField);
  90. Layout.AddElement(priorityField);
  91. Layout.AddElement(minDistanceField);
  92. Layout.AddElement(attenuationField);
  93. }
  94. /// <summary>
  95. /// Marks the contents of the inspector as modified.
  96. /// </summary>
  97. protected void MarkAsModified()
  98. {
  99. modifyState |= InspectableState.ModifyInProgress;
  100. }
  101. /// <summary>
  102. /// Confirms any queued modifications.
  103. /// </summary>
  104. protected void ConfirmModify()
  105. {
  106. if (modifyState.HasFlag(InspectableState.ModifyInProgress))
  107. modifyState |= InspectableState.Modified;
  108. }
  109. }
  110. /** @} */
  111. }