Index: charted/lib/charts/cartesian_renderers/bubble_chart_renderer.dart |
diff --git a/charted/lib/charts/cartesian_renderers/bubble_chart_renderer.dart b/charted/lib/charts/cartesian_renderers/bubble_chart_renderer.dart |
deleted file mode 100644 |
index 7c285cc83bfe28a77d181b2f6e224d3579efed98..0000000000000000000000000000000000000000 |
--- a/charted/lib/charts/cartesian_renderers/bubble_chart_renderer.dart |
+++ /dev/null |
@@ -1,158 +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 BubbleChartRenderer extends CartesianRendererBase { |
- final Iterable<int> dimensionsUsingBand = const[]; |
- final double maxBubbleRadius; |
- final bool alwaysAnimate; |
- |
- Element _host; |
- Selection _group; |
- SelectionScope _scope; |
- |
- @override |
- final String name = "bubble-rdr"; |
- |
- BubbleChartRenderer({ |
- this.maxBubbleRadius: 20.0, |
- this.alwaysAnimate: false}); |
- |
- /* |
- * BubbleChart needs two dimension axes. |
- */ |
- @override |
- bool prepare(ChartArea area, ChartSeries series) { |
- _ensureAreaAndSeries(area, series); |
- return area is CartesianArea && area.useTwoDimensionAxes == true; |
- } |
- |
- @override |
- void draw(Element element, {Future schedulePostRender}) { |
- assert(series != null && area != null); |
- assert(element != null && element is GElement); |
- |
- if (_scope == null) { |
- _host = element; |
- _scope = new SelectionScope.element(element); |
- _group = _scope.selectElements([_host]); |
- } |
- |
- var geometry = area.layout.renderArea, |
- bubbleRadiusScale = area.measureScales(series).first, |
- xDimensionScale = area.dimensionScales.first, |
- yDimensionScale = area.dimensionScales.last, |
- theme = area.theme, |
- bubbleRadiusFactor = |
- maxBubbleRadius / min([geometry.width, geometry.height]); |
- |
- String color(i) => theme.getColorForKey(series.measures.elementAt(i)); |
- |
- // Measure values used to set size of the bubble. |
- var columns = []; |
- for (int m in series.measures) { |
- columns.add(new List.from( |
- area.data.rows.map((Iterable row) => row.elementAt(m)))); |
- } |
- |
- // Dimension values used to position the bubble. |
- var xDimensionIndex = area.config.dimensions.first, |
- yDimensionIndex = area.config.dimensions.last, |
- xDimensionVals = [], |
- yDimensionVals = []; |
- for (var row in area.data.rows) { |
- xDimensionVals.add(row.elementAt(xDimensionIndex)); |
- yDimensionVals.add(row.elementAt(yDimensionIndex)); |
- } |
- |
- var group = _group.selectAll('.measure-group').data(columns); |
- group.enter.append('g')..classed('measure-group'); |
- group.each((d, i, e) { |
- e.style.setProperty('fill', color(i)); |
- e.attributes['data-column'] = series.measures.elementAt(i); |
- }); |
- group.exit.remove(); |
- |
- var measures = group.selectAll('.bubble').dataWithCallback( |
- (d, i, e) => columns[i]); |
- |
- measures.enter.append('circle')..classed('bubble'); |
- measures.each((d, i, e) { |
- e.attributes |
- ..['transform'] = 'translate(' |
- '${xDimensionScale.scale(xDimensionVals[i])},' |
- '${yDimensionScale.scale(yDimensionVals[i])})' |
- ..['r'] = '${bubbleRadiusScale.scale(d) * bubbleRadiusFactor}' |
- ..['data-row'] = i; |
- }); |
- measures.exit.remove(); |
- handleStateChanges([]); |
- } |
- |
- @override |
- void dispose() { |
- if (_group == null) return; |
- _group.selectAll('.row-group').remove(); |
- } |
- |
- @override |
- double get bandInnerPadding => 1.0; |
- |
- @override |
- double get bandOuterPadding => |
- area.theme.getDimensionAxisTheme().axisOuterPadding; |
- |
- @override |
- Extent get extent { |
- assert(series != null && area != null); |
- var rows = area.data.rows, |
- max = rows[0][series.measures.first], |
- min = max; |
- |
- rows.forEach((row) { |
- series.measures.forEach((idx) { |
- if (row[idx] > max) max = row[idx]; |
- if (row[idx] < min) min = row[idx]; |
- }); |
- }); |
- return new Extent(min, max); |
- } |
- |
- @override |
- void handleStateChanges(List<ChangeRecord> changes) { |
- var groups = host.querySelectorAll('.bar-rdr-rowgroup'); |
- if (groups == null || groups.isEmpty) return; |
- |
- for(int i = 0, len = groups.length; i < len; ++i) { |
- var group = groups.elementAt(i), |
- bars = group.querySelectorAll('.bar-rdr-bar'), |
- row = int.parse(group.dataset['row']); |
- |
- for(int j = 0, barsCount = bars.length; j < barsCount; ++j) { |
- var bar = bars.elementAt(j), |
- column = int.parse(bar.dataset['column']), |
- color = colorForValue(column, row); |
- |
- bar.classes.removeAll(ChartState.VALUE_CLASS_NAMES); |
- bar.classes.addAll(stylesForValue(column, row)); |
- bar.style |
- ..setProperty('fill', color) |
- ..setProperty('stroke', color); |
- } |
- } |
- } |
- |
- void _event(StreamController controller, data, int index, Element e) { |
- if (controller == null) return; |
- var rowStr = e.parent.dataset['row']; |
- var row = rowStr != null ? int.parse(rowStr) : null; |
- controller.add( |
- new DefaultChartEventImpl(_scope.event, area, series, row, index, data)); |
- } |
-} |