BsGUIWindowMover.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. #include "BsGUIWindowMover.h"
  2. #include "CmApplication.h"
  3. #include "CmTexture.h"
  4. #include "BsGUIWidget.h"
  5. #include "BsGUISkin.h"
  6. #include "BsSpriteTexture.h"
  7. #include "BsGUILayoutOptions.h"
  8. #include "BsGUIMouseEvent.h"
  9. using namespace CamelotFramework;
  10. using namespace BansheeEngine;
  11. namespace BansheeEditor
  12. {
  13. const String& GUIWindowMover::getGUITypeName()
  14. {
  15. static String name = "WindowMover";
  16. return name;
  17. }
  18. GUIWindowMover::GUIWindowMover(GUIWidget& parent, const GUIElementStyle* style, const GUILayoutOptions& layoutOptions)
  19. :GUIElement(parent, style, layoutOptions)
  20. {
  21. mImageSprite = cm_new<ImageSprite, PoolAlloc>();
  22. mDesc.texture = mStyle->normal.texture;
  23. if(mDesc.texture != nullptr)
  24. {
  25. mDesc.width = mDesc.texture->getTexture()->getWidth();
  26. mDesc.height = mDesc.texture->getTexture()->getHeight();
  27. }
  28. mDesc.borderLeft = mStyle->border.left;
  29. mDesc.borderRight = mStyle->border.right;
  30. mDesc.borderTop = mStyle->border.top;
  31. mDesc.borderBottom = mStyle->border.bottom;
  32. }
  33. GUIWindowMover::~GUIWindowMover()
  34. {
  35. cm_delete<PoolAlloc>(mImageSprite);
  36. }
  37. GUIWindowMover* GUIWindowMover::create(GUIWidget& parent, const GUIElementStyle* style)
  38. {
  39. if(style == nullptr)
  40. {
  41. const GUISkin* skin = parent.getSkin();
  42. style = skin->getStyle(getGUITypeName());
  43. }
  44. return new (cm_alloc<GUIWindowMover, PoolAlloc>()) GUIWindowMover(parent, style, getDefaultLayoutOptions(style));
  45. }
  46. GUIWindowMover* GUIWindowMover::create(GUIWidget& parent, const GUILayoutOptions& layoutOptions, const GUIElementStyle* style)
  47. {
  48. if(style == nullptr)
  49. {
  50. const GUISkin* skin = parent.getSkin();
  51. style = skin->getStyle(getGUITypeName());
  52. }
  53. return new (cm_alloc<GUIWindowMover, PoolAlloc>()) GUIWindowMover(parent, style, layoutOptions);
  54. }
  55. UINT32 GUIWindowMover::getNumRenderElements() const
  56. {
  57. return mImageSprite->getNumRenderElements();
  58. }
  59. const HMaterial& GUIWindowMover::getMaterial(UINT32 renderElementIdx) const
  60. {
  61. return mImageSprite->getMaterial(renderElementIdx);
  62. }
  63. UINT32 GUIWindowMover::getNumQuads(UINT32 renderElementIdx) const
  64. {
  65. return mImageSprite->getNumQuads(renderElementIdx);
  66. }
  67. void GUIWindowMover::updateRenderElementsInternal()
  68. {
  69. mDesc.width = mWidth;
  70. mDesc.height = mHeight;
  71. mImageSprite->update(mDesc);
  72. GUIElement::updateRenderElementsInternal();
  73. }
  74. void GUIWindowMover::updateBounds()
  75. {
  76. mBounds = mImageSprite->getBounds(mOffset, mClipRect);
  77. }
  78. UINT32 GUIWindowMover::_getOptimalWidth() const
  79. {
  80. if(mDesc.texture != nullptr)
  81. {
  82. return mDesc.texture->getTexture()->getWidth();
  83. }
  84. return 0;
  85. }
  86. UINT32 GUIWindowMover::_getOptimalHeight() const
  87. {
  88. if(mDesc.texture != nullptr)
  89. {
  90. return mDesc.texture->getTexture()->getHeight();
  91. }
  92. return 0;
  93. }
  94. void GUIWindowMover::fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad, UINT32 maxNumQuads,
  95. UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx) const
  96. {
  97. mImageSprite->fillBuffer(vertices, uv, indices, startingQuad, maxNumQuads, vertexStride, indexStride, renderElementIdx, mOffset, mClipRect);
  98. }
  99. void GUIWindowMover::setFocused(bool focused)
  100. {
  101. if(focused)
  102. mDesc.texture = mStyle->focused.texture;
  103. else
  104. mDesc.texture = mStyle->normal.texture;
  105. markContentAsDirty();
  106. }
  107. bool GUIWindowMover::mouseEvent(const GUIMouseEvent& ev)
  108. {
  109. if(ev.getType() == GUIMouseEventType::MouseDown)
  110. {
  111. RenderWindow* window = _getParentWidget().getOwnerWindow();
  112. RenderWindowPtr windowPtr = std::static_pointer_cast<RenderWindow>(window->getThisPtr());
  113. gMainCA().startMove(windowPtr);
  114. return true;
  115. }
  116. else if(ev.getType() == GUIMouseEventType::MouseDragAndDropDropped)
  117. {
  118. if(!onDraggedItemDropped.empty())
  119. onDraggedItemDropped();
  120. return true;
  121. }
  122. return false;
  123. }
  124. }