// 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/rendering/sky_binding.dart'; import 'package:sky/theme/colors.dart' as colors; import 'package:sky/theme/edges.dart'; import 'package:sky/theme/theme_data.dart'; import 'package:sky/theme/typography.dart' as typography; 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/theme.dart'; import 'package:sky/widgets/tool_bar.dart'; import 'package:sky/widgets/widget.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(1); 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; }); } Widget build() { return new Theme( data: new ThemeData.light(primary: colors.Blue, darkToolbar: true), child: new Scaffold( toolbar: new ToolBar( center: new Text('Sector Layout in a Widget Tree')), 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( 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 WidgetToRenderBoxAdapter(sectorAddIcon) ), new Text('ADD SECTOR'), ]) ), onPressed: addSector ), new RaisedButton( 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 WidgetToRenderBoxAdapter(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 WidgetToRenderBoxAdapter(sectors) ) ), ], direction: FlexDirection.vertical, justifyContent: FlexJustifyContent.spaceBetween ) ) ) ); } } void main() { runApp(new SectorApp()); SkyBinding.instance.onFrame = () { // uncomment this for debugging: // SkyBinding.instance.debugDumpRenderTree(); }; }