DataBinding.ts 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386
  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. } else if (attrInfo.type == Atomic.VAR_VECTOR2) {
  94. var layout = new Atomic.UILayout();
  95. widget = layout;
  96. layout.spacing = 0;
  97. var lp = new Atomic.UILayoutParams();
  98. lp.width = 100;
  99. for (var i: any = 0; i < 2; i++) {
  100. var select = new Atomic.UIInlineSelect();
  101. select.id = String(i + 1);
  102. select.fontDescription = fd;
  103. select.skinBg = "InspectorVectorAttrName";
  104. select.setLimits(-10000000, 10000000);
  105. var editlp = new Atomic.UILayoutParams();
  106. editlp.minWidth = 60;
  107. select.editFieldLayoutParams = editlp;
  108. select.layoutParams = lp;
  109. layout.addChild(select);
  110. }
  111. }
  112. if (widget) {
  113. var binding = new DataBinding(object, attrInfo, widget);
  114. binding.enumSource = enumSource;
  115. return binding;
  116. }
  117. return null;
  118. }
  119. setWidgetValueFromObject() {
  120. if (this.widgetLocked)
  121. return;
  122. this.widgetLocked = true;
  123. var attrInfo = this.attrInfo;
  124. var object = this.object;
  125. var widget = this.widget;
  126. if (attrInfo.type == Atomic.VAR_BOOL) {
  127. var value = object.getAttribute(attrInfo.name);
  128. widget.value = (value ? 1 : 0);
  129. }
  130. else if (attrInfo.type == Atomic.VAR_VECTOR3) {
  131. var value = object.getAttribute(attrInfo.name);
  132. for (var i = 0; i < 3; i++) {
  133. var select = widget.getWidget((i + 1).toString());
  134. if (select)
  135. select.value = value[i];
  136. }
  137. }
  138. else if (attrInfo.type == Atomic.VAR_VECTOR2) {
  139. var value = object.getAttribute(attrInfo.name);
  140. for (var i = 0; i < 2; i++) {
  141. var select = widget.getWidget((i + 1).toString());
  142. if (select)
  143. select.value = value[i];
  144. }
  145. }
  146. else if (attrInfo.type == Atomic.VAR_QUATERNION) {
  147. var value = object.getAttribute(attrInfo.name);
  148. for (var i = 0; i < 3; i++) {
  149. var select = widget.getWidget((i + 1).toString());
  150. if (select)
  151. select.value = value[i];
  152. }
  153. }
  154. else if (attrInfo.type == Atomic.VAR_STRING) {
  155. var value = object.getAttribute(attrInfo.name);
  156. widget.text = value;
  157. }
  158. else if (attrInfo.type == Atomic.VAR_FLOAT) {
  159. var value = object.getAttribute(attrInfo.name);
  160. widget.text = parseFloat(value.toFixed(5)).toString();
  161. }
  162. else if (attrInfo.type == Atomic.VAR_INT) {
  163. var value = object.getAttribute(attrInfo.name);
  164. if (attrInfo.enumNames.length) {
  165. widget.text = attrInfo.enumNames[value];
  166. }
  167. else {
  168. widget.text = value.toString();
  169. }
  170. }
  171. else if (attrInfo.type == Atomic.VAR_COLOR) {
  172. var value = object.getAttribute(attrInfo.name);
  173. for (var i = 0; i < 4; i++) {
  174. var select = widget.getWidget((i + 1).toString());
  175. if (select)
  176. select.value = value[i];
  177. }
  178. }
  179. this.widgetLocked = false;
  180. }
  181. setObjectValueFromWidget(srcWidget: Atomic.UIWidget) {
  182. if (this.objectLocked)
  183. return;
  184. this.objectLocked = true;
  185. var widget = this.widget;
  186. var object = this.object;
  187. var attrInfo = this.attrInfo;
  188. var type = attrInfo.type;
  189. if (type == Atomic.VAR_BOOL) {
  190. object.setAttribute(attrInfo.name, widget.value ? true : false);
  191. } else if (type == Atomic.VAR_INT) {
  192. object.setAttribute(attrInfo.name, Number(widget.text));
  193. }
  194. else if (type == Atomic.VAR_FLOAT) {
  195. object.setAttribute(attrInfo.name, Number(widget.text));
  196. }
  197. else if (type == Atomic.VAR_STRING) {
  198. object.setAttribute(attrInfo.name, widget.text);
  199. } else if (type == Atomic.VAR_VECTOR3 && srcWidget) {
  200. var value = object.getAttribute(attrInfo.name);
  201. if (srcWidget.id == "1")
  202. value[0] = srcWidget.value;
  203. else if (srcWidget.id == "2")
  204. value[1] = srcWidget.value;
  205. else if (srcWidget.id == "3")
  206. value[2] = srcWidget.value;
  207. object.setAttribute(attrInfo.name, value);
  208. } else if (type == Atomic.VAR_VECTOR2 && srcWidget) {
  209. var value = object.getAttribute(attrInfo.name);
  210. if (srcWidget.id == "1")
  211. value[0] = srcWidget.value;
  212. else if (srcWidget.id == "2")
  213. value[1] = srcWidget.value;
  214. object.setAttribute(attrInfo.name, value);
  215. }
  216. else if (type == Atomic.VAR_QUATERNION && srcWidget) {
  217. var value = object.getAttribute(attrInfo.name);
  218. if (srcWidget.id == "1")
  219. value[0] = srcWidget.value;
  220. else if (srcWidget.id == "2")
  221. value[1] = srcWidget.value;
  222. else if (srcWidget.id == "3")
  223. value[2] = srcWidget.value;
  224. object.setAttribute(attrInfo.name, value);
  225. } else if (type == Atomic.VAR_COLOR && srcWidget) {
  226. var value = object.getAttribute(attrInfo.name);
  227. if (srcWidget.id == "1")
  228. value[0] = srcWidget.value;
  229. else if (srcWidget.id == "2")
  230. value[1] = srcWidget.value;
  231. else if (srcWidget.id == "3")
  232. value[2] = srcWidget.value;
  233. else if (srcWidget.id == "4")
  234. value[3] = srcWidget.value;
  235. object.setAttribute(attrInfo.name, value);
  236. }
  237. this.objectLocked = false;
  238. }
  239. handleWidgetEvent(ev: Atomic.UIWidgetEvent): boolean {
  240. if (this.objectLocked)
  241. return false;
  242. if (ev.type == Atomic.UI_EVENT_TYPE_CLICK) {
  243. var id = this.attrInfo.name + " enum popup";
  244. if (ev.target.id == id) {
  245. this.object.setAttribute(this.attrInfo.name, Number(ev.refid) - 1);
  246. this.setWidgetValueFromObject();
  247. }
  248. else if (this.widget == ev.target && this.attrInfo.enumNames.length) {
  249. if (this.enumSource) {
  250. var menu = new Atomic.UIMenuWindow(ev.target, id);
  251. menu.show(this.enumSource);
  252. }
  253. return true;
  254. }
  255. }
  256. if (ev.type == Atomic.UI_EVENT_TYPE_CHANGED) {
  257. if (this.widget == ev.target || this.widget.isAncestorOf(ev.target)) {
  258. this.setObjectValueFromWidget(ev.target);
  259. return true;
  260. }
  261. }
  262. return false;
  263. }
  264. object: Atomic.Serializable;
  265. objectLocked: boolean = true;
  266. widgetLocked: boolean = false;
  267. attrInfo: Atomic.AttributeInfo;
  268. widget: Atomic.UIWidget;
  269. enumSource: Atomic.UISelectItemSource;
  270. }
  271. export = DataBinding;