diff options
| author | Terry Truong <terry06890@gmail.com> | 2022-03-22 11:21:38 +1100 |
|---|---|---|
| committer | Terry Truong <terry06890@gmail.com> | 2022-03-22 11:21:38 +1100 |
| commit | d6aad921b3ded1f187ba5cba3b8bc49857e00807 (patch) | |
| tree | 5a8907ece4bead9b3e2dec00aba0042ea023da56 /src | |
| parent | 959c1661784a9a4d08c18762aedc69e405e57506 (diff) | |
Start implementing allow-collapse-layout using 3-value layout-func return-valuetest-allowcollapse-via-layout-result-enum
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib.ts | 29 |
1 files changed, 19 insertions, 10 deletions
@@ -39,16 +39,16 @@ export class LayoutTree { } // Attempts layout of TolNode tree, for an area with given xy-coordinate and width+height (in pixels) // 'chg' allows for performing layout after expanding/collapsing a node - tryLayout(pos: [number,number], dims: [number,number], chg?: LayoutTreeChg){ + tryLayout(pos: [number,number], dims: [number,number], allowCollapse: boolean = false, chg: LayoutTreeChg = null){ // Create a new LayoutNode tree, keeping the old one in case of layout failure let tempTree = this.root.cloneNodeTree(chg); - let success: boolean; + let result: LayoutResultEnum; switch (this.options.layoutType){ - case 'sqr': success = sqrLayout(tempTree, pos, dims, true, this.options); break; - case 'rect': success = rectLayout(tempTree, pos, dims, true, this.options); break; - case 'sweep': success = sweepLayout(tempTree, pos, dims, true, this.options); break; + case 'sqr': result = sqrLayout(tempTree, pos, dims, true, this.options); break; + case 'rect': result = rectLayout(tempTree, pos, dims, true, this.options); break; + case 'sweep': result = sweepLayout(tempTree, pos, dims, true, this.options); break; } - if (success){ + if (result == LayoutResult.Success || result == LayoutResult.SuccessIfCollapse && allowCollapse){ tempTree.copyTreeForRender(this.root); } return success; @@ -176,15 +176,23 @@ type LayoutFn = ( showHeader: boolean, opts: LayoutOptions, ownOpts?: any, -) => boolean; +) => LayoutResultEnum; +// Enum used to represent the result of an attempted layout +const LayoutResult = { + Success: 0, + Fail: 1, + SuccessIfCollapse: 2, +}; +type LayoutResultEnum = typeof LayoutResult[keyof typeof LayoutResult]; + // Lays out node as one square, ignoring child nodes (used for base cases) let oneSqrLayout: LayoutFn = function (node, pos, dims, showHeader, opts){ let tileSz = Math.min(dims[0], dims[1], opts.maxTileSz); if (tileSz < opts.minTileSz){ - return false; + return LayoutResult.Fail; } node.assignLayoutData(pos, [tileSz,tileSz], {showHeader, empSpc: dims[0]*dims[1] - tileSz**2}); - return true; + return LayoutResult.Success; } // Lays out nodes as squares within a grid with intervening+surrounding spacing let sqrLayout: LayoutFn = function (node, pos, dims, showHeader, opts){ @@ -196,7 +204,7 @@ let sqrLayout: LayoutFn = function (node, pos, dims, showHeader, opts){ let newPos = [opts.tileSpacing, opts.tileSpacing + headerSz]; let newDims = [dims[0] - opts.tileSpacing, dims[1] - opts.tileSpacing - headerSz]; if (newDims[0] * newDims[1] <= 0){ - return false; + return LayoutResult.Fail; } // Find number of rows/columns with least empty space let numChildren = node.children.length; @@ -226,6 +234,7 @@ let sqrLayout: LayoutFn = function (node, pos, dims, showHeader, opts){ } } if (lowestEmpSpc == Number.POSITIVE_INFINITY){ + return false; } // Layout children |
