react-msaview 4.4.0 → 4.4.1
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 +15 -15
- package/bundle/index.js.LICENSE.txt +1 -9
- package/bundle/index.js.map +1 -1
- package/dist/colorSchemes.js +2 -2
- package/dist/colorSchemes.js.map +1 -1
- package/dist/components/VerticalScrollbar.js +2 -2
- package/dist/components/VerticalScrollbar.js.map +1 -1
- package/dist/components/header/{SettingsMenu.d.ts → ColorMenu.d.ts} +2 -2
- package/dist/components/header/ColorMenu.js +19 -0
- package/dist/components/header/ColorMenu.js.map +1 -0
- package/dist/components/header/Header.js +6 -2
- package/dist/components/header/Header.js.map +1 -1
- package/dist/components/header/HeaderInfoArea.js +3 -2
- package/dist/components/header/HeaderInfoArea.js.map +1 -1
- package/dist/components/header/HeaderMenu.js +15 -97
- package/dist/components/header/HeaderMenu.js.map +1 -1
- package/dist/components/header/MSAMenu.d.ts +6 -0
- package/dist/components/header/MSAMenu.js +44 -0
- package/dist/components/header/MSAMenu.js.map +1 -0
- package/dist/components/header/TreeMenu.d.ts +6 -0
- package/dist/components/header/TreeMenu.js +64 -0
- package/dist/components/header/TreeMenu.js.map +1 -0
- package/dist/components/msa/renderBoxFeatureCanvasBlock.js +4 -4
- package/dist/components/msa/renderBoxFeatureCanvasBlock.js.map +1 -1
- package/dist/components/msa/renderMSABlock.js +13 -9
- package/dist/components/msa/renderMSABlock.js.map +1 -1
- package/dist/model.d.ts +7 -1
- package/dist/model.js +54 -53
- package/dist/model.js.map +1 -1
- package/dist/rowCoordinateCalculations.d.ts +13 -2
- package/dist/rowCoordinateCalculations.js +60 -17
- package/dist/rowCoordinateCalculations.js.map +1 -1
- package/dist/rowCoordinateCalculations.test.js +96 -2
- package/dist/rowCoordinateCalculations.test.js.map +1 -1
- package/dist/seqCoordToRowSpecificGlobalCoord.d.ts +4 -0
- package/dist/seqCoordToRowSpecificGlobalCoord.js +15 -0
- package/dist/seqCoordToRowSpecificGlobalCoord.js.map +1 -0
- package/dist/seqCoordToRowSpecificGlobalCoord.test.d.ts +1 -0
- package/dist/seqCoordToRowSpecificGlobalCoord.test.js +42 -0
- package/dist/seqCoordToRowSpecificGlobalCoord.test.js.map +1 -0
- package/dist/util.d.ts +1 -6
- package/dist/util.js +5 -22
- package/dist/util.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
- package/src/colorSchemes.ts +2 -2
- package/src/components/VerticalScrollbar.tsx +2 -3
- package/src/components/header/ColorMenu.tsx +33 -0
- package/src/components/header/Header.tsx +6 -2
- package/src/components/header/HeaderInfoArea.tsx +5 -2
- package/src/components/header/HeaderMenu.tsx +15 -110
- package/src/components/header/MSAMenu.tsx +55 -0
- package/src/components/header/TreeMenu.tsx +82 -0
- package/src/components/msa/renderBoxFeatureCanvasBlock.ts +4 -4
- package/src/components/msa/renderMSABlock.ts +26 -22
- package/src/model.ts +73 -61
- package/src/rowCoordinateCalculations.test.ts +138 -2
- package/src/rowCoordinateCalculations.ts +95 -18
- package/src/seqCoordToRowSpecificGlobalCoord.test.ts +53 -0
- package/src/seqCoordToRowSpecificGlobalCoord.ts +20 -0
- package/src/util.ts +5 -28
- package/src/version.ts +1 -1
- package/dist/components/header/SettingsMenu.js +0 -141
- package/dist/components/header/SettingsMenu.js.map +0 -1
- package/src/components/header/SettingsMenu.tsx +0 -169
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rowCoordinateCalculations.test.js","sourceRoot":"","sources":["../src/rowCoordinateCalculations.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAErC,OAAO,
|
|
1
|
+
{"version":3,"file":"rowCoordinateCalculations.test.js","sourceRoot":"","sources":["../src/rowCoordinateCalculations.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { isBlank } from './util';
|
|
2
|
+
export function seqCoordToRowSpecificGlobalCoord({ row, position, }) {
|
|
3
|
+
let k = 0;
|
|
4
|
+
let i = 0;
|
|
5
|
+
for (; k < position; i++) {
|
|
6
|
+
if (!isBlank(row[i])) {
|
|
7
|
+
k++;
|
|
8
|
+
}
|
|
9
|
+
else if (k >= position) {
|
|
10
|
+
break;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
return i;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=seqCoordToRowSpecificGlobalCoord.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seqCoordToRowSpecificGlobalCoord.js","sourceRoot":"","sources":["../src/seqCoordToRowSpecificGlobalCoord.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAA;AAEhC,MAAM,UAAU,gCAAgC,CAAC,EAC/C,GAAG,EACH,QAAQ,GAIT;IACC,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,OAAO,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;QACzB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACrB,CAAC,EAAE,CAAA;QACL,CAAC;aAAM,IAAI,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,MAAK;QACP,CAAC;IACH,CAAC;IACD,OAAO,CAAC,CAAA;AACV,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { describe, expect, test } from 'vitest';
|
|
2
|
+
import { seqCoordToRowSpecificGlobalCoord } from './seqCoordToRowSpecificGlobalCoord';
|
|
3
|
+
describe('seqCoordToRowSpecificGlobalCoord', () => {
|
|
4
|
+
test('converts sequence coordinate to global coordinate with no gaps', () => {
|
|
5
|
+
const row = 'ATGCATGC';
|
|
6
|
+
expect(seqCoordToRowSpecificGlobalCoord({ row, position: 3 })).toBe(3);
|
|
7
|
+
expect(seqCoordToRowSpecificGlobalCoord({ row, position: 0 })).toBe(0);
|
|
8
|
+
expect(seqCoordToRowSpecificGlobalCoord({ row, position: 8 })).toBe(8);
|
|
9
|
+
});
|
|
10
|
+
test('converts sequence coordinate to global coordinate with gaps', () => {
|
|
11
|
+
const row = 'A-TG-CA-TGC';
|
|
12
|
+
// A(0) -(1) T(2) G(3) -(4) C(5) A(6) -(7) T(8) G(9) C(10)
|
|
13
|
+
// Sequence positions: A(0) T(1) G(2) C(3) A(4) T(5) G(6) C(7)
|
|
14
|
+
// Position 0 (first A) -> Global index 0
|
|
15
|
+
expect(seqCoordToRowSpecificGlobalCoord({ row, position: 0 })).toBe(0);
|
|
16
|
+
// Position 1 (T after first gap) -> Global index 2
|
|
17
|
+
expect(seqCoordToRowSpecificGlobalCoord({ row, position: 1 })).toBe(1);
|
|
18
|
+
// Position 3 (C after second gap) -> Global index 5
|
|
19
|
+
expect(seqCoordToRowSpecificGlobalCoord({ row, position: 3 })).toBe(4);
|
|
20
|
+
// Position 5 (T after third gap) -> Global index 8
|
|
21
|
+
expect(seqCoordToRowSpecificGlobalCoord({ row, position: 5 })).toBe(7);
|
|
22
|
+
// Position 8 (end of sequence) -> Global index 11
|
|
23
|
+
expect(seqCoordToRowSpecificGlobalCoord({ row, position: 8 })).toBe(11);
|
|
24
|
+
});
|
|
25
|
+
test('handles empty row', () => {
|
|
26
|
+
expect(seqCoordToRowSpecificGlobalCoord({ row: '', position: 0 })).toBe(0);
|
|
27
|
+
});
|
|
28
|
+
test('handles row with only gaps', () => {
|
|
29
|
+
const row = '---..--';
|
|
30
|
+
expect(seqCoordToRowSpecificGlobalCoord({ row, position: 0 })).toBe(0);
|
|
31
|
+
});
|
|
32
|
+
test('handles mixed gap characters', () => {
|
|
33
|
+
const row = 'A-.G-C.';
|
|
34
|
+
// A(0) -(1) .(2) G(3) -(4) C(5) .(6)
|
|
35
|
+
// Sequence positions: A(0) G(1) C(2)
|
|
36
|
+
expect(seqCoordToRowSpecificGlobalCoord({ row, position: 0 })).toBe(0);
|
|
37
|
+
expect(seqCoordToRowSpecificGlobalCoord({ row, position: 1 })).toBe(1);
|
|
38
|
+
expect(seqCoordToRowSpecificGlobalCoord({ row, position: 2 })).toBe(4);
|
|
39
|
+
expect(seqCoordToRowSpecificGlobalCoord({ row, position: 3 })).toBe(6);
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
//# sourceMappingURL=seqCoordToRowSpecificGlobalCoord.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seqCoordToRowSpecificGlobalCoord.test.js","sourceRoot":"","sources":["../src/seqCoordToRowSpecificGlobalCoord.test.ts"],"names":[],"mappings":"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"}
|
package/dist/util.d.ts
CHANGED
|
@@ -12,13 +12,8 @@ export declare function skipBlanks(blanks: number[], arg: string | string[]): st
|
|
|
12
12
|
export declare function setBrLength(d: HierarchyNode<NodeWithIds>, y0: number, k: number): void;
|
|
13
13
|
export declare function maxLength(d: HierarchyNode<NodeWithIds>): number;
|
|
14
14
|
export declare function collapse(d: HierarchyNode<NodeWithIds>): void;
|
|
15
|
-
export declare function clamp(min: number, num: number, max: number): number;
|
|
16
15
|
export declare function len(a: {
|
|
17
16
|
end: number;
|
|
18
17
|
start: number;
|
|
19
18
|
}): number;
|
|
20
|
-
export declare function
|
|
21
|
-
export declare function localStorageGetBoolean(key: string, defaultVal: boolean): boolean;
|
|
22
|
-
export declare function localStorageSetItem(str: string, item: string): void;
|
|
23
|
-
export declare function localStorageSetBoolean(key: string, value: boolean): void;
|
|
24
|
-
export declare function isGzip(buf: Uint8Array): boolean;
|
|
19
|
+
export declare function isBlank(s?: string): s is "-" | ".";
|
package/dist/util.js
CHANGED
|
@@ -23,7 +23,7 @@ export function colorContrast(colorScheme, theme) {
|
|
|
23
23
|
export function skipBlanks(blanks, arg) {
|
|
24
24
|
let s = '';
|
|
25
25
|
let b = 0;
|
|
26
|
-
for (let j = 0
|
|
26
|
+
for (let j = 0, l = arg.length; j < l; j++) {
|
|
27
27
|
if (j === blanks[b]) {
|
|
28
28
|
b++;
|
|
29
29
|
}
|
|
@@ -57,29 +57,12 @@ export function collapse(d) {
|
|
|
57
57
|
d.children = null;
|
|
58
58
|
}
|
|
59
59
|
}
|
|
60
|
-
export function clamp(min, num, max) {
|
|
61
|
-
return Math.min(Math.max(num, min), max);
|
|
62
|
-
}
|
|
63
60
|
export function len(a) {
|
|
64
61
|
return a.end - a.start;
|
|
65
62
|
}
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
}
|
|
71
|
-
export function localStorageGetBoolean(key, defaultVal) {
|
|
72
|
-
return Boolean(JSON.parse(localStorageGetItem(key) || JSON.stringify(defaultVal)));
|
|
73
|
-
}
|
|
74
|
-
export function localStorageSetItem(str, item) {
|
|
75
|
-
if (typeof localStorage !== 'undefined') {
|
|
76
|
-
localStorage.setItem(str, item);
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
export function localStorageSetBoolean(key, value) {
|
|
80
|
-
localStorageSetItem(key, JSON.stringify(value));
|
|
81
|
-
}
|
|
82
|
-
export function isGzip(buf) {
|
|
83
|
-
return buf[0] === 31 && buf[1] === 139 && buf[2] === 8;
|
|
63
|
+
// https://sonnhammer.sbc.su.se/Stockholm.html
|
|
64
|
+
// gaps can be a . or - in stockholm
|
|
65
|
+
export function isBlank(s) {
|
|
66
|
+
return s === '-' || s === '.';
|
|
84
67
|
}
|
|
85
68
|
//# sourceMappingURL=util.js.map
|
package/dist/util.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AACvC,OAAO,WAAW,MAAM,sBAAsB,CAAA;AAC9C,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAM9B,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;AAED,MAAM,UAAU,eAAe,CAC7B,IAAU,EACV,MAAM,GAAG,MAAM,EACf,KAAK,GAAG,CAAC;IAET,MAAM,EAAE,GAAG,GAAG,MAAM,IAAI,KAAK,EAAE,CAAA;IAE/B,OAAO;QACL,GAAG,IAAI;QACP,EAAE;QACF,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE;QACrB,QAAQ,EACN,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAC1B,eAAe,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,GAAG,CAAC,CAAC,CAC5C,IAAI,EAAE;KACV,CAAA;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,WAAmC,EACnC,KAAY;IAEZ,OAAO,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC;QACjD,MAAM;QACN,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;KACrD,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAgB,EAAE,GAAsB;IACjE,IAAI,CAAC,GAAG,EAAE,CAAA;IACV,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,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 = "4.4.
|
|
1
|
+
export declare const version = "4.4.1";
|
package/dist/version.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export const version = '4.4.
|
|
1
|
+
export const version = '4.4.1';
|
|
2
2
|
//# sourceMappingURL=version.js.map
|
package/package.json
CHANGED
package/src/colorSchemes.ts
CHANGED
|
@@ -2,7 +2,7 @@ import { blue, green, orange, red } from '@mui/material/colors'
|
|
|
2
2
|
import { colord, extend } from 'colord'
|
|
3
3
|
import namesPlugin from 'colord/plugins/names'
|
|
4
4
|
|
|
5
|
-
import { transform } from './util'
|
|
5
|
+
import { isBlank, transform } from './util'
|
|
6
6
|
|
|
7
7
|
extend([namesPlugin])
|
|
8
8
|
|
|
@@ -518,7 +518,7 @@ export function getPercentIdentityColor(
|
|
|
518
518
|
let ent = 0
|
|
519
519
|
let letter = ''
|
|
520
520
|
for (const entry of entries) {
|
|
521
|
-
if (entry[1] > ent && entry[0]
|
|
521
|
+
if (entry[1] > ent && !isBlank(entry[0])) {
|
|
522
522
|
letter = entry[0]
|
|
523
523
|
ent = entry[1]
|
|
524
524
|
}
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import React, { useEffect, useRef, useState } from 'react'
|
|
2
2
|
|
|
3
|
+
import { clamp } from '@jbrowse/core/util'
|
|
3
4
|
import { observer } from 'mobx-react'
|
|
4
5
|
|
|
5
|
-
import { clamp } from '../util'
|
|
6
|
-
|
|
7
6
|
import type { MsaViewModel } from '../model'
|
|
8
7
|
|
|
9
8
|
const VerticalScrollbar = observer(({ model }: { model: MsaViewModel }) => {
|
|
@@ -28,8 +27,8 @@ const VerticalScrollbar = observer(({ model }: { model: MsaViewModel }) => {
|
|
|
28
27
|
window.requestAnimationFrame(() => {
|
|
29
28
|
model.setScrollY(
|
|
30
29
|
clamp(
|
|
31
|
-
-totalHeight,
|
|
32
30
|
mouseDown.scrollY - (event.clientY - mouseDown.clientY) / unit,
|
|
31
|
+
-totalHeight,
|
|
33
32
|
0,
|
|
34
33
|
),
|
|
35
34
|
)
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
|
|
3
|
+
import CascadingMenuButton from '@jbrowse/core/ui/CascadingMenuButton'
|
|
4
|
+
import Palette from '@mui/icons-material/Palette'
|
|
5
|
+
import { observer } from 'mobx-react'
|
|
6
|
+
|
|
7
|
+
import colorSchemes from '../../colorSchemes'
|
|
8
|
+
|
|
9
|
+
import type { MsaViewModel } from '../../model'
|
|
10
|
+
|
|
11
|
+
const ColorMenu = observer(({ model }: { model: MsaViewModel }) => {
|
|
12
|
+
const { colorSchemeName } = model
|
|
13
|
+
return (
|
|
14
|
+
<CascadingMenuButton
|
|
15
|
+
closeAfterItemClick={false}
|
|
16
|
+
menuItems={Object.keys(colorSchemes).map(
|
|
17
|
+
option =>
|
|
18
|
+
({
|
|
19
|
+
label: option,
|
|
20
|
+
type: 'radio',
|
|
21
|
+
checked: colorSchemeName === option,
|
|
22
|
+
onClick: () => {
|
|
23
|
+
model.setColorSchemeName(option)
|
|
24
|
+
},
|
|
25
|
+
}) as const,
|
|
26
|
+
)}
|
|
27
|
+
>
|
|
28
|
+
<Palette />
|
|
29
|
+
</CascadingMenuButton>
|
|
30
|
+
)
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
export default ColorMenu
|
|
@@ -5,11 +5,13 @@ import Help from '@mui/icons-material/Help'
|
|
|
5
5
|
import { IconButton } from '@mui/material'
|
|
6
6
|
import { observer } from 'mobx-react'
|
|
7
7
|
|
|
8
|
+
import ColorMenu from './ColorMenu'
|
|
8
9
|
import HeaderInfoArea from './HeaderInfoArea'
|
|
9
10
|
import HeaderMenu from './HeaderMenu'
|
|
10
11
|
import HeaderStatusArea from './HeaderStatusArea'
|
|
12
|
+
import MSAMenu from './MSAMenu'
|
|
11
13
|
import MultiAlignmentSelector from './MultiAlignmentSelector'
|
|
12
|
-
import
|
|
14
|
+
import TreeMenu from './TreeMenu'
|
|
13
15
|
import ZoomControls from './ZoomControls'
|
|
14
16
|
import ZoomMenu from './ZoomMenu'
|
|
15
17
|
import ZoomStar from './ZoomStar'
|
|
@@ -26,7 +28,9 @@ const Header = observer(function ({ model }: { model: MsaViewModel }) {
|
|
|
26
28
|
return (
|
|
27
29
|
<div ref={ref} style={{ display: 'flex' }}>
|
|
28
30
|
<HeaderMenu model={model} />
|
|
29
|
-
<
|
|
31
|
+
<ColorMenu model={model} />
|
|
32
|
+
<TreeMenu model={model} />
|
|
33
|
+
<MSAMenu model={model} />
|
|
30
34
|
<ZoomControls model={model} />
|
|
31
35
|
{model.showZoomStar ? <ZoomStar model={model} /> : null}
|
|
32
36
|
<ZoomMenu model={model} />
|
|
@@ -19,8 +19,11 @@ const HeaderInfoArea = observer(function ({ model }: { model: MsaViewModel }) {
|
|
|
19
19
|
return mouseOverRowName && mouseCol !== undefined ? (
|
|
20
20
|
<Typography className={classes.margin}>
|
|
21
21
|
{mouseOverRowName}:
|
|
22
|
-
{model.
|
|
23
|
-
|
|
22
|
+
{model.mouseOverCoordToGapRemovedRowCoordOneBased(
|
|
23
|
+
mouseOverRowName,
|
|
24
|
+
mouseCol,
|
|
25
|
+
)}{' '}
|
|
26
|
+
({model.mouseOverCoordToRowLetter(mouseOverRowName, mouseCol)})
|
|
24
27
|
</Typography>
|
|
25
28
|
) : null
|
|
26
29
|
})
|
|
@@ -1,16 +1,13 @@
|
|
|
1
1
|
import React, { lazy } from 'react'
|
|
2
2
|
|
|
3
3
|
import CascadingMenuButton from '@jbrowse/core/ui/CascadingMenuButton'
|
|
4
|
-
import AccountTreeIcon from '@mui/icons-material/AccountTree'
|
|
5
4
|
import Assignment from '@mui/icons-material/Assignment'
|
|
6
5
|
import FilterAlt from '@mui/icons-material/FilterAlt'
|
|
7
6
|
import FolderOpen from '@mui/icons-material/FolderOpen'
|
|
8
|
-
import GridOn from '@mui/icons-material/GridOn'
|
|
9
7
|
import List from '@mui/icons-material/List'
|
|
10
8
|
import MoreVert from '@mui/icons-material/Menu'
|
|
11
9
|
import PhotoCamera from '@mui/icons-material/PhotoCamera'
|
|
12
10
|
import Search from '@mui/icons-material/Search'
|
|
13
|
-
import Settings from '@mui/icons-material/Settings'
|
|
14
11
|
import Sort from '@mui/icons-material/Sort'
|
|
15
12
|
import Visibility from '@mui/icons-material/Visibility'
|
|
16
13
|
import { observer } from 'mobx-react'
|
|
@@ -18,30 +15,18 @@ import { observer } from 'mobx-react'
|
|
|
18
15
|
import type { MsaViewModel } from '../../model'
|
|
19
16
|
|
|
20
17
|
// lazies
|
|
21
|
-
const SettingsDialog = lazy(() => import('../dialogs/SettingsDialog'))
|
|
22
18
|
const MetadataDialog = lazy(() => import('../dialogs/MetadataDialog'))
|
|
23
19
|
const TracklistDialog = lazy(() => import('../dialogs/TracklistDialog'))
|
|
24
20
|
const ExportSVGDialog = lazy(() => import('../dialogs/ExportSVGDialog'))
|
|
25
21
|
const FeatureFilterDialog = lazy(() => import('../dialogs/FeatureDialog'))
|
|
22
|
+
const SettingsDialog = lazy(() => import('../dialogs/SettingsDialog'))
|
|
26
23
|
const UserProvidedDomainsDialog = lazy(
|
|
27
24
|
() => import('../dialogs/UserProvidedDomainsDialog'),
|
|
28
25
|
)
|
|
29
26
|
const InterProScanDialog = lazy(() => import('../dialogs/InterProScanDialog'))
|
|
30
27
|
|
|
31
28
|
const HeaderMenu = observer(({ model }: { model: MsaViewModel }) => {
|
|
32
|
-
const {
|
|
33
|
-
drawTree,
|
|
34
|
-
showBranchLen,
|
|
35
|
-
labelsAlignRight,
|
|
36
|
-
drawNodeBubbles,
|
|
37
|
-
showDomains,
|
|
38
|
-
actuallyShowDomains,
|
|
39
|
-
subFeatureRows,
|
|
40
|
-
drawLabels,
|
|
41
|
-
treeWidthMatchesArea,
|
|
42
|
-
noDomains,
|
|
43
|
-
noTree,
|
|
44
|
-
} = model
|
|
29
|
+
const { showDomains, actuallyShowDomains, subFeatureRows, noDomains } = model
|
|
45
30
|
return (
|
|
46
31
|
<CascadingMenuButton
|
|
47
32
|
menuItems={[
|
|
@@ -52,98 +37,6 @@ const HeaderMenu = observer(({ model }: { model: MsaViewModel }) => {
|
|
|
52
37
|
model.reset()
|
|
53
38
|
},
|
|
54
39
|
},
|
|
55
|
-
{
|
|
56
|
-
icon: Settings,
|
|
57
|
-
label: 'Settings',
|
|
58
|
-
type: 'subMenu',
|
|
59
|
-
subMenu: [
|
|
60
|
-
{
|
|
61
|
-
label: 'Tree settings',
|
|
62
|
-
type: 'subMenu',
|
|
63
|
-
icon: AccountTreeIcon,
|
|
64
|
-
subMenu: [
|
|
65
|
-
{
|
|
66
|
-
label: 'Show branch length',
|
|
67
|
-
type: 'checkbox',
|
|
68
|
-
checked: showBranchLen,
|
|
69
|
-
onClick: () => {
|
|
70
|
-
model.setShowBranchLen(!showBranchLen)
|
|
71
|
-
},
|
|
72
|
-
},
|
|
73
|
-
{
|
|
74
|
-
label: 'Show tree',
|
|
75
|
-
type: 'checkbox',
|
|
76
|
-
checked: drawTree,
|
|
77
|
-
onClick: () => {
|
|
78
|
-
model.setDrawTree(!drawTree)
|
|
79
|
-
},
|
|
80
|
-
},
|
|
81
|
-
{
|
|
82
|
-
label: 'Draw clickable bubbles on tree branches',
|
|
83
|
-
type: 'checkbox',
|
|
84
|
-
checked: drawNodeBubbles,
|
|
85
|
-
onClick: () => {
|
|
86
|
-
model.setDrawNodeBubbles(!drawNodeBubbles)
|
|
87
|
-
},
|
|
88
|
-
},
|
|
89
|
-
{
|
|
90
|
-
label: 'Tree labels align right',
|
|
91
|
-
type: 'checkbox',
|
|
92
|
-
checked: labelsAlignRight,
|
|
93
|
-
onClick: () => {
|
|
94
|
-
model.setLabelsAlignRight(!labelsAlignRight)
|
|
95
|
-
},
|
|
96
|
-
},
|
|
97
|
-
{
|
|
98
|
-
label: 'Draw labels',
|
|
99
|
-
type: 'checkbox',
|
|
100
|
-
checked: drawLabels,
|
|
101
|
-
onClick: () => {
|
|
102
|
-
model.setDrawLabels(!drawLabels)
|
|
103
|
-
},
|
|
104
|
-
},
|
|
105
|
-
...(noTree
|
|
106
|
-
? []
|
|
107
|
-
: [
|
|
108
|
-
{
|
|
109
|
-
label: 'Make tree width fit to tree area',
|
|
110
|
-
type: 'checkbox' as const,
|
|
111
|
-
checked: treeWidthMatchesArea,
|
|
112
|
-
onClick: () => {
|
|
113
|
-
model.setTreeWidthMatchesArea(!treeWidthMatchesArea)
|
|
114
|
-
},
|
|
115
|
-
},
|
|
116
|
-
]),
|
|
117
|
-
],
|
|
118
|
-
},
|
|
119
|
-
{
|
|
120
|
-
label: 'MSA settings',
|
|
121
|
-
type: 'subMenu',
|
|
122
|
-
icon: GridOn,
|
|
123
|
-
subMenu: [],
|
|
124
|
-
},
|
|
125
|
-
{
|
|
126
|
-
label: 'More',
|
|
127
|
-
icon: Settings,
|
|
128
|
-
type: 'subMenu',
|
|
129
|
-
subMenu: [
|
|
130
|
-
{
|
|
131
|
-
label: 'More settings',
|
|
132
|
-
onClick: () => {
|
|
133
|
-
model.queueDialog(onClose => [
|
|
134
|
-
SettingsDialog,
|
|
135
|
-
{
|
|
136
|
-
model,
|
|
137
|
-
onClose,
|
|
138
|
-
},
|
|
139
|
-
])
|
|
140
|
-
},
|
|
141
|
-
},
|
|
142
|
-
],
|
|
143
|
-
},
|
|
144
|
-
],
|
|
145
|
-
},
|
|
146
|
-
|
|
147
40
|
{
|
|
148
41
|
label: 'Metadata',
|
|
149
42
|
icon: Assignment,
|
|
@@ -158,7 +51,19 @@ const HeaderMenu = observer(({ model }: { model: MsaViewModel }) => {
|
|
|
158
51
|
},
|
|
159
52
|
},
|
|
160
53
|
{
|
|
161
|
-
label: '
|
|
54
|
+
label: 'More settings',
|
|
55
|
+
onClick: () => {
|
|
56
|
+
model.queueDialog(onClose => [
|
|
57
|
+
SettingsDialog,
|
|
58
|
+
{
|
|
59
|
+
model,
|
|
60
|
+
onClose,
|
|
61
|
+
},
|
|
62
|
+
])
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
label: 'Extra tracks',
|
|
162
67
|
icon: List,
|
|
163
68
|
onClick: () => {
|
|
164
69
|
model.queueDialog(onClose => [
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
|
|
3
|
+
import CascadingMenuButton from '@jbrowse/core/ui/CascadingMenuButton'
|
|
4
|
+
import { observer } from 'mobx-react'
|
|
5
|
+
|
|
6
|
+
import { GridOn } from '@mui/icons-material'
|
|
7
|
+
|
|
8
|
+
import type { MsaViewModel } from '../../model'
|
|
9
|
+
|
|
10
|
+
const MSAMenu = observer(function ({ model }: { model: MsaViewModel }) {
|
|
11
|
+
const { drawMsaLetters, contrastLettering, hideGaps, bgColor } = model
|
|
12
|
+
return (
|
|
13
|
+
<CascadingMenuButton
|
|
14
|
+
closeAfterItemClick={false}
|
|
15
|
+
menuItems={[
|
|
16
|
+
{
|
|
17
|
+
label: 'Draw letters',
|
|
18
|
+
type: 'checkbox',
|
|
19
|
+
checked: drawMsaLetters,
|
|
20
|
+
onClick: () => {
|
|
21
|
+
model.setDrawMsaLetters(!drawMsaLetters)
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
label: 'Color letters instead of background of tiles',
|
|
26
|
+
type: 'checkbox',
|
|
27
|
+
checked: !bgColor,
|
|
28
|
+
onClick: () => {
|
|
29
|
+
model.setBgColor(!bgColor)
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
label: 'Use contrast lettering',
|
|
34
|
+
type: 'checkbox',
|
|
35
|
+
checked: contrastLettering,
|
|
36
|
+
onClick: () => {
|
|
37
|
+
model.setContrastLettering(!contrastLettering)
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
label: 'Enable hiding gappy columns?',
|
|
42
|
+
type: 'checkbox',
|
|
43
|
+
checked: hideGaps,
|
|
44
|
+
onClick: () => {
|
|
45
|
+
model.setHideGaps(!hideGaps)
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
]}
|
|
49
|
+
>
|
|
50
|
+
<GridOn />
|
|
51
|
+
</CascadingMenuButton>
|
|
52
|
+
)
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
export default MSAMenu
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
|
|
3
|
+
import CascadingMenuButton from '@jbrowse/core/ui/CascadingMenuButton'
|
|
4
|
+
import AccountTree from '@mui/icons-material/AccountTree'
|
|
5
|
+
import { observer } from 'mobx-react'
|
|
6
|
+
|
|
7
|
+
import type { MsaViewModel } from '../../model'
|
|
8
|
+
|
|
9
|
+
const TreeMenu = observer(({ model }: { model: MsaViewModel }) => {
|
|
10
|
+
const {
|
|
11
|
+
drawTree,
|
|
12
|
+
showBranchLen,
|
|
13
|
+
labelsAlignRight,
|
|
14
|
+
drawNodeBubbles,
|
|
15
|
+
drawLabels,
|
|
16
|
+
treeWidthMatchesArea,
|
|
17
|
+
noTree,
|
|
18
|
+
} = model
|
|
19
|
+
return (
|
|
20
|
+
<CascadingMenuButton
|
|
21
|
+
closeAfterItemClick={false}
|
|
22
|
+
menuItems={[
|
|
23
|
+
{
|
|
24
|
+
label: 'Show branch length',
|
|
25
|
+
type: 'checkbox',
|
|
26
|
+
checked: showBranchLen,
|
|
27
|
+
onClick: () => {
|
|
28
|
+
model.setShowBranchLen(!showBranchLen)
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
label: 'Show tree',
|
|
33
|
+
type: 'checkbox',
|
|
34
|
+
checked: drawTree,
|
|
35
|
+
onClick: () => {
|
|
36
|
+
model.setDrawTree(!drawTree)
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
label: 'Draw clickable bubbles on tree branches',
|
|
41
|
+
type: 'checkbox',
|
|
42
|
+
checked: drawNodeBubbles,
|
|
43
|
+
onClick: () => {
|
|
44
|
+
model.setDrawNodeBubbles(!drawNodeBubbles)
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
label: 'Tree labels align right',
|
|
49
|
+
type: 'checkbox',
|
|
50
|
+
checked: labelsAlignRight,
|
|
51
|
+
onClick: () => {
|
|
52
|
+
model.setLabelsAlignRight(!labelsAlignRight)
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
label: 'Draw labels',
|
|
57
|
+
type: 'checkbox',
|
|
58
|
+
checked: drawLabels,
|
|
59
|
+
onClick: () => {
|
|
60
|
+
model.setDrawLabels(!drawLabels)
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
...(noTree
|
|
64
|
+
? []
|
|
65
|
+
: [
|
|
66
|
+
{
|
|
67
|
+
label: 'Make tree width fit to tree area',
|
|
68
|
+
type: 'checkbox' as const,
|
|
69
|
+
checked: treeWidthMatchesArea,
|
|
70
|
+
onClick: () => {
|
|
71
|
+
model.setTreeWidthMatchesArea(!treeWidthMatchesArea)
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
]),
|
|
75
|
+
]}
|
|
76
|
+
>
|
|
77
|
+
<AccountTree />
|
|
78
|
+
</CascadingMenuButton>
|
|
79
|
+
)
|
|
80
|
+
})
|
|
81
|
+
|
|
82
|
+
export default TreeMenu
|
|
@@ -56,7 +56,8 @@ function drawTiles({
|
|
|
56
56
|
tidyFilteredGatheredInterProAnnotations,
|
|
57
57
|
} = model
|
|
58
58
|
|
|
59
|
-
for (
|
|
59
|
+
for (let i = 0, l1 = visibleLeaves.length; i < l1; i++) {
|
|
60
|
+
const node = visibleLeaves[i]!
|
|
60
61
|
const {
|
|
61
62
|
x,
|
|
62
63
|
data: { name },
|
|
@@ -65,9 +66,9 @@ function drawTiles({
|
|
|
65
66
|
|
|
66
67
|
const entry = tidyFilteredGatheredInterProAnnotations[name]
|
|
67
68
|
|
|
68
|
-
let j = 0
|
|
69
69
|
if (entry) {
|
|
70
|
-
for (
|
|
70
|
+
for (let j = 0, l2 = entry.length; j < l2; j++) {
|
|
71
|
+
const { start, end, accession } = entry[j]!
|
|
71
72
|
const m1 = model.seqCoordToRowSpecificGlobalCoord(name, start - 1)
|
|
72
73
|
const m2 = model.seqCoordToRowSpecificGlobalCoord(name, end)
|
|
73
74
|
const x = m1 * colWidth
|
|
@@ -78,7 +79,6 @@ function drawTiles({
|
|
|
78
79
|
const lw = colWidth * (m2 - m1)
|
|
79
80
|
ctx.fillRect(x, t, lw, h)
|
|
80
81
|
ctx.strokeRect(x, t, lw, h)
|
|
81
|
-
j++
|
|
82
82
|
}
|
|
83
83
|
}
|
|
84
84
|
}
|