ComponentInspector.ts 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. import ScriptWidget = require("../ScriptWidget");
  2. import DataBinding = require("./DataBinding");
  3. import InspectorUtils = require("./InspectorUtils");
  4. class ComponentInspector extends Atomic.UISection {
  5. constructor() {
  6. super();
  7. this.subscribeToEvent("WidgetEvent", (data) => this.handleWidgetEvent(data));
  8. }
  9. handleWidgetEvent(ev: Atomic.UIWidgetEvent) {
  10. var handled = false;
  11. for (var i = 0; i < this.bindings.length; i++) {
  12. if (this.bindings[i].handleWidgetEvent(ev)) {
  13. handled = true;
  14. }
  15. }
  16. // return if handled
  17. return handled;
  18. }
  19. inspect(component: Atomic.Component) {
  20. this.component = component;
  21. this.text = component.getTypeName();
  22. // don't expand by default
  23. this.value = 0;
  24. var fd = new Atomic.UIFontDescription();
  25. fd.id = "Vera";
  26. fd.size = 11;
  27. var nlp = new Atomic.UILayoutParams();
  28. nlp.width = 304;
  29. var attrsVerticalLayout = new Atomic.UILayout(Atomic.UI_AXIS_Y);
  30. attrsVerticalLayout.spacing = 3;
  31. attrsVerticalLayout.layoutPosition = Atomic.UI_LAYOUT_POSITION_LEFT_TOP;
  32. attrsVerticalLayout.layoutSize = Atomic.UI_LAYOUT_SIZE_AVAILABLE;
  33. this.contentRoot.addChild(attrsVerticalLayout);
  34. var attrs = component.getAttributes();
  35. for (var i in attrs) {
  36. var attr = <Atomic.AttributeInfo> attrs[i];
  37. if (attr.mode & Atomic.AM_NOEDIT)
  38. continue;
  39. var binding = DataBinding.createBinding(component, attr);
  40. if (!binding)
  41. continue;
  42. var attrLayout = new Atomic.UILayout();
  43. attrLayout.layoutDistribution = Atomic.UI_LAYOUT_DISTRIBUTION_GRAVITY;
  44. var name = new Atomic.UITextField();
  45. name.textAlign = Atomic.UI_TEXT_ALIGN_LEFT;
  46. name.skinBg = "InspectorTextAttrName";
  47. if (attr.type == Atomic.VAR_VECTOR3 || attr.type == Atomic.VAR_COLOR ||
  48. attr.type == Atomic.VAR_QUATERNION) {
  49. attrLayout.axis = Atomic.UI_AXIS_Y;
  50. attrLayout.layoutPosition = Atomic.UI_LAYOUT_POSITION_LEFT_TOP;
  51. attrLayout.skinBg = "InspectorVectorAttrLayout";
  52. }
  53. var bname = attr.name;
  54. if (bname == "Is Enabled")
  55. bname = "Enabled";
  56. name.text = bname;
  57. name.fontDescription = fd;
  58. attrLayout.addChild(name);
  59. attrLayout.addChild(binding.widget);
  60. attrsVerticalLayout.addChild(attrLayout);
  61. this.bindings.push(binding);
  62. }
  63. if (component.getTypeName() == "PrefabComponent") {
  64. this.addPrefabUI(attrsVerticalLayout);
  65. }
  66. if (component.getTypeName() == "Light") {
  67. this.addLightCascadeParametersUI(attrsVerticalLayout);
  68. }
  69. if (component.getTypeName() == "JSComponent") {
  70. this.addJSComponentUI(attrsVerticalLayout);
  71. }
  72. var deleteButton = new Atomic.UIButton();
  73. deleteButton.text = "Delete Component";
  74. deleteButton.fontDescription = fd;
  75. deleteButton.onClick = () => {
  76. var node = this.component.node;
  77. this.component.remove();
  78. // refresh entire inspector, fix this...
  79. this.sendEvent("EditorActiveNodeChange", { node: node });
  80. return true;
  81. }
  82. attrsVerticalLayout.addChild(deleteButton);
  83. for (var i in this.bindings) {
  84. this.bindings[i].setWidgetValueFromObject();
  85. this.bindings[i].objectLocked = false;
  86. }
  87. }
  88. // Move these to a mixing class
  89. addPrefabUI(layout:Atomic.UILayout) {
  90. // expand prefab
  91. this.value = 1;
  92. var fd = new Atomic.UIFontDescription();
  93. fd.id = "Vera";
  94. fd.size = 11;
  95. var selectButton = new Atomic.UIButton();
  96. selectButton.text = "Select Prefab";
  97. selectButton.fontDescription = fd;
  98. selectButton.onClick = () => {
  99. var node = (<Atomic.PrefabComponent> this.component).getPrefabNode();
  100. this.sendEvent("EditorActiveNodeChange", { node: node });
  101. return true;
  102. }
  103. layout.addChild(selectButton);
  104. }
  105. addJSComponentUI(layout:Atomic.UILayout) {
  106. var js = <Atomic.JSComponent> this.component;
  107. // expand prefab
  108. this.value = 1;
  109. var fd = new Atomic.UIFontDescription();
  110. fd.id = "Vera";
  111. fd.size = 11;
  112. var selectButton = new Atomic.UIButton();
  113. selectButton.text = "Select Script";
  114. selectButton.fontDescription = fd;
  115. selectButton.onClick = () => {
  116. return true;
  117. }
  118. var field = InspectorUtils.createAttrEditField("Script", layout);
  119. field.readOnly = true;
  120. field.text = js.componentFile ? js.componentFile.name : "";
  121. layout.addChild(selectButton);
  122. }
  123. addLightCascadeParametersUI(layout:Atomic.UILayout) {
  124. var light = <Atomic.Light> this.component;
  125. var cascadeInfo = light.getShadowCascade();
  126. var container = InspectorUtils.createContainer();
  127. container.gravity = Atomic.UI_GRAVITY_ALL;
  128. layout.addChild(container);
  129. var panel = new Atomic.UILayout();
  130. panel.axis = Atomic.UI_AXIS_Y;
  131. panel.layoutSize = Atomic.UI_LAYOUT_SIZE_PREFERRED;
  132. panel.layoutPosition = Atomic.UI_LAYOUT_POSITION_LEFT_TOP;
  133. container.addChild(panel);
  134. var label = InspectorUtils.createAttrName("CSM Splits:");
  135. panel.addChild(label);
  136. function createHandler(index, light, field) {
  137. return function(data:Atomic.UIWidgetEvent) {
  138. if (data.type == Atomic.UI_EVENT_TYPE_CHANGED) {
  139. this.light.setShadowCascadeParameter(this.index, Number(this.field.text));
  140. }
  141. }.bind({index:index, light:light, field:field});
  142. }
  143. var field = InspectorUtils.createAttrEditField("Split 0", panel);
  144. field.text = cascadeInfo[0].toString();
  145. field.subscribeToEvent(field, "WidgetEvent", createHandler(0, light, field));
  146. field = InspectorUtils.createAttrEditField("Split 1", panel);
  147. field.text = cascadeInfo[1].toString();
  148. field.subscribeToEvent(field, "WidgetEvent", createHandler(1, light, field));
  149. field = InspectorUtils.createAttrEditField("Split 2", panel);
  150. field.text = cascadeInfo[2].toString();
  151. field.subscribeToEvent(field, "WidgetEvent", createHandler(2, light, field));
  152. field = InspectorUtils.createAttrEditField("Split 3", panel);
  153. field.text = cascadeInfo[3].toString();
  154. field.subscribeToEvent(field, "WidgetEvent", createHandler(3, light, field));
  155. }
  156. component: Atomic.Component;
  157. bindings: Array<DataBinding> = new Array();
  158. }
  159. export = ComponentInspector;