react-msaview 2.1.5 → 3.0.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 (199) hide show
  1. package/bundle/index.js +37 -255
  2. package/dist/DialogQueue.d.ts +25 -0
  3. package/dist/DialogQueue.js +46 -0
  4. package/dist/DialogQueue.js.map +1 -0
  5. package/dist/UniprotTrack.js.map +1 -1
  6. package/dist/colorSchemes.js.map +1 -1
  7. package/dist/components/BoxTrackBlock.js +3 -2
  8. package/dist/components/BoxTrackBlock.js.map +1 -1
  9. package/dist/components/Header.js +12 -20
  10. package/dist/components/Header.js.map +1 -1
  11. package/dist/components/HeaderInfoArea.d.ts +6 -0
  12. package/dist/components/HeaderInfoArea.js +12 -0
  13. package/dist/components/HeaderInfoArea.js.map +1 -0
  14. package/dist/components/ImportForm/ImportFormExamples.d.ts +6 -0
  15. package/dist/components/ImportForm/ImportFormExamples.js +50 -0
  16. package/dist/components/ImportForm/ImportFormExamples.js.map +1 -0
  17. package/dist/components/ImportForm/data/seq2.js.map +1 -0
  18. package/dist/components/{ImportForm.d.ts → ImportForm/index.d.ts} +1 -1
  19. package/dist/components/ImportForm/index.js +31 -0
  20. package/dist/components/ImportForm/index.js.map +1 -0
  21. package/dist/components/ImportForm/util.d.ts +3 -0
  22. package/dist/components/ImportForm/util.js +15 -0
  23. package/dist/components/ImportForm/util.js.map +1 -0
  24. package/dist/components/MSAPanel/Loading.d.ts +2 -0
  25. package/dist/components/MSAPanel/Loading.js +12 -0
  26. package/dist/components/MSAPanel/Loading.js.map +1 -0
  27. package/dist/components/{MSABlock.d.ts → MSAPanel/MSABlock.d.ts} +1 -1
  28. package/dist/components/MSAPanel/MSABlock.js +46 -0
  29. package/dist/components/MSAPanel/MSABlock.js.map +1 -0
  30. package/dist/components/{MSACanvas.d.ts → MSAPanel/MSACanvas.d.ts} +1 -1
  31. package/dist/components/{MSACanvas.js → MSAPanel/MSACanvas.js} +2 -4
  32. package/dist/components/MSAPanel/MSACanvas.js.map +1 -0
  33. package/dist/components/{MSAMouseoverCanvas.d.ts → MSAPanel/MSAMouseoverCanvas.d.ts} +1 -1
  34. package/dist/components/MSAPanel/MSAMouseoverCanvas.js +29 -0
  35. package/dist/components/MSAPanel/MSAMouseoverCanvas.js.map +1 -0
  36. package/dist/components/MSAPanel/index.d.ts +5 -0
  37. package/dist/components/MSAPanel/index.js +9 -0
  38. package/dist/components/MSAPanel/index.js.map +1 -0
  39. package/dist/components/MSAPanel/renderMSABlock.d.ts +8 -0
  40. package/dist/components/MSAPanel/renderMSABlock.js +80 -0
  41. package/dist/components/MSAPanel/renderMSABlock.js.map +1 -0
  42. package/dist/components/MSAPanel/renderMSAMouseover.d.ts +5 -0
  43. package/dist/components/MSAPanel/renderMSAMouseover.js +24 -0
  44. package/dist/components/MSAPanel/renderMSAMouseover.js.map +1 -0
  45. package/dist/components/MSAView.d.ts +2 -2
  46. package/dist/components/MSAView.js +26 -31
  47. package/dist/components/MSAView.js.map +1 -1
  48. package/dist/components/Minimap.d.ts +6 -0
  49. package/dist/components/Minimap.js +72 -0
  50. package/dist/components/Minimap.js.map +1 -0
  51. package/dist/components/ResizeHandles.js.map +1 -1
  52. package/dist/components/TextTrack.js +3 -2
  53. package/dist/components/TextTrack.js.map +1 -1
  54. package/dist/components/Track.js +5 -5
  55. package/dist/components/Track.js.map +1 -1
  56. package/dist/components/{TreeBranchMenu.d.ts → TreePanel/TreeBranchMenu.d.ts} +1 -1
  57. package/dist/components/TreePanel/TreeBranchMenu.js.map +1 -0
  58. package/dist/components/{TreeCanvas.d.ts → TreePanel/TreeCanvas.d.ts} +1 -1
  59. package/dist/components/{TreeCanvas.js → TreePanel/TreeCanvas.js} +1 -1
  60. package/dist/components/TreePanel/TreeCanvas.js.map +1 -0
  61. package/dist/components/{TreeCanvasBlock.d.ts → TreePanel/TreeCanvasBlock.d.ts} +1 -1
  62. package/dist/components/TreePanel/TreeCanvasBlock.js +121 -0
  63. package/dist/components/TreePanel/TreeCanvasBlock.js.map +1 -0
  64. package/dist/components/{TreeMenu.d.ts → TreePanel/TreeNodeMenu.d.ts} +2 -1
  65. package/dist/components/{TreeMenu.js → TreePanel/TreeNodeMenu.js} +16 -8
  66. package/dist/components/TreePanel/TreeNodeMenu.js.map +1 -0
  67. package/dist/components/{TreeRuler.d.ts → TreePanel/TreeRuler.d.ts} +1 -1
  68. package/dist/components/TreePanel/TreeRuler.js +8 -0
  69. package/dist/components/TreePanel/TreeRuler.js.map +1 -0
  70. package/dist/components/{dialogs/TreeNodeInfoDlg.d.ts → TreePanel/dialogs/TreeNodeInfoDialog.d.ts} +1 -1
  71. package/dist/components/{dialogs/TreeNodeInfoDlg.js → TreePanel/dialogs/TreeNodeInfoDialog.js} +2 -2
  72. package/dist/components/TreePanel/dialogs/TreeNodeInfoDialog.js.map +1 -0
  73. package/dist/components/TreePanel/index.d.ts +6 -0
  74. package/dist/components/TreePanel/index.js +10 -0
  75. package/dist/components/TreePanel/index.js.map +1 -0
  76. package/dist/components/TreePanel/renderTreeCanvas.d.ts +41 -0
  77. package/dist/components/TreePanel/renderTreeCanvas.js +154 -0
  78. package/dist/components/TreePanel/renderTreeCanvas.js.map +1 -0
  79. package/dist/components/dialogs/{AboutDlg.js → AboutDialog.js} +1 -1
  80. package/dist/components/dialogs/AboutDialog.js.map +1 -0
  81. package/dist/components/dialogs/{AddTrackDlg.js → AddTrackDialog.js} +1 -1
  82. package/dist/components/dialogs/AddTrackDialog.js.map +1 -0
  83. package/dist/components/dialogs/{MetadataDlg.js → MetadataDialog.js} +1 -1
  84. package/dist/components/dialogs/MetadataDialog.js.map +1 -0
  85. package/dist/components/dialogs/SettingsDialog.js +63 -0
  86. package/dist/components/dialogs/SettingsDialog.js.map +1 -0
  87. package/dist/components/dialogs/{TrackInfoDlg.js → TrackInfoDialog.js} +1 -1
  88. package/dist/components/dialogs/TrackInfoDialog.js.map +1 -0
  89. package/dist/components/dialogs/{TracklistDlg.js → TracklistDialog.js} +1 -1
  90. package/dist/components/dialogs/TracklistDialog.js.map +1 -0
  91. package/dist/components/util.js.map +1 -1
  92. package/dist/layout.js.map +1 -1
  93. package/dist/model.d.ts +179 -88
  94. package/dist/model.js +287 -175
  95. package/dist/model.js.map +1 -1
  96. package/dist/parseNewick.js.map +1 -1
  97. package/dist/parsers/ClustalMSA.d.ts +1 -1
  98. package/dist/parsers/ClustalMSA.js +1 -1
  99. package/dist/parsers/ClustalMSA.js.map +1 -1
  100. package/dist/parsers/FastaMSA.d.ts +1 -1
  101. package/dist/parsers/FastaMSA.js +2 -2
  102. package/dist/parsers/FastaMSA.js.map +1 -1
  103. package/dist/parsers/StockholmMSA.d.ts +1 -1
  104. package/dist/parsers/StockholmMSA.js +2 -2
  105. package/dist/parsers/StockholmMSA.js.map +1 -1
  106. package/dist/util.d.ts +1 -0
  107. package/dist/util.js +15 -7
  108. package/dist/util.js.map +1 -1
  109. package/dist/version.d.ts +1 -1
  110. package/dist/version.js +1 -1
  111. package/package.json +6 -4
  112. package/src/DialogQueue.ts +47 -0
  113. package/src/components/BoxTrackBlock.tsx +3 -1
  114. package/src/components/Header.tsx +13 -20
  115. package/src/components/HeaderInfoArea.tsx +21 -0
  116. package/src/components/ImportForm/ImportFormExamples.tsx +133 -0
  117. package/src/components/ImportForm/index.tsx +63 -0
  118. package/src/components/ImportForm/util.ts +20 -0
  119. package/src/components/MSAPanel/Loading.tsx +16 -0
  120. package/src/components/MSAPanel/MSABlock.tsx +81 -0
  121. package/src/components/{MSACanvas.tsx → MSAPanel/MSACanvas.tsx} +3 -6
  122. package/src/components/MSAPanel/MSAMouseoverCanvas.tsx +44 -0
  123. package/src/components/MSAPanel/index.tsx +13 -0
  124. package/src/components/MSAPanel/renderMSABlock.ts +158 -0
  125. package/src/components/MSAPanel/renderMSAMouseover.ts +51 -0
  126. package/src/components/MSAView.tsx +36 -56
  127. package/src/components/Minimap.tsx +102 -0
  128. package/src/components/TextTrack.tsx +3 -1
  129. package/src/components/Track.tsx +5 -5
  130. package/src/components/{TreeBranchMenu.tsx → TreePanel/TreeBranchMenu.tsx} +1 -1
  131. package/src/components/{TreeCanvas.tsx → TreePanel/TreeCanvas.tsx} +2 -3
  132. package/src/components/TreePanel/TreeCanvasBlock.tsx +195 -0
  133. package/src/components/{TreeMenu.tsx → TreePanel/TreeNodeMenu.tsx} +21 -8
  134. package/src/components/{TreeRuler.tsx → TreePanel/TreeRuler.tsx} +3 -3
  135. package/src/components/{dialogs/TreeNodeInfoDlg.tsx → TreePanel/dialogs/TreeNodeInfoDialog.tsx} +2 -2
  136. package/src/components/TreePanel/index.tsx +16 -0
  137. package/src/components/TreePanel/renderTreeCanvas.ts +254 -0
  138. package/src/components/dialogs/SettingsDialog.tsx +196 -0
  139. package/src/model.ts +414 -211
  140. package/src/parsers/ClustalMSA.ts +1 -1
  141. package/src/parsers/FastaMSA.ts +1 -1
  142. package/src/parsers/StockholmMSA.ts +1 -1
  143. package/src/util.ts +19 -6
  144. package/src/version.ts +1 -1
  145. package/dist/components/ImportForm.js +0 -84
  146. package/dist/components/ImportForm.js.map +0 -1
  147. package/dist/components/MSABlock.js +0 -103
  148. package/dist/components/MSABlock.js.map +0 -1
  149. package/dist/components/MSACanvas.js.map +0 -1
  150. package/dist/components/MSAMouseoverCanvas.js +0 -61
  151. package/dist/components/MSAMouseoverCanvas.js.map +0 -1
  152. package/dist/components/Rubberband.d.ts +0 -8
  153. package/dist/components/Rubberband.js +0 -173
  154. package/dist/components/Rubberband.js.map +0 -1
  155. package/dist/components/Ruler.d.ts +0 -6
  156. package/dist/components/Ruler.js +0 -52
  157. package/dist/components/Ruler.js.map +0 -1
  158. package/dist/components/TreeBranchMenu.js.map +0 -1
  159. package/dist/components/TreeCanvas.js.map +0 -1
  160. package/dist/components/TreeCanvasBlock.js +0 -255
  161. package/dist/components/TreeCanvasBlock.js.map +0 -1
  162. package/dist/components/TreeMenu.js.map +0 -1
  163. package/dist/components/TreeRuler.js +0 -8
  164. package/dist/components/TreeRuler.js.map +0 -1
  165. package/dist/components/data/seq2.js.map +0 -1
  166. package/dist/components/dialogs/AboutDlg.js.map +0 -1
  167. package/dist/components/dialogs/AddTrackDlg.js.map +0 -1
  168. package/dist/components/dialogs/AnnotationDlg.d.ts +0 -11
  169. package/dist/components/dialogs/AnnotationDlg.js +0 -65
  170. package/dist/components/dialogs/AnnotationDlg.js.map +0 -1
  171. package/dist/components/dialogs/MetadataDlg.js.map +0 -1
  172. package/dist/components/dialogs/SettingsDlg.js +0 -48
  173. package/dist/components/dialogs/SettingsDlg.js.map +0 -1
  174. package/dist/components/dialogs/TrackInfoDlg.js.map +0 -1
  175. package/dist/components/dialogs/TracklistDlg.js.map +0 -1
  176. package/dist/components/dialogs/TreeNodeInfoDlg.js.map +0 -1
  177. package/src/components/ImportForm.tsx +0 -192
  178. package/src/components/MSABlock.tsx +0 -164
  179. package/src/components/MSAMouseoverCanvas.tsx +0 -99
  180. package/src/components/Rubberband.tsx +0 -270
  181. package/src/components/Ruler.tsx +0 -123
  182. package/src/components/TreeCanvasBlock.tsx +0 -363
  183. package/src/components/dialogs/AnnotationDlg.tsx +0 -144
  184. package/src/components/dialogs/SettingsDlg.tsx +0 -154
  185. /package/dist/components/{data → ImportForm/data}/seq2.d.ts +0 -0
  186. /package/dist/components/{data → ImportForm/data}/seq2.js +0 -0
  187. /package/dist/components/{TreeBranchMenu.js → TreePanel/TreeBranchMenu.js} +0 -0
  188. /package/dist/components/dialogs/{AboutDlg.d.ts → AboutDialog.d.ts} +0 -0
  189. /package/dist/components/dialogs/{AddTrackDlg.d.ts → AddTrackDialog.d.ts} +0 -0
  190. /package/dist/components/dialogs/{MetadataDlg.d.ts → MetadataDialog.d.ts} +0 -0
  191. /package/dist/components/dialogs/{SettingsDlg.d.ts → SettingsDialog.d.ts} +0 -0
  192. /package/dist/components/dialogs/{TrackInfoDlg.d.ts → TrackInfoDialog.d.ts} +0 -0
  193. /package/dist/components/dialogs/{TracklistDlg.d.ts → TracklistDialog.d.ts} +0 -0
  194. /package/src/components/{data → ImportForm/data}/seq2.ts +0 -0
  195. /package/src/components/dialogs/{AboutDlg.tsx → AboutDialog.tsx} +0 -0
  196. /package/src/components/dialogs/{AddTrackDlg.tsx → AddTrackDialog.tsx} +0 -0
  197. /package/src/components/dialogs/{MetadataDlg.tsx → MetadataDialog.tsx} +0 -0
  198. /package/src/components/dialogs/{TrackInfoDlg.tsx → TrackInfoDialog.tsx} +0 -0
  199. /package/src/components/dialogs/{TracklistDlg.tsx → TracklistDialog.tsx} +0 -0
@@ -1,270 +0,0 @@
1
- import React, { useRef, useEffect, useState } from 'react'
2
- import { observer } from 'mobx-react'
3
- import { makeStyles } from 'tss-react/mui'
4
- import { Popover, Typography, alpha } from '@mui/material'
5
- import { Menu } from '@jbrowse/core/ui'
6
-
7
- // icons
8
- import AssignmentIcon from '@mui/icons-material/Assignment'
9
-
10
- // locals
11
- import { MsaViewModel } from '../model'
12
- import VerticalGuide from './VerticalGuide'
13
-
14
- const useStyles = makeStyles()(theme => {
15
- const background =
16
- 'tertiary' in theme.palette && theme.palette.tertiary
17
- ? alpha(theme.palette.tertiary.main, 0.7)
18
- : alpha(theme.palette.primary.main, 0.7)
19
- return {
20
- rubberband: {
21
- height: '100%',
22
- background,
23
- position: 'absolute',
24
- zIndex: 10,
25
- textAlign: 'center',
26
- overflow: 'hidden',
27
- },
28
- rubberbandControl: {
29
- cursor: 'crosshair',
30
- width: '100%',
31
- minHeight: 8,
32
- },
33
- rubberbandText: {
34
- color: theme.palette.tertiary
35
- ? theme.palette.tertiary.contrastText
36
- : theme.palette.primary.contrastText,
37
- },
38
- popover: {
39
- mouseEvents: 'none',
40
- cursor: 'crosshair',
41
- },
42
- paper: {
43
- paddingLeft: theme.spacing(1),
44
- paddingRight: theme.spacing(1),
45
- },
46
- }
47
- })
48
-
49
- function Rubberband({
50
- model,
51
- ControlComponent = <div />,
52
- }: {
53
- model: MsaViewModel
54
- ControlComponent?: React.ReactElement
55
- }) {
56
- const { treeAreaWidth } = model
57
- const [startX, setStartX] = useState<number>()
58
- const [currentX, setCurrentX] = useState<number>()
59
-
60
- // clientX and clientY used for anchorPosition for menu
61
- // offsetX used for calculations about width of selection
62
- const [anchorPosition, setAnchorPosition] = useState<{
63
- offsetX: number
64
- clientX: number
65
- clientY: number
66
- }>()
67
- const [guideX, setGuideX] = useState<number | undefined>()
68
- const controlsRef = useRef<HTMLDivElement>(null)
69
- const rubberbandRef = useRef(null)
70
- const { classes } = useStyles()
71
- const mouseDragging = startX !== undefined && anchorPosition === undefined
72
-
73
- useEffect(() => {
74
- function globalMouseMove(event: MouseEvent) {
75
- if (controlsRef.current && mouseDragging) {
76
- const relativeX =
77
- event.clientX - controlsRef.current.getBoundingClientRect().left
78
- setCurrentX(relativeX)
79
- }
80
- }
81
-
82
- function globalMouseUp(event: MouseEvent) {
83
- if (startX !== undefined && controlsRef.current) {
84
- const { clientX, clientY } = event
85
- const ref = controlsRef.current
86
- const offsetX = clientX - ref.getBoundingClientRect().left
87
- // as stated above, store both clientX/Y and offsetX for different
88
- // purposes
89
- setAnchorPosition({
90
- offsetX,
91
- clientX,
92
- clientY,
93
- })
94
- setGuideX(undefined)
95
- }
96
- }
97
- if (mouseDragging) {
98
- window.addEventListener('mousemove', globalMouseMove)
99
- window.addEventListener('mouseup', globalMouseUp)
100
- return () => {
101
- window.removeEventListener('mousemove', globalMouseMove)
102
- window.removeEventListener('mouseup', globalMouseUp)
103
- }
104
- }
105
- return () => {}
106
- }, [startX, mouseDragging, anchorPosition])
107
-
108
- useEffect(() => {
109
- if (
110
- !mouseDragging &&
111
- currentX !== undefined &&
112
- startX !== undefined &&
113
- Math.abs(currentX - startX) <= 3
114
- ) {
115
- handleClose()
116
- }
117
- }, [mouseDragging, currentX, startX, model.colWidth])
118
-
119
- function mouseDown(event: React.MouseEvent<HTMLDivElement>) {
120
- event.preventDefault()
121
- event.stopPropagation()
122
- const relativeX =
123
- event.clientX -
124
- (event.target as HTMLDivElement).getBoundingClientRect().left
125
- setStartX(relativeX)
126
- setCurrentX(relativeX)
127
- }
128
-
129
- function mouseMove(event: React.MouseEvent<HTMLDivElement>) {
130
- const target = event.target as HTMLDivElement
131
- setGuideX(event.clientX - target.getBoundingClientRect().left)
132
- }
133
-
134
- function mouseOut() {
135
- setGuideX(undefined)
136
- model.clearAnnotationClickBoundaries()
137
- }
138
-
139
- function handleClose() {
140
- setAnchorPosition(undefined)
141
- setStartX(undefined)
142
- setCurrentX(undefined)
143
- }
144
-
145
- function handleMenuItemClick(_: unknown, callback: Function) {
146
- callback()
147
- handleClose()
148
- }
149
-
150
- if (startX === undefined) {
151
- return (
152
- <>
153
- {guideX !== undefined ? (
154
- <VerticalGuide model={model} coordX={guideX} />
155
- ) : null}
156
- <div
157
- data-testid="rubberband_controls"
158
- className={classes.rubberbandControl}
159
- role="presentation"
160
- ref={controlsRef}
161
- onMouseDown={mouseDown}
162
- onMouseOut={mouseOut}
163
- onMouseMove={mouseMove}
164
- >
165
- {ControlComponent}
166
- </div>
167
- </>
168
- )
169
- }
170
-
171
- const right = anchorPosition ? anchorPosition.offsetX : currentX || 0
172
- const left = right < startX ? right : startX
173
- const width = Math.abs(right - startX)
174
- const leftBpOffset = model.pxToBp(left)
175
- const rightBpOffset = model.pxToBp(left + width)
176
- const numOfBpSelected = Math.ceil(width / model.colWidth)
177
-
178
- const menuItems = [
179
- {
180
- label: 'Create annotation',
181
- icon: AssignmentIcon,
182
- onClick: () => {
183
- model.setAnnotationClickBoundaries(leftBpOffset, rightBpOffset)
184
- handleClose()
185
- },
186
- },
187
- ]
188
- return (
189
- <>
190
- {rubberbandRef.current ? (
191
- <>
192
- <Popover
193
- className={classes.popover}
194
- classes={{
195
- paper: classes.paper,
196
- }}
197
- open
198
- anchorEl={rubberbandRef.current}
199
- anchorOrigin={{
200
- vertical: 'top',
201
- horizontal: 'left',
202
- }}
203
- transformOrigin={{
204
- vertical: 'bottom',
205
- horizontal: 'right',
206
- }}
207
- keepMounted
208
- disableRestoreFocus
209
- >
210
- <Typography>{leftBpOffset + 1}</Typography>
211
- </Popover>
212
- <Popover
213
- className={classes.popover}
214
- classes={{
215
- paper: classes.paper,
216
- }}
217
- open
218
- anchorEl={rubberbandRef.current}
219
- anchorOrigin={{
220
- vertical: 'top',
221
- horizontal: 'right',
222
- }}
223
- transformOrigin={{
224
- vertical: 'bottom',
225
- horizontal: 'left',
226
- }}
227
- keepMounted
228
- disableRestoreFocus
229
- >
230
- <Typography>{rightBpOffset + 1}</Typography>
231
- </Popover>
232
- </>
233
- ) : null}
234
- <div
235
- ref={rubberbandRef}
236
- className={classes.rubberband}
237
- style={{ left: left + treeAreaWidth, width }}
238
- >
239
- <Typography variant="h6" className={classes.rubberbandText}>
240
- {numOfBpSelected.toLocaleString('en-US')} bp
241
- </Typography>
242
- </div>
243
- <div
244
- data-testid="rubberband_controls"
245
- className={classes.rubberbandControl}
246
- role="presentation"
247
- ref={controlsRef}
248
- onMouseDown={mouseDown}
249
- onMouseOut={mouseOut}
250
- onMouseMove={mouseMove}
251
- >
252
- {ControlComponent}
253
- </div>
254
- {anchorPosition ? (
255
- <Menu
256
- anchorReference="anchorPosition"
257
- anchorPosition={{
258
- left: anchorPosition.clientX,
259
- top: anchorPosition.clientY,
260
- }}
261
- onMenuItemClick={handleMenuItemClick}
262
- open={Boolean(anchorPosition)}
263
- onClose={handleClose}
264
- menuItems={menuItems}
265
- />
266
- ) : null}
267
- </>
268
- )
269
- }
270
- export default observer(Rubberband)
@@ -1,123 +0,0 @@
1
- import React, { useRef } from 'react'
2
- import { makeStyles } from 'tss-react/mui'
3
- import { observer } from 'mobx-react'
4
- // locals
5
- import { MsaViewModel } from '../model'
6
- import { makeTicks, mathPower } from './util'
7
-
8
- const useStyles = makeStyles()({
9
- majorTickLabel: {
10
- fontSize: '11px',
11
- },
12
- majorTick: {
13
- stroke: '#555',
14
- },
15
- minorTick: {
16
- stroke: '#999',
17
- },
18
- })
19
-
20
- function RulerBlock({
21
- start,
22
- end,
23
- bpPerPx,
24
- reversed,
25
- major,
26
- minor,
27
- }: {
28
- start: number
29
- end: number
30
- bpPerPx: number
31
- reversed?: boolean
32
- major?: boolean
33
- minor?: boolean
34
- }) {
35
- const { classes } = useStyles()
36
- const ticks = makeTicks(start, end, bpPerPx, major, minor)
37
- return (
38
- <>
39
- {ticks.map(tick => {
40
- const x = (reversed ? end - tick.base : tick.base - start) / bpPerPx
41
- return (
42
- <line
43
- key={tick.base}
44
- x1={x}
45
- x2={x}
46
- y1={11}
47
- y2={tick.type === 'major' ? 11 + 6 : 11 + 4}
48
- strokeWidth={1}
49
- stroke={tick.type === 'major' ? '#555' : '#999'}
50
- className={
51
- tick.type === 'major' ? classes.majorTick : classes.minorTick
52
- }
53
- data-bp={tick.base}
54
- />
55
- )
56
- })}
57
- {ticks
58
- .filter(tick => tick.type === 'major')
59
- .map(tick => {
60
- const x = (reversed ? end - tick.base : tick.base - start) / bpPerPx
61
- return (
62
- <text
63
- x={x}
64
- y={10}
65
- key={`label-${tick.base}`}
66
- textAnchor="middle"
67
- style={{ fontSize: '11px' }}
68
- className={classes.majorTickLabel}
69
- >
70
- {mathPower(tick.base + 1)}
71
- </text>
72
- )
73
- })}
74
- </>
75
- )
76
- }
77
-
78
- const Ruler = observer(function ({ model }: { model: MsaViewModel }) {
79
- const {
80
- MSA,
81
- colWidth,
82
- msaAreaWidth,
83
- rulerHeight,
84
- resizeHandleWidth,
85
- scrollX,
86
- blocksX,
87
- blockSize,
88
- } = model
89
- const ref = useRef<HTMLDivElement>(null)
90
- const offsetX = blocksX[0]
91
-
92
- return !MSA ? null : (
93
- <div
94
- ref={ref}
95
- style={{
96
- position: 'relative',
97
- width: msaAreaWidth,
98
- cursor: 'crosshair',
99
- overflow: 'hidden',
100
- height: rulerHeight,
101
- background: '#ccc',
102
- }}
103
- >
104
- <svg
105
- style={{
106
- width: blocksX.length * blockSize,
107
- position: 'absolute',
108
- left: scrollX + offsetX + resizeHandleWidth,
109
- pointerEvents: 'none',
110
- }}
111
- >
112
- <RulerBlock
113
- key={offsetX}
114
- start={offsetX / colWidth}
115
- end={offsetX / colWidth + (blockSize * blocksX.length) / colWidth}
116
- bpPerPx={1 / colWidth}
117
- />
118
- </svg>
119
- </div>
120
- )
121
- })
122
-
123
- export default Ruler