56 lines
2.2 KiB
TypeScript
56 lines
2.2 KiB
TypeScript
import { DoricGroupViewNode, LayoutSpec, FrameSize, LEFT, RIGHT, CENTER_X, CENTER_Y, TOP, BOTTOM, toPixelString } from "./DoricViewNode";
|
|
|
|
export class DoricStackNode extends DoricGroupViewNode {
|
|
|
|
build() {
|
|
const ret = document.createElement('div')
|
|
ret.style.position = "relative"
|
|
return ret
|
|
}
|
|
|
|
layout() {
|
|
super.layout()
|
|
Promise.resolve().then(_ => {
|
|
this.configSize()
|
|
this.configOffset()
|
|
})
|
|
}
|
|
|
|
configSize() {
|
|
if (this.layoutConfig.widthSpec === LayoutSpec.WRAP_CONTENT) {
|
|
const width = this.childNodes.reduce((prev, current) => {
|
|
return Math.max(prev, current.view.offsetWidth)
|
|
}, 0)
|
|
this.view.style.width = toPixelString(width)
|
|
}
|
|
if (this.layoutConfig.heightSpec === LayoutSpec.WRAP_CONTENT) {
|
|
const height = this.childNodes.reduce((prev, current) => {
|
|
return Math.max(prev, current.view.offsetHeight)
|
|
}, 0)
|
|
this.view.style.height = toPixelString(height)
|
|
}
|
|
}
|
|
|
|
configOffset() {
|
|
this.childNodes.forEach(e => {
|
|
e.view.style.position = "absolute"
|
|
e.view.style.left = toPixelString(e.offsetX + this.paddingLeft)
|
|
e.view.style.top = toPixelString(e.offsetY + this.paddingTop)
|
|
const gravity = e.layoutConfig.alignment
|
|
if ((gravity & LEFT) === LEFT) {
|
|
e.view.style.left = toPixelString(0)
|
|
} else if ((gravity & RIGHT) === RIGHT) {
|
|
e.view.style.left = toPixelString(this.view.offsetWidth - e.view.offsetWidth)
|
|
} else if ((gravity & CENTER_X) === CENTER_X) {
|
|
e.view.style.left = toPixelString(this.view.offsetWidth / 2 - e.view.offsetWidth / 2)
|
|
}
|
|
if ((gravity & TOP) === TOP) {
|
|
e.view.style.top = toPixelString(0)
|
|
} else if ((gravity & BOTTOM) === BOTTOM) {
|
|
e.view.style.top = toPixelString(this.view.offsetHeight - e.view.offsetHeight)
|
|
} else if ((gravity & CENTER_Y) === CENTER_Y) {
|
|
e.view.style.top = toPixelString(this.view.offsetHeight / 2 - e.view.offsetHeight / 2)
|
|
}
|
|
})
|
|
}
|
|
} |