72 {
73
75 if (subviews->count) {
76
78
80
81 int availableSize, requestedSize = 0;
82 switch (this->axis) {
85 break;
88 break;
89 }
90
91 availableSize -= this->spacing * (subviews->count - 1);
92
94
95 SDL_Size sizes[subviews->count];
96
97 for (size_t i = 0; i < subviews->count; i++) {
98
99 View *subview = $(subviews, objectAtIndex, i);
100
102
103 switch (this->axis) {
105 requestedSize += sizes[i].h;
106 break;
108 requestedSize += sizes[i].w;
109 break;
110 }
111 }
112
113 int numStretch = 0;
114 for (size_t i = 0; i < subviews->count; i++) {
115 const View *subview = $(subviews, objectAtIndex, i);
117 numStretch++;
118 }
119 }
120
122 max(availableSize - requestedSize, 0) : 0;
123
124 int pos = 0;
125
126 const float scale = requestedSize ? availableSize / (float) requestedSize : 1.f;
127
128 for (size_t j = 0; j < subviews->count; j++) {
129
130 const size_t i = this->reversed ? subviews->count - 1 - j : j;
131
132 View *subview = $(subviews, objectAtIndex, i);
133
134 switch (this->axis) {
136 subview->
frame.y = pos;
137 break;
139 subview->
frame.x = pos;
140 break;
141 }
142
143 SDL_Size subviewSize = sizes[i];
144
145 switch (this->axis) {
149 }
150 break;
154 }
155 break;
156 }
157
158
159
160 switch (this->distribution) {
162 break;
163
165 switch (this->axis) {
167 subviewSize.h *= scale;
168 break;
170 subviewSize.w *= scale;
171 break;
172 }
173 break;
174
176 switch (this->axis) {
178 subviewSize.h = max(availableSize / (float) subviews->count, sizes[i].h);
179 break;
181 subviewSize.w = max(availableSize / (float) subviews->count, sizes[i].w);
182 break;
183 }
184 break;
185 }
186
187 const bool stretch = subview->
stretch && remaining;
188 if (stretch) {
189 const int share = --numStretch ? remaining / (numStretch + 1) : remaining;
190 switch (this->axis) {
192 subviewSize.h += share;
193 break;
195 subviewSize.w += share;
196 break;
197 }
198 }
199
201
202 if (stretch) {
203 switch (this->axis) {
205 remaining -= max(subview->
frame.h - sizes[i].h, 0);
206 subviewSize.h = subview->
frame.h;
207 break;
209 remaining -= max(subview->
frame.w - sizes[i].w, 0);
210 subviewSize.w = subview->
frame.w;
211 break;
212 }
213 }
214
215
216
217 switch (this->axis) {
221 subview->
frame.x = 0;
222 break;
225 break;
228 break;
229 }
230 pos += subviewSize.h;
231 break;
235 subview->
frame.y = 0;
236 break;
239 break;
242 break;
243 }
244 pos += subviewSize.w;
245 break;
246 }
247
248 pos += this->spacing;
249 }
250 }
251
252 release(subviews);
253}
static Array * visibleSubviews(const View *self)
@ StackViewDistributionDefault
@ StackViewDistributionFillEqually
@ StackViewDistributionFill
@ StackViewAxisHorizontal
static SDL_Size sizeThatSatisfies(View *self, ViewConstraint width, ViewConstraint height)
static void layoutWithSize(View *self, const SDL_Size *size)
static SDL_Rect bounds(const View *self)
#define ViewAlignmentMaskBottom
#define ViewAlignmentMaskTop
#define ViewAlignmentMaskMiddle
#define MakeConstraint(mode, value)
#define ViewAlignmentMaskHorizontal
#define ViewAlignmentMaskVertical
A constraint offered by an ancestor View to a descendant during View::sizeThatSatisfies.
ViewAlignment alignment
The alignment.
int autoresizingMask
The ViewAutoresizing bitmask.
bool stretch
Whether this View takes a share of the space its StackView leaves along its axis.
SDL_Rect frame
The frame, relative to the superview.