BsGUITextureField.cpp 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "BsGUITextureField.h"
  4. #include "GUI/BsGUILayoutX.h"
  5. #include "GUI/BsGUILayoutY.h"
  6. #include "GUI/BsGUILabel.h"
  7. #include "GUI/BsGUIDropButton.h"
  8. #include "GUI/BsGUIButton.h"
  9. #include "GUI/BsGUIPanel.h"
  10. #include "Resources/BsResources.h"
  11. #include "Image/BsTexture.h"
  12. #include "Image/BsSpriteTexture.h"
  13. #include "Library/BsProjectLibrary.h"
  14. #include "Utility/BsBuiltinEditorResources.h"
  15. #include "GUI/BsGUIResourceTreeView.h"
  16. #include "GUI/BsGUISpace.h"
  17. #include "Library/BsProjectResourceMeta.h"
  18. #include "Scene/BsSelection.h"
  19. #include "Reflection/BsRTTIType.h"
  20. using namespace std::placeholders;
  21. namespace bs
  22. {
  23. const UINT32 GUITextureField::DEFAULT_LABEL_WIDTH = 100;
  24. GUITextureField::GUITextureField(const PrivatelyConstruct& dummy, GUITextureFieldType, const GUIContent& labelContent,
  25. UINT32 labelWidth, const String& style, const GUIDimensions& dimensions, bool withLabel)
  26. :GUIElementContainer(dimensions, style), mLabel(nullptr), mDropButton(nullptr), mClearButton(nullptr)
  27. {
  28. mLayout = GUILayoutX::create();
  29. _registerChildElement(mLayout);
  30. if (withLabel)
  31. {
  32. mLabel = GUILabel::create(labelContent, GUIOptions(GUIOption::fixedWidth(labelWidth)),
  33. getSubStyleName(BuiltinEditorResources::TextureFieldLabelStyleName));
  34. mLayout->addElement(mLabel);
  35. }
  36. mDropButton = GUIDropButton::create((UINT32)DragAndDropType::Resources,
  37. getSubStyleName(BuiltinEditorResources::TextureFieldDropStyleName));
  38. mClearButton = GUIButton::create(HString(""),
  39. getSubStyleName(BuiltinEditorResources::TextureFieldClearBtnStyleName));
  40. mClearButton->onClick.connect(std::bind(&GUITextureField::onClearButtonClicked, this));
  41. GUIElementOptions clearBtnOptions = mClearButton->getOptionFlags();
  42. clearBtnOptions.unset(GUIElementOption::AcceptsKeyFocus);
  43. mClearButton->setOptionFlags(clearBtnOptions);
  44. GUIPanel* dropTargetPanel = mLayout->addNewElement<GUIPanel>();
  45. dropTargetPanel->addElement(mDropButton);
  46. GUIPanel* closeBtnPanel = dropTargetPanel->addNewElement<GUIPanel>(-1);
  47. GUILayoutY* closeBtnLayoutY = closeBtnPanel->addNewElement<GUILayoutY>();
  48. closeBtnLayoutY->addNewElement<GUIFixedSpace>(5);
  49. GUILayoutX* closeBtnLayoutX = closeBtnLayoutY->addNewElement<GUILayoutX>();
  50. closeBtnLayoutY->addNewElement<GUIFlexibleSpace>();
  51. closeBtnLayoutX->addNewElement<GUIFlexibleSpace>();
  52. closeBtnLayoutX->addElement(mClearButton);
  53. closeBtnLayoutX->addNewElement<GUIFixedSpace>(5);
  54. if (withLabel)
  55. mLayout->addNewElement<GUIFlexibleSpace>();
  56. mDropButton->onDataDropped.connect(std::bind(&GUITextureField::dataDropped, this, _1));
  57. mDropButton->onClick.connect(std::bind(&GUITextureField::onDropButtonClicked, this));
  58. }
  59. GUITextureField* GUITextureField::create(GUITextureFieldType type, const GUIFieldOptions& options)
  60. {
  61. const String* curStyle = &options.style;
  62. if (*curStyle == StringUtil::BLANK)
  63. curStyle = &BuiltinEditorResources::TextureFieldStyleName;
  64. return bs_new<GUITextureField>(PrivatelyConstruct(), type, options.labelContent,
  65. options.labelWidth, *curStyle, GUIDimensions::create(options.options), options.labelWidth > 0);
  66. }
  67. GUITextureField* GUITextureField::create(const GUIFieldOptions& options)
  68. {
  69. const String* curStyle = &options.style;
  70. if (*curStyle == StringUtil::BLANK)
  71. curStyle = &BuiltinEditorResources::TextureFieldStyleName;
  72. return bs_new<GUITextureField>(PrivatelyConstruct(), GUITextureFieldType::Texture, options.labelContent,
  73. options.labelWidth, *curStyle, GUIDimensions::create(options.options), options.labelWidth > 0);
  74. }
  75. HTexture GUITextureField::getTexture() const
  76. {
  77. HResource resource = gResources()._getResourceHandle(mUUID);
  78. if(resource.isLoaded(false))
  79. {
  80. if (rtti_is_of_type<Texture>(resource.get()))
  81. return static_resource_cast<Texture>(resource);
  82. }
  83. return HTexture();
  84. }
  85. void GUITextureField::setTexture(const HTexture& value)
  86. {
  87. if (value)
  88. setUUID(value.getUUID(), false);
  89. else
  90. setUUID(UUID::EMPTY, false);
  91. }
  92. HSpriteTexture GUITextureField::getSpriteTexture() const
  93. {
  94. HResource resource = gResources()._getResourceHandle(mUUID);
  95. if(resource.isLoaded(false))
  96. {
  97. if (rtti_is_of_type<SpriteTexture>(resource.get()))
  98. return static_resource_cast<SpriteTexture>(resource);
  99. }
  100. return HSpriteTexture();
  101. }
  102. void GUITextureField::setSpriteTexture(const HSpriteTexture& value)
  103. {
  104. if (value)
  105. setUUID(value.getUUID(), false);
  106. else
  107. setUUID(UUID::EMPTY, false);
  108. }
  109. HResource GUITextureField::getValue() const
  110. {
  111. return gResources()._getResourceHandle(mUUID);
  112. }
  113. void GUITextureField::setValue(const HResource& value)
  114. {
  115. if (value)
  116. {
  117. if (rtti_is_of_type<SpriteTexture>(value.get()) || rtti_is_of_type<Texture>(value.get()))
  118. setUUID(value.getUUID(), false);
  119. else
  120. setUUID(UUID::EMPTY, false);
  121. }
  122. else
  123. setUUID(UUID::EMPTY, false);
  124. }
  125. void GUITextureField::setUUID(const UUID& uuid, bool triggerEvent)
  126. {
  127. if (mUUID == uuid)
  128. return;
  129. mUUID = uuid;
  130. HSpriteTexture previewIcon;
  131. Path filePath = gProjectLibrary().uuidToPath(mUUID);
  132. if (!filePath.isEmpty())
  133. {
  134. SPtr<ProjectResourceMeta> meta = gProjectLibrary().findResourceMeta(filePath);
  135. if(meta)
  136. previewIcon = SpriteTexture::create(meta->getPreviewIcons().icon128);
  137. else
  138. {
  139. // Not ideal. No cached texture so fall back on loading the original asset
  140. HResource resource = gResources().load(filePath);
  141. if(resource.isLoaded(false))
  142. {
  143. if (rtti_is_of_type<SpriteTexture>(resource.get()))
  144. previewIcon = static_resource_cast<SpriteTexture>(resource);
  145. else if (rtti_is_of_type<Texture>(resource.get()))
  146. previewIcon = SpriteTexture::create(static_resource_cast<Texture>(resource));
  147. }
  148. }
  149. }
  150. if (previewIcon != nullptr)
  151. {
  152. mDropButton->setContent(GUIContent(previewIcon));
  153. mClearButton->setVisible(true);
  154. }
  155. else
  156. {
  157. mDropButton->setContent(GUIContent(HString("(None)")));
  158. mClearButton->setVisible(false);
  159. }
  160. if (triggerEvent)
  161. onValueChanged(gResources()._getResourceHandle(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::onDropButtonClicked()
  180. {
  181. if (mUUID.empty())
  182. return;
  183. Path resPath = gProjectLibrary().uuidToPath(mUUID);
  184. resPath = resPath.getRelative(gProjectLibrary().getResourcesFolder());
  185. Selection::instance().ping(resPath);
  186. }
  187. void GUITextureField::dataDropped(void* data)
  188. {
  189. DraggedResources* draggedResources = reinterpret_cast<DraggedResources*>(data);
  190. UINT32 numResources = (UINT32)draggedResources->resourcePaths.size();
  191. if (numResources <= 0)
  192. return;
  193. for (UINT32 i = 0; i < numResources; i++)
  194. {
  195. Path path = draggedResources->resourcePaths[i];
  196. SPtr<ProjectResourceMeta> meta = gProjectLibrary().findResourceMeta(draggedResources->resourcePaths[i]);
  197. if (meta == nullptr || meta->getTypeID() != TID_Texture)
  198. continue;
  199. setUUID(meta->getUUID());
  200. break;
  201. }
  202. }
  203. void GUITextureField::styleUpdated()
  204. {
  205. if (mLabel != nullptr)
  206. mLabel->setStyle(getSubStyleName(BuiltinEditorResources::TextureFieldLabelStyleName));
  207. mDropButton->setStyle(getSubStyleName(BuiltinEditorResources::TextureFieldDropStyleName));
  208. mClearButton->setStyle(getSubStyleName(BuiltinEditorResources::TextureFieldClearBtnStyleName));
  209. }
  210. void GUITextureField::onClearButtonClicked()
  211. {
  212. setUUID(UUID::EMPTY);
  213. }
  214. const String& GUITextureField::getGUITypeName()
  215. {
  216. return BuiltinEditorResources::TextureFieldStyleName;
  217. }
  218. }