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 |
11 abstract class CartesianRendererBase implements CartesianRenderer { | 11 abstract class CartesianRendererBase implements CartesianRenderer { |
12 final SubscriptionsDisposer _disposer = new SubscriptionsDisposer(); | 12 final SubscriptionsDisposer _disposer = new SubscriptionsDisposer(); |
13 | 13 |
14 CartesianArea area; | 14 CartesianArea area; |
15 ChartSeries series; | 15 ChartSeries series; |
16 ChartTheme theme; | 16 ChartTheme theme; |
17 ChartState state; | 17 ChartState state; |
18 Rect rect; | 18 Rect rect; |
19 | 19 |
20 List<int> _columnStateCache; | 20 List<int> _columnStateCache; |
21 List<Iterable<String>> _columnStylesCache; | 21 List<Iterable<String>> _columnStylesCache; |
22 | 22 |
23 final _valueColorCache = new Map<int,String>(); | 23 final _valueColorCache = new Map<int, String>(); |
24 final _valueFilterCache = new Map<int,String>(); | 24 final _valueFilterCache = new Map<int, String>(); |
25 final _valueStylesCache = new Map<int,Iterable<String>>(); | 25 final _valueStylesCache = new Map<int, Iterable<String>>(); |
26 | 26 |
27 Element host; | 27 Element host; |
28 Selection root; | 28 Selection root; |
29 SelectionScope scope; | 29 SelectionScope scope; |
30 | 30 |
31 StreamController<ChartEvent> mouseOverController; | 31 StreamController<ChartEvent> mouseOverController; |
32 StreamController<ChartEvent> mouseOutController; | 32 StreamController<ChartEvent> mouseOutController; |
33 StreamController<ChartEvent> mouseClickController; | 33 StreamController<ChartEvent> mouseClickController; |
34 | 34 |
35 void _ensureAreaAndSeries(CartesianArea area, ChartSeries series) { | 35 void _ensureAreaAndSeries(CartesianArea area, ChartSeries series) { |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
96 } | 96 } |
97 } | 97 } |
98 } | 98 } |
99 } | 99 } |
100 return new Extent(min, max); | 100 return new Extent(min, max); |
101 } | 101 } |
102 | 102 |
103 @override | 103 @override |
104 Extent extentForRow(Iterable row) { | 104 Extent extentForRow(Iterable row) { |
105 assert(series != null && area != null); | 105 assert(series != null && area != null); |
106 var measures = series.measures, | 106 var measures = series.measures, max = SMALL_INT_MIN, min = SMALL_INT_MAX; |
107 max = SMALL_INT_MIN, | |
108 min = SMALL_INT_MAX; | |
109 | 107 |
110 for (int i = 0, len = measures.length; i < len; ++i) { | 108 for (int i = 0, len = measures.length; i < len; ++i) { |
111 var measure = measures.elementAt(i), | 109 var measure = measures.elementAt(i), value = row.elementAt(measure); |
112 value = row.elementAt(measure); | |
113 if (value != null && value.isFinite) { | 110 if (value != null && value.isFinite) { |
114 if (value > max) { | 111 if (value > max) { |
115 max = value; | 112 max = value; |
116 } else if (value < min) { | 113 } else if (value < min) { |
117 min = value; | 114 min = value; |
118 } | 115 } |
119 } | 116 } |
120 } | 117 } |
121 return new Extent(min, max); | 118 return new Extent(min, max); |
122 } | 119 } |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
176 } | 173 } |
177 } | 174 } |
178 _columnStateCache[column] = flags; | 175 _columnStateCache[column] = flags; |
179 }); | 176 }); |
180 }); | 177 }); |
181 } | 178 } |
182 | 179 |
183 Iterable<String> stylesForColumn(int column) { | 180 Iterable<String> stylesForColumn(int column) { |
184 if (_columnStylesCache[column] == null) { | 181 if (_columnStylesCache[column] == null) { |
185 if (state == null || area.useRowColoring) { | 182 if (state == null || area.useRowColoring) { |
186 _columnStylesCache[column] = const[]; | 183 _columnStylesCache[column] = const []; |
187 } else { | 184 } else { |
188 var styles = [], | 185 var styles = [], flags = _columnStateCache[column]; |
189 flags = _columnStateCache[column]; | |
190 | 186 |
191 if (flags & ChartState.COL_SELECTED != 0) { | 187 if (flags & ChartState.COL_SELECTED != 0) { |
192 styles.add(ChartState.COL_SELECTED_CLASS); | 188 styles.add(ChartState.COL_SELECTED_CLASS); |
193 } else if (flags & ChartState.COL_UNSELECTED != 0){ | 189 } else if (flags & ChartState.COL_UNSELECTED != 0) { |
194 styles.add(ChartState.COL_UNSELECTED_CLASS); | 190 styles.add(ChartState.COL_UNSELECTED_CLASS); |
195 } | 191 } |
196 | 192 |
197 if (flags & ChartState.COL_HIGHLIGHTED != 0) { | 193 if (flags & ChartState.COL_HIGHLIGHTED != 0) { |
198 styles.add(ChartState.COL_HIGHLIGHTED_CLASS); | 194 styles.add(ChartState.COL_HIGHLIGHTED_CLASS); |
199 } else if (flags & ChartState.COL_UNHIGHLIGHTED != 0) { | 195 } else if (flags & ChartState.COL_UNHIGHLIGHTED != 0) { |
200 styles.add(ChartState.COL_UNHIGHLIGHTED_CLASS); | 196 styles.add(ChartState.COL_UNHIGHLIGHTED_CLASS); |
201 } | 197 } |
202 | 198 |
203 if (flags & ChartState.COL_HOVERED != 0) { | 199 if (flags & ChartState.COL_HOVERED != 0) { |
(...skipping 15 matching lines...) Expand all Loading... |
219 String colorForColumn(int column) => | 215 String colorForColumn(int column) => |
220 theme.getColorForKey(column, _columnStateCache[column]); | 216 theme.getColorForKey(column, _columnStateCache[column]); |
221 | 217 |
222 String filterForColumn(int column) => | 218 String filterForColumn(int column) => |
223 theme.getFilterForState(_columnStateCache[column]); | 219 theme.getFilterForState(_columnStateCache[column]); |
224 | 220 |
225 Iterable<String> stylesForValue(int column, int row) { | 221 Iterable<String> stylesForValue(int column, int row) { |
226 var hash = hash2(column, row); | 222 var hash = hash2(column, row); |
227 if (_valueStylesCache[hash] == null) { | 223 if (_valueStylesCache[hash] == null) { |
228 if (state == null) { | 224 if (state == null) { |
229 _valueStylesCache[hash] = const[]; | 225 _valueStylesCache[hash] = const []; |
230 } else { | 226 } else { |
231 var styles = stylesForColumn(column).toList(); | 227 var styles = stylesForColumn(column).toList(); |
232 if (state.highlights.isNotEmpty) { | 228 if (state.highlights.isNotEmpty) { |
233 styles.add(state.highlights.any((x) => x.last == row) | 229 styles.add(state.highlights.any((x) => x.last == row) |
234 ? ChartState.VAL_HIGHLIGHTED_CLASS | 230 ? ChartState.VAL_HIGHLIGHTED_CLASS |
235 : ChartState.VAL_UNHIGHLIGHTED_CLASS); | 231 : ChartState.VAL_UNHIGHLIGHTED_CLASS); |
236 } | 232 } |
237 if (state.hovered != null && state.hovered.last == row) { | 233 if (state.hovered != null && state.hovered.last == row) { |
238 styles.add(ChartState.VAL_HOVERED_CLASS); | 234 styles.add(ChartState.VAL_HOVERED_CLASS); |
239 } | 235 } |
(...skipping 21 matching lines...) Expand all Loading... |
261 | 257 |
262 _cacheColorsAndFilter(int hash, int column, int row) { | 258 _cacheColorsAndFilter(int hash, int column, int row) { |
263 if (state == null) { | 259 if (state == null) { |
264 _valueColorCache[hash] = | 260 _valueColorCache[hash] = |
265 theme.getColorForKey(area.useRowColoring ? row : column); | 261 theme.getColorForKey(area.useRowColoring ? row : column); |
266 _valueFilterCache[hash] = theme.getFilterForState(0); | 262 _valueFilterCache[hash] = theme.getFilterForState(0); |
267 } else { | 263 } else { |
268 var flags = _columnStateCache[column]; | 264 var flags = _columnStateCache[column]; |
269 if (state.highlights.isNotEmpty) { | 265 if (state.highlights.isNotEmpty) { |
270 flags |= (state.highlights.any((x) => x.last == row) | 266 flags |= (state.highlights.any((x) => x.last == row) |
271 ? ChartState.VAL_HIGHLIGHTED | 267 ? ChartState.VAL_HIGHLIGHTED |
272 : ChartState.VAL_UNHIGHLIGHTED); | 268 : ChartState.VAL_UNHIGHLIGHTED); |
273 } | 269 } |
274 if (state.hovered != null && state.hovered.last == row) { | 270 if (state.hovered != null && state.hovered.last == row) { |
275 flags |= ChartState.VAL_HOVERED; | 271 flags |= ChartState.VAL_HOVERED; |
276 } | 272 } |
277 _valueColorCache[hash] = | 273 _valueColorCache[hash] = |
278 theme.getColorForKey(area.useRowColoring ? row : column, flags); | 274 theme.getColorForKey(area.useRowColoring ? row : column, flags); |
279 _valueFilterCache[hash] = theme.getFilterForState(flags); | 275 _valueFilterCache[hash] = theme.getFilterForState(flags); |
280 } | 276 } |
281 } | 277 } |
282 } | 278 } |
OLD | NEW |