TDME2 1.9.121
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
GUILayoutNode.cpp
Go to the documentation of this file.
2
3#include <tdme/tdme.h>
18#include <tdme/gui/GUI.h>
19#include <tdme/math/Math.h>
21
23
38using tdme::gui::GUI;
41
42GUILayoutNode::GUILayoutNode(
43 GUIScreenNode* screenNode,
44 GUIParentNode* parentNode,
45 const string& id,
46 GUINode_Flow* flow,
47 GUIParentNode_Overflow* overflowX,
48 GUIParentNode_Overflow* overflowY,
49 const GUINode_Alignments& alignments,
50 const GUINode_RequestedConstraints& requestedConstraints,
51 const GUIColor& backgroundColor,
52 const string& backgroundImage,
53 const GUINode_Scale9Grid& backgroundImageScale9Grid,
54 const GUIColor& backgroundImageEffectColorMul,
55 const GUIColor& backgroundImageEffectColorAdd,
56 const GUINode_Border& border,
57 const GUINode_Padding& padding,
58 const GUINodeConditions& showOn,
59 const GUINodeConditions& hideOn,
61):
62 GUIParentNode(screenNode, parentNode, id, flow, overflowX, overflowY, alignments, requestedConstraints, backgroundColor, backgroundImage, backgroundImageScale9Grid, backgroundImageEffectColorMul, backgroundImageEffectColorAdd, border, padding, showOn, hideOn)
63{
64 this->alignment = alignment;
65}
66
68{
69 return "layout";
70}
71
73{
74 return false;
75}
76
78{
79 auto width = 0;
81 for (auto i = 0; i < subNodes.size(); i++) {
82 auto guiSubNode = subNodes[i];
83 if (guiSubNode->conditionsMet == false) continue;
84 if (guiSubNode->flow == GUINode_Flow::FLOATING) {
85 continue;
86 }
87 width += guiSubNode->getAutoWidth();
88 }
89 } else {
90 for (auto i = 0; i < subNodes.size(); i++) {
91 auto guiSubNode = subNodes[i];
92 if (guiSubNode->conditionsMet == false) continue;
93 if (guiSubNode->flow == GUINode_Flow::FLOATING) {
94 continue;
95 }
96 auto contentWidth = guiSubNode->getAutoWidth();
97 if (contentWidth > width) {
98 width = contentWidth;
99 }
100 }
101 }
102 width += border.left + border.right;
103 width += padding.left + padding.right;
104 return width;
105}
106
108{
109 auto height = 0;
111 for (auto i = 0; i < subNodes.size(); i++) {
112 auto guiSubNode = subNodes[i];
113 if (guiSubNode->conditionsMet == false) continue;
114 if (guiSubNode->flow == GUINode_Flow::FLOATING) {
115 continue;
116 }
117 height += guiSubNode->getAutoHeight();
118 }
119 } else {
120 for (auto i = 0; i < subNodes.size(); i++) {
121 auto guiSubNode = subNodes[i];
122 if (guiSubNode->conditionsMet == false) continue;
123 if (guiSubNode->flow == GUINode_Flow::FLOATING) {
124 continue;
125 }
126 auto contentHeight = guiSubNode->getAutoHeight();
127 if (contentHeight > height) {
128 height = contentHeight;
129 }
130 }
131 }
132 height += border.top + border.bottom;
133 height += padding.top + padding.bottom;
134 return height;
135}
136
138{
139 if (conditionsMet == false) return;
141 {
143 auto starCount = 0;
146 auto nodesHeight = 0;
147 auto finalNodesHeight = 0;
148 for (auto i = 0; i < subNodes.size(); i++) {
149 auto guiSubNode = subNodes[i];
150 if (guiSubNode->conditionsMet == false) continue;
151 if (guiSubNode->flow == GUINode_Flow::FLOATING) {
152 continue;
153 }
154 if (guiSubNode->requestedConstraints.heightType == GUINode_RequestedConstraints_RequestedConstraintsType::STAR) {
155 starCount++;
156 } else {
157 nodesHeight += guiSubNode->computedConstraints.height;
158 finalNodesHeight += guiSubNode->computedConstraints.height;
159 }
160 }
161 auto verticalStarPixelRest = 0.0f;
162 for (auto i = 0; i < subNodes.size(); i++) {
163 auto guiSubNode = subNodes[i];
164 if (guiSubNode->conditionsMet == false) continue;
165 if (guiSubNode->requestedConstraints.widthType == GUINode_RequestedConstraints_RequestedConstraintsType::STAR) {
166 guiSubNode->requestedConstraints.width = width;
167 guiSubNode->computedConstraints.width = width;
168 }
169 if (guiSubNode->requestedConstraints.heightType == GUINode_RequestedConstraints_RequestedConstraintsType::STAR) {
170 auto nodeStarHeight = (static_cast<float>(height) - static_cast<float>(nodesHeight)) / static_cast<float>(starCount);
171 auto nodeStarHeightInt = static_cast<int>(nodeStarHeight);
172 verticalStarPixelRest += nodeStarHeight - nodeStarHeightInt;
173 if (static_cast<int>(verticalStarPixelRest) > 0) {
174 nodeStarHeightInt += static_cast<int>(verticalStarPixelRest);
175 verticalStarPixelRest -= static_cast<int>(verticalStarPixelRest);
176 }
177 guiSubNode->requestedConstraints.height = nodeStarHeightInt;
178 guiSubNode->computedConstraints.height = nodeStarHeightInt;
179 if (guiSubNode->computedConstraints.height < 0) {
180 guiSubNode->computedConstraints.height = 0;
181 }
182 finalNodesHeight += guiSubNode->computedConstraints.height;
183 if (dynamic_cast<GUIParentNode*>(guiSubNode) != nullptr) {
184 required_dynamic_cast<GUIParentNode*>(guiSubNode)->layoutSubNodes();
185 }
186 }
187 }
189 for (auto i = 0; i < subNodes.size(); i++) {
190 auto guiSubNode = subNodes[i];
191 if (guiSubNode->conditionsMet == false) continue;
192 guiSubNode->computedConstraints.alignmentTop = Math::max(0, border.top + padding.top);
193 }
194 } else
196 for (auto i = 0; i < subNodes.size(); i++) {
197 auto guiSubNode = subNodes[i];
198 if (guiSubNode->conditionsMet == false) continue;
199 guiSubNode->computedConstraints.alignmentTop = Math::max(0, border.top + padding.top + ((height - finalNodesHeight) / 2));
200 }
201 } else
203 for (auto i = 0; i < subNodes.size(); i++) {
204 auto guiSubNode = subNodes[i];
205 if (guiSubNode->conditionsMet == false) continue;
206 guiSubNode->computedConstraints.alignmentTop = Math::max(0, height - finalNodesHeight); // TODO: take bottom padding into account
207 }
208 }
209
211 } else
213 auto starCount = 0;
216 auto nodesWidth = 0;
217 auto finalNodesWidth = 0;
218 for (auto i = 0; i < subNodes.size(); i++) {
219 auto guiSubNode = subNodes[i];
220 if (guiSubNode->conditionsMet == false) continue;
221 if (guiSubNode->flow == GUINode_Flow::FLOATING) {
222 continue;
223 }
224 if (guiSubNode->requestedConstraints.widthType == GUINode_RequestedConstraints_RequestedConstraintsType::STAR) {
225 starCount++;
226 } else {
227 nodesWidth += guiSubNode->computedConstraints.width;
228 finalNodesWidth += guiSubNode->computedConstraints.width;
229 }
230 }
231 auto horizontalStarPixelRest = 0.0f;
232 for (auto i = 0; i < subNodes.size(); i++) {
233 auto guiSubNode = subNodes[i];
234 if (guiSubNode->conditionsMet == false) continue;
235 if (guiSubNode->requestedConstraints.heightType == GUINode_RequestedConstraints_RequestedConstraintsType::STAR) {
236 guiSubNode->requestedConstraints.height = height;
237 guiSubNode->computedConstraints.height = height;
238 }
239 if (guiSubNode->requestedConstraints.widthType == GUINode_RequestedConstraints_RequestedConstraintsType::STAR) {
240 auto nodeStarWidth = (static_cast<float>(width) - static_cast<float>(nodesWidth)) / static_cast<float>(starCount);
241 auto nodeStarWidthInt = static_cast<int>(nodeStarWidth);
242 horizontalStarPixelRest += nodeStarWidth - nodeStarWidthInt;
243 if (static_cast<int>(horizontalStarPixelRest) > 0) {
244 nodeStarWidthInt += static_cast<int>(horizontalStarPixelRest);
245 horizontalStarPixelRest -= static_cast<int>(horizontalStarPixelRest);
246 }
247 guiSubNode->requestedConstraints.width = nodeStarWidthInt;
248 guiSubNode->computedConstraints.width = nodeStarWidthInt;
249 if (guiSubNode->computedConstraints.width < 0) {
250 guiSubNode->computedConstraints.width = 0;
251 }
252 finalNodesWidth += guiSubNode->computedConstraints.width;
253 if (dynamic_cast<GUIParentNode*>(guiSubNode) != nullptr) {
254 required_dynamic_cast<GUIParentNode*>(guiSubNode)->layoutSubNodes();
255 }
256 }
257 }
258
260 for (auto i = 0; i < subNodes.size(); i++) {
261 auto guiSubNode = subNodes[i];
262 if (guiSubNode->conditionsMet == false) continue;
263 guiSubNode->computedConstraints.alignmentLeft = Math::max(0, border.left + padding.left);
264 }
265 } else
267 for (auto i = 0; i < subNodes.size(); i++) {
268 auto guiSubNode = subNodes[i];
269 if (guiSubNode->conditionsMet == false) continue;
270 guiSubNode->computedConstraints.alignmentLeft = Math::max(0, border.left + padding.left + ((width - finalNodesWidth) / 2));
271 }
272 } else
274 for (auto i = 0; i < subNodes.size(); i++) {
275 auto guiSubNode = subNodes[i];
276 if (guiSubNode->conditionsMet == false) continue;
277 guiSubNode->computedConstraints.alignmentLeft = Math::max(0, width - finalNodesWidth); // TODO: take right padding into account
278 }
279 }
280
282 } else {
285 }
286 }
287
288 for (auto i = 0; i < subNodes.size(); i++) {
289 auto guiSubNode = subNodes[i];
290 guiSubNode->computeContentAlignment();
291 }
294}
295
297{
301 for (auto i = 0; i < subNodes.size(); i++) {
302 auto guiSubNode = subNodes[i];
303 if (guiSubNode->conditionsMet == false) continue;
304 guiSubNode->setTop(top);
306 continue;
307 }
308 top += guiSubNode->computedConstraints.height;
309 }
310}
311
313{
317 for (auto i = 0; i < subNodes.size(); i++) {
318 auto guiSubNode = subNodes[i];
319 if (guiSubNode->conditionsMet == false) continue;
320 guiSubNode->setLeft(left);
322 continue;
323 }
324 left += guiSubNode->computedConstraints.width;
325 }
326}
327
329{
330 return GUILayoutNode_Alignment::valueOf(alignment.empty() == false && alignment.length() > 0 ? StringTools::toUpperCase(alignment) : "NONE");
331}
332
GUI module class.
Definition: GUI.h:66
static STATIC_DLL_IMPEXT GUILayoutNode_Alignment * VERTICAL
static GUILayoutNode_Alignment * valueOf(const string &name)
Returns enum object given by name.
static STATIC_DLL_IMPEXT GUILayoutNode_Alignment * HORIZONTAL
const string getNodeType() override
void setTop(int top) override
Set computed top.
static GUILayoutNode_Alignment * createAlignment(const string &alignment)
Create alignment.
void setLeft(int left) override
Set computed left.
GUILayoutNode_Alignment * alignment
Definition: GUILayoutNode.h:29
void layoutSubNodes() override
Layout sub nodes.
GUI element node conditions.
static STATIC_DLL_IMPEXT GUINode_AlignmentHorizontal * RIGHT
static STATIC_DLL_IMPEXT GUINode_AlignmentHorizontal * CENTER
static STATIC_DLL_IMPEXT GUINode_AlignmentHorizontal * LEFT
static STATIC_DLL_IMPEXT GUINode_AlignmentVertical * BOTTOM
static STATIC_DLL_IMPEXT GUINode_AlignmentVertical * CENTER
static STATIC_DLL_IMPEXT GUINode_AlignmentVertical * TOP
static STATIC_DLL_IMPEXT GUINode_Flow * FLOATING
Definition: GUINode_Flow.h:31
static STATIC_DLL_IMPEXT GUINode_RequestedConstraints_RequestedConstraintsType * STAR
static STATIC_DLL_IMPEXT GUINode_RequestedConstraints_RequestedConstraintsType * PIXEL
GUI node base class.
Definition: GUINode.h:63
GUINode_Border border
Definition: GUINode.h:159
virtual void setLeft(int left)
Set computed left.
Definition: GUINode.cpp:177
GUINode_ComputedConstraints computedConstraints
Definition: GUINode.h:151
GUINode_Padding padding
Definition: GUINode.h:158
virtual void setTop(int top)
Set computed top.
Definition: GUINode.cpp:183
GUINode_RequestedConstraints requestedConstraints
Definition: GUINode.h:150
GUINode_Alignments alignments
Definition: GUINode.h:149
GUI parent node base class thats supporting child nodes.
Definition: GUIParentNode.h:43
virtual void computeHorizontalChildrenAlignment()
Compute horizontal children alignment.
virtual void layoutSubNodes()
Layout sub nodes.
vector< GUINode * > subNodes
Definition: GUIParentNode.h:63
virtual void computeVerticalChildrenAlignment()
Compute vertical children alignment.
GUI screen node that represents a screen that can be rendered via GUI system.
Definition: GUIScreenNode.h:57
Standard math functions.
Definition: Math.h:21
String tools class.
Definition: StringTools.h:20
GUINode_AlignmentVertical * vertical
GUINode_AlignmentHorizontal * horizontal
GUI node border entity.
GUI node padding entity.
GUINode_RequestedConstraints_RequestedConstraintsType * topType
GUINode_RequestedConstraints_RequestedConstraintsType * leftType
GUI node scale 9 grid entity.