react-msaview 5.0.7 → 5.0.16
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 +135 -35
- package/bundle/index.js.LICENSE.txt +1 -1
- package/bundle/index.js.map +1 -1
- package/dist/components/Checkbox2.js +3 -6
- package/dist/components/Checkbox2.js.map +1 -1
- package/dist/components/MSAViewer.d.ts +14 -0
- package/dist/components/MSAViewer.js +34 -0
- package/dist/components/MSAViewer.js.map +1 -0
- package/dist/components/SequenceTextArea.js +4 -4
- package/dist/components/SequenceTextArea.js.map +1 -1
- package/dist/components/Track.js +5 -24
- package/dist/components/Track.js.map +1 -1
- package/dist/components/dialogs/DomainDialog.js +2 -5
- package/dist/components/dialogs/DomainDialog.js.map +1 -1
- package/dist/components/dialogs/InterProScanDialog.js +7 -7
- package/dist/components/dialogs/InterProScanDialog.js.map +1 -1
- package/dist/components/dialogs/SettingsDialog.js +3 -19
- package/dist/components/dialogs/SettingsDialog.js.map +1 -1
- package/dist/components/header/ColorSchemeMenu.d.ts +6 -0
- package/dist/components/header/ColorSchemeMenu.js +19 -0
- package/dist/components/header/ColorSchemeMenu.js.map +1 -0
- package/dist/components/header/{ZoomStar.d.ts → FileMenu.d.ts} +2 -2
- package/dist/components/header/FileMenu.js +71 -0
- package/dist/components/header/FileMenu.js.map +1 -0
- package/dist/components/header/Header.js +8 -6
- package/dist/components/header/Header.js.map +1 -1
- package/dist/components/header/HeaderMenu.js +3 -145
- package/dist/components/header/HeaderMenu.js.map +1 -1
- package/dist/components/header/MSASettingsMenu.d.ts +6 -0
- package/dist/components/header/MSASettingsMenu.js +36 -0
- package/dist/components/header/MSASettingsMenu.js.map +1 -0
- package/dist/components/header/SettingsMenu.js +1 -21
- package/dist/components/header/SettingsMenu.js.map +1 -1
- package/dist/components/header/TreeSettingsMenu.d.ts +6 -0
- package/dist/components/header/TreeSettingsMenu.js +74 -0
- package/dist/components/header/TreeSettingsMenu.js.map +1 -0
- package/dist/components/header/ZoomMenu.js +0 -8
- package/dist/components/header/ZoomMenu.js.map +1 -1
- package/dist/components/header/getDomainsMenu.d.ts +31 -0
- package/dist/components/header/getDomainsMenu.js +75 -0
- package/dist/components/header/getDomainsMenu.js.map +1 -0
- package/dist/components/import/ImportFormExamples.js +22 -20
- package/dist/components/import/ImportFormExamples.js.map +1 -1
- package/dist/components/msa/MSACanvas.js +13 -84
- package/dist/components/msa/MSACanvas.js.map +1 -1
- package/dist/components/msa/MSACanvasBlock.js +1 -3
- package/dist/components/msa/MSACanvasBlock.js.map +1 -1
- package/dist/components/msa/renderMSABlock.js +2 -4
- package/dist/components/msa/renderMSABlock.js.map +1 -1
- package/dist/components/msa/renderMSAMouseover.js +1 -7
- package/dist/components/msa/renderMSAMouseover.js.map +1 -1
- package/dist/components/tree/TreeCanvas.js +14 -91
- package/dist/components/tree/TreeCanvas.js.map +1 -1
- package/dist/components/tree/TreeNodeMenu.js +5 -16
- package/dist/components/tree/TreeNodeMenu.js.map +1 -1
- package/dist/components/tree/renderTreeCanvas.js +55 -22
- package/dist/components/tree/renderTreeCanvas.js.map +1 -1
- package/dist/constants.d.ts +0 -2
- package/dist/constants.js +0 -2
- package/dist/constants.js.map +1 -1
- package/dist/fetchUtils.d.ts +0 -1
- package/dist/fetchUtils.js +0 -4
- package/dist/fetchUtils.js.map +1 -1
- package/dist/flatToTree.d.ts +0 -5
- package/dist/flatToTree.js +13 -30
- package/dist/flatToTree.js.map +1 -1
- package/dist/hierarchy.d.ts +29 -0
- package/dist/hierarchy.js +164 -0
- package/dist/hierarchy.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/launchInterProScan.d.ts +0 -5
- package/dist/launchInterProScan.js +5 -3
- package/dist/launchInterProScan.js.map +1 -1
- package/dist/model/DataModel.d.ts +9 -0
- package/dist/model/DataModel.js +12 -1
- package/dist/model/DataModel.js.map +1 -1
- package/dist/model/msaModel.d.ts +3 -0
- package/dist/model/msaModel.js +0 -1
- package/dist/model/msaModel.js.map +1 -1
- package/dist/model/treeModel.d.ts +3 -6
- package/dist/model/treeModel.js +3 -15
- package/dist/model/treeModel.js.map +1 -1
- package/dist/model.d.ts +24 -77
- package/dist/model.js +118 -239
- package/dist/model.js.map +1 -1
- package/dist/neighborJoining.js +38 -629
- package/dist/neighborJoining.js.map +1 -1
- package/dist/parseAsn1.d.ts +0 -12
- package/dist/parseAsn1.js +125 -332
- package/dist/parseAsn1.js.map +1 -1
- package/dist/useWheelScroll.d.ts +8 -0
- package/dist/useWheelScroll.js +93 -0
- package/dist/useWheelScroll.js.map +1 -0
- package/dist/util.d.ts +1 -6
- package/dist/util.js +5 -34
- package/dist/util.js.map +1 -1
- package/dist/vendor/copyToClipboard.d.ts +1 -10
- package/dist/vendor/copyToClipboard.js +14 -109
- package/dist/vendor/copyToClipboard.js.map +1 -1
- package/dist/vendor/fileSaver.d.ts +1 -11
- package/dist/vendor/fileSaver.js +7 -76
- package/dist/vendor/fileSaver.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 +10 -13
- package/src/collapseLogic.test.ts +115 -0
- package/src/components/Checkbox2.tsx +9 -18
- package/src/components/MSAViewer.tsx +67 -0
- package/src/components/SequenceTextArea.tsx +4 -4
- package/src/components/Track.tsx +10 -26
- package/src/components/dialogs/DomainDialog.tsx +4 -5
- package/src/components/dialogs/InterProScanDialog.tsx +7 -7
- package/src/components/dialogs/SettingsDialog.tsx +0 -37
- package/src/components/header/ColorSchemeMenu.tsx +35 -0
- package/src/components/header/FileMenu.tsx +84 -0
- package/src/components/header/Header.tsx +8 -6
- package/src/components/header/HeaderMenu.tsx +4 -155
- package/src/components/header/MSASettingsMenu.tsx +48 -0
- package/src/components/header/SettingsMenu.tsx +0 -23
- package/src/components/header/TreeSettingsMenu.tsx +96 -0
- package/src/components/header/ZoomMenu.tsx +0 -8
- package/src/components/header/getDomainsMenu.ts +83 -0
- package/src/components/import/ImportFormExamples.tsx +38 -35
- package/src/components/msa/MSACanvas.tsx +21 -91
- package/src/components/msa/MSACanvasBlock.tsx +1 -3
- package/src/components/msa/renderBoxFeatureCanvasBlock.ts +1 -1
- package/src/components/msa/renderMSABlock.ts +2 -5
- package/src/components/msa/renderMSAMouseover.ts +0 -6
- package/src/components/tree/TreeCanvas.tsx +35 -100
- package/src/components/tree/TreeNodeMenu.tsx +5 -14
- package/src/components/tree/renderTreeCanvas.test.ts +205 -0
- package/src/components/tree/renderTreeCanvas.ts +64 -27
- package/src/constants.ts +0 -2
- package/src/fetchUtils.ts +0 -5
- package/src/flatToTree.ts +20 -38
- package/src/hierarchy.test.ts +120 -0
- package/src/hierarchy.ts +221 -0
- package/src/index.ts +2 -0
- package/src/launchInterProScan.ts +4 -3
- package/src/model/DataModel.ts +12 -1
- package/src/model/msaModel.ts +0 -2
- package/src/model/treeModel.ts +2 -18
- package/src/model.ts +180 -278
- package/src/neighborJoining.ts +38 -628
- package/src/parseAsn1.test.ts +4 -1
- package/src/parseAsn1.ts +135 -405
- package/src/useWheelScroll.ts +109 -0
- package/src/util.ts +5 -50
- package/src/vendor/copyToClipboard.ts +14 -122
- package/src/vendor/fileSaver.ts +8 -105
- package/src/version.ts +1 -1
- package/dist/components/dialogs/AddTrackDialog.d.ts +0 -8
- package/dist/components/dialogs/AddTrackDialog.js +0 -30
- package/dist/components/dialogs/AddTrackDialog.js.map +0 -1
- package/dist/components/dialogs/TabPanel.d.ts +0 -6
- package/dist/components/dialogs/TabPanel.js +0 -6
- package/dist/components/dialogs/TabPanel.js.map +0 -1
- package/dist/components/header/ZoomStar.js +0 -40
- package/dist/components/header/ZoomStar.js.map +0 -1
- package/dist/layout.d.ts +0 -26
- package/dist/layout.js +0 -74
- package/dist/layout.js.map +0 -1
- package/dist/reparseTree.d.ts +0 -2
- package/dist/reparseTree.js +0 -15
- package/dist/reparseTree.js.map +0 -1
- package/src/components/dialogs/AddTrackDialog.tsx +0 -85
- package/src/components/dialogs/TabPanel.tsx +0 -19
- package/src/components/header/ZoomStar.tsx +0 -74
- package/src/createPaletteMap.test.ts +0 -57
- package/src/layout.ts +0 -118
- package/src/reparseTree.ts +0 -18
|
@@ -1,94 +1,23 @@
|
|
|
1
|
-
import React, {
|
|
1
|
+
import React, { useCallback, useRef } from 'react';
|
|
2
2
|
import { observer } from 'mobx-react';
|
|
3
3
|
import Loading from "./Loading.js";
|
|
4
4
|
import MSACanvasBlock from "./MSACanvasBlock.js";
|
|
5
|
+
import { useWheelScroll } from "../../useWheelScroll.js";
|
|
5
6
|
const MSACanvas = observer(function ({ model }) {
|
|
6
7
|
const { MSA, verticalScrollbarWidth, msaFilehandle, height, msaAreaWidth, blocks2d, } = model;
|
|
7
8
|
const ref = useRef(null);
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
const deltaX = useRef(0);
|
|
11
|
-
const deltaY = useRef(0);
|
|
12
|
-
// mouse click-and-drag scrolling
|
|
13
|
-
const prevX = useRef(0);
|
|
14
|
-
const prevY = useRef(0);
|
|
15
|
-
const [mouseDragging, setMouseDragging] = useState(false);
|
|
16
|
-
useEffect(() => {
|
|
17
|
-
const curr = ref.current;
|
|
18
|
-
if (!curr) {
|
|
19
|
-
return;
|
|
20
|
-
}
|
|
21
|
-
function onWheel(event) {
|
|
22
|
-
deltaX.current += event.deltaX;
|
|
23
|
-
deltaY.current += event.deltaY;
|
|
24
|
-
if (!scheduled.current) {
|
|
25
|
-
scheduled.current = true;
|
|
26
|
-
requestAnimationFrame(() => {
|
|
27
|
-
model.doScrollX(-deltaX.current);
|
|
28
|
-
model.doScrollY(-deltaY.current);
|
|
29
|
-
deltaX.current = 0;
|
|
30
|
-
deltaY.current = 0;
|
|
31
|
-
scheduled.current = false;
|
|
32
|
-
});
|
|
33
|
-
}
|
|
34
|
-
event.preventDefault();
|
|
35
|
-
event.stopPropagation();
|
|
36
|
-
}
|
|
37
|
-
curr.addEventListener('wheel', onWheel, { passive: false });
|
|
38
|
-
return () => {
|
|
39
|
-
curr.removeEventListener('wheel', onWheel);
|
|
40
|
-
};
|
|
9
|
+
const onScrollX = useCallback((d) => {
|
|
10
|
+
model.doScrollX(d);
|
|
41
11
|
}, [model]);
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
if (!scheduled.current) {
|
|
52
|
-
scheduled.current = true;
|
|
53
|
-
window.requestAnimationFrame(() => {
|
|
54
|
-
model.doScrollX(distanceX);
|
|
55
|
-
model.doScrollY(distanceY);
|
|
56
|
-
scheduled.current = false;
|
|
57
|
-
prevX.current = event.clientX;
|
|
58
|
-
prevY.current = event.clientY;
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
function globalMouseUp() {
|
|
64
|
-
prevX.current = 0;
|
|
65
|
-
setMouseDragging(false);
|
|
66
|
-
}
|
|
67
|
-
window.addEventListener('mousemove', globalMouseMove, true);
|
|
68
|
-
window.addEventListener('mouseup', globalMouseUp, true);
|
|
69
|
-
return () => {
|
|
70
|
-
window.removeEventListener('mousemove', globalMouseMove, true);
|
|
71
|
-
window.removeEventListener('mouseup', globalMouseUp, true);
|
|
72
|
-
};
|
|
73
|
-
}
|
|
74
|
-
return undefined;
|
|
75
|
-
}, [model, mouseDragging]);
|
|
76
|
-
return (React.createElement("div", { ref: ref, onMouseDown: event => {
|
|
77
|
-
// check if clicking a draggable element or a resize handle
|
|
78
|
-
const target = event.target;
|
|
79
|
-
if (target.draggable || target.dataset.resizer) {
|
|
80
|
-
return;
|
|
81
|
-
}
|
|
82
|
-
// otherwise do click and drag scroll
|
|
83
|
-
if (event.button === 0) {
|
|
84
|
-
prevX.current = event.clientX;
|
|
85
|
-
prevY.current = event.clientY;
|
|
86
|
-
setMouseDragging(true);
|
|
87
|
-
}
|
|
88
|
-
}, onMouseUp: event => {
|
|
89
|
-
event.preventDefault();
|
|
90
|
-
setMouseDragging(false);
|
|
91
|
-
}, onMouseLeave: event => {
|
|
12
|
+
const onScrollY = useCallback((d) => {
|
|
13
|
+
model.doScrollY(d);
|
|
14
|
+
}, [model]);
|
|
15
|
+
const { onMouseDown, onMouseUp } = useWheelScroll({
|
|
16
|
+
ref,
|
|
17
|
+
onScrollX,
|
|
18
|
+
onScrollY,
|
|
19
|
+
});
|
|
20
|
+
return (React.createElement("div", { ref: ref, onMouseDown: onMouseDown, onMouseUp: onMouseUp, onMouseLeave: event => {
|
|
92
21
|
event.preventDefault();
|
|
93
22
|
}, style: {
|
|
94
23
|
position: 'relative',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MSACanvas.js","sourceRoot":"","sources":["../../../src/components/msa/MSACanvas.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,
|
|
1
|
+
{"version":3,"file":"MSACanvas.js","sourceRoot":"","sources":["../../../src/components/msa/MSACanvas.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AAElD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAErC,OAAO,OAAO,MAAM,cAAe,CAAA;AACnC,OAAO,cAAc,MAAM,qBAAsB,CAAA;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAIxD,MAAM,SAAS,GAAG,QAAQ,CAAC,UAAU,EAAE,KAAK,EAA2B;IACrE,MAAM,EACJ,GAAG,EACH,sBAAsB,EACtB,aAAa,EACb,MAAM,EACN,YAAY,EACZ,QAAQ,GACT,GAAG,KAAK,CAAA;IACT,MAAM,GAAG,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAA;IACxC,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,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;QAChD,GAAG;QACH,SAAS;QACT,SAAS;KACV,CAAC,CAAA;IAEF,OAAO,CACL,6BACE,GAAG,EAAE,GAAG,EACR,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,SAAS,EACpB,YAAY,EAAE,KAAK,CAAC,EAAE;YACpB,KAAK,CAAC,cAAc,EAAE,CAAA;QACxB,CAAC,EACD,KAAK,EAAE;YACL,QAAQ,EAAE,UAAU;YACpB,MAAM;YACN,KAAK,EAAE,YAAY,GAAG,sBAAsB;YAC5C,QAAQ,EAAE,QAAQ;SACnB,IAEA,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CACrC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CACzB,oBAAC,cAAc,IACb,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAClB,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,EAAE,EACX,OAAO,EAAE,EAAE,GACX,CACH,CAAC,CACH,CAAC,CAAC,CAAC,CACF,oBAAC,OAAO,OAAG,CACZ,CACG,CACP,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,eAAe,SAAS,CAAA"}
|
|
@@ -19,8 +19,7 @@ const MSACanvasBlock = observer(function ({ model, offsetX, offsetY, }) {
|
|
|
19
19
|
return autorun(() => {
|
|
20
20
|
ctx.resetTransform();
|
|
21
21
|
ctx.clearRect(0, 0, blockSize * highResScaleFactor, blockSize * highResScaleFactor);
|
|
22
|
-
|
|
23
|
-
if (actuallyShowDomains) {
|
|
22
|
+
if (model.actuallyShowDomains) {
|
|
24
23
|
renderBoxFeatureCanvasBlock({
|
|
25
24
|
ctx,
|
|
26
25
|
offsetX,
|
|
@@ -64,7 +63,6 @@ const MSACanvasBlock = observer(function ({ model, offsetX, offsetY, }) {
|
|
|
64
63
|
model.setMousePos(x, y);
|
|
65
64
|
}
|
|
66
65
|
else {
|
|
67
|
-
// Clear mouse position when outside bounds
|
|
68
66
|
model.setMousePos(undefined, undefined);
|
|
69
67
|
}
|
|
70
68
|
}, onClick: event => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MSACanvasBlock.js","sourceRoot":"","sources":["../../../src/components/msa/MSACanvasBlock.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAEnE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAC9B,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAErC,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAA;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAI7C,MAAM,cAAc,GAAG,QAAQ,CAAC,UAAU,EACxC,KAAK,EACL,OAAO,EACP,OAAO,GAKR;IACC,MAAM,EACJ,QAAQ,EACR,SAAS,EACT,OAAO,EACP,OAAO,EACP,WAAW,EACX,SAAS,EACT,aAAa,EACb,aAAa,EACb,kBAAkB,GACnB,GAAG,KAAK,CAAA;IACT,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAA;IAExB,MAAM,cAAc,GAAG,OAAO,CAC5B,GAAG,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,KAAK,CAAC,EACvC,CAAC,WAAW,EAAE,KAAK,CAAC,CACrB,CAAA;IAED,MAAM,GAAG,GAAG,MAAM,CAAoB,IAAI,CAAC,CAAA;IAC3C,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC,CAAA;QACzC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAM;QACR,CAAC;QACD,OAAO,OAAO,CAAC,GAAG,EAAE;YAClB,GAAG,CAAC,cAAc,EAAE,CAAA;YACpB,GAAG,CAAC,SAAS,CACX,CAAC,EACD,CAAC,EACD,SAAS,GAAG,kBAAkB,EAC9B,SAAS,GAAG,kBAAkB,CAC/B,CAAA;YACD,
|
|
1
|
+
{"version":3,"file":"MSACanvasBlock.js","sourceRoot":"","sources":["../../../src/components/msa/MSACanvasBlock.tsx"],"names":[],"mappings":"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"}
|
|
@@ -82,7 +82,7 @@ function drawTiles({ model, offsetX, ctx, visibleLeaves, theme, xStart, xEnd, })
|
|
|
82
82
|
}
|
|
83
83
|
}
|
|
84
84
|
function drawText({ model, offsetX, contrastScheme, ctx, visibleLeaves, xStart, xEnd, }) {
|
|
85
|
-
const { bgColor, actuallyShowDomains, showMsaLetters, colorScheme, columns, colWidth,
|
|
85
|
+
const { bgColor, actuallyShowDomains, showMsaLetters, colorScheme, columns, colWidth, rowHeight, relativeTo, } = model;
|
|
86
86
|
// Get reference sequence if relativeTo is set
|
|
87
87
|
const referenceSeq = relativeTo
|
|
88
88
|
? columns[relativeTo]?.slice(xStart, xEnd)
|
|
@@ -104,9 +104,7 @@ function drawText({ model, offsetX, contrastScheme, ctx, visibleLeaves, xStart,
|
|
|
104
104
|
// Show dot for matching positions, original letter for differences
|
|
105
105
|
const displayLetter = isMatchingReference ? '.' : letter;
|
|
106
106
|
const color = colorScheme[letter.toUpperCase()];
|
|
107
|
-
const contrast =
|
|
108
|
-
? contrastScheme[letter.toUpperCase()] || 'black'
|
|
109
|
-
: 'black';
|
|
107
|
+
const contrast = contrastScheme[letter.toUpperCase()] || 'black';
|
|
110
108
|
// note: -rowHeight/4 matches +rowHeight/4 in tree
|
|
111
109
|
ctx.fillStyle = actuallyShowDomains
|
|
112
110
|
? 'black'
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderMSABlock.js","sourceRoot":"","sources":["../../../src/components/msa/renderMSABlock.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"renderMSABlock.js","sourceRoot":"","sources":["../../../src/components/msa/renderMSABlock.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,9 +3,7 @@ const highlightColor = 'rgba(128,128,0,0.2)';
|
|
|
3
3
|
const referenceColor = 'rgba(0,128,255,0.3)'; // Blue highlight for reference row
|
|
4
4
|
const multiRowHoverColor = 'rgba(255,165,0,0.15)'; // Orange highlight for multi-row tree hover
|
|
5
5
|
export function renderMouseover({ ctx, model, }) {
|
|
6
|
-
const { mouseCol, colWidth, msaAreaWidth, verticalScrollbarWidth, height, rowHeight, scrollX, scrollY, mouseRow,
|
|
7
|
-
// @ts-expect-error
|
|
8
|
-
mouseCol2, mouseClickRow, mouseClickCol, relativeTo, rowNamesSet, hoveredTreeNode, highlightedColumns, } = model;
|
|
6
|
+
const { mouseCol, colWidth, msaAreaWidth, verticalScrollbarWidth, height, rowHeight, scrollX, scrollY, mouseRow, mouseClickRow, mouseClickCol, relativeTo, rowNamesSet, hoveredTreeNode, highlightedColumns, } = model;
|
|
9
7
|
const width = msaAreaWidth - verticalScrollbarWidth;
|
|
10
8
|
ctx.resetTransform();
|
|
11
9
|
ctx.clearRect(0, 0, width, height);
|
|
@@ -50,9 +48,5 @@ export function renderMouseover({ ctx, model, }) {
|
|
|
50
48
|
ctx.fillStyle = highlightColor;
|
|
51
49
|
ctx.fillRect(0, mouseClickRow * rowHeight + scrollY, width, rowHeight);
|
|
52
50
|
}
|
|
53
|
-
if (mouseCol2 !== undefined) {
|
|
54
|
-
ctx.fillStyle = highlightColor;
|
|
55
|
-
ctx.fillRect(mouseCol2 * colWidth + scrollX, 0, colWidth, height);
|
|
56
|
-
}
|
|
57
51
|
}
|
|
58
52
|
//# sourceMappingURL=renderMSAMouseover.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderMSAMouseover.js","sourceRoot":"","sources":["../../../src/components/msa/renderMSAMouseover.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,GAAG,kBAAkB,CAAA;AACrC,MAAM,cAAc,GAAG,qBAAqB,CAAA;AAC5C,MAAM,cAAc,GAAG,qBAAqB,CAAA,CAAC,mCAAmC;AAChF,MAAM,kBAAkB,GAAG,sBAAsB,CAAA,CAAC,4CAA4C;AAE9F,MAAM,UAAU,eAAe,CAAC,EAC9B,GAAG,EACH,KAAK,GAIN;IACC,MAAM,EACJ,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,sBAAsB,EACtB,MAAM,EACN,SAAS,EACT,OAAO,EACP,OAAO,EACP,QAAQ
|
|
1
|
+
{"version":3,"file":"renderMSAMouseover.js","sourceRoot":"","sources":["../../../src/components/msa/renderMSAMouseover.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,73 +1,20 @@
|
|
|
1
|
-
import React, { useEffect, useRef
|
|
1
|
+
import React, { useCallback, useEffect, useRef } from 'react';
|
|
2
2
|
import { isAlive } from '@jbrowse/mobx-state-tree';
|
|
3
3
|
import { autorun } from 'mobx';
|
|
4
4
|
import { observer } from 'mobx-react';
|
|
5
5
|
import TreeCanvasBlock from "./TreeCanvasBlock.js";
|
|
6
6
|
import { padding } from "./renderTreeCanvas.js";
|
|
7
|
+
import { useWheelScroll } from "../../useWheelScroll.js";
|
|
8
|
+
const referenceColor = 'rgba(0,128,255,0.3)';
|
|
9
|
+
const treeHoverColor = 'rgba(255,165,0,0.2)';
|
|
7
10
|
const TreeCanvas = observer(function ({ model }) {
|
|
8
11
|
const ref = useRef(null);
|
|
9
12
|
const mouseoverRef = useRef(null);
|
|
10
|
-
const scheduled = useRef(false);
|
|
11
|
-
const deltaY = useRef(0);
|
|
12
|
-
const prevY = useRef(0);
|
|
13
13
|
const { treeWidth, height, blocksY, treeAreaWidth } = model;
|
|
14
|
-
const
|
|
15
|
-
|
|
16
|
-
const curr = ref.current;
|
|
17
|
-
if (!curr) {
|
|
18
|
-
return;
|
|
19
|
-
}
|
|
20
|
-
function onWheel(event) {
|
|
21
|
-
deltaY.current += event.deltaY;
|
|
22
|
-
if (!scheduled.current) {
|
|
23
|
-
scheduled.current = true;
|
|
24
|
-
requestAnimationFrame(() => {
|
|
25
|
-
model.doScrollY(-deltaY.current);
|
|
26
|
-
deltaY.current = 0;
|
|
27
|
-
scheduled.current = false;
|
|
28
|
-
});
|
|
29
|
-
}
|
|
30
|
-
event.preventDefault();
|
|
31
|
-
event.stopPropagation();
|
|
32
|
-
}
|
|
33
|
-
curr.addEventListener('wheel', onWheel, { passive: false });
|
|
34
|
-
return () => {
|
|
35
|
-
curr.removeEventListener('wheel', onWheel);
|
|
36
|
-
};
|
|
14
|
+
const onScrollY = useCallback((d) => {
|
|
15
|
+
model.doScrollY(d);
|
|
37
16
|
}, [model]);
|
|
38
|
-
|
|
39
|
-
if (mouseDragging) {
|
|
40
|
-
function globalMouseMove(event) {
|
|
41
|
-
event.preventDefault();
|
|
42
|
-
const currY = event.clientY;
|
|
43
|
-
const distanceY = currY - prevY.current;
|
|
44
|
-
if (distanceY) {
|
|
45
|
-
if (!scheduled.current) {
|
|
46
|
-
scheduled.current = true;
|
|
47
|
-
window.requestAnimationFrame(() => {
|
|
48
|
-
model.doScrollY(distanceY);
|
|
49
|
-
scheduled.current = false;
|
|
50
|
-
prevY.current = event.clientY;
|
|
51
|
-
});
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
function globalMouseUp() {
|
|
56
|
-
prevY.current = 0;
|
|
57
|
-
setMouseDragging(false);
|
|
58
|
-
}
|
|
59
|
-
window.addEventListener('mousemove', globalMouseMove, true);
|
|
60
|
-
window.addEventListener('mouseup', globalMouseUp, true);
|
|
61
|
-
return () => {
|
|
62
|
-
window.removeEventListener('mousemove', globalMouseMove, true);
|
|
63
|
-
window.removeEventListener('mouseup', globalMouseUp, true);
|
|
64
|
-
};
|
|
65
|
-
}
|
|
66
|
-
return undefined;
|
|
67
|
-
}, [model, mouseDragging]);
|
|
68
|
-
// Global tree mouseover effect. Only [model] is needed in the dependency
|
|
69
|
-
// array because autorun internally tracks all accessed observables
|
|
70
|
-
// (treeAreaWidth, height, scrollY, etc.) and re-runs when they change
|
|
17
|
+
const { onMouseDown, onMouseUp } = useWheelScroll({ ref, onScrollY });
|
|
71
18
|
useEffect(() => {
|
|
72
19
|
const ctx = mouseoverRef.current?.getContext('2d');
|
|
73
20
|
return ctx
|
|
@@ -76,60 +23,36 @@ const TreeCanvas = observer(function ({ model }) {
|
|
|
76
23
|
const { relativeTo, leaves, rowHeight, hoveredTreeNode, treeAreaWidth: w, height: h, scrollY: sy, mouseOverRowName, } = model;
|
|
77
24
|
ctx.resetTransform();
|
|
78
25
|
ctx.clearRect(0, 0, w, h);
|
|
79
|
-
// Highlight reference row (relativeTo) persistently
|
|
80
26
|
if (relativeTo) {
|
|
81
27
|
const referenceLeaf = leaves.find(leaf => leaf.data.name === relativeTo);
|
|
82
28
|
if (referenceLeaf) {
|
|
83
|
-
|
|
84
|
-
ctx.
|
|
85
|
-
ctx.fillRect(0, y - rowHeight / 2, w, rowHeight);
|
|
29
|
+
ctx.fillStyle = referenceColor;
|
|
30
|
+
ctx.fillRect(0, referenceLeaf.x + sy - rowHeight / 2, w, rowHeight);
|
|
86
31
|
}
|
|
87
32
|
}
|
|
88
|
-
// Highlight multiple rows when hovering over tree nodes
|
|
89
33
|
if (hoveredTreeNode) {
|
|
90
|
-
ctx.fillStyle =
|
|
34
|
+
ctx.fillStyle = treeHoverColor;
|
|
91
35
|
for (const descendantName of hoveredTreeNode.descendantNames) {
|
|
92
36
|
const matchingLeaf = leaves.find(leaf => leaf.data.name === descendantName);
|
|
93
37
|
if (matchingLeaf) {
|
|
94
|
-
|
|
95
|
-
ctx.fillRect(0, y - rowHeight / 2, w, rowHeight);
|
|
38
|
+
ctx.fillRect(0, matchingLeaf.x + sy - rowHeight / 2, w, rowHeight);
|
|
96
39
|
}
|
|
97
40
|
}
|
|
98
41
|
}
|
|
99
|
-
// Highlight single tree row corresponding to MSA mouseover (if not part of multi-row hover)
|
|
100
42
|
if (mouseOverRowName &&
|
|
101
43
|
mouseOverRowName !== relativeTo &&
|
|
102
44
|
!hoveredTreeNode?.descendantNames.includes(mouseOverRowName)) {
|
|
103
45
|
const matchingLeaf = leaves.find(leaf => leaf.data.name === mouseOverRowName);
|
|
104
46
|
if (matchingLeaf) {
|
|
105
|
-
|
|
106
|
-
ctx.
|
|
107
|
-
ctx.fillRect(0, y - rowHeight / 2, w, rowHeight);
|
|
47
|
+
ctx.fillStyle = treeHoverColor;
|
|
48
|
+
ctx.fillRect(0, matchingLeaf.x + sy - rowHeight / 2, w, rowHeight);
|
|
108
49
|
}
|
|
109
50
|
}
|
|
110
51
|
}
|
|
111
52
|
})
|
|
112
53
|
: undefined;
|
|
113
54
|
}, [model]);
|
|
114
|
-
|
|
115
|
-
// check if clicking a draggable element or a resize handle
|
|
116
|
-
const target = event.target;
|
|
117
|
-
if (target.draggable || target.dataset.resizer) {
|
|
118
|
-
return;
|
|
119
|
-
}
|
|
120
|
-
// otherwise do click and drag scroll
|
|
121
|
-
if (event.button === 0) {
|
|
122
|
-
prevY.current = event.clientY;
|
|
123
|
-
setMouseDragging(true);
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
return (React.createElement("div", { ref: ref, onMouseDown: mouseDown, onMouseUp: event => {
|
|
127
|
-
// this local mouseup is used in addition to the global because
|
|
128
|
-
// sometimes the global add/remove are not called in time, resulting in
|
|
129
|
-
// issue #533
|
|
130
|
-
event.preventDefault();
|
|
131
|
-
setMouseDragging(false);
|
|
132
|
-
}, onMouseLeave: event => {
|
|
55
|
+
return (React.createElement("div", { ref: ref, onMouseDown: onMouseDown, onMouseUp: onMouseUp, onMouseLeave: event => {
|
|
133
56
|
event.preventDefault();
|
|
134
57
|
}, style: {
|
|
135
58
|
height,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TreeCanvas.js","sourceRoot":"","sources":["../../../src/components/tree/TreeCanvas.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,
|
|
1
|
+
{"version":3,"file":"TreeCanvas.js","sourceRoot":"","sources":["../../../src/components/tree/TreeCanvas.tsx"],"names":[],"mappings":"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"}
|
|
@@ -4,8 +4,9 @@ import { observer } from 'mobx-react';
|
|
|
4
4
|
// lazies
|
|
5
5
|
const TreeNodeInfoDialog = lazy(() => import("./dialogs/TreeNodeInfoDialog.js"));
|
|
6
6
|
const TreeMenu = observer(function ({ node, onClose, model, }) {
|
|
7
|
-
const { collapsed
|
|
8
|
-
const { name } = node;
|
|
7
|
+
const { collapsed } = model;
|
|
8
|
+
const { name, id } = node;
|
|
9
|
+
const isCollapsed = collapsed.includes(id);
|
|
9
10
|
return (React.createElement(Menu, { anchorReference: "anchorPosition", anchorPosition: {
|
|
10
11
|
top: node.y,
|
|
11
12
|
left: node.x,
|
|
@@ -24,21 +25,9 @@ const TreeMenu = observer(function ({ node, onClose, model, }) {
|
|
|
24
25
|
onClose();
|
|
25
26
|
} }, "More info..."),
|
|
26
27
|
React.createElement(MenuItem, { dense: true, onClick: () => {
|
|
27
|
-
|
|
28
|
-
model.toggleCollapsed(node.id);
|
|
29
|
-
}
|
|
30
|
-
else {
|
|
31
|
-
if (node.id.endsWith('-leafnode')) {
|
|
32
|
-
model.toggleCollapsedLeaf(node.id);
|
|
33
|
-
}
|
|
34
|
-
else {
|
|
35
|
-
model.toggleCollapsedLeaf(`${node.id}-leafnode`);
|
|
36
|
-
}
|
|
37
|
-
}
|
|
28
|
+
model.toggleCollapsed(id);
|
|
38
29
|
onClose();
|
|
39
|
-
} },
|
|
40
|
-
? 'Show node'
|
|
41
|
-
: 'Hide node'),
|
|
30
|
+
} }, isCollapsed ? 'Show node' : 'Hide node'),
|
|
42
31
|
React.createElement(MenuItem, { dense: true, onClick: () => {
|
|
43
32
|
model.drawRelativeTo(node.name);
|
|
44
33
|
onClose();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TreeNodeMenu.js","sourceRoot":"","sources":["../../../src/components/tree/TreeNodeMenu.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,OAAO,CAAA;AAEnC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAIrC,SAAS;AACT,MAAM,kBAAkB,GAAG,IAAI,CAC7B,GAAG,EAAE,CAAC,MAAM,CAAC,iCAAkC,CAAC,CACjD,CAAA;AAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,UAAU,EAClC,IAAI,EACJ,OAAO,EACP,KAAK,GAUN;IACC,MAAM,EAAE,SAAS,EAAE,
|
|
1
|
+
{"version":3,"file":"TreeNodeMenu.js","sourceRoot":"","sources":["../../../src/components/tree/TreeNodeMenu.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,OAAO,CAAA;AAEnC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAIrC,SAAS;AACT,MAAM,kBAAkB,GAAG,IAAI,CAC7B,GAAG,EAAE,CAAC,MAAM,CAAC,iCAAkC,CAAC,CACjD,CAAA;AAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,UAAU,EAClC,IAAI,EACJ,OAAO,EACP,KAAK,GAUN;IACC,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,CAAA;IAC3B,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,IAAI,CAAA;IACzB,MAAM,WAAW,GAAG,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;IAC1C,OAAO,CACL,oBAAC,IAAI,IACH,eAAe,EAAC,gBAAgB,EAChC,cAAc,EAAE;YACd,GAAG,EAAE,IAAI,CAAC,CAAC;YACX,IAAI,EAAE,IAAI,CAAC,CAAC;SACb,EACD,kBAAkB,EAAE,CAAC,EACrB,WAAW,QACX,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,EACnB,OAAO,EAAE,OAAO;QAEhB,oBAAC,QAAQ,IAAC,KAAK,QAAC,QAAQ,UACrB,IAAI,CACI;QAEX,oBAAC,QAAQ,IACP,KAAK,QACL,OAAO,EAAE,GAAG,EAAE;gBACZ,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC3B,kBAAkB;oBAClB;wBACE,IAAI,EAAE,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC;wBAC5B,KAAK;wBACL,QAAQ,EAAE,IAAI;wBACd,OAAO;qBACR;iBACF,CAAC,CAAA;gBACF,OAAO,EAAE,CAAA;YACX,CAAC,mBAGQ;QACX,oBAAC,QAAQ,IACP,KAAK,QACL,OAAO,EAAE,GAAG,EAAE;gBACZ,KAAK,CAAC,eAAe,CAAC,EAAE,CAAC,CAAA;gBACzB,OAAO,EAAE,CAAA;YACX,CAAC,IAEA,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAC/B;QACX,oBAAC,QAAQ,IACP,KAAK,QACL,OAAO,EAAE,GAAG,EAAE;gBACZ,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBAC/B,OAAO,EAAE,CAAA;YACX,CAAC,yCAGQ;QACV,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAClB,oBAAC,QAAQ,IACP,KAAK,QACL,OAAO,EAAE,GAAG,EAAE;gBACZ,KAAK,CAAC,cAAc,CAAC,SAAS,CAAC,CAAA;gBAC/B,OAAO,EAAE,CAAA;YACX,CAAC,0BAGQ,CACZ,CAAC,CAAC,CAAC,IAAI,CACH,CACR,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,eAAe,QAAQ,CAAA"}
|
|
@@ -1,20 +1,60 @@
|
|
|
1
|
+
import { descendants, links } from "../../hierarchy.js";
|
|
1
2
|
export const padding = 600;
|
|
2
3
|
const extendBounds = 5;
|
|
3
4
|
const radius = 2.5;
|
|
4
5
|
const d = radius * 2;
|
|
6
|
+
// Cladogram positioning algorithm based on ape package's plot.phylo
|
|
7
|
+
// Uses topological depth (steps to tips) instead of branch length for x-positioning
|
|
8
|
+
// This ensures all leaf nodes align at the same x-coordinate (rightmost position)
|
|
9
|
+
// See: https://github.com/emmanuelparadis/ape/blob/master/R/plot.phylo.R
|
|
10
|
+
function calcDepthToLeaf(node) {
|
|
11
|
+
if (node.depthToLeaf !== undefined) {
|
|
12
|
+
return node.depthToLeaf;
|
|
13
|
+
}
|
|
14
|
+
if (!node.children || node.children.length === 0) {
|
|
15
|
+
node.depthToLeaf = 0;
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
let maxDepth = 0;
|
|
19
|
+
for (const child of node.children) {
|
|
20
|
+
maxDepth = Math.max(maxDepth, 1 + calcDepthToLeaf(child));
|
|
21
|
+
}
|
|
22
|
+
node.depthToLeaf = maxDepth;
|
|
23
|
+
}
|
|
24
|
+
return node.depthToLeaf;
|
|
25
|
+
}
|
|
26
|
+
function findMaxBranchLen(node) {
|
|
27
|
+
let maxLen = node.len || 0;
|
|
28
|
+
if (node.children) {
|
|
29
|
+
for (const child of node.children) {
|
|
30
|
+
maxLen = Math.max(maxLen, findMaxBranchLen(child));
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return maxLen;
|
|
34
|
+
}
|
|
35
|
+
// Calculate node x-coordinate for both phylogram (with branch lengths) and cladogram (topology only) modes
|
|
36
|
+
// For cladograms: x = (maxDepthToLeaf - nodeDepthToLeaf) / maxDepthToLeaf * maxWidth
|
|
37
|
+
// This positions: leaves at maxWidth (rightmost), root at 0 (leftmost), internal nodes proportionally in between
|
|
38
|
+
// Matches ape's: xx <- max(xx) - xx (where xx is depth from each node to tips)
|
|
39
|
+
function getNodeX(node, showBranchLen, maxBranchLen, maxDepthToLeaf) {
|
|
40
|
+
if (showBranchLen) {
|
|
41
|
+
return node.len;
|
|
42
|
+
}
|
|
43
|
+
const depthToLeaf = calcDepthToLeaf(node);
|
|
44
|
+
return ((maxDepthToLeaf - depthToLeaf) / maxDepthToLeaf) * maxBranchLen;
|
|
45
|
+
}
|
|
5
46
|
export function renderTree({ offsetY, ctx, model, theme, blockSizeYOverride, }) {
|
|
6
47
|
const { hierarchy, showBranchLenEffective: showBranchLen, blockSize } = model;
|
|
7
48
|
const by = blockSizeYOverride || blockSize;
|
|
8
49
|
ctx.strokeStyle = theme.palette.text.primary;
|
|
9
|
-
|
|
50
|
+
const maxBranchLen = findMaxBranchLen(hierarchy);
|
|
51
|
+
const maxDepthToLeaf = calcDepthToLeaf(hierarchy);
|
|
52
|
+
for (const link of links(hierarchy)) {
|
|
10
53
|
const { source, target } = link;
|
|
11
|
-
if (target.height === 0 && !showBranchLen) {
|
|
12
|
-
continue;
|
|
13
|
-
}
|
|
14
54
|
const sy = source.x;
|
|
15
55
|
const ty = target.x;
|
|
16
|
-
const tx = showBranchLen
|
|
17
|
-
const sx = showBranchLen
|
|
56
|
+
const tx = getNodeX(target, showBranchLen, maxBranchLen, maxDepthToLeaf);
|
|
57
|
+
const sx = getNodeX(source, showBranchLen, maxBranchLen, maxDepthToLeaf);
|
|
18
58
|
if (tx === undefined || sx === undefined) {
|
|
19
59
|
continue;
|
|
20
60
|
}
|
|
@@ -35,15 +75,17 @@ export function renderTree({ offsetY, ctx, model, theme, blockSizeYOverride, })
|
|
|
35
75
|
export function renderNodeBubbles({ ctx, clickMap, offsetY, model, blockSizeYOverride, }) {
|
|
36
76
|
const { hierarchy, showBranchLenEffective: showBranchLen, collapsed, blockSize, marginLeft: ml, } = model;
|
|
37
77
|
const by = blockSizeYOverride || blockSize;
|
|
38
|
-
|
|
39
|
-
|
|
78
|
+
const maxBranchLen = findMaxBranchLen(hierarchy);
|
|
79
|
+
const maxDepthToLeaf = calcDepthToLeaf(hierarchy);
|
|
80
|
+
for (const node of descendants(hierarchy)) {
|
|
81
|
+
const x = getNodeX(node, showBranchLen, maxBranchLen, maxDepthToLeaf);
|
|
40
82
|
if (x === undefined) {
|
|
41
83
|
continue;
|
|
42
84
|
}
|
|
43
85
|
const { data } = node;
|
|
44
86
|
const y = node.x;
|
|
45
87
|
const { id, name } = data;
|
|
46
|
-
if (node.height
|
|
88
|
+
if (node.height >= 1 &&
|
|
47
89
|
y > offsetY - extendBounds &&
|
|
48
90
|
y < offsetY + by + extendBounds) {
|
|
49
91
|
ctx.strokeStyle = 'black';
|
|
@@ -65,7 +107,7 @@ export function renderNodeBubbles({ ctx, clickMap, offsetY, model, blockSizeYOve
|
|
|
65
107
|
}
|
|
66
108
|
}
|
|
67
109
|
export function renderTreeLabels({ theme, model, offsetY, ctx, clickMap, blockSizeYOverride, }) {
|
|
68
|
-
const { fontSize, showBranchLenEffective: showBranchLen, treeMetadata,
|
|
110
|
+
const { fontSize, showBranchLenEffective: showBranchLen, treeMetadata, blockSize, labelsAlignRight, drawTree, treeAreaWidth, treeAreaWidthMinusMargin, marginLeft, leaves, noTree, hierarchy, } = model;
|
|
69
111
|
const by = blockSizeYOverride || blockSize;
|
|
70
112
|
const emHeight = ctx.measureText('M').width;
|
|
71
113
|
if (labelsAlignRight) {
|
|
@@ -75,27 +117,18 @@ export function renderTreeLabels({ theme, model, offsetY, ctx, clickMap, blockSi
|
|
|
75
117
|
else {
|
|
76
118
|
ctx.textAlign = 'start';
|
|
77
119
|
}
|
|
120
|
+
const maxBranchLen = findMaxBranchLen(hierarchy);
|
|
121
|
+
const maxDepthToLeaf = calcDepthToLeaf(hierarchy);
|
|
78
122
|
for (const node of leaves) {
|
|
79
123
|
const { data: { name, id }, } = node;
|
|
80
|
-
const len = node.len;
|
|
81
124
|
const y = node.x;
|
|
82
|
-
const x = node.y;
|
|
83
125
|
const displayName = treeMetadata[name]?.genome || name;
|
|
84
126
|
if (y > offsetY - extendBounds && y < offsetY + by + extendBounds) {
|
|
85
127
|
// note: +rowHeight/4 matches with -rowHeight/4 in msa
|
|
86
128
|
const yp = y + fontSize / 4;
|
|
87
129
|
let xp = 0;
|
|
88
130
|
if (!noTree) {
|
|
89
|
-
xp = (showBranchLen
|
|
90
|
-
if (!showBranchLen &&
|
|
91
|
-
!collapsed.includes(id) &&
|
|
92
|
-
!collapsedLeaves.includes(id)) {
|
|
93
|
-
// this subtraction is a hack to compensate for the leafnode rendering
|
|
94
|
-
// glitch (issue #71). the context is that an extra leaf node is added
|
|
95
|
-
// so that 'collapsing/hiding leaf nodes is possible' but this causes
|
|
96
|
-
// weird workarounds
|
|
97
|
-
xp -= treeWidth / hierarchy.height;
|
|
98
|
-
}
|
|
131
|
+
xp = getNodeX(node, showBranchLen, maxBranchLen, maxDepthToLeaf) || 0;
|
|
99
132
|
}
|
|
100
133
|
const { width } = ctx.measureText(displayName);
|
|
101
134
|
ctx.fillStyle = theme.palette.text.primary;
|