BsGUITextureField.cpp 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  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. mDropButton->setContent(GUIContent(HString("(None)")));
  59. mClearButton->setVisible(false);
  60. }
  61. GUITextureField* GUITextureField::create(GUITextureFieldType type, const GUIFieldOptions& options)
  62. {
  63. const String* curStyle = &options.style;
  64. if (*curStyle == StringUtil::BLANK)
  65. curStyle = &BuiltinEditorResources::TextureFieldStyleName;
  66. return bs_new<GUITextureField>(PrivatelyConstruct(), type, options.labelContent,
  67. options.labelWidth, *curStyle, GUIDimensions::create(options.options), options.labelWidth > 0);
  68. }
  69. GUITextureField* GUITextureField::create(const GUIFieldOptions& options)
  70. {
  71. const String* curStyle = &options.style;
  72. if (*curStyle == StringUtil::BLANK)
  73. curStyle = &BuiltinEditorResources::TextureFieldStyleName;
  74. return bs_new<GUITextureField>(PrivatelyConstruct(), GUITextureFieldType::Texture, options.labelContent,
  75. options.labelWidth, *curStyle, GUIDimensions::create(options.options), options.labelWidth > 0);
  76. }
  77. HTexture GUITextureField::getTexture() const
  78. {
  79. HResource resource = gResources()._getResourceHandle(mUUID);
  80. if(resource.isLoaded(false))
  81. {
  82. if (rtti_is_of_type<Texture>(resource.get()))
  83. return static_resource_cast<Texture>(resource);
  84. }
  85. return HTexture();
  86. }
  87. void GUITextureField::setTexture(const HTexture& value)
  88. {
  89. if (value)
  90. setUUID(value.getUUID(), false);
  91. else
  92. setUUID(UUID::EMPTY, false);
  93. }
  94. HSpriteTexture GUITextureField::getSpriteTexture() const
  95. {
  96. HResource resource = gResources()._getResourceHandle(mUUID);
  97. if(resource.isLoaded(false))
  98. {
  99. if (rtti_is_of_type<SpriteTexture>(resource.get()))
  100. return static_resource_cast<SpriteTexture>(resource);
  101. }
  102. return HSpriteTexture();
  103. }
  104. void GUITextureField::setSpriteTexture(const HSpriteTexture& value)
  105. {
  106. if (value)
  107. setUUID(value.getUUID(), false);
  108. else
  109. setUUID(UUID::EMPTY, false);
  110. }
  111. HResource GUITextureField::getValue() const
  112. {
  113. return gResources()._getResourceHandle(mUUID);
  114. }
  115. void GUITextureField::setValue(const HResource& value)
  116. {
  117. if (value)
  118. {
  119. if (rtti_is_of_type<SpriteTexture>(value.get()) || rtti_is_of_type<Texture>(value.get()))
  120. setUUID(value.getUUID(), false);
  121. else
  122. setUUID(UUID::EMPTY, false);
  123. }
  124. else
  125. setUUID(UUID::EMPTY, false);
  126. }
  127. void GUITextureField::setUUID(const UUID& uuid, bool triggerEvent)
  128. {
  129. if (mUUID == uuid)
  130. return;
  131. mUUID = uuid;
  132. HSpriteTexture previewIcon;
  133. Path filePath = gProjectLibrary().uuidToPath(mUUID);
  134. if (!filePath.isEmpty())
  135. {
  136. SPtr<ProjectResourceMeta> meta = gProjectLibrary().findResourceMeta(filePath);
  137. if(meta && meta->getPreviewIcons().icon128.isLoaded())
  138. previewIcon = SpriteTexture::create(meta->getPreviewIcons().icon128);
  139. else
  140. {
  141. // Not ideal. No cached texture so fall back on loading the original asset
  142. HResource resource = gProjectLibrary().load(filePath);
  143. if(resource.isLoaded(false))
  144. {
  145. if (rtti_is_of_type<SpriteTexture>(resource.get()))
  146. previewIcon = static_resource_cast<SpriteTexture>(resource);
  147. else if (rtti_is_of_type<Texture>(resource.get()))
  148. previewIcon = SpriteTexture::create(static_resource_cast<Texture>(resource));
  149. }
  150. }
  151. }
  152. if (previewIcon != nullptr)
  153. {
  154. mDropButton->setContent(GUIContent(previewIcon));
  155. mClearButton->setVisible(true);
  156. }
  157. else
  158. {
  159. mDropButton->setContent(GUIContent(HString("(None)")));
  160. mClearButton->setVisible(false);
  161. }
  162. if (triggerEvent)
  163. onValueChanged(gResources()._getResourceHandle(mUUID));
  164. }
  165. void GUITextureField::setTint(const Color& color)
  166. {
  167. if (mLabel != nullptr)
  168. mLabel->setTint(color);
  169. mDropButton->setTint(color);
  170. mClearButton->setTint(color);
  171. }
  172. void GUITextureField::_updateLayoutInternal(const GUILayoutData& data)
  173. {
  174. mLayout->_setLayoutData(data);
  175. mLayout->_updateLayoutInternal(data);
  176. }
  177. Vector2I GUITextureField::_getOptimalSize() const
  178. {
  179. return mLayout->_getOptimalSize();
  180. }
  181. void GUITextureField::onDropButtonClicked()
  182. {
  183. if (mUUID.empty())
  184. return;
  185. Path resPath = gProjectLibrary().uuidToPath(mUUID);
  186. resPath = resPath.getRelative(gProjectLibrary().getResourcesFolder());
  187. Selection::instance().ping(resPath);
  188. }
  189. void GUITextureField::dataDropped(void* data)
  190. {
  191. DraggedResources* draggedResources = reinterpret_cast<DraggedResources*>(data);
  192. UINT32 numResources = (UINT32)draggedResources->resourcePaths.size();
  193. if (numResources <= 0)
  194. return;
  195. for (UINT32 i = 0; i < numResources; i++)
  196. {
  197. Path path = draggedResources->resourcePaths[i];
  198. SPtr<ProjectResourceMeta> meta = gProjectLibrary().findResourceMeta(draggedResources->resourcePaths[i]);
  199. if (meta == nullptr || (meta->getTypeID() != TID_Texture && meta->getTypeID() != TID_SpriteTexture))
  200. continue;
  201. setUUID(meta->getUUID());
  202. break;
  203. }
  204. }
  205. void GUITextureField::styleUpdated()
  206. {
  207. if (mLabel != nullptr)
  208. mLabel->setStyle(getSubStyleName(BuiltinEditorResources::TextureFieldLabelStyleName));
  209. mDropButton->setStyle(getSubStyleName(BuiltinEditorResources::TextureFieldDropStyleName));
  210. mClearButton->setStyle(getSubStyleName(BuiltinEditorResources::TextureFieldClearBtnStyleName));
  211. }
  212. void GUITextureField::onClearButtonClicked()
  213. {
  214. setUUID(UUID::EMPTY);
  215. }
  216. const String& GUITextureField::getGUITypeName()
  217. {
  218. return BuiltinEditorResources::TextureFieldStyleName;
  219. }
  220. }