aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/lib.ts29
1 files changed, 19 insertions, 10 deletions
diff --git a/src/lib.ts b/src/lib.ts
index ddfc19d..d5941aa 100644
--- a/src/lib.ts
+++ b/src/lib.ts
@@ -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