Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(530)

Side by Side Diff: charted/lib/charts/cartesian_renderers/cartesian_base_renderer.dart

Issue 1400473008: Roll Observatory packages and add a roll script (Closed) Base URL: git@github.com:dart-lang/observatory_pub_packages.git@master
Patch Set: Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 /**
2 * Copyright 2014 Google Inc. All rights reserved.
3 *
4 * Use of this source code is governed by a BSD-style
5 * license that can be found in the LICENSE file or at
6 * https://developers.google.com/open-source/licenses/bsd
7 */
8
9 part of charted.charts;
10
11 abstract class CartesianRendererBase implements CartesianRenderer {
12 final SubscriptionsDisposer _disposer = new SubscriptionsDisposer();
13
14 CartesianArea area;
15 ChartSeries series;
16 ChartTheme theme;
17 ChartState state;
18 Rect rect;
19
20 List<int> _columnStateCache;
21 List<Iterable<String>> _columnStylesCache;
22
23 final _valueColorCache = new Map<int,String>();
24 final _valueFilterCache = new Map<int,String>();
25 final _valueStylesCache = new Map<int,Iterable<String>>();
26
27 Element host;
28 Selection root;
29 SelectionScope scope;
30
31 StreamController<ChartEvent> mouseOverController;
32 StreamController<ChartEvent> mouseOutController;
33 StreamController<ChartEvent> mouseClickController;
34
35 void _ensureAreaAndSeries(CartesianArea area, ChartSeries series) {
36 assert(area != null && series != null);
37 assert(this.area == null || this.area == area);
38 if (this.area == null) {
39 if (area.state != null) {
40 this.state = area.state;
41 _disposer.add(this.state.changes.listen((changes) {
42 resetStylesCache();
43 handleStateChanges(changes);
44 }));
45 }
46 }
47 this.area = area;
48 this.series = series;
49 }
50
51 void _ensureReadyToDraw(Element element) {
52 assert(series != null && area != null);
53 assert(element != null && element is GElement);
54
55 if (scope == null) {
56 host = element;
57 scope = new SelectionScope.element(element);
58 root = scope.selectElements([host]);
59 }
60
61 theme = area.theme;
62 rect = area.layout.renderArea;
63 resetStylesCache();
64 }
65
66 void resetStylesCache() {
67 var length = area.data.columns.length;
68 _columnStylesCache = new List(length);
69 _columnStateCache = new List(length);
70 _valueStylesCache.clear();
71 _valueColorCache.clear();
72 _valueFilterCache.clear();
73 _computeColumnStates();
74 }
75
76 /// Override this method to handle state changes.
77 void handleStateChanges(List<ChangeRecord> changes);
78
79 @override
80 Extent get extent {
81 assert(series != null && area != null);
82 var rows = area.data.rows,
83 measures = series.measures,
84 max = SMALL_INT_MIN,
85 min = SMALL_INT_MAX;
86
87 for (int i = 0, len = rows.length; i < len; ++i) {
88 var row = rows.elementAt(i);
89 for (int j = 0, jLen = measures.length; j < jLen; ++j) {
90 var value = row.elementAt(measures.elementAt(j));
91 if (value != null && value.isFinite) {
92 if (value > max) {
93 max = value;
94 } else if (value < min) {
95 min = value;
96 }
97 }
98 }
99 }
100 return new Extent(min, max);
101 }
102
103 @override
104 Extent extentForRow(Iterable row) {
105 assert(series != null && area != null);
106 var measures = series.measures,
107 max = SMALL_INT_MIN,
108 min = SMALL_INT_MAX;
109
110 for (int i = 0, len = measures.length; i < len; ++i) {
111 var measure = measures.elementAt(i),
112 value = row.elementAt(measure);
113 if (value != null && value.isFinite) {
114 if (value > max) {
115 max = value;
116 } else if (value < min) {
117 min = value;
118 }
119 }
120 }
121 return new Extent(min, max);
122 }
123
124 @override
125 Stream<ChartEvent> get onValueMouseOver {
126 if (mouseOverController == null) {
127 mouseOverController = new StreamController.broadcast(sync: true);
128 }
129 return mouseOverController.stream;
130 }
131
132 @override
133 Stream<ChartEvent> get onValueMouseOut {
134 if (mouseOutController == null) {
135 mouseOutController = new StreamController.broadcast(sync: true);
136 }
137 return mouseOutController.stream;
138 }
139
140 @override
141 Stream<ChartEvent> get onValueClick {
142 if (mouseClickController == null) {
143 mouseClickController = new StreamController.broadcast(sync: true);
144 }
145 return mouseClickController.stream;
146 }
147
148 double get bandInnerPadding => 1.0;
149 double get bandOuterPadding =>
150 area.theme.getDimensionAxisTheme().axisOuterPadding;
151
152 void _computeColumnStates() {
153 area.config.series.forEach((ChartSeries series) {
154 series.measures.forEach((int column) {
155 if (_columnStateCache[column] != null) return;
156 int flags = 0;
157 if (state != null && area.useRowColoring == false) {
158 if (state.highlights.isNotEmpty) {
159 flags |= (state.highlights.any((x) => x.first == column)
160 ? ChartState.COL_HIGHLIGHTED
161 : ChartState.COL_UNHIGHLIGHTED);
162 }
163 if (state.selection.isNotEmpty) {
164 flags |= (state.isSelected(column)
165 ? ChartState.COL_SELECTED
166 : ChartState.COL_UNSELECTED);
167 }
168 if (!state.isVisible(column)) {
169 flags |= ChartState.COL_HIDDEN;
170 }
171 if (state.preview == column) {
172 flags |= ChartState.COL_PREVIEW;
173 }
174 if (state.hovered != null && state.hovered.first == column) {
175 flags |= ChartState.COL_HOVERED;
176 }
177 }
178 _columnStateCache[column] = flags;
179 });
180 });
181 }
182
183 Iterable<String> stylesForColumn(int column) {
184 if (_columnStylesCache[column] == null) {
185 if (state == null || area.useRowColoring) {
186 _columnStylesCache[column] = const[];
187 } else {
188 var styles = [],
189 flags = _columnStateCache[column];
190
191 if (flags & ChartState.COL_SELECTED != 0) {
192 styles.add(ChartState.COL_SELECTED_CLASS);
193 } else if (flags & ChartState.COL_UNSELECTED != 0){
194 styles.add(ChartState.COL_UNSELECTED_CLASS);
195 }
196
197 if (flags & ChartState.COL_HIGHLIGHTED != 0) {
198 styles.add(ChartState.COL_HIGHLIGHTED_CLASS);
199 } else if (flags & ChartState.COL_UNHIGHLIGHTED != 0) {
200 styles.add(ChartState.COL_UNHIGHLIGHTED_CLASS);
201 }
202
203 if (flags & ChartState.COL_HOVERED != 0) {
204 styles.add(ChartState.COL_HOVERED_CLASS);
205 }
206 if (flags & ChartState.COL_PREVIEW != 0) {
207 styles.add(ChartState.COL_PREVIEW_CLASS);
208 }
209 if (flags & ChartState.COL_HIDDEN != 0) {
210 styles.add(ChartState.COL_HIDDEN_CLASS);
211 }
212
213 _columnStylesCache[column] = styles;
214 }
215 }
216 return _columnStylesCache[column];
217 }
218
219 String colorForColumn(int column) =>
220 theme.getColorForKey(column, _columnStateCache[column]);
221
222 String filterForColumn(int column) =>
223 theme.getFilterForState(_columnStateCache[column]);
224
225 Iterable<String> stylesForValue(int column, int row) {
226 var hash = hash2(column, row);
227 if (_valueStylesCache[hash] == null) {
228 if (state == null) {
229 _valueStylesCache[hash] = const[];
230 } else {
231 var styles = stylesForColumn(column).toList();
232 if (state.highlights.isNotEmpty) {
233 styles.add(state.highlights.any((x) => x.last == row)
234 ? ChartState.VAL_HIGHLIGHTED_CLASS
235 : ChartState.VAL_UNHIGHLIGHTED_CLASS);
236 }
237 if (state.hovered != null && state.hovered.last == row) {
238 styles.add(ChartState.VAL_HOVERED_CLASS);
239 }
240 _valueStylesCache[hash] = styles;
241 }
242 }
243 return _valueStylesCache[hash];
244 }
245
246 String colorForValue(int column, int row) {
247 var hash = hash2(column, row);
248 if (_valueColorCache[hash] == null) {
249 _cacheColorsAndFilter(hash, column, row);
250 }
251 return _valueColorCache[hash];
252 }
253
254 String filterForValue(int column, int row) {
255 var hash = hash2(column, row);
256 if (_valueFilterCache[hash] == null) {
257 _cacheColorsAndFilter(hash, column, row);
258 }
259 return _valueFilterCache[hash];
260 }
261
262 _cacheColorsAndFilter(int hash, int column, int row) {
263 if (state == null) {
264 _valueColorCache[hash] =
265 theme.getColorForKey(area.useRowColoring ? row : column);
266 _valueFilterCache[hash] = theme.getFilterForState(0);
267 } else {
268 var flags = _columnStateCache[column];
269 if (state.highlights.isNotEmpty) {
270 flags |= (state.highlights.any((x) => x.last == row)
271 ? ChartState.VAL_HIGHLIGHTED
272 : ChartState.VAL_UNHIGHLIGHTED);
273 }
274 if (state.hovered != null && state.hovered.last == row) {
275 flags |= ChartState.VAL_HOVERED;
276 }
277 _valueColorCache[hash] =
278 theme.getColorForKey(area.useRowColoring ? row : column, flags);
279 _valueFilterCache[hash] = theme.getFilterForState(flags);
280 }
281 }
282 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698