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/layout2.dart'; | 8 import 'package:sky/framework/layout2.dart'; |
9 | 9 |
10 const double kTwoPi = 2 * math.PI; | 10 const double kTwoPi = 2 * math.PI; |
(...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
249 } | 249 } |
250 | 250 |
251 // paint origin is 0,0 of our circle | 251 // paint origin is 0,0 of our circle |
252 // each sector then knows how to paint itself at its location | 252 // each sector then knows how to paint itself at its location |
253 void paint(RenderNodeDisplayList canvas) { | 253 void paint(RenderNodeDisplayList canvas) { |
254 // TODO(ianh): avoid code duplication | 254 // TODO(ianh): avoid code duplication |
255 super.paint(canvas); | 255 super.paint(canvas); |
256 RenderSector child = firstChild; | 256 RenderSector child = firstChild; |
257 while (child != null) { | 257 while (child != null) { |
258 assert(child.parentData is SectorChildListParentData); | 258 assert(child.parentData is SectorChildListParentData); |
259 canvas.paintChild(child, 0.0, 0.0); | 259 canvas.paintChild(child, new sky.Point(0.0, 0.0)); |
260 child = child.parentData.nextSibling; | 260 child = child.parentData.nextSibling; |
261 } | 261 } |
262 } | 262 } |
263 | 263 |
264 } | 264 } |
265 | 265 |
266 class RenderSectorSlice extends RenderSectorWithChildren { | 266 class RenderSectorSlice extends RenderSectorWithChildren { |
267 // lays out RenderSector children in a stack | 267 // lays out RenderSector children in a stack |
268 | 268 |
269 RenderSectorSlice({ | 269 RenderSectorSlice({ |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
354 } | 354 } |
355 | 355 |
356 // paint origin is 0,0 of our circle | 356 // paint origin is 0,0 of our circle |
357 // each sector then knows how to paint itself at its location | 357 // each sector then knows how to paint itself at its location |
358 void paint(RenderNodeDisplayList canvas) { | 358 void paint(RenderNodeDisplayList canvas) { |
359 // TODO(ianh): avoid code duplication | 359 // TODO(ianh): avoid code duplication |
360 super.paint(canvas); | 360 super.paint(canvas); |
361 RenderSector child = firstChild; | 361 RenderSector child = firstChild; |
362 while (child != null) { | 362 while (child != null) { |
363 assert(child.parentData is SectorChildListParentData); | 363 assert(child.parentData is SectorChildListParentData); |
364 canvas.paintChild(child, 0.0, 0.0); | 364 canvas.paintChild(child, new sky.Point(0.0, 0.0)); |
365 child = child.parentData.nextSibling; | 365 child = child.parentData.nextSibling; |
366 } | 366 } |
367 } | 367 } |
368 | 368 |
369 } | 369 } |
370 | 370 |
371 class RenderBoxToRenderSectorAdapter extends RenderBox { | 371 class RenderBoxToRenderSectorAdapter extends RenderBox { |
372 | 372 |
373 RenderBoxToRenderSectorAdapter({ double innerRadius: 0.0, RenderSector child }
) : | 373 RenderBoxToRenderSectorAdapter({ double innerRadius: 0.0, RenderSector child }
) : |
374 _innerRadius = innerRadius { | 374 _innerRadius = innerRadius { |
(...skipping 29 matching lines...) Expand all Loading... |
404 assert(child is RenderSector); | 404 assert(child is RenderSector); |
405 assert(child.parentData is SectorParentData); | 405 assert(child.parentData is SectorParentData); |
406 assert(!constraints.isInfinite); | 406 assert(!constraints.isInfinite); |
407 double maxChildDeltaRadius = math.min(constraints.maxWidth, constraints.maxH
eight) / 2.0 - innerRadius; | 407 double maxChildDeltaRadius = math.min(constraints.maxWidth, constraints.maxH
eight) / 2.0 - innerRadius; |
408 SectorDimensions childDimensions = child.getIntrinsicDimensions(new SectorCo
nstraints(maxDeltaRadius: maxChildDeltaRadius), innerRadius); | 408 SectorDimensions childDimensions = child.getIntrinsicDimensions(new SectorCo
nstraints(maxDeltaRadius: maxChildDeltaRadius), innerRadius); |
409 double dimension = (innerRadius + childDimensions.deltaRadius) * 2.0; | 409 double dimension = (innerRadius + childDimensions.deltaRadius) * 2.0; |
410 return new BoxDimensions.withConstraints(constraints, width: dimension, heig
ht: dimension); | 410 return new BoxDimensions.withConstraints(constraints, width: dimension, heig
ht: dimension); |
411 } | 411 } |
412 | 412 |
413 void performLayout() { | 413 void performLayout() { |
414 BoxDimensions ourDimensions; | |
415 if (child == null) { | 414 if (child == null) { |
416 ourDimensions = new BoxDimensions.withConstraints(constraints, width: 0.0,
height: 0.0); | 415 size = constraints.constrain(new sky.Size(0.0, 0.0)); |
417 } else { | 416 } else { |
418 assert(child is RenderSector); | 417 assert(child is RenderSector); |
419 assert(!constraints.isInfinite); | 418 assert(!constraints.isInfinite); |
420 double maxChildDeltaRadius = math.min(constraints.maxWidth, constraints.ma
xHeight) / 2.0 - innerRadius; | 419 double maxChildDeltaRadius = math.min(constraints.maxWidth, constraints.ma
xHeight) / 2.0 - innerRadius; |
421 assert(child.parentData is SectorParentData); | 420 assert(child.parentData is SectorParentData); |
422 child.parentData.radius = innerRadius; | 421 child.parentData.radius = innerRadius; |
423 child.parentData.theta = 0.0; | 422 child.parentData.theta = 0.0; |
424 child.layout(new SectorConstraints(maxDeltaRadius: maxChildDeltaRadius), p
arentUsesSize: true); | 423 child.layout(new SectorConstraints(maxDeltaRadius: maxChildDeltaRadius), p
arentUsesSize: true); |
425 double dimension = (innerRadius + child.deltaRadius) * 2.0; | 424 double dimension = (innerRadius + child.deltaRadius) * 2.0; |
426 ourDimensions = new BoxDimensions.withConstraints(constraints, width: dime
nsion, height: dimension); | 425 size = constraints.constrain(new sky.Size(dimension, dimension)); |
427 } | 426 } |
428 width = ourDimensions.width; | |
429 height = ourDimensions.height; | |
430 } | 427 } |
431 | 428 |
432 double width; | |
433 double height; | |
434 | |
435 // paint origin is 0,0 of our circle | 429 // paint origin is 0,0 of our circle |
436 void paint(RenderNodeDisplayList canvas) { | 430 void paint(RenderNodeDisplayList canvas) { |
437 super.paint(canvas); | 431 super.paint(canvas); |
438 if (child != null) | 432 if (child != null) { |
439 canvas.paintChild(child, width/2.0, height/2.0); | 433 sky.Rect bounds = new sky.Rect.fromSize(size); |
| 434 canvas.paintChild(child, bounds.center); |
| 435 } |
440 } | 436 } |
441 | 437 |
442 bool hitTest(HitTestResult result, { double x, double y }) { | 438 bool hitTest(HitTestResult result, { sky.Point position }) { |
| 439 double x = position.x; |
| 440 double y = position.y; |
443 if (child == null) | 441 if (child == null) |
444 return false; | 442 return false; |
445 // translate to our origin | 443 // translate to our origin |
446 x -= width/2.0; | 444 x -= size.width/2.0; |
447 y -= height/2.0; | 445 y -= size.height/2.0; |
448 // convert to radius/theta | 446 // convert to radius/theta |
449 double radius = math.sqrt(x*x+y*y); | 447 double radius = math.sqrt(x*x+y*y); |
450 double theta = (math.atan2(x, -y) - math.PI/2.0) % kTwoPi; | 448 double theta = (math.atan2(x, -y) - math.PI/2.0) % kTwoPi; |
451 if (radius < innerRadius) | 449 if (radius < innerRadius) |
452 return false; | 450 return false; |
453 if (radius >= innerRadius + child.deltaRadius) | 451 if (radius >= innerRadius + child.deltaRadius) |
454 return false; | 452 return false; |
455 if (theta > child.deltaTheta) | 453 if (theta > child.deltaTheta) |
456 return false; | 454 return false; |
457 child.hitTest(result, radius: radius, theta: theta); | 455 child.hitTest(result, radius: radius, theta: theta); |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
498 rootCircle.add(new RenderSolidColor(0xFF0000FF, desiredDeltaTheta: kTwoPi * 0.
4)); | 496 rootCircle.add(new RenderSolidColor(0xFF0000FF, desiredDeltaTheta: kTwoPi * 0.
4)); |
499 var stack = new RenderSectorSlice(padding: 2.0); | 497 var stack = new RenderSectorSlice(padding: 2.0); |
500 stack.add(new RenderSolidColor(0xFFFFFF00, desiredDeltaRadius: 20.0)); | 498 stack.add(new RenderSolidColor(0xFFFFFF00, desiredDeltaRadius: 20.0)); |
501 stack.add(new RenderSolidColor(0xFFFF9000, desiredDeltaRadius: 20.0)); | 499 stack.add(new RenderSolidColor(0xFFFF9000, desiredDeltaRadius: 20.0)); |
502 stack.add(new RenderSolidColor(0xFF00FF00)); | 500 stack.add(new RenderSolidColor(0xFF00FF00)); |
503 rootCircle.add(stack); | 501 rootCircle.add(stack); |
504 | 502 |
505 var root = new RenderBoxToRenderSectorAdapter(innerRadius: 50.0, child: rootCi
rcle); | 503 var root = new RenderBoxToRenderSectorAdapter(innerRadius: 50.0, child: rootCi
rcle); |
506 app = new AppView(root); | 504 app = new AppView(root); |
507 } | 505 } |
OLD | NEW |