OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 import 'dart:math' as math; | 5 import 'dart:math' as math; |
6 import 'dart:sky' as sky; | 6 import 'dart:sky' as sky; |
7 import 'dart:sky' show Point, Size, Rect, Color, Paint, Path; | 7 import 'dart:sky' show Point, Size, Rect, Color, Paint, Path; |
8 | 8 |
9 import '../base/hit_test.dart'; | 9 import '../base/hit_test.dart'; |
10 import '../base/node.dart'; | 10 import '../base/node.dart'; |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
73 assert(child.parentData != null); | 73 assert(child.parentData != null); |
74 child.parentData.detach(); | 74 child.parentData.detach(); |
75 child._cleanRelayoutSubtreeRoot(); | 75 child._cleanRelayoutSubtreeRoot(); |
76 super.dropChild(child); | 76 super.dropChild(child); |
77 markNeedsLayout(); | 77 markNeedsLayout(); |
78 } | 78 } |
79 | 79 |
80 static List<RenderObject> _nodesNeedingLayout = new List<RenderObject>(); | 80 static List<RenderObject> _nodesNeedingLayout = new List<RenderObject>(); |
81 static bool _debugDoingLayout = false; | 81 static bool _debugDoingLayout = false; |
82 static bool get debugDoingLayout => _debugDoingLayout; | 82 static bool get debugDoingLayout => _debugDoingLayout; |
| 83 bool _debugDoingThisResize = false; |
| 84 bool get debugDoingThisResize => _debugDoingThisResize; |
| 85 bool _debugDoingThisLayout = false; |
| 86 bool get debugDoingThisLayout => _debugDoingThisLayout; |
| 87 static RenderObject _debugActiveLayout = null; |
| 88 static RenderObject get debugActiveLayout => _debugActiveLayout; |
| 89 bool _debugCanParentUseSize; |
| 90 bool get debugCanParentUseSize => _debugCanParentUseSize; |
83 bool _needsLayout = true; | 91 bool _needsLayout = true; |
84 bool get needsLayout => _needsLayout; | 92 bool get needsLayout => _needsLayout; |
85 RenderObject _relayoutSubtreeRoot; | 93 RenderObject _relayoutSubtreeRoot; |
86 Constraints _constraints; | 94 Constraints _constraints; |
87 Constraints get constraints => _constraints; | 95 Constraints get constraints => _constraints; |
| 96 bool debugDoesMeetConstraints(); // override this in a subclass to verify that
your state matches the constraints object |
88 bool debugAncestorsAlreadyMarkedNeedsLayout() { | 97 bool debugAncestorsAlreadyMarkedNeedsLayout() { |
89 if (_relayoutSubtreeRoot == null) | 98 if (_relayoutSubtreeRoot == null) |
90 return true; // we haven't yet done layout even once, so there's nothing f
or us to do | 99 return true; // we haven't yet done layout even once, so there's nothing f
or us to do |
91 RenderObject node = this; | 100 RenderObject node = this; |
92 while (node != _relayoutSubtreeRoot) { | 101 while (node != _relayoutSubtreeRoot) { |
93 assert(node._relayoutSubtreeRoot == _relayoutSubtreeRoot); | 102 assert(node._relayoutSubtreeRoot == _relayoutSubtreeRoot); |
94 assert(node.parent != null); | 103 assert(node.parent != null); |
95 node = node.parent as RenderObject; | 104 node = node.parent as RenderObject; |
96 if (!node._needsLayout) | 105 if (!node._needsLayout) |
97 return false; | 106 return false; |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
145 node.layoutWithoutResize(); | 154 node.layoutWithoutResize(); |
146 }); | 155 }); |
147 } finally { | 156 } finally { |
148 _debugDoingLayout = false; | 157 _debugDoingLayout = false; |
149 sky.tracing.end('RenderObject.flushLayout'); | 158 sky.tracing.end('RenderObject.flushLayout'); |
150 } | 159 } |
151 } | 160 } |
152 void layoutWithoutResize() { | 161 void layoutWithoutResize() { |
153 try { | 162 try { |
154 assert(_relayoutSubtreeRoot == this); | 163 assert(_relayoutSubtreeRoot == this); |
| 164 _debugCanParentUseSize = false; |
| 165 _debugDoingThisLayout = true; |
| 166 RenderObject debugPreviousActiveLayout = _debugActiveLayout; |
| 167 _debugActiveLayout = this; |
155 performLayout(); | 168 performLayout(); |
| 169 _debugActiveLayout = debugPreviousActiveLayout; |
| 170 _debugDoingThisLayout = false; |
| 171 _debugCanParentUseSize = null; |
156 } catch (e, stack) { | 172 } catch (e, stack) { |
157 print('Exception raised during layout of ${this}: ${e}'); | 173 print('Exception raised during layout of ${this}: ${e}'); |
158 print(stack); | 174 print(stack); |
159 return; | 175 return; |
160 } | 176 } |
161 _needsLayout = false; | 177 _needsLayout = false; |
162 } | 178 } |
163 void layout(Constraints constraints, { bool parentUsesSize: false }) { | 179 void layout(Constraints constraints, { bool parentUsesSize: false }) { |
164 final parent = this.parent; // TODO(ianh): Remove this once the analyzer is
cleverer | 180 final parent = this.parent; // TODO(ianh): Remove this once the analyzer is
cleverer |
165 RenderObject relayoutSubtreeRoot; | 181 RenderObject relayoutSubtreeRoot; |
166 if (!parentUsesSize || sizedByParent || constraints.isTight || parent is! Re
nderObject) | 182 if (!parentUsesSize || sizedByParent || constraints.isTight || parent is! Re
nderObject) |
167 relayoutSubtreeRoot = this; | 183 relayoutSubtreeRoot = this; |
168 else | 184 else |
169 relayoutSubtreeRoot = parent._relayoutSubtreeRoot; | 185 relayoutSubtreeRoot = parent._relayoutSubtreeRoot; |
170 assert(parent == this.parent); // TODO(ianh): Remove this once the analyzer
is cleverer | 186 assert(parent == this.parent); // TODO(ianh): Remove this once the analyzer
is cleverer |
171 if (!needsLayout && constraints == _constraints && relayoutSubtreeRoot == _r
elayoutSubtreeRoot) | 187 if (!needsLayout && constraints == _constraints && relayoutSubtreeRoot == _r
elayoutSubtreeRoot) |
172 return; | 188 return; |
173 _constraints = constraints; | 189 _constraints = constraints; |
174 _relayoutSubtreeRoot = relayoutSubtreeRoot; | 190 _relayoutSubtreeRoot = relayoutSubtreeRoot; |
175 if (sizedByParent) | 191 _debugCanParentUseSize = parentUsesSize; |
| 192 if (sizedByParent) { |
| 193 _debugDoingThisResize = true; |
176 performResize(); | 194 performResize(); |
| 195 _debugDoingThisResize = false; |
| 196 } |
| 197 _debugDoingThisLayout = true; |
| 198 RenderObject debugPreviousActiveLayout = _debugActiveLayout; |
| 199 _debugActiveLayout = this; |
177 performLayout(); | 200 performLayout(); |
| 201 _debugActiveLayout = debugPreviousActiveLayout; |
| 202 _debugDoingThisLayout = false; |
| 203 _debugCanParentUseSize = null; |
| 204 assert(debugDoesMeetConstraints()); |
178 _needsLayout = false; | 205 _needsLayout = false; |
179 markNeedsPaint(); | 206 markNeedsPaint(); |
180 assert(parent == this.parent); // TODO(ianh): Remove this once the analyzer
is cleverer | 207 assert(parent == this.parent); // TODO(ianh): Remove this once the analyzer
is cleverer |
181 } | 208 } |
182 bool get sizedByParent => false; // return true if the constraints are the onl
y input to the sizing algorithm (in particular, child nodes have no impact) | 209 bool get sizedByParent => false; // return true if the constraints are the onl
y input to the sizing algorithm (in particular, child nodes have no impact) |
183 void performResize(); // set the local dimensions, using only the constraints
(only called if sizedByParent is true) | 210 void performResize(); // set the local dimensions, using only the constraints
(only called if sizedByParent is true) |
184 void performLayout(); | 211 void performLayout(); |
185 // Override this to perform relayout without your parent's | 212 // Override this to perform relayout without your parent's |
186 // involvement. | 213 // involvement. |
187 // | 214 // |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
243 // // For each child that intersects x,y, in z-order starting from the top, | 270 // // For each child that intersects x,y, in z-order starting from the top, |
244 // // call hitTest() for that child, passing it /result/, and the coordinate
s | 271 // // call hitTest() for that child, passing it /result/, and the coordinate
s |
245 // // converted to the child's coordinate origin, and stop at the first chil
d | 272 // // converted to the child's coordinate origin, and stop at the first chil
d |
246 // // that returns true. | 273 // // that returns true. |
247 // // Then, add yourself to /result/, and return true. | 274 // // Then, add yourself to /result/, and return true. |
248 // } | 275 // } |
249 // You must not add yourself to /result/ if you return false. | 276 // You must not add yourself to /result/ if you return false. |
250 | 277 |
251 | 278 |
252 String toString([String prefix = '']) { | 279 String toString([String prefix = '']) { |
| 280 RenderObject debugPreviousActiveLayout = _debugActiveLayout; |
| 281 _debugActiveLayout = null; |
253 String header = '${runtimeType}'; | 282 String header = '${runtimeType}'; |
254 if (_relayoutSubtreeRoot != null && _relayoutSubtreeRoot != this) { | 283 if (_relayoutSubtreeRoot != null && _relayoutSubtreeRoot != this) { |
255 int count = 1; | 284 int count = 1; |
256 RenderObject target = parent; | 285 RenderObject target = parent; |
257 while (target != null && target != _relayoutSubtreeRoot) { | 286 while (target != null && target != _relayoutSubtreeRoot) { |
258 target = target.parent as RenderObject; | 287 target = target.parent as RenderObject; |
259 count += 1; | 288 count += 1; |
260 } | 289 } |
261 header += ' relayoutSubtreeRoot=up$count'; | 290 header += ' relayoutSubtreeRoot=up$count'; |
262 } | 291 } |
263 if (_needsLayout) | 292 if (_needsLayout) |
264 header += ' NEEDS-LAYOUT'; | 293 header += ' NEEDS-LAYOUT'; |
265 if (!attached) | 294 if (!attached) |
266 header += ' DETACHED'; | 295 header += ' DETACHED'; |
267 prefix += ' '; | 296 prefix += ' '; |
268 return '${header}\n${debugDescribeSettings(prefix)}${debugDescribeChildren(p
refix)}'; | 297 String result = '${header}\n${debugDescribeSettings(prefix)}${debugDescribeC
hildren(prefix)}'; |
| 298 _debugActiveLayout = debugPreviousActiveLayout; |
| 299 return result; |
269 } | 300 } |
270 String debugDescribeSettings(String prefix) => '${prefix}parentData: ${parentD
ata}\n${prefix}constraints: ${constraints}\n'; | 301 String debugDescribeSettings(String prefix) => '${prefix}parentData: ${parentD
ata}\n${prefix}constraints: ${constraints}\n'; |
271 String debugDescribeChildren(String prefix) => ''; | 302 String debugDescribeChildren(String prefix) => ''; |
272 | 303 |
273 } | 304 } |
274 | 305 |
275 double clamp({ double min: 0.0, double value: 0.0, double max: double.INFINITY }
) { | 306 double clamp({ double min: 0.0, double value: 0.0, double max: double.INFINITY }
) { |
276 assert(min != null); | 307 assert(min != null); |
277 assert(value != null); | 308 assert(value != null); |
278 assert(max != null); | 309 assert(max != null); |
(...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
494 int count = 1; | 525 int count = 1; |
495 ChildType child = _firstChild; | 526 ChildType child = _firstChild; |
496 while (child != null) { | 527 while (child != null) { |
497 result += '${prefix}child ${count}: ${child.toString(prefix)}'; | 528 result += '${prefix}child ${count}: ${child.toString(prefix)}'; |
498 count += 1; | 529 count += 1; |
499 child = child.parentData.nextSibling; | 530 child = child.parentData.nextSibling; |
500 } | 531 } |
501 return result; | 532 return result; |
502 } | 533 } |
503 } | 534 } |
OLD | NEW |