SliderJointInspector.cs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  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. /// <summary>
  7. /// Renders an inspector for the <see cref="SliderJoint"/> component.
  8. /// </summary>
  9. [CustomInspector(typeof(SliderJoint))]
  10. public class SliderJointInspector : JointInspector
  11. {
  12. private GUIToggleField enableLimitField = new GUIToggleField(new LocEdString("Enable limit"));
  13. private LimitLinearRangeGUI limitGUI;
  14. private GUILayoutX limitLayout;
  15. /// <inheritdoc/>
  16. protected internal override void Initialize()
  17. {
  18. SliderJoint joint = InspectedObject as SliderJoint;
  19. if (joint != null)
  20. BuildGUI(joint);
  21. }
  22. /// <inheritdoc/>
  23. protected internal override InspectableState Refresh()
  24. {
  25. SliderJoint joint = InspectedObject as SliderJoint;
  26. if (joint == null)
  27. return InspectableState.NotModified;
  28. Refresh(joint);
  29. InspectableState oldState = modifyState;
  30. if (modifyState.HasFlag(InspectableState.Modified))
  31. modifyState = InspectableState.NotModified;
  32. return oldState;
  33. }
  34. /// <summary>
  35. /// Creates GUI elements for fields specific to the slider joint.
  36. /// </summary>
  37. protected void BuildGUI(SliderJoint joint)
  38. {
  39. enableLimitField.OnChanged += x =>
  40. {
  41. joint.EnableLimit = x;
  42. MarkAsModified();
  43. ConfirmModify();
  44. ToggleLimitFields(x);
  45. };
  46. Layout.AddElement(enableLimitField);
  47. limitLayout = Layout.AddLayoutX();
  48. {
  49. limitLayout.AddSpace(10);
  50. GUILayoutY limitContentsLayout = limitLayout.AddLayoutY();
  51. limitGUI = new LimitLinearRangeGUI(joint.Limit, limitContentsLayout, Persistent);
  52. limitGUI.OnChanged += (x, y) =>
  53. {
  54. joint.Limit = new LimitLinearRange(x, y);
  55. MarkAsModified();
  56. };
  57. limitGUI.OnConfirmed += ConfirmModify;
  58. }
  59. ToggleLimitFields(joint.EnableLimit);
  60. base.BuildGUI(joint);
  61. }
  62. /// <summary>
  63. /// Updates all GUI elements from current values in the joint.
  64. /// </summary>
  65. /// <param name="joint">Joint to update the GUI from.</param>
  66. protected void Refresh(SliderJoint joint)
  67. {
  68. if (enableLimitField.Value != joint.EnableLimit)
  69. {
  70. enableLimitField.Value = joint.EnableLimit;
  71. ToggleLimitFields(joint.EnableLimit);
  72. }
  73. limitGUI.Limit = joint.Limit;
  74. base.Refresh(joint);
  75. }
  76. /// <summary>
  77. /// Hides or shows limit property GUI elements.
  78. /// </summary>
  79. /// <param name="enable">True to show, false to hide.</param>
  80. private void ToggleLimitFields(bool enable)
  81. {
  82. limitLayout.Active = enable;
  83. }
  84. }
  85. }