#include "BsGUIWindowMover.h" #include "CmApplication.h" #include "CmTexture.h" #include "BsGUIWidget.h" #include "BsGUISkin.h" #include "BsSpriteTexture.h" #include "BsGUILayoutOptions.h" #include "BsGUIMouseEvent.h" using namespace CamelotFramework; using namespace BansheeEngine; namespace BansheeEditor { const String& GUIWindowMover::getGUITypeName() { static String name = "WindowMover"; return name; } GUIWindowMover::GUIWindowMover(GUIWidget& parent, const GUIElementStyle* style, const GUILayoutOptions& layoutOptions) :GUIElement(parent, style, layoutOptions) { mImageSprite = cm_new(); mDesc.texture = mStyle->normal.texture; if(mDesc.texture != nullptr) { mDesc.width = mDesc.texture->getTexture()->getWidth(); mDesc.height = mDesc.texture->getTexture()->getHeight(); } mDesc.borderLeft = mStyle->border.left; mDesc.borderRight = mStyle->border.right; mDesc.borderTop = mStyle->border.top; mDesc.borderBottom = mStyle->border.bottom; } GUIWindowMover::~GUIWindowMover() { cm_delete(mImageSprite); } GUIWindowMover* GUIWindowMover::create(GUIWidget& parent, const GUIElementStyle* style) { if(style == nullptr) { const GUISkin* skin = parent.getSkin(); style = skin->getStyle(getGUITypeName()); } return new (cm_alloc()) GUIWindowMover(parent, style, getDefaultLayoutOptions(style)); } GUIWindowMover* GUIWindowMover::create(GUIWidget& parent, const GUILayoutOptions& layoutOptions, const GUIElementStyle* style) { if(style == nullptr) { const GUISkin* skin = parent.getSkin(); style = skin->getStyle(getGUITypeName()); } return new (cm_alloc()) GUIWindowMover(parent, style, layoutOptions); } UINT32 GUIWindowMover::getNumRenderElements() const { return mImageSprite->getNumRenderElements(); } const HMaterial& GUIWindowMover::getMaterial(UINT32 renderElementIdx) const { return mImageSprite->getMaterial(renderElementIdx); } UINT32 GUIWindowMover::getNumQuads(UINT32 renderElementIdx) const { return mImageSprite->getNumQuads(renderElementIdx); } void GUIWindowMover::updateRenderElementsInternal() { mDesc.width = mWidth; mDesc.height = mHeight; mImageSprite->update(mDesc); GUIElement::updateRenderElementsInternal(); } void GUIWindowMover::updateBounds() { mBounds = mImageSprite->getBounds(mOffset, mClipRect); } UINT32 GUIWindowMover::_getOptimalWidth() const { if(mDesc.texture != nullptr) { return mDesc.texture->getTexture()->getWidth(); } return 0; } UINT32 GUIWindowMover::_getOptimalHeight() const { if(mDesc.texture != nullptr) { return mDesc.texture->getTexture()->getHeight(); } return 0; } void GUIWindowMover::fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad, UINT32 maxNumQuads, UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx) const { mImageSprite->fillBuffer(vertices, uv, indices, startingQuad, maxNumQuads, vertexStride, indexStride, renderElementIdx, mOffset, mClipRect); } void GUIWindowMover::setFocused(bool focused) { if(focused) mDesc.texture = mStyle->focused.texture; else mDesc.texture = mStyle->normal.texture; markContentAsDirty(); } bool GUIWindowMover::mouseEvent(const GUIMouseEvent& ev) { if(ev.getType() == GUIMouseEventType::MouseDown) { RenderWindow* window = _getParentWidget().getOwnerWindow(); RenderWindowPtr windowPtr = std::static_pointer_cast(window->getThisPtr()); gMainCA().startMove(windowPtr); return true; } else if(ev.getType() == GUIMouseEventType::MouseDragAndDropDropped) { if(!onDraggedItemDropped.empty()) onDraggedItemDropped(); return true; } return false; } }