react-msaview 5.5.0 → 5.6.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.
Files changed (139) hide show
  1. package/bundle/index.js +173 -162
  2. package/bundle/index.js.map +4 -4
  3. package/dist/components/ConservationTrack.js +20 -26
  4. package/dist/components/ConservationTrack.js.map +1 -1
  5. package/dist/components/MSAViewer.d.ts +7 -1
  6. package/dist/components/MSAViewer.js +4 -1
  7. package/dist/components/MSAViewer.js.map +1 -1
  8. package/dist/components/SequenceTextArea.js +1 -1
  9. package/dist/components/SequenceTextArea.js.map +1 -1
  10. package/dist/components/TextTrack.js +20 -27
  11. package/dist/components/TextTrack.js.map +1 -1
  12. package/dist/components/Track.js +1 -1
  13. package/dist/components/Track.js.map +1 -1
  14. package/dist/components/dialogs/TrackInfoDialog.js +1 -1
  15. package/dist/components/dialogs/TrackInfoDialog.js.map +1 -1
  16. package/dist/components/header/ColorSchemeMenu.js +1 -1
  17. package/dist/components/header/ColorSchemeMenu.js.map +1 -1
  18. package/dist/components/header/FileMenu.js +1 -16
  19. package/dist/components/header/FileMenu.js.map +1 -1
  20. package/dist/components/header/Header.js +6 -5
  21. package/dist/components/header/Header.js.map +1 -1
  22. package/dist/components/header/HeaderInfoArea.js +1 -1
  23. package/dist/components/header/HeaderInfoArea.js.map +1 -1
  24. package/dist/components/header/HeaderStatusArea.js +1 -1
  25. package/dist/components/header/HeaderStatusArea.js.map +1 -1
  26. package/dist/components/header/MSASettingsMenu.js +1 -1
  27. package/dist/components/header/MSASettingsMenu.js.map +1 -1
  28. package/dist/components/header/TreeSettingsMenu.js +1 -1
  29. package/dist/components/header/TreeSettingsMenu.js.map +1 -1
  30. package/dist/components/header/ZoomControls.js +14 -12
  31. package/dist/components/header/ZoomControls.js.map +1 -1
  32. package/dist/components/header/ZoomMenu.js +1 -10
  33. package/dist/components/header/ZoomMenu.js.map +1 -1
  34. package/dist/components/header/settingsMenuItems.js +9 -1
  35. package/dist/components/header/settingsMenuItems.js.map +1 -1
  36. package/dist/components/{header/HeaderMenu.d.ts → msa/ColumnStats.d.ts} +3 -3
  37. package/dist/components/msa/ColumnStats.js +42 -0
  38. package/dist/components/msa/ColumnStats.js.map +1 -0
  39. package/dist/components/msa/DomainLegend.js +1 -1
  40. package/dist/components/msa/DomainLegend.js.map +1 -1
  41. package/dist/components/msa/MSACanvasBlock.js +39 -39
  42. package/dist/components/msa/MSACanvasBlock.js.map +1 -1
  43. package/dist/components/msa/MSAMouseoverCanvas.js +6 -12
  44. package/dist/components/msa/MSAMouseoverCanvas.js.map +1 -1
  45. package/dist/components/msa/renderBoxFeatureCanvasBlock.js +3 -1
  46. package/dist/components/msa/renderBoxFeatureCanvasBlock.js.map +1 -1
  47. package/dist/components/msa/renderMSAMouseover.js +1 -2
  48. package/dist/components/msa/renderMSAMouseover.js.map +1 -1
  49. package/dist/components/overlayColors.d.ts +3 -0
  50. package/dist/components/overlayColors.js +11 -0
  51. package/dist/components/overlayColors.js.map +1 -0
  52. package/dist/components/tracks/renderTracksSvg.d.ts +6 -3
  53. package/dist/components/tracks/renderTracksSvg.js +17 -8
  54. package/dist/components/tracks/renderTracksSvg.js.map +1 -1
  55. package/dist/components/tree/TreeCanvas.js +31 -38
  56. package/dist/components/tree/TreeCanvas.js.map +1 -1
  57. package/dist/components/tree/TreeCanvasBlock.js +12 -47
  58. package/dist/components/tree/TreeCanvasBlock.js.map +1 -1
  59. package/dist/components/tree/clickMap.d.ts +24 -0
  60. package/dist/components/tree/clickMap.js +33 -0
  61. package/dist/components/tree/clickMap.js.map +1 -0
  62. package/dist/components/tree/renderTreeCanvas.d.ts +1 -21
  63. package/dist/components/tree/renderTreeCanvas.js +8 -7
  64. package/dist/components/tree/renderTreeCanvas.js.map +1 -1
  65. package/dist/constants.d.ts +1 -0
  66. package/dist/constants.js +1 -0
  67. package/dist/constants.js.map +1 -1
  68. package/dist/fetchUtils.d.ts +2 -1
  69. package/dist/fetchUtils.js +3 -2
  70. package/dist/fetchUtils.js.map +1 -1
  71. package/dist/index.d.ts +1 -1
  72. package/dist/model/msaModel.d.ts +25 -2
  73. package/dist/model/msaModel.js +15 -3
  74. package/dist/model/msaModel.js.map +1 -1
  75. package/dist/model/treeModel.d.ts +46 -5
  76. package/dist/model/treeModel.js +20 -7
  77. package/dist/model/treeModel.js.map +1 -1
  78. package/dist/model.d.ts +545 -132
  79. package/dist/model.js +101 -75
  80. package/dist/model.js.map +1 -1
  81. package/dist/propertyConservation.d.ts +7 -0
  82. package/dist/propertyConservation.js +66 -0
  83. package/dist/propertyConservation.js.map +1 -0
  84. package/dist/types.d.ts +4 -1
  85. package/dist/useCanvasAutorun.d.ts +2 -0
  86. package/dist/useCanvasAutorun.js +23 -0
  87. package/dist/useCanvasAutorun.js.map +1 -0
  88. package/dist/version.d.ts +1 -1
  89. package/dist/version.js +1 -1
  90. package/package.json +4 -6
  91. package/src/colorSchemes.docs.test.ts +57 -0
  92. package/src/columnStats.test.ts +94 -0
  93. package/src/components/ConservationTrack.tsx +17 -15
  94. package/src/components/MSAViewer.tsx +12 -0
  95. package/src/components/SequenceTextArea.tsx +1 -1
  96. package/src/components/TextTrack.tsx +7 -11
  97. package/src/components/Track.tsx +1 -1
  98. package/src/components/dialogs/TrackInfoDialog.tsx +1 -1
  99. package/src/components/header/ColorSchemeMenu.tsx +1 -0
  100. package/src/components/header/FileMenu.tsx +1 -15
  101. package/src/components/header/Header.tsx +11 -8
  102. package/src/components/header/HeaderInfoArea.tsx +1 -1
  103. package/src/components/header/HeaderStatusArea.tsx +1 -1
  104. package/src/components/header/MSASettingsMenu.tsx +1 -0
  105. package/src/components/header/TreeSettingsMenu.tsx +1 -0
  106. package/src/components/header/ZoomControls.tsx +24 -17
  107. package/src/components/header/ZoomMenu.tsx +1 -10
  108. package/src/components/header/settingsMenuItems.ts +9 -1
  109. package/src/components/msa/ColumnStats.tsx +54 -0
  110. package/src/components/msa/DomainLegend.tsx +5 -1
  111. package/src/components/msa/MSACanvasBlock.tsx +29 -26
  112. package/src/components/msa/MSAMouseoverCanvas.tsx +10 -13
  113. package/src/components/msa/renderBoxFeatureCanvasBlock.ts +3 -1
  114. package/src/components/msa/renderMSAMouseover.ts +2 -2
  115. package/src/components/overlayColors.ts +12 -0
  116. package/src/components/tracks/renderTracksSvg.ts +22 -8
  117. package/src/components/tree/TreeCanvas.tsx +47 -54
  118. package/src/components/tree/TreeCanvasBlock.tsx +10 -68
  119. package/src/components/tree/clickMap.ts +55 -0
  120. package/src/components/tree/renderTreeCanvas.ts +10 -34
  121. package/src/constants.ts +1 -0
  122. package/src/fetchUtils.ts +6 -3
  123. package/src/index.ts +1 -1
  124. package/src/model/msaModel.ts +24 -3
  125. package/src/model/treeModel.ts +27 -7
  126. package/src/model.ts +122 -117
  127. package/src/propertyConservation.test.ts +47 -0
  128. package/src/propertyConservation.ts +73 -0
  129. package/src/stripDefaultSnapshot.test.ts +57 -0
  130. package/src/types.ts +7 -1
  131. package/src/useCanvasAutorun.ts +28 -0
  132. package/src/version.ts +1 -1
  133. package/dist/components/dialogs/SettingsDialog.d.ts +0 -7
  134. package/dist/components/dialogs/SettingsDialog.js +0 -100
  135. package/dist/components/dialogs/SettingsDialog.js.map +0 -1
  136. package/dist/components/header/HeaderMenu.js +0 -27
  137. package/dist/components/header/HeaderMenu.js.map +0 -1
  138. package/src/components/dialogs/SettingsDialog.tsx +0 -234
  139. package/src/components/header/HeaderMenu.tsx +0 -38
@@ -0,0 +1,57 @@
1
+ import { getSnapshot } from '@jbrowse/mobx-state-tree'
2
+ import { expect, test } from 'vitest'
3
+
4
+ import stateModelFactory from './model.ts'
5
+
6
+ const MsaView = stateModelFactory()
7
+
8
+ test('default view produces a minimal snapshot (defaults stripped)', () => {
9
+ const model = MsaView.create({ type: 'MsaView' })
10
+ const snap = getSnapshot(model)
11
+ // only the always-present keys remain; every defaulted scalar/collection is gone
12
+ expect(snap.colWidth).toBeUndefined()
13
+ expect(snap.rowHeight).toBeUndefined()
14
+ expect(snap.showDomains).toBeUndefined()
15
+ expect(snap.colorSchemeName).toBeUndefined()
16
+ expect(snap.drawTree).toBeUndefined()
17
+ expect(snap.treeAreaWidth).toBeUndefined()
18
+ expect(snap.collapsed).toBeUndefined()
19
+ expect(snap.turnedOffTracks).toBeUndefined()
20
+ expect(snap.type).toBe('MsaView')
21
+ })
22
+
23
+ test('non-default values are retained in the snapshot', () => {
24
+ const model = MsaView.create({ type: 'MsaView' })
25
+ model.setColWidth(30)
26
+ model.setColorSchemeName('clustalx')
27
+ model.setDrawTree(false)
28
+ model.toggleCollapsed('nodeA')
29
+ const snap = getSnapshot(model)
30
+ expect(snap.colWidth).toBe(30)
31
+ expect(snap.colorSchemeName).toBe('clustalx')
32
+ expect(snap.drawTree).toBe(false)
33
+ expect(snap.collapsed).toEqual(['nodeA'])
34
+ })
35
+
36
+ test('setting a value back to its default strips it again', () => {
37
+ const model = MsaView.create({ type: 'MsaView' })
38
+ model.setColWidth(30)
39
+ expect(getSnapshot(model).colWidth).toBe(30)
40
+ model.setColWidth(12) // defaultColWidth
41
+ expect(getSnapshot(model).colWidth).toBeUndefined()
42
+ })
43
+
44
+ test('inline data is stripped when a filehandle can refetch it', () => {
45
+ const model = MsaView.create({
46
+ type: 'MsaView',
47
+ data: { msa: '>s1\nACGT', tree: '(a,b);' },
48
+ msaFilehandle: {
49
+ uri: 'http://example.com/x.fa',
50
+ locationType: 'UriLocation',
51
+ },
52
+ })
53
+ const snap = getSnapshot(model)
54
+ // msa dropped (msaFilehandle present), tree kept (no treeFilehandle)
55
+ expect(snap.data.msa).toBeUndefined()
56
+ expect(snap.data.tree).toBe('(a,b);')
57
+ })
package/src/types.ts CHANGED
@@ -15,9 +15,15 @@ export interface TextTrackModel extends BasicTrackModel {
15
15
  data?: string
16
16
  }
17
17
 
18
+ // a track that draws a per-column bar chart (conservation, property
19
+ // conservation). `barColor` doubles as the marker that a track is a bar track.
20
+ export interface BarTrackModel extends BasicTrackModel {
21
+ barColor?: string
22
+ }
23
+
18
24
  export interface BasicTrack {
19
25
  ReactComponent: React.FC<any>
20
- model: TextTrackModel
26
+ model: TextTrackModel & BarTrackModel
21
27
  }
22
28
 
23
29
  export interface Node {
@@ -0,0 +1,28 @@
1
+ import { useEffect, useRef } from 'react'
2
+ import type React from 'react'
3
+
4
+ import { autorun } from 'mobx'
5
+
6
+ // Wires a canvas ref to a mobx autorun: grabs the 2d context once the canvas
7
+ // mounts and re-runs `draw` whenever any observable it reads changes. Collapses
8
+ // the getContext/null-guard/autorun-dispose boilerplate repeated by every
9
+ // canvas block host. `deps` controls when the effect (and thus the context
10
+ // lookup) is torn down and re-created, matching a normal useEffect dep array.
11
+ export function useCanvasAutorun(
12
+ draw: (ctx: CanvasRenderingContext2D) => void,
13
+ deps: React.DependencyList,
14
+ ) {
15
+ const ref = useRef<HTMLCanvasElement>(null)
16
+ // the autorun tracks its own observable reads, so `draw` is intentionally not
17
+ // a dependency; `deps` alone controls when the effect re-subscribes
18
+ useEffect(() => {
19
+ const ctx = ref.current?.getContext('2d')
20
+ return ctx
21
+ ? autorun(() => {
22
+ draw(ctx)
23
+ })
24
+ : undefined
25
+ // eslint-disable-next-line @eslint-react/exhaustive-deps
26
+ }, deps)
27
+ return ref
28
+ }
package/src/version.ts CHANGED
@@ -1 +1 @@
1
- export const version = '5.5.0'
1
+ export const version = '5.6.1'
@@ -1,7 +0,0 @@
1
- import React from 'react';
2
- import type { MsaViewModel } from '../../model.ts';
3
- declare const SettingsDialog: ({ model, onClose, }: {
4
- model: MsaViewModel;
5
- onClose: () => void;
6
- }) => React.JSX.Element;
7
- export default SettingsDialog;
@@ -1,100 +0,0 @@
1
- import React from 'react';
2
- import { Dialog } from '@jbrowse/core/ui';
3
- import { Button, DialogActions, DialogContent, MenuItem, Slider, TextField, Typography, } from '@mui/material';
4
- import { observer } from 'mobx-react';
5
- import { makeStyles } from 'tss-react/mui';
6
- import colorSchemes from "../../colorSchemes.js";
7
- import Checkbox2 from "../Checkbox2.js";
8
- const useStyles = makeStyles()(theme => ({
9
- field: {
10
- margin: theme.spacing(4),
11
- },
12
- flex: {
13
- display: 'flex',
14
- },
15
- minw: {
16
- width: '80em',
17
- },
18
- }));
19
- const toP = (s = 0) => +s.toFixed(1);
20
- const SettingsContent = observer(function ({ model }) {
21
- return (React.createElement(React.Fragment, null,
22
- React.createElement(TreeSettings, { model: model }),
23
- React.createElement(MSASettings, { model: model })));
24
- });
25
- const TreeSettings = observer(function TreeSettings({ model, }) {
26
- const { drawTree, drawLabels, drawNodeBubbles, labelsAlignRight, showBranchLen, } = model;
27
- return (React.createElement("div", null,
28
- React.createElement("h1", null, "Tree options"),
29
- React.createElement(Checkbox2, { checked: showBranchLen, label: "Show branch length?", onChange: () => {
30
- model.setShowBranchLen(!showBranchLen);
31
- } }),
32
- React.createElement(Checkbox2, { checked: drawNodeBubbles, label: "Draw clickable bubbles on tree branches?", onChange: () => {
33
- model.setDrawNodeBubbles(!drawNodeBubbles);
34
- } }),
35
- React.createElement(Checkbox2, { checked: drawTree, label: "Show tree?", onChange: () => {
36
- model.setDrawTree(!drawTree);
37
- } }),
38
- React.createElement(Checkbox2, { checked: labelsAlignRight, label: "Tree labels align right?", onChange: () => {
39
- model.setLabelsAlignRight(!labelsAlignRight);
40
- } }),
41
- React.createElement(Checkbox2, { checked: drawLabels, label: "Draw labels", onChange: () => {
42
- model.setDrawLabels(!drawLabels);
43
- } })));
44
- });
45
- const MSASettings = observer(function MSASettings({ model, }) {
46
- const { classes } = useStyles();
47
- const { bgColor, colWidth, allowedGappyness, drawMsaLetters, colorSchemeName, hideGaps, rowHeight, } = model;
48
- return (React.createElement("div", null,
49
- React.createElement("h1", null, "MSA options"),
50
- React.createElement(Checkbox2, { checked: drawMsaLetters, label: "Draw letters", onChange: () => {
51
- model.setDrawMsaLetters(!drawMsaLetters);
52
- } }),
53
- React.createElement(Checkbox2, { checked: bgColor, label: "Color letters instead of background of tiles", onChange: () => {
54
- model.setBgColor(!bgColor);
55
- } }),
56
- React.createElement(Checkbox2, { checked: hideGaps, label: "Enable hiding gappy columns?", onChange: () => {
57
- model.setHideGaps(!hideGaps);
58
- } }),
59
- hideGaps ? (React.createElement("div", { className: classes.flex },
60
- React.createElement(Typography, null,
61
- "Hide columns w/ >",
62
- allowedGappyness,
63
- "% gaps"),
64
- React.createElement(Slider, { className: classes.field, min: 1, max: 100, value: allowedGappyness, onChange: (_, val) => {
65
- model.setAllowedGappyness(val);
66
- } }))) : null,
67
- React.createElement("div", { className: classes.flex },
68
- React.createElement(Typography, null,
69
- "Column width (",
70
- toP(colWidth),
71
- "px)"),
72
- React.createElement(Slider, { className: classes.field, min: 1, max: 50, value: colWidth, onChange: (_, val) => {
73
- model.setColWidth(val);
74
- } })),
75
- React.createElement("div", { className: classes.flex },
76
- React.createElement(Typography, null,
77
- "Row height (",
78
- toP(rowHeight),
79
- "px)"),
80
- React.createElement(Slider, { className: classes.field, min: 1, max: 50, value: rowHeight, onChange: (_, val) => {
81
- model.setRowHeight(val);
82
- } })),
83
- React.createElement(TextField, { select: true, label: "Color scheme", value: colorSchemeName, onChange: event => {
84
- model.setColorSchemeName(event.target.value);
85
- } }, Object.keys(colorSchemes).map(option => (React.createElement(MenuItem, { key: option, value: option }, option))))));
86
- });
87
- const SettingsDialog = observer(function ({ model, onClose, }) {
88
- const { classes } = useStyles();
89
- return (React.createElement(Dialog, { open: true, title: "Settings", maxWidth: "xl", onClose: () => {
90
- onClose();
91
- } },
92
- React.createElement(DialogContent, { className: classes.minw },
93
- React.createElement(SettingsContent, { model: model }),
94
- React.createElement(DialogActions, null,
95
- React.createElement(Button, { variant: "contained", color: "primary", onClick: () => {
96
- onClose();
97
- } }, "Submit")))));
98
- });
99
- export default SettingsDialog;
100
- //# sourceMappingURL=SettingsDialog.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SettingsDialog.js","sourceRoot":"","sources":["../../../src/components/dialogs/SettingsDialog.tsx"],"names":[],"mappings":"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"}
@@ -1,27 +0,0 @@
1
- import React from 'react';
2
- import CascadingMenuButton from '@jbrowse/core/ui/CascadingMenuButton';
3
- import MoreVert from '@mui/icons-material/Menu';
4
- import Visibility from '@mui/icons-material/Visibility';
5
- import { observer } from 'mobx-react';
6
- const HeaderMenu = observer(({ model }) => {
7
- const { tracks, turnedOffTracks } = model;
8
- return (React.createElement(CascadingMenuButton, { menuItems: [
9
- {
10
- label: 'Tracks',
11
- icon: Visibility,
12
- type: 'subMenu',
13
- subMenu: tracks.map(track => ({
14
- label: track.model.name,
15
- type: 'checkbox',
16
- checked: !turnedOffTracks.has(track.model.id),
17
- onClick: () => {
18
- model.toggleTrack(track.model.id);
19
- },
20
- })),
21
- },
22
- ...model.extraViewMenuItems(),
23
- ], anchorOrigin: { vertical: 'bottom', horizontal: 'left' }, transformOrigin: { vertical: 'top', horizontal: 'left' } },
24
- React.createElement(MoreVert, null)));
25
- });
26
- export default HeaderMenu;
27
- //# sourceMappingURL=HeaderMenu.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"HeaderMenu.js","sourceRoot":"","sources":["../../../src/components/header/HeaderMenu.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,mBAAmB,MAAM,sCAAsC,CAAA;AACtE,OAAO,QAAQ,MAAM,0BAA0B,CAAA;AAC/C,OAAO,UAAU,MAAM,gCAAgC,CAAA;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAIrC,MAAM,UAAU,GAAG,QAAQ,CAAC,CAAC,EAAE,KAAK,EAA2B,EAAE,EAAE;IACjE,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,KAAK,CAAA;IACzC,OAAO,CACL,oBAAC,mBAAmB,IAClB,SAAS,EAAE;YACT;gBACE,KAAK,EAAE,QAAQ;gBACf,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;oBAC5B,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI;oBACvB,IAAI,EAAE,UAAmB;oBACzB,OAAO,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC7C,OAAO,EAAE,GAAG,EAAE;wBACZ,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;oBACnC,CAAC;iBACF,CAAC,CAAC;aACJ;YACD,GAAG,KAAK,CAAC,kBAAkB,EAAE;SAC9B,EACD,YAAY,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,EACxD,eAAe,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE;QAExD,oBAAC,QAAQ,OAAG,CACQ,CACvB,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,eAAe,UAAU,CAAA"}
@@ -1,234 +0,0 @@
1
- import React from 'react'
2
-
3
- import { Dialog } from '@jbrowse/core/ui'
4
- import {
5
- Button,
6
- DialogActions,
7
- DialogContent,
8
- MenuItem,
9
- Slider,
10
- TextField,
11
- Typography,
12
- } from '@mui/material'
13
- import { observer } from 'mobx-react'
14
- import { makeStyles } from 'tss-react/mui'
15
-
16
- import colorSchemes from '../../colorSchemes.ts'
17
- import Checkbox2 from '../Checkbox2.tsx'
18
-
19
- import type { MsaViewModel } from '../../model.ts'
20
-
21
- const useStyles = makeStyles()(theme => ({
22
- field: {
23
- margin: theme.spacing(4),
24
- },
25
- flex: {
26
- display: 'flex',
27
- },
28
- minw: {
29
- width: '80em',
30
- },
31
- }))
32
-
33
- const toP = (s = 0) => +s.toFixed(1)
34
-
35
- const SettingsContent = observer(function ({ model }: { model: MsaViewModel }) {
36
- return (
37
- <>
38
- <TreeSettings model={model} />
39
- <MSASettings model={model} />
40
- </>
41
- )
42
- })
43
-
44
- const TreeSettings = observer(function TreeSettings({
45
- model,
46
- }: {
47
- model: MsaViewModel
48
- }) {
49
- const {
50
- drawTree,
51
- drawLabels,
52
- drawNodeBubbles,
53
- labelsAlignRight,
54
- showBranchLen,
55
- } = model
56
-
57
- return (
58
- <div>
59
- <h1>Tree options</h1>
60
- <Checkbox2
61
- checked={showBranchLen}
62
- label="Show branch length?"
63
- onChange={() => {
64
- model.setShowBranchLen(!showBranchLen)
65
- }}
66
- />
67
-
68
- <Checkbox2
69
- checked={drawNodeBubbles}
70
- label="Draw clickable bubbles on tree branches?"
71
- onChange={() => {
72
- model.setDrawNodeBubbles(!drawNodeBubbles)
73
- }}
74
- />
75
- <Checkbox2
76
- checked={drawTree}
77
- label="Show tree?"
78
- onChange={() => {
79
- model.setDrawTree(!drawTree)
80
- }}
81
- />
82
-
83
- <Checkbox2
84
- checked={labelsAlignRight}
85
- label="Tree labels align right?"
86
- onChange={() => {
87
- model.setLabelsAlignRight(!labelsAlignRight)
88
- }}
89
- />
90
-
91
- <Checkbox2
92
- checked={drawLabels}
93
- label="Draw labels"
94
- onChange={() => {
95
- model.setDrawLabels(!drawLabels)
96
- }}
97
- />
98
- </div>
99
- )
100
- })
101
-
102
- const MSASettings = observer(function MSASettings({
103
- model,
104
- }: {
105
- model: MsaViewModel
106
- }) {
107
- const { classes } = useStyles()
108
- const {
109
- bgColor,
110
- colWidth,
111
- allowedGappyness,
112
- drawMsaLetters,
113
- colorSchemeName,
114
- hideGaps,
115
- rowHeight,
116
- } = model
117
-
118
- return (
119
- <div>
120
- <h1>MSA options</h1>
121
- <Checkbox2
122
- checked={drawMsaLetters}
123
- label="Draw letters"
124
- onChange={() => {
125
- model.setDrawMsaLetters(!drawMsaLetters)
126
- }}
127
- />
128
- <Checkbox2
129
- checked={bgColor}
130
- label="Color letters instead of background of tiles"
131
- onChange={() => {
132
- model.setBgColor(!bgColor)
133
- }}
134
- />
135
- <Checkbox2
136
- checked={hideGaps}
137
- label="Enable hiding gappy columns?"
138
- onChange={() => {
139
- model.setHideGaps(!hideGaps)
140
- }}
141
- />
142
- {hideGaps ? (
143
- <div className={classes.flex}>
144
- <Typography>Hide columns w/ &gt;{allowedGappyness}% gaps</Typography>
145
- <Slider
146
- className={classes.field}
147
- min={1}
148
- max={100}
149
- value={allowedGappyness}
150
- onChange={(_, val) => {
151
- model.setAllowedGappyness(val)
152
- }}
153
- />
154
- </div>
155
- ) : null}
156
- <div className={classes.flex}>
157
- <Typography>Column width ({toP(colWidth)}px)</Typography>
158
- <Slider
159
- className={classes.field}
160
- min={1}
161
- max={50}
162
- value={colWidth}
163
- onChange={(_, val) => {
164
- model.setColWidth(val)
165
- }}
166
- />
167
- </div>
168
- <div className={classes.flex}>
169
- <Typography>Row height ({toP(rowHeight)}px)</Typography>
170
- <Slider
171
- className={classes.field}
172
- min={1}
173
- max={50}
174
- value={rowHeight}
175
- onChange={(_, val) => {
176
- model.setRowHeight(val)
177
- }}
178
- />
179
- </div>
180
-
181
- <TextField
182
- select
183
- label="Color scheme"
184
- value={colorSchemeName}
185
- onChange={event => {
186
- model.setColorSchemeName(event.target.value)
187
- }}
188
- >
189
- {Object.keys(colorSchemes).map(option => (
190
- <MenuItem key={option} value={option}>
191
- {option}
192
- </MenuItem>
193
- ))}
194
- </TextField>
195
- </div>
196
- )
197
- })
198
-
199
- const SettingsDialog = observer(function ({
200
- model,
201
- onClose,
202
- }: {
203
- model: MsaViewModel
204
- onClose: () => void
205
- }) {
206
- const { classes } = useStyles()
207
- return (
208
- <Dialog
209
- open
210
- title="Settings"
211
- maxWidth="xl"
212
- onClose={() => {
213
- onClose()
214
- }}
215
- >
216
- <DialogContent className={classes.minw}>
217
- <SettingsContent model={model} />
218
- <DialogActions>
219
- <Button
220
- variant="contained"
221
- color="primary"
222
- onClick={() => {
223
- onClose()
224
- }}
225
- >
226
- Submit
227
- </Button>
228
- </DialogActions>
229
- </DialogContent>
230
- </Dialog>
231
- )
232
- })
233
-
234
- export default SettingsDialog
@@ -1,38 +0,0 @@
1
- import React from 'react'
2
-
3
- import CascadingMenuButton from '@jbrowse/core/ui/CascadingMenuButton'
4
- import MoreVert from '@mui/icons-material/Menu'
5
- import Visibility from '@mui/icons-material/Visibility'
6
- import { observer } from 'mobx-react'
7
-
8
- import type { MsaViewModel } from '../../model.ts'
9
-
10
- const HeaderMenu = observer(({ model }: { model: MsaViewModel }) => {
11
- const { tracks, turnedOffTracks } = model
12
- return (
13
- <CascadingMenuButton
14
- menuItems={[
15
- {
16
- label: 'Tracks',
17
- icon: Visibility,
18
- type: 'subMenu',
19
- subMenu: tracks.map(track => ({
20
- label: track.model.name,
21
- type: 'checkbox' as const,
22
- checked: !turnedOffTracks.has(track.model.id),
23
- onClick: () => {
24
- model.toggleTrack(track.model.id)
25
- },
26
- })),
27
- },
28
- ...model.extraViewMenuItems(),
29
- ]}
30
- anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}
31
- transformOrigin={{ vertical: 'top', horizontal: 'left' }}
32
- >
33
- <MoreVert />
34
- </CascadingMenuButton>
35
- )
36
- })
37
-
38
- export default HeaderMenu