@jbrowse/plugin-wiggle 2.5.0 → 2.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (151) hide show
  1. package/dist/BigWigAdapter/BigWigAdapter.js +2 -1
  2. package/dist/BigWigAdapter/BigWigAdapter.js.map +1 -1
  3. package/dist/CreateMultiWiggleExtension/ConfirmDialog.d.ts +2 -1
  4. package/dist/LinearWiggleDisplay/components/SetColorDialog.d.ts +2 -1
  5. package/dist/LinearWiggleDisplay/components/Tooltip.d.ts +1 -1
  6. package/dist/LinearWiggleDisplay/components/WiggleDisplayComponent.d.ts +2 -1
  7. package/dist/LinearWiggleDisplay/index.js +27 -4
  8. package/dist/LinearWiggleDisplay/index.js.map +1 -1
  9. package/dist/LinearWiggleDisplay/models/configSchema.d.ts +18 -35
  10. package/dist/LinearWiggleDisplay/models/configSchema.js +6 -67
  11. package/dist/LinearWiggleDisplay/models/configSchema.js.map +1 -1
  12. package/dist/LinearWiggleDisplay/models/model.d.ts +147 -342
  13. package/dist/LinearWiggleDisplay/models/model.js +17 -432
  14. package/dist/LinearWiggleDisplay/models/model.js.map +1 -1
  15. package/dist/LinearWiggleDisplay/models/renderSvg.d.ts +4 -0
  16. package/dist/LinearWiggleDisplay/models/renderSvg.js +21 -0
  17. package/dist/LinearWiggleDisplay/models/renderSvg.js.map +1 -0
  18. package/dist/MultiDensityRenderer/MultiDensityRenderer.js +1 -1
  19. package/dist/MultiDensityRenderer/MultiDensityRenderer.js.map +1 -1
  20. package/dist/MultiLineRenderer/MultiLineRenderer.js +1 -1
  21. package/dist/MultiLineRenderer/MultiLineRenderer.js.map +1 -1
  22. package/dist/MultiLinearWiggleDisplay/components/DraggableDialog.d.ts +2 -1
  23. package/dist/MultiLinearWiggleDisplay/components/SetColorDialog.d.ts +2 -1
  24. package/dist/MultiLinearWiggleDisplay/components/SetColorDialog.js +2 -2
  25. package/dist/MultiLinearWiggleDisplay/components/SetColorDialog.js.map +1 -1
  26. package/dist/MultiLinearWiggleDisplay/components/Tooltip.d.ts +1 -1
  27. package/dist/MultiLinearWiggleDisplay/components/WiggleDisplayComponent.d.ts +3 -2
  28. package/dist/MultiLinearWiggleDisplay/index.js +25 -2
  29. package/dist/MultiLinearWiggleDisplay/index.js.map +1 -1
  30. package/dist/MultiLinearWiggleDisplay/models/configSchema.d.ts +24 -44
  31. package/dist/MultiLinearWiggleDisplay/models/configSchema.js +6 -66
  32. package/dist/MultiLinearWiggleDisplay/models/configSchema.js.map +1 -1
  33. package/dist/MultiLinearWiggleDisplay/models/model.d.ts +263 -175
  34. package/dist/MultiLinearWiggleDisplay/models/model.js +335 -508
  35. package/dist/MultiLinearWiggleDisplay/models/model.js.map +1 -1
  36. package/dist/MultiLinearWiggleDisplay/models/renderSvg.d.ts +4 -0
  37. package/dist/MultiLinearWiggleDisplay/models/renderSvg.js +20 -0
  38. package/dist/MultiLinearWiggleDisplay/models/renderSvg.js.map +1 -0
  39. package/dist/MultiRowLineRenderer/MultiRowLineRenderer.js +1 -1
  40. package/dist/MultiRowLineRenderer/MultiRowLineRenderer.js.map +1 -1
  41. package/dist/MultiRowXYPlotRenderer/MultiRowXYPlotRenderer.js +1 -1
  42. package/dist/MultiRowXYPlotRenderer/MultiRowXYPlotRenderer.js.map +1 -1
  43. package/dist/MultiWiggleAddTrackWidget/AddTrackWorkflow.d.ts +2 -1
  44. package/dist/MultiWiggleAddTrackWidget/AddTrackWorkflow.js +1 -1
  45. package/dist/MultiWiggleAddTrackWidget/AddTrackWorkflow.js.map +1 -1
  46. package/dist/MultiWiggleRendering.d.ts +2 -1
  47. package/dist/MultiXYPlotRenderer/MultiXYPlotRenderer.js +3 -2
  48. package/dist/MultiXYPlotRenderer/MultiXYPlotRenderer.js.map +1 -1
  49. package/dist/Tooltip.d.ts +1 -1
  50. package/dist/WiggleBaseRenderer.d.ts +1 -1
  51. package/dist/WiggleRendering.d.ts +2 -1
  52. package/dist/index.d.ts +222 -198
  53. package/dist/shared/SetMinMaxDialog.d.ts +2 -1
  54. package/dist/shared/YScaleBar.d.ts +4 -2
  55. package/dist/shared/YScaleBar.js +1 -1
  56. package/dist/shared/YScaleBar.js.map +1 -1
  57. package/dist/shared/configShared.d.ts +85 -0
  58. package/dist/shared/configShared.js +84 -0
  59. package/dist/shared/configShared.js.map +1 -0
  60. package/dist/shared/modelShared.d.ts +576 -0
  61. package/dist/shared/modelShared.js +480 -0
  62. package/dist/shared/modelShared.js.map +1 -0
  63. package/dist/util.d.ts +0 -3
  64. package/dist/util.js +1 -11
  65. package/dist/util.js.map +1 -1
  66. package/esm/BigWigAdapter/BigWigAdapter.js +2 -1
  67. package/esm/BigWigAdapter/BigWigAdapter.js.map +1 -1
  68. package/esm/CreateMultiWiggleExtension/ConfirmDialog.d.ts +2 -1
  69. package/esm/LinearWiggleDisplay/components/SetColorDialog.d.ts +2 -1
  70. package/esm/LinearWiggleDisplay/components/Tooltip.d.ts +1 -1
  71. package/esm/LinearWiggleDisplay/components/WiggleDisplayComponent.d.ts +2 -1
  72. package/esm/LinearWiggleDisplay/index.js +2 -2
  73. package/esm/LinearWiggleDisplay/index.js.map +1 -1
  74. package/esm/LinearWiggleDisplay/models/configSchema.d.ts +18 -35
  75. package/esm/LinearWiggleDisplay/models/configSchema.js +3 -67
  76. package/esm/LinearWiggleDisplay/models/configSchema.js.map +1 -1
  77. package/esm/LinearWiggleDisplay/models/model.d.ts +147 -342
  78. package/esm/LinearWiggleDisplay/models/model.js +20 -435
  79. package/esm/LinearWiggleDisplay/models/model.js.map +1 -1
  80. package/esm/LinearWiggleDisplay/models/renderSvg.d.ts +4 -0
  81. package/esm/LinearWiggleDisplay/models/renderSvg.js +14 -0
  82. package/esm/LinearWiggleDisplay/models/renderSvg.js.map +1 -0
  83. package/esm/MultiDensityRenderer/MultiDensityRenderer.js +1 -1
  84. package/esm/MultiDensityRenderer/MultiDensityRenderer.js.map +1 -1
  85. package/esm/MultiLineRenderer/MultiLineRenderer.js +1 -1
  86. package/esm/MultiLineRenderer/MultiLineRenderer.js.map +1 -1
  87. package/esm/MultiLinearWiggleDisplay/components/DraggableDialog.d.ts +2 -1
  88. package/esm/MultiLinearWiggleDisplay/components/SetColorDialog.d.ts +2 -1
  89. package/esm/MultiLinearWiggleDisplay/components/SetColorDialog.js +1 -1
  90. package/esm/MultiLinearWiggleDisplay/components/SetColorDialog.js.map +1 -1
  91. package/esm/MultiLinearWiggleDisplay/components/Tooltip.d.ts +1 -1
  92. package/esm/MultiLinearWiggleDisplay/components/WiggleDisplayComponent.d.ts +3 -2
  93. package/esm/MultiLinearWiggleDisplay/index.js +2 -2
  94. package/esm/MultiLinearWiggleDisplay/index.js.map +1 -1
  95. package/esm/MultiLinearWiggleDisplay/models/configSchema.d.ts +24 -44
  96. package/esm/MultiLinearWiggleDisplay/models/configSchema.js +3 -66
  97. package/esm/MultiLinearWiggleDisplay/models/configSchema.js.map +1 -1
  98. package/esm/MultiLinearWiggleDisplay/models/model.d.ts +263 -175
  99. package/esm/MultiLinearWiggleDisplay/models/model.js +337 -512
  100. package/esm/MultiLinearWiggleDisplay/models/model.js.map +1 -1
  101. package/esm/MultiLinearWiggleDisplay/models/renderSvg.d.ts +4 -0
  102. package/esm/MultiLinearWiggleDisplay/models/renderSvg.js +13 -0
  103. package/esm/MultiLinearWiggleDisplay/models/renderSvg.js.map +1 -0
  104. package/esm/MultiRowLineRenderer/MultiRowLineRenderer.js +1 -1
  105. package/esm/MultiRowLineRenderer/MultiRowLineRenderer.js.map +1 -1
  106. package/esm/MultiRowXYPlotRenderer/MultiRowXYPlotRenderer.js +1 -1
  107. package/esm/MultiRowXYPlotRenderer/MultiRowXYPlotRenderer.js.map +1 -1
  108. package/esm/MultiWiggleAddTrackWidget/AddTrackWorkflow.d.ts +2 -1
  109. package/esm/MultiWiggleAddTrackWidget/AddTrackWorkflow.js +1 -1
  110. package/esm/MultiWiggleAddTrackWidget/AddTrackWorkflow.js.map +1 -1
  111. package/esm/MultiWiggleRendering.d.ts +2 -1
  112. package/esm/MultiXYPlotRenderer/MultiXYPlotRenderer.js +2 -1
  113. package/esm/MultiXYPlotRenderer/MultiXYPlotRenderer.js.map +1 -1
  114. package/esm/Tooltip.d.ts +1 -1
  115. package/esm/WiggleBaseRenderer.d.ts +1 -1
  116. package/esm/WiggleRendering.d.ts +2 -1
  117. package/esm/index.d.ts +222 -198
  118. package/esm/shared/SetMinMaxDialog.d.ts +2 -1
  119. package/esm/shared/YScaleBar.d.ts +4 -2
  120. package/esm/shared/YScaleBar.js +1 -1
  121. package/esm/shared/YScaleBar.js.map +1 -1
  122. package/esm/shared/configShared.d.ts +85 -0
  123. package/esm/shared/configShared.js +81 -0
  124. package/esm/shared/configShared.js.map +1 -0
  125. package/esm/shared/modelShared.d.ts +576 -0
  126. package/esm/shared/modelShared.js +454 -0
  127. package/esm/shared/modelShared.js.map +1 -0
  128. package/esm/util.d.ts +0 -3
  129. package/esm/util.js +0 -9
  130. package/esm/util.js.map +1 -1
  131. package/package.json +3 -3
  132. package/src/BigWigAdapter/BigWigAdapter.ts +2 -4
  133. package/src/LinearWiggleDisplay/index.ts +2 -2
  134. package/src/LinearWiggleDisplay/models/configSchema.ts +4 -73
  135. package/src/LinearWiggleDisplay/models/model.tsx +22 -503
  136. package/src/LinearWiggleDisplay/models/renderSvg.tsx +29 -0
  137. package/src/MultiDensityRenderer/MultiDensityRenderer.ts +1 -2
  138. package/src/MultiLineRenderer/MultiLineRenderer.ts +1 -2
  139. package/src/MultiLinearWiggleDisplay/components/SetColorDialog.tsx +1 -1
  140. package/src/MultiLinearWiggleDisplay/index.ts +2 -2
  141. package/src/MultiLinearWiggleDisplay/models/configSchema.ts +4 -72
  142. package/src/MultiLinearWiggleDisplay/models/model.tsx +132 -371
  143. package/src/MultiLinearWiggleDisplay/models/renderSvg.tsx +26 -0
  144. package/src/MultiRowLineRenderer/MultiRowLineRenderer.ts +1 -2
  145. package/src/MultiRowXYPlotRenderer/MultiRowXYPlotRenderer.ts +1 -2
  146. package/src/MultiWiggleAddTrackWidget/AddTrackWorkflow.tsx +1 -1
  147. package/src/MultiXYPlotRenderer/MultiXYPlotRenderer.ts +2 -2
  148. package/src/shared/YScaleBar.tsx +4 -2
  149. package/src/shared/configShared.ts +90 -0
  150. package/src/shared/modelShared.ts +510 -0
  151. package/src/util.ts +1 -10
@@ -1,47 +1,34 @@
1
1
  import React, { lazy } from 'react'
2
2
  import { addDisposer, isAlive, types, Instance } from 'mobx-state-tree'
3
- import { autorun, when } from 'mobx'
3
+ import { autorun } from 'mobx'
4
4
  import { axisPropsFromTickScale } from 'react-d3-axis-mod'
5
5
  import deepEqual from 'fast-deep-equal'
6
6
 
7
7
  // jbrowse imports
8
8
  import {
9
- ConfigurationReference,
10
9
  AnyConfigurationSchemaType,
11
10
  getConf,
12
- readConfObject,
13
11
  } from '@jbrowse/core/configuration'
14
- import {
15
- getSession,
16
- getEnv,
17
- getContainingView,
18
- isSelectionContainer,
19
- Feature,
20
- } from '@jbrowse/core/util'
12
+ import { getSession, Feature } from '@jbrowse/core/util'
21
13
  import { getRpcSessionId } from '@jbrowse/core/util/tracks'
22
14
  import { set1 as colors } from '@jbrowse/core/ui/colors'
23
15
  import PluginManager from '@jbrowse/core/PluginManager'
24
- import {
25
- BaseLinearDisplay,
26
- LinearGenomeViewModel,
27
- } from '@jbrowse/plugin-linear-genome-view'
16
+ import { ExportSvgDisplayOptions } from '@jbrowse/plugin-linear-genome-view'
28
17
 
29
18
  // locals
30
19
  import {
31
- getNiceDomain,
32
20
  getScale,
33
21
  quantitativeStatsAutorun,
34
22
  YSCALEBAR_LABEL_OFFSET,
35
23
  } from '../../util'
36
24
 
37
25
  import Tooltip from '../components/Tooltip'
38
- import { StatBars } from '../components/WiggleDisplayComponent'
26
+ import SharedWiggleMixin from '../../shared/modelShared'
39
27
 
40
28
  const randomColor = () =>
41
- '#000000'.replace(/0/g, () => (~~(Math.random() * 16)).toString(16))
29
+ '#000000'.replaceAll('0', () => (~~(Math.random() * 16)).toString(16))
42
30
 
43
- // lazt components
44
- const SetMinMaxDlg = lazy(() => import('../../shared/SetMinMaxDialog'))
31
+ // lazies
45
32
  const SetColorDlg = lazy(() => import('../components/SetColorDialog'))
46
33
 
47
34
  // using a map because it preserves order
@@ -53,239 +40,100 @@ const rendererTypes = new Map([
53
40
  ['multirowline', 'MultiRowLineRenderer'],
54
41
  ])
55
42
 
56
- type LGV = LinearGenomeViewModel
57
-
58
43
  interface Source {
59
44
  name: string
60
45
  color?: string
61
46
  group?: string
62
47
  }
63
48
 
64
- const stateModelFactory = (
49
+ /**
50
+ * #stateModel MultiLinearWiggleDisplay
51
+ * extends `SharedWiggleMixin`
52
+ */
53
+ export function stateModelFactory(
65
54
  pluginManager: PluginManager,
66
55
  configSchema: AnyConfigurationSchemaType,
67
- ) =>
68
- types
56
+ ) {
57
+ return types
69
58
  .compose(
70
59
  'MultiLinearWiggleDisplay',
71
- BaseLinearDisplay,
60
+ SharedWiggleMixin(configSchema),
72
61
  types.model({
62
+ /**
63
+ * #property
64
+ */
73
65
  type: types.literal('MultiLinearWiggleDisplay'),
74
- configuration: ConfigurationReference(configSchema),
75
- selectedRendering: types.optional(types.string, ''),
76
- resolution: types.optional(types.number, 1),
77
- fill: types.maybe(types.boolean),
78
- minSize: types.maybe(types.number),
79
- color: types.maybe(types.string),
80
- posColor: types.maybe(types.string),
81
- negColor: types.maybe(types.string),
82
- summaryScoreMode: types.maybe(types.string),
83
- rendererTypeNameState: types.maybe(types.string),
84
- scale: types.maybe(types.string),
85
- autoscale: types.maybe(types.string),
86
- displayCrossHatches: types.maybe(types.boolean),
66
+
67
+ /**
68
+ * #property
69
+ */
87
70
  layout: types.optional(types.frozen<Source[]>(), []),
88
- constraints: types.optional(
89
- types.model({
90
- max: types.maybe(types.number),
91
- min: types.maybe(types.number),
92
- }),
93
- {},
94
- ),
95
71
  }),
96
72
  )
97
73
  .volatile(() => ({
98
- message: undefined as undefined | string,
99
- stats: undefined as { scoreMin: number; scoreMax: number } | undefined,
100
- statsRegion: undefined as string | undefined,
101
- statsFetchInProgress: undefined as undefined | AbortController,
102
74
  featureUnderMouseVolatile: undefined as Feature | undefined,
103
75
  sourcesVolatile: undefined as Source[] | undefined,
104
76
  }))
105
77
  .actions(self => ({
78
+ /**
79
+ * #action
80
+ */
106
81
  setLayout(layout: Source[]) {
107
82
  self.layout = layout
108
83
  },
84
+ /**
85
+ * #action
86
+ */
109
87
  clearLayout() {
110
88
  self.layout = []
111
89
  },
112
- updateQuantitativeStats(stats: { scoreMin: number; scoreMax: number }) {
113
- const { scoreMin, scoreMax } = stats
114
- const EPSILON = 0.000001
115
- if (!self.stats) {
116
- self.stats = { scoreMin, scoreMax }
117
- } else if (
118
- Math.abs(self.stats.scoreMax - scoreMax) > EPSILON ||
119
- Math.abs(self.stats.scoreMin - scoreMin) > EPSILON
120
- ) {
121
- self.stats = { scoreMin, scoreMax }
122
- }
123
- },
90
+
91
+ /**
92
+ * #action
93
+ */
124
94
  setSources(sources: Source[]) {
125
95
  if (!deepEqual(sources, self.sourcesVolatile)) {
126
96
  self.sourcesVolatile = sources
127
97
  }
128
98
  },
129
- setColor(color: string) {
130
- self.color = color
131
- },
132
- setPosColor(color: string) {
133
- self.posColor = color
134
- },
135
- setNegColor(color: string) {
136
- self.negColor = color
137
- },
138
-
139
- setLoading(aborter: AbortController) {
140
- const { statsFetchInProgress: statsFetch } = self
141
- if (statsFetch !== undefined && !statsFetch.signal.aborted) {
142
- statsFetch.abort()
143
- }
144
- self.statsFetchInProgress = aborter
145
- },
146
-
147
- // this overrides the BaseLinearDisplayModel to avoid popping up a
148
- // feature detail display, but still sets the feature selection on the
149
- // model so listeners can detect a click
150
- selectFeature(feature: Feature) {
151
- const session = getSession(self)
152
- if (isSelectionContainer(session)) {
153
- session.setSelection(feature)
154
- }
155
- },
156
99
 
100
+ /**
101
+ * #action
102
+ */
157
103
  setFeatureUnderMouse(f?: Feature) {
158
104
  self.featureUnderMouseVolatile = f
159
105
  },
160
- setResolution(res: number) {
161
- self.resolution = res
162
- },
163
-
164
- setFill(fill: number) {
165
- if (fill === 0) {
166
- self.fill = true
167
- self.minSize = 0
168
- } else if (fill === 1) {
169
- self.fill = false
170
- self.minSize = 1
171
- } else if (fill === 2) {
172
- self.fill = false
173
- self.minSize = 2
174
- }
175
- },
176
-
177
- toggleLogScale() {
178
- self.scale = self.scale === 'log' ? 'linear' : 'log'
179
- },
180
-
181
- setScaleType(scale?: string) {
182
- self.scale = scale
183
- },
184
-
185
- setSummaryScoreMode(val: string) {
186
- self.summaryScoreMode = val
187
- },
188
-
189
- setAutoscale(val: string) {
190
- self.autoscale = val
191
- },
192
-
193
- setMaxScore(val?: number) {
194
- self.constraints.max = val
195
- },
196
-
197
- setRendererType(val: string) {
198
- self.rendererTypeNameState = val
199
- },
200
-
201
- setMinScore(val?: number) {
202
- self.constraints.min = val
203
- },
204
-
205
- toggleCrossHatches() {
206
- self.displayCrossHatches = !self.displayCrossHatches
207
- },
208
-
209
- setCrossHatches(cross: boolean) {
210
- self.displayCrossHatches = cross
211
- },
212
106
  }))
213
107
  .views(self => ({
108
+ /**
109
+ * #getter
110
+ */
214
111
  get featureUnderMouse() {
215
112
  return self.featureUnderMouseVolatile
216
113
  },
114
+ /**
115
+ * #getter
116
+ */
217
117
  get TooltipComponent() {
218
118
  return Tooltip as unknown as React.FC
219
119
  },
220
120
 
221
- get adapterTypeName() {
222
- return self.adapterConfig.type
223
- },
224
- get rendererTypeNameSimple() {
225
- return self.rendererTypeNameState || getConf(self, 'defaultRendering')
226
- },
121
+ /**
122
+ * #getter
123
+ */
227
124
  get rendererTypeName() {
228
- const name = this.rendererTypeNameSimple
125
+ const name = self.rendererTypeNameSimple
229
126
  const rendererType = rendererTypes.get(name)
230
127
  if (!rendererType) {
231
128
  throw new Error(`unknown renderer ${name}`)
232
129
  }
233
130
  return rendererType
234
131
  },
235
-
236
- // subclasses can define these, as snpcoverage track does
237
- get filters() {
238
- return undefined
239
- },
240
-
241
- get scaleType() {
242
- return self.scale ?? (getConf(self, 'scaleType') as string)
243
- },
244
-
245
- get maxScore() {
246
- return self.constraints.max ?? (getConf(self, 'maxScore') as number)
247
- },
248
-
249
- get minScore() {
250
- return self.constraints.min ?? (getConf(self, 'minScore') as number)
251
- },
252
132
  }))
253
133
  .views(self => ({
254
- get rendererConfig() {
255
- const configBlob =
256
- getConf(self, ['renderers', self.rendererTypeName]) || {}
257
-
258
- const {
259
- color,
260
- displayCrossHatches,
261
- fill,
262
- minSize,
263
- negColor,
264
- posColor,
265
- summaryScoreMode,
266
- scaleType,
267
- } = self
268
-
269
- return self.rendererType.configSchema.create(
270
- {
271
- ...configBlob,
272
- ...(scaleType ? { scaleType } : {}),
273
- ...(fill !== undefined ? { filled: fill } : {}),
274
- ...(displayCrossHatches !== undefined
275
- ? { displayCrossHatches }
276
- : {}),
277
- ...(summaryScoreMode !== undefined ? { summaryScoreMode } : {}),
278
- ...(color !== undefined ? { color } : {}),
279
- ...(negColor !== undefined ? { negColor } : {}),
280
- ...(posColor !== undefined ? { posColor } : {}),
281
- ...(minSize !== undefined ? { minSize } : {}),
282
- },
283
- getEnv(self),
284
- )
285
- },
286
- }))
287
- .views(self => ({
288
- // everything except density gets a numerical scalebar
134
+ /**
135
+ * #getter
136
+ */
289
137
  get needsScalebar() {
290
138
  return (
291
139
  self.rendererTypeName === 'MultiXYPlotRenderer' ||
@@ -294,14 +142,18 @@ const stateModelFactory = (
294
142
  self.rendererTypeName === 'MultiRowLineRenderer'
295
143
  )
296
144
  },
297
-
145
+ /**
146
+ * #getter
147
+ */
298
148
  get needsFullHeightScalebar() {
299
149
  return (
300
150
  self.rendererTypeName === 'MultiXYPlotRenderer' ||
301
151
  self.rendererTypeName === 'MultiLineRenderer'
302
152
  )
303
153
  },
304
-
154
+ /**
155
+ * #getter
156
+ */
305
157
  get isMultiRow() {
306
158
  return (
307
159
  self.rendererTypeName === 'MultiRowXYPlotRenderer' ||
@@ -309,9 +161,11 @@ const stateModelFactory = (
309
161
  self.rendererTypeName === 'MultiDensityRenderer'
310
162
  )
311
163
  },
312
-
313
- // can be used to give it a "color scale" like a R heatmap, not
314
- // implemented like this yet but flag can be used for this
164
+ /**
165
+ * #getter
166
+ * can be used to give it a "color scale" like a R heatmap, not
167
+ * implemented like this yet but flag can be used for this
168
+ */
315
169
  get needsCustomLegend() {
316
170
  return self.rendererTypeName === 'MultiDensityRenderer'
317
171
  },
@@ -322,22 +176,29 @@ const stateModelFactory = (
322
176
  self.rendererTypeName === 'MultiRowXYPlotRenderer'
323
177
  )
324
178
  },
325
-
326
- // the multirowxy and multiline don't need to use colors on the legend
327
- // boxes since their track is drawn with the color. sort of a stylistic choice
179
+ /**
180
+ * #getter
181
+ * the multirowxy and multiline don't need to use colors on the legend
182
+ * boxes since their track is drawn with the color. sort of a stylistic
183
+ * choice
184
+ */
328
185
  get renderColorBoxes() {
329
186
  return !(
330
187
  self.rendererTypeName === 'MultiRowLineRenderer' ||
331
188
  self.rendererTypeName === 'MultiRowXYPlotRenderer'
332
189
  )
333
190
  },
334
-
335
- // positions multi-row below the tracklabel even if using overlap
336
- // tracklabels for everything else
191
+ /**
192
+ * #getter
193
+ * positions multi-row below the tracklabel even if using overlap
194
+ * tracklabels for everything else
195
+ */
337
196
  get prefersOffset() {
338
197
  return this.isMultiRow
339
198
  },
340
-
199
+ /**
200
+ * #getter
201
+ */
341
202
  get sources() {
342
203
  const sources = Object.fromEntries(
343
204
  self.sourcesVolatile?.map(s => [s.name, s]) || [],
@@ -357,82 +218,34 @@ const stateModelFactory = (
357
218
  },
358
219
  }))
359
220
 
360
- .views(self => {
361
- let oldDomain: [number, number] = [0, 0]
362
- return {
363
- get filled(): boolean {
364
- const { fill, rendererConfig } = self
365
- return fill ?? readConfObject(rendererConfig, 'filled')
366
- },
367
- get summaryScoreModeSetting(): string {
368
- const { summaryScoreMode: scoreMode, rendererConfig } = self
369
- return scoreMode ?? readConfObject(rendererConfig, 'summaryScoreMode')
370
- },
371
- get domain() {
372
- const { stats, scaleType, minScore, maxScore } = self
373
- if (!stats) {
374
- return undefined
375
- }
376
- const { scoreMin, scoreMax } = stats
377
-
378
- const ret = getNiceDomain({
379
- domain: [scoreMin, scoreMax],
380
- bounds: [minScore, maxScore],
381
- scaleType,
382
- })
383
-
384
- // avoid weird scalebar if log value and empty region displayed
385
- if (scaleType === 'log' && ret[1] === Number.MIN_VALUE) {
386
- return [0, Number.MIN_VALUE]
387
- }
388
-
389
- // avoid returning a new object if it matches the old value
390
- if (!deepEqual(oldDomain, ret)) {
391
- oldDomain = ret
392
- }
393
-
394
- return oldDomain
395
- },
396
-
397
- get scaleOpts() {
398
- const { scaleType, stats } = self
399
- return {
400
- autoscaleType: this.autoscaleType,
401
- domain: this.domain,
402
- stats,
403
- scaleType,
404
- inverted: getConf(self, 'inverted'),
405
- }
406
- },
407
-
408
- get autoscaleType() {
409
- return self.autoscale ?? (getConf(self, 'autoscale') as string)
410
- },
411
-
412
- get displayCrossHatchesSetting() {
413
- const { displayCrossHatches, rendererConfig } = self
414
- return (
415
- displayCrossHatches ??
416
- (readConfObject(rendererConfig, 'displayCrossHatches') as boolean)
417
- )
418
- },
419
- get rowHeight() {
420
- const { sources, height, isMultiRow } = self
421
- return isMultiRow ? height / (sources?.length || 1) : height
422
- },
423
-
424
- get rowHeightTooSmallForScalebar() {
425
- return this.rowHeight < 70
426
- },
427
-
428
- get useMinimalTicks() {
429
- return (
430
- getConf(self, 'minimalTicks') || this.rowHeightTooSmallForScalebar
431
- )
432
- },
433
- }
434
- })
435
221
  .views(self => ({
222
+ /**
223
+ * #getter
224
+ */
225
+ get rowHeight() {
226
+ const { sources, height, isMultiRow } = self
227
+ return isMultiRow ? height / (sources?.length || 1) : height
228
+ },
229
+ /**
230
+ * #getter
231
+ */
232
+ get rowHeightTooSmallForScalebar() {
233
+ return this.rowHeight < 70
234
+ },
235
+
236
+ /**
237
+ * #getter
238
+ */
239
+ get useMinimalTicks() {
240
+ return (
241
+ getConf(self, 'minimalTicks') || this.rowHeightTooSmallForScalebar
242
+ )
243
+ },
244
+ }))
245
+ .views(self => ({
246
+ /**
247
+ * #getter
248
+ */
436
249
  get ticks() {
437
250
  const { scaleType, domain, isMultiRow, rowHeight, useMinimalTicks } =
438
251
  self
@@ -454,6 +267,9 @@ const stateModelFactory = (
454
267
  return useMinimalTicks ? { ...ticks, values: domain } : ticks
455
268
  },
456
269
 
270
+ /**
271
+ * #getter
272
+ */
457
273
  get colors() {
458
274
  return [
459
275
  'red',
@@ -468,15 +284,13 @@ const stateModelFactory = (
468
284
  'pink',
469
285
  ]
470
286
  },
471
-
472
- get adapterCapabilities() {
473
- const { adapterTypeName } = self
474
- return pluginManager.getAdapterType(adapterTypeName).adapterCapabilities
475
- },
476
287
  }))
477
288
  .views(self => {
478
289
  const { renderProps: superRenderProps } = self
479
290
  return {
291
+ /**
292
+ * #method
293
+ */
480
294
  renderProps() {
481
295
  const superProps = superRenderProps()
482
296
  const {
@@ -510,14 +324,23 @@ const stateModelFactory = (
510
324
  }
511
325
  },
512
326
 
327
+ /**
328
+ * #getter
329
+ */
513
330
  get hasResolution() {
514
331
  return self.adapterCapabilities.includes('hasResolution')
515
332
  },
516
333
 
334
+ /**
335
+ * #getter
336
+ */
517
337
  get hasGlobalStats() {
518
338
  return self.adapterCapabilities.includes('hasGlobalStats')
519
339
  },
520
340
 
341
+ /**
342
+ * #getter
343
+ */
521
344
  get fillSetting() {
522
345
  if (self.filled) {
523
346
  return 0
@@ -533,35 +356,17 @@ const stateModelFactory = (
533
356
  const { trackMenuItems: superTrackMenuItems } = self
534
357
  const hasRenderings = getConf(self, 'defaultRendering')
535
358
  return {
359
+ /**
360
+ * #method
361
+ */
536
362
  trackMenuItems() {
537
363
  return [
538
364
  ...superTrackMenuItems(),
539
- ...(self.hasResolution
540
- ? [
541
- {
542
- label: 'Resolution',
543
- subMenu: [
544
- {
545
- label: 'Finer resolution',
546
- onClick: () => self.setResolution(self.resolution * 5),
547
- },
548
- {
549
- label: 'Coarser resolution',
550
- onClick: () => self.setResolution(self.resolution / 5),
551
- },
552
- ],
553
- },
554
- {
555
- label: 'Summary score mode',
556
- subMenu: ['min', 'max', 'avg', 'whiskers'].map(elt => ({
557
- label: elt,
558
- type: 'radio',
559
- checked: self.summaryScoreModeSetting === elt,
560
- onClick: () => self.setSummaryScoreMode(elt),
561
- })),
562
- },
563
- ]
564
- : []),
365
+ {
366
+ label: 'Score',
367
+ subMenu: self.scoreTrackMenuItems(),
368
+ },
369
+
565
370
  ...(self.canHaveFill
566
371
  ? [
567
372
  {
@@ -577,11 +382,7 @@ const stateModelFactory = (
577
382
  },
578
383
  ]
579
384
  : []),
580
- {
581
- label:
582
- self.scaleType === 'log' ? 'Set linear scale' : 'Set log scale',
583
- onClick: () => self.toggleLogScale(),
584
- },
385
+
585
386
  ...(self.needsScalebar
586
387
  ? [
587
388
  {
@@ -612,36 +413,6 @@ const stateModelFactory = (
612
413
  ]
613
414
  : []),
614
415
 
615
- {
616
- label: 'Autoscale type',
617
- subMenu: [
618
- ['local', 'Local'],
619
- ...(self.hasGlobalStats
620
- ? [
621
- ['global', 'Global'],
622
- ['globalsd', 'Global ± 3σ'],
623
- ]
624
- : []),
625
- ['localsd', 'Local ± 3σ'],
626
- ].map(([val, label]) => {
627
- return {
628
- label,
629
- type: 'radio',
630
- checked: self.autoscaleType === val,
631
- onClick: () => self.setAutoscale(val),
632
- }
633
- }),
634
- },
635
- {
636
- label: 'Set min/max score...',
637
- onClick: () => {
638
- const session = getSession(self)
639
- session.queueDialog(handleClose => [
640
- SetMinMaxDlg,
641
- { model: self, handleClose },
642
- ])
643
- },
644
- },
645
416
  {
646
417
  label: 'Edit colors/arrangement...',
647
418
  onClick: () => {
@@ -656,15 +427,8 @@ const stateModelFactory = (
656
427
  }
657
428
  })
658
429
  .actions(self => {
659
- const { reload: superReload, renderSvg: superRenderSvg } = self
660
-
661
- type ExportSvgOpts = Parameters<typeof superRenderSvg>[0]
662
-
430
+ const { renderSvg: superRenderSvg } = self
663
431
  return {
664
- async reload() {
665
- self.setError()
666
- superReload()
667
- },
668
432
  afterAttach() {
669
433
  quantitativeStatsAutorun(self)
670
434
  addDisposer(
@@ -687,20 +451,17 @@ const stateModelFactory = (
687
451
  }),
688
452
  )
689
453
  },
690
- async renderSvg(opts: ExportSvgOpts) {
691
- await when(() => !!self.stats && !!self.regionCannotBeRenderedText)
692
- const { offsetPx } = getContainingView(self) as LGV
693
- return (
694
- <>
695
- <g id="snpcov">{await superRenderSvg(opts)}</g>
696
- <g transform={`translate(${Math.max(-offsetPx, 0)})`}>
697
- <StatBars model={self} orientation="left" exportSVG />
698
- </g>
699
- </>
700
- )
454
+
455
+ /**
456
+ * #action
457
+ */
458
+ async renderSvg(opts: ExportSvgDisplayOptions) {
459
+ const { renderSvg } = await import('./renderSvg')
460
+ return renderSvg(self, opts, superRenderSvg)
701
461
  },
702
462
  }
703
463
  })
464
+ }
704
465
 
705
466
  export type WiggleDisplayStateModel = ReturnType<typeof stateModelFactory>
706
467
  export type WiggleDisplayModel = Instance<WiggleDisplayStateModel>