diff --git a/bzGraflow.js b/bzGraflow.js index 73e6d61..551d653 100644 --- a/bzGraflow.js +++ b/bzGraflow.js @@ -728,35 +728,57 @@ class BZgraflow extends Buildoz{ // Finally place everything if(orientation=='horizontal'){ const fakeNodeHeight = 10 + const parentsY = {} let x = gapx for(const [idx, layer] of layers.entries()){ let wMax = this.getMaxWidth(layer) let y = 0 switch(align){ - case'center': + case 'center': y = ((maxHeight - layerHeights[idx]) / 2) + gapy break - case'first': + case 'first': y = gapy break - case'last': + case 'last': y = maxHeight - layerHeights[idx] + gapy break - case 'auto': - //TODO + case 'parent': // y will be absolutely positioned by the parent(s) but have fallback for 1st layer y = ((maxHeight - layerHeights[idx]) / 2) + gapy break } for(const nid of layer){ + let placedY if(!nid.startsWith('longLinkPlaceHolder_')) { const bb = this.stagedNodes[nid].getBoundingClientRect() - this.moveNode(nid, x, y, orientation, tween, null, token) - y += gapy + (this.stagedNodes[nid].offsetHeight || bb.height) + const nodeHeight = this.stagedNodes[nid].offsetHeight || bb.height + if((align == 'parent') && (nid in parents) && (parents[nid][0] in parentsY)) { + y = Math.max(parentsY[parents[nid][0]], y) //TODO handle multiple parents with avg + console.log('parent', nid, parents[nid], parentsY[parents[nid][0]]) + } + placedY = y + this.moveNode(nid, x, y, orientation, tween, null, token) + if((align == 'parent') && (nid in parents) && (parents[nid][0] in parentsY)) { + parentsY[parents[nid][0]] += gapy + nodeHeight + } else { + y += gapy + nodeHeight + } + y = Math.max(y, placedY + gapy + nodeHeight) } else { + if((align == 'parent') && (nid in parents) && (parents[nid][0] in parentsY)) { + y = Math.max(parentsY[parents[nid][0]], y) + } + placedY = y this.addFakeNode(nid, x, y, wMax*0.75, fakeNodeHeight) this.moveNode(nid, x, y, orientation, tween, null, token) - y += gapy + fakeNodeHeight + if((align == 'parent') && (nid in parents) && (parents[nid][0] in parentsY)) { + parentsY[parents[nid][0]] += gapy + fakeNodeHeight + } else { + y += gapy + fakeNodeHeight + } + y = Math.max(y, placedY + gapy + fakeNodeHeight) } + parentsY[nid] = placedY } x += wMax + gapx } @@ -765,7 +787,21 @@ class BZgraflow extends Buildoz{ let y = gapy for(const [idx, layer] of layers.entries()){ let hMax = this.getMaxHeight(layer) - let x = ((maxWidth - layerWidths[idx]) / 2) + gapx + let x = 0 + switch(align){ + case 'center': + x = ((maxWidth - layerWidths[idx]) / 2) + gapx + break + case 'first': + x = gapx + break + case 'last': + x = maxWidth - layerWidths[idx] + gapx + break + case 'parent': // x will be absolutely positioned by the parent(s) + //TODO + break + } for(const nid of layer){ if(!nid.startsWith('longLinkPlaceHolder_')){ const bb = this.stagedNodes[nid].getBoundingClientRect()