Line | Source Code | Coverage |
---|
1 | /**************************************************************************** | - |
2 | ** | - |
3 | ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). | - |
4 | ** Contact: http://www.qt-project.org/legal | - |
5 | ** | - |
6 | ** This file is part of the QtGui module of the Qt Toolkit. | - |
7 | ** | - |
8 | ** $QT_BEGIN_LICENSE:LGPL$ | - |
9 | ** Commercial License Usage | - |
10 | ** Licensees holding valid commercial Qt licenses may use this file in | - |
11 | ** accordance with the commercial license agreement provided with the | - |
12 | ** Software or, alternatively, in accordance with the terms contained in | - |
13 | ** a written agreement between you and Digia. For licensing terms and | - |
14 | ** conditions see http://qt.digia.com/licensing. For further information | - |
15 | ** use the contact form at http://qt.digia.com/contact-us. | - |
16 | ** | - |
17 | ** GNU Lesser General Public License Usage | - |
18 | ** Alternatively, this file may be used under the terms of the GNU Lesser | - |
19 | ** General Public License version 2.1 as published by the Free Software | - |
20 | ** Foundation and appearing in the file LICENSE.LGPL included in the | - |
21 | ** packaging of this file. Please review the following information to | - |
22 | ** ensure the GNU Lesser General Public License version 2.1 requirements | - |
23 | ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. | - |
24 | ** | - |
25 | ** In addition, as a special exception, Digia gives you certain additional | - |
26 | ** rights. These rights are described in the Digia Qt LGPL Exception | - |
27 | ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. | - |
28 | ** | - |
29 | ** GNU General Public License Usage | - |
30 | ** Alternatively, this file may be used under the terms of the GNU | - |
31 | ** General Public License version 3.0 as published by the Free Software | - |
32 | ** Foundation and appearing in the file LICENSE.GPL included in the | - |
33 | ** packaging of this file. Please review the following information to | - |
34 | ** ensure the GNU General Public License version 3.0 requirements will be | - |
35 | ** met: http://www.gnu.org/copyleft/gpl.html. | - |
36 | ** | - |
37 | ** | - |
38 | ** $QT_END_LICENSE$ | - |
39 | ** | - |
40 | ****************************************************************************/ | - |
41 | | - |
42 | #include "qlayout.h" | - |
43 | #include "private/qlayoutengine_p.h" | - |
44 | | - |
45 | #include "qvector.h" | - |
46 | #include "qwidget.h" | - |
47 | | - |
48 | #include <qlist.h> | - |
49 | #include <qalgorithms.h> | - |
50 | | - |
51 | #include <qdebug.h> | - |
52 | | - |
53 | QT_BEGIN_NAMESPACE | - |
54 | | - |
55 | //#define QLAYOUT_EXTRA_DEBUG | - |
56 | | - |
57 | typedef qint64 Fixed64; | - |
58 | static inline Fixed64 toFixed(int i) { return (Fixed64)i * 256; } executed: return (Fixed64)i * 256; Execution Count:26764 | 26764 |
59 | static inline int fRound(Fixed64 i) { | - |
60 | return (i % 256 < 128) ? i / 256 : 1 + i / 256; executed: return (i % 256 < 128) ? i / 256 : 1 + i / 256; Execution Count:14496 | 14496 |
61 | } | - |
62 | | - |
63 | /* | - |
64 | This is the main workhorse of the QGridLayout. It portions out | - |
65 | available space to the chain's children. | - |
66 | | - |
67 | The calculation is done in fixed point: "fixed" variables are | - |
68 | scaled by a factor of 256. | - |
69 | | - |
70 | If the layout runs "backwards" (i.e. RightToLeft or Up) the layout | - |
71 | is computed mirror-reversed, and it's the caller's responsibility | - |
72 | do reverse the values before use. | - |
73 | | - |
74 | chain contains input and output parameters describing the geometry. | - |
75 | count is the count of items in the chain; pos and space give the | - |
76 | interval (relative to parentWidget topLeft). | - |
77 | */ | - |
78 | void qGeomCalc(QVector<QLayoutStruct> &chain, int start, int count, | - |
79 | int pos, int space, int spacer) | - |
80 | { | - |
81 | int cHint = 0; executed (the execution status of this line is deduced): int cHint = 0; | - |
82 | int cMin = 0; executed (the execution status of this line is deduced): int cMin = 0; | - |
83 | int cMax = 0; executed (the execution status of this line is deduced): int cMax = 0; | - |
84 | int sumStretch = 0; executed (the execution status of this line is deduced): int sumStretch = 0; | - |
85 | int sumSpacing = 0; executed (the execution status of this line is deduced): int sumSpacing = 0; | - |
86 | | - |
87 | bool wannaGrow = false; // anyone who really wants to grow? executed (the execution status of this line is deduced): bool wannaGrow = false; | - |
88 | // bool canShrink = false; // anyone who could be persuaded to shrink? | - |
89 | | - |
90 | bool allEmptyNonstretch = true; executed (the execution status of this line is deduced): bool allEmptyNonstretch = true; | - |
91 | int pendingSpacing = -1; executed (the execution status of this line is deduced): int pendingSpacing = -1; | - |
92 | int spacerCount = 0; executed (the execution status of this line is deduced): int spacerCount = 0; | - |
93 | int i; executed (the execution status of this line is deduced): int i; | - |
94 | | - |
95 | for (i = start; i < start + count; i++) { evaluated: i < start + count yes Evaluation Count:32690 | yes Evaluation Count:11919 |
| 11919-32690 |
96 | QLayoutStruct *data = &chain[i]; executed (the execution status of this line is deduced): QLayoutStruct *data = &chain[i]; | - |
97 | | - |
98 | data->done = false; executed (the execution status of this line is deduced): data->done = false; | - |
99 | cHint += data->smartSizeHint(); executed (the execution status of this line is deduced): cHint += data->smartSizeHint(); | - |
100 | cMin += data->minimumSize; executed (the execution status of this line is deduced): cMin += data->minimumSize; | - |
101 | cMax += data->maximumSize; executed (the execution status of this line is deduced): cMax += data->maximumSize; | - |
102 | sumStretch += data->stretch; executed (the execution status of this line is deduced): sumStretch += data->stretch; | - |
103 | if (!data->empty) { evaluated: !data->empty yes Evaluation Count:24980 | yes Evaluation Count:7710 |
| 7710-24980 |
104 | /* | - |
105 | Using pendingSpacing, we ensure that the spacing for the last | - |
106 | (non-empty) item is ignored. | - |
107 | */ | - |
108 | if (pendingSpacing >= 0) { evaluated: pendingSpacing >= 0 yes Evaluation Count:13665 | yes Evaluation Count:11315 |
| 11315-13665 |
109 | sumSpacing += pendingSpacing; executed (the execution status of this line is deduced): sumSpacing += pendingSpacing; | - |
110 | ++spacerCount; executed (the execution status of this line is deduced): ++spacerCount; | - |
111 | } executed: } Execution Count:13665 | 13665 |
112 | pendingSpacing = data->effectiveSpacer(spacer); executed (the execution status of this line is deduced): pendingSpacing = data->effectiveSpacer(spacer); | - |
113 | } executed: } Execution Count:24980 | 24980 |
114 | wannaGrow = wannaGrow || data->expansive || data->stretch > 0; evaluated: wannaGrow yes Evaluation Count:9327 | yes Evaluation Count:23363 |
evaluated: data->expansive yes Evaluation Count:5747 | yes Evaluation Count:17616 |
evaluated: data->stretch > 0 yes Evaluation Count:225 | yes Evaluation Count:17391 |
| 225-23363 |
115 | allEmptyNonstretch = allEmptyNonstretch && !wannaGrow && data->empty; evaluated: allEmptyNonstretch yes Evaluation Count:15021 | yes Evaluation Count:17669 |
evaluated: !wannaGrow yes Evaluation Count:11118 | yes Evaluation Count:3903 |
evaluated: data->empty yes Evaluation Count:3603 | yes Evaluation Count:7515 |
| 3603-17669 |
116 | } executed: } Execution Count:32690 | 32690 |
117 | | - |
118 | int extraspace = 0; executed (the execution status of this line is deduced): int extraspace = 0; | - |
119 | | - |
120 | if (space < cMin + sumSpacing) { evaluated: space < cMin + sumSpacing yes Evaluation Count:610 | yes Evaluation Count:11309 |
| 610-11309 |
121 | /* | - |
122 | Less space than minimumSize; take from the biggest first | - |
123 | */ | - |
124 | | - |
125 | int minSize = cMin + sumSpacing; executed (the execution status of this line is deduced): int minSize = cMin + sumSpacing; | - |
126 | | - |
127 | // shrink the spacers proportionally | - |
128 | if (spacer >= 0) { evaluated: spacer >= 0 yes Evaluation Count:214 | yes Evaluation Count:396 |
| 214-396 |
129 | spacer = minSize > 0 ? spacer * space / minSize : 0; partially evaluated: minSize > 0 yes Evaluation Count:214 | no Evaluation Count:0 |
| 0-214 |
130 | sumSpacing = spacer * spacerCount; executed (the execution status of this line is deduced): sumSpacing = spacer * spacerCount; | - |
131 | } executed: } Execution Count:214 | 214 |
132 | | - |
133 | QList<int> list; executed (the execution status of this line is deduced): QList<int> list; | - |
134 | | - |
135 | for (i = start; i < start + count; i++) evaluated: i < start + count yes Evaluation Count:1935 | yes Evaluation Count:610 |
| 610-1935 |
136 | list << chain.at(i).minimumSize; executed: list << chain.at(i).minimumSize; Execution Count:1935 | 1935 |
137 | | - |
138 | qSort(list); executed (the execution status of this line is deduced): qSort(list); | - |
139 | | - |
140 | int space_left = space - sumSpacing; executed (the execution status of this line is deduced): int space_left = space - sumSpacing; | - |
141 | | - |
142 | int sum = 0; executed (the execution status of this line is deduced): int sum = 0; | - |
143 | int idx = 0; executed (the execution status of this line is deduced): int idx = 0; | - |
144 | int space_used=0; executed (the execution status of this line is deduced): int space_used=0; | - |
145 | int current = 0; executed (the execution status of this line is deduced): int current = 0; | - |
146 | while (idx < count && space_used < space_left) { evaluated: idx < count yes Evaluation Count:1624 | yes Evaluation Count:218 |
evaluated: space_used < space_left yes Evaluation Count:1232 | yes Evaluation Count:392 |
| 218-1624 |
147 | current = list.at(idx); executed (the execution status of this line is deduced): current = list.at(idx); | - |
148 | space_used = sum + current * (count - idx); executed (the execution status of this line is deduced): space_used = sum + current * (count - idx); | - |
149 | sum += current; executed (the execution status of this line is deduced): sum += current; | - |
150 | ++idx; executed (the execution status of this line is deduced): ++idx; | - |
151 | } executed: } Execution Count:1232 | 1232 |
152 | --idx; executed (the execution status of this line is deduced): --idx; | - |
153 | int deficit = space_used - space_left; executed (the execution status of this line is deduced): int deficit = space_used - space_left; | - |
154 | | - |
155 | int items = count - idx; executed (the execution status of this line is deduced): int items = count - idx; | - |
156 | /* | - |
157 | * If we truncate all items to "current", we would get "deficit" too many pixels. Therefore, we have to remove | - |
158 | * deficit/items from each item bigger than maxval. The actual value to remove is deficitPerItem + remainder/items | - |
159 | * "rest" is the accumulated error from using integer arithmetic. | - |
160 | */ | - |
161 | int deficitPerItem = deficit/items; executed (the execution status of this line is deduced): int deficitPerItem = deficit/items; | - |
162 | int remainder = deficit % items; executed (the execution status of this line is deduced): int remainder = deficit % items; | - |
163 | int maxval = current - deficitPerItem; executed (the execution status of this line is deduced): int maxval = current - deficitPerItem; | - |
164 | | - |
165 | int rest = 0; executed (the execution status of this line is deduced): int rest = 0; | - |
166 | for (i = start; i < start + count; i++) { evaluated: i < start + count yes Evaluation Count:1935 | yes Evaluation Count:610 |
| 610-1935 |
167 | int maxv = maxval; executed (the execution status of this line is deduced): int maxv = maxval; | - |
168 | rest += remainder; executed (the execution status of this line is deduced): rest += remainder; | - |
169 | if (rest >= items) { evaluated: rest >= items yes Evaluation Count:242 | yes Evaluation Count:1693 |
| 242-1693 |
170 | maxv--; executed (the execution status of this line is deduced): maxv--; | - |
171 | rest-=items; executed (the execution status of this line is deduced): rest-=items; | - |
172 | } executed: } Execution Count:242 | 242 |
173 | QLayoutStruct *data = &chain[i]; executed (the execution status of this line is deduced): QLayoutStruct *data = &chain[i]; | - |
174 | data->size = qMin(data->minimumSize, maxv); executed (the execution status of this line is deduced): data->size = qMin(data->minimumSize, maxv); | - |
175 | data->done = true; executed (the execution status of this line is deduced): data->done = true; | - |
176 | } executed: } Execution Count:1935 | 1935 |
177 | } else if (space < cHint + sumSpacing) { executed: } Execution Count:610 evaluated: space < cHint + sumSpacing yes Evaluation Count:140 | yes Evaluation Count:11169 |
| 140-11169 |
178 | /* | - |
179 | Less space than smartSizeHint(), but more than minimumSize. | - |
180 | Currently take space equally from each, as in Qt 2.x. | - |
181 | Commented-out lines will give more space to stretchier | - |
182 | items. | - |
183 | */ | - |
184 | int n = count; executed (the execution status of this line is deduced): int n = count; | - |
185 | int space_left = space - sumSpacing; executed (the execution status of this line is deduced): int space_left = space - sumSpacing; | - |
186 | int overdraft = cHint - space_left; executed (the execution status of this line is deduced): int overdraft = cHint - space_left; | - |
187 | | - |
188 | // first give to the fixed ones: | - |
189 | for (i = start; i < start + count; i++) { evaluated: i < start + count yes Evaluation Count:491 | yes Evaluation Count:140 |
| 140-491 |
190 | QLayoutStruct *data = &chain[i]; executed (the execution status of this line is deduced): QLayoutStruct *data = &chain[i]; | - |
191 | if (!data->done partially evaluated: !data->done yes Evaluation Count:491 | no Evaluation Count:0 |
| 0-491 |
192 | && data->minimumSize >= data->smartSizeHint()) { evaluated: data->minimumSize >= data->smartSizeHint() yes Evaluation Count:259 | yes Evaluation Count:232 |
| 232-259 |
193 | data->size = data->smartSizeHint(); executed (the execution status of this line is deduced): data->size = data->smartSizeHint(); | - |
194 | data->done = true; executed (the execution status of this line is deduced): data->done = true; | - |
195 | space_left -= data->smartSizeHint(); executed (the execution status of this line is deduced): space_left -= data->smartSizeHint(); | - |
196 | // sumStretch -= data->stretch; | - |
197 | n--; executed (the execution status of this line is deduced): n--; | - |
198 | } executed: } Execution Count:259 | 259 |
199 | } executed: } Execution Count:491 | 491 |
200 | bool finished = n == 0; executed (the execution status of this line is deduced): bool finished = n == 0; | - |
201 | while (!finished) { evaluated: !finished yes Evaluation Count:164 | yes Evaluation Count:140 |
| 140-164 |
202 | finished = true; executed (the execution status of this line is deduced): finished = true; | - |
203 | Fixed64 fp_over = toFixed(overdraft); executed (the execution status of this line is deduced): Fixed64 fp_over = toFixed(overdraft); | - |
204 | Fixed64 fp_w = 0; executed (the execution status of this line is deduced): Fixed64 fp_w = 0; | - |
205 | | - |
206 | for (i = start; i < start+count; i++) { evaluated: i < start+count yes Evaluation Count:697 | yes Evaluation Count:140 |
| 140-697 |
207 | QLayoutStruct *data = &chain[i]; executed (the execution status of this line is deduced): QLayoutStruct *data = &chain[i]; | - |
208 | if (data->done) evaluated: data->done yes Evaluation Count:416 | yes Evaluation Count:281 |
| 281-416 |
209 | continue; executed: continue; Execution Count:416 | 416 |
210 | // if (sumStretch <= 0) | - |
211 | fp_w += fp_over / n; executed (the execution status of this line is deduced): fp_w += fp_over / n; | - |
212 | // else | - |
213 | // fp_w += (fp_over * data->stretch) / sumStretch; | - |
214 | int w = fRound(fp_w); executed (the execution status of this line is deduced): int w = fRound(fp_w); | - |
215 | data->size = data->smartSizeHint() - w; executed (the execution status of this line is deduced): data->size = data->smartSizeHint() - w; | - |
216 | fp_w -= toFixed(w); // give the difference to the next executed (the execution status of this line is deduced): fp_w -= toFixed(w); | - |
217 | if (data->size < data->minimumSize) { evaluated: data->size < data->minimumSize yes Evaluation Count:24 | yes Evaluation Count:257 |
| 24-257 |
218 | data->done = true; executed (the execution status of this line is deduced): data->done = true; | - |
219 | data->size = data->minimumSize; executed (the execution status of this line is deduced): data->size = data->minimumSize; | - |
220 | finished = false; executed (the execution status of this line is deduced): finished = false; | - |
221 | overdraft -= data->smartSizeHint() - data->minimumSize; executed (the execution status of this line is deduced): overdraft -= data->smartSizeHint() - data->minimumSize; | - |
222 | // sumStretch -= data->stretch; | - |
223 | n--; executed (the execution status of this line is deduced): n--; | - |
224 | break; executed: break; Execution Count:24 | 24 |
225 | } | - |
226 | } executed: } Execution Count:257 | 257 |
227 | } executed: } Execution Count:164 | 164 |
228 | } else { // extra space executed: } Execution Count:140 | 140 |
229 | int n = count; executed (the execution status of this line is deduced): int n = count; | - |
230 | int space_left = space - sumSpacing; executed (the execution status of this line is deduced): int space_left = space - sumSpacing; | - |
231 | // first give to the fixed ones, and handle non-expansiveness | - |
232 | for (i = start; i < start + count; i++) { evaluated: i < start + count yes Evaluation Count:30264 | yes Evaluation Count:11169 |
| 11169-30264 |
233 | QLayoutStruct *data = &chain[i]; executed (the execution status of this line is deduced): QLayoutStruct *data = &chain[i]; | - |
234 | if (!data->done partially evaluated: !data->done yes Evaluation Count:30264 | no Evaluation Count:0 |
| 0-30264 |
235 | && (data->maximumSize <= data->smartSizeHint() evaluated: data->maximumSize <= data->smartSizeHint() yes Evaluation Count:12507 | yes Evaluation Count:17757 |
| 12507-17757 |
236 | || (wannaGrow && !data->expansive && data->stretch == 0) evaluated: wannaGrow yes Evaluation Count:10827 | yes Evaluation Count:6930 |
evaluated: !data->expansive yes Evaluation Count:4098 | yes Evaluation Count:6729 |
evaluated: data->stretch == 0 yes Evaluation Count:3873 | yes Evaluation Count:225 |
| 225-10827 |
237 | || (!allEmptyNonstretch && data->empty && evaluated: !allEmptyNonstretch yes Evaluation Count:13510 | yes Evaluation Count:374 |
evaluated: data->empty yes Evaluation Count:1870 | yes Evaluation Count:11640 |
| 374-13510 |
238 | !data->expansive && data->stretch == 0))) { evaluated: !data->expansive yes Evaluation Count:683 | yes Evaluation Count:1187 |
partially evaluated: data->stretch == 0 yes Evaluation Count:683 | no Evaluation Count:0 |
| 0-1187 |
239 | data->size = data->smartSizeHint(); executed (the execution status of this line is deduced): data->size = data->smartSizeHint(); | - |
240 | data->done = true; executed (the execution status of this line is deduced): data->done = true; | - |
241 | space_left -= data->size; executed (the execution status of this line is deduced): space_left -= data->size; | - |
242 | sumStretch -= data->stretch; executed (the execution status of this line is deduced): sumStretch -= data->stretch; | - |
243 | n--; executed (the execution status of this line is deduced): n--; | - |
244 | } executed: } Execution Count:17063 | 17063 |
245 | } executed: } Execution Count:30264 | 30264 |
246 | extraspace = space_left; executed (the execution status of this line is deduced): extraspace = space_left; | - |
247 | | - |
248 | /* | - |
249 | Do a trial distribution and calculate how much it is off. | - |
250 | If there are more deficit pixels than surplus pixels, give | - |
251 | the minimum size items what they need, and repeat. | - |
252 | Otherwise give to the maximum size items, and repeat. | - |
253 | | - |
254 | Paul Olav Tvete has a wonderful mathematical proof of the | - |
255 | correctness of this principle, but unfortunately this | - |
256 | comment is too small to contain it. | - |
257 | */ | - |
258 | int surplus, deficit; executed (the execution status of this line is deduced): int surplus, deficit; | - |
259 | do { | - |
260 | surplus = deficit = 0; executed (the execution status of this line is deduced): surplus = deficit = 0; | - |
261 | Fixed64 fp_space = toFixed(space_left); executed (the execution status of this line is deduced): Fixed64 fp_space = toFixed(space_left); | - |
262 | Fixed64 fp_w = 0; executed (the execution status of this line is deduced): Fixed64 fp_w = 0; | - |
263 | for (i = start; i < start + count; i++) { evaluated: i < start + count yes Evaluation Count:32997 | yes Evaluation Count:12104 |
| 12104-32997 |
264 | QLayoutStruct *data = &chain[i]; executed (the execution status of this line is deduced): QLayoutStruct *data = &chain[i]; | - |
265 | if (data->done) evaluated: data->done yes Evaluation Count:18782 | yes Evaluation Count:14215 |
| 14215-18782 |
266 | continue; executed: continue; Execution Count:18782 | 18782 |
267 | extraspace = 0; executed (the execution status of this line is deduced): extraspace = 0; | - |
268 | if (sumStretch <= 0) evaluated: sumStretch <= 0 yes Evaluation Count:9613 | yes Evaluation Count:4602 |
| 4602-9613 |
269 | fp_w += fp_space / n; executed: fp_w += fp_space / n; Execution Count:9613 | 9613 |
270 | else | - |
271 | fp_w += (fp_space * data->stretch) / sumStretch; executed: fp_w += (fp_space * data->stretch) / sumStretch; Execution Count:4602 | 4602 |
272 | int w = fRound(fp_w); executed (the execution status of this line is deduced): int w = fRound(fp_w); | - |
273 | data->size = w; executed (the execution status of this line is deduced): data->size = w; | - |
274 | fp_w -= toFixed(w); // give the difference to the next executed (the execution status of this line is deduced): fp_w -= toFixed(w); | - |
275 | if (w < data->smartSizeHint()) { evaluated: w < data->smartSizeHint() yes Evaluation Count:782 | yes Evaluation Count:13433 |
| 782-13433 |
276 | deficit += data->smartSizeHint() - w; executed (the execution status of this line is deduced): deficit += data->smartSizeHint() - w; | - |
277 | } else if (w > data->maximumSize) { executed: } Execution Count:782 evaluated: w > data->maximumSize yes Evaluation Count:308 | yes Evaluation Count:13125 |
| 308-13125 |
278 | surplus += w - data->maximumSize; executed (the execution status of this line is deduced): surplus += w - data->maximumSize; | - |
279 | } executed: } Execution Count:308 | 308 |
280 | } | - |
281 | if (deficit > 0 && surplus <= deficit) { evaluated: deficit > 0 yes Evaluation Count:627 | yes Evaluation Count:11477 |
partially evaluated: surplus <= deficit yes Evaluation Count:627 | no Evaluation Count:0 |
| 0-11477 |
282 | // give to the ones that have too little | - |
283 | for (i = start; i < start+count; i++) { evaluated: i < start+count yes Evaluation Count:2117 | yes Evaluation Count:627 |
| 627-2117 |
284 | QLayoutStruct *data = &chain[i]; executed (the execution status of this line is deduced): QLayoutStruct *data = &chain[i]; | - |
285 | if (!data->done && data->size < data->smartSizeHint()) { evaluated: !data->done yes Evaluation Count:1488 | yes Evaluation Count:629 |
evaluated: data->size < data->smartSizeHint() yes Evaluation Count:782 | yes Evaluation Count:706 |
| 629-1488 |
286 | data->size = data->smartSizeHint(); executed (the execution status of this line is deduced): data->size = data->smartSizeHint(); | - |
287 | data->done = true; executed (the execution status of this line is deduced): data->done = true; | - |
288 | space_left -= data->smartSizeHint(); executed (the execution status of this line is deduced): space_left -= data->smartSizeHint(); | - |
289 | sumStretch -= data->stretch; executed (the execution status of this line is deduced): sumStretch -= data->stretch; | - |
290 | n--; executed (the execution status of this line is deduced): n--; | - |
291 | } executed: } Execution Count:782 | 782 |
292 | } executed: } Execution Count:2117 | 2117 |
293 | } executed: } Execution Count:627 | 627 |
294 | if (surplus > 0 && surplus >= deficit) { evaluated: surplus > 0 yes Evaluation Count:308 | yes Evaluation Count:11796 |
partially evaluated: surplus >= deficit yes Evaluation Count:308 | no Evaluation Count:0 |
| 0-11796 |
295 | // take from the ones that have too much | - |
296 | for (i = start; i < start + count; i++) { evaluated: i < start + count yes Evaluation Count:616 | yes Evaluation Count:308 |
| 308-616 |
297 | QLayoutStruct *data = &chain[i]; executed (the execution status of this line is deduced): QLayoutStruct *data = &chain[i]; | - |
298 | if (!data->done && data->size > data->maximumSize) { partially evaluated: !data->done yes Evaluation Count:616 | no Evaluation Count:0 |
evaluated: data->size > data->maximumSize yes Evaluation Count:308 | yes Evaluation Count:308 |
| 0-616 |
299 | data->size = data->maximumSize; executed (the execution status of this line is deduced): data->size = data->maximumSize; | - |
300 | data->done = true; executed (the execution status of this line is deduced): data->done = true; | - |
301 | space_left -= data->maximumSize; executed (the execution status of this line is deduced): space_left -= data->maximumSize; | - |
302 | sumStretch -= data->stretch; executed (the execution status of this line is deduced): sumStretch -= data->stretch; | - |
303 | n--; executed (the execution status of this line is deduced): n--; | - |
304 | } executed: } Execution Count:308 | 308 |
305 | } executed: } Execution Count:616 | 616 |
306 | } executed: } Execution Count:308 | 308 |
307 | } while (n > 0 && surplus != deficit); executed: } Execution Count:12104 evaluated: n > 0 yes Evaluation Count:10934 | yes Evaluation Count:1170 |
evaluated: surplus != deficit yes Evaluation Count:935 | yes Evaluation Count:9999 |
| 935-12104 |
308 | if (n == 0) evaluated: n == 0 yes Evaluation Count:1170 | yes Evaluation Count:9999 |
| 1170-9999 |
309 | extraspace = space_left; executed: extraspace = space_left; Execution Count:1170 | 1170 |
310 | } executed: } Execution Count:11169 | 11169 |
311 | | - |
312 | /* | - |
313 | As a last resort, we distribute the unwanted space equally | - |
314 | among the spacers (counting the start and end of the chain). We | - |
315 | could, but don't, attempt a sub-pixel allocation of the extra | - |
316 | space. | - |
317 | */ | - |
318 | int extra = extraspace / (spacerCount + 2); executed (the execution status of this line is deduced): int extra = extraspace / (spacerCount + 2); | - |
319 | int p = pos + extra; executed (the execution status of this line is deduced): int p = pos + extra; | - |
320 | for (i = start; i < start+count; i++) { evaluated: i < start+count yes Evaluation Count:32690 | yes Evaluation Count:11919 |
| 11919-32690 |
321 | QLayoutStruct *data = &chain[i]; executed (the execution status of this line is deduced): QLayoutStruct *data = &chain[i]; | - |
322 | data->pos = p; executed (the execution status of this line is deduced): data->pos = p; | - |
323 | p += data->size; executed (the execution status of this line is deduced): p += data->size; | - |
324 | if (!data->empty) evaluated: !data->empty yes Evaluation Count:24980 | yes Evaluation Count:7710 |
| 7710-24980 |
325 | p += data->effectiveSpacer(spacer) + extra; executed: p += data->effectiveSpacer(spacer) + extra; Execution Count:24980 | 24980 |
326 | } executed: } Execution Count:32690 | 32690 |
327 | | - |
328 | #ifdef QLAYOUT_EXTRA_DEBUG | - |
329 | qDebug() << "qGeomCalc" << "start" << start << "count" << count << "pos" << pos | - |
330 | << "space" << space << "spacer" << spacer; | - |
331 | for (i = start; i < start + count; ++i) { | - |
332 | qDebug() << i << ':' << chain[i].minimumSize << chain[i].smartSizeHint() | - |
333 | << chain[i].maximumSize << "stretch" << chain[i].stretch | - |
334 | << "empty" << chain[i].empty << "expansive" << chain[i].expansive | - |
335 | << "spacing" << chain[i].spacing; | - |
336 | qDebug() << "result pos" << chain[i].pos << "size" << chain[i].size; | - |
337 | } | - |
338 | #endif | - |
339 | } executed: } Execution Count:11919 | 11919 |
340 | | - |
341 | Q_WIDGETS_EXPORT QSize qSmartMinSize(const QSize &sizeHint, const QSize &minSizeHint, | - |
342 | const QSize &minSize, const QSize &maxSize, | - |
343 | const QSizePolicy &sizePolicy) | - |
344 | { | - |
345 | QSize s(0, 0); executed (the execution status of this line is deduced): QSize s(0, 0); | - |
346 | | - |
347 | if (sizePolicy.horizontalPolicy() != QSizePolicy::Ignored) { evaluated: sizePolicy.horizontalPolicy() != QSizePolicy::Ignored yes Evaluation Count:23216 | yes Evaluation Count:250 |
| 250-23216 |
348 | if (sizePolicy.horizontalPolicy() & QSizePolicy::ShrinkFlag) evaluated: sizePolicy.horizontalPolicy() & QSizePolicy::ShrinkFlag yes Evaluation Count:17248 | yes Evaluation Count:5968 |
| 5968-17248 |
349 | s.setWidth(minSizeHint.width()); executed: s.setWidth(minSizeHint.width()); Execution Count:17248 | 17248 |
350 | else | - |
351 | s.setWidth(qMax(sizeHint.width(), minSizeHint.width())); executed: s.setWidth(qMax(sizeHint.width(), minSizeHint.width())); Execution Count:5968 | 5968 |
352 | } | - |
353 | | - |
354 | if (sizePolicy.verticalPolicy() != QSizePolicy::Ignored) { evaluated: sizePolicy.verticalPolicy() != QSizePolicy::Ignored yes Evaluation Count:23450 | yes Evaluation Count:16 |
| 16-23450 |
355 | if (sizePolicy.verticalPolicy() & QSizePolicy::ShrinkFlag) { evaluated: sizePolicy.verticalPolicy() & QSizePolicy::ShrinkFlag yes Evaluation Count:16733 | yes Evaluation Count:6717 |
| 6717-16733 |
356 | s.setHeight(minSizeHint.height()); executed (the execution status of this line is deduced): s.setHeight(minSizeHint.height()); | - |
357 | } else { executed: } Execution Count:16733 | 16733 |
358 | s.setHeight(qMax(sizeHint.height(), minSizeHint.height())); executed (the execution status of this line is deduced): s.setHeight(qMax(sizeHint.height(), minSizeHint.height())); | - |
359 | } executed: } Execution Count:6717 | 6717 |
360 | } | - |
361 | | - |
362 | s = s.boundedTo(maxSize); executed (the execution status of this line is deduced): s = s.boundedTo(maxSize); | - |
363 | if (minSize.width() > 0) evaluated: minSize.width() > 0 yes Evaluation Count:5456 | yes Evaluation Count:18010 |
| 5456-18010 |
364 | s.setWidth(minSize.width()); executed: s.setWidth(minSize.width()); Execution Count:5456 | 5456 |
365 | if (minSize.height() > 0) evaluated: minSize.height() > 0 yes Evaluation Count:1421 | yes Evaluation Count:22045 |
| 1421-22045 |
366 | s.setHeight(minSize.height()); executed: s.setHeight(minSize.height()); Execution Count:1421 | 1421 |
367 | | - |
368 | return s.expandedTo(QSize(0,0)); executed: return s.expandedTo(QSize(0,0)); Execution Count:23466 | 23466 |
369 | } | - |
370 | | - |
371 | Q_WIDGETS_EXPORT QSize qSmartMinSize(const QWidgetItem *i) | - |
372 | { | - |
373 | QWidget *w = ((QWidgetItem *)i)->widget(); executed (the execution status of this line is deduced): QWidget *w = ((QWidgetItem *)i)->widget(); | - |
374 | return qSmartMinSize(w->sizeHint(), w->minimumSizeHint(), executed: return qSmartMinSize(w->sizeHint(), w->minimumSizeHint(), w->minimumSize(), w->maximumSize(), w->sizePolicy()); Execution Count:55 | 55 |
375 | w->minimumSize(), w->maximumSize(), executed: return qSmartMinSize(w->sizeHint(), w->minimumSizeHint(), w->minimumSize(), w->maximumSize(), w->sizePolicy()); Execution Count:55 | 55 |
376 | w->sizePolicy()); executed: return qSmartMinSize(w->sizeHint(), w->minimumSizeHint(), w->minimumSize(), w->maximumSize(), w->sizePolicy()); Execution Count:55 | 55 |
377 | } | - |
378 | | - |
379 | Q_WIDGETS_EXPORT QSize qSmartMinSize(const QWidget *w) | - |
380 | { | - |
381 | return qSmartMinSize(w->sizeHint(), w->minimumSizeHint(), executed: return qSmartMinSize(w->sizeHint(), w->minimumSizeHint(), w->minimumSize(), w->maximumSize(), w->sizePolicy()); Execution Count:13336 | 13336 |
382 | w->minimumSize(), w->maximumSize(), executed: return qSmartMinSize(w->sizeHint(), w->minimumSizeHint(), w->minimumSize(), w->maximumSize(), w->sizePolicy()); Execution Count:13336 | 13336 |
383 | w->sizePolicy()); executed: return qSmartMinSize(w->sizeHint(), w->minimumSizeHint(), w->minimumSize(), w->maximumSize(), w->sizePolicy()); Execution Count:13336 | 13336 |
384 | } | - |
385 | | - |
386 | Q_WIDGETS_EXPORT QSize qSmartMaxSize(const QSize &sizeHint, | - |
387 | const QSize &minSize, const QSize &maxSize, | - |
388 | const QSizePolicy &sizePolicy, Qt::Alignment align) | - |
389 | { | - |
390 | if (align & Qt::AlignHorizontal_Mask && align & Qt::AlignVertical_Mask) evaluated: align & Qt::AlignHorizontal_Mask yes Evaluation Count:1368 | yes Evaluation Count:10633 |
evaluated: align & Qt::AlignVertical_Mask yes Evaluation Count:18 | yes Evaluation Count:1350 |
| 18-10633 |
391 | return QSize(QLAYOUTSIZE_MAX, QLAYOUTSIZE_MAX); executed: return QSize(QLAYOUTSIZE_MAX, QLAYOUTSIZE_MAX); Execution Count:18 | 18 |
392 | QSize s = maxSize; executed (the execution status of this line is deduced): QSize s = maxSize; | - |
393 | QSize hint = sizeHint.expandedTo(minSize); executed (the execution status of this line is deduced): QSize hint = sizeHint.expandedTo(minSize); | - |
394 | if (s.width() == QWIDGETSIZE_MAX && !(align & Qt::AlignHorizontal_Mask)) evaluated: s.width() == ((1<<24)-1) yes Evaluation Count:9395 | yes Evaluation Count:2588 |
evaluated: !(align & Qt::AlignHorizontal_Mask) yes Evaluation Count:9053 | yes Evaluation Count:342 |
| 342-9395 |
395 | if (!(sizePolicy.horizontalPolicy() & QSizePolicy::GrowFlag)) evaluated: !(sizePolicy.horizontalPolicy() & QSizePolicy::GrowFlag) yes Evaluation Count:1717 | yes Evaluation Count:7336 |
| 1717-7336 |
396 | s.setWidth(hint.width()); executed: s.setWidth(hint.width()); Execution Count:1717 | 1717 |
397 | | - |
398 | if (s.height() == QWIDGETSIZE_MAX && !(align & Qt::AlignVertical_Mask)) evaluated: s.height() == ((1<<24)-1) yes Evaluation Count:8824 | yes Evaluation Count:3159 |
evaluated: !(align & Qt::AlignVertical_Mask) yes Evaluation Count:8769 | yes Evaluation Count:55 |
| 55-8824 |
399 | if (!(sizePolicy.verticalPolicy() & QSizePolicy::GrowFlag)) evaluated: !(sizePolicy.verticalPolicy() & QSizePolicy::GrowFlag) yes Evaluation Count:4134 | yes Evaluation Count:4635 |
| 4134-4635 |
400 | s.setHeight(hint.height()); executed: s.setHeight(hint.height()); Execution Count:4134 | 4134 |
401 | | - |
402 | if (align & Qt::AlignHorizontal_Mask) evaluated: align & Qt::AlignHorizontal_Mask yes Evaluation Count:1350 | yes Evaluation Count:10633 |
| 1350-10633 |
403 | s.setWidth(QLAYOUTSIZE_MAX); executed: s.setWidth(QLAYOUTSIZE_MAX); Execution Count:1350 | 1350 |
404 | if (align & Qt::AlignVertical_Mask) evaluated: align & Qt::AlignVertical_Mask yes Evaluation Count:55 | yes Evaluation Count:11928 |
| 55-11928 |
405 | s.setHeight(QLAYOUTSIZE_MAX); executed: s.setHeight(QLAYOUTSIZE_MAX); Execution Count:55 | 55 |
406 | return s; executed: return s; Execution Count:11983 | 11983 |
407 | } | - |
408 | | - |
409 | Q_WIDGETS_EXPORT QSize qSmartMaxSize(const QWidgetItem *i, Qt::Alignment align) | - |
410 | { | - |
411 | QWidget *w = ((QWidgetItem*)i)->widget(); executed (the execution status of this line is deduced): QWidget *w = ((QWidgetItem*)i)->widget(); | - |
412 | | - |
413 | return qSmartMaxSize(w->sizeHint().expandedTo(w->minimumSizeHint()), w->minimumSize(), w->maximumSize(), executed: return qSmartMaxSize(w->sizeHint().expandedTo(w->minimumSizeHint()), w->minimumSize(), w->maximumSize(), w->sizePolicy(), align); Execution Count:56 | 56 |
414 | w->sizePolicy(), align); executed: return qSmartMaxSize(w->sizeHint().expandedTo(w->minimumSizeHint()), w->minimumSize(), w->maximumSize(), w->sizePolicy(), align); Execution Count:56 | 56 |
415 | } | - |
416 | | - |
417 | Q_WIDGETS_EXPORT QSize qSmartMaxSize(const QWidget *w, Qt::Alignment align) | - |
418 | { | - |
419 | return qSmartMaxSize(w->sizeHint().expandedTo(w->minimumSizeHint()), w->minimumSize(), w->maximumSize(), executed: return qSmartMaxSize(w->sizeHint().expandedTo(w->minimumSizeHint()), w->minimumSize(), w->maximumSize(), w->sizePolicy(), align); Execution Count:78 | 78 |
420 | w->sizePolicy(), align); executed: return qSmartMaxSize(w->sizeHint().expandedTo(w->minimumSizeHint()), w->minimumSize(), w->maximumSize(), w->sizePolicy(), align); Execution Count:78 | 78 |
421 | } | - |
422 | | - |
423 | Q_WIDGETS_EXPORT int qSmartSpacing(const QLayout *layout, QStyle::PixelMetric pm) | - |
424 | { | - |
425 | QObject *parent = layout->parent(); executed (the execution status of this line is deduced): QObject *parent = layout->parent(); | - |
426 | if (!parent) { partially evaluated: !parent no Evaluation Count:0 | yes Evaluation Count:8555 |
| 0-8555 |
427 | return -1; never executed: return -1; | 0 |
428 | } else if (parent->isWidgetType()) { evaluated: parent->isWidgetType() yes Evaluation Count:7876 | yes Evaluation Count:679 |
| 679-7876 |
429 | QWidget *pw = static_cast<QWidget *>(parent); executed (the execution status of this line is deduced): QWidget *pw = static_cast<QWidget *>(parent); | - |
430 | return pw->style()->pixelMetric(pm, 0, pw); executed: return pw->style()->pixelMetric(pm, 0, pw); Execution Count:7876 | 7876 |
431 | } else { | - |
432 | return static_cast<QLayout *>(parent)->spacing(); executed: return static_cast<QLayout *>(parent)->spacing(); Execution Count:679 | 679 |
433 | } | - |
434 | } | - |
435 | | - |
436 | QT_END_NAMESPACE | - |
437 | | - |
| | |