BsGUILabel.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. #include "BsGUILabel.h"
  2. #include "BsGUIElementStyle.h"
  3. #include "BsTextSprite.h"
  4. #include "BsGUISkin.h"
  5. #include "BsGUIWidget.h"
  6. #include "BsGUILayoutOptions.h"
  7. #include "BsGUIHelper.h"
  8. #include "BsTextData.h"
  9. namespace BansheeEngine
  10. {
  11. GUILabel::GUILabel(const String& styleName, const GUIContent& content, const GUILayoutOptions& layoutOptions)
  12. :GUIElement(styleName, layoutOptions), mContent(content)
  13. {
  14. mTextSprite = bs_new<TextSprite, PoolAlloc>();
  15. mLocStringUpdatedConn = mContent.getText().addOnStringModifiedCallback(std::bind(&GUILabel::markContentAsDirty, this));
  16. }
  17. GUILabel::~GUILabel()
  18. {
  19. mLocStringUpdatedConn.disconnect();
  20. bs_delete<PoolAlloc>(mTextSprite);
  21. }
  22. UINT32 GUILabel::_getNumRenderElements() const
  23. {
  24. return mTextSprite->getNumRenderElements();
  25. }
  26. const GUIMaterialInfo& GUILabel::_getMaterial(UINT32 renderElementIdx) const
  27. {
  28. return mTextSprite->getMaterial(renderElementIdx);
  29. }
  30. UINT32 GUILabel::_getNumQuads(UINT32 renderElementIdx) const
  31. {
  32. return mTextSprite->getNumQuads(renderElementIdx);
  33. }
  34. void GUILabel::updateRenderElementsInternal()
  35. {
  36. mDesc.font = _getStyle()->font;
  37. mDesc.fontSize = _getStyle()->fontSize;
  38. mDesc.wordWrap = _getStyle()->wordWrap;
  39. mDesc.horzAlign = _getStyle()->textHorzAlign;
  40. mDesc.vertAlign = _getStyle()->textVertAlign;
  41. mDesc.width = mWidth;
  42. mDesc.height = mHeight;
  43. mDesc.text = mContent.getText();
  44. mDesc.color = mColor * _getStyle()->normal.textColor;;
  45. mTextSprite->update(mDesc, (UINT64)_getParentWidget());
  46. GUIElement::updateRenderElementsInternal();
  47. }
  48. void GUILabel::updateClippedBounds()
  49. {
  50. mClippedBounds = mTextSprite->getBounds(mOffset, mClipRect);
  51. }
  52. Vector2I GUILabel::_getOptimalSize() const
  53. {
  54. return GUIHelper::calcOptimalContentsSize(mContent, *_getStyle(), _getLayoutOptions());
  55. }
  56. void GUILabel::_fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad, UINT32 maxNumQuads,
  57. UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx) const
  58. {
  59. mTextSprite->fillBuffer(vertices, uv, indices, startingQuad, maxNumQuads, vertexStride, indexStride, renderElementIdx, mOffset, mClipRect);
  60. }
  61. void GUILabel::setContent(const GUIContent& content)
  62. {
  63. mLocStringUpdatedConn.disconnect();
  64. mLocStringUpdatedConn = content.getText().addOnStringModifiedCallback(std::bind(&GUILabel::markContentAsDirty, this));
  65. mContent = content;
  66. markContentAsDirty();
  67. }
  68. void GUILabel::setTint(const Color& color)
  69. {
  70. mColor = color;
  71. markContentAsDirty();
  72. }
  73. GUILabel* GUILabel::create(const HString& text, const String& styleName)
  74. {
  75. return create(GUIContent(text), styleName);
  76. }
  77. GUILabel* GUILabel::create(const HString& text, const GUIOptions& layoutOptions, const String& styleName)
  78. {
  79. return create(GUIContent(text), layoutOptions, styleName);
  80. }
  81. GUILabel* GUILabel::create(const GUIContent& content, const String& styleName)
  82. {
  83. return new (bs_alloc<GUILabel, PoolAlloc>()) GUILabel(getStyleName<GUILabel>(styleName), content, GUILayoutOptions::create());
  84. }
  85. GUILabel* GUILabel::create(const GUIContent& content, const GUIOptions& layoutOptions, const String& styleName)
  86. {
  87. return new (bs_alloc<GUILabel, PoolAlloc>()) GUILabel(getStyleName<GUILabel>(styleName), content, GUILayoutOptions::create(layoutOptions));
  88. }
  89. const String& GUILabel::getGUITypeName()
  90. {
  91. static String typeName = "Label";
  92. return typeName;
  93. }
  94. }