DataBinding.ts 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341
  1. class DataBinding {
  2. constructor(object: Atomic.Serializable, attrInfo: Atomic.AttributeInfo, widget: Atomic.UIWidget) {
  3. this.object = object;
  4. this.attrInfo = attrInfo;
  5. this.widget = widget;
  6. }
  7. static createBinding(object: Atomic.Serializable, attrInfo: Atomic.AttributeInfo): DataBinding {
  8. var widget: Atomic.UIWidget = null;
  9. var fd = new Atomic.UIFontDescription();
  10. fd.id = "Vera";
  11. fd.size = 11;
  12. var enumSource = null;
  13. if (attrInfo.type == Atomic.VAR_BOOL) {
  14. var box = new Atomic.UICheckBox();
  15. box.skinBg = "TBGreyCheckBox";
  16. widget = box;
  17. }
  18. else if (attrInfo.type == Atomic.VAR_INT) {
  19. if (attrInfo.enumNames.length) {
  20. enumSource = new Atomic.UISelectItemSource();
  21. for (var i in attrInfo.enumNames) {
  22. enumSource.addItem(new Atomic.UISelectItem(attrInfo.enumNames[i], (Number(i) + 1).toString()));
  23. }
  24. var button = new Atomic.UIButton();
  25. button.fontDescription = fd;
  26. button.text = "Enum Value!";
  27. var lp = new Atomic.UILayoutParams();
  28. lp.width = 140;
  29. button.layoutParams = lp;
  30. widget = button;
  31. } else {
  32. var field = new Atomic.UIEditField();
  33. field.textAlign = Atomic.UI_TEXT_ALIGN_CENTER;
  34. field.fontDescription = fd;
  35. field.skinBg = "TBAttrEditorField";
  36. var lp = new Atomic.UILayoutParams();
  37. lp.width = 140;
  38. field.layoutParams = lp;
  39. widget = field;
  40. }
  41. } else if (attrInfo.type == Atomic.VAR_FLOAT) {
  42. var field = new Atomic.UIEditField();
  43. field.textAlign = Atomic.UI_TEXT_ALIGN_CENTER;
  44. field.fontDescription = fd;
  45. field.skinBg = "TBAttrEditorField";
  46. var lp = new Atomic.UILayoutParams();
  47. lp.width = 140;
  48. field.layoutParams = lp;
  49. widget = field;
  50. }
  51. else if (attrInfo.type == Atomic.VAR_STRING) {
  52. var field = new Atomic.UIEditField();
  53. field.textAlign = Atomic.UI_TEXT_ALIGN_LEFT;
  54. field.skinBg = "TBAttrEditorField";;
  55. field.fontDescription = fd;
  56. var lp = new Atomic.UILayoutParams();
  57. lp.width = 140;
  58. field.layoutParams = lp;
  59. widget = field;
  60. }
  61. else if (attrInfo.type == Atomic.VAR_VECTOR3 || attrInfo.type == Atomic.VAR_QUATERNION) {
  62. var layout = new Atomic.UILayout();
  63. widget = layout;
  64. layout.spacing = 0;
  65. var lp = new Atomic.UILayoutParams();
  66. lp.width = 100;
  67. for (var i:any = 0; i < 3; i++) {
  68. var select = new Atomic.UIInlineSelect();
  69. select.id = String(i + 1);
  70. select.fontDescription = fd;
  71. select.skinBg = "InspectorVectorAttrName";
  72. select.setLimits(-10000000, 10000000);
  73. var editlp = new Atomic.UILayoutParams();
  74. editlp.minWidth = 60;
  75. select.editFieldLayoutParams = editlp;
  76. select.layoutParams = lp;
  77. layout.addChild(select);
  78. }
  79. } else if (attrInfo.type == Atomic.VAR_COLOR) {
  80. var layout = new Atomic.UILayout();
  81. widget = layout;
  82. layout.spacing = 0;
  83. var lp = new Atomic.UILayoutParams();
  84. lp.width = 70;
  85. for (var i:any = 0; i < 4; i++) {
  86. var select = new Atomic.UIInlineSelect();
  87. select.id = String(i + 1);
  88. select.fontDescription = fd;
  89. select.setLimits(-10000000, 10000000);
  90. select.layoutParams = lp;
  91. layout.addChild(select);
  92. }
  93. }
  94. if (widget) {
  95. var binding = new DataBinding(object, attrInfo, widget);
  96. binding.enumSource = enumSource;
  97. return binding;
  98. }
  99. return null;
  100. }
  101. setWidgetValueFromObject() {
  102. if (this.widgetLocked)
  103. return;
  104. this.widgetLocked = true;
  105. var attrInfo = this.attrInfo;
  106. var object = this.object;
  107. var widget = this.widget;
  108. if (attrInfo.type == Atomic.VAR_BOOL) {
  109. var value = object.getAttribute(attrInfo.name);
  110. widget.value = (value ? 1 : 0);
  111. }
  112. else if (attrInfo.type == Atomic.VAR_VECTOR3) {
  113. var value = object.getAttribute(attrInfo.name);
  114. for (var i = 0; i < 3; i++) {
  115. var select = widget.getWidget((i + 1).toString());
  116. if (select)
  117. select.value = value[i];
  118. }
  119. }
  120. else if (attrInfo.type == Atomic.VAR_QUATERNION) {
  121. var value = object.getAttribute(attrInfo.name);
  122. for (var i = 0; i < 3; i++) {
  123. var select = widget.getWidget((i + 1).toString());
  124. if (select)
  125. select.value = value[i];
  126. }
  127. }
  128. else if (attrInfo.type == Atomic.VAR_STRING) {
  129. var value = object.getAttribute(attrInfo.name);
  130. widget.text = value;
  131. }
  132. else if (attrInfo.type == Atomic.VAR_FLOAT) {
  133. var value = object.getAttribute(attrInfo.name);
  134. widget.text = parseFloat(value.toFixed(5)).toString();
  135. }
  136. else if (attrInfo.type == Atomic.VAR_INT) {
  137. var value = object.getAttribute(attrInfo.name);
  138. if (attrInfo.enumNames.length) {
  139. widget.text = attrInfo.enumNames[value];
  140. }
  141. else {
  142. widget.text = value.toString();
  143. }
  144. }
  145. else if (attrInfo.type == Atomic.VAR_COLOR) {
  146. var value = object.getAttribute(attrInfo.name);
  147. for (var i = 0; i < 4; i++) {
  148. var select = widget.getWidget((i + 1).toString());
  149. if (select)
  150. select.value = value[i];
  151. }
  152. }
  153. this.widgetLocked = false;
  154. }
  155. setObjectValueFromWidget(srcWidget: Atomic.UIWidget) {
  156. if (this.objectLocked)
  157. return;
  158. this.objectLocked = true;
  159. var widget = this.widget;
  160. var object = this.object;
  161. var attrInfo = this.attrInfo;
  162. var type = attrInfo.type;
  163. if (type == Atomic.VAR_BOOL) {
  164. object.setAttribute(attrInfo.name, widget.value ? true : false);
  165. } else if (type == Atomic.VAR_INT) {
  166. object.setAttribute(attrInfo.name, Number(widget.text));
  167. }
  168. else if (type == Atomic.VAR_FLOAT) {
  169. object.setAttribute(attrInfo.name, Number(widget.text));
  170. }
  171. else if (type == Atomic.VAR_STRING) {
  172. object.setAttribute(attrInfo.name, widget.text);
  173. } else if (type == Atomic.VAR_VECTOR3 && srcWidget) {
  174. var value = object.getAttribute(attrInfo.name);
  175. if (srcWidget.id == "1")
  176. value[0] = srcWidget.value;
  177. else if (srcWidget.id == "2")
  178. value[1] = srcWidget.value;
  179. else if (srcWidget.id == "3")
  180. value[2] = srcWidget.value;
  181. object.setAttribute(attrInfo.name, value);
  182. } else if (type == Atomic.VAR_QUATERNION && srcWidget) {
  183. var value = object.getAttribute(attrInfo.name);
  184. if (srcWidget.id == "1")
  185. value[0] = srcWidget.value;
  186. else if (srcWidget.id == "2")
  187. value[1] = srcWidget.value;
  188. else if (srcWidget.id == "3")
  189. value[2] = srcWidget.value;
  190. object.setAttribute(attrInfo.name, value);
  191. } else if (type == Atomic.VAR_COLOR && srcWidget) {
  192. var value = object.getAttribute(attrInfo.name);
  193. if (srcWidget.id == "1")
  194. value[0] = srcWidget.value;
  195. else if (srcWidget.id == "2")
  196. value[1] = srcWidget.value;
  197. else if (srcWidget.id == "3")
  198. value[2] = srcWidget.value;
  199. else if (srcWidget.id == "4")
  200. value[3] = srcWidget.value;
  201. object.setAttribute(attrInfo.name, value);
  202. }
  203. this.objectLocked = false;
  204. }
  205. handleWidgetEvent(ev: Atomic.UIWidgetEvent): boolean {
  206. if (this.objectLocked)
  207. return false;
  208. if (ev.type == Atomic.UI_EVENT_TYPE_CLICK) {
  209. var id = this.attrInfo.name + " enum popup";
  210. if (ev.target.id == id) {
  211. this.object.setAttribute(this.attrInfo.name, Number(ev.refid) - 1);
  212. this.setWidgetValueFromObject();
  213. }
  214. else if (this.widget == ev.target && this.attrInfo.enumNames.length) {
  215. if (this.enumSource) {
  216. var menu = new Atomic.UIMenuWindow(ev.target, id);
  217. menu.show(this.enumSource);
  218. }
  219. return true;
  220. }
  221. }
  222. if (ev.type == Atomic.UI_EVENT_TYPE_CHANGED) {
  223. if (this.widget == ev.target || this.widget.isAncestorOf(ev.target)) {
  224. this.setObjectValueFromWidget(ev.target);
  225. return true;
  226. }
  227. }
  228. return false;
  229. }
  230. object: Atomic.Serializable;
  231. objectLocked: boolean = true;
  232. widgetLocked: boolean = false;
  233. attrInfo: Atomic.AttributeInfo;
  234. widget: Atomic.UIWidget;
  235. enumSource: Atomic.UISelectItemSource;
  236. }
  237. export = DataBinding;