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 'package:sky/framework/app.dart'; | 7 import 'package:sky/framework/app.dart'; |
8 import 'package:sky/framework/rendering/box.dart'; | 8 import 'package:sky/framework/rendering/box.dart'; |
9 import 'package:sky/framework/rendering/object.dart'; | 9 import 'package:sky/framework/rendering/object.dart'; |
10 | 10 |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
117 // origin must be set to the center of the circle | 117 // origin must be set to the center of the circle |
118 void paint(RenderObjectDisplayList canvas) { | 118 void paint(RenderObjectDisplayList canvas) { |
119 assert(deltaRadius != null); | 119 assert(deltaRadius != null); |
120 assert(deltaTheta != null); | 120 assert(deltaTheta != null); |
121 assert(parentData is SectorParentData); | 121 assert(parentData is SectorParentData); |
122 | 122 |
123 if (_decoration == null) | 123 if (_decoration == null) |
124 return; | 124 return; |
125 | 125 |
126 if (_decoration.backgroundColor != null) { | 126 if (_decoration.backgroundColor != null) { |
127 sky.Paint paint = new sky.Paint()..color = _decoration.backgroundColor; | 127 Paint paint = new Paint()..color = _decoration.backgroundColor; |
128 sky.Path path = new sky.Path(); | 128 Path path = new Path(); |
129 double outerRadius = (parentData.radius + deltaRadius); | 129 double outerRadius = (parentData.radius + deltaRadius); |
130 sky.Rect outerBounds = new sky.Rect.fromLTRB(-outerRadius, -outerRadius, o
uterRadius, outerRadius); | 130 Rect outerBounds = new Rect.fromLTRB(-outerRadius, -outerRadius, outerRadi
us, outerRadius); |
131 path.arcTo(outerBounds, deg(parentData.theta), deg(deltaTheta), true); | 131 path.arcTo(outerBounds, deg(parentData.theta), deg(deltaTheta), true); |
132 double innerRadius = parentData.radius; | 132 double innerRadius = parentData.radius; |
133 sky.Rect innerBounds = new sky.Rect.fromLTRB(-innerRadius, -innerRadius, i
nnerRadius, innerRadius); | 133 Rect innerBounds = new Rect.fromLTRB(-innerRadius, -innerRadius, innerRadi
us, innerRadius); |
134 path.arcTo(innerBounds, deg(parentData.theta + deltaTheta), deg(-deltaThet
a), false); | 134 path.arcTo(innerBounds, deg(parentData.theta + deltaTheta), deg(-deltaThet
a), false); |
135 path.close(); | 135 path.close(); |
136 canvas.drawPath(path, paint); | 136 canvas.drawPath(path, paint); |
137 } | 137 } |
138 } | 138 } |
139 } | 139 } |
140 | 140 |
141 class SectorChildListParentData extends SectorParentData with ContainerParentDat
aMixin<RenderSector> { } | 141 class SectorChildListParentData extends SectorParentData with ContainerParentDat
aMixin<RenderSector> { } |
142 | 142 |
143 class RenderSectorWithChildren extends RenderDecoratedSector with ContainerRende
rObjectMixin<RenderSector, SectorChildListParentData> { | 143 class RenderSectorWithChildren extends RenderDecoratedSector with ContainerRende
rObjectMixin<RenderSector, SectorChildListParentData> { |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
250 } | 250 } |
251 | 251 |
252 // paint origin is 0,0 of our circle | 252 // paint origin is 0,0 of our circle |
253 // each sector then knows how to paint itself at its location | 253 // each sector then knows how to paint itself at its location |
254 void paint(RenderObjectDisplayList canvas) { | 254 void paint(RenderObjectDisplayList canvas) { |
255 // TODO(ianh): avoid code duplication | 255 // TODO(ianh): avoid code duplication |
256 super.paint(canvas); | 256 super.paint(canvas); |
257 RenderSector child = firstChild; | 257 RenderSector child = firstChild; |
258 while (child != null) { | 258 while (child != null) { |
259 assert(child.parentData is SectorChildListParentData); | 259 assert(child.parentData is SectorChildListParentData); |
260 canvas.paintChild(child, new sky.Point(0.0, 0.0)); | 260 canvas.paintChild(child, new Point(0.0, 0.0)); |
261 child = child.parentData.nextSibling; | 261 child = child.parentData.nextSibling; |
262 } | 262 } |
263 } | 263 } |
264 | 264 |
265 } | 265 } |
266 | 266 |
267 class RenderSectorSlice extends RenderSectorWithChildren { | 267 class RenderSectorSlice extends RenderSectorWithChildren { |
268 // lays out RenderSector children in a stack | 268 // lays out RenderSector children in a stack |
269 | 269 |
270 RenderSectorSlice({ | 270 RenderSectorSlice({ |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
355 } | 355 } |
356 | 356 |
357 // paint origin is 0,0 of our circle | 357 // paint origin is 0,0 of our circle |
358 // each sector then knows how to paint itself at its location | 358 // each sector then knows how to paint itself at its location |
359 void paint(RenderObjectDisplayList canvas) { | 359 void paint(RenderObjectDisplayList canvas) { |
360 // TODO(ianh): avoid code duplication | 360 // TODO(ianh): avoid code duplication |
361 super.paint(canvas); | 361 super.paint(canvas); |
362 RenderSector child = firstChild; | 362 RenderSector child = firstChild; |
363 while (child != null) { | 363 while (child != null) { |
364 assert(child.parentData is SectorChildListParentData); | 364 assert(child.parentData is SectorChildListParentData); |
365 canvas.paintChild(child, new sky.Point(0.0, 0.0)); | 365 canvas.paintChild(child, new Point(0.0, 0.0)); |
366 child = child.parentData.nextSibling; | 366 child = child.parentData.nextSibling; |
367 } | 367 } |
368 } | 368 } |
369 | 369 |
370 } | 370 } |
371 | 371 |
372 class RenderBoxToRenderSectorAdapter extends RenderBox { | 372 class RenderBoxToRenderSectorAdapter extends RenderBox { |
373 | 373 |
374 RenderBoxToRenderSectorAdapter({ double innerRadius: 0.0, RenderSector child }
) : | 374 RenderBoxToRenderSectorAdapter({ double innerRadius: 0.0, RenderSector child }
) : |
375 _innerRadius = innerRadius { | 375 _innerRadius = innerRadius { |
(...skipping 16 matching lines...) Expand all Loading... |
392 _child = value; | 392 _child = value; |
393 adoptChild(_child); | 393 adoptChild(_child); |
394 markNeedsLayout(); | 394 markNeedsLayout(); |
395 } | 395 } |
396 | 396 |
397 void setParentData(RenderObject child) { | 397 void setParentData(RenderObject child) { |
398 if (child.parentData is! SectorParentData) | 398 if (child.parentData is! SectorParentData) |
399 child.parentData = new SectorParentData(); | 399 child.parentData = new SectorParentData(); |
400 } | 400 } |
401 | 401 |
402 sky.Size getIntrinsicDimensions(BoxConstraints constraints) { | 402 Size getIntrinsicDimensions(BoxConstraints constraints) { |
403 if (child == null) | 403 if (child == null) |
404 return constraints.constrain(new sky.Size(0.0, 0.0)); | 404 return constraints.constrain(Size.zero); |
405 assert(child is RenderSector); | 405 assert(child is RenderSector); |
406 assert(child.parentData is SectorParentData); | 406 assert(child.parentData is SectorParentData); |
407 assert(!constraints.isInfinite); | 407 assert(!constraints.isInfinite); |
408 double maxChildDeltaRadius = math.min(constraints.maxWidth, constraints.maxH
eight) / 2.0 - innerRadius; | 408 double maxChildDeltaRadius = math.min(constraints.maxWidth, constraints.maxH
eight) / 2.0 - innerRadius; |
409 SectorDimensions childDimensions = child.getIntrinsicDimensions(new SectorCo
nstraints(maxDeltaRadius: maxChildDeltaRadius), innerRadius); | 409 SectorDimensions childDimensions = child.getIntrinsicDimensions(new SectorCo
nstraints(maxDeltaRadius: maxChildDeltaRadius), innerRadius); |
410 double dimension = (innerRadius + childDimensions.deltaRadius) * 2.0; | 410 double dimension = (innerRadius + childDimensions.deltaRadius) * 2.0; |
411 return constraints.constrain(new sky.Size(dimension, dimension)); | 411 return constraints.constrain(new Size(dimension, dimension)); |
412 } | 412 } |
413 | 413 |
414 void performLayout() { | 414 void performLayout() { |
415 if (child == null) { | 415 if (child == null) { |
416 size = constraints.constrain(new sky.Size(0.0, 0.0)); | 416 size = constraints.constrain(Size.zero); |
417 } else { | 417 } else { |
418 assert(child is RenderSector); | 418 assert(child is RenderSector); |
419 assert(!constraints.isInfinite); | 419 assert(!constraints.isInfinite); |
420 print("constraint maxes: ${constraints.maxWidth} and ${constraints.maxHeig
ht}"); | 420 print("constraint maxes: ${constraints.maxWidth} and ${constraints.maxHeig
ht}"); |
421 double maxChildDeltaRadius = math.min(constraints.maxWidth, constraints.ma
xHeight) / 2.0 - innerRadius; | 421 double maxChildDeltaRadius = math.min(constraints.maxWidth, constraints.ma
xHeight) / 2.0 - innerRadius; |
422 print("maxChildDeltaRadius = $maxChildDeltaRadius"); | 422 print("maxChildDeltaRadius = $maxChildDeltaRadius"); |
423 assert(child.parentData is SectorParentData); | 423 assert(child.parentData is SectorParentData); |
424 child.parentData.radius = innerRadius; | 424 child.parentData.radius = innerRadius; |
425 child.parentData.theta = 0.0; | 425 child.parentData.theta = 0.0; |
426 child.layout(new SectorConstraints(maxDeltaRadius: maxChildDeltaRadius), p
arentUsesSize: true); | 426 child.layout(new SectorConstraints(maxDeltaRadius: maxChildDeltaRadius), p
arentUsesSize: true); |
427 double dimension = (innerRadius + child.deltaRadius) * 2.0; | 427 double dimension = (innerRadius + child.deltaRadius) * 2.0; |
428 size = constraints.constrain(new sky.Size(dimension, dimension)); | 428 size = constraints.constrain(new Size(dimension, dimension)); |
429 } | 429 } |
430 } | 430 } |
431 | 431 |
432 // paint origin is 0,0 of our circle | 432 // paint origin is 0,0 of our circle |
433 void paint(RenderObjectDisplayList canvas) { | 433 void paint(RenderObjectDisplayList canvas) { |
434 super.paint(canvas); | 434 super.paint(canvas); |
435 if (child != null) { | 435 if (child != null) { |
436 sky.Rect bounds = new sky.Rect.fromSize(size); | 436 Rect bounds = new Rect.fromSize(size); |
437 canvas.paintChild(child, bounds.center); | 437 canvas.paintChild(child, bounds.center); |
438 } | 438 } |
439 } | 439 } |
440 | 440 |
441 bool hitTest(HitTestResult result, { sky.Point position }) { | 441 bool hitTest(HitTestResult result, { Point position }) { |
442 double x = position.x; | 442 double x = position.x; |
443 double y = position.y; | 443 double y = position.y; |
444 if (child == null) | 444 if (child == null) |
445 return false; | 445 return false; |
446 // translate to our origin | 446 // translate to our origin |
447 x -= size.width/2.0; | 447 x -= size.width/2.0; |
448 y -= size.height/2.0; | 448 y -= size.height/2.0; |
449 // convert to radius/theta | 449 // convert to radius/theta |
450 double radius = math.sqrt(x*x+y*y); | 450 double radius = math.sqrt(x*x+y*y); |
451 double theta = (math.atan2(x, -y) - math.PI/2.0) % kTwoPi; | 451 double theta = (math.atan2(x, -y) - math.PI/2.0) % kTwoPi; |
452 if (radius < innerRadius) | 452 if (radius < innerRadius) |
453 return false; | 453 return false; |
454 if (radius >= innerRadius + child.deltaRadius) | 454 if (radius >= innerRadius + child.deltaRadius) |
455 return false; | 455 return false; |
456 if (theta > child.deltaTheta) | 456 if (theta > child.deltaTheta) |
457 return false; | 457 return false; |
458 child.hitTest(result, radius: radius, theta: theta); | 458 child.hitTest(result, radius: radius, theta: theta); |
459 result.add(this); | 459 result.add(this); |
460 return true; | 460 return true; |
461 } | 461 } |
462 | 462 |
463 } | 463 } |
464 | 464 |
465 class RenderSolidColor extends RenderDecoratedSector { | 465 class RenderSolidColor extends RenderDecoratedSector { |
466 RenderSolidColor(sky.Color backgroundColor, { | 466 RenderSolidColor(Color backgroundColor, { |
467 this.desiredDeltaRadius: double.INFINITY, | 467 this.desiredDeltaRadius: double.INFINITY, |
468 this.desiredDeltaTheta: kTwoPi | 468 this.desiredDeltaTheta: kTwoPi |
469 }) : this.backgroundColor = backgroundColor, | 469 }) : this.backgroundColor = backgroundColor, |
470 super(new BoxDecoration(backgroundColor: backgroundColor)); | 470 super(new BoxDecoration(backgroundColor: backgroundColor)); |
471 | 471 |
472 double desiredDeltaRadius; | 472 double desiredDeltaRadius; |
473 double desiredDeltaTheta; | 473 double desiredDeltaTheta; |
474 final sky.Color backgroundColor; | 474 final Color backgroundColor; |
475 | 475 |
476 SectorDimensions getIntrinsicDimensions(SectorConstraints constraints, double
radius) { | 476 SectorDimensions getIntrinsicDimensions(SectorConstraints constraints, double
radius) { |
477 return new SectorDimensions.withConstraints(constraints, deltaTheta: 1.0); /
/ 1.0 radians | 477 return new SectorDimensions.withConstraints(constraints, deltaTheta: 1.0); /
/ 1.0 radians |
478 } | 478 } |
479 | 479 |
480 void performLayout() { | 480 void performLayout() { |
481 deltaRadius = constraints.constrainDeltaRadius(desiredDeltaRadius); | 481 deltaRadius = constraints.constrainDeltaRadius(desiredDeltaRadius); |
482 deltaTheta = constraints.constrainDeltaTheta(desiredDeltaTheta); | 482 deltaTheta = constraints.constrainDeltaTheta(desiredDeltaTheta); |
483 } | 483 } |
484 | 484 |
485 void handleEvent(sky.Event event) { | 485 void handleEvent(sky.Event event) { |
486 if (event.type == 'pointerdown') | 486 if (event.type == 'pointerdown') |
487 decoration = new BoxDecoration(backgroundColor: const sky.Color(0xFFFF0000
)); | 487 decoration = new BoxDecoration(backgroundColor: const Color(0xFFFF0000)); |
488 else if (event.type == 'pointerup') | 488 else if (event.type == 'pointerup') |
489 decoration = new BoxDecoration(backgroundColor: backgroundColor); | 489 decoration = new BoxDecoration(backgroundColor: backgroundColor); |
490 } | 490 } |
491 } | 491 } |
492 | 492 |
493 AppView app; | 493 AppView app; |
494 | 494 |
495 void main() { | 495 void main() { |
496 | 496 |
497 var rootCircle = new RenderSectorRing(padding: 20.0); | 497 var rootCircle = new RenderSectorRing(padding: 20.0); |
498 rootCircle.add(new RenderSolidColor(const sky.Color(0xFF00FFFF), desiredDeltaT
heta: kTwoPi * 0.15)); | 498 rootCircle.add(new RenderSolidColor(const Color(0xFF00FFFF), desiredDeltaTheta
: kTwoPi * 0.15)); |
499 rootCircle.add(new RenderSolidColor(const sky.Color(0xFF0000FF), desiredDeltaT
heta: kTwoPi * 0.4)); | 499 rootCircle.add(new RenderSolidColor(const Color(0xFF0000FF), desiredDeltaTheta
: kTwoPi * 0.4)); |
500 var stack = new RenderSectorSlice(padding: 2.0); | 500 var stack = new RenderSectorSlice(padding: 2.0); |
501 stack.add(new RenderSolidColor(const sky.Color(0xFFFFFF00), desiredDeltaRadius
: 20.0)); | 501 stack.add(new RenderSolidColor(const Color(0xFFFFFF00), desiredDeltaRadius: 20
.0)); |
502 stack.add(new RenderSolidColor(const sky.Color(0xFFFF9000), desiredDeltaRadius
: 20.0)); | 502 stack.add(new RenderSolidColor(const Color(0xFFFF9000), desiredDeltaRadius: 20
.0)); |
503 stack.add(new RenderSolidColor(const sky.Color(0xFF00FF00))); | 503 stack.add(new RenderSolidColor(const Color(0xFF00FF00))); |
504 rootCircle.add(stack); | 504 rootCircle.add(stack); |
505 | 505 |
506 var root = new RenderBoxToRenderSectorAdapter(innerRadius: 50.0, child: rootCi
rcle); | 506 var root = new RenderBoxToRenderSectorAdapter(innerRadius: 50.0, child: rootCi
rcle); |
507 app = new AppView(root); | 507 app = new AppView(root); |
508 } | 508 } |
OLD | NEW |