react-msaview 5.9.0 → 5.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundle/index.js +76 -76
- package/bundle/index.js.map +3 -3
- package/dist/components/ConservationTrack.js +21 -16
- package/dist/components/ConservationTrack.js.map +1 -1
- package/dist/components/MSAView.js +17 -23
- package/dist/components/MSAView.js.map +1 -1
- package/dist/components/TextTrack.js +26 -21
- package/dist/components/TextTrack.js.map +1 -1
- package/dist/components/header/settingsMenuItems.js +39 -72
- package/dist/components/header/settingsMenuItems.js.map +1 -1
- package/dist/components/msa/MSACanvasBlock.js +19 -16
- package/dist/components/msa/MSACanvasBlock.js.map +1 -1
- package/dist/components/msa/MSAMouseoverCanvas.js +13 -6
- package/dist/components/msa/MSAMouseoverCanvas.js.map +1 -1
- package/dist/components/msa/renderBoxFeatureCanvasBlock.js +9 -6
- package/dist/components/msa/renderBoxFeatureCanvasBlock.js.map +1 -1
- package/dist/components/msa/renderMSAMouseover.js +31 -31
- package/dist/components/msa/renderMSAMouseover.js.map +1 -1
- package/dist/components/overlayColors.d.ts +2 -0
- package/dist/components/overlayColors.js +5 -0
- package/dist/components/overlayColors.js.map +1 -1
- package/dist/components/tree/TreeCanvas.js +29 -24
- package/dist/components/tree/TreeCanvas.js.map +1 -1
- package/dist/components/tree/TreeCanvasBlock.js +19 -12
- package/dist/components/tree/TreeCanvasBlock.js.map +1 -1
- package/dist/components/tree/renderTreeCanvas.d.ts +0 -38
- package/dist/components/tree/renderTreeCanvas.js +17 -17
- package/dist/components/tree/renderTreeCanvas.js.map +1 -1
- package/dist/model.js +82 -113
- package/dist/model.js.map +1 -1
- package/dist/neighborJoining.js +12 -19
- package/dist/neighborJoining.js.map +1 -1
- package/dist/parseAsn1.js +32 -43
- package/dist/parseAsn1.js.map +1 -1
- package/dist/renderToSvg.js +3 -0
- package/dist/renderToSvg.js.map +1 -1
- package/dist/seqPosToGlobalCol.d.ts +6 -19
- package/dist/seqPosToGlobalCol.js +6 -33
- package/dist/seqPosToGlobalCol.js.map +1 -1
- package/dist/useCanvasAutorun.d.ts +23 -1
- package/dist/useCanvasAutorun.js +20 -8
- package/dist/useCanvasAutorun.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +3 -3
- package/src/components/ConservationTrack.tsx +7 -5
- package/src/components/MSAView.tsx +24 -30
- package/src/components/TextTrack.tsx +7 -12
- package/src/components/header/settingsMenuItems.ts +40 -72
- package/src/components/msa/MSACanvasBlock.tsx +16 -21
- package/src/components/msa/MSAMouseoverCanvas.tsx +10 -6
- package/src/components/msa/renderBoxFeatureCanvasBlock.test.ts +51 -0
- package/src/components/msa/renderBoxFeatureCanvasBlock.ts +13 -8
- package/src/components/msa/renderMSAMouseover.ts +37 -32
- package/src/components/overlayColors.ts +6 -0
- package/src/components/tree/TreeCanvas.tsx +6 -4
- package/src/components/tree/TreeCanvasBlock.tsx +11 -12
- package/src/components/tree/renderTreeCanvas.ts +20 -17
- package/src/model.ts +97 -130
- package/src/modelFilehandleLoaders.test.ts +137 -0
- package/src/neighborJoining.test.ts +12 -0
- package/src/neighborJoining.ts +12 -20
- package/src/parseAsn1.ts +32 -40
- package/src/{renderDomainLegendSvg.test.tsx → renderDomainsSvg.test.tsx} +44 -20
- package/src/renderToSvg.tsx +3 -0
- package/src/seqPosToGlobalCol.test.ts +39 -51
- package/src/seqPosToGlobalCol.ts +6 -41
- package/src/useCanvasAutorun.test.tsx +98 -0
- package/src/useCanvasAutorun.ts +30 -11
- package/src/version.ts +1 -1
|
@@ -1,3 +1,5 @@
|
|
|
1
1
|
export declare const referenceColor = "rgba(0,128,255,0.3)";
|
|
2
2
|
export declare const treeHoverColor = "rgba(255,165,0,0.2)";
|
|
3
3
|
export declare const multiRowHoverColor = "rgba(255,165,0,0.15)";
|
|
4
|
+
export declare const hoverColor = "rgba(0,0,0,0.15)";
|
|
5
|
+
export declare const clickColor = "rgba(128,128,0,0.2)";
|
|
@@ -8,4 +8,9 @@ export const referenceColor = 'rgba(0,128,255,0.3)';
|
|
|
8
8
|
// while the alignment cells are already colored so a lighter wash reads better.
|
|
9
9
|
export const treeHoverColor = 'rgba(255,165,0,0.2)';
|
|
10
10
|
export const multiRowHoverColor = 'rgba(255,165,0,0.15)';
|
|
11
|
+
// the hovered column/row, and the one pinned by a click. Drawn on the alignment
|
|
12
|
+
// overlay canvas and again as plain divs over the track area, which have to
|
|
13
|
+
// match or the crosshair appears to change color as it crosses the tracks.
|
|
14
|
+
export const hoverColor = 'rgba(0,0,0,0.15)';
|
|
15
|
+
export const clickColor = 'rgba(128,128,0,0.2)';
|
|
11
16
|
//# sourceMappingURL=overlayColors.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"overlayColors.js","sourceRoot":"","sources":["../../src/components/overlayColors.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,gFAAgF;AAChF,gEAAgE;AAEhE,yEAAyE;AACzE,MAAM,CAAC,MAAM,cAAc,GAAG,qBAAqB,CAAA;AAEnD,+EAA+E;AAC/E,8EAA8E;AAC9E,gFAAgF;AAChF,MAAM,CAAC,MAAM,cAAc,GAAG,qBAAqB,CAAA;AACnD,MAAM,CAAC,MAAM,kBAAkB,GAAG,sBAAsB,CAAA"}
|
|
1
|
+
{"version":3,"file":"overlayColors.js","sourceRoot":"","sources":["../../src/components/overlayColors.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,gFAAgF;AAChF,gEAAgE;AAEhE,yEAAyE;AACzE,MAAM,CAAC,MAAM,cAAc,GAAG,qBAAqB,CAAA;AAEnD,+EAA+E;AAC/E,8EAA8E;AAC9E,gFAAgF;AAChF,MAAM,CAAC,MAAM,cAAc,GAAG,qBAAqB,CAAA;AACnD,MAAM,CAAC,MAAM,kBAAkB,GAAG,sBAAsB,CAAA;AAExD,gFAAgF;AAChF,4EAA4E;AAC5E,2EAA2E;AAC3E,MAAM,CAAC,MAAM,UAAU,GAAG,kBAAkB,CAAA;AAC5C,MAAM,CAAC,MAAM,UAAU,GAAG,qBAAqB,CAAA"}
|
|
@@ -13,31 +13,36 @@ const TreeCanvas = observer(function ({ model }) {
|
|
|
13
13
|
model.doScrollY(d);
|
|
14
14
|
}, [model]);
|
|
15
15
|
const { onMouseDown, onMouseUp } = useWheelScroll({ ref, onScrollY });
|
|
16
|
-
const mouseoverRef = useCanvasAutorun(
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
16
|
+
const mouseoverRef = useCanvasAutorun({
|
|
17
|
+
draw: ctx => {
|
|
18
|
+
if (isAlive(model)) {
|
|
19
|
+
const { rowHeight, treeAreaWidth: w, height: h, scrollY: sy, mouseRow, referenceRowIndex, hoveredRowIndices, } = model;
|
|
20
|
+
ctx.resetTransform();
|
|
21
|
+
ctx.clearRect(0, 0, w, h);
|
|
22
|
+
// rows are laid out at a fixed pitch, so a row index is all that is
|
|
23
|
+
// needed to place its band (leaf.x is rowHeight*(index+0.5))
|
|
24
|
+
const fillRow = (index) => {
|
|
25
|
+
ctx.fillRect(0, index * rowHeight + sy, w, rowHeight);
|
|
26
|
+
};
|
|
27
|
+
if (referenceRowIndex !== undefined) {
|
|
28
|
+
ctx.fillStyle = referenceColor;
|
|
29
|
+
fillRow(referenceRowIndex);
|
|
30
|
+
}
|
|
31
|
+
ctx.fillStyle = treeHoverColor;
|
|
32
|
+
for (const index of hoveredRowIndices) {
|
|
33
|
+
fillRow(index);
|
|
34
|
+
}
|
|
35
|
+
if (mouseRow !== undefined &&
|
|
36
|
+
mouseRow !== referenceRowIndex &&
|
|
37
|
+
!hoveredRowIndices.includes(mouseRow)) {
|
|
38
|
+
fillRow(mouseRow);
|
|
39
|
+
}
|
|
29
40
|
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
mouseRow !== referenceRowIndex &&
|
|
36
|
-
!hoveredRowIndices.includes(mouseRow)) {
|
|
37
|
-
fillRow(mouseRow);
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
}, [model]);
|
|
41
|
+
},
|
|
42
|
+
width: treeAreaWidth,
|
|
43
|
+
height,
|
|
44
|
+
deps: [model],
|
|
45
|
+
});
|
|
41
46
|
return (React.createElement("div", { ref: ref, onMouseDown: onMouseDown, onMouseUp: onMouseUp, onMouseLeave: event => {
|
|
42
47
|
event.preventDefault();
|
|
43
48
|
}, style: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TreeCanvas.js","sourceRoot":"","sources":["../../../src/components/tree/TreeCanvas.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AAElD,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAErC,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpE,OAAO,eAAe,MAAM,sBAAuB,CAAA;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AAI/C,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAU,EAAE,KAAK,EAA2B;IACtE,MAAM,GAAG,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAA;IACxC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,KAAK,CAAA;IAC3D,MAAM,SAAS,GAAG,WAAW,CAC3B,CAAC,CAAS,EAAE,EAAE;QACZ,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;IACpB,CAAC,EACD,CAAC,KAAK,CAAC,CACR,CAAA;IACD,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,cAAc,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAA;IAErE,MAAM,YAAY,GAAG,gBAAgB,
|
|
1
|
+
{"version":3,"file":"TreeCanvas.js","sourceRoot":"","sources":["../../../src/components/tree/TreeCanvas.tsx"],"names":[],"mappings":"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"}
|
|
@@ -38,17 +38,24 @@ const TreeCanvasBlock = observer(function ({ model, offsetY, }) {
|
|
|
38
38
|
const { scrollY, treeAreaWidth, blockSize, highResScaleFactor } = model;
|
|
39
39
|
const width = treeAreaWidth + padding;
|
|
40
40
|
const height = blockSize;
|
|
41
|
-
const
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
ctx
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
41
|
+
const canvasWidth = width * highResScaleFactor;
|
|
42
|
+
const canvasHeight = height * highResScaleFactor;
|
|
43
|
+
const ref = useCanvasAutorun({
|
|
44
|
+
draw: ctx => {
|
|
45
|
+
ctx.resetTransform();
|
|
46
|
+
ctx.clearRect(0, 0, canvasWidth, canvasHeight);
|
|
47
|
+
renderTreeCanvas({
|
|
48
|
+
ctx,
|
|
49
|
+
model,
|
|
50
|
+
offsetY,
|
|
51
|
+
clickMap,
|
|
52
|
+
theme,
|
|
53
|
+
});
|
|
54
|
+
},
|
|
55
|
+
width: canvasWidth,
|
|
56
|
+
height: canvasHeight,
|
|
57
|
+
deps: [model, clickMap, offsetY, theme],
|
|
58
|
+
});
|
|
52
59
|
const style = {
|
|
53
60
|
width,
|
|
54
61
|
height,
|
|
@@ -63,7 +70,7 @@ const TreeCanvasBlock = observer(function ({ model, offsetY, }) {
|
|
|
63
70
|
nodeMenu ? (React.createElement(TreeNodeMenu, { node: nodeMenu, model: model, onClose: () => {
|
|
64
71
|
setNodeMenu(undefined);
|
|
65
72
|
} })) : null,
|
|
66
|
-
React.createElement("canvas", { ref: ref, width:
|
|
73
|
+
React.createElement("canvas", { ref: ref, width: canvasWidth, height: canvasHeight, style: { ...style, cursor: hovered ? 'pointer' : 'default' }, onMouseMove: event => {
|
|
67
74
|
onMouseMove(event);
|
|
68
75
|
}, onMouseLeave: () => {
|
|
69
76
|
onMouseLeave();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TreeCanvasBlock.js","sourceRoot":"","sources":["../../../src/components/tree/TreeCanvasBlock.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAEvC,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAA;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAErC,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AAC5D,OAAO,cAAc,MAAM,qBAAsB,CAAA;AACjD,OAAO,YAAY,MAAM,mBAAoB,CAAA;AAC7C,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAIhD,MAAM,SAAS,GAAG,UAAU,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACvC,OAAO,EAAE;QACP,QAAQ,EAAE,OAAO;QACjB,aAAa,EAAE,MAAM;QACrB,MAAM,EAAE,KAAK;QACb,eAAe,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;QACxC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK;QACjC,OAAO,EAAE,SAAS;QAClB,YAAY,EAAE,CAAC;QACf,QAAQ,EAAE,EAAE;QACZ,UAAU,EAAE,QAAQ;QACpB,QAAQ,EAAE,GAAG;QACb,QAAQ,EAAE,QAAQ;QAClB,YAAY,EAAE,UAAU;KACzB;IACD,KAAK,EAAE;QACL,QAAQ,EAAE,UAAU;QACpB,aAAa,EAAE,MAAM;QACrB,MAAM,EAAE,GAAG;QACX,UAAU,EAAE,iBAAiB;KAC9B;CACF,CAAC,CAAC,CAAA;AASH,MAAM,eAAe,GAAG,QAAQ,CAAC,UAAU,EACzC,KAAK,EACL,OAAO,GAIR;IACC,MAAM,EAAE,OAAO,EAAE,GAAG,SAAS,EAAE,CAAA;IAC/B,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAA;IACxB,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,EAAY,CAAA;IACxD,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,EAAY,CAAA;IACpD,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,GAC7D,YAAY,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAA;IAElC,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,kBAAkB,EAAE,GAAG,KAAK,CAAA;IACvE,MAAM,KAAK,GAAG,aAAa,GAAG,OAAO,CAAA;IACrC,MAAM,MAAM,GAAG,SAAS,CAAA;IAExB,MAAM,GAAG,GAAG,gBAAgB,
|
|
1
|
+
{"version":3,"file":"TreeCanvasBlock.js","sourceRoot":"","sources":["../../../src/components/tree/TreeCanvasBlock.tsx"],"names":[],"mappings":"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"}
|
|
@@ -5,44 +5,6 @@ import type { ClickMapIndex } from './clickMap.ts';
|
|
|
5
5
|
import type { Theme } from '@mui/material';
|
|
6
6
|
export declare const padding = 600;
|
|
7
7
|
export declare function getNodeX(node: HierarchyNode, showBranchLen: boolean, tipX: number, maxDepthToLeaf: number): number | undefined;
|
|
8
|
-
export declare function renderTree({ offsetY, ctx, model, theme, tipX, maxDepthToLeaf, blockSizeYOverride, }: {
|
|
9
|
-
offsetY: number;
|
|
10
|
-
ctx: RenderCtx;
|
|
11
|
-
model: MsaViewModel;
|
|
12
|
-
theme: Theme;
|
|
13
|
-
tipX: number;
|
|
14
|
-
maxDepthToLeaf: number;
|
|
15
|
-
blockSizeYOverride?: number;
|
|
16
|
-
}): void;
|
|
17
|
-
export declare function renderCollapsedTriangles({ ctx, clickMap, offsetY, model, theme, tipX, maxDepthToLeaf, blockSizeYOverride, }: {
|
|
18
|
-
ctx: RenderCtx;
|
|
19
|
-
clickMap?: ClickMapIndex;
|
|
20
|
-
offsetY: number;
|
|
21
|
-
model: MsaViewModel;
|
|
22
|
-
theme: Theme;
|
|
23
|
-
tipX: number;
|
|
24
|
-
maxDepthToLeaf: number;
|
|
25
|
-
blockSizeYOverride?: number;
|
|
26
|
-
}): void;
|
|
27
|
-
export declare function renderNodeBubbles({ ctx, clickMap, offsetY, model, tipX, maxDepthToLeaf, blockSizeYOverride, }: {
|
|
28
|
-
ctx: RenderCtx;
|
|
29
|
-
clickMap?: ClickMapIndex;
|
|
30
|
-
offsetY: number;
|
|
31
|
-
model: MsaViewModel;
|
|
32
|
-
tipX: number;
|
|
33
|
-
maxDepthToLeaf: number;
|
|
34
|
-
blockSizeYOverride?: number;
|
|
35
|
-
}): void;
|
|
36
|
-
export declare function renderTreeLabels({ theme, model, offsetY, ctx, clickMap, tipX, maxDepthToLeaf, blockSizeYOverride, }: {
|
|
37
|
-
model: MsaViewModel;
|
|
38
|
-
offsetY: number;
|
|
39
|
-
ctx: RenderCtx;
|
|
40
|
-
clickMap?: ClickMapIndex;
|
|
41
|
-
theme: Theme;
|
|
42
|
-
tipX: number;
|
|
43
|
-
maxDepthToLeaf: number;
|
|
44
|
-
blockSizeYOverride?: number;
|
|
45
|
-
}): void;
|
|
46
8
|
export declare function renderTreeCanvas({ model, clickMap, ctx, offsetY, theme, highResScaleFactorOverride, blockSizeYOverride, }: {
|
|
47
9
|
model: MsaViewModel;
|
|
48
10
|
offsetY: number;
|
|
@@ -25,7 +25,7 @@ export function getNodeX(node, showBranchLen, tipX, maxDepthToLeaf) {
|
|
|
25
25
|
const depthToLeaf = calcDepthToLeaf(node);
|
|
26
26
|
return ((maxDepthToLeaf - depthToLeaf) / maxDepthToLeaf) * tipX;
|
|
27
27
|
}
|
|
28
|
-
|
|
28
|
+
function renderTree({ offsetY, ctx, model, theme, tipX, maxDepthToLeaf, blockSizeYOverride, }) {
|
|
29
29
|
const { hierarchy, showBranchLenEffective: showBranchLen, blockSize } = model;
|
|
30
30
|
const by = blockSizeYOverride ?? blockSize;
|
|
31
31
|
ctx.strokeStyle = theme.palette.text.primary;
|
|
@@ -51,14 +51,13 @@ export function renderTree({ offsetY, ctx, model, theme, tipX, maxDepthToLeaf, b
|
|
|
51
51
|
}
|
|
52
52
|
});
|
|
53
53
|
}
|
|
54
|
-
|
|
55
|
-
const { hierarchy, showBranchLenEffective: showBranchLen,
|
|
54
|
+
function renderCollapsedTriangles({ ctx, clickMap, offsetY, model, theme, tipX, maxDepthToLeaf, blockSizeYOverride, collapsedSet, }) {
|
|
55
|
+
const { hierarchy, showBranchLenEffective: showBranchLen, blockSize, rowHeight, fontSize, marginLeft: ml, } = model;
|
|
56
56
|
// nothing collapsed is the common case, and the traversal below visits every
|
|
57
57
|
// node in the tree on every block of every redraw
|
|
58
|
-
if (
|
|
58
|
+
if (collapsedSet.size === 0) {
|
|
59
59
|
return;
|
|
60
60
|
}
|
|
61
|
-
const collapsedSet = new Set(collapsed);
|
|
62
61
|
const by = blockSizeYOverride ?? blockSize;
|
|
63
62
|
const halfHeight = Math.max(2, rowHeight * 0.42);
|
|
64
63
|
forEachDescendant(hierarchy, node => {
|
|
@@ -104,10 +103,9 @@ export function renderCollapsedTriangles({ ctx, clickMap, offsetY, model, theme,
|
|
|
104
103
|
}
|
|
105
104
|
});
|
|
106
105
|
}
|
|
107
|
-
|
|
108
|
-
const { hierarchy, showBranchLenEffective: showBranchLen,
|
|
106
|
+
function renderNodeBubbles({ ctx, clickMap, offsetY, model, tipX, maxDepthToLeaf, blockSizeYOverride, collapsedSet, }) {
|
|
107
|
+
const { hierarchy, showBranchLenEffective: showBranchLen, blockSize, marginLeft: ml, } = model;
|
|
109
108
|
const by = blockSizeYOverride ?? blockSize;
|
|
110
|
-
const collapsedSet = new Set(collapsed);
|
|
111
109
|
forEachDescendant(hierarchy, node => {
|
|
112
110
|
const x = getNodeX(node, showBranchLen, tipX, maxDepthToLeaf);
|
|
113
111
|
if (x === undefined) {
|
|
@@ -140,16 +138,12 @@ export function renderNodeBubbles({ ctx, clickMap, offsetY, model, tipX, maxDept
|
|
|
140
138
|
}
|
|
141
139
|
});
|
|
142
140
|
}
|
|
143
|
-
|
|
144
|
-
const { fontSize, showBranchLenEffective: showBranchLen, treeMetadata, blockSize, labelsAlignRight, drawTree, treeAreaWidth, treeAreaWidthMinusMargin, marginLeft, noTree, labelWidthMap,
|
|
141
|
+
function renderTreeLabels({ theme, model, offsetY, ctx, clickMap, tipX, maxDepthToLeaf, blockSizeYOverride, collapsedSet, }) {
|
|
142
|
+
const { fontSize, showBranchLenEffective: showBranchLen, treeMetadata, blockSize, labelsAlignRight, drawTree, treeAreaWidth, treeAreaWidthMinusMargin, marginLeft, noTree, labelWidthMap, } = model;
|
|
143
|
+
const by = blockSizeYOverride ?? blockSize;
|
|
145
144
|
// labels only exist for leaves, which are laid out top to bottom, so take the
|
|
146
145
|
// same slice the MSA renderer uses instead of walking every tip per block
|
|
147
|
-
const visibleLeaves = getVisibleLeaves({
|
|
148
|
-
model,
|
|
149
|
-
offsetY,
|
|
150
|
-
blockSizeY: blockSizeYOverride ?? model.blockSize,
|
|
151
|
-
});
|
|
152
|
-
const by = blockSizeYOverride ?? blockSize;
|
|
146
|
+
const visibleLeaves = getVisibleLeaves({ model, offsetY, blockSizeY: by });
|
|
153
147
|
const emHeight = ctx.measureText('M').width;
|
|
154
148
|
if (labelsAlignRight) {
|
|
155
149
|
ctx.textAlign = 'right';
|
|
@@ -165,7 +159,7 @@ export function renderTreeLabels({ theme, model, offsetY, ctx, clickMap, tipX, m
|
|
|
165
159
|
const displayName = treeMetadata[name]?.genome || name;
|
|
166
160
|
// a collapsed clade is drawn as a triangle + tip count; suppress its leaf
|
|
167
161
|
// label when the "name" is just the auto-generated internal-node id
|
|
168
|
-
const isAnonymousCollapsed =
|
|
162
|
+
const isAnonymousCollapsed = collapsedSet.has(id) && name === id;
|
|
169
163
|
if (!isAnonymousCollapsed && inYBlock(y, offsetY, by)) {
|
|
170
164
|
// note: +rowHeight/4 matches with -rowHeight/4 in msa
|
|
171
165
|
const yp = y + fontSize / 4;
|
|
@@ -233,6 +227,9 @@ export function renderTreeCanvas({ model, clickMap, ctx, offsetY, theme, highRes
|
|
|
233
227
|
// maxBranchLength for the cladogram would pin every node to x=0 for a tree
|
|
234
228
|
// with no branch lengths -- which is exactly what forces cladogram mode.
|
|
235
229
|
const tipX = showBranchLenEffective ? maxBranchLength : treeWidth;
|
|
230
|
+
// built once for all three passes: each of them asks about a different node on
|
|
231
|
+
// every block of every redraw, and `collapsed` is a list
|
|
232
|
+
const collapsedSet = new Set(model.collapsed);
|
|
236
233
|
if (!noTree && drawTree) {
|
|
237
234
|
renderTree({
|
|
238
235
|
ctx,
|
|
@@ -252,6 +249,7 @@ export function renderTreeCanvas({ model, clickMap, ctx, offsetY, theme, highRes
|
|
|
252
249
|
tipX,
|
|
253
250
|
maxDepthToLeaf,
|
|
254
251
|
blockSizeYOverride,
|
|
252
|
+
collapsedSet,
|
|
255
253
|
});
|
|
256
254
|
if (drawNodeBubbles) {
|
|
257
255
|
renderNodeBubbles({
|
|
@@ -262,6 +260,7 @@ export function renderTreeCanvas({ model, clickMap, ctx, offsetY, theme, highRes
|
|
|
262
260
|
tipX,
|
|
263
261
|
maxDepthToLeaf,
|
|
264
262
|
blockSizeYOverride,
|
|
263
|
+
collapsedSet,
|
|
265
264
|
});
|
|
266
265
|
}
|
|
267
266
|
}
|
|
@@ -275,6 +274,7 @@ export function renderTreeCanvas({ model, clickMap, ctx, offsetY, theme, highRes
|
|
|
275
274
|
tipX,
|
|
276
275
|
maxDepthToLeaf,
|
|
277
276
|
blockSizeYOverride,
|
|
277
|
+
collapsedSet,
|
|
278
278
|
});
|
|
279
279
|
}
|
|
280
280
|
// Finish the index so it's ready for queries
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderTreeCanvas.js","sourceRoot":"","sources":["../../../src/components/tree/renderTreeCanvas.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,WAAW,GACZ,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAQzD,MAAM,CAAC,MAAM,OAAO,GAAG,GAAG,CAAA;AAE1B,MAAM,YAAY,GAAG,CAAC,CAAA;AACtB,MAAM,MAAM,GAAG,GAAG,CAAA;AAClB,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC,CAAA;AAEpB,8EAA8E;AAC9E,4EAA4E;AAC5E,SAAS,QAAQ,CAAC,CAAS,EAAE,OAAe,EAAE,EAAU;IACtD,OAAO,CAAC,GAAG,OAAO,GAAG,YAAY,IAAI,CAAC,GAAG,OAAO,GAAG,EAAE,GAAG,YAAY,CAAA;AACtE,CAAC;AAED,2EAA2E;AAC3E,wEAAwE;AACxE,iFAAiF;AACjF,6GAA6G;AAC7G,+EAA+E;AAC/E,MAAM,UAAU,QAAQ,CACtB,IAAmB,EACnB,aAAsB,EACtB,IAAY,EACZ,cAAsB;IAEtB,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,IAAI,CAAC,GAAG,CAAA;IACjB,CAAC;IACD,IAAI,cAAc,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,CAAA;IACV,CAAC;IACD,MAAM,WAAW,GAAG,eAAe,CAAC,IAAI,CAAC,CAAA;IACzC,OAAO,CAAC,CAAC,cAAc,GAAG,WAAW,CAAC,GAAG,cAAc,CAAC,GAAG,IAAI,CAAA;AACjE,CAAC;AAED,
|
|
1
|
+
{"version":3,"file":"renderTreeCanvas.js","sourceRoot":"","sources":["../../../src/components/tree/renderTreeCanvas.ts"],"names":[],"mappings":"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"}
|
package/dist/model.js
CHANGED
|
@@ -1419,8 +1419,8 @@ function stateModelFactory() {
|
|
|
1419
1419
|
return 0;
|
|
1420
1420
|
}
|
|
1421
1421
|
const col = self.seqPosGlobalColIndex.get(rowName)?.[seqPos];
|
|
1422
|
-
// past the end of the ungapped sequence: 0 for the degenerate
|
|
1423
|
-
//
|
|
1422
|
+
// past the end of the ungapped sequence: 0 for the degenerate all-gap
|
|
1423
|
+
// row, otherwise one past the last column
|
|
1424
1424
|
return col ?? (seqPos === 0 ? 0 : seq.length);
|
|
1425
1425
|
},
|
|
1426
1426
|
/**
|
|
@@ -1805,37 +1805,51 @@ function stateModelFactory() {
|
|
|
1805
1805
|
mql.removeEventListener('change', onChange);
|
|
1806
1806
|
});
|
|
1807
1807
|
}
|
|
1808
|
-
|
|
1809
|
-
|
|
1810
|
-
|
|
1811
|
-
|
|
1812
|
-
|
|
1813
|
-
|
|
1814
|
-
|
|
1815
|
-
|
|
1808
|
+
/**
|
|
1809
|
+
* Fetch a filehandle whenever it changes, and hand the text to
|
|
1810
|
+
* `onLoad`.
|
|
1811
|
+
*
|
|
1812
|
+
* Every loader carries a generation guard: the filehandle can change
|
|
1813
|
+
* mid-fetch (a second file picked while the first is still in flight),
|
|
1814
|
+
* and the slower earlier request must not clobber the data, status, or
|
|
1815
|
+
* loading flag belonging to the newer one.
|
|
1816
|
+
*
|
|
1817
|
+
* `clearFilehandle` serves two purposes for the loaders that pass it.
|
|
1818
|
+
* A local file has no URL to refetch from, so the handle is dropped
|
|
1819
|
+
* once its bytes are in the model; and a fetch the user cancels drops
|
|
1820
|
+
* it too, returning the view to the import form rather than leaving a
|
|
1821
|
+
* stuck spinner.
|
|
1822
|
+
*/
|
|
1823
|
+
const loadOnFilehandleChange = ({ getFilehandle, onLoad, setLoading, clearFilehandle, }) => {
|
|
1824
|
+
let generation = 0;
|
|
1825
|
+
addDisposer(self, autorun(async () => {
|
|
1826
|
+
const filehandle = getFilehandle();
|
|
1827
|
+
if (!filehandle) {
|
|
1828
|
+
return;
|
|
1829
|
+
}
|
|
1830
|
+
const current = ++generation;
|
|
1831
|
+
const isCurrent = () => current === generation;
|
|
1816
1832
|
try {
|
|
1817
|
-
|
|
1818
|
-
|
|
1819
|
-
|
|
1833
|
+
setLoading?.(true);
|
|
1834
|
+
self.setError(undefined);
|
|
1835
|
+
const text = await fetchTextWithProgress(openLocation(filehandle), status => {
|
|
1836
|
+
if (isCurrent()) {
|
|
1820
1837
|
self.setStatus(status);
|
|
1821
1838
|
}
|
|
1822
1839
|
});
|
|
1823
|
-
if (
|
|
1840
|
+
if (isCurrent()) {
|
|
1824
1841
|
transaction(() => {
|
|
1825
|
-
|
|
1826
|
-
if (
|
|
1827
|
-
|
|
1828
|
-
self.setTreeFilehandle(undefined);
|
|
1842
|
+
onLoad(text);
|
|
1843
|
+
if (filehandle.locationType === 'BlobLocation') {
|
|
1844
|
+
clearFilehandle?.();
|
|
1829
1845
|
}
|
|
1830
1846
|
});
|
|
1831
1847
|
}
|
|
1832
1848
|
}
|
|
1833
1849
|
catch (e) {
|
|
1834
|
-
if (
|
|
1850
|
+
if (isCurrent()) {
|
|
1835
1851
|
if (isAbortError(e)) {
|
|
1836
|
-
|
|
1837
|
-
// returns to the import form instead of a stuck spinner
|
|
1838
|
-
self.setTreeFilehandle(undefined);
|
|
1852
|
+
clearFilehandle?.();
|
|
1839
1853
|
}
|
|
1840
1854
|
else {
|
|
1841
1855
|
console.error(e);
|
|
@@ -1844,30 +1858,32 @@ function stateModelFactory() {
|
|
|
1844
1858
|
}
|
|
1845
1859
|
}
|
|
1846
1860
|
finally {
|
|
1847
|
-
if (
|
|
1848
|
-
|
|
1849
|
-
}
|
|
1850
|
-
}
|
|
1851
|
-
}
|
|
1852
|
-
}));
|
|
1853
|
-
// autorun opens treeMetadataFilehandle
|
|
1854
|
-
addDisposer(self, autorun(async () => {
|
|
1855
|
-
const { treeMetadataFilehandle } = self;
|
|
1856
|
-
if (treeMetadataFilehandle) {
|
|
1857
|
-
try {
|
|
1858
|
-
self.setTreeMetadata(await fetchTextWithProgress(openLocation(treeMetadataFilehandle), status => {
|
|
1859
|
-
self.setStatus(status);
|
|
1860
|
-
}));
|
|
1861
|
-
}
|
|
1862
|
-
catch (e) {
|
|
1863
|
-
// ignore user cancel (isAbortError); treeMetadata is optional
|
|
1864
|
-
if (!isAbortError(e)) {
|
|
1865
|
-
console.error(e);
|
|
1866
|
-
self.setError(e);
|
|
1861
|
+
if (isCurrent()) {
|
|
1862
|
+
setLoading?.(false);
|
|
1867
1863
|
}
|
|
1868
1864
|
}
|
|
1869
|
-
}
|
|
1870
|
-
}
|
|
1865
|
+
}));
|
|
1866
|
+
};
|
|
1867
|
+
loadOnFilehandleChange({
|
|
1868
|
+
getFilehandle: () => self.treeFilehandle,
|
|
1869
|
+
onLoad: text => {
|
|
1870
|
+
self.setTree(text);
|
|
1871
|
+
},
|
|
1872
|
+
setLoading: arg => {
|
|
1873
|
+
self.setLoadingTree(arg);
|
|
1874
|
+
},
|
|
1875
|
+
clearFilehandle: () => {
|
|
1876
|
+
self.setTreeFilehandle(undefined);
|
|
1877
|
+
},
|
|
1878
|
+
});
|
|
1879
|
+
// treeMetadata is decorative and has no import-form step of its own, so
|
|
1880
|
+
// it keeps no loading flag and nothing to return to on cancel
|
|
1881
|
+
loadOnFilehandleChange({
|
|
1882
|
+
getFilehandle: () => self.treeMetadataFilehandle,
|
|
1883
|
+
onLoad: text => {
|
|
1884
|
+
self.setTreeMetadata(text);
|
|
1885
|
+
},
|
|
1886
|
+
});
|
|
1871
1887
|
// autorun parses inline gff text from data.gff
|
|
1872
1888
|
addDisposer(self, autorun(() => {
|
|
1873
1889
|
const gffText = self.data.gff;
|
|
@@ -1881,75 +1897,28 @@ function stateModelFactory() {
|
|
|
1881
1897
|
}
|
|
1882
1898
|
}
|
|
1883
1899
|
}));
|
|
1884
|
-
//
|
|
1885
|
-
|
|
1886
|
-
|
|
1887
|
-
|
|
1888
|
-
|
|
1889
|
-
|
|
1890
|
-
|
|
1891
|
-
|
|
1892
|
-
|
|
1893
|
-
|
|
1894
|
-
|
|
1895
|
-
|
|
1896
|
-
|
|
1897
|
-
|
|
1898
|
-
|
|
1899
|
-
|
|
1900
|
-
|
|
1901
|
-
|
|
1902
|
-
|
|
1903
|
-
|
|
1904
|
-
|
|
1905
|
-
|
|
1906
|
-
}
|
|
1907
|
-
}
|
|
1908
|
-
}));
|
|
1909
|
-
// autorun opens msaFilehandle. generation guard: see treeFilehandle
|
|
1910
|
-
let msaGeneration = 0;
|
|
1911
|
-
addDisposer(self, autorun(async () => {
|
|
1912
|
-
const { msaFilehandle } = self;
|
|
1913
|
-
if (msaFilehandle) {
|
|
1914
|
-
const generation = ++msaGeneration;
|
|
1915
|
-
try {
|
|
1916
|
-
self.setLoadingMSA(true);
|
|
1917
|
-
self.setError(undefined);
|
|
1918
|
-
const txt = await fetchTextWithProgress(openLocation(msaFilehandle), status => {
|
|
1919
|
-
if (generation === msaGeneration) {
|
|
1920
|
-
self.setStatus(status);
|
|
1921
|
-
}
|
|
1922
|
-
});
|
|
1923
|
-
if (generation === msaGeneration) {
|
|
1924
|
-
transaction(() => {
|
|
1925
|
-
self.setMSA(txt);
|
|
1926
|
-
if (msaFilehandle.locationType === 'BlobLocation') {
|
|
1927
|
-
// clear filehandle after loading if from a local file
|
|
1928
|
-
self.setMSAFilehandle(undefined);
|
|
1929
|
-
}
|
|
1930
|
-
});
|
|
1931
|
-
}
|
|
1932
|
-
}
|
|
1933
|
-
catch (e) {
|
|
1934
|
-
if (generation === msaGeneration) {
|
|
1935
|
-
if (isAbortError(e)) {
|
|
1936
|
-
// cancelled by the user: drop the filehandle so the view
|
|
1937
|
-
// returns to the import form instead of a stuck spinner
|
|
1938
|
-
self.setMSAFilehandle(undefined);
|
|
1939
|
-
}
|
|
1940
|
-
else {
|
|
1941
|
-
console.error(e);
|
|
1942
|
-
self.setError(e);
|
|
1943
|
-
}
|
|
1944
|
-
}
|
|
1945
|
-
}
|
|
1946
|
-
finally {
|
|
1947
|
-
if (generation === msaGeneration) {
|
|
1948
|
-
self.setLoadingMSA(false);
|
|
1949
|
-
}
|
|
1950
|
-
}
|
|
1951
|
-
}
|
|
1952
|
-
}));
|
|
1900
|
+
// gffFilehandle carries InterProScan domains
|
|
1901
|
+
loadOnFilehandleChange({
|
|
1902
|
+
getFilehandle: () => self.gffFilehandle,
|
|
1903
|
+
onLoad: text => {
|
|
1904
|
+
self.applyGFFText(text);
|
|
1905
|
+
},
|
|
1906
|
+
clearFilehandle: () => {
|
|
1907
|
+
self.setGFFFilehandle(undefined);
|
|
1908
|
+
},
|
|
1909
|
+
});
|
|
1910
|
+
loadOnFilehandleChange({
|
|
1911
|
+
getFilehandle: () => self.msaFilehandle,
|
|
1912
|
+
onLoad: text => {
|
|
1913
|
+
self.setMSA(text);
|
|
1914
|
+
},
|
|
1915
|
+
setLoading: arg => {
|
|
1916
|
+
self.setLoadingMSA(arg);
|
|
1917
|
+
},
|
|
1918
|
+
clearFilehandle: () => {
|
|
1919
|
+
self.setMSAFilehandle(undefined);
|
|
1920
|
+
},
|
|
1921
|
+
});
|
|
1953
1922
|
// Keep the parse chain warm: reading self.columns transitively holds
|
|
1954
1923
|
// self.MSA (parseMSA) computed alive, so it is parsed once per data
|
|
1955
1924
|
// change rather than re-parsed on every non-reactive access. Do not
|