OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2015 Google Inc. All rights reserved. | 2 * Copyright 2015 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.layout; | 8 part of charted.layout; |
9 | 9 |
10 /// PaddingFunction takes a node and generates the padding for the particular | 10 /// PaddingFunction takes a node and generates the padding for the particular |
11 /// node | 11 /// node |
12 typedef List PaddingFunction(TreeMapNode node); | 12 typedef List PaddingFunction(TreeMapNode node); |
13 | 13 |
14 /** | 14 /** |
15 * Utility layout class which recursively subdivides area into rectangles which | 15 * Utility layout class which recursively subdivides area into rectangles which |
16 * can be used to quickly visualize the size of any node in the tree. | 16 * can be used to quickly visualize the size of any node in the tree. |
17 */ | 17 */ |
18 class TreeMapLayout extends HierarchyLayout { | 18 class TreeMapLayout extends HierarchyLayout<TreeMapNode> { |
19 /// Rectangular subdivision; squareness controlled via the target ratio. | 19 /// Rectangular subdivision; squareness controlled via the target ratio. |
20 static const TREEMAP_LAYOUT_SQUARIFY = 0; | 20 static const TREEMAP_LAYOUT_SQUARIFY = 0; |
21 | 21 |
22 /// Horizontal subdivision. | 22 /// Horizontal subdivision. |
23 static const TREEMAP_LAYOUT_SLICE = 1; | 23 static const TREEMAP_LAYOUT_SLICE = 1; |
24 | 24 |
25 /// Vertical subdivision. | 25 /// Vertical subdivision. |
26 static const TREEMAP_LAYOUT_DICE = 2; | 26 static const TREEMAP_LAYOUT_DICE = 2; |
27 | 27 |
28 /// Alternating between horizontal and vertical subdivision. | 28 /// Alternating between horizontal and vertical subdivision. |
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
156 } | 156 } |
157 | 157 |
158 /// Recursively compute each nodes (and its children nodes) position and size | 158 /// Recursively compute each nodes (and its children nodes) position and size |
159 /// base on the node's property and layout mode. | 159 /// base on the node's property and layout mode. |
160 void _squarify(TreeMapNode node) { | 160 void _squarify(TreeMapNode node) { |
161 var children = node.children; | 161 var children = node.children; |
162 if (children.isNotEmpty) { | 162 if (children.isNotEmpty) { |
163 var rect = _treeMapPad(node, paddingFunction(node)); | 163 var rect = _treeMapPad(node, paddingFunction(node)); |
164 List<TreeMapNode> nodes = []; | 164 List<TreeMapNode> nodes = []; |
165 var area = 0; | 165 var area = 0; |
166 var remaining = new List.from(children); | 166 var remaining = new List<TreeMapNode>.from(children); |
167 var score, | 167 var score, |
168 n, | 168 n, |
169 best = double.INFINITY, | 169 best = double.INFINITY, |
170 length = (mode == TREEMAP_LAYOUT_SLICE) | 170 length = (mode == TREEMAP_LAYOUT_SLICE) |
171 ? rect.width | 171 ? rect.width |
172 : (mode == TREEMAP_LAYOUT_DICE) | 172 : (mode == TREEMAP_LAYOUT_DICE) |
173 ? rect.height | 173 ? rect.height |
174 : (mode == TREEMAP_LAYOUT_SLICE_DICE) | 174 : (mode == TREEMAP_LAYOUT_SLICE_DICE) |
175 ? (node.depth & 1 == 1) ? rect.height : rect.width | 175 ? (node.depth & 1 == 1) ? rect.height : rect.width |
176 : math.min(rect.width, rect.height); | 176 : math.min(rect.width, rect.height); |
(...skipping 19 matching lines...) Expand all Loading... |
196 _position(nodes, length, rect, true, area); | 196 _position(nodes, length, rect, true, area); |
197 nodes.clear(); | 197 nodes.clear(); |
198 area = 0; | 198 area = 0; |
199 } | 199 } |
200 children.forEach(_squarify); | 200 children.forEach(_squarify); |
201 } | 201 } |
202 } | 202 } |
203 } | 203 } |
204 | 204 |
205 class TreeMapNode extends HierarchyNode { | 205 class TreeMapNode extends HierarchyNode { |
| 206 final List<TreeMapNode> children = <TreeMapNode>[]; |
| 207 |
206 /// The minimum x-coordinate of the node position. | 208 /// The minimum x-coordinate of the node position. |
207 num x = 0; | 209 num x = 0; |
208 | 210 |
209 /// The minimum y-coordinate of the node position. | 211 /// The minimum y-coordinate of the node position. |
210 num y = 0; | 212 num y = 0; |
211 | 213 |
212 /// The x-extent of the node position. | 214 /// The x-extent of the node position. |
213 num dx = 0; | 215 num dx = 0; |
214 | 216 |
215 /// The y-extent of the node position. | 217 /// The y-extent of the node position. |
216 num dy = 0; | 218 num dy = 0; |
217 | 219 |
218 /// The area the node should take up. | 220 /// The area the node should take up. |
219 num area = 0; | 221 num area = 0; |
220 | 222 |
221 /// Attribute for the last node in the row, only used for sticky layout. | 223 /// Attribute for the last node in the row, only used for sticky layout. |
222 bool sticky = false; | 224 bool sticky = false; |
223 } | 225 } |
OLD | NEW |