//********************************** 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(SliderJoint))]
internal class SliderJointInspector : JointInspector
{
private GUIToggleField enableLimitField = new GUIToggleField(new LocEdString("Enable limit"));
private LimitLinearRangeGUI limitGUI;
private GUILayoutX limitLayout;
///
protected internal override void Initialize()
{
SliderJoint joint = InspectedObject as SliderJoint;
if (joint != null)
BuildGUI(joint);
}
///
protected internal override InspectableState Refresh()
{
SliderJoint joint = InspectedObject as SliderJoint;
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 slider joint.
///
protected void BuildGUI(SliderJoint joint)
{
enableLimitField.OnChanged += x =>
{
joint.SetFlag(SliderJointFlag.Limit, x);
MarkAsModified();
ConfirmModify();
ToggleLimitFields(x);
};
Layout.AddElement(enableLimitField);
limitLayout = Layout.AddLayoutX();
{
limitLayout.AddSpace(10);
GUILayoutY limitContentsLayout = limitLayout.AddLayoutY();
limitGUI = new LimitLinearRangeGUI(joint.Limit, limitContentsLayout, Persistent);
limitGUI.OnChanged += (x, y) =>
{
joint.Limit = x;
joint.Limit.SetBase(y);
MarkAsModified();
};
limitGUI.OnConfirmed += ConfirmModify;
}
ToggleLimitFields(joint.HasFlag(SliderJointFlag.Limit));
base.BuildGUI(joint, true);
}
///
/// Updates all GUI elements from current values in the joint.
///
/// Joint to update the GUI from.
protected void Refresh(SliderJoint joint)
{
bool enableLimit = joint.HasFlag(SliderJointFlag.Limit);
if (enableLimitField.Value != enableLimit)
{
enableLimitField.Value = enableLimit;
ToggleLimitFields(enableLimit);
}
limitGUI.Limit = joint.Limit;
base.Refresh(joint);
}
///
/// Hides or shows limit property GUI elements.
///
/// True to show, false to hide.
private void ToggleLimitFields(bool enable)
{
limitLayout.Active = enable;
}
}
/** @} */
}