//********************************** Banshee Engine (www.banshee3d.com) **************************************************//
//**************** Copyright (c) 2016 Marko Pintera (marko.pintera@gmail.com). All rights reserved. **********************//
using BansheeEngine;
namespace BansheeEditor
{
/** @addtogroup Inspectors
* @{
*/
///
/// Renders an inspector for the component.
///
[CustomInspector(typeof(AudioSource))]
internal class AudioSourceInspector : Inspector
{
private GUIResourceField audioClipField = new GUIResourceField(typeof(AudioClip), new LocEdString("Clip"));
private GUISliderField volumeField = new GUISliderField(0.0f, 1.0f, new LocEdString("Volume"));
private GUIFloatField pitchField = new GUIFloatField(new LocEdString("Pitch"));
private GUIToggleField loopField = new GUIToggleField(new LocEdString("Loop"));
private GUIIntField priorityField = new GUIIntField(new LocEdString("Priority"));
private GUIFloatField minDistanceField = new GUIFloatField(new LocEdString("Min. distance"));
private GUIFloatField attenuationField = new GUIFloatField(new LocEdString("Attenuation"));
private GUIToggleField playOnStartField = new GUIToggleField(new LocEdString("Play on start"));
private InspectableState modifyState;
///
protected internal override void Initialize()
{
BuildGUI();
}
///
protected internal override InspectableState Refresh()
{
AudioSource source = InspectedObject as AudioSource;
if (source == null)
return InspectableState.NotModified;
audioClipField.Value = source.Clip;
volumeField.Value = source.Volume;
pitchField.Value = source.Pitch;
loopField.Value = source.Loop;
priorityField.Value = (int)source.Priority;
minDistanceField.Value = source.MinDistance;
attenuationField.Value = source.Attenuation;
playOnStartField.Value = source.PlayOnStart;
InspectableState oldState = modifyState;
if (modifyState.HasFlag(InspectableState.Modified))
modifyState = InspectableState.NotModified;
return oldState;
}
///
/// Recreates all the GUI elements used by this inspector.
///
private void BuildGUI()
{
Layout.Clear();
AudioSource source = InspectedObject as AudioSource;
if (source == null)
return;
audioClipField.OnChanged += x =>
{
AudioClip clip = Resources.Load(x);
source.Clip = clip;
MarkAsModified();
ConfirmModify();
};
volumeField.OnChanged += x =>
{
source.Volume = x;
MarkAsModified();
ConfirmModify();
};
pitchField.OnChanged += x => { source.Pitch = x; MarkAsModified(); };
pitchField.OnConfirmed += ConfirmModify;
pitchField.OnFocusLost += ConfirmModify;
loopField.OnChanged += x =>
{
source.Loop = x;
MarkAsModified();
ConfirmModify();
};
priorityField.OnChanged += x => { source.Priority = (uint)x; MarkAsModified(); };
priorityField.OnConfirmed += ConfirmModify;
priorityField.OnFocusLost += ConfirmModify;
minDistanceField.OnChanged += x => { source.MinDistance = x; MarkAsModified(); };
minDistanceField.OnConfirmed += ConfirmModify;
minDistanceField.OnFocusLost += ConfirmModify;
attenuationField.OnChanged += x => { source.Attenuation = x; MarkAsModified(); };
attenuationField.OnConfirmed += ConfirmModify;
attenuationField.OnFocusLost += ConfirmModify;
playOnStartField.OnChanged += x =>
{
source.PlayOnStart = x;
MarkAsModified();
ConfirmModify();
};
Layout.AddElement(audioClipField);
Layout.AddElement(volumeField);
Layout.AddElement(pitchField);
Layout.AddElement(loopField);
Layout.AddElement(priorityField);
Layout.AddElement(minDistanceField);
Layout.AddElement(attenuationField);
Layout.AddElement(playOnStartField);
}
///
/// Marks the contents of the inspector as modified.
///
protected void MarkAsModified()
{
modifyState |= InspectableState.ModifyInProgress;
}
///
/// Confirms any queued modifications.
///
protected void ConfirmModify()
{
if (modifyState.HasFlag(InspectableState.ModifyInProgress))
modifyState |= InspectableState.Modified;
}
}
/** @} */
}