BsGUITextureField.cpp 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. #include "BsGUITextureField.h"
  2. #include "BsGUILayoutX.h"
  3. #include "BsGUILayoutY.h"
  4. #include "BsGUILabel.h"
  5. #include "BsGUIDropButton.h"
  6. #include "BsGUIButton.h"
  7. #include "BsGUIPanel.h"
  8. #include "BsResources.h"
  9. #include "BsProjectLibrary.h"
  10. #include "BsBuiltinEditorResources.h"
  11. #include "BsGUIResourceTreeView.h"
  12. #include "BsGUISpace.h"
  13. #include "BsProjectResourceMeta.h"
  14. #include "BsSpriteTexture.h"
  15. using namespace std::placeholders;
  16. namespace BansheeEngine
  17. {
  18. const UINT32 GUITextureField::DEFAULT_LABEL_WIDTH = 100;
  19. GUITextureField::GUITextureField(const PrivatelyConstruct& dummy, const GUIContent& labelContent, UINT32 labelWidth,
  20. const String& style, const GUIDimensions& dimensions, bool withLabel)
  21. :GUIElementContainer(dimensions, style), mLabel(nullptr), mClearButton(nullptr), mDropButton(nullptr)
  22. {
  23. mLayout = GUILayoutX::create();
  24. _registerChildElement(mLayout);
  25. if (withLabel)
  26. {
  27. mLabel = GUILabel::create(labelContent, GUIOptions(GUIOption::fixedWidth(labelWidth)), getSubStyleName(BuiltinEditorResources::TextureFieldLabelStyleName));
  28. mLayout->addElement(mLabel);
  29. }
  30. mDropButton = GUIDropButton::create((UINT32)DragAndDropType::Resources, GUIOptions(GUIOption::flexibleWidth()), getSubStyleName(BuiltinEditorResources::TextureFieldDropStyleName));
  31. mClearButton = GUIButton::create(HString(L""), getSubStyleName(BuiltinEditorResources::TextureFieldClearBtnStyleName));
  32. mClearButton->onClick.connect(std::bind(&GUITextureField::onClearButtonClicked, this));
  33. GUIPanel* dropTargetPanel = mLayout->addNewElement<GUIPanel>();
  34. dropTargetPanel->addElement(mDropButton);
  35. GUIPanel* closeBtnPanel = mLayout->addNewElement<GUIPanel>();
  36. GUILayoutY* closeBtnLayoutY = closeBtnPanel->addNewElement<GUILayoutY>();
  37. closeBtnLayoutY->addNewElement<GUIFixedSpace>(5);
  38. GUILayoutX* closeBtnLayoutX = closeBtnLayoutY->addNewElement<GUILayoutX>();
  39. closeBtnLayoutY->addNewElement<GUIFlexibleSpace>();
  40. closeBtnLayoutX->addNewElement<GUIFlexibleSpace>();
  41. closeBtnLayoutX->addElement(mClearButton);
  42. closeBtnLayoutX->addNewElement<GUIFixedSpace>(5);
  43. mDropButton->onDataDropped.connect(std::bind(&GUITextureField::dataDropped, this, _1));
  44. }
  45. GUITextureField::~GUITextureField()
  46. {
  47. }
  48. GUITextureField* GUITextureField::create(const GUIContent& labelContent, UINT32 labelWidth, const GUIOptions& options,
  49. const String& style)
  50. {
  51. const String* curStyle = &style;
  52. if (*curStyle == StringUtil::BLANK)
  53. curStyle = &BuiltinEditorResources::TextureFieldStyleName;
  54. return bs_new<GUITextureField>(PrivatelyConstruct(), labelContent, labelWidth, *curStyle,
  55. GUIDimensions::create(options), true);
  56. }
  57. GUITextureField* GUITextureField::create(const GUIContent& labelContent, const GUIOptions& options,
  58. const String& style)
  59. {
  60. const String* curStyle = &style;
  61. if (*curStyle == StringUtil::BLANK)
  62. curStyle = &BuiltinEditorResources::TextureFieldStyleName;
  63. return bs_new<GUITextureField>(PrivatelyConstruct(), labelContent, DEFAULT_LABEL_WIDTH, *curStyle,
  64. GUIDimensions::create(options), true);
  65. }
  66. GUITextureField* GUITextureField::create(const HString& labelText, UINT32 labelWidth, const GUIOptions& options,
  67. const String& style)
  68. {
  69. const String* curStyle = &style;
  70. if (*curStyle == StringUtil::BLANK)
  71. curStyle = &BuiltinEditorResources::TextureFieldStyleName;
  72. return bs_new<GUITextureField>(PrivatelyConstruct(), GUIContent(labelText), labelWidth, *curStyle,
  73. GUIDimensions::create(options), true);
  74. }
  75. GUITextureField* GUITextureField::create( const HString& labelText, const GUIOptions& options,
  76. const String& style)
  77. {
  78. const String* curStyle = &style;
  79. if (*curStyle == StringUtil::BLANK)
  80. curStyle = &BuiltinEditorResources::TextureFieldStyleName;
  81. return bs_new<GUITextureField>(PrivatelyConstruct(), GUIContent(labelText), DEFAULT_LABEL_WIDTH, *curStyle,
  82. GUIDimensions::create(options), true);
  83. }
  84. GUITextureField* GUITextureField::create(const GUIOptions& options, const String& style)
  85. {
  86. const String* curStyle = &style;
  87. if (*curStyle == StringUtil::BLANK)
  88. curStyle = &BuiltinEditorResources::TextureFieldStyleName;
  89. return bs_new<GUITextureField>(PrivatelyConstruct(), GUIContent(), 0, *curStyle,
  90. GUIDimensions::create(options), false);
  91. }
  92. GUITextureField* GUITextureField::create(const GUIContent& labelContent, UINT32 labelWidth,
  93. const String& style)
  94. {
  95. const String* curStyle = &style;
  96. if (*curStyle == StringUtil::BLANK)
  97. curStyle = &BuiltinEditorResources::TextureFieldStyleName;
  98. return bs_new<GUITextureField>(PrivatelyConstruct(), labelContent, labelWidth, *curStyle,
  99. GUIDimensions::create(), true);
  100. }
  101. GUITextureField* GUITextureField::create(const GUIContent& labelContent, const String& style)
  102. {
  103. const String* curStyle = &style;
  104. if (*curStyle == StringUtil::BLANK)
  105. curStyle = &BuiltinEditorResources::TextureFieldStyleName;
  106. return bs_new<GUITextureField>(PrivatelyConstruct(), labelContent, DEFAULT_LABEL_WIDTH, *curStyle,
  107. GUIDimensions::create(), true);
  108. }
  109. GUITextureField* GUITextureField::create(const HString& labelText, UINT32 labelWidth, const String& style)
  110. {
  111. const String* curStyle = &style;
  112. if (*curStyle == StringUtil::BLANK)
  113. curStyle = &BuiltinEditorResources::TextureFieldStyleName;
  114. return bs_new<GUITextureField>(PrivatelyConstruct(), GUIContent(labelText), labelWidth, *curStyle,
  115. GUIDimensions::create(), true);
  116. }
  117. GUITextureField* GUITextureField::create(const HString& labelText, const String& style)
  118. {
  119. const String* curStyle = &style;
  120. if (*curStyle == StringUtil::BLANK)
  121. curStyle = &BuiltinEditorResources::TextureFieldStyleName;
  122. return bs_new<GUITextureField>(PrivatelyConstruct(), GUIContent(labelText), DEFAULT_LABEL_WIDTH, *curStyle,
  123. GUIDimensions::create(), true);
  124. }
  125. GUITextureField* GUITextureField::create(const String& style)
  126. {
  127. const String* curStyle = &style;
  128. if (*curStyle == StringUtil::BLANK)
  129. curStyle = &BuiltinEditorResources::TextureFieldStyleName;
  130. return bs_new<GUITextureField>(PrivatelyConstruct(), GUIContent(), 0, *curStyle, GUIDimensions::create(), false);
  131. }
  132. HTexture GUITextureField::getValue() const
  133. {
  134. return static_resource_cast<Texture>(Resources::instance().loadFromUUID(mUUID));
  135. }
  136. void GUITextureField::setValue(const HTexture& value)
  137. {
  138. if (value)
  139. setUUID(value.getUUID());
  140. else
  141. setUUID("");
  142. }
  143. void GUITextureField::setUUID(const String& uuid)
  144. {
  145. mUUID = uuid;
  146. HTexture texture;
  147. Path filePath;
  148. if (Resources::instance().getFilePathFromUUID(mUUID, filePath))
  149. texture = Resources::instance().load<Texture>(filePath);
  150. if (texture != nullptr)
  151. {
  152. HSpriteTexture sprite = SpriteTexture::create(texture);
  153. mDropButton->setContent(GUIContent(sprite));
  154. mClearButton->enableRecursively();
  155. }
  156. else
  157. {
  158. mDropButton->setContent(GUIContent(HString(L"(None)")));
  159. mClearButton->disableRecursively();
  160. }
  161. onValueChanged(mUUID);
  162. }
  163. void GUITextureField::setTint(const Color& color)
  164. {
  165. if (mLabel != nullptr)
  166. mLabel->setTint(color);
  167. mDropButton->setTint(color);
  168. mClearButton->setTint(color);
  169. }
  170. void GUITextureField::_updateLayoutInternal(const GUILayoutData& data)
  171. {
  172. mLayout->_setLayoutData(data);
  173. mLayout->_updateLayoutInternal(data);
  174. }
  175. Vector2I GUITextureField::_getOptimalSize() const
  176. {
  177. return mLayout->_getOptimalSize();
  178. }
  179. void GUITextureField::dataDropped(void* data)
  180. {
  181. DraggedResources* draggedResources = reinterpret_cast<DraggedResources*>(data);
  182. UINT32 numResources = (UINT32)draggedResources->resourcePaths.size();
  183. if (numResources <= 0)
  184. return;
  185. for (UINT32 i = 0; i < numResources; i++)
  186. {
  187. Path path = draggedResources->resourcePaths[i];
  188. String uuid;
  189. if (!gResources().getUUIDFromFilePath(draggedResources->resourcePaths[i], uuid))
  190. continue;
  191. ProjectResourceMetaPtr meta = ProjectLibrary::instance().findResourceMeta(uuid);
  192. if (meta == nullptr || meta->getTypeId() != TID_Texture)
  193. continue;
  194. setUUID(uuid);
  195. break;
  196. }
  197. }
  198. void GUITextureField::styleUpdated()
  199. {
  200. if (mLabel != nullptr)
  201. mLabel->setStyle(getSubStyleName(BuiltinEditorResources::TextureFieldLabelStyleName));
  202. mDropButton->setStyle(getSubStyleName(BuiltinEditorResources::TextureFieldDropStyleName));
  203. mClearButton->setStyle(getSubStyleName(BuiltinEditorResources::TextureFieldClearBtnStyleName));
  204. }
  205. void GUITextureField::onClearButtonClicked()
  206. {
  207. setValue(HTexture());
  208. }
  209. const String& GUITextureField::getGUITypeName()
  210. {
  211. return BuiltinEditorResources::TextureFieldStyleName;
  212. }
  213. }