| SKY MODULE |
| <import src="sky:core" as="sky"/> |
| <!-- |
| ! this module provides trivial vertical block layout |
| ! no margins, padding, borders, etc |
| !--> |
| <script> |
| module.exports.BlockLayoutManager = class BlockLayoutManager extends sky.LayoutManager { |
| function layout(width, height) { |
| this.markAsLaidOut(); |
| if (width == null) |
| width = this.getIntrinsicWidth().value; |
| let autoHeight = false; |
| if (height == null) { |
| height = 0; |
| autoHeight = true; |
| } |
| this.assumeDimensions(width, height); |
| let children = this.walkChildren(); |
| let loop = children.next(); |
| let y = 0; |
| while (!loop.done) { |
| let child = loop.value; |
| if (child.needsLayout || child.descendantNeedsLayout) { |
| let dims = child.layoutManager.layout(width, null); |
| this.setChildSize(child, dims.width, dims.height); |
| } |
| this.setChildPosition(child, 0, y); |
| y += child.height; |
| loop = children.next(); |
| } |
| if (autoHeight) |
| height = y; |
| return { |
| width: width, |
| height: height, |
| } |
| } |
| function getIntrinsicWidth() { |
| let width = this.node.getProperty('width'); |
| if (typeof width != 'number') { |
| // e.g. width: auto |
| width = 0; |
| let children = this.walkChildren(); |
| let loop = children.next(); |
| while (!loop.done) { |
| let child = loop.value; |
| let childWidth = child.layoutManager.getIntrinsicWidth(); |
| if (width < childWidth.value) |
| width = childWidth.value; |
| loop = children.next(); |
| } |
| } |
| return super(width); // applies and provides our own min-width/max-width rules |
| } |
| function getIntrinsicHeight() { |
| let height = this.node.getProperty('height'); |
| if (typeof height != 'number') { |
| // e.g. height: auto |
| height = 0; |
| let children = this.walkChildren(); |
| let loop = children.next(); |
| while (!loop.done) { |
| let child = loop.value; |
| let childHeight = child.layoutManager.getIntrinsicHeight(); |
| if (height < childHeight.value) |
| height = childHeight.value; |
| loop = children.next(); |
| } |
| } |
| return super(height); // applies and provides our own min-height/max-height rules |
| } |
| } |
| sky.registerLayoutManager('block', module.exports.BlockLayoutManager); |
| </script> |