BsGUIDimensions.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "GUI/BsGUIDimensions.h"
  4. #include "GUI/BsGUIElementStyle.h"
  5. #include "GUI/BsGUIOptions.h"
  6. namespace bs
  7. {
  8. GUIDimensions GUIDimensions::create()
  9. {
  10. return GUIDimensions();
  11. }
  12. GUIDimensions GUIDimensions::create(const GUIOptions& options)
  13. {
  14. GUIDimensions dimensions;
  15. for(auto& option : options.mOptions)
  16. {
  17. switch(option.type)
  18. {
  19. case GUIOption::Type::Position:
  20. dimensions.x = (INT32)option.min;
  21. dimensions.y = (INT32)option.max;
  22. break;
  23. case GUIOption::Type::FixedWidth:
  24. dimensions.flags |= GUIDF_FixedWidth | GUIDF_OverWidth;
  25. dimensions.minWidth = dimensions.maxWidth = option.min;
  26. break;
  27. case GUIOption::Type::FixedHeight:
  28. dimensions.flags |= GUIDF_FixedHeight | GUIDF_OverHeight;
  29. dimensions.minHeight = dimensions.maxHeight = option.min;
  30. break;
  31. case GUIOption::Type::FlexibleWidth:
  32. dimensions.flags |= GUIDF_OverWidth;
  33. dimensions.flags &= ~GUIDF_FixedWidth;
  34. dimensions.minWidth = option.min;
  35. dimensions.maxWidth = option.max;
  36. break;
  37. case GUIOption::Type::FlexibleHeight:
  38. dimensions.flags |= GUIDF_OverHeight;
  39. dimensions.flags &= ~GUIDF_FixedHeight;
  40. dimensions.minHeight = option.min;
  41. dimensions.maxHeight = option.max;
  42. break;
  43. }
  44. }
  45. return dimensions;
  46. }
  47. void GUIDimensions::updateWithStyle(const GUIElementStyle* style)
  48. {
  49. if(!overridenWidth())
  50. {
  51. if (style->fixedWidth)
  52. {
  53. flags |= GUIDF_FixedWidth;
  54. minWidth = maxWidth = style->width;
  55. }
  56. else
  57. {
  58. flags &= ~GUIDF_FixedWidth;
  59. minWidth = style->minWidth;
  60. maxWidth = style->maxWidth;
  61. }
  62. }
  63. if(!overridenHeight())
  64. {
  65. if (style->fixedHeight)
  66. {
  67. flags |= GUIDF_FixedHeight;
  68. minHeight = maxHeight = style->height;
  69. }
  70. else
  71. {
  72. flags &= ~GUIDF_FixedHeight;
  73. minHeight = style->minHeight;
  74. maxHeight = style->maxHeight;
  75. }
  76. }
  77. }
  78. GUIDimensions::GUIDimensions()
  79. :x(0), y(0), minWidth(0), maxWidth(0),
  80. minHeight(0), maxHeight(0), flags(0)
  81. {
  82. }
  83. LayoutSizeRange GUIDimensions::calculateSizeRange(const Vector2I& optimal) const
  84. {
  85. LayoutSizeRange sizeRange;
  86. if (fixedHeight())
  87. {
  88. sizeRange.optimal.y = std::max(0, (INT32)minHeight);
  89. sizeRange.min.y = sizeRange.optimal.y;
  90. sizeRange.max.y = sizeRange.optimal.y;
  91. }
  92. else
  93. {
  94. sizeRange.optimal.y = optimal.y;
  95. if (minHeight > 0)
  96. {
  97. sizeRange.optimal.y = std::max(std::max(0, (INT32)minHeight), sizeRange.optimal.y);
  98. sizeRange.min.y = std::max(0, (INT32)minHeight);
  99. }
  100. if (maxHeight > 0)
  101. {
  102. sizeRange.optimal.y = std::min(std::max(0, (INT32)maxHeight), sizeRange.optimal.y);
  103. sizeRange.max.y = std::max(0, (INT32)maxHeight);
  104. }
  105. }
  106. if (fixedWidth())
  107. {
  108. sizeRange.optimal.x = std::max(0, (INT32)minWidth);
  109. sizeRange.min.x = sizeRange.optimal.x;
  110. sizeRange.max.x = sizeRange.optimal.x;
  111. }
  112. else
  113. {
  114. sizeRange.optimal.x = optimal.x;
  115. if (minWidth > 0)
  116. {
  117. sizeRange.optimal.x = std::max(std::max(0, (INT32)minWidth), sizeRange.optimal.x);
  118. sizeRange.min.x = std::max(0, (INT32)minWidth);
  119. }
  120. if (maxWidth > 0)
  121. {
  122. sizeRange.optimal.x = std::min(std::max(0, (INT32)maxWidth), sizeRange.optimal.x);
  123. sizeRange.max.x = std::max(0, (INT32)maxWidth);
  124. }
  125. }
  126. return sizeRange;
  127. }
  128. }