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 part of charted.core.scales; | 8 part of charted.core.scales; |
9 | 9 |
10 class _OrdinalScale implements OrdinalScale { | 10 class _OrdinalScale implements OrdinalScale { |
11 final _index = new Map<dynamic, int>(); | 11 final _index = new Map<dynamic, int>(); |
12 | 12 |
13 List _domain = []; | 13 List _domain = []; |
14 List _range = []; | 14 List _range = []; |
15 num _rangeBand = 0; | 15 num _rangeBand = 0; |
16 Extent _rangeExtent; | 16 Extent _rangeExtent; |
17 Function _reset; | 17 Function _reset; |
18 | 18 |
19 _OrdinalScale(); | 19 _OrdinalScale(); |
20 | 20 |
21 _OrdinalScale._clone(_OrdinalScale source) | 21 _OrdinalScale._clone(_OrdinalScale source) |
22 : _domain = source._domain, | 22 : _domain = new List.from(source._domain), |
23 _range = source._range, | 23 _range = new List.from(source._range), |
24 _reset = source._reset, | 24 _reset = source._reset, |
25 _rangeExtent = source._rangeExtent, | 25 _rangeExtent = source._rangeExtent, |
26 _rangeBand = source._rangeBand { | 26 _rangeBand = source._rangeBand { |
27 _index.addAll(source._index); | 27 _index.addAll(source._index); |
28 } | 28 } |
29 | 29 |
30 @override | 30 @override |
31 scale(dynamic value) { | 31 scale(dynamic value) { |
32 if (!_index.containsKey(value)) { | 32 if (!_index.containsKey(value)) { |
33 _index[value] = domain.length; | 33 _index[value] = domain.length; |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
113 s._rangeExtent = null; | 113 s._rangeExtent = null; |
114 }; | 114 }; |
115 scale._reset(scale); | 115 scale._reset(scale); |
116 } | 116 } |
117 | 117 |
118 static void _setRangePoints( | 118 static void _setRangePoints( |
119 _OrdinalScale scale, Iterable range, double padding) { | 119 _OrdinalScale scale, Iterable range, double padding) { |
120 scale._reset = (_OrdinalScale s) { | 120 scale._reset = (_OrdinalScale s) { |
121 var start = range.first, | 121 var start = range.first, |
122 stop = range.last, | 122 stop = range.last, |
123 step = (stop - start) / (s.domain.length - 1 + padding); | 123 step = s.domain.length > 1 |
| 124 ? (stop - start - 2 * padding) / (s.domain.length - 1) |
| 125 : 0; |
124 | 126 |
125 s._range = s._steps( | 127 s._range = s._steps( |
126 s.domain.length < 2 ? (start + stop) / 2 : start + step * padding / 2, | 128 s.domain.length < 2 ? (start + stop) / 2 : start + padding, step); |
127 step); | |
128 s._rangeBand = 0; | 129 s._rangeBand = 0; |
129 s._rangeExtent = new Extent(start, stop); | 130 s._rangeExtent = new Extent(start, stop); |
130 }; | 131 }; |
131 if (scale.domain.isNotEmpty) { | 132 if (scale.domain.isNotEmpty) { |
132 scale._reset(scale); | 133 scale._reset(scale); |
133 } | 134 } |
134 } | 135 } |
135 | 136 |
136 static void _setRangeBands(_OrdinalScale scale, Iterable range, | 137 static void _setRangeBands(_OrdinalScale scale, Iterable range, |
137 double padding, double outerPadding) { | 138 double padding, double outerPadding) { |
138 scale._reset = (_OrdinalScale s) { | 139 scale._reset = (_OrdinalScale s) { |
139 var start = range.first, | 140 var start = range.first, |
140 stop = range.last, | 141 stop = range.last, |
141 step = (stop - start) / s.domain.length - padding + 2 * outerPadding; | 142 step = (stop - start - 2 * outerPadding) / |
| 143 (s.domain.length > 1 |
| 144 ? (s.domain.length - padding) |
| 145 : 1); |
142 | 146 |
143 s._range = s._steps(start + step * outerPadding, step); | 147 s._range = s._steps(start + step * outerPadding, step); |
144 s._rangeBand = step * (1 - padding); | 148 s._rangeBand = step * (1 - padding); |
145 s._rangeExtent = new Extent(start, stop); | 149 s._rangeExtent = new Extent(start, stop); |
146 }; | 150 }; |
147 if (scale.domain.isNotEmpty) { | 151 if (scale.domain.isNotEmpty) { |
148 scale._reset(scale); | 152 scale._reset(scale); |
149 } | 153 } |
150 } | 154 } |
151 | 155 |
152 static void _setRangeRoundBands(_OrdinalScale scale, Iterable range, | 156 static void _setRangeRoundBands(_OrdinalScale scale, Iterable range, |
153 double padding, double outerPadding) { | 157 double padding, double outerPadding) { |
154 scale._reset = (_OrdinalScale s) { | 158 scale._reset = (_OrdinalScale s) { |
155 var start = range.first, | 159 var start = range.first, |
156 stop = range.last, | 160 stop = range.last, |
157 step = | 161 step = |
158 ((stop - start) / (s.domain.length - padding + 2 * outerPadding)) | 162 ((stop - start - 2 * outerPadding) / |
159 .floor(), | 163 (s.domain.length > 1 |
160 error = stop - start - (s.domain.length - padding) * step; | 164 ? (s.domain.length - padding) |
| 165 : 1)).floor(); |
161 | 166 |
162 s._range = s._steps(start + (error / 2).round(), step); | 167 s._range = s._steps(start + outerPadding, step); |
163 s._rangeBand = (step * (1 - padding)).round(); | 168 s._rangeBand = (step * (1 - padding)).round(); |
164 s._rangeExtent = new Extent(start, stop); | 169 s._rangeExtent = new Extent(start, stop); |
165 }; | 170 }; |
166 if (scale.domain.isNotEmpty) { | 171 if (scale.domain.isNotEmpty) { |
167 scale._reset(scale); | 172 scale._reset(scale); |
168 } | 173 } |
169 } | 174 } |
170 | 175 |
171 // | 176 // |
172 // Properties that are valid only on quantitative scales. | 177 // Properties that are valid only on quantitative scales. |
173 // | 178 // |
174 | |
175 bool clamp; | 179 bool clamp; |
176 bool nice; | 180 bool nice; |
177 bool rounded; | 181 bool rounded; |
178 int ticksCount; | 182 int ticksCount; |
| 183 int forcedTicksCount; |
179 } | 184 } |
OLD | NEW |