BsGUIProgressBar.cpp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. #include "BsGUIProgressBar.h"
  2. #include "BsGUIWidget.h"
  3. #include "BsGUISkin.h"
  4. #include "BsGUITexture.h"
  5. #include "BsSpriteTexture.h"
  6. #include "BsGUIDimensions.h"
  7. using namespace std::placeholders;
  8. namespace BansheeEngine
  9. {
  10. GUIProgressBar::GUIProgressBar(const String& styleName, const GUIDimensions& dimensions)
  11. :GUIElementContainer(dimensions, styleName), mPercent(0)
  12. {
  13. mBar = GUITexture::create(getSubStyleName(getBarStyleType()));
  14. mBackground = GUITexture::create(getSubStyleName(getBackgroundStyleType()));
  15. mBackground->_setElementDepth(mBar->_getRenderElementDepthRange());
  16. _registerChildElement(mBar);
  17. _registerChildElement(mBackground);
  18. }
  19. const String& GUIProgressBar::getBarStyleType()
  20. {
  21. static String HANDLE_STYLE_TYPE = "ProgressBarFill";
  22. return HANDLE_STYLE_TYPE;
  23. }
  24. const String& GUIProgressBar::getBackgroundStyleType()
  25. {
  26. static String BACKGROUND_STYLE_TYPE = "ProgressBarBackground";
  27. return BACKGROUND_STYLE_TYPE;
  28. }
  29. Vector2I GUIProgressBar::_getOptimalSize() const
  30. {
  31. Vector2I optimalSize = mBar->_getOptimalSize();
  32. Vector2I backgroundSize = mBackground->_getOptimalSize();
  33. optimalSize.x = std::max(optimalSize.x, backgroundSize.x);
  34. optimalSize.y = std::max(optimalSize.y, backgroundSize.y);
  35. return optimalSize;
  36. }
  37. void GUIProgressBar::_updateLayoutInternal(const GUILayoutData& data)
  38. {
  39. mBackground->_setLayoutData(data);
  40. const GUIElementStyle* style = _getStyle();
  41. GUILayoutData barLayoutData = data;
  42. barLayoutData.area.x += style->margins.left;
  43. barLayoutData.area.y += style->margins.top;
  44. UINT32 maxProgressBarWidth = std::max((UINT32)0, (UINT32)(data.area.width - style->margins.left - style->margins.right));
  45. UINT32 progressBarHeight = std::max((UINT32)0, (UINT32)(data.area.height - style->margins.top - style->margins.bottom));
  46. barLayoutData.area.width = (UINT32)Math::floorToInt(maxProgressBarWidth * mPercent);
  47. barLayoutData.area.height = progressBarHeight;
  48. mBar->_setLayoutData(barLayoutData);
  49. }
  50. void GUIProgressBar::styleUpdated()
  51. {
  52. mBar->setStyle(getSubStyleName(getBarStyleType()));
  53. mBackground->setStyle(getSubStyleName(getBackgroundStyleType()));
  54. }
  55. void GUIProgressBar::setPercent(float pct)
  56. {
  57. mPercent = pct;
  58. _markContentAsDirty();
  59. }
  60. void GUIProgressBar::setTint(const Color& color)
  61. {
  62. mBar->setTint(color);
  63. mBackground->setTint(color);
  64. }
  65. GUIProgressBar* GUIProgressBar::create(const String& styleName)
  66. {
  67. return new (bs_alloc<GUIProgressBar, PoolAlloc>()) GUIProgressBar(getStyleName<GUIProgressBar>(styleName), GUIDimensions::create());
  68. }
  69. GUIProgressBar* GUIProgressBar::create(const GUIOptions& options, const String& styleName)
  70. {
  71. return new (bs_alloc<GUIProgressBar, PoolAlloc>()) GUIProgressBar(getStyleName<GUIProgressBar>(styleName), GUIDimensions::create(options));
  72. }
  73. const String& GUIProgressBar::getGUITypeName()
  74. {
  75. static String typeName = "ProgressBar";
  76. return typeName;
  77. }
  78. }