@leafer/helper
Version:
85 lines (72 loc) • 2.8 kB
text/typescript
import { ILeaf, ILeafLevelList, ILeafList } from '@leafer/interface'
import { LeafHelper } from './LeafHelper'
const { updateBounds } = LeafHelper
export const BranchHelper = {
sort(a: ILeaf, b: ILeaf): number {
return (a.__.zIndex === b.__.zIndex) ? (a.__tempNumber - b.__tempNumber) : (a.__.zIndex - b.__.zIndex)
},
// push
pushAllChildBranch(branch: ILeaf, leafList: ILeafList | ILeafLevelList): void {
branch.__tempNumber = 1 // 标识需要更新子Leaf元素的WorldBounds分支 Layouter需使用
if (branch.__.__childBranchNumber) {
const { children } = branch
for (let i = 0, len = children.length; i < len; i++) {
branch = children[i]
if (branch.isBranch) {
branch.__tempNumber = 1
leafList.add(branch)
pushAllChildBranch(branch, leafList)
}
}
}
},
pushAllParent(leaf: ILeaf, leafList: ILeafList | ILeafLevelList): void {
const { keys } = (leafList as ILeafList)
if (keys) {
while (leaf.parent) {
if (keys[leaf.parent.innerId] === undefined) {
leafList.add(leaf.parent)
leaf = leaf.parent
} else {
break
}
}
} else {
while (leaf.parent) {
leafList.add(leaf.parent)
leaf = leaf.parent
}
}
},
pushAllBranchStack(branch: ILeaf, pushList: ILeaf[]): void {
let start = pushList.length
const { children } = branch
for (let i = 0, len = children.length; i < len; i++) {
if (children[i].isBranch) {
pushList.push(children[i])
}
}
// 找子级
for (let i = start, len = pushList.length; i < len; i++) {
pushAllBranchStack(pushList[i], pushList)
}
},
updateBounds(branch: ILeaf, exclude?: ILeaf): void {
const branchStack: ILeaf[] = [branch]
pushAllBranchStack(branch, branchStack)
updateBoundsByBranchStack(branchStack, exclude)
},
updateBoundsByBranchStack(branchStack: ILeaf[], exclude?: ILeaf): void {
let branch: ILeaf, children: ILeaf[]
for (let i = branchStack.length - 1; i > -1; i--) {
branch = branchStack[i]
children = branch.children
for (let j = 0, len = children.length; j < len; j++) {
updateBounds(children[j])
}
if (exclude && exclude === branch) continue
updateBounds(branch)
}
}
}
const { pushAllChildBranch, pushAllBranchStack, updateBoundsByBranchStack } = BranchHelper