sector.dart 4.8 KB
Newer Older
1 2 3 4 5 6
// 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;

7 8
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
9

Hixie's avatar
Hixie committed
10
import 'package:flutter_rendering_examples/sector_layout.dart';
11 12 13 14 15 16 17 18

RenderBox initCircle() {
  return new RenderBoxToRenderSectorAdapter(
    innerRadius: 25.0,
    child: new RenderSectorRing(padding: 0.0)
  );
}

Hixie's avatar
Hixie committed
19 20 21 22 23
class SectorApp extends StatefulComponent {
  SectorAppState createState() => new SectorAppState();
}

class SectorAppState extends State<SectorApp> {
24

Hixie's avatar
Hixie committed
25 26
  final RenderBoxToRenderSectorAdapter sectors = initCircle();
  final math.Random rand = new math.Random(1);
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58

  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));

Hixie's avatar
Hixie committed
59 60
  bool _enabledAdd = true;
  bool _enabledRemove = false;
61 62 63 64
  void updateEnabledState() {
    setState(() {
      var ring = (sectors.child as RenderSectorRing);
      SectorDimensions currentSize = ring.getIntrinsicDimensions(const SectorConstraints(), ring.deltaRadius);
Hixie's avatar
Hixie committed
65 66
      _enabledAdd = currentSize.deltaTheta < kTwoPi;
      _enabledRemove = ring.firstChild != null;
67 68 69 70 71
    });
  }

  Widget buildBody() {
    return new Material(
Hixie's avatar
Hixie committed
72
      child: new Column(<Widget>[
73 74
          new Container(
            padding: new EdgeDims.symmetric(horizontal: 8.0, vertical: 25.0),
Hixie's avatar
Hixie committed
75
            child: new Row(<Widget>[
76
                new RaisedButton(
Hixie's avatar
Hixie committed
77
                  enabled: _enabledAdd,
78
                  child: new IntrinsicWidth(
Hixie's avatar
Hixie committed
79
                    child: new Row(<Widget>[
80 81 82 83 84 85 86 87 88 89 90
                      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(
Hixie's avatar
Hixie committed
91
                  enabled: _enabledRemove,
92
                  child: new IntrinsicWidth(
Hixie's avatar
Hixie committed
93
                    child: new Row(<Widget>[
94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
                      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(
112
                border: new Border.all(color: new Color(0xFF000000))
113 114 115 116 117 118 119 120 121 122 123
              ),
              padding: new EdgeDims.all(8.0),
              child: new WidgetToRenderBoxAdapter(sectors)
            )
          ),
        ],
        justifyContent: FlexJustifyContent.spaceBetween
      )
    );
  }

Hixie's avatar
Hixie committed
124 125 126 127 128 129 130 131 132 133 134 135 136 137
  Widget build(BuildContext context) {
    return new MaterialApp(
      theme: new ThemeData.light(),
      title: 'Sector Layout',
      routes: <String, RouteBuilder>{
        '/': (RouteArguments args) {
          return new Scaffold(
            toolBar: new ToolBar(
              center: new Text('Sector Layout in a Widget Tree')
            ),
            body: buildBody()
          );
        }
      }
138 139 140 141 142 143 144
    );
  }
}

void main() {
  runApp(new SectorApp());
}