BsGUILayoutUtility.cpp 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. #include "BsGUILayoutUtility.h"
  2. #include "BsGUIElementBase.h"
  3. #include "BsGUILayout.h"
  4. #include "BsGUIArea.h"
  5. namespace BansheeEngine
  6. {
  7. Vector2I GUILayoutUtility::calcOptimalSize(const GUIElementBase* elem)
  8. {
  9. return elem->_calculateOptimalLayoutSize();
  10. }
  11. RectI GUILayoutUtility::calcBounds(const GUIElementBase* elem)
  12. {
  13. RectI parentArea;
  14. GUIElementBase* parent = elem->_getParent();
  15. if (parent != nullptr)
  16. parentArea = calcBounds(parent);
  17. else
  18. {
  19. assert(elem->_getType() == GUIElementBase::Type::Layout);
  20. const GUILayout* layout = static_cast<const GUILayout*>(elem);
  21. GUIArea* parentGUIArea = layout->_getParentGUIArea();
  22. parentArea.x = parentGUIArea->x();
  23. parentArea.y = parentGUIArea->y();
  24. parentArea.width = parentGUIArea->width();
  25. parentArea.height = parentGUIArea->height();
  26. return parentArea;
  27. }
  28. UINT32 numElements = (UINT32)parent->_getNumChildren();
  29. UINT32 myIndex = 0;
  30. Vector<Vector2I> optimalSizes;
  31. for (UINT32 i = 0; i < numElements; i++)
  32. {
  33. GUIElementBase* child = parent->_getChild(i);
  34. if (child == elem)
  35. myIndex = i;
  36. optimalSizes.push_back(calcOptimalSize(elem));
  37. }
  38. RectI* elementAreas = nullptr;
  39. if (numElements > 0)
  40. elementAreas = stackConstructN<RectI>(numElements);
  41. parent->_getElementAreas(parentArea.x, parentArea.y, parentArea.width, parentArea.height, elementAreas, numElements, optimalSizes);
  42. RectI myArea = elementAreas[myIndex];
  43. if (elementAreas != nullptr)
  44. stackDeallocLast(elementAreas);
  45. return myArea;
  46. }
  47. }