react-msaview 3.1.7 → 3.1.8
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 +32 -32
- package/dist/components/Checkbox2.d.ts +7 -0
- package/dist/components/Checkbox2.js +10 -0
- package/dist/components/Checkbox2.js.map +1 -0
- package/dist/components/Loading.js +12 -4
- package/dist/components/Loading.js.map +1 -1
- package/dist/components/MSAView.js +5 -8
- package/dist/components/MSAView.js.map +1 -1
- package/dist/components/SequenceTextArea.d.ts +4 -0
- package/dist/components/SequenceTextArea.js +38 -0
- package/dist/components/SequenceTextArea.js.map +1 -0
- package/dist/components/Track.js +9 -8
- package/dist/components/Track.js.map +1 -1
- package/dist/components/dialogs/AddTrackDialog.js +0 -1
- package/dist/components/dialogs/AddTrackDialog.js.map +1 -1
- package/dist/components/{ExportSVGDialog.d.ts → dialogs/ExportSVGDialog.d.ts} +1 -1
- package/dist/components/{ExportSVGDialog.js → dialogs/ExportSVGDialog.js} +3 -4
- package/dist/components/dialogs/ExportSVGDialog.js.map +1 -0
- package/dist/components/dialogs/FeatureDialog.d.ts +7 -0
- package/dist/components/dialogs/FeatureDialog.js +52 -0
- package/dist/components/dialogs/FeatureDialog.js.map +1 -0
- package/dist/components/dialogs/InterProScanDialog.d.ts +7 -0
- package/dist/components/dialogs/InterProScanDialog.js +163 -0
- package/dist/components/dialogs/InterProScanDialog.js.map +1 -0
- package/dist/components/dialogs/MetadataDialog.js +6 -3
- package/dist/components/dialogs/MetadataDialog.js.map +1 -1
- package/dist/components/dialogs/SettingsDialog.js +6 -11
- package/dist/components/dialogs/SettingsDialog.js.map +1 -1
- package/dist/components/{Header.d.ts → header/Header.d.ts} +1 -1
- package/dist/components/header/Header.js +30 -0
- package/dist/components/header/Header.js.map +1 -0
- package/dist/components/{HeaderInfoArea.d.ts → header/HeaderInfoArea.d.ts} +2 -2
- package/dist/components/header/HeaderInfoArea.js +20 -0
- package/dist/components/header/HeaderInfoArea.js.map +1 -0
- package/dist/components/header/HeaderMenu.d.ts +6 -0
- package/dist/components/header/HeaderMenu.js +40 -0
- package/dist/components/header/HeaderMenu.js.map +1 -0
- package/dist/components/header/HeaderMenuExtra.d.ts +6 -0
- package/dist/components/header/HeaderMenuExtra.js +92 -0
- package/dist/components/header/HeaderMenuExtra.js.map +1 -0
- package/dist/components/header/HeaderStatusArea.d.ts +6 -0
- package/dist/components/header/HeaderStatusArea.js +20 -0
- package/dist/components/header/HeaderStatusArea.js.map +1 -0
- package/dist/components/{MultiAlignmentSelector.d.ts → header/MultiAlignmentSelector.d.ts} +1 -1
- package/dist/components/header/MultiAlignmentSelector.js.map +1 -0
- package/dist/components/{ZoomControls.d.ts → header/ZoomControls.d.ts} +1 -1
- package/dist/components/header/ZoomControls.js +15 -0
- package/dist/components/header/ZoomControls.js.map +1 -0
- package/dist/components/{ImportForm/index.js → import/ImportForm.js} +1 -1
- package/dist/components/import/ImportForm.js.map +1 -0
- package/dist/components/{ImportForm → import}/ImportFormExamples.js +6 -2
- package/dist/components/import/ImportFormExamples.js.map +1 -0
- package/dist/components/import/data/seq2.js.map +1 -0
- package/dist/components/import/util.js +10 -0
- package/dist/components/import/util.js.map +1 -0
- package/dist/components/{Minimap.d.ts → minimap/Minimap.d.ts} +1 -1
- package/dist/components/minimap/Minimap.js.map +1 -0
- package/dist/components/{MinimapSVG.d.ts → minimap/MinimapSVG.d.ts} +1 -1
- package/dist/components/minimap/MinimapSVG.js.map +1 -0
- package/dist/components/msa/Loading.js.map +1 -0
- package/dist/components/{MSAPanel → msa}/MSACanvas.js +3 -2
- package/dist/components/msa/MSACanvas.js.map +1 -0
- package/dist/components/{MSAPanel/MSABlock.js → msa/MSACanvasBlock.js} +21 -9
- package/dist/components/msa/MSACanvasBlock.js.map +1 -0
- package/dist/components/msa/MSAMouseoverCanvas.js.map +1 -0
- package/dist/components/msa/MSAPanel.d.ts +6 -0
- package/dist/components/{MSAPanel/index.js → msa/MSAPanel.js} +6 -3
- package/dist/components/msa/MSAPanel.js.map +1 -0
- package/dist/components/msa/renderBoxFeatureCanvasBlock.d.ts +9 -0
- package/dist/components/msa/renderBoxFeatureCanvasBlock.js +44 -0
- package/dist/components/msa/renderBoxFeatureCanvasBlock.js.map +1 -0
- package/dist/components/{MSAPanel → msa}/renderMSABlock.js +24 -20
- package/dist/components/msa/renderMSABlock.js.map +1 -0
- package/dist/components/msa/renderMSAMouseover.js.map +1 -0
- package/dist/components/tree/TreeBranchMenu.js.map +1 -0
- package/dist/components/{TreePanel → tree}/TreeCanvas.js +1 -1
- package/dist/components/tree/TreeCanvas.js.map +1 -0
- package/dist/components/{TreePanel → tree}/TreeCanvasBlock.js +1 -1
- package/dist/components/tree/TreeCanvasBlock.js.map +1 -0
- package/dist/components/{TreePanel → tree}/TreeNodeMenu.js +2 -33
- package/dist/components/tree/TreeNodeMenu.js.map +1 -0
- package/dist/components/{TreePanel/index.js → tree/TreePanel.js} +2 -2
- package/dist/components/tree/TreePanel.js.map +1 -0
- package/dist/components/tree/TreeRuler.js.map +1 -0
- package/dist/components/{TreePanel → tree}/dialogs/TreeNodeInfoDialog.js +6 -2
- package/dist/components/tree/dialogs/TreeNodeInfoDialog.js.map +1 -0
- package/dist/components/{TreePanel → tree}/renderTreeCanvas.js +23 -37
- package/dist/components/tree/renderTreeCanvas.js.map +1 -0
- package/dist/fetchUtils.d.ts +5 -0
- package/dist/fetchUtils.js +23 -0
- package/dist/fetchUtils.js.map +1 -0
- package/dist/ggplotPalettes.d.ts +3 -0
- package/dist/ggplotPalettes.js +24 -0
- package/dist/ggplotPalettes.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/launchInterProScan.d.ts +32 -0
- package/dist/launchInterProScan.js +47 -0
- package/dist/launchInterProScan.js.map +1 -0
- package/dist/model/DataModel.js.map +1 -0
- package/dist/model/DialogQueue.js.map +1 -0
- package/dist/model/msaModel.d.ts +14 -0
- package/dist/model/msaModel.js +36 -0
- package/dist/model/msaModel.js.map +1 -0
- package/dist/model/treeModel.d.ts +46 -0
- package/dist/model/treeModel.js +105 -0
- package/dist/model/treeModel.js.map +1 -0
- package/dist/model.d.ts +261 -273
- package/dist/model.js +1043 -1029
- package/dist/model.js.map +1 -1
- package/dist/parseGFF.d.ts +10 -0
- package/dist/parseGFF.js +29 -0
- package/dist/parseGFF.js.map +1 -0
- package/dist/renderToSvg.js +23 -9
- package/dist/renderToSvg.js.map +1 -1
- package/dist/reparseTree.d.ts +2 -0
- package/dist/reparseTree.js +13 -0
- package/dist/reparseTree.js.map +1 -0
- package/dist/util.d.ts +4 -10
- package/dist/util.js +3 -28
- package/dist/util.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +12 -2
- package/src/components/Checkbox2.tsx +34 -0
- package/src/components/Loading.tsx +27 -11
- package/src/components/MSAView.tsx +6 -10
- package/src/components/SequenceTextArea.tsx +63 -0
- package/src/components/Track.tsx +8 -13
- package/src/components/dialogs/AddTrackDialog.tsx +0 -1
- package/src/components/{ExportSVGDialog.tsx → dialogs/ExportSVGDialog.tsx} +9 -16
- package/src/components/dialogs/FeatureDialog.tsx +109 -0
- package/src/components/dialogs/InterProScanDialog.tsx +230 -0
- package/src/components/dialogs/MetadataDialog.tsx +9 -2
- package/src/components/dialogs/SettingsDialog.tsx +10 -30
- package/src/components/header/Header.tsx +44 -0
- package/src/components/header/HeaderInfoArea.tsx +27 -0
- package/src/components/header/HeaderMenu.tsx +54 -0
- package/src/components/header/HeaderMenuExtra.tsx +108 -0
- package/src/components/header/HeaderStatusArea.tsx +31 -0
- package/src/components/{MultiAlignmentSelector.tsx → header/MultiAlignmentSelector.tsx} +1 -1
- package/src/components/header/ZoomControls.tsx +28 -0
- package/src/components/{ImportForm → import}/ImportFormExamples.tsx +12 -1
- package/src/components/{ImportForm → import}/util.ts +5 -10
- package/src/components/{Minimap.tsx → minimap/Minimap.tsx} +1 -1
- package/src/components/{MinimapSVG.tsx → minimap/MinimapSVG.tsx} +1 -1
- package/src/components/{MSAPanel → msa}/MSACanvas.tsx +3 -2
- package/src/components/{MSAPanel/MSABlock.tsx → msa/MSACanvasBlock.tsx} +25 -12
- package/src/components/{MSAPanel/index.tsx → msa/MSAPanel.tsx} +8 -2
- package/src/components/msa/renderBoxFeatureCanvasBlock.ts +88 -0
- package/src/components/{MSAPanel → msa}/renderMSABlock.ts +26 -20
- package/src/components/{TreePanel → tree}/TreeCanvas.tsx +1 -1
- package/src/components/{TreePanel → tree}/TreeCanvasBlock.tsx +1 -1
- package/src/components/{TreePanel → tree}/TreeNodeMenu.tsx +1 -53
- package/src/components/{TreePanel/index.tsx → tree/TreePanel.tsx} +1 -1
- package/src/components/{TreePanel → tree}/dialogs/TreeNodeInfoDialog.tsx +9 -2
- package/src/components/{TreePanel → tree}/renderTreeCanvas.ts +25 -41
- package/src/fetchUtils.ts +30 -0
- package/src/ggplotPalettes.ts +25 -0
- package/src/index.ts +1 -1
- package/src/launchInterProScan.ts +98 -0
- package/src/model/msaModel.ts +39 -0
- package/src/model/treeModel.ts +116 -0
- package/src/model.ts +1124 -1126
- package/src/parseGFF.ts +32 -0
- package/src/renderToSvg.tsx +27 -8
- package/src/reparseTree.ts +16 -0
- package/src/util.ts +4 -33
- package/src/version.ts +1 -1
- package/dist/DataModel.js.map +0 -1
- package/dist/DialogQueue.js.map +0 -1
- package/dist/SelectedStructuresMixin.d.ts +0 -46
- package/dist/SelectedStructuresMixin.js +0 -52
- package/dist/SelectedStructuresMixin.js.map +0 -1
- package/dist/StructureModel.d.ts +0 -9
- package/dist/StructureModel.js +0 -11
- package/dist/StructureModel.js.map +0 -1
- package/dist/UniprotTrack.d.ts +0 -27
- package/dist/UniprotTrack.js +0 -53
- package/dist/UniprotTrack.js.map +0 -1
- package/dist/components/BoxTrack.d.ts +0 -7
- package/dist/components/BoxTrack.js +0 -15
- package/dist/components/BoxTrack.js.map +0 -1
- package/dist/components/BoxTrackBlock.d.ts +0 -8
- package/dist/components/BoxTrackBlock.js +0 -136
- package/dist/components/BoxTrackBlock.js.map +0 -1
- package/dist/components/ExportSVGDialog.js.map +0 -1
- package/dist/components/Header.js +0 -62
- package/dist/components/Header.js.map +0 -1
- package/dist/components/HeaderInfoArea.js +0 -12
- package/dist/components/HeaderInfoArea.js.map +0 -1
- package/dist/components/ImportForm/ImportFormExamples.js.map +0 -1
- package/dist/components/ImportForm/data/seq2.js.map +0 -1
- package/dist/components/ImportForm/index.js.map +0 -1
- package/dist/components/ImportForm/util.js +0 -16
- package/dist/components/ImportForm/util.js.map +0 -1
- package/dist/components/MSAPanel/Loading.js.map +0 -1
- package/dist/components/MSAPanel/MSABlock.js.map +0 -1
- package/dist/components/MSAPanel/MSACanvas.js.map +0 -1
- package/dist/components/MSAPanel/MSAMouseoverCanvas.js.map +0 -1
- package/dist/components/MSAPanel/index.d.ts +0 -5
- package/dist/components/MSAPanel/index.js.map +0 -1
- package/dist/components/MSAPanel/renderMSABlock.js.map +0 -1
- package/dist/components/MSAPanel/renderMSAMouseover.js.map +0 -1
- package/dist/components/Minimap.js.map +0 -1
- package/dist/components/MinimapSVG.js.map +0 -1
- package/dist/components/MultiAlignmentSelector.js.map +0 -1
- package/dist/components/TreePanel/TreeBranchMenu.js.map +0 -1
- package/dist/components/TreePanel/TreeCanvas.js.map +0 -1
- package/dist/components/TreePanel/TreeCanvasBlock.js.map +0 -1
- package/dist/components/TreePanel/TreeNodeMenu.js.map +0 -1
- package/dist/components/TreePanel/TreeRuler.js.map +0 -1
- package/dist/components/TreePanel/dialogs/TreeNodeInfoDialog.js.map +0 -1
- package/dist/components/TreePanel/index.js.map +0 -1
- package/dist/components/TreePanel/renderTreeCanvas.js.map +0 -1
- package/dist/components/VerticalGuide.d.ts +0 -7
- package/dist/components/VerticalGuide.js +0 -30
- package/dist/components/VerticalGuide.js.map +0 -1
- package/dist/components/ZoomControls.js +0 -59
- package/dist/components/ZoomControls.js.map +0 -1
- package/src/SelectedStructuresMixin.ts +0 -59
- package/src/StructureModel.ts +0 -11
- package/src/UniprotTrack.ts +0 -59
- package/src/components/BoxTrack.tsx +0 -33
- package/src/components/BoxTrackBlock.tsx +0 -200
- package/src/components/Header.tsx +0 -99
- package/src/components/HeaderInfoArea.tsx +0 -21
- package/src/components/VerticalGuide.tsx +0 -50
- package/src/components/ZoomControls.tsx +0 -86
- package/dist/components/{MultiAlignmentSelector.js → header/MultiAlignmentSelector.js} +0 -0
- package/dist/components/{ImportForm/index.d.ts → import/ImportForm.d.ts} +0 -0
- package/dist/components/{ImportForm → import}/ImportFormExamples.d.ts +0 -0
- package/dist/components/{ImportForm → import}/data/seq2.d.ts +0 -0
- package/dist/components/{ImportForm → import}/data/seq2.js +0 -0
- package/dist/components/{ImportForm → import}/util.d.ts +0 -0
- package/dist/components/{Minimap.js → minimap/Minimap.js} +0 -0
- package/dist/components/{MinimapSVG.js → minimap/MinimapSVG.js} +0 -0
- package/dist/components/{MSAPanel → msa}/Loading.d.ts +0 -0
- package/dist/components/{MSAPanel → msa}/Loading.js +0 -0
- package/dist/components/{MSAPanel → msa}/MSACanvas.d.ts +0 -0
- package/dist/components/{MSAPanel/MSABlock.d.ts → msa/MSACanvasBlock.d.ts} +0 -0
- package/dist/components/{MSAPanel → msa}/MSAMouseoverCanvas.d.ts +0 -0
- package/dist/components/{MSAPanel → msa}/MSAMouseoverCanvas.js +0 -0
- package/dist/components/{MSAPanel → msa}/renderMSABlock.d.ts +1 -1
- /package/dist/components/{MSAPanel → msa}/renderMSAMouseover.d.ts +0 -0
- /package/dist/components/{MSAPanel → msa}/renderMSAMouseover.js +0 -0
- /package/dist/components/{TreePanel → tree}/TreeBranchMenu.d.ts +0 -0
- /package/dist/components/{TreePanel → tree}/TreeBranchMenu.js +0 -0
- /package/dist/components/{TreePanel → tree}/TreeCanvas.d.ts +0 -0
- /package/dist/components/{TreePanel → tree}/TreeCanvasBlock.d.ts +0 -0
- /package/dist/components/{TreePanel → tree}/TreeNodeMenu.d.ts +0 -0
- /package/dist/components/{TreePanel/index.d.ts → tree/TreePanel.d.ts} +0 -0
- /package/dist/components/{TreePanel → tree}/TreeRuler.d.ts +0 -0
- /package/dist/components/{TreePanel → tree}/TreeRuler.js +0 -0
- /package/dist/components/{TreePanel → tree}/dialogs/TreeNodeInfoDialog.d.ts +0 -0
- /package/dist/components/{TreePanel → tree}/renderTreeCanvas.d.ts +0 -0
- /package/dist/{DataModel.d.ts → model/DataModel.d.ts} +0 -0
- /package/dist/{DataModel.js → model/DataModel.js} +0 -0
- /package/dist/{DialogQueue.d.ts → model/DialogQueue.d.ts} +0 -0
- /package/dist/{DialogQueue.js → model/DialogQueue.js} +0 -0
- /package/src/components/{ImportForm/index.tsx → import/ImportForm.tsx} +0 -0
- /package/src/components/{ImportForm → import}/data/seq2.ts +0 -0
- /package/src/components/{MSAPanel → msa}/Loading.tsx +0 -0
- /package/src/components/{MSAPanel → msa}/MSAMouseoverCanvas.tsx +0 -0
- /package/src/components/{MSAPanel → msa}/renderMSAMouseover.ts +0 -0
- /package/src/components/{TreePanel → tree}/TreeBranchMenu.tsx +0 -0
- /package/src/components/{TreePanel → tree}/TreeRuler.tsx +0 -0
- /package/src/{DataModel.ts → model/DataModel.ts} +0 -0
- /package/src/{DialogQueue.ts → model/DialogQueue.ts} +0 -0
|
@@ -1,200 +0,0 @@
|
|
|
1
|
-
import React, { useRef, useMemo, useEffect } from 'react'
|
|
2
|
-
import { observer } from 'mobx-react'
|
|
3
|
-
import { getSnapshot, isStateTreeNode } from 'mobx-state-tree'
|
|
4
|
-
|
|
5
|
-
// locals
|
|
6
|
-
import { IBoxTrack, MsaViewModel } from '../model'
|
|
7
|
-
import Layout from '../layout'
|
|
8
|
-
|
|
9
|
-
interface Feat {
|
|
10
|
-
start: number
|
|
11
|
-
end: number
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
const BoxTrackBlock = observer(function ({
|
|
15
|
-
track,
|
|
16
|
-
model,
|
|
17
|
-
offsetX,
|
|
18
|
-
}: {
|
|
19
|
-
track: IBoxTrack
|
|
20
|
-
model: MsaViewModel
|
|
21
|
-
offsetX: number
|
|
22
|
-
}) {
|
|
23
|
-
const {
|
|
24
|
-
blockSize,
|
|
25
|
-
colWidth,
|
|
26
|
-
blanks,
|
|
27
|
-
rowHeight,
|
|
28
|
-
highResScaleFactor,
|
|
29
|
-
fontSize,
|
|
30
|
-
scrollX,
|
|
31
|
-
} = model
|
|
32
|
-
const { height, features, associatedRowName } = track.model
|
|
33
|
-
|
|
34
|
-
const feats: Feat[] = isStateTreeNode(features)
|
|
35
|
-
? // @ts-expect-error
|
|
36
|
-
getSnapshot(features)
|
|
37
|
-
: features
|
|
38
|
-
|
|
39
|
-
const layout = useMemo(() => {
|
|
40
|
-
const temp = new Layout()
|
|
41
|
-
|
|
42
|
-
feats?.forEach((feature, index) => {
|
|
43
|
-
const { start, end } = feature
|
|
44
|
-
if (associatedRowName) {
|
|
45
|
-
const s = model.rowSpecificBpToPx(associatedRowName, start - 1)
|
|
46
|
-
const e = model.rowSpecificBpToPx(associatedRowName, end)
|
|
47
|
-
temp.addRect(`${index}`, s, e, rowHeight, feature)
|
|
48
|
-
} else {
|
|
49
|
-
const s = model.globalBpToPx(start - 1)
|
|
50
|
-
const e = model.globalBpToPx(end)
|
|
51
|
-
temp.addRect(`${index}`, s, e, rowHeight, feature)
|
|
52
|
-
}
|
|
53
|
-
})
|
|
54
|
-
return temp
|
|
55
|
-
|
|
56
|
-
// might convert to autorun based drawing
|
|
57
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
58
|
-
}, [rowHeight, feats, associatedRowName, model, blanks])
|
|
59
|
-
|
|
60
|
-
const ref = useRef<HTMLCanvasElement>(null)
|
|
61
|
-
const labelRef = useRef<HTMLCanvasElement>(null)
|
|
62
|
-
const mouseoverRef = useRef<HTMLCanvasElement>(null)
|
|
63
|
-
|
|
64
|
-
useEffect(() => {
|
|
65
|
-
if (!ref.current) {
|
|
66
|
-
return
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
const ctx = ref.current.getContext('2d')
|
|
70
|
-
if (!ctx) {
|
|
71
|
-
return
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
ctx.resetTransform()
|
|
75
|
-
ctx.scale(highResScaleFactor, highResScaleFactor)
|
|
76
|
-
ctx.clearRect(0, 0, blockSize, height)
|
|
77
|
-
ctx.translate(-offsetX, 0)
|
|
78
|
-
ctx.textAlign = 'center'
|
|
79
|
-
ctx.font = ctx.font.replace(/\d+px/, `${fontSize}px`)
|
|
80
|
-
|
|
81
|
-
const xStart = Math.max(0, Math.floor(offsetX / colWidth))
|
|
82
|
-
ctx.fillStyle = 'goldenrod'
|
|
83
|
-
layout.rectangles.forEach(value => {
|
|
84
|
-
const { minX, maxX, minY, maxY } = value
|
|
85
|
-
|
|
86
|
-
const x1 = (minX - xStart) * colWidth + offsetX - (offsetX % colWidth)
|
|
87
|
-
const x2 = (maxX - xStart) * colWidth + offsetX - (offsetX % colWidth)
|
|
88
|
-
|
|
89
|
-
if (x2 - x1 > 0) {
|
|
90
|
-
ctx.fillRect(x1, minY, x2 - x1, (maxY - minY) / 2)
|
|
91
|
-
}
|
|
92
|
-
})
|
|
93
|
-
}, [
|
|
94
|
-
associatedRowName,
|
|
95
|
-
fontSize,
|
|
96
|
-
blockSize,
|
|
97
|
-
colWidth,
|
|
98
|
-
layout.rectangles,
|
|
99
|
-
model,
|
|
100
|
-
rowHeight,
|
|
101
|
-
height,
|
|
102
|
-
offsetX,
|
|
103
|
-
highResScaleFactor,
|
|
104
|
-
features,
|
|
105
|
-
blanks,
|
|
106
|
-
])
|
|
107
|
-
|
|
108
|
-
useEffect(() => {
|
|
109
|
-
if (!labelRef.current) {
|
|
110
|
-
return
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
const ctx = labelRef.current.getContext('2d')
|
|
114
|
-
if (!ctx) {
|
|
115
|
-
return
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
// this logic is very similar to MSACanvas
|
|
119
|
-
ctx.resetTransform()
|
|
120
|
-
ctx.scale(highResScaleFactor, highResScaleFactor)
|
|
121
|
-
ctx.clearRect(0, 0, blockSize, height)
|
|
122
|
-
ctx.translate(-offsetX, 0)
|
|
123
|
-
ctx.textAlign = 'center'
|
|
124
|
-
ctx.font = ctx.font.replace(/\d+px/, `${Math.max(8, rowHeight - 8)}px`)
|
|
125
|
-
|
|
126
|
-
ctx.fillStyle = 'black'
|
|
127
|
-
ctx.textAlign = 'left'
|
|
128
|
-
for (const value of layout.rectangles.values()) {
|
|
129
|
-
const { minX, maxX, maxY, minY, data } = value
|
|
130
|
-
|
|
131
|
-
const x1 = minX * colWidth
|
|
132
|
-
const x2 = maxX * colWidth
|
|
133
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
134
|
-
const feature = data as any
|
|
135
|
-
|
|
136
|
-
if (x2 - x1 > 0) {
|
|
137
|
-
const note = feature.attributes?.Note?.[0]
|
|
138
|
-
const name = feature.attributes?.Name?.[0]
|
|
139
|
-
const type = feature.type
|
|
140
|
-
ctx.fillText(
|
|
141
|
-
[type, name, note].filter(f => !!f).join(' - '),
|
|
142
|
-
Math.max(Math.min(-scrollX, x2), x1),
|
|
143
|
-
minY + (maxY - minY),
|
|
144
|
-
)
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
}, [
|
|
148
|
-
blockSize,
|
|
149
|
-
colWidth,
|
|
150
|
-
scrollX,
|
|
151
|
-
highResScaleFactor,
|
|
152
|
-
height,
|
|
153
|
-
layout.rectangles,
|
|
154
|
-
offsetX,
|
|
155
|
-
features,
|
|
156
|
-
model,
|
|
157
|
-
rowHeight,
|
|
158
|
-
blanks,
|
|
159
|
-
])
|
|
160
|
-
|
|
161
|
-
return !features ? null : (
|
|
162
|
-
<>
|
|
163
|
-
<canvas
|
|
164
|
-
ref={ref}
|
|
165
|
-
height={height * highResScaleFactor}
|
|
166
|
-
width={blockSize * highResScaleFactor}
|
|
167
|
-
style={{
|
|
168
|
-
position: 'absolute',
|
|
169
|
-
left: scrollX + offsetX,
|
|
170
|
-
width: blockSize,
|
|
171
|
-
height,
|
|
172
|
-
}}
|
|
173
|
-
/>
|
|
174
|
-
<canvas
|
|
175
|
-
ref={labelRef}
|
|
176
|
-
height={height * highResScaleFactor}
|
|
177
|
-
width={blockSize * highResScaleFactor}
|
|
178
|
-
style={{
|
|
179
|
-
position: 'absolute',
|
|
180
|
-
left: scrollX + offsetX,
|
|
181
|
-
width: blockSize,
|
|
182
|
-
height,
|
|
183
|
-
}}
|
|
184
|
-
/>
|
|
185
|
-
<canvas
|
|
186
|
-
ref={mouseoverRef}
|
|
187
|
-
height={height * highResScaleFactor}
|
|
188
|
-
width={blockSize * highResScaleFactor}
|
|
189
|
-
style={{
|
|
190
|
-
position: 'absolute',
|
|
191
|
-
left: scrollX + offsetX,
|
|
192
|
-
width: blockSize,
|
|
193
|
-
height,
|
|
194
|
-
}}
|
|
195
|
-
/>
|
|
196
|
-
</>
|
|
197
|
-
)
|
|
198
|
-
})
|
|
199
|
-
|
|
200
|
-
export default BoxTrackBlock
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
import React, { Suspense, lazy, useState } from 'react'
|
|
2
|
-
import { IconButton } from '@mui/material'
|
|
3
|
-
import { observer } from 'mobx-react'
|
|
4
|
-
|
|
5
|
-
// locals
|
|
6
|
-
import { MsaViewModel } from '../model'
|
|
7
|
-
|
|
8
|
-
// icons
|
|
9
|
-
import FolderOpen from '@mui/icons-material/FolderOpen'
|
|
10
|
-
import Settings from '@mui/icons-material/Settings'
|
|
11
|
-
import Help from '@mui/icons-material/Help'
|
|
12
|
-
import Assignment from '@mui/icons-material/Assignment'
|
|
13
|
-
import List from '@mui/icons-material/List'
|
|
14
|
-
|
|
15
|
-
// locals
|
|
16
|
-
import ZoomControls from './ZoomControls'
|
|
17
|
-
import MultiAlignmentSelector from './MultiAlignmentSelector'
|
|
18
|
-
import HeaderInfoArea from './HeaderInfoArea'
|
|
19
|
-
|
|
20
|
-
const SettingsDialog = lazy(() => import('./dialogs/SettingsDialog'))
|
|
21
|
-
const AboutDialog = lazy(() => import('./dialogs/AboutDialog'))
|
|
22
|
-
const MetadataDialog = lazy(() => import('./dialogs/MetadataDialog'))
|
|
23
|
-
const TracklistDialog = lazy(() => import('./dialogs/TracklistDialog'))
|
|
24
|
-
|
|
25
|
-
const Header = observer(function ({ model }: { model: MsaViewModel }) {
|
|
26
|
-
const [settingsDialogViz, setSettingsDialogViz] = useState(false)
|
|
27
|
-
const [aboutDialogViz, setAboutDialogViz] = useState(false)
|
|
28
|
-
const [detailsDialogViz, setMetadataDialogViz] = useState(false)
|
|
29
|
-
const [tracklistDialogViz, setTracklistDialogViz] = useState(false)
|
|
30
|
-
|
|
31
|
-
return (
|
|
32
|
-
<div style={{ display: 'flex' }}>
|
|
33
|
-
<IconButton
|
|
34
|
-
onClick={async () => {
|
|
35
|
-
try {
|
|
36
|
-
model.setData({ tree: '', msa: '' })
|
|
37
|
-
model.clearSelectedStructures()
|
|
38
|
-
model.setScrollY(0)
|
|
39
|
-
model.setScrollX(0)
|
|
40
|
-
model.setCurrentAlignment(0)
|
|
41
|
-
await model.setTreeFilehandle(undefined)
|
|
42
|
-
await model.setMSAFilehandle(undefined)
|
|
43
|
-
} catch (e) {
|
|
44
|
-
console.error(e)
|
|
45
|
-
model.setError(e)
|
|
46
|
-
}
|
|
47
|
-
}}
|
|
48
|
-
>
|
|
49
|
-
<FolderOpen />
|
|
50
|
-
</IconButton>
|
|
51
|
-
<IconButton onClick={() => setSettingsDialogViz(true)}>
|
|
52
|
-
<Settings />
|
|
53
|
-
</IconButton>
|
|
54
|
-
<IconButton onClick={() => setMetadataDialogViz(true)}>
|
|
55
|
-
<Assignment />
|
|
56
|
-
</IconButton>
|
|
57
|
-
<IconButton onClick={() => setTracklistDialogViz(true)}>
|
|
58
|
-
<List />
|
|
59
|
-
</IconButton>
|
|
60
|
-
<Suspense fallback={null}>
|
|
61
|
-
{settingsDialogViz ? (
|
|
62
|
-
<SettingsDialog
|
|
63
|
-
model={model}
|
|
64
|
-
onClose={() => setSettingsDialogViz(false)}
|
|
65
|
-
/>
|
|
66
|
-
) : null}
|
|
67
|
-
{aboutDialogViz ? (
|
|
68
|
-
<AboutDialog onClose={() => setAboutDialogViz(false)} />
|
|
69
|
-
) : null}
|
|
70
|
-
{detailsDialogViz ? (
|
|
71
|
-
<MetadataDialog
|
|
72
|
-
model={model}
|
|
73
|
-
onClose={() => setMetadataDialogViz(false)}
|
|
74
|
-
/>
|
|
75
|
-
) : null}
|
|
76
|
-
|
|
77
|
-
{tracklistDialogViz ? (
|
|
78
|
-
<TracklistDialog
|
|
79
|
-
model={model}
|
|
80
|
-
onClose={() => setTracklistDialogViz(false)}
|
|
81
|
-
/>
|
|
82
|
-
) : null}
|
|
83
|
-
</Suspense>
|
|
84
|
-
<MultiAlignmentSelector model={model} />
|
|
85
|
-
<ZoomControls model={model} />
|
|
86
|
-
<HeaderInfoArea model={model} />
|
|
87
|
-
<Spacer />
|
|
88
|
-
<IconButton onClick={() => setAboutDialogViz(true)}>
|
|
89
|
-
<Help />
|
|
90
|
-
</IconButton>
|
|
91
|
-
</div>
|
|
92
|
-
)
|
|
93
|
-
})
|
|
94
|
-
|
|
95
|
-
function Spacer() {
|
|
96
|
-
return <div style={{ flex: 1 }} />
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
export default Header
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import React from 'react'
|
|
2
|
-
import { Typography } from '@mui/material'
|
|
3
|
-
import { observer } from 'mobx-react'
|
|
4
|
-
|
|
5
|
-
// locals
|
|
6
|
-
import { MsaViewModel } from '../model'
|
|
7
|
-
|
|
8
|
-
const HeaderInfoArea = observer(({ model }: { model: MsaViewModel }) => {
|
|
9
|
-
const { mouseOverRowName, mouseCol } = model
|
|
10
|
-
return (
|
|
11
|
-
<div>
|
|
12
|
-
{mouseOverRowName && mouseCol !== undefined ? (
|
|
13
|
-
<Typography>
|
|
14
|
-
{mouseOverRowName}:{model.relativePxToBp(mouseOverRowName, mouseCol)}
|
|
15
|
-
</Typography>
|
|
16
|
-
) : null}
|
|
17
|
-
</div>
|
|
18
|
-
)
|
|
19
|
-
})
|
|
20
|
-
|
|
21
|
-
export default HeaderInfoArea
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import React from 'react'
|
|
2
|
-
|
|
3
|
-
import { observer } from 'mobx-react'
|
|
4
|
-
import { makeStyles } from 'tss-react/mui'
|
|
5
|
-
import { Tooltip } from '@mui/material'
|
|
6
|
-
|
|
7
|
-
// icons
|
|
8
|
-
import { MsaViewModel } from '../model'
|
|
9
|
-
|
|
10
|
-
const useStyles = makeStyles()({
|
|
11
|
-
guide: {
|
|
12
|
-
pointerEvents: 'none',
|
|
13
|
-
height: '100%',
|
|
14
|
-
width: 1,
|
|
15
|
-
position: 'absolute',
|
|
16
|
-
zIndex: 10,
|
|
17
|
-
},
|
|
18
|
-
})
|
|
19
|
-
|
|
20
|
-
const VerticalGuide = observer(function ({
|
|
21
|
-
model,
|
|
22
|
-
coordX,
|
|
23
|
-
}: {
|
|
24
|
-
model: MsaViewModel
|
|
25
|
-
coordX: number
|
|
26
|
-
}) {
|
|
27
|
-
const { treeAreaWidth } = model
|
|
28
|
-
const { classes } = useStyles()
|
|
29
|
-
return (
|
|
30
|
-
<>
|
|
31
|
-
<Tooltip open placement="top" title={`${model.pxToBp(coordX) + 1}`} arrow>
|
|
32
|
-
<div
|
|
33
|
-
style={{
|
|
34
|
-
left: coordX + treeAreaWidth,
|
|
35
|
-
position: 'absolute',
|
|
36
|
-
height: 1,
|
|
37
|
-
}}
|
|
38
|
-
/>
|
|
39
|
-
</Tooltip>
|
|
40
|
-
<div
|
|
41
|
-
className={classes.guide}
|
|
42
|
-
style={{
|
|
43
|
-
left: coordX + treeAreaWidth,
|
|
44
|
-
background: 'red',
|
|
45
|
-
}}
|
|
46
|
-
/>
|
|
47
|
-
</>
|
|
48
|
-
)
|
|
49
|
-
})
|
|
50
|
-
export default VerticalGuide
|
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
import React, { Suspense, lazy, useState } from 'react'
|
|
2
|
-
import { IconButton } from '@mui/material'
|
|
3
|
-
import { observer } from 'mobx-react'
|
|
4
|
-
import CascadingMenuButton from '@jbrowse/core/ui/CascadingMenuButton'
|
|
5
|
-
|
|
6
|
-
// locals
|
|
7
|
-
import { MsaViewModel } from '../model'
|
|
8
|
-
|
|
9
|
-
// icons
|
|
10
|
-
import MoreVert from '@mui/icons-material/MoreVert'
|
|
11
|
-
import ZoomIn from '@mui/icons-material/ZoomIn'
|
|
12
|
-
import ZoomOut from '@mui/icons-material/ZoomOut'
|
|
13
|
-
|
|
14
|
-
// lazies
|
|
15
|
-
const ExportSVGDialog = lazy(() => import('./ExportSVGDialog'))
|
|
16
|
-
|
|
17
|
-
const ZoomControls = observer(function ZoomControls({
|
|
18
|
-
model,
|
|
19
|
-
}: {
|
|
20
|
-
model: MsaViewModel
|
|
21
|
-
}) {
|
|
22
|
-
const { colWidth, rowHeight } = model
|
|
23
|
-
const [exportSvgDialogOpen, setExportSvgDialogOpen] = useState(false)
|
|
24
|
-
return (
|
|
25
|
-
<>
|
|
26
|
-
<IconButton
|
|
27
|
-
onClick={() => {
|
|
28
|
-
model.setColWidth(Math.ceil(colWidth * 1.5))
|
|
29
|
-
model.setRowHeight(Math.ceil(rowHeight * 1.5))
|
|
30
|
-
}}
|
|
31
|
-
>
|
|
32
|
-
<ZoomIn />
|
|
33
|
-
</IconButton>
|
|
34
|
-
<IconButton
|
|
35
|
-
onClick={() => {
|
|
36
|
-
model.setColWidth(Math.max(1, Math.floor(colWidth * 0.75)))
|
|
37
|
-
model.setRowHeight(Math.max(1.5, Math.floor(rowHeight * 0.75)))
|
|
38
|
-
}}
|
|
39
|
-
>
|
|
40
|
-
<ZoomOut />
|
|
41
|
-
</IconButton>
|
|
42
|
-
<CascadingMenuButton
|
|
43
|
-
menuItems={[
|
|
44
|
-
{
|
|
45
|
-
label: 'Decrease row height',
|
|
46
|
-
onClick: () => model.setRowHeight(Math.max(1.5, rowHeight * 0.75)),
|
|
47
|
-
},
|
|
48
|
-
{
|
|
49
|
-
label: 'Increase row height',
|
|
50
|
-
onClick: () => model.setRowHeight(rowHeight * 1.5),
|
|
51
|
-
},
|
|
52
|
-
{
|
|
53
|
-
label: 'Decrease col width',
|
|
54
|
-
onClick: () => model.setColWidth(Math.max(1, colWidth * 0.75)),
|
|
55
|
-
},
|
|
56
|
-
{
|
|
57
|
-
label: 'Increase col width',
|
|
58
|
-
onClick: () => model.setColWidth(colWidth * 1.5),
|
|
59
|
-
},
|
|
60
|
-
{
|
|
61
|
-
label: 'Reset zoom to default',
|
|
62
|
-
onClick: () => {
|
|
63
|
-
model.setColWidth(16)
|
|
64
|
-
model.setRowHeight(20)
|
|
65
|
-
},
|
|
66
|
-
},
|
|
67
|
-
{
|
|
68
|
-
label: 'Export SVG',
|
|
69
|
-
onClick: () => setExportSvgDialogOpen(true),
|
|
70
|
-
},
|
|
71
|
-
]}
|
|
72
|
-
>
|
|
73
|
-
<MoreVert />
|
|
74
|
-
</CascadingMenuButton>
|
|
75
|
-
{exportSvgDialogOpen ? (
|
|
76
|
-
<Suspense fallback={null}>
|
|
77
|
-
<ExportSVGDialog
|
|
78
|
-
model={model}
|
|
79
|
-
onClose={() => setExportSvgDialogOpen(false)}
|
|
80
|
-
/>
|
|
81
|
-
</Suspense>
|
|
82
|
-
) : null}
|
|
83
|
-
</>
|
|
84
|
-
)
|
|
85
|
-
})
|
|
86
|
-
export default ZoomControls
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { MsaViewModel } from '../../model';
|
|
2
1
|
import { Theme } from '@mui/material';
|
|
2
|
+
import { MsaViewModel } from '../../model';
|
|
3
3
|
export declare function renderMSABlock({ model, offsetX, offsetY, contrastScheme, ctx, theme, highResScaleFactorOverride, blockSizeXOverride, blockSizeYOverride, }: {
|
|
4
4
|
offsetX: number;
|
|
5
5
|
offsetY: number;
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|