OLD | NEW |
| (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 part of charted.layout; | |
9 | |
10 /** | |
11 * Utility class to create arc definitions that can be used by the SvgArc | |
12 * to generate arcs for pie and donut charts | |
13 */ | |
14 class PieLayout { | |
15 /** | |
16 * Callback to convert datum to values used for layout | |
17 * Defaults to [defaultValueAccessor] | |
18 */ | |
19 SelectionValueAccessor<num> accessor = defaultValueAccessor; | |
20 | |
21 /** | |
22 * Callback to get the start angle for the pie. This callback is | |
23 * called once per list of value (i.e once per call to [layout]) | |
24 * Defaults to [defaultStartAngleCallback] | |
25 */ | |
26 SelectionCallback<num> startAngleCallback = defaultStartAngleCallback; | |
27 | |
28 /** | |
29 * Callback to get the start angle for the pie. This callback is | |
30 * called once per list of value (i.e once per call to [layout]) | |
31 * Defaults to [defaultEndAngleCallback] | |
32 */ | |
33 SelectionCallback<num> endAngleCallback = defaultEndAngleCallback; | |
34 | |
35 /** | |
36 * Comparator that is used to set the sort order of values. If not | |
37 * specified, the input order is used. | |
38 */ | |
39 Comparator<num> compare = null; | |
40 | |
41 /** | |
42 * Return a list of SvgArcData objects that could be used to create | |
43 * arcs in a pie-chart or donut-chart. | |
44 */ | |
45 List layout(List data, [int ei, Element e]) { | |
46 var values = new List.generate(data.length, | |
47 (int i) => accessor(data[i], i)), | |
48 startAngle = startAngleCallback(data, ei, e), | |
49 endAngle = endAngleCallback(data, ei, e), | |
50 total = sum(values), | |
51 scaleFactor = (endAngle - startAngle) / (total > 0 ? total : 1), | |
52 index = new Range.integers(values.length).toList(), | |
53 arcs = new List(data.length); | |
54 | |
55 if (compare != null) { | |
56 index.sort((left, right) => compare(data[left], data[right])); | |
57 } | |
58 | |
59 int count = 0; | |
60 index.forEach((i) { | |
61 endAngle = startAngle + values[i] * scaleFactor; | |
62 arcs[count++] = new SvgArcData(data[i], values[i], startAngle, endAngle); | |
63 startAngle = endAngle; | |
64 }); | |
65 | |
66 return arcs; | |
67 } | |
68 | |
69 /** Sets a constant value to start angle of the layout */ | |
70 set startAngle(num value) => | |
71 startAngleCallback = toCallback(value); | |
72 | |
73 /** Sets a constant value to end angle of the layout */ | |
74 set endAngle(num value) => | |
75 endAngleCallback = toCallback(value); | |
76 | |
77 /** Default value accessor */ | |
78 static num defaultValueAccessor(num d, i) => d; | |
79 | |
80 /** Default start angle callback - returns 0 */ | |
81 static num defaultStartAngleCallback(d, i, _) => 0; | |
82 | |
83 /** Default end angle callback - returns 2 * PI */ | |
84 static num defaultEndAngleCallback(d, i, _) => 2 * PI; | |
85 } | |
OLD | NEW |