position method
- @protected
inherited
Positions each renderer element in nodes
within the boundingRect
.
side
is defined as the smallest side of the layoutArea
.
Consider the following boundingRect:
boundingRect:
------------------
|************| |
(side) |*layoutArea*| | height
|************| |
------------------
width
Implementation
@protected
void position(
Iterable<TreeNode<Object>> nodes,
MutableRectangle boundingRect,
num side,
num layoutArea,
) {
var top = boundingRect.top;
var left = boundingRect.left;
var length = side > 0 ? (layoutArea / side) : 0;
// [side] is equal to the height of the boundingRect, so stacks rectangles
// vertically. [length] is the width of the stacking rectangles.
if (side == boundingRect.height) {
// Truncates the length since it is out of bounds.
if (length > boundingRect.width) length = boundingRect.width.toInt();
for (final node in nodes) {
final element = _getRendererElement(node);
final height = min(
boundingRect.top + boundingRect.height - top,
length > 0 ? (element.area / length) : 0,
);
element.boundingRect = Rectangle(left, top, length, height);
top += height;
}
boundingRect
..left += length
..width -= length;
} else {
// Positions rectangles horizontally.
if (length > boundingRect.height) length = boundingRect.height.toInt();
for (final node in nodes) {
final element = _getRendererElement(node);
final width = min(
boundingRect.left + boundingRect.width - left,
length > 0 ? (element.area / length) : 0,
);
element.boundingRect = Rectangle(left, top, width, length);
left += width;
}
boundingRect
..top += length
..height -= length;
}
}