DistanceJointInspector.cs 5.8 KB

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