Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(587)

Side by Side Diff: sky/examples/raw/sector-layout.dart

Issue 1154213003: RenderSector example: add a class to stack in the other direction, and fix various bugs. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: forgot to merge in earlier changes Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 'package:sky/framework/layout2.dart'; 7 import 'package:sky/framework/layout2.dart';
8 8
9 const double kTwoPi = 2 * math.PI; 9 const double kTwoPi = 2 * math.PI;
10 10
11 double deg(double radians) => radians * 180.0 / math.PI; 11 double deg(double radians) => radians * 180.0 / math.PI;
12 12
13 class SectorConstraints { 13 class SectorConstraints {
14 const SectorConstraints({ 14 const SectorConstraints({
15 this.minDeltaRadius: 0.0, 15 this.minDeltaRadius: 0.0,
16 this.maxDeltaRadius: double.INFINITY, 16 this.maxDeltaRadius: double.INFINITY,
17 this.minDeltaTheta: 0.0, 17 this.minDeltaTheta: 0.0,
18 this.maxDeltaTheta: kTwoPi}); 18 this.maxDeltaTheta: kTwoPi
19 });
19 20
20 const SectorConstraints.tight({ double deltaRadius: 0.0, double deltaTheta: 0. 0 }) 21 const SectorConstraints.tight({ double deltaRadius: 0.0, double deltaTheta: 0. 0 })
21 : minDeltaRadius = deltaRadius, 22 : minDeltaRadius = deltaRadius,
22 maxDeltaRadius = deltaRadius, 23 maxDeltaRadius = deltaRadius,
23 minDeltaTheta = deltaTheta, 24 minDeltaTheta = deltaTheta,
24 maxDeltaTheta = deltaTheta; 25 maxDeltaTheta = deltaTheta;
25 26
26 final double minDeltaRadius; 27 final double minDeltaRadius;
27 final double maxDeltaRadius; 28 final double maxDeltaRadius;
28 final double minDeltaTheta; 29 final double minDeltaTheta;
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
63 64
64 void setParentData(RenderNode child) { 65 void setParentData(RenderNode child) {
65 if (child.parentData is! SectorParentData) 66 if (child.parentData is! SectorParentData)
66 child.parentData = new SectorParentData(); 67 child.parentData = new SectorParentData();
67 } 68 }
68 69
69 SectorDimensions getIntrinsicDimensions(SectorConstraints constraints, double radius) { 70 SectorDimensions getIntrinsicDimensions(SectorConstraints constraints, double radius) {
70 return new SectorDimensions.withConstraints(constraints); 71 return new SectorDimensions.withConstraints(constraints);
71 } 72 }
72 73
73 void layout(SectorConstraints constraints, double radius, { RenderNode relayou tSubtreeRoot }) { 74 void layout(SectorConstraints constraints, { RenderNode relayoutSubtreeRoot }) {
74 deltaRadius = constraints.constrainDeltaRadius(0.0); 75 deltaRadius = constraints.constrainDeltaRadius(0.0);
75 deltaTheta = constraints.constrainDeltaTheta(0.0); 76 deltaTheta = constraints.constrainDeltaTheta(0.0);
76 layoutDone(); 77 layoutDone();
77 } 78 }
78 79
79 double deltaRadius; 80 double deltaRadius;
80 double deltaTheta; 81 double deltaTheta;
81 } 82 }
82 83
83 class RenderDecoratedSector extends RenderSector { 84 class RenderDecoratedSector extends RenderSector {
(...skipping 13 matching lines...) Expand all
97 assert(deltaRadius != null); 98 assert(deltaRadius != null);
98 assert(deltaTheta != null); 99 assert(deltaTheta != null);
99 assert(parentData is SectorParentData); 100 assert(parentData is SectorParentData);
100 101
101 if (_decoration == null) 102 if (_decoration == null)
102 return; 103 return;
103 104
104 if (_decoration.backgroundColor != null) { 105 if (_decoration.backgroundColor != null) {
105 sky.Paint paint = new sky.Paint()..color = _decoration.backgroundColor; 106 sky.Paint paint = new sky.Paint()..color = _decoration.backgroundColor;
106 sky.Path path = new sky.Path(); 107 sky.Path path = new sky.Path();
107 double outerRadiusOver2 = (parentData.radius + deltaRadius) / 2.0; 108 double outerRadius = (parentData.radius + deltaRadius);
108 sky.Rect outerBounds = new sky.Rect()..setLTRB(-outerRadiusOver2, -outerRa diusOver2, outerRadiusOver2, outerRadiusOver2); 109 sky.Rect outerBounds = new sky.Rect()..setLTRB(-outerRadius, -outerRadius, outerRadius, outerRadius);
109 path.arcTo(outerBounds, deg(parentData.theta), deg(deltaTheta), true); 110 path.arcTo(outerBounds, deg(parentData.theta), deg(deltaTheta), true);
110 double innerRadiusOver2 = parentData.radius / 2.0; 111 double innerRadius = parentData.radius;
111 sky.Rect innerBounds = new sky.Rect()..setLTRB(-innerRadiusOver2, -innerRa diusOver2, innerRadiusOver2, innerRadiusOver2); 112 sky.Rect innerBounds = new sky.Rect()..setLTRB(-innerRadius, -innerRadius, innerRadius, innerRadius);
112 path.arcTo(innerBounds, deg(parentData.theta + deltaTheta), deg(-deltaThet a), false); 113 path.arcTo(innerBounds, deg(parentData.theta + deltaTheta), deg(-deltaThet a), false);
113 path.close(); 114 path.close();
114 canvas.drawPath(path, paint); 115 canvas.drawPath(path, paint);
115 } 116 }
116 } 117 }
117 } 118 }
118 119
119 class SectorChildListParentData extends SectorParentData with ContainerParentDat aMixin<RenderSector> { } 120 class SectorChildListParentData extends SectorParentData with ContainerParentDat aMixin<RenderSector> { }
120 121
121 class RenderSectorRing extends RenderDecoratedSector with ContainerRenderNodeMix in<RenderSector, SectorChildListParentData> { 122 class RenderSectorRing extends RenderDecoratedSector with ContainerRenderNodeMix in<RenderSector, SectorChildListParentData> {
(...skipping 11 matching lines...) Expand all
133 assert(value != null); 134 assert(value != null);
134 if (_desiredDeltaRadius != value) { 135 if (_desiredDeltaRadius != value) {
135 _desiredDeltaRadius = value; 136 _desiredDeltaRadius = value;
136 markNeedsLayout(); 137 markNeedsLayout();
137 } 138 }
138 } 139 }
139 140
140 double _padding; 141 double _padding;
141 double get padding => _padding; 142 double get padding => _padding;
142 void set padding(double value) { 143 void set padding(double value) {
144 // TODO(ianh): avoid code duplication
143 assert(value != null); 145 assert(value != null);
144 if (_padding != value) { 146 if (_padding != value) {
145 _padding = value; 147 _padding = value;
146 markNeedsLayout(); 148 markNeedsLayout();
147 } 149 }
148 } 150 }
149 151
150 void setParentData(RenderNode child) { 152 void setParentData(RenderNode child) {
153 // TODO(ianh): avoid code duplication
151 if (child.parentData is! SectorChildListParentData) 154 if (child.parentData is! SectorChildListParentData)
152 child.parentData = new SectorChildListParentData(); 155 child.parentData = new SectorChildListParentData();
153 } 156 }
154 157
155 SectorDimensions getIntrinsicDimensions(SectorConstraints constraints, double radius) { 158 SectorDimensions getIntrinsicDimensions(SectorConstraints constraints, double radius) {
156 double outerDeltaRadius = constraints.constrainDeltaRadius(desiredDeltaRadiu s); 159 double outerDeltaRadius = constraints.constrainDeltaRadius(desiredDeltaRadiu s);
157 double innerDeltaRadius = outerDeltaRadius - padding * 2.0; 160 double innerDeltaRadius = outerDeltaRadius - padding * 2.0;
158 double childRadius = radius + padding; 161 double childRadius = radius + padding;
159 double paddingTheta = math.atan(padding / (radius + outerDeltaRadius)); 162 double paddingTheta = math.atan(padding / (radius + outerDeltaRadius));
160 double innerTheta = paddingTheta; // increments with each child 163 double innerTheta = paddingTheta; // increments with each child
161 double remainingTheta = constraints.maxDeltaTheta - (innerTheta + paddingThe ta); 164 double remainingDeltaTheta = constraints.maxDeltaTheta - (innerTheta + paddi ngTheta);
162 RenderSector child = firstChild; 165 RenderSector child = firstChild;
163 while (child != null) { 166 while (child != null) {
164 SectorConstraints innerConstraints = new SectorConstraints( 167 SectorConstraints innerConstraints = new SectorConstraints(
165 maxDeltaRadius: innerDeltaRadius, 168 maxDeltaRadius: innerDeltaRadius,
166 maxDeltaTheta: remainingTheta 169 maxDeltaTheta: remainingDeltaTheta
167 ); 170 );
168 SectorDimensions childDimensions = child.getIntrinsicDimensions(innerConst raints, childRadius); 171 SectorDimensions childDimensions = child.getIntrinsicDimensions(innerConst raints, childRadius);
169 innerTheta += childDimensions.deltaTheta; 172 innerTheta += childDimensions.deltaTheta;
170 remainingTheta -= childDimensions.deltaTheta; 173 remainingDeltaTheta -= childDimensions.deltaTheta;
171 assert(child.parentData is SectorChildListParentData); 174 assert(child.parentData is SectorChildListParentData);
172 child = child.parentData.nextSibling; 175 child = child.parentData.nextSibling;
173 if (child != null) { 176 if (child != null) {
174 innerTheta += paddingTheta; 177 innerTheta += paddingTheta;
175 remainingTheta -= paddingTheta; 178 remainingDeltaTheta -= paddingTheta;
176 } 179 }
177 } 180 }
178 return new SectorDimensions.withConstraints(constraints, 181 return new SectorDimensions.withConstraints(constraints,
179 deltaRadius: outerDeltaRadius, 182 deltaRadius: outerDeltaRadius,
180 deltaTheta: innerTheta); 183 deltaTheta: innerTheta);
181 } 184 }
182 185
183 SectorConstraints _constraints; 186 SectorConstraints _constraints;
184 void layout(SectorConstraints constraints, double radius, { RenderNode relayou tSubtreeRoot }) { 187 void layout(SectorConstraints constraints, { RenderNode relayoutSubtreeRoot }) {
185 if (relayoutSubtreeRoot != null) 188 if (relayoutSubtreeRoot != null)
186 saveRelayoutSubtreeRoot(relayoutSubtreeRoot); 189 saveRelayoutSubtreeRoot(relayoutSubtreeRoot);
187 relayoutSubtreeRoot = relayoutSubtreeRoot == null ? this : relayoutSubtreeRo ot; 190 relayoutSubtreeRoot = relayoutSubtreeRoot == null ? this : relayoutSubtreeRo ot;
188 deltaRadius = constraints.constrainDeltaRadius(desiredDeltaRadius); 191 deltaRadius = constraints.constrainDeltaRadius(desiredDeltaRadius);
189 assert(deltaRadius < double.INFINITY); 192 assert(deltaRadius < double.INFINITY);
190 _constraints = constraints; 193 _constraints = constraints;
191 internalLayout(radius, relayoutSubtreeRoot); 194 internalLayout(relayoutSubtreeRoot);
192 } 195 }
193 196
194 void relayout() { 197 void relayout() {
198 // TODO(ianh): avoid code duplication
195 assert(parentData is SectorParentData); 199 assert(parentData is SectorParentData);
196 internalLayout(parentData.radius, this); 200 internalLayout(this);
197 } 201 }
198 202
199 void internalLayout(double radius, RenderNode relayoutSubtreeRoot) { 203 void internalLayout(RenderNode relayoutSubtreeRoot) {
204 assert(this.parentData is SectorParentData);
200 double innerDeltaRadius = deltaRadius - padding * 2.0; 205 double innerDeltaRadius = deltaRadius - padding * 2.0;
201 double childRadius = radius + padding; 206 double childRadius = this.parentData.radius + padding;
202 double paddingTheta = math.atan(padding / (radius + deltaRadius)); 207 double paddingTheta = math.atan(padding / (this.parentData.radius + deltaRad ius));
203 double innerTheta = paddingTheta; // increments with each child 208 double innerTheta = paddingTheta; // increments with each child
204 double remainingTheta = _constraints.maxDeltaTheta - (innerTheta + paddingTh eta); 209 double remainingDeltaTheta = _constraints.maxDeltaTheta - (innerTheta + padd ingTheta);
205 RenderSector child = firstChild; 210 RenderSector child = firstChild;
206 while (child != null) { 211 while (child != null) {
207 SectorConstraints innerConstraints = new SectorConstraints( 212 SectorConstraints innerConstraints = new SectorConstraints(
208 maxDeltaRadius: innerDeltaRadius, 213 maxDeltaRadius: innerDeltaRadius,
209 maxDeltaTheta: remainingTheta 214 maxDeltaTheta: remainingDeltaTheta
210 ); 215 );
211 child.layout(innerConstraints, childRadius, relayoutSubtreeRoot: relayoutS ubtreeRoot);
212 assert(child.parentData is SectorParentData); 216 assert(child.parentData is SectorParentData);
213 child.parentData.theta = innerTheta; 217 child.parentData.theta = innerTheta;
214 child.parentData.radius = childRadius; 218 child.parentData.radius = childRadius;
219 child.layout(innerConstraints, relayoutSubtreeRoot: relayoutSubtreeRoot);
215 innerTheta += child.deltaTheta; 220 innerTheta += child.deltaTheta;
216 remainingTheta -= child.deltaTheta; 221 remainingDeltaTheta -= child.deltaTheta;
217 assert(child.parentData is SectorChildListParentData); 222 assert(child.parentData is SectorChildListParentData);
218 child = child.parentData.nextSibling; 223 child = child.parentData.nextSibling;
219 if (child != null) { 224 if (child != null) {
220 innerTheta += paddingTheta; 225 innerTheta += paddingTheta;
221 remainingTheta -= paddingTheta; 226 remainingDeltaTheta -= paddingTheta;
222 } 227 }
223 } 228 }
224 deltaTheta = innerTheta; 229 deltaTheta = innerTheta;
225 } 230 }
226 231
227 // TODO(ianh): hit testing et al is pending on adam's patch 232 // TODO(ianh): hit testing et al is pending on adam's patch
228 233
229 // paint origin is 0,0 of our circle 234 // paint origin is 0,0 of our circle
230 // each sector then knows how to paint itself at its location 235 // each sector then knows how to paint itself at its location
231 void paint(RenderNodeDisplayList canvas) { 236 void paint(RenderNodeDisplayList canvas) {
237 // TODO(ianh): avoid code duplication
232 super.paint(canvas); 238 super.paint(canvas);
233 RenderSector child = firstChild; 239 RenderSector child = firstChild;
234 while (child != null) { 240 while (child != null) {
241 assert(child.parentData is SectorChildListParentData);
242 canvas.paintChild(child, 0.0, 0.0);
243 child = child.parentData.nextSibling;
244 }
245 }
246
247 }
248
249 class RenderSectorSlice extends RenderDecoratedSector with ContainerRenderNodeMi xin<RenderSector, SectorChildListParentData> {
250 // lays out RenderSector children in a stack
251
252 RenderSectorSlice({
253 BoxDecoration decoration,
254 double deltaTheta: kTwoPi,
255 double padding: 0.0
256 }) : super(decoration), _padding = padding, _desiredDeltaTheta = deltaTheta;
257
258 double _desiredDeltaTheta;
259 double get desiredDeltaTheta => _desiredDeltaTheta;
260 void set desiredDeltaTheta(double value) {
261 assert(value != null);
262 if (_desiredDeltaTheta != value) {
263 _desiredDeltaTheta = value;
264 markNeedsLayout();
265 }
266 }
267
268 double _padding;
269 double get padding => _padding;
270 void set padding(double value) {
271 // TODO(ianh): avoid code duplication
272 assert(value != null);
273 if (_padding != value) {
274 _padding = value;
275 markNeedsLayout();
276 }
277 }
278
279 void setParentData(RenderNode child) {
280 // TODO(ianh): avoid code duplication
281 if (child.parentData is! SectorChildListParentData)
282 child.parentData = new SectorChildListParentData();
283 }
284
285 SectorDimensions getIntrinsicDimensions(SectorConstraints constraints, double radius) {
286 assert(this.parentData is SectorParentData);
287 double paddingTheta = math.atan(padding / this.parentData.radius);
288 double outerDeltaTheta = constraints.constrainDeltaTheta(desiredDeltaTheta);
289 double innerDeltaTheta = outerDeltaTheta - paddingTheta * 2.0;
290 double childRadius = this.parentData.radius + padding;
291 double remainingDeltaRadius = constraints.maxDeltaRadius - (padding * 2.0);
292 RenderSector child = firstChild;
293 while (child != null) {
294 SectorConstraints innerConstraints = new SectorConstraints(
295 maxDeltaRadius: remainingDeltaRadius,
296 maxDeltaTheta: innerDeltaTheta
297 );
298 SectorDimensions childDimensions = child.getIntrinsicDimensions(innerConst raints, childRadius);
299 childRadius += childDimensions.deltaRadius;
300 remainingDeltaRadius -= childDimensions.deltaRadius;
301 assert(child.parentData is SectorChildListParentData);
302 child = child.parentData.nextSibling;
303 childRadius += padding;
304 remainingDeltaRadius -= padding;
305 }
306 return new SectorDimensions.withConstraints(constraints,
307 deltaRadius: childRadius - this. parentData.radius,
308 deltaTheta: outerDeltaTheta);
309 }
310
311 SectorConstraints _constraints;
312 void layout(SectorConstraints constraints, { RenderNode relayoutSubtreeRoot }) {
313 if (relayoutSubtreeRoot != null)
314 saveRelayoutSubtreeRoot(relayoutSubtreeRoot);
315 relayoutSubtreeRoot = relayoutSubtreeRoot == null ? this : relayoutSubtreeRo ot;
316 deltaTheta = constraints.constrainDeltaTheta(desiredDeltaTheta);
317 assert(deltaTheta <= kTwoPi);
318 _constraints = constraints;
319 internalLayout(relayoutSubtreeRoot);
320 }
321
322 void relayout() {
323 // TODO(ianh): avoid code duplication
324 assert(parentData is SectorParentData);
325 internalLayout(this);
326 }
327
328 void internalLayout(RenderNode relayoutSubtreeRoot) {
329 assert(this.parentData is SectorParentData);
330 double paddingTheta = math.atan(padding / this.parentData.radius);
331 double innerTheta = this.parentData.theta + paddingTheta;
332 double innerDeltaTheta = deltaTheta - paddingTheta * 2.0;
333 double childRadius = this.parentData.radius + padding;
334 double remainingDeltaRadius = _constraints.maxDeltaRadius - (padding * 2.0);
335 RenderSector child = firstChild;
336 while (child != null) {
337 SectorConstraints innerConstraints = new SectorConstraints(
338 maxDeltaRadius: remainingDeltaRadius,
339 maxDeltaTheta: innerDeltaTheta
340 );
341 child.parentData.theta = innerTheta;
342 child.parentData.radius = childRadius;
343 child.layout(innerConstraints);
344 childRadius += child.deltaRadius;
345 remainingDeltaRadius -= child.deltaRadius;
346 assert(child.parentData is SectorChildListParentData);
347 child = child.parentData.nextSibling;
348 childRadius += padding;
349 remainingDeltaRadius -= padding;
350 }
351 deltaRadius = childRadius - this.parentData.radius;
352 }
353
354 // TODO(ianh): hit testing et al is pending on adam's patch
355
356 // paint origin is 0,0 of our circle
357 // each sector then knows how to paint itself at its location
358 void paint(RenderNodeDisplayList canvas) {
359 // TODO(ianh): avoid code duplication
360 super.paint(canvas);
361 RenderSector child = firstChild;
362 while (child != null) {
235 assert(child.parentData is SectorChildListParentData); 363 assert(child.parentData is SectorChildListParentData);
236 canvas.paintChild(child, 0.0, 0.0); 364 canvas.paintChild(child, 0.0, 0.0);
237 child = child.parentData.nextSibling; 365 child = child.parentData.nextSibling;
238 } 366 }
239 } 367 }
240 368
241 } 369 }
242 370
243 class RenderBoxToRenderSectorAdapter extends RenderBox { 371 class RenderBoxToRenderSectorAdapter extends RenderBox {
244 372
(...skipping 24 matching lines...) Expand all
269 if (child.parentData is! SectorParentData) 397 if (child.parentData is! SectorParentData)
270 child.parentData = new SectorParentData(); 398 child.parentData = new SectorParentData();
271 } 399 }
272 400
273 BoxDimensions getIntrinsicDimensions(BoxConstraints constraints) { 401 BoxDimensions getIntrinsicDimensions(BoxConstraints constraints) {
274 if (child == null) 402 if (child == null)
275 return new BoxDimensions.withConstraints(constraints, width: 0.0, height: 0.0); 403 return new BoxDimensions.withConstraints(constraints, width: 0.0, height: 0.0);
276 assert(child is RenderSector); 404 assert(child is RenderSector);
277 assert(child.parentData is SectorParentData); 405 assert(child.parentData is SectorParentData);
278 assert(!constraints.isInfinite); 406 assert(!constraints.isInfinite);
279 double maxChildDeltaRadius = math.max(constraints.maxWidth, constraints.maxH eight) / 2.0 - innerRadius; 407 double maxChildDeltaRadius = math.min(constraints.maxWidth, constraints.maxH eight) / 2.0 - innerRadius;
280 SectorDimensions childDimensions = child.getIntrinsicDimensions(new SectorCo nstraints(maxDeltaRadius: maxChildDeltaRadius), innerRadius); 408 SectorDimensions childDimensions = child.getIntrinsicDimensions(new SectorCo nstraints(maxDeltaRadius: maxChildDeltaRadius), innerRadius);
281 double dimension = (innerRadius + childDimensions.deltaRadius) * 2.0; 409 double dimension = (innerRadius + childDimensions.deltaRadius) * 2.0;
282 return new BoxDimensions.withConstraints(constraints, width: dimension, heig ht: dimension); 410 return new BoxDimensions.withConstraints(constraints, width: dimension, heig ht: dimension);
283 } 411 }
284 412
285 void layout(BoxConstraints constraints, { RenderNode relayoutSubtreeRoot }) { 413 void layout(BoxConstraints constraints, { RenderNode relayoutSubtreeRoot }) {
286 if (relayoutSubtreeRoot != null) 414 if (relayoutSubtreeRoot != null)
287 saveRelayoutSubtreeRoot(relayoutSubtreeRoot); 415 saveRelayoutSubtreeRoot(relayoutSubtreeRoot);
288 relayoutSubtreeRoot = relayoutSubtreeRoot == null ? this : relayoutSubtreeRo ot; 416 relayoutSubtreeRoot = relayoutSubtreeRoot == null ? this : relayoutSubtreeRo ot;
289 BoxDimensions ourDimensions; 417 BoxDimensions ourDimensions;
290 if (child == null) { 418 if (child == null) {
291 ourDimensions = new BoxDimensions.withConstraints(constraints, width: 0.0, height: 0.0); 419 ourDimensions = new BoxDimensions.withConstraints(constraints, width: 0.0, height: 0.0);
292 } else { 420 } else {
293 assert(child is RenderSector); 421 assert(child is RenderSector);
294 assert(child.parentData is SectorParentData);
295 assert(!constraints.isInfinite); 422 assert(!constraints.isInfinite);
296 double maxChildDeltaRadius = math.min(constraints.maxWidth, constraints.ma xHeight) / 2.0 - innerRadius; 423 double maxChildDeltaRadius = math.min(constraints.maxWidth, constraints.ma xHeight) / 2.0 - innerRadius;
297 child.layout(new SectorConstraints(maxDeltaRadius: maxChildDeltaRadius), i nnerRadius, relayoutSubtreeRoot: relayoutSubtreeRoot); 424 assert(child.parentData is SectorParentData);
425 child.parentData.radius = innerRadius;
426 child.parentData.theta = 0.0;
427 child.layout(new SectorConstraints(maxDeltaRadius: maxChildDeltaRadius), r elayoutSubtreeRoot: relayoutSubtreeRoot);
298 double dimension = (innerRadius + child.deltaRadius) * 2.0; 428 double dimension = (innerRadius + child.deltaRadius) * 2.0;
299 ourDimensions = new BoxDimensions.withConstraints(constraints, width: dime nsion, height: dimension); 429 ourDimensions = new BoxDimensions.withConstraints(constraints, width: dime nsion, height: dimension);
300 } 430 }
301 width = ourDimensions.width; 431 width = ourDimensions.width;
302 height = ourDimensions.height; 432 height = ourDimensions.height;
303 print("adapter is: ${width}x${height}");
304 layoutDone(); 433 layoutDone();
305 } 434 }
306 435
307 double width; 436 double width;
308 double height; 437 double height;
309 438
310 // TODO(ianh): hit testing et al is pending on adam's patch 439 // TODO(ianh): hit testing et al is pending on adam's patch
311 440
312 // paint origin is 0,0 of our circle 441 // paint origin is 0,0 of our circle
313 void paint(RenderNodeDisplayList canvas) { 442 void paint(RenderNodeDisplayList canvas) {
314 super.paint(canvas); 443 super.paint(canvas);
315 if (child != null) { 444 if (child != null)
316 print("painting child at ${width/2.0},${height/2.0}");
317 sky.Paint paint;
318 paint = new sky.Paint()..color = 0xFF474700;
319 canvas.drawRect(new sky.Rect()..setLTRB(0.0, 0.0, width, height), paint);
320 paint = new sky.Paint()..color = 0xFFF7F700;
321 canvas.drawRect(new sky.Rect()..setLTRB(10.0, 10.0, width-10.0, height-10. 0), paint);
322 paint = new sky.Paint()..color = 0xFFFFFFFF;
323 canvas.drawRect(new sky.Rect()..setLTRB(width/2.0-5.0, height/2.0-5.0, wid th/2.0+5.0, height/2.0+5.0), paint);
324 canvas.paintChild(child, width/2.0, height/2.0); 445 canvas.paintChild(child, width/2.0, height/2.0);
325 }
326 } 446 }
327 447
328 } 448 }
329 449
330 class RenderSolidColor extends RenderDecoratedSector { 450 class RenderSolidColor extends RenderDecoratedSector {
331 final int backgroundColor; 451 RenderSolidColor(int backgroundColor, {
452 this.desiredDeltaRadius: double.INFINITY,
453 this.desiredDeltaTheta: kTwoPi
454 }) : super(new BoxDecoration(backgroundColor: backgroundColor));
332 455
333 RenderSolidColor(int backgroundColor) 456 double desiredDeltaRadius;
334 : super(new BoxDecoration(backgroundColor: backgroundColor)), 457 double desiredDeltaTheta;
335 backgroundColor = backgroundColor;
336 458
337 SectorDimensions getIntrinsicDimensions(SectorConstraints constraints, double radius) { 459 SectorDimensions getIntrinsicDimensions(SectorConstraints constraints, double radius) {
338 return new SectorDimensions.withConstraints(constraints, deltaTheta: 1.0); / / 1.0 radians 460 return new SectorDimensions.withConstraints(constraints, deltaTheta: 1.0); / / 1.0 radians
339 } 461 }
340 462
341 void layout(SectorConstraints constraints, double radius, { RenderNode relayou tSubtreeRoot }) { 463 void layout(SectorConstraints constraints, { RenderNode relayoutSubtreeRoot }) {
342 deltaRadius = constraints.constrainDeltaRadius(constraints.maxDeltaRadius); 464 deltaRadius = constraints.constrainDeltaRadius(desiredDeltaRadius);
343 deltaTheta = constraints.constrainDeltaTheta(1.0); // 1.0 radians 465 deltaTheta = constraints.constrainDeltaTheta(desiredDeltaTheta);
344 layoutDone(); 466 layoutDone();
345 } 467 }
346 } 468 }
347 469
348 RenderView renderView; 470 RenderView renderView;
349 471
350 void beginFrame(double timeStamp) { 472 void beginFrame(double timeStamp) {
351 RenderNode.flushLayout(); 473 RenderNode.flushLayout();
352 474
353 renderView.paintFrame(); 475 renderView.paintFrame();
354 } 476 }
355 477
356 bool handleEvent(sky.Event event) { 478 bool handleEvent(sky.Event event) {
357 if (event is! sky.PointerEvent) 479 if (event is! sky.PointerEvent)
358 return false; 480 return false;
359 return renderView.handlePointer(event, x: event.x, y: event.y); 481 return renderView.handlePointer(event, x: event.x, y: event.y);
360 } 482 }
361 483
362 void main() { 484 void main() {
363 print("test..."); 485 print("test...");
364 sky.view.setEventCallback(handleEvent); 486 sky.view.setEventCallback(handleEvent);
365 sky.view.setBeginFrameCallback(beginFrame); 487 sky.view.setBeginFrameCallback(beginFrame);
366 488
367 var rootCircle = new RenderSectorRing(padding: 10.0); 489 var rootCircle = new RenderSectorRing(padding: 10.0);
368 rootCircle.add(new RenderSolidColor(0xFF00FF00)); 490 rootCircle.add(new RenderSolidColor(0xFF00FFFF, desiredDeltaTheta: kTwoPi * 0. 25));
369 rootCircle.add(new RenderSolidColor(0xFF0000FF)); 491 rootCircle.add(new RenderSolidColor(0xFF0000FF, desiredDeltaTheta: kTwoPi * 0. 3));
492 var stack = new RenderSectorSlice(padding: 10.0);
493 stack.add(new RenderSolidColor(0xFFFFFF00, desiredDeltaRadius: 20.0));
494 stack.add(new RenderSolidColor(0xFFFF9000, desiredDeltaRadius: 20.0));
495 stack.add(new RenderSolidColor(0xFF00FF00, desiredDeltaRadius: 20.0));
496 rootCircle.add(stack);
370 497
371 var root = new RenderBoxToRenderSectorAdapter(innerRadius: 50.0, child: rootCi rcle); 498 var root = new RenderBoxToRenderSectorAdapter(innerRadius: 50.0, child: rootCi rcle);
372 renderView = new RenderView(root: root); 499 renderView = new RenderView(root: root);
373 renderView.layout(newWidth: sky.view.width, newHeight: sky.view.height); 500 renderView.layout(newWidth: sky.view.width, newHeight: sky.view.height);
374 501
375 sky.view.scheduleFrame(); 502 sky.view.scheduleFrame();
376 print("window is ${sky.view.width}x${sky.view.height}");
377 } 503 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698