UIInspectorDataBinding.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364
  1. #include <TurboBadger/tb_widgets_common.h>
  2. #include <TurboBadger/tb_menu_window.h>
  3. #include <TurboBadger/tb_inline_select.h>
  4. #include "AtomicEditor.h"
  5. #include <Atomic/Core/StringUtils.h>
  6. #include "UIInspectorDataBinding.h"
  7. namespace AtomicEditor
  8. {
  9. void InspectorDataBinding::SetObjectValueFromWidget(TBWidget *srcWidget)
  10. {
  11. if (objectLocked_)
  12. return;
  13. objectLocked_ = true;
  14. VariantType type = attrInfo_->type_;
  15. if (type == VAR_BOOL)
  16. {
  17. TBCheckBox* box = (TBCheckBox *) widget_;
  18. Variant v(box->GetValue() ? true : false);
  19. object_->SetAttribute(attrInfo_->name_, v);
  20. }
  21. else if (type == VAR_INT)
  22. {
  23. TBEditField* field = (TBEditField*) widget_;
  24. Variant v(ToInt(field->GetText().CStr()));
  25. object_->SetAttribute(attrInfo_->name_, v);
  26. }
  27. else if (type == VAR_FLOAT)
  28. {
  29. TBEditField* field = (TBEditField*) widget_;
  30. Variant v(ToFloat(field->GetText().CStr()));
  31. object_->SetAttribute(attrInfo_->name_, v);
  32. }
  33. else if (type == VAR_STRING)
  34. {
  35. TBEditField* field = (TBEditField*) widget_;
  36. Variant v(String(field->GetText().CStr()));
  37. object_->SetAttribute(attrInfo_->name_, v);
  38. }
  39. else if (type == VAR_COLOR && srcWidget)
  40. {
  41. Color value = object_->GetAttribute(attrInfo_->name_).GetColor();
  42. TBInlineSelect* select = NULL;
  43. if (srcWidget->GetID() == TBID(unsigned(1)))
  44. {
  45. select = (TBInlineSelect*) srcWidget;
  46. value.r_ = (float ) select->GetValueDouble();
  47. }
  48. else if (srcWidget->GetID() == TBID(unsigned(2)))
  49. {
  50. select = (TBInlineSelect*) srcWidget;
  51. value.g_ = (float ) select->GetValueDouble();
  52. }
  53. else if (srcWidget->GetID() == TBID(unsigned(3)))
  54. {
  55. select = (TBInlineSelect*) srcWidget;
  56. value.b_ = (float ) select->GetValueDouble();
  57. }
  58. else if (srcWidget->GetID() == TBID(unsigned(4)))
  59. {
  60. select = (TBInlineSelect*) srcWidget;
  61. value.a_ = (float ) select->GetValueDouble();
  62. }
  63. object_->SetAttribute(attrInfo_->name_, value);
  64. }
  65. else if (type == VAR_VECTOR3 && srcWidget)
  66. {
  67. Vector3 value = object_->GetAttribute(attrInfo_->name_).GetVector3();
  68. if (srcWidget->GetID() == TBID(unsigned(1)))
  69. value.x_ = srcWidget->GetValueDouble();
  70. else if (srcWidget->GetID() == TBID(unsigned(2)))
  71. value.y_ = srcWidget->GetValueDouble();
  72. else if (srcWidget->GetID() == TBID(unsigned(3)))
  73. value.z_ = srcWidget->GetValueDouble();
  74. object_->SetAttribute(attrInfo_->name_, value);
  75. }
  76. else if (type == VAR_QUATERNION && srcWidget)
  77. {
  78. Quaternion q = object_->GetAttribute(attrInfo_->name_).GetQuaternion();
  79. Vector3 value = q.EulerAngles();
  80. if (srcWidget->GetID() == TBID(unsigned(1)))
  81. value.x_ = srcWidget->GetValueDouble();
  82. else if (srcWidget->GetID() == TBID(unsigned(2)))
  83. value.y_ = srcWidget->GetValueDouble();
  84. else if (srcWidget->GetID() == TBID(unsigned(3)))
  85. value.z_ = srcWidget->GetValueDouble();
  86. q.FromEulerAngles(value.x_, value.y_, value.z_);
  87. object_->SetAttribute(attrInfo_->name_, q);
  88. }
  89. // refresh widget
  90. //SetWidgetValueFromObject();
  91. objectLocked_ = false;
  92. }
  93. void InspectorDataBinding::SetWidgetValueFromObject()
  94. {
  95. if (widgetLocked_)
  96. return;
  97. widgetLocked_ = true;
  98. if (attrInfo_->type_ == VAR_BOOL)
  99. {
  100. bool value = object_->GetAttribute(attrInfo_->name_).GetBool();
  101. widget_->SetValue(value ? 1 : 0);
  102. }
  103. else if (attrInfo_->type_ == VAR_VECTOR3)
  104. {
  105. Vector3 value = object_->GetAttribute(attrInfo_->name_).GetVector3();
  106. TBInlineSelect* select = widget_->GetWidgetByIDAndType<TBInlineSelect>(TBID(unsigned(1)));
  107. if (select)
  108. select->SetValueDouble(value.x_);
  109. select = widget_->GetWidgetByIDAndType<TBInlineSelect>(TBID(unsigned(2)));
  110. if (select)
  111. select->SetValueDouble(value.y_);
  112. select = widget_->GetWidgetByIDAndType<TBInlineSelect>(TBID(unsigned(3)));
  113. if (select)
  114. select->SetValueDouble(value.z_);
  115. }
  116. else if (attrInfo_->type_ == VAR_QUATERNION)
  117. {
  118. Vector3 value = object_->GetAttribute(attrInfo_->name_).GetQuaternion().EulerAngles();
  119. TBInlineSelect* select = widget_->GetWidgetByIDAndType<TBInlineSelect>(TBID(unsigned(1)));
  120. if (select)
  121. select->SetValueDouble(value.x_);
  122. select = widget_->GetWidgetByIDAndType<TBInlineSelect>(TBID(unsigned(2)));
  123. if (select)
  124. select->SetValueDouble(value.y_);
  125. select = widget_->GetWidgetByIDAndType<TBInlineSelect>(TBID(unsigned(3)));
  126. if (select)
  127. select->SetValueDouble(value.z_);
  128. }
  129. else if (attrInfo_->type_ == VAR_STRING)
  130. {
  131. String value = object_->GetAttribute(attrInfo_->name_).GetString();
  132. widget_->SetText(value.CString());
  133. }
  134. else if (attrInfo_->type_ == VAR_FLOAT)
  135. {
  136. float value = object_->GetAttribute(attrInfo_->name_).GetFloat();
  137. widget_->SetText(ToString("%f", value).CString());
  138. }
  139. else if (attrInfo_->type_ == VAR_INT)
  140. {
  141. int value = object_->GetAttribute(attrInfo_->name_).GetInt();
  142. if (attrInfo_->enumNames_)
  143. {
  144. widget_->SetText(attrInfo_->enumNames_[value]);
  145. }
  146. else
  147. {
  148. widget_->SetText(ToString("%i", value).CString());
  149. }
  150. }
  151. else if (attrInfo_->type_ == VAR_COLOR)
  152. {
  153. Color value = object_->GetAttribute(attrInfo_->name_).GetColor();
  154. TBInlineSelect* select = widget_->GetWidgetByIDAndType<TBInlineSelect>(TBID(unsigned(1)));
  155. if (select)
  156. select->SetValueDouble(value.r_);
  157. select = widget_->GetWidgetByIDAndType<TBInlineSelect>(TBID(unsigned(2)));
  158. if (select)
  159. select->SetValueDouble(value.g_);
  160. select = widget_->GetWidgetByIDAndType<TBInlineSelect>(TBID(unsigned(3)));
  161. if (select)
  162. select->SetValue(value.b_);
  163. select = widget_->GetWidgetByIDAndType<TBInlineSelect>(TBID(unsigned(4)));
  164. if (select)
  165. select->SetValueDouble(value.a_);
  166. }
  167. widgetLocked_ = false;
  168. }
  169. bool InspectorDataBinding::OnEvent(const TBWidgetEvent &ev)
  170. {
  171. if (ev.type == EVENT_TYPE_CLICK)
  172. {
  173. if (objectLocked_)
  174. return false;
  175. String id = attrInfo_->name_;
  176. id += " enum popup";
  177. if (ev.target->GetID() == TBIDC(id.CString()))
  178. {
  179. Variant value(int(ev.ref_id-1));
  180. object_->SetAttribute(attrInfo_->name_, value);
  181. SetWidgetValueFromObject();
  182. }
  183. else if (widget_ == ev.target && attrInfo_->enumNames_)
  184. {
  185. TBMenuWindow *menu = new TBMenuWindow(ev.target, TBIDC(id.CString()));
  186. TBGenericStringItemSource* source = menu->GetList()->GetDefaultSource();
  187. const char** enumPtr = attrInfo_->enumNames_;
  188. unsigned v = 1;
  189. while (*enumPtr)
  190. {
  191. source->AddItem(new TBGenericStringItem(*enumPtr, TBID(v++)));
  192. enumPtr++;
  193. }
  194. menu->Show(source, TBPopupAlignment());
  195. }
  196. else if (widget_ == ev.target || widget_->IsAncestorOf(ev.target))
  197. {
  198. SetObjectValueFromWidget(ev.target);
  199. }
  200. }
  201. if (ev.type == EVENT_TYPE_CHANGED)
  202. {
  203. if (objectLocked_)
  204. return false;
  205. if (widget_ == ev.target || widget_->IsAncestorOf(ev.target))
  206. {
  207. SetObjectValueFromWidget(ev.target);
  208. }
  209. }
  210. return false;
  211. }
  212. InspectorDataBinding* InspectorDataBinding::Create(Serializable* object, const AttributeInfo* attrInfo)
  213. {
  214. if (attrInfo->mode_ & AM_NOEDIT)
  215. return NULL;
  216. TBWidget* widget = NULL;
  217. InspectorDataBinding* binding = NULL;
  218. TBFontDescription fd;
  219. fd.SetID(TBIDC("Vera"));
  220. fd.SetSize(11);
  221. if (attrInfo->type_ == VAR_BOOL)
  222. {
  223. TBCheckBox* box = new TBCheckBox();
  224. box->SetSkinBg(TBIDC("TBGreyCheckBox"));
  225. widget = box;
  226. }
  227. else if (attrInfo->type_ == VAR_STRING)
  228. {
  229. TBEditField* field = new TBEditField();
  230. field->SetTextAlign(TB_TEXT_ALIGN_LEFT);
  231. field->SetSkinBg(TBIDC("TBAttrEditorField"));
  232. field->SetFontDescription(fd);
  233. LayoutParams lp;
  234. lp.SetWidth(140);
  235. field->SetLayoutParams(lp);
  236. widget = field;
  237. }
  238. else if (attrInfo->type_ == VAR_FLOAT)
  239. {
  240. TBEditField* field = new TBEditField();
  241. field->SetTextAlign(TB_TEXT_ALIGN_CENTER);
  242. field->SetSkinBg(TBIDC("TBAttrEditorField"));
  243. field->SetFontDescription(fd);
  244. widget = field;
  245. }
  246. else if (attrInfo->type_ == VAR_COLOR)
  247. {
  248. TBLayout* layout = new TBLayout();
  249. widget = layout;
  250. layout->SetSpacing(0);
  251. LayoutParams lp;
  252. lp.SetWidth(70);
  253. for (unsigned i = 0; i < 4; i++)
  254. {
  255. TBInlineSelect* select = new TBInlineSelect();
  256. select->SetID(TBID(i + 1));
  257. select->SetFontDescription(fd);
  258. select->SetLimits(-10000000, 10000000);
  259. select->SetLayoutParams(lp);
  260. layout->AddChild(select);
  261. }
  262. }
  263. else if (attrInfo->type_ == VAR_INT)
  264. {
  265. if (attrInfo->enumNames_)
  266. {
  267. TBButton* field = new TBButton();
  268. field->SetFontDescription(fd);
  269. widget = field;
  270. }
  271. else
  272. {
  273. TBEditField* field = new TBEditField();
  274. field->SetTextAlign(TB_TEXT_ALIGN_CENTER);
  275. field->SetFontDescription(fd);
  276. field->SetSkinBg(TBIDC("TBAttrEditorField"));
  277. widget = field;
  278. }
  279. }
  280. else if (attrInfo->type_ == VAR_VECTOR3 || attrInfo->type_ == VAR_QUATERNION)
  281. {
  282. TBLayout* layout = new TBLayout();
  283. widget = layout;
  284. layout->SetSpacing(0);
  285. LayoutParams lp;
  286. lp.SetWidth(100);
  287. for (unsigned i = 0; i < 3; i++)
  288. {
  289. TBInlineSelect* select = new TBInlineSelect();
  290. select->SetID(TBID(i + 1));
  291. select->SetFontDescription(fd);
  292. select->SetSkinBg(TBIDC("InspectorTextAttrName"));
  293. select->SetLimits(-10000000, 10000000);
  294. LayoutParams editlp;
  295. editlp.min_w = 60;
  296. select->SetEditFieldLayoutParams(editlp);
  297. select->SetLayoutParams(lp);
  298. layout->AddChild(select);
  299. }
  300. }
  301. if (widget)
  302. {
  303. binding = new InspectorDataBinding();
  304. binding->object_ = object;
  305. binding->widget_ = widget;
  306. binding->attrInfo_ = attrInfo;
  307. }
  308. return binding;
  309. }
  310. }