BsGUIDimensions.cpp 3.0 KB

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