diff --git a/sky/packages/sky/lib/rendering/grid.dart b/sky/packages/sky/lib/rendering/grid.dart index 4cd90c0716a..37186d93290 100644 --- a/sky/packages/sky/lib/rendering/grid.dart +++ b/sky/packages/sky/lib/rendering/grid.dart @@ -10,11 +10,14 @@ class GridParentData extends BoxParentData with ContainerParentDataMixin width) { // TODO(eseidel): We should snap to pixel bounderies. @@ -50,6 +53,14 @@ class RenderGrid extends RenderBox with ContainerRenderObjectMixin _maxChildExtent; + void set maxChildExtent (double value) { + if (_maxChildExtent != value) { + _maxChildExtent = value; + markNeedsLayout(); + } + } + void setupParentData(RenderBox child) { if (child.parentData is! GridParentData) child.parentData = new GridParentData(); @@ -93,7 +104,7 @@ class RenderGrid extends RenderBox with ContainerRenderObjectMixin super.renderObject; } +class Grid extends MultiChildRenderObjectWrapper { + Grid(List children, { Key key, this.maxChildExtent }) + : super(key: key, children: children); + + final double maxChildExtent; + + RenderGrid createNode() => new RenderGrid(maxChildExtent: maxChildExtent); + RenderGrid get renderObject => super.renderObject; + + void syncRenderObject(Widget old) { + super.syncRenderObject(old); + renderObject.maxChildExtent = maxChildExtent; + } +} + class Positioned extends ParentDataNode { Positioned({ Key key, @@ -495,7 +511,6 @@ class Flex extends MultiChildRenderObjectWrapper { renderObject.alignItems = alignItems; renderObject.textBaseline = textBaseline; } - } class Row extends Flex { diff --git a/sky/unit/test/rendering/grid_test.dart b/sky/unit/test/rendering/grid_test.dart new file mode 100644 index 00000000000..2898c008cac --- /dev/null +++ b/sky/unit/test/rendering/grid_test.dart @@ -0,0 +1,40 @@ +import 'package:sky/rendering.dart'; +import 'package:test/test.dart'; + +import 'rendering_tester.dart'; + +void main() { + test('Basic grid layout test', () { + List children = [ + new RenderDecoratedBox(decoration: new BoxDecoration()), + new RenderDecoratedBox(decoration: new BoxDecoration()), + new RenderDecoratedBox(decoration: new BoxDecoration()), + new RenderDecoratedBox(decoration: new BoxDecoration()) + ]; + + RenderBox grid = new RenderGrid(children: children, maxChildExtent: 100.0); + RenderingTester tester = layout(grid, constraints: const BoxConstraints(maxWidth: 200.0)); + + children.forEach((child) { + expect(child.size.width, equals(100.0), reason: "child width"); + expect(child.size.height, equals(100.0), reason: "child height"); + }); + + expect(grid.size.width, equals(200.0), reason: "grid width"); + expect(grid.size.height, equals(200.0), reason: "grid height"); + + expect(grid.needsLayout, equals(false)); + grid.maxChildExtent = 60.0; + expect(grid.needsLayout, equals(true)); + + tester.pumpFrame(phase: EnginePhase.layout); + + children.forEach((child) { + expect(child.size.width, equals(50.0), reason: "child width"); + expect(child.size.height, equals(50.0), reason: "child height"); + }); + + expect(grid.size.width, equals(200.0), reason: "grid width"); + expect(grid.size.height, equals(50.0), reason: "grid height"); + }); +}