@apollo-annotation/jbrowse-plugin-apollo 0.3.12 → 1.0.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.
Files changed (192) hide show
  1. package/dist/ApolloRefNameAliasAdapter/ApolloRefNameAliasAdapter.d.ts +1 -1
  2. package/dist/ApolloRefNameAliasAdapter/ApolloRefNameAliasAdapter.d.ts.map +1 -1
  3. package/dist/BackendDrivers/BackendDriver.d.ts +29 -4
  4. package/dist/BackendDrivers/BackendDriver.d.ts.map +1 -1
  5. package/dist/BackendDrivers/CollaborationServerDriver.d.ts +3 -1
  6. package/dist/BackendDrivers/CollaborationServerDriver.d.ts.map +1 -1
  7. package/dist/BackendDrivers/LocalDriver/LocalDriver.d.ts +22 -0
  8. package/dist/BackendDrivers/LocalDriver/LocalDriver.d.ts.map +1 -0
  9. package/dist/BackendDrivers/LocalDriver/db.d.ts +4 -0
  10. package/dist/BackendDrivers/LocalDriver/db.d.ts.map +1 -0
  11. package/dist/BackendDrivers/index.d.ts +1 -2
  12. package/dist/BackendDrivers/index.d.ts.map +1 -1
  13. package/dist/ChangeManager.d.ts +3 -3
  14. package/dist/ChangeManager.d.ts.map +1 -1
  15. package/dist/FeatureDetailsWidget/ApolloTranscriptDetailsWidget.d.ts +0 -6
  16. package/dist/FeatureDetailsWidget/ApolloTranscriptDetailsWidget.d.ts.map +1 -1
  17. package/dist/FeatureDetailsWidget/TranscriptWidgetEditLocation.d.ts.map +1 -1
  18. package/dist/FeatureDetailsWidget/model.d.ts +0 -2
  19. package/dist/FeatureDetailsWidget/model.d.ts.map +1 -1
  20. package/dist/LinearApolloDisplay/components/CheckResultWarnings.d.ts.map +1 -1
  21. package/dist/LinearApolloDisplay/components/LinearApolloDisplay.d.ts.map +1 -1
  22. package/dist/LinearApolloDisplay/components/OverlayCanvas.d.ts +7 -0
  23. package/dist/LinearApolloDisplay/components/OverlayCanvas.d.ts.map +1 -0
  24. package/dist/LinearApolloDisplay/components/Tooltip.d.ts +10 -0
  25. package/dist/LinearApolloDisplay/components/Tooltip.d.ts.map +1 -0
  26. package/dist/LinearApolloDisplay/glyphs/BoxGlyph.d.ts +0 -1
  27. package/dist/LinearApolloDisplay/glyphs/BoxGlyph.d.ts.map +1 -1
  28. package/dist/LinearApolloDisplay/glyphs/CDSGlyph.d.ts +3 -0
  29. package/dist/LinearApolloDisplay/glyphs/CDSGlyph.d.ts.map +1 -0
  30. package/dist/LinearApolloDisplay/glyphs/ExonGlyph.d.ts +3 -0
  31. package/dist/LinearApolloDisplay/glyphs/ExonGlyph.d.ts.map +1 -0
  32. package/dist/LinearApolloDisplay/glyphs/GeneGlyph.d.ts.map +1 -1
  33. package/dist/LinearApolloDisplay/glyphs/GenericChildGlyph.d.ts.map +1 -1
  34. package/dist/LinearApolloDisplay/glyphs/Glyph.d.ts +26 -20
  35. package/dist/LinearApolloDisplay/glyphs/Glyph.d.ts.map +1 -1
  36. package/dist/LinearApolloDisplay/glyphs/TranscriptGlyph.d.ts +3 -0
  37. package/dist/LinearApolloDisplay/glyphs/TranscriptGlyph.d.ts.map +1 -0
  38. package/dist/LinearApolloDisplay/glyphs/util.d.ts +13 -0
  39. package/dist/LinearApolloDisplay/glyphs/util.d.ts.map +1 -1
  40. package/dist/LinearApolloDisplay/stateModel/base.d.ts +17 -0
  41. package/dist/LinearApolloDisplay/stateModel/base.d.ts.map +1 -1
  42. package/dist/LinearApolloDisplay/stateModel/index.d.ts +35 -17
  43. package/dist/LinearApolloDisplay/stateModel/index.d.ts.map +1 -1
  44. package/dist/LinearApolloDisplay/stateModel/layouts.d.ts +29 -7
  45. package/dist/LinearApolloDisplay/stateModel/layouts.d.ts.map +1 -1
  46. package/dist/LinearApolloDisplay/stateModel/mouseEvents.d.ts +69 -23
  47. package/dist/LinearApolloDisplay/stateModel/mouseEvents.d.ts.map +1 -1
  48. package/dist/LinearApolloDisplay/stateModel/rendering.d.ts +26 -9
  49. package/dist/LinearApolloDisplay/stateModel/rendering.d.ts.map +1 -1
  50. package/dist/LinearApolloReferenceSequenceDisplay/stateModel/base.d.ts +6 -0
  51. package/dist/LinearApolloReferenceSequenceDisplay/stateModel/base.d.ts.map +1 -1
  52. package/dist/LinearApolloReferenceSequenceDisplay/stateModel/index.d.ts +6 -0
  53. package/dist/LinearApolloReferenceSequenceDisplay/stateModel/index.d.ts.map +1 -1
  54. package/dist/LinearApolloReferenceSequenceDisplay/stateModel/rendering.d.ts +6 -0
  55. package/dist/LinearApolloReferenceSequenceDisplay/stateModel/rendering.d.ts.map +1 -1
  56. package/dist/LinearApolloSixFrameDisplay/components/LinearApolloSixFrameDisplay.d.ts.map +1 -1
  57. package/dist/LinearApolloSixFrameDisplay/glyphs/GeneGlyph.d.ts.map +1 -1
  58. package/dist/LinearApolloSixFrameDisplay/glyphs/Glyph.d.ts +1 -1
  59. package/dist/LinearApolloSixFrameDisplay/glyphs/Glyph.d.ts.map +1 -1
  60. package/dist/LinearApolloSixFrameDisplay/stateModel/layouts.d.ts.map +1 -1
  61. package/dist/LinearApolloSixFrameDisplay/stateModel/rendering.d.ts.map +1 -1
  62. package/dist/OntologyManager/OntologyStore/fulltext.d.ts +1 -1
  63. package/dist/OntologyManager/OntologyStore/fulltext.d.ts.map +1 -1
  64. package/dist/OntologyManager/OntologyStore/index.d.ts +2 -2
  65. package/dist/OntologyManager/OntologyStore/index.d.ts.map +1 -1
  66. package/dist/OntologyManager/OntologyStore/indexeddb-storage.d.ts +1 -1
  67. package/dist/OntologyManager/OntologyStore/indexeddb-storage.d.ts.map +1 -1
  68. package/dist/OntologyManager/OntologyStore/types.d.ts +18 -0
  69. package/dist/OntologyManager/OntologyStore/types.d.ts.map +1 -0
  70. package/dist/TabularEditor/HybridGrid/featureContextMenuItems.d.ts.map +1 -1
  71. package/dist/components/AddChildFeature.d.ts.map +1 -1
  72. package/dist/components/ColorFeature.d.ts +13 -0
  73. package/dist/components/ColorFeature.d.ts.map +1 -0
  74. package/dist/components/CreateApolloAnnotation.d.ts.map +1 -1
  75. package/dist/components/DownloadGFF3.d.ts +4 -1
  76. package/dist/components/DownloadGFF3.d.ts.map +1 -1
  77. package/dist/components/DuplicateTranscript.d.ts.map +1 -1
  78. package/dist/components/ViewChangeLog.d.ts +2 -1
  79. package/dist/components/ViewChangeLog.d.ts.map +1 -1
  80. package/dist/components/ViewCheckResults.d.ts +2 -1
  81. package/dist/components/ViewCheckResults.d.ts.map +1 -1
  82. package/dist/components/index.d.ts +1 -1
  83. package/dist/components/index.d.ts.map +1 -1
  84. package/dist/config.d.ts +4 -0
  85. package/dist/config.d.ts.map +1 -0
  86. package/dist/extensions/annotationFromJBrowseFeature.d.ts.map +1 -1
  87. package/dist/extensions/annotationFromPileup.d.ts.map +1 -1
  88. package/dist/index.d.ts +11 -0
  89. package/dist/index.d.ts.map +1 -0
  90. package/dist/index.esm.js +6325 -5997
  91. package/dist/index.esm.js.map +1 -1
  92. package/dist/jbrowse-plugin-apollo.cjs.development.js +5869 -5541
  93. package/dist/jbrowse-plugin-apollo.cjs.development.js.map +1 -1
  94. package/dist/jbrowse-plugin-apollo.cjs.production.min.js +1 -1
  95. package/dist/jbrowse-plugin-apollo.cjs.production.min.js.map +1 -1
  96. package/dist/jbrowse-plugin-apollo.umd.development.js +16782 -25897
  97. package/dist/jbrowse-plugin-apollo.umd.development.js.map +1 -1
  98. package/dist/jbrowse-plugin-apollo.umd.production.min.js +1 -1
  99. package/dist/jbrowse-plugin-apollo.umd.production.min.js.map +1 -1
  100. package/dist/makeDisplayComponent.d.ts.map +1 -1
  101. package/dist/menus/Icons.d.ts +3 -0
  102. package/dist/menus/Icons.d.ts.map +1 -0
  103. package/dist/menus/topLevelMenu.d.ts.map +1 -1
  104. package/dist/session/changeHandlers.d.ts +9 -0
  105. package/dist/session/changeHandlers.d.ts.map +1 -0
  106. package/dist/util/annotationFeatureUtils.d.ts +2 -1
  107. package/dist/util/annotationFeatureUtils.d.ts.map +1 -1
  108. package/dist/util/glyphUtils.d.ts +3 -3
  109. package/dist/util/glyphUtils.d.ts.map +1 -1
  110. package/dist/util/index.d.ts +0 -1
  111. package/dist/util/index.d.ts.map +1 -1
  112. package/package.json +4 -4
  113. package/src/ApolloInternetAccount/model.ts +68 -4
  114. package/src/ApolloRefNameAliasAdapter/ApolloRefNameAliasAdapter.ts +6 -3
  115. package/src/ApolloTextSearchAdapter/ApolloTextSearchAdapter.ts +1 -1
  116. package/src/BackendDrivers/BackendDriver.ts +36 -3
  117. package/src/BackendDrivers/CollaborationServerDriver.ts +78 -23
  118. package/src/BackendDrivers/LocalDriver/LocalDriver.ts +367 -0
  119. package/src/BackendDrivers/LocalDriver/db.ts +37 -0
  120. package/src/BackendDrivers/index.ts +1 -2
  121. package/src/ChangeManager.ts +27 -25
  122. package/src/FeatureDetailsWidget/ApolloTranscriptDetailsWidget.tsx +1 -1
  123. package/src/FeatureDetailsWidget/TranscriptWidgetEditLocation.tsx +69 -53
  124. package/src/LinearApolloDisplay/components/CheckResultWarnings.tsx +1 -5
  125. package/src/LinearApolloDisplay/components/LinearApolloDisplay.tsx +95 -115
  126. package/src/LinearApolloDisplay/components/OverlayCanvas.tsx +76 -0
  127. package/src/LinearApolloDisplay/components/Tooltip.tsx +42 -0
  128. package/src/LinearApolloDisplay/glyphs/BoxGlyph.ts +60 -302
  129. package/src/LinearApolloDisplay/glyphs/CDSGlyph.ts +145 -0
  130. package/src/LinearApolloDisplay/glyphs/ExonGlyph.ts +212 -0
  131. package/src/LinearApolloDisplay/glyphs/GeneGlyph.ts +65 -999
  132. package/src/LinearApolloDisplay/glyphs/GenericChildGlyph.ts +71 -181
  133. package/src/LinearApolloDisplay/glyphs/Glyph.ts +42 -66
  134. package/src/LinearApolloDisplay/glyphs/TranscriptGlyph.ts +291 -0
  135. package/src/LinearApolloDisplay/glyphs/util.ts +87 -0
  136. package/src/LinearApolloDisplay/stateModel/base.ts +83 -0
  137. package/src/LinearApolloDisplay/stateModel/layouts.ts +198 -138
  138. package/src/LinearApolloDisplay/stateModel/mouseEvents.ts +252 -158
  139. package/src/LinearApolloDisplay/stateModel/rendering.ts +103 -21
  140. package/src/LinearApolloReferenceSequenceDisplay/drawSequenceOverlay.ts +3 -3
  141. package/src/LinearApolloReferenceSequenceDisplay/stateModel/base.ts +20 -2
  142. package/src/LinearApolloSixFrameDisplay/components/LinearApolloSixFrameDisplay.tsx +7 -2
  143. package/src/LinearApolloSixFrameDisplay/glyphs/GeneGlyph.ts +8 -13
  144. package/src/LinearApolloSixFrameDisplay/glyphs/Glyph.ts +1 -1
  145. package/src/LinearApolloSixFrameDisplay/stateModel/layouts.ts +4 -3
  146. package/src/LinearApolloSixFrameDisplay/stateModel/mouseEvents.ts +1 -1
  147. package/src/LinearApolloSixFrameDisplay/stateModel/rendering.ts +2 -1
  148. package/src/OntologyManager/OntologyStore/__snapshots__/index.test.ts.snap +18262 -8519
  149. package/src/OntologyManager/OntologyStore/fulltext.ts +1 -2
  150. package/src/OntologyManager/OntologyStore/index.test.ts +5 -2
  151. package/src/OntologyManager/OntologyStore/index.ts +7 -8
  152. package/src/OntologyManager/OntologyStore/indexeddb-storage.ts +2 -2
  153. package/src/OntologyManager/OntologyStore/types.ts +27 -0
  154. package/src/OntologyManager/index.ts +15 -26
  155. package/src/TabularEditor/HybridGrid/featureContextMenuItems.ts +4 -5
  156. package/src/components/AddChildFeature.tsx +15 -8
  157. package/src/components/ColorFeature.tsx +167 -0
  158. package/src/components/CreateApolloAnnotation.tsx +35 -9
  159. package/src/components/DownloadGFF3.tsx +92 -121
  160. package/src/components/DuplicateTranscript.tsx +10 -0
  161. package/src/components/ViewChangeLog.tsx +123 -83
  162. package/src/components/ViewCheckResults.tsx +15 -73
  163. package/src/components/index.ts +1 -1
  164. package/src/config.ts +37 -19
  165. package/src/extensions/annotationFromJBrowseFeature.test.ts +1 -1
  166. package/src/extensions/annotationFromJBrowseFeature.ts +91 -63
  167. package/src/extensions/annotationFromPileup.ts +40 -40
  168. package/src/index.ts +45 -1
  169. package/src/makeDisplayComponent.tsx +10 -3
  170. package/src/menus/Icons.tsx +49 -0
  171. package/src/menus/topLevelMenu.ts +24 -96
  172. package/src/session/ClientDataStore.ts +16 -17
  173. package/src/session/changeHandlers.ts +261 -0
  174. package/src/session/session.ts +77 -46
  175. package/src/util/annotationFeatureUtils.ts +29 -1
  176. package/src/util/glyphUtils.ts +74 -31
  177. package/src/util/index.ts +0 -1
  178. package/dist/BackendDrivers/DesktopFileDriver.d.ts +0 -160
  179. package/dist/BackendDrivers/DesktopFileDriver.d.ts.map +0 -1
  180. package/dist/BackendDrivers/InMemoryFileDriver.d.ts +0 -162
  181. package/dist/BackendDrivers/InMemoryFileDriver.d.ts.map +0 -1
  182. package/dist/LinearApolloDisplay/glyphs/index.d.ts +0 -4
  183. package/dist/LinearApolloDisplay/glyphs/index.d.ts.map +0 -1
  184. package/dist/components/OpenLocalFile.d.ts +0 -15
  185. package/dist/components/OpenLocalFile.d.ts.map +0 -1
  186. package/dist/util/loadAssemblyIntoClient.d.ts +0 -5
  187. package/dist/util/loadAssemblyIntoClient.d.ts.map +0 -1
  188. package/src/BackendDrivers/DesktopFileDriver.ts +0 -184
  189. package/src/BackendDrivers/InMemoryFileDriver.ts +0 -107
  190. package/src/LinearApolloDisplay/glyphs/index.ts +0 -3
  191. package/src/components/OpenLocalFile.tsx +0 -189
  192. package/src/util/loadAssemblyIntoClient.ts +0 -94
@@ -1,223 +1,113 @@
1
1
  import type { AnnotationFeature } from '@apollo-annotation/mst'
2
2
  import type { MenuItem } from '@jbrowse/core/ui'
3
+ import type { ContentBlock } from '@jbrowse/core/util/blockTypes'
3
4
  import { alpha } from '@mui/material'
4
5
 
5
- import {
6
- type MousePositionWithFeature,
7
- containsSelectedFeature,
8
- isMousePositionWithFeature,
9
- } from '../../util'
10
- import { getRelatedFeatures } from '../../util/annotationFeatureUtils'
6
+ import { isSelectedFeature } from '../../util'
11
7
  import type { LinearApolloDisplay } from '../stateModel'
12
- import type { LinearApolloDisplayMouseEvents } from '../stateModel/mouseEvents'
13
- import type { LinearApolloDisplayRendering } from '../stateModel/rendering'
14
8
 
15
- import { boxGlyph, drawBox } from './BoxGlyph'
16
- import type { Glyph } from './Glyph'
9
+ import { boxGlyph } from './BoxGlyph'
10
+ import type { Glyph, OverlayType } from './Glyph'
11
+ import { drawOverlayBox, getFeatureBox, strokeRectInner } from './util'
17
12
 
18
- function featuresForRow(feature: AnnotationFeature): AnnotationFeature[][] {
19
- const features = [[feature]]
20
- if (feature.children) {
21
- for (const [, child] of feature.children) {
22
- features.push(...featuresForRow(child))
23
- }
24
- }
25
- return features
26
- }
27
-
28
- function getRowCount(feature: AnnotationFeature) {
29
- return featuresForRow(feature).length
13
+ function getRowCount(display: LinearApolloDisplay, feature: AnnotationFeature) {
14
+ return getLayout(display, feature).byRow.length
30
15
  }
31
16
 
32
17
  function draw(
18
+ display: LinearApolloDisplay,
33
19
  ctx: CanvasRenderingContext2D,
34
20
  feature: AnnotationFeature,
35
21
  row: number,
36
- stateModel: LinearApolloDisplayRendering,
37
- displayedRegionIndex: number,
22
+ rowInFeature: number,
23
+ block: ContentBlock,
38
24
  ) {
39
- const { selectedFeature } = stateModel
40
- for (let i = 0; i < getRowCount(feature); i++) {
41
- drawRow(ctx, feature, row + i, row, stateModel, displayedRegionIndex)
25
+ if (rowInFeature > 0) {
26
+ return
42
27
  }
43
- if (selectedFeature && containsSelectedFeature(feature, selectedFeature)) {
44
- drawHighlight(stateModel, ctx, selectedFeature)
28
+ const { apolloRowHeight, selectedFeature, theme } = display
29
+ const [top, left, width] = getFeatureBox(display, feature, row, block)
30
+ const height = getRowCount(display, feature) * apolloRowHeight
31
+ if (width > 2) {
32
+ ctx.fillStyle = alpha(theme.palette.background.paper, 0.6)
33
+ ctx.fillRect(left, top, width, height)
45
34
  }
46
- }
35
+ strokeRectInner(ctx, left, top, width, height, theme.palette.text.primary)
36
+ boxGlyph.draw(display, ctx, feature, row, 0, block)
47
37
 
48
- function drawRow(
49
- ctx: CanvasRenderingContext2D,
50
- topLevelFeature: AnnotationFeature,
51
- row: number,
52
- topRow: number,
53
- stateModel: LinearApolloDisplayRendering,
54
- displayedRegionIndex: number,
55
- ) {
56
- const features = featuresForRow(topLevelFeature)[row - topRow]
57
- for (const feature of features) {
58
- drawFeature(ctx, feature, row, stateModel, displayedRegionIndex)
38
+ if (isSelectedFeature(feature, selectedFeature)) {
39
+ drawOverlay(display, ctx, feature, row, block, 'select')
59
40
  }
60
41
  }
61
42
 
62
- function drawFeature(
63
- ctx: CanvasRenderingContext2D,
43
+ function drawOverlay(
44
+ display: LinearApolloDisplay,
45
+ overlayCtx: CanvasRenderingContext2D,
64
46
  feature: AnnotationFeature,
65
47
  row: number,
66
- stateModel: LinearApolloDisplayRendering,
67
- displayedRegionIndex: number,
48
+ block: ContentBlock,
49
+ overlayType: OverlayType,
68
50
  ) {
69
- const { apolloRowHeight: heightPx, lgv, theme } = stateModel
70
- const { bpPerPx, displayedRegions, offsetPx } = lgv
71
- const displayedRegion = displayedRegions[displayedRegionIndex]
72
- const minX =
73
- (lgv.bpToPx({
74
- refName: displayedRegion.refName,
75
- coord: feature.min,
76
- regionNumber: displayedRegionIndex,
77
- })?.offsetPx ?? 0) - offsetPx
78
- const { reversed } = displayedRegion
79
- const widthPx = feature.length / bpPerPx
80
- const startPx = reversed ? minX - widthPx : minX
81
- const top = row * heightPx
82
- const rowCount = getRowCount(feature)
83
- const groupingColor = alpha(theme.palette.background.paper, 0.6)
84
- if (rowCount > 1) {
85
- // draw background that encapsulates all child features
86
- const featureHeight = rowCount * heightPx
87
- drawBox(ctx, startPx, top, widthPx, featureHeight, groupingColor)
88
- }
89
- boxGlyph.draw(ctx, feature, row, stateModel, displayedRegionIndex)
51
+ const { apolloRowHeight } = display
52
+ const [top, left, width] = getFeatureBox(display, feature, row, block)
53
+ const height = getRowCount(display, feature) * apolloRowHeight
54
+ drawOverlayBox(
55
+ display,
56
+ overlayCtx,
57
+ left,
58
+ top,
59
+ width,
60
+ height,
61
+ feature,
62
+ overlayType,
63
+ )
90
64
  }
91
65
 
92
- function drawHighlight(
93
- stateModel: LinearApolloDisplayRendering,
94
- ctx: CanvasRenderingContext2D,
95
- feature: AnnotationFeature,
96
- selected = false,
97
- ) {
98
- const { apolloRowHeight, lgv, theme } = stateModel
99
-
100
- const position = stateModel.getFeatureLayoutPosition(feature)
101
- if (!position) {
102
- return
66
+ function getLayout(display: LinearApolloDisplay, feature: AnnotationFeature) {
67
+ const layout = {
68
+ byFeature: new Map([[feature._id, 0]]),
69
+ byRow: [[{ feature, rowInFeature: 0 }]],
70
+ min: feature.min,
71
+ max: feature.max,
103
72
  }
104
- const { featureRow, layoutIndex, layoutRow } = position
105
- const { bpPerPx, displayedRegions, offsetPx } = lgv
106
- const displayedRegion = displayedRegions[layoutIndex]
107
- const { refName, reversed } = displayedRegion
108
- const { length, max, min } = feature
109
- const startPx =
110
- (lgv.bpToPx({
111
- refName,
112
- coord: reversed ? max : min,
113
- regionNumber: layoutIndex,
114
- })?.offsetPx ?? 0) - offsetPx
115
- const top = (layoutRow + featureRow) * apolloRowHeight
116
- const widthPx = length / bpPerPx
117
- ctx.fillStyle = selected
118
- ? theme.palette.action.disabled
119
- : theme.palette.action.focus
120
- ctx.fillRect(startPx, top, widthPx, apolloRowHeight * getRowCount(feature))
121
- }
122
-
123
- function drawHover(
124
- stateModel: LinearApolloDisplay,
125
- ctx: CanvasRenderingContext2D,
126
- ) {
127
- const { hoveredFeature } = stateModel
128
- if (!hoveredFeature) {
129
- return
73
+ const { children } = feature
74
+ if (!children) {
75
+ return layout
130
76
  }
131
- drawHighlight(stateModel, ctx, hoveredFeature.feature)
132
- }
133
-
134
- function getFeatureFromLayout(
135
- feature: AnnotationFeature,
136
- bp: number,
137
- row: number,
138
- ) {
139
- const layoutRow = featuresForRow(feature)[row]
140
- return layoutRow.find((f) => bp >= f.min && bp <= f.max)
141
- }
142
-
143
- function getRowForFeature(
144
- feature: AnnotationFeature,
145
- childFeature: AnnotationFeature,
146
- ) {
147
- const rows = featuresForRow(feature)
148
- for (const [idx, row] of rows.entries()) {
149
- if (row.some((feature) => feature._id === childFeature._id)) {
150
- return idx
77
+ // eslint-disable-next-line @typescript-eslint/unbound-method
78
+ const { getGlyph } = display
79
+ for (const [, child] of children) {
80
+ const glyph = getGlyph(child)
81
+ const childLayout = glyph.getLayout(display, child)
82
+ const startingRowIndex = layout.byRow.length
83
+ for (const [idx, row] of childLayout.byRow.entries()) {
84
+ layout.byRow.push([
85
+ { feature, rowInFeature: startingRowIndex + idx },
86
+ ...row,
87
+ ])
88
+ }
89
+ for (const entry of childLayout.byFeature.entries()) {
90
+ const [featureId, rowNumber] = entry
91
+ layout.byFeature.set(featureId, rowNumber + startingRowIndex)
151
92
  }
152
93
  }
153
- return
94
+ return layout
154
95
  }
155
96
 
156
- function getContextMenuItems(
157
- display: LinearApolloDisplayMouseEvents,
158
- mousePosition: MousePositionWithFeature,
159
- ): MenuItem[] {
160
- const { hoveredFeature, session } = display
161
- const menuItems: MenuItem[] = []
162
- if (!hoveredFeature) {
163
- return menuItems
164
- }
165
- const { featureTypeOntology } = session.apolloDataStore.ontologyManager
166
- if (!featureTypeOntology) {
167
- throw new Error('featureTypeOntology is undefined')
168
- }
169
- const sourceFeatureMenuItems = boxGlyph.getContextMenuItems(
170
- display,
171
- mousePosition,
172
- )
173
- menuItems.push({
174
- label: hoveredFeature.feature.type,
175
- subMenu: sourceFeatureMenuItems,
176
- })
177
- if (isMousePositionWithFeature(mousePosition)) {
178
- const { bp, feature } = mousePosition
179
- for (const relative of getRelatedFeatures(feature, bp)) {
180
- if (relative._id === hoveredFeature.feature._id) {
181
- continue
182
- }
183
- const contextMenuItemsForFeature = boxGlyph.getContextMenuItemsForFeature(
184
- display,
185
- relative,
186
- )
187
- menuItems.push({
188
- label: relative.type,
189
- subMenu: contextMenuItemsForFeature,
190
- })
191
- }
192
- }
193
- return menuItems
97
+ function getContextMenuItems(): MenuItem[] {
98
+ return []
194
99
  }
195
100
 
196
101
  // False positive here, none of these functions use "this"
197
102
  /* eslint-disable @typescript-eslint/unbound-method */
198
- const {
199
- drawDragPreview,
200
- drawTooltip,
201
- getContextMenuItemsForFeature,
202
- onMouseDown,
203
- onMouseLeave,
204
- onMouseMove,
205
- onMouseUp,
206
- } = boxGlyph
103
+ const { drawDragPreview } = boxGlyph
207
104
  /* eslint-enable @typescript-eslint/unbound-method */
208
105
 
209
106
  export const genericChildGlyph: Glyph = {
210
107
  draw,
211
108
  drawDragPreview,
212
- drawHover,
213
- drawTooltip,
214
- getContextMenuItemsForFeature,
109
+ drawOverlay,
215
110
  getContextMenuItems,
216
- getFeatureFromLayout,
217
- getRowCount,
218
- getRowForFeature,
219
- onMouseDown,
220
- onMouseLeave,
221
- onMouseMove,
222
- onMouseUp,
111
+ getLayout,
112
+ isDraggable: true,
223
113
  }
@@ -1,86 +1,62 @@
1
1
  import type { AnnotationFeature } from '@apollo-annotation/mst'
2
2
  import type { MenuItem } from '@jbrowse/core/ui'
3
+ import type { ContentBlock } from '@jbrowse/core/util/blockTypes'
3
4
 
4
- import type { OntologyRecord } from '../../OntologyManager'
5
- import type { MousePositionWithFeature } from '../../util'
6
- import type { LinearApolloDisplayMouseEvents } from '../stateModel/mouseEvents'
7
- import type { LinearApolloDisplayRendering } from '../stateModel/rendering'
8
- import type { CanvasMouseEvent } from '../types'
5
+ import type { LinearApolloDisplay } from '../stateModel'
6
+
7
+ interface LayoutFeature {
8
+ feature: AnnotationFeature
9
+ rowInFeature: number
10
+ }
11
+ export type LayoutRow = LayoutFeature[]
12
+
13
+ export interface Layout {
14
+ byFeature: Map<string, number>
15
+ byRow: LayoutRow[]
16
+ min: number
17
+ max: number
18
+ }
19
+
20
+ export type OverlayType = 'hover' | 'select' | 'highlight'
9
21
 
10
22
  export interface Glyph {
11
- /** @returns number of layout rows used by this glyph with this feature and zoom level */
12
- getRowCount(
13
- feature: AnnotationFeature,
14
- featureTypeOntology: OntologyRecord,
15
- bpPerPx: number,
16
- ): number
17
23
  /** draw the feature's primary rendering on the canvas */
18
24
  draw(
25
+ display: LinearApolloDisplay,
19
26
  ctx: CanvasRenderingContext2D,
20
27
  feature: AnnotationFeature,
21
28
  row: number,
22
- stateModel: LinearApolloDisplayRendering,
23
- displayedRegionIndex: number,
24
- ): void
25
- /** @returns the feature or subfeature at the given bp and row number in this glyph's layout */
26
- getFeatureFromLayout(
29
+ rowInFeature: number,
30
+ block: ContentBlock,
31
+ ): void
32
+ /**
33
+ * draw an overlay of the feature, used for when the feature is selected,
34
+ * hovered over, or highlighted
35
+ */
36
+ drawOverlay(
37
+ display: LinearApolloDisplay,
38
+ overlayCtx: CanvasRenderingContext2D,
27
39
  feature: AnnotationFeature,
28
- bp: number,
29
40
  row: number,
30
- featureTypeOntology: OntologyRecord,
31
- ): AnnotationFeature | undefined
32
- getRowForFeature(
33
- feature: AnnotationFeature,
34
- childFeature: AnnotationFeature,
35
- featureTypeOntology: OntologyRecord,
36
- ): number | undefined
37
-
38
- drawHover(
39
- display: LinearApolloDisplayMouseEvents,
40
- overlayCtx: CanvasRenderingContext2D,
41
+ block: ContentBlock,
42
+ overlayType: OverlayType,
43
+ rowInFeature?: number,
41
44
  ): void
42
-
45
+ /** draw a preview of the result of a dragging action on the overlay canvas */
43
46
  drawDragPreview(
44
- display: LinearApolloDisplayMouseEvents,
45
- ctx: CanvasRenderingContext2D,
46
- ): void
47
-
48
- onMouseDown(
49
- display: LinearApolloDisplayMouseEvents,
50
- currentMousePosition: MousePositionWithFeature,
51
- event: CanvasMouseEvent,
52
- ): void
53
-
54
- onMouseMove(
55
- display: LinearApolloDisplayMouseEvents,
56
- currentMousePosition: MousePositionWithFeature,
57
- event: CanvasMouseEvent,
58
- ): void
59
-
60
- onMouseLeave(
61
- display: LinearApolloDisplayMouseEvents,
62
- currentMousePosition: MousePositionWithFeature,
63
- event: CanvasMouseEvent,
64
- ): void
65
-
66
- onMouseUp(
67
- display: LinearApolloDisplayMouseEvents,
68
- currentMousePosition: MousePositionWithFeature,
69
- event: CanvasMouseEvent,
70
- ): void
71
-
72
- drawTooltip(
73
- display: LinearApolloDisplayMouseEvents,
74
- context: CanvasRenderingContext2D,
47
+ display: LinearApolloDisplay,
48
+ overlayCtx: CanvasRenderingContext2D,
49
+ feature: AnnotationFeature,
50
+ row: number,
51
+ block: ContentBlock,
75
52
  ): void
76
53
 
77
- getContextMenuItemsForFeature(
78
- display: LinearApolloDisplayMouseEvents,
79
- sourceFeature: AnnotationFeature,
80
- ): MenuItem[]
54
+ getLayout(display: LinearApolloDisplay, feature: AnnotationFeature): Layout
81
55
 
82
56
  getContextMenuItems(
83
- display: LinearApolloDisplayMouseEvents,
84
- currentMousePosition: MousePositionWithFeature,
57
+ display: LinearApolloDisplay,
58
+ feature: AnnotationFeature,
85
59
  ): MenuItem[]
60
+
61
+ isDraggable: boolean
86
62
  }