react-msaview 9.1.0 → 9.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundle/index.js +111 -115
- package/bundle/index.js.map +4 -4
- package/dist/blosum62.d.ts +3 -0
- package/dist/blosum62.js +43 -0
- package/dist/blosum62.js.map +1 -0
- package/dist/colorSchemes.js +1 -0
- package/dist/colorSchemes.js.map +1 -1
- package/dist/components/Loading.d.ts +3 -2
- package/dist/components/Loading.js +2 -2
- package/dist/components/Loading.js.map +1 -1
- package/dist/components/MSAView.d.ts +3 -2
- package/dist/components/MSAView.js +7 -4
- package/dist/components/MSAView.js.map +1 -1
- package/dist/components/MSAViewer.d.ts +64 -12
- package/dist/components/MetadataTable.d.ts +4 -1
- package/dist/components/MetadataTable.js +55 -16
- package/dist/components/MetadataTable.js.map +1 -1
- package/dist/components/Track.js +6 -0
- package/dist/components/Track.js.map +1 -1
- package/dist/components/controls.js +2 -1
- package/dist/components/controls.js.map +1 -1
- package/dist/components/dialogs/AnnotationFileDialog.js +7 -2
- package/dist/components/dialogs/AnnotationFileDialog.js.map +1 -1
- package/dist/components/dialogs/FeatureDialog.js +2 -2
- package/dist/components/dialogs/FeatureDialog.js.map +1 -1
- package/dist/components/{header/MSASettingsMenu.d.ts → dialogs/GapThresholdDialog.d.ts} +3 -2
- package/dist/components/dialogs/GapThresholdDialog.js +15 -0
- package/dist/components/dialogs/GapThresholdDialog.js.map +1 -0
- package/dist/components/{header → dialogs}/GappynessSlider.d.ts +1 -1
- package/dist/components/{header → dialogs}/GappynessSlider.js +3 -10
- package/dist/components/dialogs/GappynessSlider.js.map +1 -0
- package/dist/components/{header → dialogs}/GoToBox.d.ts +4 -2
- package/dist/components/dialogs/GoToBox.js +48 -0
- package/dist/components/dialogs/GoToBox.js.map +1 -0
- package/dist/components/dialogs/GoToDialog.d.ts +6 -0
- package/dist/components/dialogs/GoToDialog.js +10 -0
- package/dist/components/dialogs/GoToDialog.js.map +1 -0
- package/dist/components/dialogs/MetadataDialog.js +11 -3
- package/dist/components/dialogs/MetadataDialog.js.map +1 -1
- package/dist/components/dialogs/goTo.d.ts +5 -0
- package/dist/components/{header → dialogs}/goTo.js +1 -1
- package/dist/components/dialogs/goTo.js.map +1 -0
- package/dist/components/dialogs/metadataLabels.d.ts +4 -0
- package/dist/components/dialogs/metadataLabels.js +52 -0
- package/dist/components/dialogs/metadataLabels.js.map +1 -0
- package/dist/components/dialogs/metadataRecord.d.ts +1 -0
- package/dist/components/dialogs/metadataRecord.js +38 -0
- package/dist/components/dialogs/metadataRecord.js.map +1 -0
- package/dist/components/header/Header.d.ts +6 -2
- package/dist/components/header/Header.js +30 -32
- package/dist/components/header/Header.js.map +1 -1
- package/dist/components/header/{TreeSettingsMenu.d.ts → HiddenColumnsChip.d.ts} +2 -2
- package/dist/components/header/HiddenColumnsChip.js +15 -0
- package/dist/components/header/HiddenColumnsChip.js.map +1 -0
- package/dist/components/header/MenuBar.d.ts +6 -0
- package/dist/components/header/MenuBar.js +33 -0
- package/dist/components/header/MenuBar.js.map +1 -0
- package/dist/components/header/ScrollZoomCheckbox.d.ts +7 -0
- package/dist/components/header/ScrollZoomCheckbox.js +19 -0
- package/dist/components/header/ScrollZoomCheckbox.js.map +1 -0
- package/dist/components/header/ZoomControls.js +10 -30
- package/dist/components/header/ZoomControls.js.map +1 -1
- package/dist/components/header/colorSchemeMenuItems.d.ts +4 -0
- package/dist/components/header/colorSchemeMenuItems.js +106 -0
- package/dist/components/header/colorSchemeMenuItems.js.map +1 -0
- package/dist/components/header/getAnnotationsMenu.d.ts +3 -30
- package/dist/components/header/getAnnotationsMenu.js +48 -54
- package/dist/components/header/getAnnotationsMenu.js.map +1 -1
- package/dist/components/header/menuBarItems.d.ts +11 -0
- package/dist/components/header/menuBarItems.js +277 -0
- package/dist/components/header/menuBarItems.js.map +1 -0
- package/dist/components/import/ImportForm.js +12 -6
- package/dist/components/import/ImportForm.js.map +1 -1
- package/dist/components/minimap/Minimap.js +7 -3
- package/dist/components/minimap/Minimap.js.map +1 -1
- package/dist/components/minimap/MinimapSVG.js +2 -1
- package/dist/components/minimap/MinimapSVG.js.map +1 -1
- package/dist/components/minimap/minimapLayout.d.ts +12 -0
- package/dist/components/minimap/minimapLayout.js +20 -0
- package/dist/components/minimap/minimapLayout.js.map +1 -1
- package/dist/components/msa/MSACanvas.js +26 -9
- package/dist/components/msa/MSACanvas.js.map +1 -1
- package/dist/components/msa/MSACanvasBlock.js +15 -11
- package/dist/components/msa/MSACanvasBlock.js.map +1 -1
- package/dist/components/msa/MSAMouseoverCanvas.js +2 -2
- package/dist/components/msa/MSAMouseoverCanvas.js.map +1 -1
- package/dist/components/msa/WheelZoomHint.d.ts +7 -0
- package/dist/components/msa/WheelZoomHint.js +38 -0
- package/dist/components/msa/WheelZoomHint.js.map +1 -0
- package/dist/components/msa/msaKeys.js +3 -0
- package/dist/components/msa/msaKeys.js.map +1 -1
- package/dist/components/msa/msaRaster.d.ts +4 -5
- package/dist/components/msa/msaRaster.js +5 -5
- package/dist/components/msa/msaRaster.js.map +1 -1
- package/dist/components/msa/renderBoxFeatureCanvasBlock.js +22 -2
- package/dist/components/msa/renderBoxFeatureCanvasBlock.js.map +1 -1
- package/dist/components/msa/renderHighlights.d.ts +0 -3
- package/dist/components/msa/renderHighlights.js +3 -3
- package/dist/components/msa/renderHighlights.js.map +1 -1
- package/dist/components/msa/renderMSABlock.d.ts +6 -1
- package/dist/components/msa/renderMSABlock.js +44 -17
- package/dist/components/msa/renderMSABlock.js.map +1 -1
- package/dist/components/msa/tileColor.js +7 -0
- package/dist/components/msa/tileColor.js.map +1 -1
- package/dist/components/rowpanels/RowPanelBlock.js +2 -2
- package/dist/components/rowpanels/RowPanelBlock.js.map +1 -1
- package/dist/components/settings/MenuItemsForm.d.ts +10 -0
- package/dist/components/settings/MenuItemsForm.js +80 -0
- package/dist/components/settings/MenuItemsForm.js.map +1 -0
- package/dist/components/settings/SettingsPanel.d.ts +12 -0
- package/dist/components/settings/SettingsPanel.js +92 -0
- package/dist/components/settings/SettingsPanel.js.map +1 -0
- package/dist/components/{header/FileMenu.d.ts → settings/TrackList.d.ts} +2 -2
- package/dist/components/settings/TrackList.js +58 -0
- package/dist/components/settings/TrackList.js.map +1 -0
- package/dist/components/tracks/TrackBlocks.js +2 -2
- package/dist/components/tracks/TrackBlocks.js.map +1 -1
- package/dist/components/tracks/TrackTooltipContent.js +2 -1
- package/dist/components/tracks/TrackTooltipContent.js.map +1 -1
- package/dist/components/tracks/drawTracks.js +13 -6
- package/dist/components/tracks/drawTracks.js.map +1 -1
- package/dist/components/tree/TreeCanvasBlock.js +2 -2
- package/dist/components/tree/TreeCanvasBlock.js.map +1 -1
- package/dist/components/tree/TreeMenu.js +4 -6
- package/dist/components/tree/TreeMenu.js.map +1 -1
- package/dist/components/tree/TreeOverview.js +2 -2
- package/dist/components/tree/TreeOverview.js.map +1 -1
- package/dist/constants.d.ts +4 -1
- package/dist/constants.js +7 -1
- package/dist/constants.js.map +1 -1
- package/dist/darkReader.d.ts +7 -0
- package/dist/darkReader.js +42 -0
- package/dist/darkReader.js.map +1 -0
- package/dist/element.js +22 -47
- package/dist/element.js.map +1 -1
- package/dist/featurePanels.d.ts +37 -0
- package/dist/featurePanels.js +187 -0
- package/dist/featurePanels.js.map +1 -0
- package/dist/filehandleLoader.d.ts +41 -0
- package/dist/filehandleLoader.js +99 -0
- package/dist/filehandleLoader.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/model/treeModel.d.ts +9 -0
- package/dist/model/treeModel.js +12 -1
- package/dist/model/treeModel.js.map +1 -1
- package/dist/model.d.ts +148 -32
- package/dist/model.js +291 -569
- package/dist/model.js.map +1 -1
- package/dist/neighborJoining.js +1 -40
- package/dist/neighborJoining.js.map +1 -1
- package/dist/renderToSvg.js +1 -13
- package/dist/renderToSvg.js.map +1 -1
- package/dist/rerootTree.d.ts +1 -0
- package/dist/rerootTree.js +7 -6
- package/dist/rerootTree.js.map +1 -1
- package/dist/schemeResidueColor.d.ts +12 -0
- package/dist/schemeResidueColor.js +33 -0
- package/dist/schemeResidueColor.js.map +1 -0
- package/dist/similarityColors.d.ts +11 -0
- package/dist/similarityColors.js +90 -0
- package/dist/similarityColors.js.map +1 -0
- package/dist/svgTestUtil.d.ts +64 -12
- package/dist/treeDisplay.d.ts +37 -0
- package/dist/treeDisplay.js +209 -0
- package/dist/treeDisplay.js.map +1 -0
- package/dist/types.d.ts +7 -3
- package/dist/useWheelScroll.d.ts +3 -1
- package/dist/useWheelScroll.js +36 -17
- package/dist/useWheelScroll.js.map +1 -1
- package/dist/util.d.ts +2 -0
- package/dist/util.js +2 -0
- package/dist/util.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/wheelZoom.d.ts +8 -3
- package/dist/wheelZoom.js +44 -32
- package/dist/wheelZoom.js.map +1 -1
- package/dist/zoomSnapshot.d.ts +29 -0
- package/dist/zoomSnapshot.js +47 -0
- package/dist/zoomSnapshot.js.map +1 -0
- package/package.json +11 -11
- package/src/blosum62.ts +45 -0
- package/src/colorSchemes.ts +1 -0
- package/src/components/Loading.tsx +6 -2
- package/src/components/MSAView.tsx +22 -5
- package/src/components/MetadataTable.tsx +83 -26
- package/src/components/Track.tsx +13 -0
- package/src/components/controls.ts +2 -1
- package/src/components/dialogs/AnnotationFileDialog.tsx +12 -1
- package/src/components/dialogs/FeatureDialog.tsx +2 -5
- package/src/components/dialogs/GapThresholdDialog.tsx +36 -0
- package/src/components/{header → dialogs}/GappynessSlider.tsx +3 -10
- package/src/components/{header → dialogs}/GoToBox.tsx +36 -10
- package/src/components/dialogs/GoToDialog.tsx +30 -0
- package/src/components/dialogs/MetadataDialog.tsx +32 -4
- package/src/components/{header → dialogs}/goTo.ts +1 -1
- package/src/components/dialogs/metadataLabels.ts +54 -0
- package/src/components/dialogs/metadataRecord.tsx +61 -0
- package/src/components/header/Header.tsx +75 -42
- package/src/components/header/HiddenColumnsChip.tsx +39 -0
- package/src/components/header/MenuBar.tsx +64 -0
- package/src/components/header/ScrollZoomCheckbox.tsx +46 -0
- package/src/components/header/ZoomControls.tsx +20 -35
- package/src/components/header/colorSchemeMenuItems.ts +121 -0
- package/src/components/header/getAnnotationsMenu.ts +52 -56
- package/src/components/header/menuBarItems.ts +357 -0
- package/src/components/import/ImportForm.tsx +19 -7
- package/src/components/minimap/Minimap.tsx +11 -3
- package/src/components/minimap/MinimapSVG.tsx +17 -1
- package/src/components/minimap/minimapLayout.ts +27 -0
- package/src/components/msa/MSACanvas.tsx +22 -3
- package/src/components/msa/MSACanvasBlock.tsx +18 -11
- package/src/components/msa/MSAMouseoverCanvas.tsx +2 -2
- package/src/components/msa/WheelZoomHint.tsx +56 -0
- package/src/components/msa/msaKeys.ts +3 -0
- package/src/components/msa/msaRaster.ts +6 -8
- package/src/components/msa/renderBoxFeatureCanvasBlock.ts +28 -5
- package/src/components/msa/renderHighlights.ts +3 -3
- package/src/components/msa/renderMSABlock.ts +51 -15
- package/src/components/msa/tileColor.ts +7 -0
- package/src/components/rowpanels/RowPanelBlock.tsx +2 -2
- package/src/components/settings/MenuItemsForm.tsx +225 -0
- package/src/components/settings/SettingsPanel.tsx +156 -0
- package/src/components/settings/TrackList.tsx +124 -0
- package/src/components/tracks/TrackBlocks.tsx +2 -2
- package/src/components/tracks/TrackTooltipContent.tsx +2 -1
- package/src/components/tracks/drawTracks.ts +15 -7
- package/src/components/tree/TreeCanvasBlock.tsx +2 -2
- package/src/components/tree/TreeMenu.tsx +4 -6
- package/src/components/tree/TreeOverview.tsx +2 -2
- package/src/constants.ts +9 -1
- package/src/darkReader.ts +57 -0
- package/src/element.ts +34 -57
- package/src/featurePanels.ts +269 -0
- package/src/filehandleLoader.ts +136 -0
- package/src/index.ts +4 -0
- package/src/model/treeModel.ts +13 -0
- package/src/model.ts +370 -748
- package/src/neighborJoining.ts +1 -42
- package/src/renderToSvg.tsx +1 -13
- package/src/rerootTree.ts +7 -6
- package/src/schemeResidueColor.ts +37 -0
- package/src/similarityColors.ts +112 -0
- package/src/treeDisplay.ts +278 -0
- package/src/types.ts +7 -4
- package/src/useWheelScroll.ts +43 -22
- package/src/util.ts +3 -0
- package/src/version.ts +1 -1
- package/src/wheelZoom.ts +55 -33
- package/src/zoomSnapshot.ts +80 -0
- package/dist/components/header/ColorSchemeMenu.d.ts +0 -12
- package/dist/components/header/ColorSchemeMenu.js +0 -37
- package/dist/components/header/ColorSchemeMenu.js.map +0 -1
- package/dist/components/header/FileMenu.js +0 -92
- package/dist/components/header/FileMenu.js.map +0 -1
- package/dist/components/header/GappynessSlider.js.map +0 -1
- package/dist/components/header/GoToBox.js +0 -31
- package/dist/components/header/GoToBox.js.map +0 -1
- package/dist/components/header/MSASettingsMenu.js +0 -11
- package/dist/components/header/MSASettingsMenu.js.map +0 -1
- package/dist/components/header/ScrollZoomIcons.d.ts +0 -6
- package/dist/components/header/ScrollZoomIcons.js +0 -35
- package/dist/components/header/ScrollZoomIcons.js.map +0 -1
- package/dist/components/header/TreeSettingsMenu.js +0 -11
- package/dist/components/header/TreeSettingsMenu.js.map +0 -1
- package/dist/components/header/goTo.d.ts +0 -20
- package/dist/components/header/goTo.js.map +0 -1
- package/dist/components/header/settingsMenuItems.d.ts +0 -5
- package/dist/components/header/settingsMenuItems.js +0 -171
- package/dist/components/header/settingsMenuItems.js.map +0 -1
- package/src/components/header/ColorSchemeMenu.tsx +0 -56
- package/src/components/header/FileMenu.tsx +0 -107
- package/src/components/header/MSASettingsMenu.tsx +0 -26
- package/src/components/header/ScrollZoomIcons.tsx +0 -52
- package/src/components/header/TreeSettingsMenu.tsx +0 -30
- package/src/components/header/settingsMenuItems.ts +0 -216
|
@@ -1,171 +0,0 @@
|
|
|
1
|
-
import { treeOrders } from '../../constants.js';
|
|
2
|
-
import { MouseScroll, MouseZoomBoth, MouseZoomHorizontal, MouseZoomVertical, } from './ScrollZoomIcons.js';
|
|
3
|
-
function radio(label, checked, onClick) {
|
|
4
|
-
return { label, type: 'radio', checked, onClick };
|
|
5
|
-
}
|
|
6
|
-
const treeOrderLabels = {
|
|
7
|
-
branchLength: 'By branch length',
|
|
8
|
-
input: 'As written',
|
|
9
|
-
ladderize: 'Ladderize, small clades first',
|
|
10
|
-
ladderizeReverse: 'Ladderize, large clades first',
|
|
11
|
-
};
|
|
12
|
-
function outgroupLabel(outgroup) {
|
|
13
|
-
const [first, ...rest] = outgroup;
|
|
14
|
-
return rest.length === 0
|
|
15
|
-
? `Outgroup ${first}`
|
|
16
|
-
: `Outgroup ${first} … ${rest.at(-1)}`;
|
|
17
|
-
}
|
|
18
|
-
function toggle(label, checked, set) {
|
|
19
|
-
return {
|
|
20
|
-
label,
|
|
21
|
-
type: 'checkbox',
|
|
22
|
-
checked,
|
|
23
|
-
onClick: () => {
|
|
24
|
-
set(!checked);
|
|
25
|
-
},
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
|
-
// the only place in the UI to turn a hidden track back on
|
|
29
|
-
function tracksSubMenu(model) {
|
|
30
|
-
const shown = new Set(model.turnedOnTracks.map(t => t.model.id));
|
|
31
|
-
return model.tracks.map(({ model: { id, name } }) => toggle(name, shown.has(id), () => {
|
|
32
|
-
model.toggleTrack(id);
|
|
33
|
-
}));
|
|
34
|
-
}
|
|
35
|
-
const wheelModes = [
|
|
36
|
-
{
|
|
37
|
-
label: 'Scrolls the alignment',
|
|
38
|
-
icon: MouseScroll,
|
|
39
|
-
helpText: 'Ctrl+wheel zooms both axes at the cursor.',
|
|
40
|
-
},
|
|
41
|
-
{
|
|
42
|
-
label: 'Zooms both axes',
|
|
43
|
-
axis: 'both',
|
|
44
|
-
icon: MouseZoomBoth,
|
|
45
|
-
helpText: 'Hold shift to pan while the wheel zooms.',
|
|
46
|
-
},
|
|
47
|
-
{
|
|
48
|
-
label: 'Zooms columns only',
|
|
49
|
-
axis: 'horizontal',
|
|
50
|
-
icon: MouseZoomHorizontal,
|
|
51
|
-
helpText: 'Holds the row height, so the labels and letters stay at their size while the alignment compresses.',
|
|
52
|
-
},
|
|
53
|
-
{
|
|
54
|
-
label: 'Zooms rows only',
|
|
55
|
-
axis: 'vertical',
|
|
56
|
-
icon: MouseZoomVertical,
|
|
57
|
-
helpText: 'Holds the column width, so the alignment stays as wide while the rows grow or shrink.',
|
|
58
|
-
},
|
|
59
|
-
];
|
|
60
|
-
export function wheelSubMenu(model) {
|
|
61
|
-
const active = model.scrollZoom ? model.scrollZoomAxis : undefined;
|
|
62
|
-
return wheelModes.map(({ label, axis, icon, helpText }) => ({
|
|
63
|
-
...radio(label, axis === active, () => {
|
|
64
|
-
model.setScrollZoom(axis !== undefined);
|
|
65
|
-
if (axis !== undefined) {
|
|
66
|
-
model.setScrollZoomAxis(axis);
|
|
67
|
-
}
|
|
68
|
-
}),
|
|
69
|
-
icon,
|
|
70
|
-
helpText,
|
|
71
|
-
}));
|
|
72
|
-
}
|
|
73
|
-
export function msaSettingsMenuItems(model) {
|
|
74
|
-
const { drawMsaLetters, hideGaps, bgColor, showColumnStats } = model;
|
|
75
|
-
return [
|
|
76
|
-
{
|
|
77
|
-
label: 'Tracks',
|
|
78
|
-
type: 'subMenu',
|
|
79
|
-
subMenu: tracksSubMenu(model),
|
|
80
|
-
},
|
|
81
|
-
{
|
|
82
|
-
label: 'Mouse wheel',
|
|
83
|
-
type: 'subMenu',
|
|
84
|
-
subMenu: wheelSubMenu(model),
|
|
85
|
-
},
|
|
86
|
-
{ type: 'divider' },
|
|
87
|
-
toggle('Show track values on hover', showColumnStats, arg => {
|
|
88
|
-
model.setShowColumnStats(arg);
|
|
89
|
-
}),
|
|
90
|
-
toggle('Draw letters', drawMsaLetters, arg => {
|
|
91
|
-
model.setDrawMsaLetters(arg);
|
|
92
|
-
}),
|
|
93
|
-
// inverted: bgColor colors the tile, and off colors the letter
|
|
94
|
-
toggle('Color letters, not cells', !bgColor, arg => {
|
|
95
|
-
model.setBgColor(!arg);
|
|
96
|
-
}),
|
|
97
|
-
toggle('Hide gappy columns', hideGaps, arg => {
|
|
98
|
-
model.setHideGaps(arg);
|
|
99
|
-
}),
|
|
100
|
-
];
|
|
101
|
-
}
|
|
102
|
-
export function treeSettingsMenuItems(model) {
|
|
103
|
-
const { drawTree, showBranchLen, labelsAlignRight, drawNodeBubbles, drawNodeLabels, drawLabels, treeAreaWidth, showTreeOverview, treeOrder, treeRoot, rotated, } = model;
|
|
104
|
-
return [
|
|
105
|
-
{
|
|
106
|
-
label: 'Order',
|
|
107
|
-
type: 'subMenu',
|
|
108
|
-
subMenu: [
|
|
109
|
-
...treeOrders.map(order => radio(treeOrderLabels[order], treeOrder === order, () => {
|
|
110
|
-
model.setTreeOrder(order);
|
|
111
|
-
})),
|
|
112
|
-
{ type: 'divider' },
|
|
113
|
-
{
|
|
114
|
-
label: 'Undo rotations',
|
|
115
|
-
disabled: rotated.length === 0,
|
|
116
|
-
onClick: () => {
|
|
117
|
-
model.clearRotated();
|
|
118
|
-
},
|
|
119
|
-
},
|
|
120
|
-
],
|
|
121
|
-
},
|
|
122
|
-
{
|
|
123
|
-
label: 'Root',
|
|
124
|
-
type: 'subMenu',
|
|
125
|
-
subMenu: [
|
|
126
|
-
radio('As written', treeRoot === undefined, () => {
|
|
127
|
-
model.setTreeRoot(undefined);
|
|
128
|
-
}),
|
|
129
|
-
radio('Midpoint', treeRoot === 'midpoint', () => {
|
|
130
|
-
model.setTreeRoot('midpoint');
|
|
131
|
-
}),
|
|
132
|
-
// "Reroot here" in a node's menu sets the outgroup, so this only
|
|
133
|
-
// reports it
|
|
134
|
-
...(typeof treeRoot === 'object'
|
|
135
|
-
? [
|
|
136
|
-
{
|
|
137
|
-
...radio(outgroupLabel(treeRoot.outgroup), true, () => { }),
|
|
138
|
-
disabled: true,
|
|
139
|
-
},
|
|
140
|
-
]
|
|
141
|
-
: []),
|
|
142
|
-
],
|
|
143
|
-
},
|
|
144
|
-
{ type: 'divider' },
|
|
145
|
-
toggle('Show branch length', showBranchLen, arg => {
|
|
146
|
-
model.setShowBranchLen(arg);
|
|
147
|
-
}),
|
|
148
|
-
toggle('Show tree', drawTree, arg => {
|
|
149
|
-
model.setDrawTree(arg);
|
|
150
|
-
}),
|
|
151
|
-
toggle('Draw bubbles on tree branches', drawNodeBubbles, arg => {
|
|
152
|
-
model.setDrawNodeBubbles(arg);
|
|
153
|
-
}),
|
|
154
|
-
toggle('Draw internal node labels', drawNodeLabels, arg => {
|
|
155
|
-
model.setDrawNodeLabels(arg);
|
|
156
|
-
}),
|
|
157
|
-
toggle('Show tree overview', showTreeOverview, arg => {
|
|
158
|
-
model.setShowTreeOverview(arg);
|
|
159
|
-
}),
|
|
160
|
-
toggle('Tree labels align right', labelsAlignRight, arg => {
|
|
161
|
-
model.setLabelsAlignRight(arg);
|
|
162
|
-
}),
|
|
163
|
-
toggle('Draw labels', drawLabels, arg => {
|
|
164
|
-
model.setDrawLabels(arg);
|
|
165
|
-
}),
|
|
166
|
-
toggle('Fit tree area to labels and tree', treeAreaWidth === undefined, arg => {
|
|
167
|
-
model.setTreeAreaWidth(arg ? undefined : model.effectiveTreeAreaWidth);
|
|
168
|
-
}),
|
|
169
|
-
];
|
|
170
|
-
}
|
|
171
|
-
//# sourceMappingURL=settingsMenuItems.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"settingsMenuItems.js","sourceRoot":"","sources":["../../../src/components/header/settingsMenuItems.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,56 +0,0 @@
|
|
|
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.ts'
|
|
8
|
-
|
|
9
|
-
import type { MsaViewModel } from '../../model.ts'
|
|
10
|
-
|
|
11
|
-
// While a `customColorScheme` map is set, a checked Custom entry stands for it
|
|
12
|
-
// and no named scheme is checked. Picking a named scheme clears the map.
|
|
13
|
-
export function colorSchemeMenuItems(model: MsaViewModel) {
|
|
14
|
-
const { colorSchemeName, customColorScheme } = model
|
|
15
|
-
const custom = customColorScheme
|
|
16
|
-
? [
|
|
17
|
-
{
|
|
18
|
-
label: 'Custom',
|
|
19
|
-
type: 'radio',
|
|
20
|
-
checked: true,
|
|
21
|
-
onClick: () => {},
|
|
22
|
-
} as const,
|
|
23
|
-
]
|
|
24
|
-
: []
|
|
25
|
-
return [
|
|
26
|
-
...custom,
|
|
27
|
-
...Object.keys(colorSchemes).map(
|
|
28
|
-
option =>
|
|
29
|
-
({
|
|
30
|
-
label: option,
|
|
31
|
-
type: 'radio',
|
|
32
|
-
checked: !customColorScheme && colorSchemeName === option,
|
|
33
|
-
onClick: () => {
|
|
34
|
-
model.setColorSchemeName(option)
|
|
35
|
-
},
|
|
36
|
-
}) as const,
|
|
37
|
-
),
|
|
38
|
-
]
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
const ColorSchemeMenu = observer(function ({ model }: { model: MsaViewModel }) {
|
|
42
|
-
return (
|
|
43
|
-
<CascadingMenuButton
|
|
44
|
-
data-testid="color_scheme_menu"
|
|
45
|
-
tooltip="Color scheme"
|
|
46
|
-
closeAfterItemClick
|
|
47
|
-
anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}
|
|
48
|
-
transformOrigin={{ vertical: 'top', horizontal: 'left' }}
|
|
49
|
-
menuItems={colorSchemeMenuItems(model)}
|
|
50
|
-
>
|
|
51
|
-
<Palette />
|
|
52
|
-
</CascadingMenuButton>
|
|
53
|
-
)
|
|
54
|
-
})
|
|
55
|
-
|
|
56
|
-
export default ColorSchemeMenu
|
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
import React, { lazy } from 'react'
|
|
2
|
-
|
|
3
|
-
import CascadingMenuButton from '@jbrowse/core/ui/CascadingMenuButton'
|
|
4
|
-
import AccountTree from '@mui/icons-material/AccountTree'
|
|
5
|
-
import Assignment from '@mui/icons-material/Assignment'
|
|
6
|
-
import FolderOpen from '@mui/icons-material/FolderOpen'
|
|
7
|
-
import Menu from '@mui/icons-material/Menu'
|
|
8
|
-
import PhotoCamera from '@mui/icons-material/PhotoCamera'
|
|
9
|
-
import { observer } from 'mobx-react'
|
|
10
|
-
|
|
11
|
-
import { maxNeighborJoiningRows } from '../../constants.ts'
|
|
12
|
-
import { getAnnotationsMenu } from './getAnnotationsMenu.ts'
|
|
13
|
-
|
|
14
|
-
import type { MsaViewModel } from '../../model.ts'
|
|
15
|
-
|
|
16
|
-
const MetadataDialog = lazy(() => import('../dialogs/MetadataDialog.tsx'))
|
|
17
|
-
const ExportSVGDialog = lazy(() => import('../dialogs/ExportSVGDialog.tsx'))
|
|
18
|
-
|
|
19
|
-
function neighborJoiningItem(model: MsaViewModel) {
|
|
20
|
-
const rows = model.rowMap.size
|
|
21
|
-
const tooManyRows = rows > maxNeighborJoiningRows
|
|
22
|
-
return {
|
|
23
|
-
label: tooManyRows
|
|
24
|
-
? `Calculate neighbor joining tree (over ${maxNeighborJoiningRows} rows, use FastTree)`
|
|
25
|
-
: 'Calculate neighbor joining tree (BLOSUM62)',
|
|
26
|
-
icon: AccountTree,
|
|
27
|
-
disabled: tooManyRows || rows < 2,
|
|
28
|
-
onClick: () => {
|
|
29
|
-
try {
|
|
30
|
-
model.calculateNeighborJoiningTreeFromMSA()
|
|
31
|
-
} catch (e) {
|
|
32
|
-
console.error('Failed to calculate NJ tree:', e)
|
|
33
|
-
model.addWarning(e instanceof Error ? e.message : String(e))
|
|
34
|
-
}
|
|
35
|
-
},
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
const FileMenu = observer(({ model }: { model: MsaViewModel }) => {
|
|
40
|
-
return (
|
|
41
|
-
<CascadingMenuButton
|
|
42
|
-
data-testid="file_menu"
|
|
43
|
-
tooltip="File"
|
|
44
|
-
menuItems={[
|
|
45
|
-
...(model.importForm
|
|
46
|
-
? [
|
|
47
|
-
{
|
|
48
|
-
label: 'Return to import form',
|
|
49
|
-
icon: FolderOpen,
|
|
50
|
-
onClick: () => {
|
|
51
|
-
model.reset()
|
|
52
|
-
},
|
|
53
|
-
},
|
|
54
|
-
]
|
|
55
|
-
: []),
|
|
56
|
-
{
|
|
57
|
-
label: 'Metadata',
|
|
58
|
-
icon: Assignment,
|
|
59
|
-
onClick: () => {
|
|
60
|
-
model.queueDialog(onClose => [
|
|
61
|
-
MetadataDialog,
|
|
62
|
-
{
|
|
63
|
-
model,
|
|
64
|
-
onClose,
|
|
65
|
-
},
|
|
66
|
-
])
|
|
67
|
-
},
|
|
68
|
-
},
|
|
69
|
-
{
|
|
70
|
-
label: 'Annotations',
|
|
71
|
-
type: 'subMenu',
|
|
72
|
-
subMenu: getAnnotationsMenu({
|
|
73
|
-
model,
|
|
74
|
-
}),
|
|
75
|
-
},
|
|
76
|
-
neighborJoiningItem(model),
|
|
77
|
-
{
|
|
78
|
-
label: 'Export tree (Newick)',
|
|
79
|
-
icon: AccountTree,
|
|
80
|
-
disabled: !!model.tree.noTree,
|
|
81
|
-
onClick: () => {
|
|
82
|
-
model.exportNewick()
|
|
83
|
-
},
|
|
84
|
-
},
|
|
85
|
-
{
|
|
86
|
-
label: 'Export SVG',
|
|
87
|
-
icon: PhotoCamera,
|
|
88
|
-
onClick: () => {
|
|
89
|
-
model.queueDialog(onClose => [
|
|
90
|
-
ExportSVGDialog,
|
|
91
|
-
{
|
|
92
|
-
onClose,
|
|
93
|
-
model,
|
|
94
|
-
},
|
|
95
|
-
])
|
|
96
|
-
},
|
|
97
|
-
},
|
|
98
|
-
]}
|
|
99
|
-
anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}
|
|
100
|
-
transformOrigin={{ vertical: 'top', horizontal: 'left' }}
|
|
101
|
-
>
|
|
102
|
-
<Menu />
|
|
103
|
-
</CascadingMenuButton>
|
|
104
|
-
)
|
|
105
|
-
})
|
|
106
|
-
|
|
107
|
-
export default FileMenu
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import React from 'react'
|
|
2
|
-
|
|
3
|
-
import CascadingMenuButton from '@jbrowse/core/ui/CascadingMenuButton'
|
|
4
|
-
import Tune from '@mui/icons-material/Tune'
|
|
5
|
-
import { observer } from 'mobx-react'
|
|
6
|
-
|
|
7
|
-
import { msaSettingsMenuItems } from './settingsMenuItems.ts'
|
|
8
|
-
|
|
9
|
-
import type { MsaViewModel } from '../../model.ts'
|
|
10
|
-
|
|
11
|
-
const MSASettingsMenu = observer(function ({ model }: { model: MsaViewModel }) {
|
|
12
|
-
return (
|
|
13
|
-
<CascadingMenuButton
|
|
14
|
-
data-testid="msa_settings_menu"
|
|
15
|
-
tooltip="Alignment settings"
|
|
16
|
-
closeAfterItemClick={false}
|
|
17
|
-
anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}
|
|
18
|
-
transformOrigin={{ vertical: 'top', horizontal: 'left' }}
|
|
19
|
-
menuItems={msaSettingsMenuItems(model)}
|
|
20
|
-
>
|
|
21
|
-
<Tune />
|
|
22
|
-
</CascadingMenuButton>
|
|
23
|
-
)
|
|
24
|
-
})
|
|
25
|
-
|
|
26
|
-
export default MSASettingsMenu
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
import React from 'react'
|
|
2
|
-
|
|
3
|
-
import SvgIcon from '@mui/material/SvgIcon'
|
|
4
|
-
|
|
5
|
-
import type { SvgIconProps } from '@mui/material/SvgIcon'
|
|
6
|
-
|
|
7
|
-
// Mouse glyphs with outward arrows on the axes a wheel zoom scales.
|
|
8
|
-
// @mui/icons-material ships only the plain `Mouse`, and three variants that
|
|
9
|
-
// differ only in their arrows have to share one body to stay apart at 24px.
|
|
10
|
-
// The body's inner subpath runs the opposite sweep, which punches the hole the
|
|
11
|
-
// wheel bar sits in.
|
|
12
|
-
const BODY =
|
|
13
|
-
'M12 5a4 4 0 0 0-4 4v6a4 4 0 0 0 8 0V9a4 4 0 0 0-4-4zm0 2a2 2 0 0 1 2 2v6a2 2 0 0 1-4 0V9a2 2 0 0 1 2-2z'
|
|
14
|
-
const WHEEL = 'M11.2 8.6h1.6v3.2h-1.6z'
|
|
15
|
-
const LEFT = 'M.4 12 5 15V9z'
|
|
16
|
-
const RIGHT = 'M23.6 12 19 9v6z'
|
|
17
|
-
const UP = 'M12 .4 15 4H9z'
|
|
18
|
-
const DOWN = 'M12 23.6 9 20h6z'
|
|
19
|
-
|
|
20
|
-
function MouseZoom({
|
|
21
|
-
arrows,
|
|
22
|
-
...rest
|
|
23
|
-
}: SvgIconProps & { arrows: readonly string[] }) {
|
|
24
|
-
return (
|
|
25
|
-
<SvgIcon {...rest}>
|
|
26
|
-
<path d={BODY} />
|
|
27
|
-
<path d={WHEEL} />
|
|
28
|
-
{arrows.map(d => (
|
|
29
|
-
<path key={d} d={d} />
|
|
30
|
-
))}
|
|
31
|
-
</SvgIcon>
|
|
32
|
-
)
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
// the bare body, for a wheel that scrolls. @mui/icons-material's own `Mouse` is
|
|
36
|
-
// a solid silhouette, which would jump to a different drawing when the menu
|
|
37
|
-
// changes the mode.
|
|
38
|
-
export function MouseScroll(props: SvgIconProps) {
|
|
39
|
-
return <MouseZoom {...props} arrows={[]} />
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
export function MouseZoomBoth(props: SvgIconProps) {
|
|
43
|
-
return <MouseZoom {...props} arrows={[LEFT, RIGHT, UP, DOWN]} />
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
export function MouseZoomHorizontal(props: SvgIconProps) {
|
|
47
|
-
return <MouseZoom {...props} arrows={[LEFT, RIGHT]} />
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
export function MouseZoomVertical(props: SvgIconProps) {
|
|
51
|
-
return <MouseZoom {...props} arrows={[UP, DOWN]} />
|
|
52
|
-
}
|
|
@@ -1,30 +0,0 @@
|
|
|
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 { treeSettingsMenuItems } from './settingsMenuItems.ts'
|
|
8
|
-
|
|
9
|
-
import type { MsaViewModel } from '../../model.ts'
|
|
10
|
-
|
|
11
|
-
const TreeSettingsMenu = observer(function ({
|
|
12
|
-
model,
|
|
13
|
-
}: {
|
|
14
|
-
model: MsaViewModel
|
|
15
|
-
}) {
|
|
16
|
-
return model.noTree ? null : (
|
|
17
|
-
<CascadingMenuButton
|
|
18
|
-
data-testid="tree_settings_menu"
|
|
19
|
-
tooltip="Tree settings"
|
|
20
|
-
closeAfterItemClick={false}
|
|
21
|
-
anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}
|
|
22
|
-
transformOrigin={{ vertical: 'top', horizontal: 'left' }}
|
|
23
|
-
menuItems={treeSettingsMenuItems(model)}
|
|
24
|
-
>
|
|
25
|
-
<AccountTree />
|
|
26
|
-
</CascadingMenuButton>
|
|
27
|
-
)
|
|
28
|
-
})
|
|
29
|
-
|
|
30
|
-
export default TreeSettingsMenu
|
|
@@ -1,216 +0,0 @@
|
|
|
1
|
-
import { treeOrders } from '../../constants.ts'
|
|
2
|
-
import {
|
|
3
|
-
MouseScroll,
|
|
4
|
-
MouseZoomBoth,
|
|
5
|
-
MouseZoomHorizontal,
|
|
6
|
-
MouseZoomVertical,
|
|
7
|
-
} from './ScrollZoomIcons.tsx'
|
|
8
|
-
|
|
9
|
-
import type { ScrollZoomAxis } from '../../constants.ts'
|
|
10
|
-
import type { MsaViewModel } from '../../model.ts'
|
|
11
|
-
import type { TreeOrder } from '../../types.ts'
|
|
12
|
-
import type { MenuItem } from '@jbrowse/core/ui/Menu'
|
|
13
|
-
|
|
14
|
-
function radio(label: string, checked: boolean, onClick: () => void) {
|
|
15
|
-
return { label, type: 'radio' as const, checked, onClick }
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
const treeOrderLabels: Record<TreeOrder, string> = {
|
|
19
|
-
branchLength: 'By branch length',
|
|
20
|
-
input: 'As written',
|
|
21
|
-
ladderize: 'Ladderize, small clades first',
|
|
22
|
-
ladderizeReverse: 'Ladderize, large clades first',
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
function outgroupLabel(outgroup: string[]) {
|
|
26
|
-
const [first, ...rest] = outgroup
|
|
27
|
-
return rest.length === 0
|
|
28
|
-
? `Outgroup ${first}`
|
|
29
|
-
: `Outgroup ${first} … ${rest.at(-1)}`
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
function toggle(label: string, checked: boolean, set: (arg: boolean) => void) {
|
|
33
|
-
return {
|
|
34
|
-
label,
|
|
35
|
-
type: 'checkbox' as const,
|
|
36
|
-
checked,
|
|
37
|
-
onClick: () => {
|
|
38
|
-
set(!checked)
|
|
39
|
-
},
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
// the only place in the UI to turn a hidden track back on
|
|
44
|
-
function tracksSubMenu(model: MsaViewModel): MenuItem[] {
|
|
45
|
-
const shown = new Set(model.turnedOnTracks.map(t => t.model.id))
|
|
46
|
-
return model.tracks.map(({ model: { id, name } }) =>
|
|
47
|
-
toggle(name, shown.has(id), () => {
|
|
48
|
-
model.toggleTrack(id)
|
|
49
|
-
}),
|
|
50
|
-
)
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
const wheelModes: {
|
|
54
|
-
label: string
|
|
55
|
-
axis?: ScrollZoomAxis
|
|
56
|
-
icon: typeof MouseScroll
|
|
57
|
-
helpText: string
|
|
58
|
-
}[] = [
|
|
59
|
-
{
|
|
60
|
-
label: 'Scrolls the alignment',
|
|
61
|
-
icon: MouseScroll,
|
|
62
|
-
helpText: 'Ctrl+wheel zooms both axes at the cursor.',
|
|
63
|
-
},
|
|
64
|
-
{
|
|
65
|
-
label: 'Zooms both axes',
|
|
66
|
-
axis: 'both',
|
|
67
|
-
icon: MouseZoomBoth,
|
|
68
|
-
helpText: 'Hold shift to pan while the wheel zooms.',
|
|
69
|
-
},
|
|
70
|
-
{
|
|
71
|
-
label: 'Zooms columns only',
|
|
72
|
-
axis: 'horizontal',
|
|
73
|
-
icon: MouseZoomHorizontal,
|
|
74
|
-
helpText:
|
|
75
|
-
'Holds the row height, so the labels and letters stay at their size while the alignment compresses.',
|
|
76
|
-
},
|
|
77
|
-
{
|
|
78
|
-
label: 'Zooms rows only',
|
|
79
|
-
axis: 'vertical',
|
|
80
|
-
icon: MouseZoomVertical,
|
|
81
|
-
helpText:
|
|
82
|
-
'Holds the column width, so the alignment stays as wide while the rows grow or shrink.',
|
|
83
|
-
},
|
|
84
|
-
]
|
|
85
|
-
|
|
86
|
-
export function wheelSubMenu(model: MsaViewModel): MenuItem[] {
|
|
87
|
-
const active = model.scrollZoom ? model.scrollZoomAxis : undefined
|
|
88
|
-
return wheelModes.map(({ label, axis, icon, helpText }) => ({
|
|
89
|
-
...radio(label, axis === active, () => {
|
|
90
|
-
model.setScrollZoom(axis !== undefined)
|
|
91
|
-
if (axis !== undefined) {
|
|
92
|
-
model.setScrollZoomAxis(axis)
|
|
93
|
-
}
|
|
94
|
-
}),
|
|
95
|
-
icon,
|
|
96
|
-
helpText,
|
|
97
|
-
}))
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
export function msaSettingsMenuItems(model: MsaViewModel): MenuItem[] {
|
|
101
|
-
const { drawMsaLetters, hideGaps, bgColor, showColumnStats } = model
|
|
102
|
-
return [
|
|
103
|
-
{
|
|
104
|
-
label: 'Tracks',
|
|
105
|
-
type: 'subMenu' as const,
|
|
106
|
-
subMenu: tracksSubMenu(model),
|
|
107
|
-
},
|
|
108
|
-
{
|
|
109
|
-
label: 'Mouse wheel',
|
|
110
|
-
type: 'subMenu' as const,
|
|
111
|
-
subMenu: wheelSubMenu(model),
|
|
112
|
-
},
|
|
113
|
-
{ type: 'divider' as const },
|
|
114
|
-
toggle('Show track values on hover', showColumnStats, arg => {
|
|
115
|
-
model.setShowColumnStats(arg)
|
|
116
|
-
}),
|
|
117
|
-
toggle('Draw letters', drawMsaLetters, arg => {
|
|
118
|
-
model.setDrawMsaLetters(arg)
|
|
119
|
-
}),
|
|
120
|
-
// inverted: bgColor colors the tile, and off colors the letter
|
|
121
|
-
toggle('Color letters, not cells', !bgColor, arg => {
|
|
122
|
-
model.setBgColor(!arg)
|
|
123
|
-
}),
|
|
124
|
-
toggle('Hide gappy columns', hideGaps, arg => {
|
|
125
|
-
model.setHideGaps(arg)
|
|
126
|
-
}),
|
|
127
|
-
]
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
export function treeSettingsMenuItems(model: MsaViewModel): MenuItem[] {
|
|
131
|
-
const {
|
|
132
|
-
drawTree,
|
|
133
|
-
showBranchLen,
|
|
134
|
-
labelsAlignRight,
|
|
135
|
-
drawNodeBubbles,
|
|
136
|
-
drawNodeLabels,
|
|
137
|
-
drawLabels,
|
|
138
|
-
treeAreaWidth,
|
|
139
|
-
showTreeOverview,
|
|
140
|
-
treeOrder,
|
|
141
|
-
treeRoot,
|
|
142
|
-
rotated,
|
|
143
|
-
} = model
|
|
144
|
-
return [
|
|
145
|
-
{
|
|
146
|
-
label: 'Order',
|
|
147
|
-
type: 'subMenu' as const,
|
|
148
|
-
subMenu: [
|
|
149
|
-
...treeOrders.map(order =>
|
|
150
|
-
radio(treeOrderLabels[order], treeOrder === order, () => {
|
|
151
|
-
model.setTreeOrder(order)
|
|
152
|
-
}),
|
|
153
|
-
),
|
|
154
|
-
{ type: 'divider' as const },
|
|
155
|
-
{
|
|
156
|
-
label: 'Undo rotations',
|
|
157
|
-
disabled: rotated.length === 0,
|
|
158
|
-
onClick: () => {
|
|
159
|
-
model.clearRotated()
|
|
160
|
-
},
|
|
161
|
-
},
|
|
162
|
-
],
|
|
163
|
-
},
|
|
164
|
-
{
|
|
165
|
-
label: 'Root',
|
|
166
|
-
type: 'subMenu' as const,
|
|
167
|
-
subMenu: [
|
|
168
|
-
radio('As written', treeRoot === undefined, () => {
|
|
169
|
-
model.setTreeRoot(undefined)
|
|
170
|
-
}),
|
|
171
|
-
radio('Midpoint', treeRoot === 'midpoint', () => {
|
|
172
|
-
model.setTreeRoot('midpoint')
|
|
173
|
-
}),
|
|
174
|
-
// "Reroot here" in a node's menu sets the outgroup, so this only
|
|
175
|
-
// reports it
|
|
176
|
-
...(typeof treeRoot === 'object'
|
|
177
|
-
? [
|
|
178
|
-
{
|
|
179
|
-
...radio(outgroupLabel(treeRoot.outgroup), true, () => {}),
|
|
180
|
-
disabled: true,
|
|
181
|
-
},
|
|
182
|
-
]
|
|
183
|
-
: []),
|
|
184
|
-
],
|
|
185
|
-
},
|
|
186
|
-
{ type: 'divider' as const },
|
|
187
|
-
toggle('Show branch length', showBranchLen, arg => {
|
|
188
|
-
model.setShowBranchLen(arg)
|
|
189
|
-
}),
|
|
190
|
-
toggle('Show tree', drawTree, arg => {
|
|
191
|
-
model.setDrawTree(arg)
|
|
192
|
-
}),
|
|
193
|
-
toggle('Draw bubbles on tree branches', drawNodeBubbles, arg => {
|
|
194
|
-
model.setDrawNodeBubbles(arg)
|
|
195
|
-
}),
|
|
196
|
-
toggle('Draw internal node labels', drawNodeLabels, arg => {
|
|
197
|
-
model.setDrawNodeLabels(arg)
|
|
198
|
-
}),
|
|
199
|
-
toggle('Show tree overview', showTreeOverview, arg => {
|
|
200
|
-
model.setShowTreeOverview(arg)
|
|
201
|
-
}),
|
|
202
|
-
toggle('Tree labels align right', labelsAlignRight, arg => {
|
|
203
|
-
model.setLabelsAlignRight(arg)
|
|
204
|
-
}),
|
|
205
|
-
toggle('Draw labels', drawLabels, arg => {
|
|
206
|
-
model.setDrawLabels(arg)
|
|
207
|
-
}),
|
|
208
|
-
toggle(
|
|
209
|
-
'Fit tree area to labels and tree',
|
|
210
|
-
treeAreaWidth === undefined,
|
|
211
|
-
arg => {
|
|
212
|
-
model.setTreeAreaWidth(arg ? undefined : model.effectiveTreeAreaWidth)
|
|
213
|
-
},
|
|
214
|
-
),
|
|
215
|
-
]
|
|
216
|
-
}
|