Commit 249dc8af authored by Hixie's avatar Hixie

Create an example app that demonstrates interactive coordination of an fn tree...

Create an example app that demonstrates interactive coordination of an fn tree and a raw RenderObject tree.

Sector changes:
- implement the intrinsic sizing box API on RenderBoxToRenderSectorAdapter
- remove some debug print statements
- fix getIntrinsicDimensions() on RenderSolidColor to return true values
- factor out the default demo

RenderObject changes:
- BoxConstraints.isInfinite() now returns true only if both dimensions are infinite

fn changes:
- implement UINodeToRenderBoxAdapter
- rename RenderObjectToUINodeAdapter to RenderBoxToUINodeAdapter

Tests:
- add a test for sector layout
- make TestRenderView support being run without the unit test framework

R=abarth@chromium.org

Review URL: https://codereview.chromium.org/1175423007.
parent 395f92ba
...@@ -99,7 +99,7 @@ abstract class RenderSector extends RenderObject { ...@@ -99,7 +99,7 @@ abstract class RenderSector extends RenderObject {
double deltaTheta; double deltaTheta;
} }
class RenderDecoratedSector extends RenderSector { abstract class RenderDecoratedSector extends RenderSector {
RenderDecoratedSector(BoxDecoration decoration) : _decoration = decoration; RenderDecoratedSector(BoxDecoration decoration) : _decoration = decoration;
...@@ -134,6 +134,7 @@ class RenderDecoratedSector extends RenderSector { ...@@ -134,6 +134,7 @@ class RenderDecoratedSector extends RenderSector {
canvas.drawPath(path, paint); canvas.drawPath(path, paint);
} }
} }
} }
class SectorChildListParentData extends SectorParentData with ContainerParentDataMixin<RenderSector> { } class SectorChildListParentData extends SectorParentData with ContainerParentDataMixin<RenderSector> { }
...@@ -397,9 +398,31 @@ class RenderBoxToRenderSectorAdapter extends RenderBox { ...@@ -397,9 +398,31 @@ class RenderBoxToRenderSectorAdapter extends RenderBox {
child.parentData = new SectorParentData(); child.parentData = new SectorParentData();
} }
Size getIntrinsicDimensions(BoxConstraints constraints) { double getMinIntrinsicWidth(BoxConstraints constraints) {
if (child == null)
return super.getMinIntrinsicWidth(constraints);
return getIntrinsicDimensions(constraints).width;
}
double getMaxIntrinsicWidth(BoxConstraints constraints) {
if (child == null) if (child == null)
return constraints.constrain(Size.zero); return super.getMaxIntrinsicWidth(constraints);
return getIntrinsicDimensions(constraints).width;
}
double getMinIntrinsicHeight(BoxConstraints constraints) {
if (child == null)
return super.getMinIntrinsicHeight(constraints);
return getIntrinsicDimensions(constraints).height;
}
double getMaxIntrinsicHeight(BoxConstraints constraints) {
if (child == null)
return super.getMaxIntrinsicHeight(constraints);
return getIntrinsicDimensions(constraints).height;
}
Size getIntrinsicDimensions(BoxConstraints constraints) {
assert(child is RenderSector); assert(child is RenderSector);
assert(child.parentData is SectorParentData); assert(child.parentData is SectorParentData);
assert(!constraints.isInfinite); assert(!constraints.isInfinite);
...@@ -415,9 +438,7 @@ class RenderBoxToRenderSectorAdapter extends RenderBox { ...@@ -415,9 +438,7 @@ class RenderBoxToRenderSectorAdapter extends RenderBox {
} else { } else {
assert(child is RenderSector); assert(child is RenderSector);
assert(!constraints.isInfinite); assert(!constraints.isInfinite);
print("constraint maxes: ${constraints.maxWidth} and ${constraints.maxHeight}");
double maxChildDeltaRadius = math.min(constraints.maxWidth, constraints.maxHeight) / 2.0 - innerRadius; double maxChildDeltaRadius = math.min(constraints.maxWidth, constraints.maxHeight) / 2.0 - innerRadius;
print("maxChildDeltaRadius = $maxChildDeltaRadius");
assert(child.parentData is SectorParentData); assert(child.parentData is SectorParentData);
child.parentData.radius = innerRadius; child.parentData.radius = innerRadius;
child.parentData.theta = 0.0; child.parentData.theta = 0.0;
...@@ -472,7 +493,7 @@ class RenderSolidColor extends RenderDecoratedSector { ...@@ -472,7 +493,7 @@ class RenderSolidColor extends RenderDecoratedSector {
final Color backgroundColor; final Color backgroundColor;
SectorDimensions getIntrinsicDimensions(SectorConstraints constraints, double radius) { SectorDimensions getIntrinsicDimensions(SectorConstraints constraints, double radius) {
return new SectorDimensions.withConstraints(constraints, deltaTheta: 1.0); // 1.0 radians return new SectorDimensions.withConstraints(constraints, deltaTheta: desiredDeltaTheta);
} }
void performLayout() { void performLayout() {
...@@ -488,19 +509,18 @@ class RenderSolidColor extends RenderDecoratedSector { ...@@ -488,19 +509,18 @@ class RenderSolidColor extends RenderDecoratedSector {
} }
} }
AppView app; RenderBox buildSectorExample() {
RenderSectorRing rootCircle = new RenderSectorRing(padding: 20.0);
void main() {
var rootCircle = new RenderSectorRing(padding: 20.0);
rootCircle.add(new RenderSolidColor(const Color(0xFF00FFFF), desiredDeltaTheta: kTwoPi * 0.15)); rootCircle.add(new RenderSolidColor(const Color(0xFF00FFFF), desiredDeltaTheta: kTwoPi * 0.15));
rootCircle.add(new RenderSolidColor(const Color(0xFF0000FF), desiredDeltaTheta: kTwoPi * 0.4)); rootCircle.add(new RenderSolidColor(const Color(0xFF0000FF), desiredDeltaTheta: kTwoPi * 0.4));
var stack = new RenderSectorSlice(padding: 2.0); RenderSectorSlice stack = new RenderSectorSlice(padding: 2.0);
stack.add(new RenderSolidColor(const Color(0xFFFFFF00), desiredDeltaRadius: 20.0)); stack.add(new RenderSolidColor(const Color(0xFFFFFF00), desiredDeltaRadius: 20.0));
stack.add(new RenderSolidColor(const Color(0xFFFF9000), desiredDeltaRadius: 20.0)); stack.add(new RenderSolidColor(const Color(0xFFFF9000), desiredDeltaRadius: 20.0));
stack.add(new RenderSolidColor(const Color(0xFF00FF00))); stack.add(new RenderSolidColor(const Color(0xFF00FF00)));
rootCircle.add(stack); rootCircle.add(stack);
return new RenderBoxToRenderSectorAdapter(innerRadius: 50.0, child: rootCircle);
}
var root = new RenderBoxToRenderSectorAdapter(innerRadius: 50.0, child: rootCircle); void main() {
app = new AppView(root: root); new AppView(root: buildSectorExample());
} }
...@@ -216,6 +216,6 @@ void main() { ...@@ -216,6 +216,6 @@ void main() {
App app = new StocksApp(); App app = new StocksApp();
UINodeAppView.appView.onFrame = () { UINodeAppView.appView.onFrame = () {
// uncomment this for debugging: // uncomment this for debugging:
// app.appView.debugDumpRenderTree(); // UINodeAppView.appView.debugDumpRenderTree();
}; };
} }
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:math' as math;
import 'package:sky/rendering/box.dart';
import 'package:sky/rendering/flex.dart';
import 'package:sky/theme2/colors.dart';
import 'package:sky/theme2/edges.dart';
import 'package:sky/theme2/typography.dart';
import 'package:sky/widgets/basic.dart';
import 'package:sky/widgets/material.dart';
import 'package:sky/widgets/raised_button.dart';
import 'package:sky/widgets/scaffold.dart';
import 'package:sky/widgets/tool_bar.dart';
import 'package:sky/widgets/ui_node.dart';
import '../rendering/sector_layout.dart';
RenderBox initCircle() {
return new RenderBoxToRenderSectorAdapter(
innerRadius: 25.0,
child: new RenderSectorRing(padding: 0.0)
);
}
class SectorApp extends App {
RenderBoxToRenderSectorAdapter sectors = initCircle();
math.Random rand = new math.Random();
void addSector() {
double deltaTheta;
var ring = (sectors.child as RenderSectorRing);
SectorDimensions currentSize = ring.getIntrinsicDimensions(const SectorConstraints(), ring.deltaRadius);
if (currentSize.deltaTheta >= kTwoPi - (math.PI * 0.2 + 0.05))
deltaTheta = kTwoPi - currentSize.deltaTheta;
else
deltaTheta = math.PI * rand.nextDouble() / 5.0 + 0.05;
Color color = new Color(((0xFF << 24) + rand.nextInt(0xFFFFFF)) | 0x808080);
ring.add(new RenderSolidColor(color, desiredDeltaTheta: deltaTheta));
updateEnabledState();
}
void removeSector() {
(sectors.child as RenderSectorRing).remove((sectors.child as RenderSectorRing).lastChild);
updateEnabledState();
}
static RenderBox initSector(Color color) {
RenderSectorRing ring = new RenderSectorRing(padding: 1.0);
ring.add(new RenderSolidColor(const Color(0xFF909090), desiredDeltaTheta: kTwoPi * 0.15));
ring.add(new RenderSolidColor(const Color(0xFF909090), desiredDeltaTheta: kTwoPi * 0.15));
ring.add(new RenderSolidColor(color, desiredDeltaTheta: kTwoPi * 0.2));
return new RenderBoxToRenderSectorAdapter(
innerRadius: 5.0,
child: ring
);
}
RenderBoxToRenderSectorAdapter sectorAddIcon = initSector(const Color(0xFF00DD00));
RenderBoxToRenderSectorAdapter sectorRemoveIcon = initSector(const Color(0xFFDD0000));
bool enabledAdd = true;
bool enabledRemove = false;
void updateEnabledState() {
setState(() {
var ring = (sectors.child as RenderSectorRing);
SectorDimensions currentSize = ring.getIntrinsicDimensions(const SectorConstraints(), ring.deltaRadius);
enabledAdd = currentSize.deltaTheta < kTwoPi;
enabledRemove = ring.firstChild != null;
});
}
UINode build() {
return new Scaffold(
toolbar: new ToolBar(
center: new Text('Sector Layout in a Widget Tree', style: white.title),
backgroundColor: Blue[500]),
body: new Material(
edge: MaterialEdge.canvas,
child: new Flex([
new Container(
padding: new EdgeDims.symmetric(horizontal: 8.0, vertical: 25.0),
child: new Flex([
new RaisedButton(
key: 'add-button',
enabled: enabledAdd,
child: new ShrinkWrapWidth(
child: new Flex([
new Container(
padding: new EdgeDims.all(4.0),
margin: new EdgeDims.only(right: 10.0),
child: new UINodeToRenderBoxAdapter(sectorAddIcon)
),
new Text('ADD SECTOR'),
])
),
onPressed: addSector
),
new RaisedButton(
key: 'remove-button',
enabled: enabledRemove,
child: new ShrinkWrapWidth(
child: new Flex([
new Container(
padding: new EdgeDims.all(4.0),
margin: new EdgeDims.only(right: 10.0),
child: new UINodeToRenderBoxAdapter(sectorRemoveIcon)
),
new Text('REMOVE SECTOR'),
])
),
onPressed: removeSector
)
],
justifyContent: FlexJustifyContent.spaceAround
)
),
new Flexible(
child: new Container(
margin: new EdgeDims.all(8.0),
decoration: new BoxDecoration(
border: new Border.all(new BorderSide(color: new Color(0xFF000000)))
),
padding: new EdgeDims.all(8.0),
child: new UINodeToRenderBoxAdapter(sectors)
)
),
],
direction: FlexDirection.vertical,
justifyContent: FlexJustifyContent.spaceBetween
)
)
);
}
}
void main() {
App app = new SectorApp();
UINodeAppView.appView.onFrame = () {
// uncomment this for debugging:
// UINodeAppView.appView.debugDumpRenderTree();
};
}
...@@ -76,16 +76,16 @@ void rotate(double timeStamp) { ...@@ -76,16 +76,16 @@ void rotate(double timeStamp) {
void main() { void main() {
// Because we're going to use UINodes, we want to initialise its // Because we're going to use UINodes, we want to initialise its
// AppView, not use the default one. We don't really need to do // AppView, not use the default one. We don't really need to do
// this, because RenderObjectToUINodeAdapter does it for us, but // this, because RenderBoxToUINodeAdapter does it for us, but
// it's good practice in case we happen to not have a // it's good practice in case we happen to not have a
// RenderObjectToUINodeAdapter in our tree at startup, or in case we // RenderBoxToUINodeAdapter in our tree at startup, or in case we
// want a renderViewOverride. // want a renderViewOverride.
UINodeAppView.initUINodeAppView(); UINodeAppView.initUINodeAppView();
RenderFlex flexRoot = new RenderFlex(direction: FlexDirection.vertical); RenderFlex flexRoot = new RenderFlex(direction: FlexDirection.vertical);
RenderProxyBox proxy = new RenderProxyBox(); RenderProxyBox proxy = new RenderProxyBox();
new RenderObjectToUINodeAdapter(proxy, builder); // adds itself to proxy new RenderBoxToUINodeAdapter(proxy, builder); // adds itself to proxy
addFlexChildSolidColor(flexRoot, const sky.Color(0xFFFF00FF), flex: 1); addFlexChildSolidColor(flexRoot, const sky.Color(0xFFFF00FF), flex: 1);
flexRoot.add(proxy); flexRoot.add(proxy);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment