2
0

DistanceJointInspector.cs 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  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="DistanceJoint"/> component.
  11. /// </summary>
  12. [CustomInspector(typeof(DistanceJoint))]
  13. internal class DistanceJointInspector : JointInspector
  14. {
  15. private GUIToggleField enableMinLimitField = new GUIToggleField(new LocEdString("Enable minimum limit"));
  16. private GUIFloatField minLimitField = new GUIFloatField(new LocEdString("Minimum distance"));
  17. private GUIToggleField enableMaxLimitField = new GUIToggleField(new LocEdString("Enable maximum limit"));
  18. private GUIFloatField maxLimitField = new GUIFloatField(new LocEdString("Maximum distance"));
  19. private GUIFloatField toleranceField = new GUIFloatField(new LocEdString("Tolerance"));
  20. private GUIToggleField enableSpringField = new GUIToggleField(new LocEdString("Enable spring"));
  21. private SpringGUI springGUI;
  22. private GUILayoutX springLayout;
  23. /// <inheritdoc/>
  24. protected internal override void Initialize()
  25. {
  26. DistanceJoint joint = InspectedObject as DistanceJoint;
  27. if (joint != null)
  28. BuildGUI(joint);
  29. }
  30. /// <inheritdoc/>
  31. protected internal override InspectableState Refresh()
  32. {
  33. DistanceJoint joint = InspectedObject as DistanceJoint;
  34. if (joint == null)
  35. return InspectableState.NotModified;
  36. Refresh(joint);
  37. InspectableState oldState = modifyState;
  38. if (modifyState.HasFlag(InspectableState.Modified))
  39. modifyState = InspectableState.NotModified;
  40. return oldState;
  41. }
  42. /// <summary>
  43. /// Creates GUI elements for fields specific to the distance joint.
  44. /// </summary>
  45. protected void BuildGUI(DistanceJoint joint)
  46. {
  47. enableMinLimitField.OnChanged += x =>
  48. {
  49. joint.SetFlag(DistanceJointFlag.MinDistance, x);
  50. MarkAsModified();
  51. ConfirmModify();
  52. minLimitField.Active = x;
  53. };
  54. minLimitField.OnChanged += x => { joint.MinDistance = x; MarkAsModified(); };
  55. minLimitField.OnFocusLost += ConfirmModify;
  56. minLimitField.OnConfirmed += ConfirmModify;
  57. enableMaxLimitField.OnChanged += x =>
  58. {
  59. joint.SetFlag(DistanceJointFlag.MaxDistance, x);
  60. MarkAsModified();
  61. ConfirmModify();
  62. maxLimitField.Active = x;
  63. };
  64. maxLimitField.OnChanged += x => { joint.MaxDistance = x; MarkAsModified(); };
  65. maxLimitField.OnFocusLost += ConfirmModify;
  66. maxLimitField.OnConfirmed += ConfirmModify;
  67. toleranceField.OnChanged += x => { joint.Tolerance = x; MarkAsModified(); };
  68. toleranceField.OnFocusLost += ConfirmModify;
  69. toleranceField.OnConfirmed += ConfirmModify;
  70. enableSpringField.OnChanged += x =>
  71. {
  72. joint.SetFlag(DistanceJointFlag.Spring, x);
  73. MarkAsModified();
  74. ConfirmModify();
  75. springLayout.Active = x;
  76. };
  77. Layout.AddElement(enableMinLimitField);
  78. GUILayoutX minLimitLayout = Layout.AddLayoutX();
  79. {
  80. minLimitLayout.AddSpace(10);
  81. minLimitLayout.AddElement(minLimitField);
  82. }
  83. Layout.AddElement(enableMaxLimitField);
  84. GUILayoutX maxLimitLayout = Layout.AddLayoutX();
  85. {
  86. maxLimitLayout.AddSpace(10);
  87. maxLimitLayout.AddElement(maxLimitField);
  88. }
  89. Layout.AddElement(toleranceField);
  90. Layout.AddElement(enableSpringField);
  91. springLayout = Layout.AddLayoutX();
  92. {
  93. springLayout.AddSpace(10);
  94. springGUI = new SpringGUI(joint.Spring, springLayout);
  95. springGUI.OnChanged += x => { joint.Spring = x; MarkAsModified(); };
  96. springGUI.OnConfirmed += ConfirmModify;
  97. }
  98. minLimitField.Active = joint.HasFlag(DistanceJointFlag.MinDistance);
  99. maxLimitField.Active = joint.HasFlag(DistanceJointFlag.MaxDistance);
  100. springLayout.Active = joint.HasFlag(DistanceJointFlag.Spring);
  101. base.BuildGUI(joint, true);
  102. }
  103. /// <summary>
  104. /// Updates all GUI elements from current values in the joint.
  105. /// </summary>
  106. /// <param name="joint">Joint to update the GUI from.</param>
  107. protected void Refresh(DistanceJoint joint)
  108. {
  109. bool enableMinDistanceLimit = joint.HasFlag(DistanceJointFlag.MinDistance);
  110. if (enableMinLimitField.Value != enableMinDistanceLimit)
  111. {
  112. enableMinLimitField.Value = enableMinDistanceLimit;
  113. minLimitField.Active = enableMinDistanceLimit;
  114. }
  115. minLimitField.Value = joint.MinDistance;
  116. bool enableMaxDistanceLimit = joint.HasFlag(DistanceJointFlag.MaxDistance);
  117. if (enableMaxLimitField.Value != enableMaxDistanceLimit)
  118. {
  119. enableMaxLimitField.Value = enableMaxDistanceLimit;
  120. maxLimitField.Active = enableMaxDistanceLimit;
  121. }
  122. maxLimitField.Value = joint.MaxDistance;
  123. toleranceField.Value = joint.Tolerance;
  124. bool enableSpring = joint.HasFlag(DistanceJointFlag.Spring);
  125. if (enableSpringField.Value != enableSpring)
  126. {
  127. enableSpringField.Value = enableSpring;
  128. springLayout.Active = enableSpring;
  129. }
  130. springGUI.Spring = joint.Spring;
  131. base.Refresh(joint);
  132. }
  133. }
  134. /** @} */
  135. }