//********************************** 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(DistanceJoint))]
internal class DistanceJointInspector : JointInspector
{
private GUIToggleField enableMinLimitField = new GUIToggleField(new LocEdString("Enable minimum limit"));
private GUIFloatField minLimitField = new GUIFloatField(new LocEdString("Minimum distance"));
private GUIToggleField enableMaxLimitField = new GUIToggleField(new LocEdString("Enable maximum limit"));
private GUIFloatField maxLimitField = new GUIFloatField(new LocEdString("Maximum distance"));
private GUIFloatField toleranceField = new GUIFloatField(new LocEdString("Tolerance"));
private GUIToggleField enableSpringField = new GUIToggleField(new LocEdString("Enable spring"));
private SpringGUI springGUI;
private GUILayoutX springLayout;
///
protected internal override void Initialize()
{
DistanceJoint joint = InspectedObject as DistanceJoint;
if (joint != null)
BuildGUI(joint);
}
///
protected internal override InspectableState Refresh()
{
DistanceJoint joint = InspectedObject as DistanceJoint;
if (joint == null)
return InspectableState.NotModified;
Refresh(joint);
InspectableState oldState = modifyState;
if (modifyState.HasFlag(InspectableState.Modified))
modifyState = InspectableState.NotModified;
return oldState;
}
///
/// Creates GUI elements for fields specific to the distance joint.
///
protected void BuildGUI(DistanceJoint joint)
{
enableMinLimitField.OnChanged += x =>
{
joint.SetFlag(DistanceJointFlag.MinDistance, x);
MarkAsModified();
ConfirmModify();
minLimitField.Active = x;
};
minLimitField.OnChanged += x => { joint.MinDistance = x; MarkAsModified(); };
minLimitField.OnFocusLost += ConfirmModify;
minLimitField.OnConfirmed += ConfirmModify;
enableMaxLimitField.OnChanged += x =>
{
joint.SetFlag(DistanceJointFlag.MaxDistance, x);
MarkAsModified();
ConfirmModify();
maxLimitField.Active = x;
};
maxLimitField.OnChanged += x => { joint.MaxDistance = x; MarkAsModified(); };
maxLimitField.OnFocusLost += ConfirmModify;
maxLimitField.OnConfirmed += ConfirmModify;
toleranceField.OnChanged += x => { joint.Tolerance = x; MarkAsModified(); };
toleranceField.OnFocusLost += ConfirmModify;
toleranceField.OnConfirmed += ConfirmModify;
enableSpringField.OnChanged += x =>
{
joint.SetFlag(DistanceJointFlag.Spring, x);
MarkAsModified();
ConfirmModify();
springLayout.Active = x;
};
Layout.AddElement(enableMinLimitField);
GUILayoutX minLimitLayout = Layout.AddLayoutX();
{
minLimitLayout.AddSpace(10);
minLimitLayout.AddElement(minLimitField);
}
Layout.AddElement(enableMaxLimitField);
GUILayoutX maxLimitLayout = Layout.AddLayoutX();
{
maxLimitLayout.AddSpace(10);
maxLimitLayout.AddElement(maxLimitField);
}
Layout.AddElement(toleranceField);
Layout.AddElement(enableSpringField);
springLayout = Layout.AddLayoutX();
{
springLayout.AddSpace(10);
springGUI = new SpringGUI(joint.Spring, springLayout);
springGUI.OnChanged += x => { joint.Spring = x; MarkAsModified(); };
springGUI.OnConfirmed += ConfirmModify;
}
minLimitField.Active = joint.HasFlag(DistanceJointFlag.MinDistance);
maxLimitField.Active = joint.HasFlag(DistanceJointFlag.MaxDistance);
springLayout.Active = joint.HasFlag(DistanceJointFlag.Spring);
base.BuildGUI(joint, true);
}
///
/// Updates all GUI elements from current values in the joint.
///
/// Joint to update the GUI from.
protected void Refresh(DistanceJoint joint)
{
bool enableMinDistanceLimit = joint.HasFlag(DistanceJointFlag.MinDistance);
if (enableMinLimitField.Value != enableMinDistanceLimit)
{
enableMinLimitField.Value = enableMinDistanceLimit;
minLimitField.Active = enableMinDistanceLimit;
}
minLimitField.Value = joint.MinDistance;
bool enableMaxDistanceLimit = joint.HasFlag(DistanceJointFlag.MaxDistance);
if (enableMaxLimitField.Value != enableMaxDistanceLimit)
{
enableMaxLimitField.Value = enableMaxDistanceLimit;
maxLimitField.Active = enableMaxDistanceLimit;
}
maxLimitField.Value = joint.MaxDistance;
toleranceField.Value = joint.Tolerance;
bool enableSpring = joint.HasFlag(DistanceJointFlag.Spring);
if (enableSpringField.Value != enableSpring)
{
enableSpringField.Value = enableSpring;
springLayout.Active = enableSpring;
}
springGUI.Spring = joint.Spring;
base.Refresh(joint);
}
}
/** @} */
}