@jbrowse/plugin-wiggle 1.7.9 → 2.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 (140) hide show
  1. package/dist/BigWigAdapter/BigWigAdapter.js +176 -284
  2. package/dist/BigWigAdapter/BigWigAdapter.js.map +1 -0
  3. package/dist/BigWigAdapter/configSchema.js +12 -21
  4. package/dist/BigWigAdapter/configSchema.js.map +1 -0
  5. package/dist/BigWigAdapter/index.js +8 -14
  6. package/dist/BigWigAdapter/index.js.map +1 -0
  7. package/dist/DensityRenderer/index.d.ts +1 -1
  8. package/dist/DensityRenderer/index.js +152 -133
  9. package/dist/DensityRenderer/index.js.map +1 -0
  10. package/dist/LinePlotRenderer/LinePlotRenderer.d.ts +1 -1
  11. package/dist/LinePlotRenderer/LinePlotRenderer.js +182 -168
  12. package/dist/LinePlotRenderer/LinePlotRenderer.js.map +1 -0
  13. package/dist/LinePlotRenderer/index.js +19 -33
  14. package/dist/LinePlotRenderer/index.js.map +1 -0
  15. package/dist/LinearWiggleDisplay/components/SetColorDialog.js +95 -105
  16. package/dist/LinearWiggleDisplay/components/SetColorDialog.js.map +1 -0
  17. package/dist/LinearWiggleDisplay/components/SetMinMaxDialog.js +86 -107
  18. package/dist/LinearWiggleDisplay/components/SetMinMaxDialog.js.map +1 -0
  19. package/dist/LinearWiggleDisplay/components/Tooltip.js +147 -152
  20. package/dist/LinearWiggleDisplay/components/Tooltip.js.map +1 -0
  21. package/dist/LinearWiggleDisplay/components/WiggleDisplayComponent.js +44 -50
  22. package/dist/LinearWiggleDisplay/components/WiggleDisplayComponent.js.map +1 -0
  23. package/dist/LinearWiggleDisplay/components/YScaleBar.js +24 -31
  24. package/dist/LinearWiggleDisplay/components/YScaleBar.js.map +1 -0
  25. package/dist/LinearWiggleDisplay/index.js +13 -42
  26. package/dist/LinearWiggleDisplay/index.js.map +1 -0
  27. package/dist/LinearWiggleDisplay/models/configSchema.js +65 -69
  28. package/dist/LinearWiggleDisplay/models/configSchema.js.map +1 -0
  29. package/dist/LinearWiggleDisplay/models/model.d.ts +16 -14
  30. package/dist/LinearWiggleDisplay/models/model.js +585 -694
  31. package/dist/LinearWiggleDisplay/models/model.js.map +1 -0
  32. package/dist/WiggleBaseRenderer.d.ts +3 -3
  33. package/dist/WiggleBaseRenderer.js +119 -129
  34. package/dist/WiggleBaseRenderer.js.map +1 -0
  35. package/dist/WiggleRPC/rpcMethods.js +182 -288
  36. package/dist/WiggleRPC/rpcMethods.js.map +1 -0
  37. package/dist/WiggleRendering.js +107 -102
  38. package/dist/WiggleRendering.js.map +1 -0
  39. package/dist/XYPlotRenderer/XYPlotRenderer.d.ts +1 -1
  40. package/dist/XYPlotRenderer/XYPlotRenderer.js +250 -194
  41. package/dist/XYPlotRenderer/XYPlotRenderer.js.map +1 -0
  42. package/dist/XYPlotRenderer/index.js +30 -33
  43. package/dist/XYPlotRenderer/index.js.map +1 -0
  44. package/dist/configSchema.js +47 -74
  45. package/dist/configSchema.js.map +1 -0
  46. package/dist/index.d.ts +118 -67
  47. package/dist/index.js +167 -242
  48. package/dist/index.js.map +1 -0
  49. package/dist/util.js +112 -143
  50. package/dist/util.js.map +1 -0
  51. package/esm/BigWigAdapter/BigWigAdapter.d.ts +24 -0
  52. package/esm/BigWigAdapter/BigWigAdapter.js +62 -0
  53. package/esm/BigWigAdapter/BigWigAdapter.js.map +1 -0
  54. package/{dist/LinePlotRenderer → esm/BigWigAdapter}/configSchema.d.ts +0 -0
  55. package/esm/BigWigAdapter/configSchema.js +11 -0
  56. package/esm/BigWigAdapter/configSchema.js.map +1 -0
  57. package/esm/BigWigAdapter/index.d.ts +1 -0
  58. package/esm/BigWigAdapter/index.js +2 -0
  59. package/esm/BigWigAdapter/index.js.map +1 -0
  60. package/esm/DensityRenderer/index.d.ts +6 -0
  61. package/esm/DensityRenderer/index.js +39 -0
  62. package/esm/DensityRenderer/index.js.map +1 -0
  63. package/esm/LinePlotRenderer/LinePlotRenderer.d.ts +4 -0
  64. package/esm/LinePlotRenderer/LinePlotRenderer.js +71 -0
  65. package/esm/LinePlotRenderer/LinePlotRenderer.js.map +1 -0
  66. package/esm/LinePlotRenderer/index.d.ts +3 -0
  67. package/esm/LinePlotRenderer/index.js +12 -0
  68. package/esm/LinePlotRenderer/index.js.map +1 -0
  69. package/esm/LinearWiggleDisplay/components/SetColorDialog.d.ts +10 -0
  70. package/esm/LinearWiggleDisplay/components/SetColorDialog.js +55 -0
  71. package/esm/LinearWiggleDisplay/components/SetColorDialog.js.map +1 -0
  72. package/esm/LinearWiggleDisplay/components/SetMinMaxDialog.d.ts +11 -0
  73. package/esm/LinearWiggleDisplay/components/SetMinMaxDialog.js +46 -0
  74. package/esm/LinearWiggleDisplay/components/SetMinMaxDialog.js.map +1 -0
  75. package/esm/LinearWiggleDisplay/components/Tooltip.d.ts +24 -0
  76. package/esm/LinearWiggleDisplay/components/Tooltip.js +107 -0
  77. package/esm/LinearWiggleDisplay/components/Tooltip.js.map +1 -0
  78. package/esm/LinearWiggleDisplay/components/WiggleDisplayComponent.d.ts +8 -0
  79. package/esm/LinearWiggleDisplay/components/WiggleDisplayComponent.js +29 -0
  80. package/esm/LinearWiggleDisplay/components/WiggleDisplayComponent.js.map +1 -0
  81. package/esm/LinearWiggleDisplay/components/YScaleBar.d.ts +7 -0
  82. package/esm/LinearWiggleDisplay/components/YScaleBar.js +9 -0
  83. package/esm/LinearWiggleDisplay/components/YScaleBar.js.map +1 -0
  84. package/esm/LinearWiggleDisplay/index.d.ts +3 -0
  85. package/esm/LinearWiggleDisplay/index.js +4 -0
  86. package/esm/LinearWiggleDisplay/index.js.map +1 -0
  87. package/esm/LinearWiggleDisplay/models/configSchema.d.ts +2 -0
  88. package/esm/LinearWiggleDisplay/models/configSchema.js +64 -0
  89. package/esm/LinearWiggleDisplay/models/configSchema.js.map +1 -0
  90. package/esm/LinearWiggleDisplay/models/model.d.ts +290 -0
  91. package/esm/LinearWiggleDisplay/models/model.js +495 -0
  92. package/esm/LinearWiggleDisplay/models/model.js.map +1 -0
  93. package/esm/WiggleBaseRenderer.d.ts +55 -0
  94. package/esm/WiggleBaseRenderer.js +34 -0
  95. package/esm/WiggleBaseRenderer.js.map +1 -0
  96. package/esm/WiggleRPC/rpcMethods.d.ts +31 -0
  97. package/esm/WiggleRPC/rpcMethods.js +70 -0
  98. package/esm/WiggleRPC/rpcMethods.js.map +1 -0
  99. package/esm/WiggleRendering.d.ts +16 -0
  100. package/esm/WiggleRendering.js +40 -0
  101. package/esm/WiggleRendering.js.map +1 -0
  102. package/esm/XYPlotRenderer/XYPlotRenderer.d.ts +4 -0
  103. package/esm/XYPlotRenderer/XYPlotRenderer.js +109 -0
  104. package/esm/XYPlotRenderer/XYPlotRenderer.js.map +1 -0
  105. package/esm/XYPlotRenderer/index.d.ts +3 -0
  106. package/esm/XYPlotRenderer/index.js +23 -0
  107. package/esm/XYPlotRenderer/index.js.map +1 -0
  108. package/esm/configSchema.d.ts +2 -0
  109. package/esm/configSchema.js +46 -0
  110. package/esm/configSchema.js.map +1 -0
  111. package/esm/index.d.ts +917 -0
  112. package/esm/index.js +115 -0
  113. package/esm/index.js.map +1 -0
  114. package/esm/util.d.ts +41 -0
  115. package/esm/util.js +123 -0
  116. package/esm/util.js.map +1 -0
  117. package/package.json +21 -13
  118. package/src/DensityRenderer/DensityRenderer.test.js +5 -0
  119. package/src/DensityRenderer/index.ts +1 -1
  120. package/src/LinePlotRenderer/LinePlotRenderer.js +1 -1
  121. package/src/LinePlotRenderer/index.js +7 -1
  122. package/src/LinearWiggleDisplay/components/SetColorDialog.tsx +10 -13
  123. package/src/LinearWiggleDisplay/components/SetMinMaxDialog.tsx +13 -11
  124. package/src/LinearWiggleDisplay/components/Tooltip.tsx +4 -3
  125. package/src/LinearWiggleDisplay/components/WiggleDisplayComponent.tsx +9 -4
  126. package/src/LinearWiggleDisplay/models/model.tsx +58 -69
  127. package/src/WiggleBaseRenderer.tsx +3 -3
  128. package/src/XYPlotRenderer/XYPlotRenderer.test.js +5 -0
  129. package/src/XYPlotRenderer/XYPlotRenderer.ts +87 -40
  130. package/src/XYPlotRenderer/index.ts +19 -2
  131. package/src/configSchema.ts +0 -23
  132. package/dist/BigWigAdapter/BigWigAdapter.test.js +0 -157
  133. package/dist/DensityRenderer/DensityRenderer.test.js +0 -84
  134. package/dist/LinePlotRenderer/configSchema.js +0 -70
  135. package/dist/WiggleRendering.test.js +0 -52
  136. package/dist/XYPlotRenderer/XYPlotRenderer.test.js +0 -83
  137. package/dist/declare.d.js +0 -1
  138. package/dist/index.test.js +0 -24
  139. package/dist/util.test.js +0 -66
  140. package/src/LinePlotRenderer/configSchema.js +0 -68
@@ -201,12 +201,12 @@ const stateModelFactory = (
201
201
 
202
202
  get maxScore() {
203
203
  const { max } = self.constraints
204
- return max !== undefined ? max : getConf(self, 'maxScore')
204
+ return max ?? getConf(self, 'maxScore')
205
205
  },
206
206
 
207
207
  get minScore() {
208
208
  const { min } = self.constraints
209
- return min !== undefined ? min : getConf(self, 'minScore')
209
+ return min ?? getConf(self, 'minScore')
210
210
  },
211
211
  }))
212
212
  .views(self => ({
@@ -214,16 +214,26 @@ const stateModelFactory = (
214
214
  const configBlob =
215
215
  getConf(self, ['renderers', self.rendererTypeName]) || {}
216
216
 
217
+ const {
218
+ color,
219
+ posColor,
220
+ negColor,
221
+ summaryScoreMode,
222
+ scaleType,
223
+ displayCrossHatches,
224
+ fill,
225
+ } = self
226
+
217
227
  return self.rendererType.configSchema.create(
218
228
  {
219
229
  ...configBlob,
220
- filled: self.fill,
221
- scaleType: self.scaleType,
222
- displayCrossHatches: self.displayCrossHatches,
223
- summaryScoreMode: self.summaryScoreMode,
224
- ...(self.color ? { color: self.color } : {}),
225
- ...(self.negColor ? { negColor: self.negColor } : {}),
226
- ...(self.posColor ? { posColor: self.posColor } : {}),
230
+ ...(scaleType ? { scaleType } : {}),
231
+ ...(fill ? { filled: fill } : {}),
232
+ ...(displayCrossHatches ? { displayCrossHatches } : {}),
233
+ ...(summaryScoreMode ? { summaryScoreMode } : {}),
234
+ ...(color ? { color } : {}),
235
+ ...(negColor ? { negColor } : {}),
236
+ ...(posColor ? { posColor } : {}),
227
237
  },
228
238
  getEnv(self),
229
239
  )
@@ -233,22 +243,18 @@ const stateModelFactory = (
233
243
  let oldDomain: [number, number] = [0, 0]
234
244
  return {
235
245
  get filled() {
236
- return typeof self.fill !== 'undefined'
237
- ? self.fill
238
- : readConfObject(self.rendererConfig, 'filled')
246
+ const { fill, rendererConfig: conf } = self
247
+ return fill ?? readConfObject(conf, 'filled')
239
248
  },
240
249
  get summaryScoreModeSetting() {
241
- return (
242
- self.summaryScoreMode ||
243
- readConfObject(self.rendererConfig, 'summaryScoreMode')
244
- )
250
+ const { summaryScoreMode, rendererConfig: conf } = self
251
+ return summaryScoreMode ?? readConfObject(conf, 'summaryScoreMode')
245
252
  },
246
253
  get domain() {
247
254
  const { stats, scaleType, minScore, maxScore } = self
248
- const { scoreMin, scoreMax } = stats
249
255
 
250
256
  const ret = getNiceDomain({
251
- domain: [scoreMin, scoreMax],
257
+ domain: [stats.scoreMin, stats.scoreMax],
252
258
  bounds: [minScore, maxScore],
253
259
  scaleType,
254
260
  })
@@ -287,14 +293,12 @@ const stateModelFactory = (
287
293
  },
288
294
 
289
295
  get autoscaleType() {
290
- return self.autoscale || getConf(self, 'autoscale')
296
+ return self.autoscale ?? getConf(self, 'autoscale')
291
297
  },
292
298
 
293
299
  get displayCrossHatchesSetting() {
294
- return (
295
- self.displayCrossHatches ||
296
- readConfObject(self.rendererConfig, 'displayCrossHatches')
297
- )
300
+ const { displayCrossHatches: hatches, rendererConfig: conf } = self
301
+ return hatches ?? readConfObject(conf, 'displayCrossHatches')
298
302
  },
299
303
  }
300
304
  })
@@ -320,18 +324,19 @@ const stateModelFactory = (
320
324
  return {
321
325
  renderProps() {
322
326
  const superProps = superRenderProps()
327
+ const { filters, ticks, height, resolution, scaleOpts } = self
323
328
  return {
324
329
  ...superProps,
325
330
  notReady: superProps.notReady || !self.statsReady,
326
331
  rpcDriverName: self.rpcDriverName,
327
332
  displayModel: self,
328
333
  config: self.rendererConfig,
329
- scaleOpts: self.scaleOpts,
330
- resolution: self.resolution,
331
- height: self.height,
332
- ticks: self.ticks,
333
- displayCrossHatches: self.displayCrossHatches,
334
- filters: self.filters,
334
+ displayCrossHatches: self.displayCrossHatchesSetting,
335
+ scaleOpts,
336
+ resolution,
337
+ height,
338
+ ticks,
339
+ filters,
335
340
  }
336
341
  },
337
342
 
@@ -351,6 +356,7 @@ const stateModelFactory = (
351
356
  })
352
357
  .views(self => {
353
358
  const { trackMenuItems: superTrackMenuItems } = self
359
+ const hasRenderings = getConf(self, 'defaultRendering')
354
360
  return {
355
361
  trackMenuItems() {
356
362
  return [
@@ -362,26 +368,20 @@ const stateModelFactory = (
362
368
  subMenu: [
363
369
  {
364
370
  label: 'Finer resolution',
365
- onClick: () => {
366
- self.setResolution(self.resolution * 5)
367
- },
371
+ onClick: () => self.setResolution(self.resolution * 5),
368
372
  },
369
373
  {
370
374
  label: 'Coarser resolution',
371
- onClick: () => {
372
- self.setResolution(self.resolution / 5)
373
- },
375
+ onClick: () => self.setResolution(self.resolution / 5),
374
376
  },
375
377
  ],
376
378
  },
377
379
  {
378
380
  label: 'Summary score mode',
379
- subMenu: ['min', 'max', 'avg', 'whiskers'].map(elt => {
380
- return {
381
- label: elt,
382
- onClick: () => self.setSummaryScoreMode(elt),
383
- }
384
- }),
381
+ subMenu: ['min', 'max', 'avg', 'whiskers'].map(elt => ({
382
+ label: elt,
383
+ onClick: () => self.setSummaryScoreMode(elt),
384
+ })),
385
385
  },
386
386
  ]
387
387
  : []),
@@ -391,33 +391,26 @@ const stateModelFactory = (
391
391
  label: self.filled
392
392
  ? 'Turn off histogram fill'
393
393
  : 'Turn on histogram fill',
394
- onClick: () => {
395
- self.setFill(!self.filled)
396
- },
394
+ onClick: () => self.setFill(!self.filled),
397
395
  },
398
396
  ]
399
397
  : []),
400
398
  {
401
399
  label:
402
400
  self.scaleType === 'log' ? 'Set linear scale' : 'Set log scale',
403
- onClick: () => {
404
- self.toggleLogScale()
405
- },
401
+ onClick: () => self.toggleLogScale(),
406
402
  },
407
403
  {
408
404
  type: 'checkbox',
409
405
  label: 'Draw cross hatches',
410
406
  checked: self.displayCrossHatchesSetting,
411
- onClick: () => {
412
- self.toggleCrossHatches()
413
- },
407
+ onClick: () => self.toggleCrossHatches(),
414
408
  },
415
-
416
- ...(Object.keys(getConf(self, 'renderers') || {}).length > 1
409
+ ...(hasRenderings
417
410
  ? [
418
411
  {
419
412
  label: 'Renderer type',
420
- subMenu: [...rendererTypes.keys()].map(key => ({
413
+ subMenu: ['xyplot', 'density', 'line'].map(key => ({
421
414
  label: key,
422
415
  onClick: () => self.setRendererType(key),
423
416
  })),
@@ -435,30 +428,26 @@ const stateModelFactory = (
435
428
  ]
436
429
  : []),
437
430
  ['localsd', 'Local ± 3σ'],
438
- ].map(([val, label]) => {
439
- return {
440
- label,
441
- onClick() {
442
- self.setAutoscale(val)
443
- },
444
- }
445
- }),
431
+ ].map(([val, label]) => ({
432
+ label,
433
+ onClick: () => self.setAutoscale(val),
434
+ })),
446
435
  },
447
436
  {
448
437
  label: 'Set min/max score',
449
438
  onClick: () => {
450
- getSession(self).queueDialog(doneCallback => [
439
+ getSession(self).queueDialog(handleClose => [
451
440
  SetMinMaxDlg,
452
- { model: self, handleClose: doneCallback },
441
+ { model: self, handleClose },
453
442
  ])
454
443
  },
455
444
  },
456
445
  {
457
446
  label: 'Set color',
458
447
  onClick: () => {
459
- getSession(self).queueDialog(doneCallback => [
448
+ getSession(self).queueDialog(handleClose => [
460
449
  SetColorDlg,
461
- { model: self, handleClose: doneCallback },
450
+ { model: self, handleClose },
462
451
  ])
463
452
  },
464
453
  },
@@ -554,9 +543,9 @@ const stateModelFactory = (
554
543
  async reload() {
555
544
  self.setError()
556
545
  const aborter = new AbortController()
557
- let stats
546
+ self.setLoading(aborter)
558
547
  try {
559
- stats = await getStats({
548
+ const stats = await getStats({
560
549
  signal: aborter.signal,
561
550
  ...self.renderProps(),
562
551
  })
@@ -574,9 +563,7 @@ const stateModelFactory = (
574
563
  autorun(
575
564
  async () => {
576
565
  try {
577
- const aborter = new AbortController()
578
566
  const view = getContainingView(self) as LGV
579
- self.setLoading(aborter)
580
567
 
581
568
  if (!view.initialized) {
582
569
  return
@@ -588,6 +575,8 @@ const stateModelFactory = (
588
575
  if (self.regionTooLarge) {
589
576
  return
590
577
  }
578
+ const aborter = new AbortController()
579
+ self.setLoading(aborter)
591
580
 
592
581
  const wiggleStats = await getStats({
593
582
  signal: aborter.signal,
@@ -8,7 +8,7 @@ import FeatureRendererType, {
8
8
  ResultsDeserialized,
9
9
  } from '@jbrowse/core/pluggableElementTypes/renderers/FeatureRendererType'
10
10
  import { renderToAbstractCanvas } from '@jbrowse/core/util/offscreenCanvasUtils'
11
- import { ThemeOptions } from '@material-ui/core'
11
+ import { ThemeOptions } from '@mui/material'
12
12
  import { ScaleOpts } from './util'
13
13
 
14
14
  export interface RenderArgs extends FeatureRenderArgs {
@@ -22,7 +22,7 @@ export interface RenderArgsDeserialized extends FeatureRenderArgsDeserialized {
22
22
  scaleOpts: ScaleOpts
23
23
  displayCrossHatches: boolean
24
24
  ticks: { values: number[] }
25
- theme: ThemeOptions
25
+ themeOptions: ThemeOptions
26
26
  }
27
27
 
28
28
  export interface RenderArgsDeserializedWithFeatures
@@ -82,5 +82,5 @@ export default abstract class WiggleBaseRenderer extends FeatureRendererType {
82
82
  abstract draw<T extends RenderArgsDeserializedWithFeatures>(
83
83
  ctx: CanvasRenderingContext2D,
84
84
  props: T,
85
- ): void
85
+ ): Promise<void>
86
86
  }
@@ -2,6 +2,11 @@ import SimpleFeature from '@jbrowse/core/util/simpleFeature'
2
2
  import { renderToAbstractCanvas } from '@jbrowse/core/util/offscreenCanvasUtils'
3
3
  import XYPlotRenderer, { configSchema, ReactComponent } from '.'
4
4
 
5
+ import { Image, createCanvas } from 'canvas'
6
+
7
+ global.nodeImage = Image
8
+ global.nodeCreateCanvas = createCanvas
9
+
5
10
  test('several features', async () => {
6
11
  const pluginManager = {}
7
12
  const renderer = new XYPlotRenderer({
@@ -1,15 +1,36 @@
1
1
  import { readConfObject } from '@jbrowse/core/configuration'
2
2
  import { featureSpanPx } from '@jbrowse/core/util'
3
- import Color from 'color'
4
- import { Feature } from '@jbrowse/core/util/simpleFeature'
3
+ import { Feature } from '@jbrowse/core/util'
5
4
  import { getOrigin, getScale } from '../util'
6
5
  import WiggleBaseRenderer, {
7
6
  RenderArgsDeserializedWithFeatures,
8
7
  } from '../WiggleBaseRenderer'
9
8
  import { YSCALEBAR_LABEL_OFFSET } from '../LinearWiggleDisplay/models/model'
10
9
 
10
+ function fillRect(
11
+ ctx: CanvasRenderingContext2D,
12
+ x: number,
13
+ y: number,
14
+ width: number,
15
+ height: number,
16
+ color?: string,
17
+ ) {
18
+ if (color) {
19
+ ctx.fillStyle = String(color)
20
+ }
21
+ if (width < 0) {
22
+ x += width
23
+ width = -width
24
+ }
25
+ if (height < 0) {
26
+ y += height
27
+ height = -height
28
+ }
29
+ ctx.fillRect(x, y, width, height)
30
+ }
31
+
11
32
  export default class XYPlotRenderer extends WiggleBaseRenderer {
12
- draw(
33
+ async draw(
13
34
  ctx: CanvasRenderingContext2D,
14
35
  props: RenderArgsDeserializedWithFeatures,
15
36
  ) {
@@ -23,22 +44,27 @@ export default class XYPlotRenderer extends WiggleBaseRenderer {
23
44
  ticks,
24
45
  displayCrossHatches,
25
46
  } = props
47
+ const Color = await import('color').then(f => f.default)
26
48
  const [region] = regions
27
49
  const width = (region.end - region.start) / bpPerPx
28
50
 
51
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
52
+ const rc = (s: string, rest?: Record<string, any>) =>
53
+ readConfObject(config, s, rest)
54
+
29
55
  // the adjusted height takes into account YSCALEBAR_LABEL_OFFSET from the
30
56
  // wiggle display, and makes the height of the actual drawn area add
31
57
  // "padding" to the top and bottom of the display
32
58
  const offset = YSCALEBAR_LABEL_OFFSET
33
59
  const height = unadjustedHeight - offset * 2
34
60
 
35
- const pivotValue = readConfObject(config, 'bicolorPivotValue')
36
- const negColor = readConfObject(config, 'negColor')
37
- const posColor = readConfObject(config, 'posColor')
38
- const filled = readConfObject(config, 'filled')
39
- const clipColor = readConfObject(config, 'clipColor')
40
- const highlightColor = readConfObject(config, 'highlightColor')
41
- const summaryScoreMode = readConfObject(config, 'summaryScoreMode')
61
+ const pivotValue = rc('bicolorPivotValue')
62
+ const negColor = rc('negColor')
63
+ const posColor = rc('posColor')
64
+ const filled = rc('filled')
65
+ const clipColor = rc('clipColor')
66
+ const highlightColor = rc('highlightColor')
67
+ const summaryScoreMode = rc('summaryScoreMode')
42
68
 
43
69
  const scale = getScale({ ...scaleOpts, range: [0, height] })
44
70
  const originY = getOrigin(scaleOpts.scaleType)
@@ -48,11 +74,10 @@ export default class XYPlotRenderer extends WiggleBaseRenderer {
48
74
  const toHeight = (n: number) => toY(originY) - toY(n)
49
75
 
50
76
  const colorCallback =
51
- readConfObject(config, 'color') === '#f0f'
77
+ rc('color') === '#f0f'
52
78
  ? (_: Feature, score: number) =>
53
79
  score < pivotValue ? negColor : posColor
54
- : (feature: Feature, _score: number) =>
55
- readConfObject(config, 'color', { feature })
80
+ : (feature: Feature, _score: number) => rc('color', { feature })
56
81
 
57
82
  const crossingOrigin = niceMin < pivotValue && niceMax > pivotValue
58
83
  for (const feature of features.values()) {
@@ -69,62 +94,84 @@ export default class XYPlotRenderer extends WiggleBaseRenderer {
69
94
 
70
95
  if (summaryScoreMode === 'max') {
71
96
  score = summary ? maxr : score
72
- ctx.fillStyle = colorCallback(feature, score)
73
- ctx.fillRect(leftPx, toY(score), w, filled ? toHeight(score) : 1)
97
+ fillRect(
98
+ ctx,
99
+ leftPx,
100
+ toY(score),
101
+ w,
102
+ filled ? toHeight(score) : 1,
103
+ colorCallback(feature, score),
104
+ )
74
105
  } else if (summaryScoreMode === 'min') {
75
106
  score = summary ? minr : score
76
- ctx.fillStyle = colorCallback(feature, score)
77
- ctx.fillRect(leftPx, toY(score), w, filled ? toHeight(score) : 1)
107
+ fillRect(
108
+ ctx,
109
+ leftPx,
110
+ toY(score),
111
+ w,
112
+ filled ? toHeight(score) : 1,
113
+ colorCallback(feature, score),
114
+ )
78
115
  } else if (summaryScoreMode === 'whiskers') {
79
116
  const c = colorCallback(feature, score)
80
117
  if (summary) {
81
- ctx.fillStyle = crossingOrigin
82
- ? colorCallback(feature, maxr)
83
- : Color(c).lighten(0.6).toString()
84
- ctx.fillRect(
118
+ fillRect(
119
+ ctx,
85
120
  leftPx,
86
121
  toY(maxr),
87
122
  w,
88
123
  filled ? toHeight(maxr) - toHeight(score) : 1,
124
+ crossingOrigin
125
+ ? colorCallback(feature, maxr)
126
+ : Color(c).lighten(0.6),
89
127
  )
90
128
  }
91
129
 
92
130
  // normal
93
- ctx.fillStyle =
94
- crossingOrigin && summary
95
- ? Color(colorCallback(feature, maxr)).mix(
96
- Color(colorCallback(feature, minr)),
97
- )
98
- : c
99
- ctx.fillRect(
131
+ fillRect(
132
+ ctx,
100
133
  leftPx,
101
134
  toY(score),
102
135
  w,
103
136
  filled ? toHeight(score) - (summary ? toHeight(minr) : 0) : 1,
137
+ crossingOrigin && summary
138
+ ? Color(colorCallback(feature, maxr)).mix(
139
+ Color(colorCallback(feature, minr)),
140
+ )
141
+ : c,
104
142
  )
105
143
 
106
144
  // min
107
145
  if (summary) {
108
- ctx.fillStyle = crossingOrigin
109
- ? colorCallback(feature, minr)
110
- : Color(c).darken(0.6).toString()
111
- ctx.fillRect(leftPx, toY(minr), w, filled ? toHeight(minr) : 1)
146
+ fillRect(
147
+ ctx,
148
+ leftPx,
149
+ toY(minr),
150
+ w,
151
+ filled ? toHeight(minr) : 1,
152
+ crossingOrigin
153
+ ? colorCallback(feature, minr)
154
+ : Color(c).darken(0.6),
155
+ )
112
156
  }
113
157
  } else {
114
- ctx.fillStyle = colorCallback(feature, score)
115
- ctx.fillRect(leftPx, toY(score), w, filled ? toHeight(score) : 1)
158
+ fillRect(
159
+ ctx,
160
+ leftPx,
161
+ toY(score),
162
+ w,
163
+ filled ? toHeight(score) : 1,
164
+ colorCallback(feature, score),
165
+ )
116
166
  }
117
167
 
118
168
  if (highClipping) {
119
- ctx.fillStyle = clipColor
120
- ctx.fillRect(leftPx, 0, w, 4)
169
+ fillRect(ctx, leftPx, 0, w, 4, clipColor)
121
170
  } else if (lowClipping && scaleOpts.scaleType !== 'log') {
122
- ctx.fillStyle = clipColor
123
- ctx.fillRect(leftPx, unadjustedHeight - 4, w, 4)
171
+ fillRect(ctx, leftPx, unadjustedHeight - 4, w, 4, clipColor)
124
172
  }
125
173
  if (feature.get('highlighted')) {
126
- ctx.fillStyle = highlightColor
127
- ctx.fillRect(leftPx, 0, w, height)
174
+ fillRect(ctx, leftPx, 0, w, height, highlightColor)
128
175
  }
129
176
  }
130
177
 
@@ -1,11 +1,28 @@
1
1
  import { ConfigurationSchema } from '@jbrowse/core/configuration'
2
2
  import ConfigSchema from '../configSchema'
3
-
3
+ import { types } from 'mobx-state-tree'
4
4
  export { default as ReactComponent } from '../WiggleRendering'
5
5
  export { default } from './XYPlotRenderer'
6
6
 
7
7
  export const configSchema = ConfigurationSchema(
8
8
  'XYPlotRenderer',
9
- {},
9
+ {
10
+ filled: {
11
+ type: 'boolean',
12
+ defaultValue: true,
13
+ },
14
+ displayCrossHatches: {
15
+ type: 'boolean',
16
+ description: 'choose to draw cross hatches (sideways lines)',
17
+ defaultValue: false,
18
+ },
19
+ summaryScoreMode: {
20
+ type: 'stringEnum',
21
+ model: types.enumeration('Score type', ['max', 'min', 'avg', 'whiskers']),
22
+ description:
23
+ 'choose whether to use max/min/average or whiskers which combines all three into the same rendering',
24
+ defaultValue: 'whiskers',
25
+ },
26
+ },
10
27
  { baseConfiguration: ConfigSchema, explicitlyTyped: true },
11
28
  )
@@ -29,17 +29,6 @@ export default ConfigurationSchema(
29
29
  description: 'the color of the clipping marker',
30
30
  defaultValue: 'red',
31
31
  },
32
- renderType: {
33
- type: 'stringEnum',
34
- model: types.enumeration('Rendering type', ['xyplot', 'density', 'line']),
35
- description: 'The type of rendering for wiggle data to use',
36
- defaultValue: 'xyplot',
37
- },
38
- filled: {
39
- type: 'boolean',
40
- description: 'fill in histogram',
41
- defaultValue: true,
42
- },
43
32
  bicolorPivot: {
44
33
  type: 'stringEnum',
45
34
  model: types.enumeration('Scale type', [
@@ -56,18 +45,6 @@ export default ConfigurationSchema(
56
45
  defaultValue: 0,
57
46
  description: 'value to use for bicolor pivot',
58
47
  },
59
- summaryScoreMode: {
60
- type: 'stringEnum',
61
- model: types.enumeration('Score type', ['max', 'min', 'avg', 'whiskers']),
62
- description:
63
- 'choose whether to use max/min/average or whiskers which combines all three into the same rendering',
64
- defaultValue: 'whiskers',
65
- },
66
- displayCrossHatches: {
67
- type: 'boolean',
68
- description: 'choose to draw cross hatches (sideways lines)',
69
- defaultValue: false,
70
- },
71
48
  },
72
49
  { explicitlyTyped: true },
73
50
  )