BsGUISlider.cpp 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "GUI/BsGUISlider.h"
  4. #include "GUI/BsGUISliderHandle.h"
  5. #include "GUI/BsGUITexture.h"
  6. #include "GUI/BsGUIDimensions.h"
  7. using namespace std::placeholders;
  8. namespace bs
  9. {
  10. GUISlider::GUISlider(bool horizontal, const String& styleName, const GUIDimensions& dimensions)
  11. :GUIElementContainer(dimensions, styleName), mHorizontal(horizontal), mMinRange(0.0f), mMaxRange(1.0f)
  12. {
  13. GUISliderHandleFlags flags = horizontal ? GUISliderHandleFlag::Horizontal : GUISliderHandleFlag::Vertical;
  14. flags |= GUISliderHandleFlag::JumpOnClick;
  15. mSliderHandle = GUISliderHandle::create(flags, getSubStyleName(getHandleStyleType()));
  16. mBackground = GUITexture::create(getSubStyleName(getBackgroundStyleType()));
  17. mFillBackground = GUITexture::create(getSubStyleName(getFillStyleType()));
  18. mBackground->_setElementDepth(mSliderHandle->_getRenderElementDepthRange() + mFillBackground->_getRenderElementDepthRange());
  19. mFillBackground->_setElementDepth(mSliderHandle->_getRenderElementDepthRange());
  20. _registerChildElement(mSliderHandle);
  21. _registerChildElement(mBackground);
  22. _registerChildElement(mFillBackground);
  23. mHandleMovedConn = mSliderHandle->onHandleMovedOrResized.connect(std::bind(&GUISlider::onHandleMoved, this, _1, _2));
  24. }
  25. GUISlider::~GUISlider()
  26. {
  27. mHandleMovedConn.disconnect();
  28. }
  29. const String& GUISlider::getHandleStyleType()
  30. {
  31. static String HANDLE_STYLE_TYPE = "SliderHandle";
  32. return HANDLE_STYLE_TYPE;
  33. }
  34. const String& GUISlider::getBackgroundStyleType()
  35. {
  36. static String BACKGROUND_STYLE_TYPE = "SliderBackground";
  37. return BACKGROUND_STYLE_TYPE;
  38. }
  39. const String& GUISlider::getFillStyleType()
  40. {
  41. static String FILL_STYLE_TYPE = "SliderFill";
  42. return FILL_STYLE_TYPE;
  43. }
  44. Vector2I GUISlider::_getOptimalSize() const
  45. {
  46. Vector2I optimalSize = mSliderHandle->_getOptimalSize();
  47. Vector2I backgroundSize = mBackground->_getOptimalSize();
  48. optimalSize.x = std::max(optimalSize.x, backgroundSize.x);
  49. optimalSize.y = std::max(optimalSize.y, backgroundSize.y);
  50. return optimalSize;
  51. }
  52. void GUISlider::_updateLayoutInternal(const GUILayoutData& data)
  53. {
  54. GUILayoutData childData = data;
  55. if (mHorizontal)
  56. {
  57. Vector2I optimalSize = mBackground->_getOptimalSize();
  58. childData.area.height = optimalSize.y;
  59. childData.area.y = data.area.y + (INT32)((data.area.height - childData.area.height) * 0.5f);
  60. childData.clipRect = data.area;
  61. childData.clipRect.clip(data.clipRect);
  62. mBackground->_setLayoutData(childData);
  63. optimalSize = mSliderHandle->_getOptimalSize();
  64. childData.area.height = optimalSize.y;
  65. childData.area.y = data.area.y + (INT32)((data.area.height - childData.area.height) * 0.5f);
  66. childData.clipRect = data.area;
  67. childData.clipRect.clip(data.clipRect);
  68. mSliderHandle->_setLayoutData(childData);
  69. UINT32 handleWidth = optimalSize.x;
  70. optimalSize = mFillBackground->_getOptimalSize();
  71. childData.area.height = optimalSize.y;
  72. childData.area.y = data.area.y + (INT32)((data.area.height - childData.area.height) * 0.5f);
  73. childData.area.width = mSliderHandle->getHandlePosPx() + handleWidth / 2;
  74. childData.clipRect = data.area;
  75. childData.clipRect.clip(data.clipRect);
  76. mFillBackground->_setLayoutData(childData);
  77. }
  78. else
  79. {
  80. Vector2I optimalSize = mBackground->_getOptimalSize();
  81. childData.area.width = optimalSize.x;
  82. childData.area.x = data.area.x + (INT32)((data.area.width - childData.area.width) * 0.5f);
  83. childData.clipRect = data.area;
  84. childData.clipRect.clip(data.clipRect);
  85. mBackground->_setLayoutData(childData);
  86. optimalSize = mSliderHandle->_getOptimalSize();
  87. childData.area.width = optimalSize.x;
  88. childData.area.x = data.area.x + (INT32)((data.area.width - childData.area.width) * 0.5f);
  89. childData.clipRect = data.area;
  90. childData.clipRect.clip(data.clipRect);
  91. mSliderHandle->_setLayoutData(childData);
  92. UINT32 handleHeight = optimalSize.y;
  93. optimalSize = mFillBackground->_getOptimalSize();
  94. childData.area.width = optimalSize.x;
  95. childData.area.x = data.area.x + (INT32)((data.area.width - childData.area.width) * 0.5f);
  96. childData.area.height = mSliderHandle->getHandlePosPx() + handleHeight / 2;
  97. childData.clipRect = data.area;
  98. childData.clipRect.clip(data.clipRect);
  99. mFillBackground->_setLayoutData(childData);
  100. }
  101. }
  102. void GUISlider::styleUpdated()
  103. {
  104. mBackground->setStyle(getSubStyleName(getBackgroundStyleType()));
  105. mFillBackground->setStyle(getSubStyleName(getFillStyleType()));
  106. mSliderHandle->setStyle(getSubStyleName(getHandleStyleType()));
  107. }
  108. void GUISlider::setPercent(float pct)
  109. {
  110. float oldHandlePos = mSliderHandle->getHandlePos();
  111. mSliderHandle->_setHandlePos(pct);
  112. if (oldHandlePos != mSliderHandle->getHandlePos())
  113. mSliderHandle->_markLayoutAsDirty();
  114. }
  115. float GUISlider::getPercent() const
  116. {
  117. return mSliderHandle->getHandlePos();
  118. }
  119. float GUISlider::getValue() const
  120. {
  121. float diff = mMaxRange - mMinRange;
  122. return mMinRange + diff * mSliderHandle->getHandlePos();
  123. }
  124. void GUISlider::setValue(float value)
  125. {
  126. float diff = mMaxRange - mMinRange;
  127. float pct = (value - mMinRange) / diff;
  128. setPercent(pct);
  129. }
  130. void GUISlider::setRange(float min, float max)
  131. {
  132. mMinRange = min;
  133. mMaxRange = max;
  134. }
  135. float GUISlider::getRangeMaximum() const
  136. {
  137. return mMaxRange;
  138. }
  139. float GUISlider::getRangeMinimum() const
  140. {
  141. return mMinRange;
  142. }
  143. void GUISlider::setStep(float step)
  144. {
  145. mSliderHandle->setStep(step);
  146. }
  147. float GUISlider::getStep() const
  148. {
  149. return mSliderHandle->getStep();
  150. }
  151. void GUISlider::setTint(const Color& color)
  152. {
  153. mBackground->setTint(color);
  154. mSliderHandle->setTint(color);
  155. }
  156. void GUISlider::onHandleMoved(float newPosition, float newSize)
  157. {
  158. onChanged(getValue());
  159. }
  160. GUISliderHorz::GUISliderHorz(const String& styleName, const GUIDimensions& dimensions)
  161. :GUISlider(true, styleName, dimensions)
  162. {
  163. }
  164. GUISliderHorz* GUISliderHorz::create(const String& styleName)
  165. {
  166. return new (bs_alloc<GUISliderHorz>()) GUISliderHorz(getStyleName<GUISliderHorz>(styleName), GUIDimensions::create());
  167. }
  168. GUISliderHorz* GUISliderHorz::create(const GUIOptions& options, const String& styleName)
  169. {
  170. return new (bs_alloc<GUISliderHorz>()) GUISliderHorz(getStyleName<GUISliderHorz>(styleName), GUIDimensions::create(options));
  171. }
  172. const String& GUISliderHorz::getGUITypeName()
  173. {
  174. static String typeName = "SliderHorz";
  175. return typeName;
  176. }
  177. GUISliderVert::GUISliderVert(const String& styleName, const GUIDimensions& dimensions)
  178. :GUISlider(false, styleName, dimensions)
  179. {
  180. }
  181. GUISliderVert* GUISliderVert::create(const String& styleName)
  182. {
  183. return new (bs_alloc<GUISliderVert>()) GUISliderVert(getStyleName<GUISliderVert>(styleName), GUIDimensions::create());
  184. }
  185. GUISliderVert* GUISliderVert::create(const GUIOptions& options, const String& styleName)
  186. {
  187. return new (bs_alloc<GUISliderVert>()) GUISliderVert(getStyleName<GUISliderVert>(styleName), GUIDimensions::create(options));
  188. }
  189. const String& GUISliderVert::getGUITypeName()
  190. {
  191. static String typeName = "SliderVert";
  192. return typeName;
  193. }
  194. }