@jbrowse/plugin-wiggle 1.7.11 → 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 (138) 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 +15 -13
  30. package/dist/LinearWiggleDisplay/models/model.js +585 -696
  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 +115 -64
  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/index.ts +1 -1
  119. package/src/LinePlotRenderer/LinePlotRenderer.js +1 -1
  120. package/src/LinePlotRenderer/index.js +7 -1
  121. package/src/LinearWiggleDisplay/components/SetColorDialog.tsx +10 -13
  122. package/src/LinearWiggleDisplay/components/SetMinMaxDialog.tsx +13 -11
  123. package/src/LinearWiggleDisplay/components/Tooltip.tsx +4 -3
  124. package/src/LinearWiggleDisplay/components/WiggleDisplayComponent.tsx +9 -4
  125. package/src/LinearWiggleDisplay/models/model.tsx +56 -65
  126. package/src/WiggleBaseRenderer.tsx +3 -3
  127. package/src/XYPlotRenderer/XYPlotRenderer.ts +87 -40
  128. package/src/XYPlotRenderer/index.ts +19 -2
  129. package/src/configSchema.ts +0 -23
  130. package/dist/BigWigAdapter/BigWigAdapter.test.js +0 -157
  131. package/dist/DensityRenderer/DensityRenderer.test.js +0 -88
  132. package/dist/LinePlotRenderer/configSchema.js +0 -70
  133. package/dist/WiggleRendering.test.js +0 -52
  134. package/dist/XYPlotRenderer/XYPlotRenderer.test.js +0 -87
  135. package/dist/declare.d.js +0 -1
  136. package/dist/index.test.js +0 -24
  137. package/dist/util.test.js +0 -66
  138. package/src/LinePlotRenderer/configSchema.js +0 -68
@@ -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,20 +243,18 @@ const stateModelFactory = (
233
243
  let oldDomain: [number, number] = [0, 0]
234
244
  return {
235
245
  get filled() {
236
- return self.fill ?? readConfObject(self.rendererConfig, 'filled')
246
+ const { fill, rendererConfig: conf } = self
247
+ return fill ?? readConfObject(conf, 'filled')
237
248
  },
238
249
  get summaryScoreModeSetting() {
239
- return (
240
- self.summaryScoreMode ||
241
- readConfObject(self.rendererConfig, 'summaryScoreMode')
242
- )
250
+ const { summaryScoreMode, rendererConfig: conf } = self
251
+ return summaryScoreMode ?? readConfObject(conf, 'summaryScoreMode')
243
252
  },
244
253
  get domain() {
245
254
  const { stats, scaleType, minScore, maxScore } = self
246
- const { scoreMin, scoreMax } = stats
247
255
 
248
256
  const ret = getNiceDomain({
249
- domain: [scoreMin, scoreMax],
257
+ domain: [stats.scoreMin, stats.scoreMax],
250
258
  bounds: [minScore, maxScore],
251
259
  scaleType,
252
260
  })
@@ -285,14 +293,12 @@ const stateModelFactory = (
285
293
  },
286
294
 
287
295
  get autoscaleType() {
288
- return self.autoscale || getConf(self, 'autoscale')
296
+ return self.autoscale ?? getConf(self, 'autoscale')
289
297
  },
290
298
 
291
299
  get displayCrossHatchesSetting() {
292
- return (
293
- self.displayCrossHatches ||
294
- readConfObject(self.rendererConfig, 'displayCrossHatches')
295
- )
300
+ const { displayCrossHatches: hatches, rendererConfig: conf } = self
301
+ return hatches ?? readConfObject(conf, 'displayCrossHatches')
296
302
  },
297
303
  }
298
304
  })
@@ -318,18 +324,19 @@ const stateModelFactory = (
318
324
  return {
319
325
  renderProps() {
320
326
  const superProps = superRenderProps()
327
+ const { filters, ticks, height, resolution, scaleOpts } = self
321
328
  return {
322
329
  ...superProps,
323
330
  notReady: superProps.notReady || !self.statsReady,
324
331
  rpcDriverName: self.rpcDriverName,
325
332
  displayModel: self,
326
333
  config: self.rendererConfig,
327
- scaleOpts: self.scaleOpts,
328
- resolution: self.resolution,
329
- height: self.height,
330
- ticks: self.ticks,
331
- displayCrossHatches: self.displayCrossHatches,
332
- filters: self.filters,
334
+ displayCrossHatches: self.displayCrossHatchesSetting,
335
+ scaleOpts,
336
+ resolution,
337
+ height,
338
+ ticks,
339
+ filters,
333
340
  }
334
341
  },
335
342
 
@@ -349,6 +356,7 @@ const stateModelFactory = (
349
356
  })
350
357
  .views(self => {
351
358
  const { trackMenuItems: superTrackMenuItems } = self
359
+ const hasRenderings = getConf(self, 'defaultRendering')
352
360
  return {
353
361
  trackMenuItems() {
354
362
  return [
@@ -360,26 +368,20 @@ const stateModelFactory = (
360
368
  subMenu: [
361
369
  {
362
370
  label: 'Finer resolution',
363
- onClick: () => {
364
- self.setResolution(self.resolution * 5)
365
- },
371
+ onClick: () => self.setResolution(self.resolution * 5),
366
372
  },
367
373
  {
368
374
  label: 'Coarser resolution',
369
- onClick: () => {
370
- self.setResolution(self.resolution / 5)
371
- },
375
+ onClick: () => self.setResolution(self.resolution / 5),
372
376
  },
373
377
  ],
374
378
  },
375
379
  {
376
380
  label: 'Summary score mode',
377
- subMenu: ['min', 'max', 'avg', 'whiskers'].map(elt => {
378
- return {
379
- label: elt,
380
- onClick: () => self.setSummaryScoreMode(elt),
381
- }
382
- }),
381
+ subMenu: ['min', 'max', 'avg', 'whiskers'].map(elt => ({
382
+ label: elt,
383
+ onClick: () => self.setSummaryScoreMode(elt),
384
+ })),
383
385
  },
384
386
  ]
385
387
  : []),
@@ -389,33 +391,26 @@ const stateModelFactory = (
389
391
  label: self.filled
390
392
  ? 'Turn off histogram fill'
391
393
  : 'Turn on histogram fill',
392
- onClick: () => {
393
- self.setFill(!self.filled)
394
- },
394
+ onClick: () => self.setFill(!self.filled),
395
395
  },
396
396
  ]
397
397
  : []),
398
398
  {
399
399
  label:
400
400
  self.scaleType === 'log' ? 'Set linear scale' : 'Set log scale',
401
- onClick: () => {
402
- self.toggleLogScale()
403
- },
401
+ onClick: () => self.toggleLogScale(),
404
402
  },
405
403
  {
406
404
  type: 'checkbox',
407
405
  label: 'Draw cross hatches',
408
406
  checked: self.displayCrossHatchesSetting,
409
- onClick: () => {
410
- self.toggleCrossHatches()
411
- },
407
+ onClick: () => self.toggleCrossHatches(),
412
408
  },
413
-
414
- ...(Object.keys(getConf(self, 'renderers') || {}).length > 1
409
+ ...(hasRenderings
415
410
  ? [
416
411
  {
417
412
  label: 'Renderer type',
418
- subMenu: [...rendererTypes.keys()].map(key => ({
413
+ subMenu: ['xyplot', 'density', 'line'].map(key => ({
419
414
  label: key,
420
415
  onClick: () => self.setRendererType(key),
421
416
  })),
@@ -433,30 +428,26 @@ const stateModelFactory = (
433
428
  ]
434
429
  : []),
435
430
  ['localsd', 'Local ± 3σ'],
436
- ].map(([val, label]) => {
437
- return {
438
- label,
439
- onClick() {
440
- self.setAutoscale(val)
441
- },
442
- }
443
- }),
431
+ ].map(([val, label]) => ({
432
+ label,
433
+ onClick: () => self.setAutoscale(val),
434
+ })),
444
435
  },
445
436
  {
446
437
  label: 'Set min/max score',
447
438
  onClick: () => {
448
- getSession(self).queueDialog(doneCallback => [
439
+ getSession(self).queueDialog(handleClose => [
449
440
  SetMinMaxDlg,
450
- { model: self, handleClose: doneCallback },
441
+ { model: self, handleClose },
451
442
  ])
452
443
  },
453
444
  },
454
445
  {
455
446
  label: 'Set color',
456
447
  onClick: () => {
457
- getSession(self).queueDialog(doneCallback => [
448
+ getSession(self).queueDialog(handleClose => [
458
449
  SetColorDlg,
459
- { model: self, handleClose: doneCallback },
450
+ { model: self, handleClose },
460
451
  ])
461
452
  },
462
453
  },
@@ -552,9 +543,9 @@ const stateModelFactory = (
552
543
  async reload() {
553
544
  self.setError()
554
545
  const aborter = new AbortController()
555
- let stats
546
+ self.setLoading(aborter)
556
547
  try {
557
- stats = await getStats({
548
+ const stats = await getStats({
558
549
  signal: aborter.signal,
559
550
  ...self.renderProps(),
560
551
  })
@@ -572,9 +563,7 @@ const stateModelFactory = (
572
563
  autorun(
573
564
  async () => {
574
565
  try {
575
- const aborter = new AbortController()
576
566
  const view = getContainingView(self) as LGV
577
- self.setLoading(aborter)
578
567
 
579
568
  if (!view.initialized) {
580
569
  return
@@ -586,6 +575,8 @@ const stateModelFactory = (
586
575
  if (self.regionTooLarge) {
587
576
  return
588
577
  }
578
+ const aborter = new AbortController()
579
+ self.setLoading(aborter)
589
580
 
590
581
  const wiggleStats = await getStats({
591
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
  }
@@ -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
  )