react-msaview 3.1.2 → 3.1.4
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 +31 -31
- package/dist/DialogQueue.js +2 -4
- package/dist/DialogQueue.js.map +1 -1
- package/dist/UniprotTrack.js +1 -1
- package/dist/UniprotTrack.js.map +1 -1
- package/dist/components/BoxTrackBlock.js +3 -4
- package/dist/components/BoxTrackBlock.js.map +1 -1
- package/dist/components/ExportSVGDialog.js +17 -4
- package/dist/components/ExportSVGDialog.js.map +1 -1
- package/dist/components/ImportForm/util.js +1 -0
- package/dist/components/ImportForm/util.js.map +1 -1
- package/dist/components/Loading.d.ts +6 -0
- package/dist/components/Loading.js +12 -0
- package/dist/components/Loading.js.map +1 -0
- package/dist/components/MSAPanel/MSABlock.js +3 -3
- package/dist/components/MSAPanel/MSABlock.js.map +1 -1
- package/dist/components/MSAPanel/MSAMouseoverCanvas.js +7 -9
- package/dist/components/MSAPanel/MSAMouseoverCanvas.js.map +1 -1
- package/dist/components/MSAPanel/index.js +1 -1
- package/dist/components/MSAPanel/index.js.map +1 -1
- package/dist/components/MSAPanel/renderMSABlock.d.ts +3 -1
- package/dist/components/MSAPanel/renderMSABlock.js +10 -10
- package/dist/components/MSAPanel/renderMSABlock.js.map +1 -1
- package/dist/components/MSAPanel/renderMSAMouseover.js +5 -8
- package/dist/components/MSAPanel/renderMSAMouseover.js.map +1 -1
- package/dist/components/MSAView.js +20 -16
- package/dist/components/MSAView.js.map +1 -1
- package/dist/components/TextTrack.js +1 -1
- package/dist/components/TextTrack.js.map +1 -1
- package/dist/components/TreePanel/TreeCanvasBlock.js +11 -13
- package/dist/components/TreePanel/TreeCanvasBlock.js.map +1 -1
- package/dist/components/TreePanel/TreeNodeMenu.js +4 -6
- package/dist/components/TreePanel/TreeNodeMenu.js.map +1 -1
- package/dist/components/TreePanel/renderTreeCanvas.js +12 -13
- package/dist/components/TreePanel/renderTreeCanvas.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/layout.js +5 -0
- package/dist/layout.js.map +1 -1
- package/dist/measureTextCanvas.d.ts +1 -0
- package/dist/measureTextCanvas.js +13 -0
- package/dist/measureTextCanvas.js.map +1 -0
- package/dist/model.d.ts +53 -47
- package/dist/model.js +20 -40
- package/dist/model.js.map +1 -1
- package/dist/parseNewick.js +1 -2
- package/dist/parseNewick.js.map +1 -1
- package/dist/parsers/ClustalMSA.js +3 -4
- package/dist/parsers/ClustalMSA.js.map +1 -1
- package/dist/parsers/FastaMSA.js +3 -4
- package/dist/parsers/FastaMSA.js.map +1 -1
- package/dist/parsers/StockholmMSA.js +13 -19
- package/dist/parsers/StockholmMSA.js.map +1 -1
- package/dist/renderToSvg.d.ts +1 -0
- package/dist/renderToSvg.js +78 -22
- package/dist/renderToSvg.js.map +1 -1
- package/dist/util.js +7 -4
- package/dist/util.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -23
- package/src/components/ExportSVGDialog.tsx +48 -13
- package/src/components/ImportForm/util.ts +1 -0
- package/src/components/Loading.tsx +27 -0
- package/src/components/MSAPanel/MSABlock.tsx +2 -1
- package/src/components/MSAPanel/MSAMouseoverCanvas.tsx +6 -6
- package/src/components/MSAPanel/index.tsx +2 -2
- package/src/components/MSAPanel/renderMSABlock.ts +10 -1
- package/src/components/MSAPanel/renderMSAMouseover.ts +3 -17
- package/src/components/MSAView.tsx +28 -30
- package/src/components/TreePanel/TreeCanvasBlock.tsx +5 -6
- package/src/components/TreePanel/renderTreeCanvas.ts +4 -6
- package/src/index.ts +1 -1
- package/src/measureTextCanvas.ts +14 -0
- package/src/model.ts +14 -16
- package/src/renderToSvg.tsx +156 -40
- package/src/version.ts +1 -1
package/dist/renderToSvg.js
CHANGED
|
@@ -6,19 +6,75 @@ import { renderTreeCanvas } from './components/TreePanel/renderTreeCanvas';
|
|
|
6
6
|
import { renderMSABlock } from './components/MSAPanel/renderMSABlock';
|
|
7
7
|
import { colorContrast } from './util';
|
|
8
8
|
import MinimapSVG from './components/MinimapSVG';
|
|
9
|
-
// render LGV to SVG
|
|
10
9
|
export async function renderToSvg(model, opts) {
|
|
11
10
|
await when(() => !!model.initialized);
|
|
12
|
-
|
|
13
|
-
const {
|
|
14
|
-
|
|
11
|
+
const { width, height, scrollX, scrollY } = model;
|
|
12
|
+
const { exportType, theme, includeMinimap } = opts;
|
|
13
|
+
if (exportType === 'entire') {
|
|
14
|
+
return render({
|
|
15
|
+
width: model.totalWidth + model.treeAreaWidth,
|
|
16
|
+
height: model.totalHeight,
|
|
17
|
+
theme,
|
|
18
|
+
model,
|
|
19
|
+
offsetY: 0,
|
|
20
|
+
offsetX: 0,
|
|
21
|
+
includeMinimap,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
else if (exportType === 'viewport') {
|
|
25
|
+
return render({
|
|
26
|
+
width,
|
|
27
|
+
height,
|
|
28
|
+
theme,
|
|
29
|
+
model,
|
|
30
|
+
offsetY: scrollY,
|
|
31
|
+
offsetX: -scrollX,
|
|
32
|
+
includeMinimap,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
throw new Error('unknown export type');
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
async function render({ width, height, offsetX, offsetY, theme, model, includeMinimap, }) {
|
|
15
40
|
const { Context } = await import('svgcanvas');
|
|
41
|
+
const Wrapper = includeMinimap ? MinimapWrapper : NullWrapper;
|
|
42
|
+
return renderToStaticMarkup(React.createElement(SvgWrapper, { width: width, height: height },
|
|
43
|
+
React.createElement(Wrapper, { model: model },
|
|
44
|
+
React.createElement(CoreRendering, { Context: Context, model: model, theme: theme, offsetX: offsetX, offsetY: offsetY, width: width, height: height }))), createRoot);
|
|
45
|
+
}
|
|
46
|
+
// function renderMultiline({ model }: { model: MsaViewModel }) {
|
|
47
|
+
// const { treeAreaWidth, height } = model
|
|
48
|
+
// const clipId = 'tree'
|
|
49
|
+
// return (
|
|
50
|
+
// <Wrapper model={model}>
|
|
51
|
+
// <defs>
|
|
52
|
+
// <clipPath id={clipId}>
|
|
53
|
+
// <rect x={0} y={0} width={treeAreaWidth} height={height} />
|
|
54
|
+
// </clipPath>
|
|
55
|
+
// </defs>
|
|
56
|
+
// <g
|
|
57
|
+
// clipPath={`url(#${clipId})`}
|
|
58
|
+
// /* eslint-disable-next-line react/no-danger */
|
|
59
|
+
// dangerouslySetInnerHTML={{ __html: ctx1.getSvg().innerHTML }}
|
|
60
|
+
// />
|
|
61
|
+
// <g
|
|
62
|
+
// transform={`translate(${treeAreaWidth} 0)`}
|
|
63
|
+
// /* eslint-disable-next-line react/no-danger */
|
|
64
|
+
// dangerouslySetInnerHTML={{ __html: ctx2.getSvg().innerHTML }}
|
|
65
|
+
// />
|
|
66
|
+
// </Wrapper>
|
|
67
|
+
// )
|
|
68
|
+
// }
|
|
69
|
+
function CoreRendering({ model, theme, width, height, offsetX, offsetY, Context, }) {
|
|
70
|
+
const clipId = 'tree';
|
|
71
|
+
const { treeAreaWidth, colorScheme } = model;
|
|
72
|
+
const contrastScheme = colorContrast(colorScheme, theme);
|
|
16
73
|
const ctx1 = Context(width, height);
|
|
17
74
|
const ctx2 = Context(width, height);
|
|
18
|
-
const contrastScheme = colorContrast(colorScheme, theme);
|
|
19
75
|
renderTreeCanvas({
|
|
20
76
|
model,
|
|
21
|
-
offsetY
|
|
77
|
+
offsetY,
|
|
22
78
|
ctx: ctx1,
|
|
23
79
|
theme,
|
|
24
80
|
blockSizeYOverride: height,
|
|
@@ -26,28 +82,25 @@ export async function renderToSvg(model, opts) {
|
|
|
26
82
|
});
|
|
27
83
|
renderMSABlock({
|
|
28
84
|
model,
|
|
29
|
-
|
|
30
|
-
|
|
85
|
+
theme,
|
|
86
|
+
offsetY,
|
|
87
|
+
offsetX,
|
|
31
88
|
contrastScheme,
|
|
32
89
|
ctx: ctx2,
|
|
33
90
|
blockSizeXOverride: width - treeAreaWidth,
|
|
34
91
|
blockSizeYOverride: height,
|
|
35
92
|
highResScaleFactorOverride: 1,
|
|
36
93
|
});
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
React.createElement(
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
dangerouslySetInnerHTML: { __html: ctx1.getSvg().innerHTML } }),
|
|
48
|
-
React.createElement("g", { transform: `translate(${treeAreaWidth} 0)`,
|
|
49
|
-
/* eslint-disable-next-line react/no-danger */
|
|
50
|
-
dangerouslySetInnerHTML: { __html: ctx2.getSvg().innerHTML } }))), createRoot);
|
|
94
|
+
return (React.createElement(React.Fragment, null,
|
|
95
|
+
React.createElement("defs", null,
|
|
96
|
+
React.createElement("clipPath", { id: clipId },
|
|
97
|
+
React.createElement("rect", { x: 0, y: 0, width: treeAreaWidth, height: height }))),
|
|
98
|
+
React.createElement("g", { clipPath: `url(#${clipId})`,
|
|
99
|
+
/* eslint-disable-next-line react/no-danger */
|
|
100
|
+
dangerouslySetInnerHTML: { __html: ctx1.getSvg().innerHTML } }),
|
|
101
|
+
React.createElement("g", { transform: `translate(${treeAreaWidth} 0)`,
|
|
102
|
+
/* eslint-disable-next-line react/no-danger */
|
|
103
|
+
dangerouslySetInnerHTML: { __html: ctx2.getSvg().innerHTML } })));
|
|
51
104
|
}
|
|
52
105
|
function MinimapWrapper({ model, children, }) {
|
|
53
106
|
const { minimapHeight, treeAreaWidth } = model;
|
|
@@ -56,6 +109,9 @@ function MinimapWrapper({ model, children, }) {
|
|
|
56
109
|
React.createElement(MinimapSVG, { model: model })),
|
|
57
110
|
React.createElement("g", { transform: `translate(0 ${minimapHeight})` }, children)));
|
|
58
111
|
}
|
|
112
|
+
function SvgWrapper({ width, height, children, }) {
|
|
113
|
+
return (React.createElement("svg", { width: width, height: height, xmlns: "http://www.w3.org/2000/svg", xmlnsXlink: "http://www.w3.org/1999/xlink", viewBox: [0, 0, width, height].toString() }, children));
|
|
114
|
+
}
|
|
59
115
|
function NullWrapper({ children }) {
|
|
60
116
|
return React.createElement(React.Fragment, null, children);
|
|
61
117
|
}
|
package/dist/renderToSvg.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderToSvg.js","sourceRoot":"","sources":["../src/renderToSvg.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AAKzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAA;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAA;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAA;AACtC,OAAO,UAAU,MAAM,yBAAyB,CAAA;AAEhD,
|
|
1
|
+
{"version":3,"file":"renderToSvg.js","sourceRoot":"","sources":["../src/renderToSvg.tsx"],"names":[],"mappings":"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"}
|
package/dist/util.js
CHANGED
|
@@ -6,13 +6,12 @@ export function transform(obj, cb) {
|
|
|
6
6
|
return Object.fromEntries(Object.entries(obj).map(cb));
|
|
7
7
|
}
|
|
8
8
|
export function generateNodeIds(tree, parent = 'node', depth = 0) {
|
|
9
|
-
var _a;
|
|
10
9
|
const id = `${parent}-${depth}`;
|
|
11
10
|
return {
|
|
12
11
|
...tree,
|
|
13
12
|
id,
|
|
14
13
|
name: tree.name || id,
|
|
15
|
-
branchset:
|
|
14
|
+
branchset: tree.branchset?.map((b, i) => generateNodeIds(b, `${id}-${i}`, depth + 1)) || [],
|
|
16
15
|
};
|
|
17
16
|
}
|
|
18
17
|
export function colorContrast(colorScheme, theme) {
|
|
@@ -22,7 +21,11 @@ export function colorContrast(colorScheme, theme) {
|
|
|
22
21
|
]);
|
|
23
22
|
}
|
|
24
23
|
export function parseGFF(str) {
|
|
25
|
-
return str
|
|
24
|
+
return str
|
|
25
|
+
?.split('\n')
|
|
26
|
+
.map(f => f.trim())
|
|
27
|
+
.filter(f => !!f && !f.startsWith('#'))
|
|
28
|
+
.map(f => {
|
|
26
29
|
const [seq_id, source, type, start, end, score, strand, phase, col9] = f.split('\t');
|
|
27
30
|
return {
|
|
28
31
|
seq_id,
|
|
@@ -87,7 +90,7 @@ export function collapse(d) {
|
|
|
87
90
|
// Collapse the node and all it's children, from
|
|
88
91
|
// https://bl.ocks.org/d3noob/43a860bc0024792f8803bba8ca0d5ecd
|
|
89
92
|
export function filterHiddenLeafNodes(d, hiddenId) {
|
|
90
|
-
if (d
|
|
93
|
+
if (d?.children) {
|
|
91
94
|
d.children = d.children.filter(f => f.id !== hiddenId);
|
|
92
95
|
}
|
|
93
96
|
}
|
package/dist/util.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAE9B,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AACvC,OAAO,WAAW,MAAM,sBAAsB,CAAA;AAE9C,MAAM,CAAC,CAAC,WAAW,CAAC,CAAC,CAAA;AAErB,MAAM,UAAU,SAAS,CACvB,GAAsB,EACtB,EAAsC;IAEtC,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;AACxD,CAAC;AAwBD,MAAM,UAAU,eAAe,CAC7B,IAAU,EACV,MAAM,GAAG,MAAM,EACf,KAAK,GAAG,CAAC
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"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"}
|
package/dist/version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const version = "3.1.
|
|
1
|
+
export declare const version = "3.1.4";
|
package/dist/version.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export const version = '3.1.
|
|
1
|
+
export const version = '3.1.4';
|
|
2
2
|
//# sourceMappingURL=version.js.map
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-msaview",
|
|
3
3
|
"author": "Colin",
|
|
4
|
-
"version": "3.1.
|
|
4
|
+
"version": "3.1.4",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"files": [
|
|
@@ -34,29 +34,7 @@
|
|
|
34
34
|
"react": ">=16.8.0",
|
|
35
35
|
"react-dom": ">=16.8.0"
|
|
36
36
|
},
|
|
37
|
-
"devDependencies": {
|
|
38
|
-
"@rollup/plugin-commonjs": "^25.0.4",
|
|
39
|
-
"@rollup/plugin-json": "^6.0.0",
|
|
40
|
-
"@rollup/plugin-node-resolve": "^15.0.2",
|
|
41
|
-
"@rollup/plugin-replace": "^5.0.5",
|
|
42
|
-
"@rollup/plugin-terser": "^0.4.1",
|
|
43
|
-
"@rollup/plugin-typescript": "^11.1.0",
|
|
44
|
-
"@types/color": "^3.0.1",
|
|
45
|
-
"@types/d3": "^7.4.0",
|
|
46
|
-
"@types/react": "^18.2.55",
|
|
47
|
-
"@types/react-dom": "^18.2.19",
|
|
48
|
-
"@typescript-eslint/eslint-plugin": "^6.21.0",
|
|
49
|
-
"@typescript-eslint/parser": "^6.21.0",
|
|
50
|
-
"eslint-plugin-unicorn": "^51.0.1",
|
|
51
|
-
"rollup": "^4.9.1",
|
|
52
|
-
"rollup-plugin-polyfill-node": "^0.13.0",
|
|
53
|
-
"slugify": "^1.6.6",
|
|
54
|
-
"tslib": "^2.1.0",
|
|
55
|
-
"typescript": "^5.0.4"
|
|
56
|
-
},
|
|
57
37
|
"dependencies": {
|
|
58
|
-
"@typescript-eslint/eslint-plugin": "^6.21.0",
|
|
59
|
-
"@typescript-eslint/parser": "^6.21.0",
|
|
60
38
|
"canvas2svg": "^1.0.16",
|
|
61
39
|
"clustal-js": "^2.0.0",
|
|
62
40
|
"colord": "^2.9.3",
|
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
import React, { useState } from 'react'
|
|
2
2
|
import { Dialog, ErrorMessage } from '@jbrowse/core/ui'
|
|
3
3
|
import {
|
|
4
|
-
DialogContent,
|
|
5
|
-
DialogActions,
|
|
6
4
|
Button,
|
|
7
5
|
Checkbox,
|
|
6
|
+
DialogContent,
|
|
7
|
+
DialogActions,
|
|
8
8
|
FormControlLabel,
|
|
9
|
-
|
|
9
|
+
FormControl,
|
|
10
|
+
FormLabel,
|
|
11
|
+
RadioGroup,
|
|
12
|
+
Radio,
|
|
10
13
|
Typography,
|
|
14
|
+
useTheme,
|
|
11
15
|
} from '@mui/material'
|
|
12
16
|
import { MsaViewModel } from '../model'
|
|
13
17
|
|
|
@@ -19,22 +23,48 @@ export default function ExportSVGDialog({
|
|
|
19
23
|
onClose: () => void
|
|
20
24
|
}) {
|
|
21
25
|
const [includeMinimap, setIncludeMinimap] = useState(true)
|
|
26
|
+
const [exportType, setExportType] = useState('viewport')
|
|
22
27
|
const [error, setError] = useState<unknown>()
|
|
23
28
|
const theme = useTheme()
|
|
24
29
|
return (
|
|
25
30
|
<Dialog onClose={() => onClose()} open title="Export SVG">
|
|
26
31
|
<DialogContent>
|
|
27
|
-
<Typography>Export SVG of current view</Typography>
|
|
28
32
|
{error ? <ErrorMessage error={error} /> : null}
|
|
29
|
-
<
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
33
|
+
<Typography>Settings:</Typography>
|
|
34
|
+
<div>
|
|
35
|
+
<FormControl>
|
|
36
|
+
<FormControlLabel
|
|
37
|
+
control={
|
|
38
|
+
<Checkbox
|
|
39
|
+
checked={includeMinimap}
|
|
40
|
+
onChange={event => setIncludeMinimap(event.target.checked)}
|
|
41
|
+
/>
|
|
42
|
+
}
|
|
43
|
+
disabled={exportType === 'entire'}
|
|
44
|
+
label="Include minimap?"
|
|
34
45
|
/>
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
46
|
+
</FormControl>
|
|
47
|
+
</div>
|
|
48
|
+
<div>
|
|
49
|
+
<FormControl>
|
|
50
|
+
<FormLabel>Export type</FormLabel>
|
|
51
|
+
<RadioGroup
|
|
52
|
+
value={exportType}
|
|
53
|
+
onChange={event => setExportType(event.target.value)}
|
|
54
|
+
>
|
|
55
|
+
<FormControlLabel
|
|
56
|
+
value="entire"
|
|
57
|
+
control={<Radio />}
|
|
58
|
+
label="Entire MSA"
|
|
59
|
+
/>
|
|
60
|
+
<FormControlLabel
|
|
61
|
+
value="viewport"
|
|
62
|
+
control={<Radio />}
|
|
63
|
+
label="Current viewport only"
|
|
64
|
+
/>
|
|
65
|
+
</RadioGroup>
|
|
66
|
+
</FormControl>
|
|
67
|
+
</div>
|
|
38
68
|
</DialogContent>
|
|
39
69
|
<DialogActions>
|
|
40
70
|
<Button
|
|
@@ -42,7 +72,12 @@ export default function ExportSVGDialog({
|
|
|
42
72
|
color="primary"
|
|
43
73
|
onClick={async () => {
|
|
44
74
|
try {
|
|
45
|
-
await model.exportSVG({
|
|
75
|
+
await model.exportSVG({
|
|
76
|
+
theme,
|
|
77
|
+
includeMinimap:
|
|
78
|
+
exportType === 'entire' ? false : includeMinimap,
|
|
79
|
+
exportType,
|
|
80
|
+
})
|
|
46
81
|
} catch (e) {
|
|
47
82
|
console.error(e)
|
|
48
83
|
setError(e)
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
|
|
3
|
+
import { observer } from 'mobx-react'
|
|
4
|
+
import { Typography } from '@mui/material'
|
|
5
|
+
|
|
6
|
+
// locals
|
|
7
|
+
import ImportForm from './ImportForm'
|
|
8
|
+
import MSAView from './MSAView'
|
|
9
|
+
import { MsaViewModel } from '../model'
|
|
10
|
+
|
|
11
|
+
const Loading = observer(function ({ model }: { model: MsaViewModel }) {
|
|
12
|
+
const { done, initialized } = model
|
|
13
|
+
|
|
14
|
+
return (
|
|
15
|
+
<div>
|
|
16
|
+
{!initialized ? (
|
|
17
|
+
<ImportForm model={model} />
|
|
18
|
+
) : !done ? (
|
|
19
|
+
<Typography variant="h4">Loading...</Typography>
|
|
20
|
+
) : (
|
|
21
|
+
<MSAView model={model} />
|
|
22
|
+
)}
|
|
23
|
+
</div>
|
|
24
|
+
)
|
|
25
|
+
})
|
|
26
|
+
|
|
27
|
+
export default Loading
|
|
@@ -42,13 +42,14 @@ const MSABlock = observer(function ({
|
|
|
42
42
|
return autorun(() => {
|
|
43
43
|
renderMSABlock({
|
|
44
44
|
ctx,
|
|
45
|
+
theme,
|
|
45
46
|
offsetX,
|
|
46
47
|
offsetY,
|
|
47
48
|
contrastScheme,
|
|
48
49
|
model,
|
|
49
50
|
})
|
|
50
51
|
})
|
|
51
|
-
}, [model, offsetX, offsetY, contrastScheme])
|
|
52
|
+
}, [model, offsetX, offsetY, theme, contrastScheme])
|
|
52
53
|
return (
|
|
53
54
|
<canvas
|
|
54
55
|
ref={ref}
|
|
@@ -15,17 +15,17 @@ const MSAMouseoverCanvas = observer(function ({
|
|
|
15
15
|
const { height, width } = model
|
|
16
16
|
useEffect(() => {
|
|
17
17
|
const ctx = ref.current?.getContext('2d')
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
})
|
|
18
|
+
return ctx
|
|
19
|
+
? autorun(() => {
|
|
20
|
+
renderMouseover({ ctx, model })
|
|
21
|
+
})
|
|
22
|
+
: undefined
|
|
24
23
|
}, [model])
|
|
25
24
|
|
|
26
25
|
return (
|
|
27
26
|
<canvas
|
|
28
27
|
ref={ref}
|
|
28
|
+
id="mouseover"
|
|
29
29
|
width={width}
|
|
30
30
|
height={height}
|
|
31
31
|
style={{
|
|
@@ -5,9 +5,9 @@ import { MsaViewModel } from '../../model'
|
|
|
5
5
|
|
|
6
6
|
export default function MSAPanel({ model }: { model: MsaViewModel }) {
|
|
7
7
|
return (
|
|
8
|
-
|
|
8
|
+
<div style={{ position: 'relative' }}>
|
|
9
9
|
<MSACanvas model={model} />
|
|
10
10
|
<MSAMouseoverCanvas model={model} />
|
|
11
|
-
|
|
11
|
+
</div>
|
|
12
12
|
)
|
|
13
13
|
}
|
|
@@ -3,6 +3,7 @@ import { MsaViewModel } from '../../model'
|
|
|
3
3
|
import { getClustalXColor, getPercentIdentityColor } from '../../colorSchemes'
|
|
4
4
|
import { NodeWithIdsAndLength } from '../../util'
|
|
5
5
|
import { HierarchyNode } from 'd3-hierarchy'
|
|
6
|
+
import { Theme } from '@mui/material'
|
|
6
7
|
|
|
7
8
|
export function renderMSABlock({
|
|
8
9
|
model,
|
|
@@ -10,12 +11,14 @@ export function renderMSABlock({
|
|
|
10
11
|
offsetY,
|
|
11
12
|
contrastScheme,
|
|
12
13
|
ctx,
|
|
14
|
+
theme,
|
|
13
15
|
highResScaleFactorOverride,
|
|
14
16
|
blockSizeXOverride,
|
|
15
17
|
blockSizeYOverride,
|
|
16
18
|
}: {
|
|
17
19
|
offsetX: number
|
|
18
20
|
offsetY: number
|
|
21
|
+
theme: Theme
|
|
19
22
|
model: MsaViewModel
|
|
20
23
|
contrastScheme: Record<string, string>
|
|
21
24
|
ctx: CanvasRenderingContext2D
|
|
@@ -52,6 +55,7 @@ export function renderMSABlock({
|
|
|
52
55
|
drawTiles({
|
|
53
56
|
model,
|
|
54
57
|
ctx,
|
|
58
|
+
theme,
|
|
55
59
|
offsetX,
|
|
56
60
|
offsetY,
|
|
57
61
|
xStart,
|
|
@@ -63,6 +67,7 @@ export function renderMSABlock({
|
|
|
63
67
|
ctx,
|
|
64
68
|
offsetX,
|
|
65
69
|
contrastScheme,
|
|
70
|
+
theme,
|
|
66
71
|
xStart,
|
|
67
72
|
xEnd,
|
|
68
73
|
visibleLeaves,
|
|
@@ -74,11 +79,13 @@ function drawTiles({
|
|
|
74
79
|
offsetX,
|
|
75
80
|
ctx,
|
|
76
81
|
visibleLeaves,
|
|
82
|
+
theme,
|
|
77
83
|
xStart,
|
|
78
84
|
xEnd,
|
|
79
85
|
}: {
|
|
80
86
|
model: MsaViewModel
|
|
81
87
|
offsetX: number
|
|
88
|
+
theme: Theme
|
|
82
89
|
offsetY: number
|
|
83
90
|
ctx: CanvasRenderingContext2D
|
|
84
91
|
visibleLeaves: HierarchyNode<NodeWithIdsAndLength>[]
|
|
@@ -118,7 +125,7 @@ function drawTiles({
|
|
|
118
125
|
: colorScheme[letter.toUpperCase()]
|
|
119
126
|
if (bgColor) {
|
|
120
127
|
const x = i * colWidth + offsetX - (offsetX % colWidth)
|
|
121
|
-
ctx.fillStyle = color ||
|
|
128
|
+
ctx.fillStyle = color || theme.palette.background.default
|
|
122
129
|
ctx.fillRect(x, y - rowHeight, colWidth, rowHeight)
|
|
123
130
|
}
|
|
124
131
|
}
|
|
@@ -129,6 +136,7 @@ function drawText({
|
|
|
129
136
|
model,
|
|
130
137
|
offsetX,
|
|
131
138
|
contrastScheme,
|
|
139
|
+
theme,
|
|
132
140
|
ctx,
|
|
133
141
|
visibleLeaves,
|
|
134
142
|
xStart,
|
|
@@ -137,6 +145,7 @@ function drawText({
|
|
|
137
145
|
offsetX: number
|
|
138
146
|
model: MsaViewModel
|
|
139
147
|
contrastScheme: Record<string, string>
|
|
148
|
+
theme: Theme
|
|
140
149
|
ctx: CanvasRenderingContext2D
|
|
141
150
|
visibleLeaves: HierarchyNode<NodeWithIdsAndLength>[]
|
|
142
151
|
xStart: number
|
|
@@ -10,8 +10,6 @@ export function renderMouseover({
|
|
|
10
10
|
const {
|
|
11
11
|
mouseCol,
|
|
12
12
|
colWidth,
|
|
13
|
-
treeAreaWidth,
|
|
14
|
-
resizeHandleWidth,
|
|
15
13
|
width,
|
|
16
14
|
height,
|
|
17
15
|
rowHeight,
|
|
@@ -20,31 +18,19 @@ export function renderMouseover({
|
|
|
20
18
|
mouseRow,
|
|
21
19
|
// @ts-expect-error
|
|
22
20
|
mouseCol2,
|
|
23
|
-
minimapHeight,
|
|
24
|
-
totalTrackAreaHeight,
|
|
25
21
|
} = model
|
|
26
22
|
ctx.resetTransform()
|
|
27
23
|
ctx.clearRect(0, 0, width, height)
|
|
28
|
-
|
|
29
24
|
if (mouseCol !== undefined) {
|
|
30
25
|
ctx.fillStyle = 'rgba(0,0,0,0.15)'
|
|
31
|
-
|
|
32
|
-
(mouseCol - 1) * colWidth + scrollX + treeAreaWidth + resizeHandleWidth
|
|
33
|
-
|
|
34
|
-
ctx.fillRect(x, minimapHeight, colWidth, height)
|
|
26
|
+
ctx.fillRect((mouseCol - 1) * colWidth + scrollX, 0, colWidth, height)
|
|
35
27
|
}
|
|
36
|
-
|
|
37
28
|
if (mouseRow !== undefined) {
|
|
38
29
|
ctx.fillStyle = 'rgba(0,0,0,0.15)'
|
|
39
|
-
|
|
40
|
-
mouseRow * rowHeight + scrollY + minimapHeight + totalTrackAreaHeight
|
|
41
|
-
ctx.fillRect(treeAreaWidth + resizeHandleWidth, y, width, rowHeight)
|
|
30
|
+
ctx.fillRect(0, mouseRow * rowHeight + scrollY, width, rowHeight)
|
|
42
31
|
}
|
|
43
32
|
if (mouseCol2 !== undefined) {
|
|
44
33
|
ctx.fillStyle = 'rgba(255,255,0,0.2)'
|
|
45
|
-
|
|
46
|
-
(mouseCol2 - 1) * colWidth + scrollX + treeAreaWidth + resizeHandleWidth
|
|
47
|
-
|
|
48
|
-
ctx.fillRect(x, 0, colWidth, height)
|
|
34
|
+
ctx.fillRect((mouseCol2 - 1) * colWidth + scrollX, 0, colWidth, height)
|
|
49
35
|
}
|
|
50
36
|
}
|
|
@@ -1,10 +1,7 @@
|
|
|
1
1
|
import React, { Suspense } from 'react'
|
|
2
|
-
|
|
3
2
|
import { observer } from 'mobx-react'
|
|
4
|
-
import { Typography } from '@mui/material'
|
|
5
3
|
|
|
6
4
|
// locals
|
|
7
|
-
import ImportForm from './ImportForm'
|
|
8
5
|
import TreeRuler from './TreePanel/TreeRuler'
|
|
9
6
|
import Header from './Header'
|
|
10
7
|
import Track from './Track'
|
|
@@ -14,43 +11,44 @@ import MSAPanel from './MSAPanel'
|
|
|
14
11
|
import TreePanel from './TreePanel'
|
|
15
12
|
import Minimap from './Minimap'
|
|
16
13
|
|
|
17
|
-
|
|
18
|
-
|
|
14
|
+
function TopArea({ model }: { model: MsaViewModel }) {
|
|
15
|
+
return (
|
|
16
|
+
<div style={{ display: 'flex' }}>
|
|
17
|
+
<TreeRuler model={model} />
|
|
18
|
+
<Minimap model={model} />
|
|
19
|
+
</div>
|
|
20
|
+
)
|
|
21
|
+
}
|
|
22
|
+
function MainArea({ model }: { model: MsaViewModel }) {
|
|
23
|
+
return (
|
|
24
|
+
<div style={{ display: 'flex' }}>
|
|
25
|
+
<TreePanel model={model} />
|
|
26
|
+
<VerticalResizeHandle model={model} />
|
|
27
|
+
<MSAPanel model={model} />
|
|
28
|
+
</div>
|
|
29
|
+
)
|
|
30
|
+
}
|
|
19
31
|
|
|
32
|
+
const View = observer(function ({ model }: { model: MsaViewModel }) {
|
|
33
|
+
const { turnedOnTracks } = model
|
|
20
34
|
return (
|
|
21
|
-
<div>
|
|
22
|
-
{
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
<MSAView2 model={model} />
|
|
28
|
-
)}
|
|
35
|
+
<div style={{ paddingLeft: 20, position: 'relative' }}>
|
|
36
|
+
<TopArea model={model} />
|
|
37
|
+
{turnedOnTracks?.map(track => (
|
|
38
|
+
<Track key={track.model.id} model={model} track={track} />
|
|
39
|
+
))}
|
|
40
|
+
<MainArea model={model} />
|
|
29
41
|
</div>
|
|
30
42
|
)
|
|
31
43
|
})
|
|
32
44
|
|
|
33
|
-
const
|
|
34
|
-
const { height,
|
|
45
|
+
const MSAView = observer(function ({ model }: { model: MsaViewModel }) {
|
|
46
|
+
const { height, DialogComponent, DialogProps } = model
|
|
35
47
|
return (
|
|
36
48
|
<div>
|
|
37
49
|
<div style={{ height, overflow: 'hidden' }}>
|
|
38
50
|
<Header model={model} />
|
|
39
|
-
<
|
|
40
|
-
<div style={{ display: 'flex' }}>
|
|
41
|
-
<TreeRuler model={model} />
|
|
42
|
-
<Minimap model={model} />
|
|
43
|
-
</div>
|
|
44
|
-
{turnedOnTracks?.map(track => (
|
|
45
|
-
<Track key={track.model.id} model={model} track={track} />
|
|
46
|
-
))}
|
|
47
|
-
|
|
48
|
-
<div style={{ display: 'flex' }}>
|
|
49
|
-
<TreePanel model={model} />
|
|
50
|
-
<VerticalResizeHandle model={model} />
|
|
51
|
-
<MSAPanel model={model} />
|
|
52
|
-
</div>
|
|
53
|
-
</div>
|
|
51
|
+
<View model={model} />
|
|
54
52
|
</div>
|
|
55
53
|
<HorizontalResizeHandle model={model} />
|
|
56
54
|
|