| Index: charted/lib/charts/layout_renderers/pie_chart_renderer.dart
|
| diff --git a/charted/lib/charts/layout_renderers/pie_chart_renderer.dart b/charted/lib/charts/layout_renderers/pie_chart_renderer.dart
|
| deleted file mode 100644
|
| index 03941d63798358185bf97eb79972de7b2058b4a9..0000000000000000000000000000000000000000
|
| --- a/charted/lib/charts/layout_renderers/pie_chart_renderer.dart
|
| +++ /dev/null
|
| @@ -1,182 +0,0 @@
|
| -//
|
| -// Copyright 2014 Google Inc. All rights reserved.
|
| -//
|
| -// Use of this source code is governed by a BSD-style
|
| -// license that can be found in the LICENSE file or at
|
| -// https://developers.google.com/open-source/licenses/bsd
|
| -//
|
| -
|
| -part of charted.charts;
|
| -
|
| -class PieChartRenderer extends LayoutRendererBase {
|
| - static const STATS_PERCENTAGE = 'percentage-only';
|
| - static const STATS_VALUE = 'value-only';
|
| - static const STATS_VALUE_PERCENTAGE = 'value-percentage';
|
| -
|
| - final Iterable<int> dimensionsUsingBand = const[];
|
| - final String statsMode;
|
| - final num innerRadiusRatio;
|
| - final int maxSliceCount;
|
| - final String otherItemsLabel;
|
| - final String otherItemsColor;
|
| - final showLabels;
|
| - final sortDataByValue;
|
| -
|
| - @override
|
| - final String name = "pie-rdr";
|
| -
|
| - final List<ChartLegendItem> _legend = [];
|
| -
|
| - Iterable otherRow;
|
| -
|
| - PieChartRenderer({
|
| - num innerRadiusRatio: 0,
|
| - bool showLabels,
|
| - this.sortDataByValue: true,
|
| - this.statsMode: STATS_PERCENTAGE,
|
| - this.maxSliceCount: SMALL_INT_MAX,
|
| - this.otherItemsLabel: 'Other',
|
| - this.otherItemsColor: '#EEEEEE'})
|
| - : showLabels = showLabels == null ? innerRadiusRatio == 0 : showLabels,
|
| - innerRadiusRatio = innerRadiusRatio;
|
| -
|
| - /// Returns false if the number of dimension axes != 0. Pie chart can only
|
| - /// be rendered on areas with no axes.
|
| - @override
|
| - bool prepare(ChartArea area, ChartSeries series) {
|
| - _ensureAreaAndSeries(area, series);
|
| - return area is LayoutArea;
|
| - }
|
| -
|
| - @override
|
| - Iterable<ChartLegendItem> layout(
|
| - Element element, {Future schedulePostRender}) {
|
| - _ensureReadyToDraw(element);
|
| -
|
| - var radius = math.min(rect.width, rect.height) / 2;
|
| - root.attr('transform', 'translate(${rect.width / 2}, ${rect.height / 2})');
|
| -
|
| - // Pick only items that are valid - non-null and don't have null value
|
| - var measure = series.measures.first,
|
| - dimension = area.config.dimensions.first,
|
| - indices = new List.generate(area.data.rows.length, (i) => i);
|
| -
|
| - // Sort row indices by value.
|
| - if (sortDataByValue) {
|
| - indices.sort((int a, int b) {
|
| - var aRow = area.data.rows.elementAt(a),
|
| - bRow = area.data.rows.elementAt(b),
|
| - aVal = (aRow == null || aRow.elementAt(measure) == null)
|
| - ? 0
|
| - : aRow.elementAt(measure),
|
| - bVal = (bRow == null || bRow.elementAt(measure) == null)
|
| - ? 0
|
| - : bRow.elementAt(measure);
|
| - return bVal.compareTo(aVal);
|
| - });
|
| - }
|
| -
|
| - // Limit items to the passed maxSliceCount
|
| - if (indices.length > maxSliceCount) {
|
| - var displayed = indices.take(maxSliceCount).toList();
|
| - var otherItemsValue = 0;
|
| - for (int i = displayed.length; i < indices.length; ++i) {
|
| - var index = indices.elementAt(i),
|
| - row = area.data.rows.elementAt(index);
|
| - otherItemsValue += row == null || row.elementAt(measure) == null
|
| - ? 0
|
| - : row.elementAt(measure);
|
| - }
|
| - otherRow = new List(max([dimension, measure]) + 1)
|
| - ..[dimension] = otherItemsLabel
|
| - ..[measure] = otherItemsValue;
|
| - indices = displayed..add(SMALL_INT_MAX);
|
| - } else {
|
| - otherRow = null;
|
| - }
|
| -
|
| - if (area.config.isRTL) {
|
| - indices = indices.reversed.toList();
|
| - }
|
| -
|
| - var accessor = (d, i) {
|
| - var row = d == SMALL_INT_MAX ? otherRow : area.data.rows.elementAt(d);
|
| - return row == null || row.elementAt(measure) == null
|
| - ? 0
|
| - : row.elementAt(measure);
|
| - };
|
| - var data = (new PieLayout()..accessor = accessor).layout(indices),
|
| - arc = new SvgArc(
|
| - innerRadiusCallback: (d, i, e) => innerRadiusRatio * radius,
|
| - outerRadiusCallback: (d, i, e) => radius),
|
| - pie = root.selectAll('.pie-path').data(data);
|
| -
|
| - pie.enter.append('path').classed('pie-path');
|
| - pie
|
| - ..each((d, i, e) {
|
| - var styles = stylesForData(d.data, i);
|
| - e.classes.removeAll(ChartState.VALUE_CLASS_NAMES);
|
| - if (!isNullOrEmpty(styles)) {
|
| - e.classes.addAll(styles);
|
| - }
|
| - e.attributes
|
| - ..['fill'] = colorForData(d.data, i)
|
| - ..['d'] = arc.path(d, i, host)
|
| - ..['stroke-width'] = '1px'
|
| - ..['stroke'] = '#ffffff';
|
| -
|
| - e.append(
|
| - Namespace.createChildElement('text', e)
|
| - ..classes.add('pie-label'));
|
| - })
|
| - ..on('click', (d, i, e) => _event(mouseClickController, d, i, e))
|
| - ..on('mouseover', (d, i, e) => _event(mouseOverController, d, i, e))
|
| - ..on('mouseout', (d, i, e) => _event(mouseOutController, d, i, e));
|
| -
|
| - pie.exit.remove();
|
| -
|
| - _legend.clear();
|
| - var items = new List.generate(data.length, (i) {
|
| - SvgArcData d = data.elementAt(i);
|
| - Iterable row = d.data == SMALL_INT_MAX
|
| - ? otherRow
|
| - : area.data.rows.elementAt(d.data);
|
| -
|
| - return new ChartLegendItem(index: d.data, color: colorForData(d.data, i),
|
| - label: row.elementAt(dimension), series: [series],
|
| - value: '${(((d.endAngle - d.startAngle) * 50) / math.PI).toStringAsFixed(2)}%');
|
| - });
|
| - return _legend..addAll(area.config.isRTL ? items.reversed : items);
|
| - }
|
| -
|
| - String colorForData(int row, int index) =>
|
| - colorForValue(row, isTail: row == SMALL_INT_MAX);
|
| -
|
| - Iterable<String> stylesForData(int row, int i) =>
|
| - stylesForValue(row, isTail: row == SMALL_INT_MAX);
|
| -
|
| - @override
|
| - handleStateChanges(List<ChangeRecord> changes) {
|
| - root.selectAll('.pie-path').each((d, i, e) {
|
| - var styles = stylesForData(d.data, i);
|
| - e.classes.removeAll(ChartState.VALUE_CLASS_NAMES);
|
| - if (!isNullOrEmpty(styles)) {
|
| - e.classes.addAll(styles);
|
| - }
|
| - e.attributes['fill'] = colorForData(d.data, i);
|
| - });
|
| - }
|
| -
|
| - @override
|
| - void dispose() {
|
| - if (root == null) return;
|
| - root.selectAll('.pie-path').remove();
|
| - }
|
| -
|
| - void _event(StreamController controller, data, int index, Element e) {
|
| - // Currently, events are not supported on "Other" pie
|
| - if (controller == null || data.data == SMALL_INT_MAX) return;
|
| - controller.add(new DefaultChartEventImpl(
|
| - scope.event, area, series, data.data, series.measures.first, data.value));
|
| - }
|
| -}
|
|
|