BsGUILayout.cpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. #include "BsGUILayout.h"
  2. #include "BsGUIElement.h"
  3. #include "BsGUILayoutX.h"
  4. #include "BsGUILayoutY.h"
  5. #include "BsGUISpace.h"
  6. #include "CmException.h"
  7. using namespace CamelotFramework;
  8. namespace BansheeEngine
  9. {
  10. GUILayout::GUILayout()
  11. :mOptimalWidth(0), mOptimalHeight(0), mActualWidth(0), mActualHeight(0)
  12. {
  13. }
  14. GUILayout::~GUILayout()
  15. {
  16. }
  17. void GUILayout::addElement(GUIElement* element)
  18. {
  19. GUIElementBase* parentElement = element->_getParent();
  20. if(parentElement != nullptr && parentElement->_getType() == GUIElementBase::Type::Layout)
  21. {
  22. GUILayout* layoutParent = static_cast<GUILayout*>(parentElement);
  23. layoutParent->removeElement(element);
  24. }
  25. element->_setParent(this);
  26. mChildren.push_back(element);
  27. markContentAsDirty();
  28. }
  29. void GUILayout::removeElement(GUIElement* element)
  30. {
  31. bool foundElem = false;
  32. for(auto iter = mChildren.begin(); iter != mChildren.end(); ++iter)
  33. {
  34. GUIElementBase* child = *iter;
  35. if(child->_getType() == GUIElementBase::Type::Element && child == element)
  36. {
  37. mChildren.erase(iter);
  38. element->_setParent(nullptr);
  39. foundElem = true;
  40. markContentAsDirty();
  41. break;
  42. }
  43. }
  44. if(!foundElem)
  45. CM_EXCEPT(InvalidParametersException, "Provided element is not a part of this layout.");
  46. }
  47. void GUILayout::insertElement(UINT32 idx, GUIElement* element)
  48. {
  49. if(idx < 0 || idx >= (UINT32)mChildren.size())
  50. CM_EXCEPT(InvalidParametersException, "Index out of range: " + toString(idx) + ". Valid range: 0 .. " + toString((UINT32)mChildren.size()));
  51. GUIElementBase* parentElement = element->_getParent();
  52. if(parentElement != nullptr && parentElement->_getType() == GUIElementBase::Type::Layout)
  53. {
  54. GUILayout* layoutParent = static_cast<GUILayout*>(parentElement);
  55. layoutParent->removeElement(element);
  56. }
  57. element->_setParent(this);
  58. mChildren.insert(mChildren.begin() + idx, element);
  59. markContentAsDirty();
  60. }
  61. GUIFixedSpace& GUILayout::addSpace(UINT32 size)
  62. {
  63. GUIFixedSpace* entry = cm_new<GUIFixedSpace, PoolAlloc>(size);
  64. mChildren.push_back(entry);
  65. markContentAsDirty();
  66. return *entry;
  67. }
  68. void GUILayout::removeSpace(GUIFixedSpace& space)
  69. {
  70. bool foundElem = false;
  71. for(auto iter = mChildren.begin(); iter != mChildren.end(); ++iter)
  72. {
  73. GUIElementBase* child = *iter;
  74. if(child->_getType() == GUIElementBase::Type::FixedSpace && child == &space)
  75. {
  76. cm_delete<PoolAlloc>(child);
  77. mChildren.erase(iter);
  78. foundElem = true;
  79. markContentAsDirty();
  80. break;
  81. }
  82. }
  83. if(!foundElem)
  84. CM_EXCEPT(InvalidParametersException, "Provided element is not a part of this layout.");
  85. }
  86. GUIFixedSpace& GUILayout::insertSpace(UINT32 idx, UINT32 size)
  87. {
  88. if(idx < 0 || idx >= (UINT32)mChildren.size())
  89. CM_EXCEPT(InvalidParametersException, "Index out of range: " + toString(idx) + ". Valid range: 0 .. " + toString((UINT32)mChildren.size()));
  90. GUIFixedSpace* entry = cm_new<GUIFixedSpace, PoolAlloc>(size);
  91. mChildren.insert(mChildren.begin() + idx, entry);
  92. markContentAsDirty();
  93. return *entry;
  94. }
  95. GUIFlexibleSpace& GUILayout::addFlexibleSpace()
  96. {
  97. GUIFlexibleSpace* entry = cm_new<GUIFlexibleSpace, PoolAlloc>();
  98. mChildren.push_back(entry);
  99. markContentAsDirty();
  100. return *entry;
  101. }
  102. void GUILayout::removeFlexibleSpace(GUIFlexibleSpace& space)
  103. {
  104. bool foundElem = false;
  105. for(auto iter = mChildren.begin(); iter != mChildren.end(); ++iter)
  106. {
  107. GUIElementBase* child = *iter;
  108. if(child->_getType() == GUIElementBase::Type::FlexibleSpace && child == &space)
  109. {
  110. cm_delete<PoolAlloc>(child);
  111. mChildren.erase(iter);
  112. foundElem = true;
  113. markContentAsDirty();
  114. break;
  115. }
  116. }
  117. if(!foundElem)
  118. CM_EXCEPT(InvalidParametersException, "Provided element is not a part of this layout.");
  119. }
  120. GUIFlexibleSpace& GUILayout::insertFlexibleSpace(UINT32 idx)
  121. {
  122. if(idx < 0 || idx >= (UINT32)mChildren.size())
  123. CM_EXCEPT(InvalidParametersException, "Index out of range: " + toString(idx) + ". Valid range: 0 .. " + toString((UINT32)mChildren.size()));
  124. GUIFlexibleSpace* entry = cm_new<GUIFlexibleSpace, PoolAlloc>();
  125. mChildren.insert(mChildren.begin() + idx, entry);
  126. markContentAsDirty();
  127. return *entry;
  128. }
  129. }