OLD | NEW |
1 // | 1 // |
2 // Copyright 2014 Google Inc. All rights reserved. | 2 // Copyright 2014 Google Inc. All rights reserved. |
3 // | 3 // |
4 // Use of this source code is governed by a BSD-style | 4 // Use of this source code is governed by a BSD-style |
5 // license that can be found in the LICENSE file or at | 5 // license that can be found in the LICENSE file or at |
6 // https://developers.google.com/open-source/licenses/bsd | 6 // https://developers.google.com/open-source/licenses/bsd |
7 // | 7 // |
8 | 8 |
9 part of charted.charts; | 9 part of charted.charts; |
10 | 10 |
(...skipping 29 matching lines...) Expand all Loading... |
40 var rows = new List() | 40 var rows = new List() |
41 ..addAll(area.data.rows.map((e) => new List.generate( | 41 ..addAll(area.data.rows.map((e) => new List.generate( |
42 measuresCount, (i) => e[series.measures.elementAt(i)]))); | 42 measuresCount, (i) => e[series.measures.elementAt(i)]))); |
43 | 43 |
44 var dimensionVals = area.data.rows | 44 var dimensionVals = area.data.rows |
45 .map((row) => row.elementAt(area.config.dimensions.first)) | 45 .map((row) => row.elementAt(area.config.dimensions.first)) |
46 .toList(); | 46 .toList(); |
47 | 47 |
48 var bars = new OrdinalScale() | 48 var bars = new OrdinalScale() |
49 ..domain = new Range(series.measures.length).toList() | 49 ..domain = new Range(series.measures.length).toList() |
50 ..rangeRoundBands([0, dimensionScale.rangeBand]); | 50 ..rangeRoundBands([0, (dimensionScale as OrdinalScale).rangeBand]); |
51 | 51 |
52 // Create and update the bar groups. | 52 // Create and update the bar groups. |
53 | 53 |
54 var groups = root.selectAll('.bar-rdr-rowgroup').data(rows); | 54 var groups = root.selectAll('.bar-rdr-rowgroup').data(rows); |
55 var animateBarGroups = alwaysAnimate || !groups.isEmpty; | 55 var animateBarGroups = alwaysAnimate || !groups.isEmpty; |
56 | 56 |
57 groups.enter.append('g') | 57 groups.enter.append('g') |
58 ..classed('bar-rdr-rowgroup') | 58 ..classed('bar-rdr-rowgroup') |
59 ..attrWithCallback( | 59 ..attrWithCallback( |
60 'transform', | 60 'transform', |
(...skipping 27 matching lines...) Expand all Loading... |
88 var bar = | 88 var bar = |
89 groups.selectAll('.bar-rdr-bar').dataWithCallback((d, i, c) => rows[i]), | 89 groups.selectAll('.bar-rdr-bar').dataWithCallback((d, i, c) => rows[i]), |
90 scaled0 = measureScale.scale(0).round(); | 90 scaled0 = measureScale.scale(0).round(); |
91 | 91 |
92 var getBarLength = (d) { | 92 var getBarLength = (d) { |
93 var scaledVal = measureScale.scale(d).round(), | 93 var scaledVal = measureScale.scale(d).round(), |
94 ht = verticalBars | 94 ht = verticalBars |
95 ? (d >= 0 ? scaled0 - scaledVal : scaledVal - scaled0) | 95 ? (d >= 0 ? scaled0 - scaledVal : scaledVal - scaled0) |
96 : (d >= 0 ? scaledVal - scaled0 : scaled0 - scaledVal); | 96 : (d >= 0 ? scaledVal - scaled0 : scaled0 - scaledVal); |
97 ht = ht - strokeWidth; | 97 ht = ht - strokeWidth; |
98 return (ht < 0) ? 0 : ht; | 98 |
| 99 // If bar would be scaled to 0 height but data is not 0, render bar |
| 100 // at 1 pixel so user can see and hover over to see the data. |
| 101 return (ht < 0) ? 1 : ht; |
99 }; | 102 }; |
100 var getBarPos = (d) { | 103 var getBarPos = (d) { |
101 var scaledVal = measureScale.scale(d).round(); | 104 var scaledVal = measureScale.scale(d).round(); |
| 105 |
| 106 // If bar would be scaled to 0 height but data is not 0, reserve 1 pixel |
| 107 // height plus strokeWidthOffset to position the bar. |
| 108 if (scaledVal == scaled0) { |
| 109 return verticalBars |
| 110 ? d > 0 |
| 111 ? scaled0 - 1 - strokeWidthOffset |
| 112 : scaled0 + strokeWidthOffset |
| 113 : d > 0 |
| 114 ? scaled0 + strokeWidthOffset |
| 115 : scaled0 - 1 - strokeWidthOffset; |
| 116 } |
102 return verticalBars | 117 return verticalBars |
103 ? (d >= 0 ? scaledVal : scaled0) + strokeWidthOffset | 118 ? (d >= 0 ? scaledVal : scaled0) + strokeWidthOffset |
104 : (d >= 0 ? scaled0 : scaledVal) + strokeWidthOffset; | 119 : (d >= 0 ? scaled0 : scaledVal) + strokeWidthOffset; |
105 }; | 120 }; |
106 var buildPath = (d, int i, bool animate) { | 121 var buildPath = (d, int i, bool animate) { |
| 122 // If data is null or 0, an empty path for the bar is returned directly. |
107 if (d == null || d == 0) return ''; | 123 if (d == null || d == 0) return ''; |
108 if (verticalBars) { | 124 if (verticalBars) { |
109 var fn = d > 0 ? topRoundedRect : bottomRoundedRect; | 125 var fn = d > 0 ? topRoundedRect : bottomRoundedRect; |
110 return fn( | 126 return fn( |
111 bars.scale(i).toInt() + strokeWidthOffset, | 127 bars.scale(i).toInt() + strokeWidthOffset, |
112 animate ? rect.height : getBarPos(d), | 128 animate ? rect.height : getBarPos(d), |
113 barWidth, | 129 barWidth, |
114 animate ? 0 : getBarLength(d), | 130 animate ? 0 : getBarLength(d), |
115 RADIUS); | 131 RADIUS); |
116 } else { | 132 } else { |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
231 } | 247 } |
232 | 248 |
233 void _event(StreamController controller, data, int index, Element e) { | 249 void _event(StreamController controller, data, int index, Element e) { |
234 if (controller == null) return; | 250 if (controller == null) return; |
235 var rowStr = e.parent.dataset['row']; | 251 var rowStr = e.parent.dataset['row']; |
236 var row = rowStr != null ? int.parse(rowStr) : null; | 252 var row = rowStr != null ? int.parse(rowStr) : null; |
237 controller.add(new DefaultChartEventImpl(scope.event, area, series, row, | 253 controller.add(new DefaultChartEventImpl(scope.event, area, series, row, |
238 series.measures.elementAt(index), data)); | 254 series.measures.elementAt(index), data)); |
239 } | 255 } |
240 } | 256 } |
OLD | NEW |