| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250 |
- //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
- //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
- #include "GUI/BsGUIScrollBar.h"
- #include "2D/BsSpriteTexture.h"
- #include "GUI/BsGUIElementStyle.h"
- #include "GUI/BsGUIDimensions.h"
- #include "GUI/BsGUILayoutX.h"
- #include "GUI/BsGUILayoutY.h"
- #include "GUI/BsGUIButton.h"
- #include "GUI/BsGUISliderHandle.h"
- #include "GUI/BsGUISpace.h"
- using namespace std::placeholders;
- namespace bs
- {
- const UINT32 GUIScrollBar::ButtonScrollAmount = 10;
- const String& GUIScrollBar::getHScrollHandleType()
- {
- static String typeName = "UIScrollBarHHandle";
- return typeName;
- }
- const String& GUIScrollBar::getVScrollHandleType()
- {
- static String typeName = "UIScrollBarVHandle";
- return typeName;
- }
- GUIScrollBar::GUIScrollBar(bool horizontal, bool resizable, const String& styleName, const GUIDimensions& dimensions)
- :GUIElement(styleName, dimensions), mHorizontal(horizontal)
- {
- mImageSprite = bs_new<ImageSprite>();
- GUISliderHandleFlags flags;
- if (resizable)
- flags |= GUISliderHandleFlag::Resizeable;
- if(mHorizontal)
- {
- mLayout = GUILayoutX::create();
- _registerChildElement(mLayout);
- mUpBtn = GUIButton::create(HString(L""), "ScrollLeftBtn");
- mDownBtn = GUIButton::create(HString(L""), "ScrollRightBtn");
- mHandleBtn = GUISliderHandle::create(flags | GUISliderHandleFlag::Horizontal, getSubStyleName(getHScrollHandleType()));
- }
- else
- {
- mLayout = GUILayoutY::create();
- _registerChildElement(mLayout);
- mUpBtn = GUIButton::create(HString(L""), "ScrollUpBtn");
- mDownBtn = GUIButton::create(HString(L""), "ScrollDownBtn");
- mHandleBtn = GUISliderHandle::create(flags | GUISliderHandleFlag::Vertical, getSubStyleName(getVScrollHandleType()));
- }
- mLayout->addNewElement<GUIFixedSpace>(2);
- mLayout->addElement(mUpBtn);
- mLayout->addElement(mHandleBtn);
- mLayout->addElement(mDownBtn);
- mLayout->addNewElement<GUIFixedSpace>(2);
- mHandleBtn->onHandleMovedOrResized.connect(std::bind(&GUIScrollBar::handleMoved, this, _1, _2));
- mUpBtn->onClick.connect(std::bind(&GUIScrollBar::upButtonClicked, this));
- mDownBtn->onClick.connect(std::bind(&GUIScrollBar::downButtonClicked, this));
- }
- GUIScrollBar::~GUIScrollBar()
- {
- bs_delete(mImageSprite);
- GUIElement::destroy(mUpBtn);
- GUIElement::destroy(mDownBtn);
- GUIElement::destroy(mHandleBtn);
- }
- UINT32 GUIScrollBar::_getNumRenderElements() const
- {
- return mImageSprite->getNumRenderElements();
- }
- const SpriteMaterialInfo& GUIScrollBar::_getMaterial(UINT32 renderElementIdx, SpriteMaterial** material) const
- {
- *material = mImageSprite->getMaterial(renderElementIdx);
- return mImageSprite->getMaterialInfo(renderElementIdx);
- }
- void GUIScrollBar::_getMeshInfo(UINT32 renderElementIdx, UINT32& numVertices, UINT32& numIndices, GUIMeshType& type) const
- {
- UINT32 numQuads = mImageSprite->getNumQuads(renderElementIdx);
- numVertices = numQuads * 4;
- numIndices = numQuads * 6;
- type = GUIMeshType::Triangle;
- }
- void GUIScrollBar::updateRenderElementsInternal()
- {
- IMAGE_SPRITE_DESC desc;
- if(_getStyle()->normal.texture != nullptr && _getStyle()->normal.texture.isLoaded())
- desc.texture = _getStyle()->normal.texture.getInternalPtr();
- desc.width = mLayoutData.area.width;
- desc.height = mLayoutData.area.height;
- desc.color = getTint();
- mImageSprite->update(desc, (UINT64)_getParentWidget());
- GUIElement::updateRenderElementsInternal();
- }
- void GUIScrollBar::updateClippedBounds()
- {
- mClippedBounds = Rect2I(0, 0, 0, 0); // We don't want any mouse input for this element. This is just a container.
- }
- Vector2I GUIScrollBar::_getOptimalSize() const
- {
- return mLayout->_getOptimalSize();
- }
- UINT32 GUIScrollBar::_getRenderElementDepth(UINT32 renderElementIdx) const
- {
- return _getDepth() + 2; // + 2 depth because child buttons use +1
- }
- UINT32 GUIScrollBar::_getRenderElementDepthRange() const
- {
- return 3;
- }
- void GUIScrollBar::_fillBuffer(UINT8* vertices, UINT32* indices, UINT32 vertexOffset, UINT32 indexOffset,
- UINT32 maxNumVerts, UINT32 maxNumIndices, UINT32 renderElementIdx) const
- {
- UINT8* uvs = vertices + sizeof(Vector2);
- UINT32 vertexStride = sizeof(Vector2) * 2;
- UINT32 indexStride = sizeof(UINT32);
- Vector2I offset(mLayoutData.area.x, mLayoutData.area.y);
- mImageSprite->fillBuffer(vertices, uvs, indices, vertexOffset, indexOffset, maxNumVerts, maxNumIndices,
- vertexStride, indexStride, renderElementIdx, offset, mLayoutData.getLocalClipRect());
- }
- void GUIScrollBar::styleUpdated()
- {
- if (mHorizontal)
- mHandleBtn->setStyle(getSubStyleName(getHScrollHandleType()));
- else
- mHandleBtn->setStyle(getSubStyleName(getVScrollHandleType()));
- }
- void GUIScrollBar::handleMoved(float handlePct, float sizePct)
- {
- if(!onScrollOrResize.empty())
- onScrollOrResize(handlePct, sizePct);
- }
- void GUIScrollBar::upButtonClicked()
- {
- float handleOffset = 0.0f;
- float scrollableSize = (float)mHandleBtn->getScrollableSize();
-
- if(scrollableSize > 0.0f)
- handleOffset = ButtonScrollAmount / scrollableSize;
- scroll(handleOffset);
- }
- void GUIScrollBar::downButtonClicked()
- {
- float handleOffset = 0.0f;
- float scrollableSize = (float)mHandleBtn->getScrollableSize();
- if(scrollableSize > 0.0f)
- handleOffset = ButtonScrollAmount / scrollableSize;
- scroll(-handleOffset);
- }
- void GUIScrollBar::scroll(float amount)
- {
- float newHandlePos = Math::clamp01(mHandleBtn->getHandlePos() - amount);
- float oldHandlePos = mHandleBtn->getHandlePos();
- mHandleBtn->_setHandlePos(newHandlePos);
- if (oldHandlePos != mHandleBtn->getHandlePos())
- {
- mHandleBtn->_markLayoutAsDirty();
- if (!onScrollOrResize.empty())
- onScrollOrResize(newHandlePos, mHandleBtn->_getHandleSizePct());
- }
- }
- void GUIScrollBar::_setHandleSize(float pct)
- {
- mHandleBtn->_setHandleSize(pct);
- }
- void GUIScrollBar::_setScrollPos(float pct)
- {
- mHandleBtn->_setHandlePos(pct);
- }
- float GUIScrollBar::getScrollPos() const
- {
- return mHandleBtn->getHandlePos();
- }
- void GUIScrollBar::setScrollPos(float pct)
- {
- float oldHandlePos = mHandleBtn->getHandlePos();
- mHandleBtn->_setHandlePos(pct);
- if (oldHandlePos != mHandleBtn->getHandlePos())
- mHandleBtn->_markLayoutAsDirty();
- }
- float GUIScrollBar::getHandleSize() const
- {
- return mHandleBtn->_getHandleSizePct();
- }
- void GUIScrollBar::setHandleSize(float pct)
- {
- mHandleBtn->_setHandleSize(pct);
- mHandleBtn->_markLayoutAsDirty();
- }
- UINT32 GUIScrollBar::getScrollableSize() const
- {
- return mHandleBtn->getScrollableSize();
- }
- void GUIScrollBar::setTint(const Color& color)
- {
- mUpBtn->setTint(color);
- mDownBtn->setTint(color);
- mHandleBtn->setTint(color);
- GUIElement::setTint(color);
- }
- }
|