@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,21 +1,19 @@
1
- import React, { lazy } from 'react';
1
+ import { lazy } from 'react';
2
2
  import { addDisposer, isAlive, types } 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
  // jbrowse imports
7
- import { ConfigurationReference, getConf, readConfObject, } from '@jbrowse/core/configuration';
8
- import { getSession, getEnv, getContainingView, isSelectionContainer, } from '@jbrowse/core/util';
7
+ import { getConf, } from '@jbrowse/core/configuration';
8
+ import { getSession } from '@jbrowse/core/util';
9
9
  import { getRpcSessionId } from '@jbrowse/core/util/tracks';
10
10
  import { set1 as colors } from '@jbrowse/core/ui/colors';
11
- import { BaseLinearDisplay, } from '@jbrowse/plugin-linear-genome-view';
12
11
  // locals
13
- import { getNiceDomain, getScale, quantitativeStatsAutorun, YSCALEBAR_LABEL_OFFSET, } from '../../util';
12
+ import { getScale, quantitativeStatsAutorun, YSCALEBAR_LABEL_OFFSET, } from '../../util';
14
13
  import Tooltip from '../components/Tooltip';
15
- import { StatBars } from '../components/WiggleDisplayComponent';
16
- const randomColor = () => '#000000'.replace(/0/g, () => (~~(Math.random() * 16)).toString(16));
17
- // lazt components
18
- const SetMinMaxDlg = lazy(() => import('../../shared/SetMinMaxDialog'));
14
+ import SharedWiggleMixin from '../../shared/modelShared';
15
+ const randomColor = () => '#000000'.replaceAll('0', () => (~~(Math.random() * 16)).toString(16));
16
+ // lazies
19
17
  const SetColorDlg = lazy(() => import('../components/SetColorDialog'));
20
18
  // using a map because it preserves order
21
19
  const rendererTypes = new Map([
@@ -25,531 +23,358 @@ const rendererTypes = new Map([
25
23
  ['multiline', 'MultiLineRenderer'],
26
24
  ['multirowline', 'MultiRowLineRenderer'],
27
25
  ]);
28
- const stateModelFactory = (pluginManager, configSchema) => types
29
- .compose('MultiLinearWiggleDisplay', BaseLinearDisplay, types.model({
30
- type: types.literal('MultiLinearWiggleDisplay'),
31
- configuration: ConfigurationReference(configSchema),
32
- selectedRendering: types.optional(types.string, ''),
33
- resolution: types.optional(types.number, 1),
34
- fill: types.maybe(types.boolean),
35
- minSize: types.maybe(types.number),
36
- color: types.maybe(types.string),
37
- posColor: types.maybe(types.string),
38
- negColor: types.maybe(types.string),
39
- summaryScoreMode: types.maybe(types.string),
40
- rendererTypeNameState: types.maybe(types.string),
41
- scale: types.maybe(types.string),
42
- autoscale: types.maybe(types.string),
43
- displayCrossHatches: types.maybe(types.boolean),
44
- layout: types.optional(types.frozen(), []),
45
- constraints: types.optional(types.model({
46
- max: types.maybe(types.number),
47
- min: types.maybe(types.number),
48
- }), {}),
49
- }))
50
- .volatile(() => ({
51
- message: undefined,
52
- stats: undefined,
53
- statsRegion: undefined,
54
- statsFetchInProgress: undefined,
55
- featureUnderMouseVolatile: undefined,
56
- sourcesVolatile: undefined,
57
- }))
58
- .actions(self => ({
59
- setLayout(layout) {
60
- self.layout = layout;
61
- },
62
- clearLayout() {
63
- self.layout = [];
64
- },
65
- updateQuantitativeStats(stats) {
66
- const { scoreMin, scoreMax } = stats;
67
- const EPSILON = 0.000001;
68
- if (!self.stats) {
69
- self.stats = { scoreMin, scoreMax };
70
- }
71
- else if (Math.abs(self.stats.scoreMax - scoreMax) > EPSILON ||
72
- Math.abs(self.stats.scoreMin - scoreMin) > EPSILON) {
73
- self.stats = { scoreMin, scoreMax };
74
- }
75
- },
76
- setSources(sources) {
77
- if (!deepEqual(sources, self.sourcesVolatile)) {
78
- self.sourcesVolatile = sources;
79
- }
80
- },
81
- setColor(color) {
82
- self.color = color;
83
- },
84
- setPosColor(color) {
85
- self.posColor = color;
86
- },
87
- setNegColor(color) {
88
- self.negColor = color;
89
- },
90
- setLoading(aborter) {
91
- const { statsFetchInProgress: statsFetch } = self;
92
- if (statsFetch !== undefined && !statsFetch.signal.aborted) {
93
- statsFetch.abort();
94
- }
95
- self.statsFetchInProgress = aborter;
96
- },
97
- // this overrides the BaseLinearDisplayModel to avoid popping up a
98
- // feature detail display, but still sets the feature selection on the
99
- // model so listeners can detect a click
100
- selectFeature(feature) {
101
- const session = getSession(self);
102
- if (isSelectionContainer(session)) {
103
- session.setSelection(feature);
104
- }
105
- },
106
- setFeatureUnderMouse(f) {
107
- self.featureUnderMouseVolatile = f;
108
- },
109
- setResolution(res) {
110
- self.resolution = res;
111
- },
112
- setFill(fill) {
113
- if (fill === 0) {
114
- self.fill = true;
115
- self.minSize = 0;
116
- }
117
- else if (fill === 1) {
118
- self.fill = false;
119
- self.minSize = 1;
120
- }
121
- else if (fill === 2) {
122
- self.fill = false;
123
- self.minSize = 2;
124
- }
125
- },
126
- toggleLogScale() {
127
- self.scale = self.scale === 'log' ? 'linear' : 'log';
128
- },
129
- setScaleType(scale) {
130
- self.scale = scale;
131
- },
132
- setSummaryScoreMode(val) {
133
- self.summaryScoreMode = val;
134
- },
135
- setAutoscale(val) {
136
- self.autoscale = val;
137
- },
138
- setMaxScore(val) {
139
- self.constraints.max = val;
140
- },
141
- setRendererType(val) {
142
- self.rendererTypeNameState = val;
143
- },
144
- setMinScore(val) {
145
- self.constraints.min = val;
146
- },
147
- toggleCrossHatches() {
148
- self.displayCrossHatches = !self.displayCrossHatches;
149
- },
150
- setCrossHatches(cross) {
151
- self.displayCrossHatches = cross;
152
- },
153
- }))
154
- .views(self => ({
155
- get featureUnderMouse() {
156
- return self.featureUnderMouseVolatile;
157
- },
158
- get TooltipComponent() {
159
- return Tooltip;
160
- },
161
- get adapterTypeName() {
162
- return self.adapterConfig.type;
163
- },
164
- get rendererTypeNameSimple() {
165
- return self.rendererTypeNameState || getConf(self, 'defaultRendering');
166
- },
167
- get rendererTypeName() {
168
- const name = this.rendererTypeNameSimple;
169
- const rendererType = rendererTypes.get(name);
170
- if (!rendererType) {
171
- throw new Error(`unknown renderer ${name}`);
172
- }
173
- return rendererType;
174
- },
175
- // subclasses can define these, as snpcoverage track does
176
- get filters() {
177
- return undefined;
178
- },
179
- get scaleType() {
180
- var _a;
181
- return (_a = self.scale) !== null && _a !== void 0 ? _a : getConf(self, 'scaleType');
182
- },
183
- get maxScore() {
184
- var _a;
185
- return (_a = self.constraints.max) !== null && _a !== void 0 ? _a : getConf(self, 'maxScore');
186
- },
187
- get minScore() {
188
- var _a;
189
- return (_a = self.constraints.min) !== null && _a !== void 0 ? _a : getConf(self, 'minScore');
190
- },
191
- }))
192
- .views(self => ({
193
- get rendererConfig() {
194
- const configBlob = getConf(self, ['renderers', self.rendererTypeName]) || {};
195
- const { color, displayCrossHatches, fill, minSize, negColor, posColor, summaryScoreMode, scaleType, } = self;
196
- return self.rendererType.configSchema.create({
197
- ...configBlob,
198
- ...(scaleType ? { scaleType } : {}),
199
- ...(fill !== undefined ? { filled: fill } : {}),
200
- ...(displayCrossHatches !== undefined
201
- ? { displayCrossHatches }
202
- : {}),
203
- ...(summaryScoreMode !== undefined ? { summaryScoreMode } : {}),
204
- ...(color !== undefined ? { color } : {}),
205
- ...(negColor !== undefined ? { negColor } : {}),
206
- ...(posColor !== undefined ? { posColor } : {}),
207
- ...(minSize !== undefined ? { minSize } : {}),
208
- }, getEnv(self));
209
- },
210
- }))
211
- .views(self => ({
212
- // everything except density gets a numerical scalebar
213
- get needsScalebar() {
214
- return (self.rendererTypeName === 'MultiXYPlotRenderer' ||
215
- self.rendererTypeName === 'MultiRowXYPlotRenderer' ||
216
- self.rendererTypeName === 'MultiLineRenderer' ||
217
- self.rendererTypeName === 'MultiRowLineRenderer');
218
- },
219
- get needsFullHeightScalebar() {
220
- return (self.rendererTypeName === 'MultiXYPlotRenderer' ||
221
- self.rendererTypeName === 'MultiLineRenderer');
222
- },
223
- get isMultiRow() {
224
- return (self.rendererTypeName === 'MultiRowXYPlotRenderer' ||
225
- self.rendererTypeName === 'MultiRowLineRenderer' ||
226
- self.rendererTypeName === 'MultiDensityRenderer');
227
- },
228
- // can be used to give it a "color scale" like a R heatmap, not
229
- // implemented like this yet but flag can be used for this
230
- get needsCustomLegend() {
231
- return self.rendererTypeName === 'MultiDensityRenderer';
232
- },
233
- get canHaveFill() {
234
- return (self.rendererTypeName === 'MultiXYPlotRenderer' ||
235
- self.rendererTypeName === 'MultiRowXYPlotRenderer');
236
- },
237
- // the multirowxy and multiline don't need to use colors on the legend
238
- // boxes since their track is drawn with the color. sort of a stylistic choice
239
- get renderColorBoxes() {
240
- return !(self.rendererTypeName === 'MultiRowLineRenderer' ||
241
- self.rendererTypeName === 'MultiRowXYPlotRenderer');
242
- },
243
- // positions multi-row below the tracklabel even if using overlap
244
- // tracklabels for everything else
245
- get prefersOffset() {
246
- return this.isMultiRow;
247
- },
248
- get sources() {
249
- var _a;
250
- const sources = Object.fromEntries(((_a = self.sourcesVolatile) === null || _a === void 0 ? void 0 : _a.map(s => [s.name, s])) || []);
251
- const iter = self.layout.length ? self.layout : self.sourcesVolatile;
252
- return iter === null || iter === void 0 ? void 0 : iter.map(s => ({
253
- ...sources[s.name],
254
- ...s,
255
- })).map((s, i) => ({
256
- ...s,
257
- color: s.color ||
258
- (!this.isMultiRow ? colors[i] || randomColor() : 'blue'),
259
- }));
260
- },
261
- }))
262
- .views(self => {
263
- let oldDomain = [0, 0];
264
- return {
265
- get filled() {
266
- const { fill, rendererConfig } = self;
267
- return fill !== null && fill !== void 0 ? fill : readConfObject(rendererConfig, 'filled');
26
+ /**
27
+ * #stateModel MultiLinearWiggleDisplay
28
+ * extends `SharedWiggleMixin`
29
+ */
30
+ export function stateModelFactory(pluginManager, configSchema) {
31
+ return types
32
+ .compose('MultiLinearWiggleDisplay', SharedWiggleMixin(configSchema), types.model({
33
+ /**
34
+ * #property
35
+ */
36
+ type: types.literal('MultiLinearWiggleDisplay'),
37
+ /**
38
+ * #property
39
+ */
40
+ layout: types.optional(types.frozen(), []),
41
+ }))
42
+ .volatile(() => ({
43
+ featureUnderMouseVolatile: undefined,
44
+ sourcesVolatile: undefined,
45
+ }))
46
+ .actions(self => ({
47
+ /**
48
+ * #action
49
+ */
50
+ setLayout(layout) {
51
+ self.layout = layout;
268
52
  },
269
- get summaryScoreModeSetting() {
270
- const { summaryScoreMode: scoreMode, rendererConfig } = self;
271
- return scoreMode !== null && scoreMode !== void 0 ? scoreMode : readConfObject(rendererConfig, 'summaryScoreMode');
53
+ /**
54
+ * #action
55
+ */
56
+ clearLayout() {
57
+ self.layout = [];
272
58
  },
273
- get domain() {
274
- const { stats, scaleType, minScore, maxScore } = self;
275
- if (!stats) {
276
- return undefined;
277
- }
278
- const { scoreMin, scoreMax } = stats;
279
- const ret = getNiceDomain({
280
- domain: [scoreMin, scoreMax],
281
- bounds: [minScore, maxScore],
282
- scaleType,
283
- });
284
- // avoid weird scalebar if log value and empty region displayed
285
- if (scaleType === 'log' && ret[1] === Number.MIN_VALUE) {
286
- return [0, Number.MIN_VALUE];
59
+ /**
60
+ * #action
61
+ */
62
+ setSources(sources) {
63
+ if (!deepEqual(sources, self.sourcesVolatile)) {
64
+ self.sourcesVolatile = sources;
287
65
  }
288
- // avoid returning a new object if it matches the old value
289
- if (!deepEqual(oldDomain, ret)) {
290
- oldDomain = ret;
66
+ },
67
+ /**
68
+ * #action
69
+ */
70
+ setFeatureUnderMouse(f) {
71
+ self.featureUnderMouseVolatile = f;
72
+ },
73
+ }))
74
+ .views(self => ({
75
+ /**
76
+ * #getter
77
+ */
78
+ get featureUnderMouse() {
79
+ return self.featureUnderMouseVolatile;
80
+ },
81
+ /**
82
+ * #getter
83
+ */
84
+ get TooltipComponent() {
85
+ return Tooltip;
86
+ },
87
+ /**
88
+ * #getter
89
+ */
90
+ get rendererTypeName() {
91
+ const name = self.rendererTypeNameSimple;
92
+ const rendererType = rendererTypes.get(name);
93
+ if (!rendererType) {
94
+ throw new Error(`unknown renderer ${name}`);
291
95
  }
292
- return oldDomain;
96
+ return rendererType;
293
97
  },
294
- get scaleOpts() {
295
- const { scaleType, stats } = self;
296
- return {
297
- autoscaleType: this.autoscaleType,
298
- domain: this.domain,
299
- stats,
300
- scaleType,
301
- inverted: getConf(self, 'inverted'),
302
- };
98
+ }))
99
+ .views(self => ({
100
+ /**
101
+ * #getter
102
+ */
103
+ get needsScalebar() {
104
+ return (self.rendererTypeName === 'MultiXYPlotRenderer' ||
105
+ self.rendererTypeName === 'MultiRowXYPlotRenderer' ||
106
+ self.rendererTypeName === 'MultiLineRenderer' ||
107
+ self.rendererTypeName === 'MultiRowLineRenderer');
303
108
  },
304
- get autoscaleType() {
305
- var _a;
306
- return (_a = self.autoscale) !== null && _a !== void 0 ? _a : getConf(self, 'autoscale');
109
+ /**
110
+ * #getter
111
+ */
112
+ get needsFullHeightScalebar() {
113
+ return (self.rendererTypeName === 'MultiXYPlotRenderer' ||
114
+ self.rendererTypeName === 'MultiLineRenderer');
115
+ },
116
+ /**
117
+ * #getter
118
+ */
119
+ get isMultiRow() {
120
+ return (self.rendererTypeName === 'MultiRowXYPlotRenderer' ||
121
+ self.rendererTypeName === 'MultiRowLineRenderer' ||
122
+ self.rendererTypeName === 'MultiDensityRenderer');
307
123
  },
308
- get displayCrossHatchesSetting() {
309
- const { displayCrossHatches, rendererConfig } = self;
310
- return (displayCrossHatches !== null && displayCrossHatches !== void 0 ? displayCrossHatches : readConfObject(rendererConfig, 'displayCrossHatches'));
124
+ /**
125
+ * #getter
126
+ * can be used to give it a "color scale" like a R heatmap, not
127
+ * implemented like this yet but flag can be used for this
128
+ */
129
+ get needsCustomLegend() {
130
+ return self.rendererTypeName === 'MultiDensityRenderer';
311
131
  },
132
+ get canHaveFill() {
133
+ return (self.rendererTypeName === 'MultiXYPlotRenderer' ||
134
+ self.rendererTypeName === 'MultiRowXYPlotRenderer');
135
+ },
136
+ /**
137
+ * #getter
138
+ * the multirowxy and multiline don't need to use colors on the legend
139
+ * boxes since their track is drawn with the color. sort of a stylistic
140
+ * choice
141
+ */
142
+ get renderColorBoxes() {
143
+ return !(self.rendererTypeName === 'MultiRowLineRenderer' ||
144
+ self.rendererTypeName === 'MultiRowXYPlotRenderer');
145
+ },
146
+ /**
147
+ * #getter
148
+ * positions multi-row below the tracklabel even if using overlap
149
+ * tracklabels for everything else
150
+ */
151
+ get prefersOffset() {
152
+ return this.isMultiRow;
153
+ },
154
+ /**
155
+ * #getter
156
+ */
157
+ get sources() {
158
+ var _a;
159
+ const sources = Object.fromEntries(((_a = self.sourcesVolatile) === null || _a === void 0 ? void 0 : _a.map(s => [s.name, s])) || []);
160
+ const iter = self.layout.length ? self.layout : self.sourcesVolatile;
161
+ return iter === null || iter === void 0 ? void 0 : iter.map(s => ({
162
+ ...sources[s.name],
163
+ ...s,
164
+ })).map((s, i) => ({
165
+ ...s,
166
+ color: s.color ||
167
+ (!this.isMultiRow ? colors[i] || randomColor() : 'blue'),
168
+ }));
169
+ },
170
+ }))
171
+ .views(self => ({
172
+ /**
173
+ * #getter
174
+ */
312
175
  get rowHeight() {
313
176
  const { sources, height, isMultiRow } = self;
314
177
  return isMultiRow ? height / ((sources === null || sources === void 0 ? void 0 : sources.length) || 1) : height;
315
178
  },
179
+ /**
180
+ * #getter
181
+ */
316
182
  get rowHeightTooSmallForScalebar() {
317
183
  return this.rowHeight < 70;
318
184
  },
185
+ /**
186
+ * #getter
187
+ */
319
188
  get useMinimalTicks() {
320
189
  return (getConf(self, 'minimalTicks') || this.rowHeightTooSmallForScalebar);
321
190
  },
322
- };
323
- })
324
- .views(self => ({
325
- get ticks() {
326
- const { scaleType, domain, isMultiRow, rowHeight, useMinimalTicks } = self;
327
- if (!domain) {
328
- return undefined;
329
- }
330
- const offset = isMultiRow ? 0 : YSCALEBAR_LABEL_OFFSET;
331
- const ticks = axisPropsFromTickScale(getScale({
332
- scaleType,
333
- domain,
334
- range: [rowHeight - offset, offset],
335
- inverted: getConf(self, 'inverted'),
336
- }), 4);
337
- return useMinimalTicks ? { ...ticks, values: domain } : ticks;
338
- },
339
- get colors() {
340
- return [
341
- 'red',
342
- 'blue',
343
- 'green',
344
- 'orange',
345
- 'purple',
346
- 'cyan',
347
- 'pink',
348
- 'darkblue',
349
- 'darkred',
350
- 'pink',
351
- ];
352
- },
353
- get adapterCapabilities() {
354
- const { adapterTypeName } = self;
355
- return pluginManager.getAdapterType(adapterTypeName).adapterCapabilities;
356
- },
357
- }))
358
- .views(self => {
359
- const { renderProps: superRenderProps } = self;
360
- return {
361
- renderProps() {
362
- const superProps = superRenderProps();
363
- const { displayCrossHatches, filters, height, resolution, rpcDriverName, scaleOpts, stats, sources, ticks, rendererConfig: config, } = self;
364
- return {
365
- ...superProps,
366
- notReady: superProps.notReady || !sources || !stats,
367
- displayModel: self,
368
- config,
369
- displayCrossHatches,
370
- filters,
371
- height,
372
- resolution,
373
- rpcDriverName,
374
- scaleOpts,
375
- sources,
376
- ticks,
377
- onMouseMove: (_, f) => self.setFeatureUnderMouse(f),
378
- onMouseLeave: () => self.setFeatureUnderMouse(undefined),
379
- };
380
- },
381
- get hasResolution() {
382
- return self.adapterCapabilities.includes('hasResolution');
383
- },
384
- get hasGlobalStats() {
385
- return self.adapterCapabilities.includes('hasGlobalStats');
386
- },
387
- get fillSetting() {
388
- if (self.filled) {
389
- return 0;
390
- }
391
- else if (!self.filled && self.minSize === 1) {
392
- return 1;
393
- }
394
- else {
395
- return 2;
191
+ }))
192
+ .views(self => ({
193
+ /**
194
+ * #getter
195
+ */
196
+ get ticks() {
197
+ const { scaleType, domain, isMultiRow, rowHeight, useMinimalTicks } = self;
198
+ if (!domain) {
199
+ return undefined;
396
200
  }
201
+ const offset = isMultiRow ? 0 : YSCALEBAR_LABEL_OFFSET;
202
+ const ticks = axisPropsFromTickScale(getScale({
203
+ scaleType,
204
+ domain,
205
+ range: [rowHeight - offset, offset],
206
+ inverted: getConf(self, 'inverted'),
207
+ }), 4);
208
+ return useMinimalTicks ? { ...ticks, values: domain } : ticks;
397
209
  },
398
- };
399
- })
400
- .views(self => {
401
- const { trackMenuItems: superTrackMenuItems } = self;
402
- const hasRenderings = getConf(self, 'defaultRendering');
403
- return {
404
- trackMenuItems() {
210
+ /**
211
+ * #getter
212
+ */
213
+ get colors() {
405
214
  return [
406
- ...superTrackMenuItems(),
407
- ...(self.hasResolution
408
- ? [
409
- {
410
- label: 'Resolution',
411
- subMenu: [
412
- {
413
- label: 'Finer resolution',
414
- onClick: () => self.setResolution(self.resolution * 5),
415
- },
416
- {
417
- label: 'Coarser resolution',
418
- onClick: () => self.setResolution(self.resolution / 5),
419
- },
420
- ],
421
- },
422
- {
423
- label: 'Summary score mode',
424
- subMenu: ['min', 'max', 'avg', 'whiskers'].map(elt => ({
425
- label: elt,
426
- type: 'radio',
427
- checked: self.summaryScoreModeSetting === elt,
428
- onClick: () => self.setSummaryScoreMode(elt),
429
- })),
430
- },
431
- ]
432
- : []),
433
- ...(self.canHaveFill
434
- ? [
435
- {
436
- label: 'Fill mode',
437
- subMenu: ['filled', 'no fill', 'no fill w/ emphasis'].map((elt, idx) => ({
438
- label: elt,
439
- type: 'radio',
440
- checked: self.fillSetting === idx,
441
- onClick: () => self.setFill(idx),
442
- })),
443
- },
444
- ]
445
- : []),
446
- {
447
- label: self.scaleType === 'log' ? 'Set linear scale' : 'Set log scale',
448
- onClick: () => self.toggleLogScale(),
449
- },
450
- ...(self.needsScalebar
451
- ? [
452
- {
453
- type: 'checkbox',
454
- label: 'Draw cross hatches',
455
- checked: self.displayCrossHatchesSetting,
456
- onClick: () => self.toggleCrossHatches(),
457
- },
458
- ]
459
- : []),
460
- ...(hasRenderings
461
- ? [
462
- {
463
- label: 'Renderer type',
464
- subMenu: [
465
- 'xyplot',
466
- 'multirowxy',
467
- 'multirowdensity',
468
- 'multiline',
469
- 'multirowline',
470
- ].map(key => ({
471
- label: key,
472
- type: 'radio',
473
- checked: self.rendererTypeNameSimple === key,
474
- onClick: () => self.setRendererType(key),
475
- })),
476
- },
477
- ]
478
- : []),
479
- {
480
- label: 'Autoscale type',
481
- subMenu: [
482
- ['local', 'Local'],
483
- ...(self.hasGlobalStats
484
- ? [
485
- ['global', 'Global'],
486
- ['globalsd', 'Global ± 3σ'],
487
- ]
488
- : []),
489
- ['localsd', 'Local ± 3σ'],
490
- ].map(([val, label]) => {
491
- return {
492
- label,
493
- type: 'radio',
494
- checked: self.autoscaleType === val,
495
- onClick: () => self.setAutoscale(val),
496
- };
497
- }),
498
- },
499
- {
500
- label: 'Set min/max score...',
501
- onClick: () => {
502
- const session = getSession(self);
503
- session.queueDialog(handleClose => [
504
- SetMinMaxDlg,
505
- { model: self, handleClose },
506
- ]);
507
- },
508
- },
509
- {
510
- label: 'Edit colors/arrangement...',
511
- onClick: () => {
512
- getSession(self).queueDialog(handleClose => [
513
- SetColorDlg,
514
- { model: self, handleClose },
515
- ]);
516
- },
517
- },
215
+ 'red',
216
+ 'blue',
217
+ 'green',
218
+ 'orange',
219
+ 'purple',
220
+ 'cyan',
221
+ 'pink',
222
+ 'darkblue',
223
+ 'darkred',
224
+ 'pink',
518
225
  ];
519
226
  },
520
- };
521
- })
522
- .actions(self => {
523
- const { reload: superReload, renderSvg: superRenderSvg } = self;
524
- return {
525
- async reload() {
526
- self.setError();
527
- superReload();
528
- },
529
- afterAttach() {
530
- quantitativeStatsAutorun(self);
531
- addDisposer(self, autorun(async () => {
532
- const { rpcManager } = getSession(self);
533
- const { adapterConfig } = self;
534
- const sessionId = getRpcSessionId(self);
535
- const sources = (await rpcManager.call(sessionId, 'MultiWiggleGetSources', {
536
- sessionId,
537
- adapterConfig,
538
- }));
539
- if (isAlive(self)) {
540
- self.setSources(sources);
227
+ }))
228
+ .views(self => {
229
+ const { renderProps: superRenderProps } = self;
230
+ return {
231
+ /**
232
+ * #method
233
+ */
234
+ renderProps() {
235
+ const superProps = superRenderProps();
236
+ const { displayCrossHatches, filters, height, resolution, rpcDriverName, scaleOpts, stats, sources, ticks, rendererConfig: config, } = self;
237
+ return {
238
+ ...superProps,
239
+ notReady: superProps.notReady || !sources || !stats,
240
+ displayModel: self,
241
+ config,
242
+ displayCrossHatches,
243
+ filters,
244
+ height,
245
+ resolution,
246
+ rpcDriverName,
247
+ scaleOpts,
248
+ sources,
249
+ ticks,
250
+ onMouseMove: (_, f) => self.setFeatureUnderMouse(f),
251
+ onMouseLeave: () => self.setFeatureUnderMouse(undefined),
252
+ };
253
+ },
254
+ /**
255
+ * #getter
256
+ */
257
+ get hasResolution() {
258
+ return self.adapterCapabilities.includes('hasResolution');
259
+ },
260
+ /**
261
+ * #getter
262
+ */
263
+ get hasGlobalStats() {
264
+ return self.adapterCapabilities.includes('hasGlobalStats');
265
+ },
266
+ /**
267
+ * #getter
268
+ */
269
+ get fillSetting() {
270
+ if (self.filled) {
271
+ return 0;
541
272
  }
542
- }));
543
- },
544
- async renderSvg(opts) {
545
- await when(() => !!self.stats && !!self.regionCannotBeRenderedText);
546
- const { offsetPx } = getContainingView(self);
547
- return (React.createElement(React.Fragment, null,
548
- React.createElement("g", { id: "snpcov" }, await superRenderSvg(opts)),
549
- React.createElement("g", { transform: `translate(${Math.max(-offsetPx, 0)})` },
550
- React.createElement(StatBars, { model: self, orientation: "left", exportSVG: true }))));
551
- },
552
- };
553
- });
273
+ else if (!self.filled && self.minSize === 1) {
274
+ return 1;
275
+ }
276
+ else {
277
+ return 2;
278
+ }
279
+ },
280
+ };
281
+ })
282
+ .views(self => {
283
+ const { trackMenuItems: superTrackMenuItems } = self;
284
+ const hasRenderings = getConf(self, 'defaultRendering');
285
+ return {
286
+ /**
287
+ * #method
288
+ */
289
+ trackMenuItems() {
290
+ return [
291
+ ...superTrackMenuItems(),
292
+ {
293
+ label: 'Score',
294
+ subMenu: self.scoreTrackMenuItems(),
295
+ },
296
+ ...(self.canHaveFill
297
+ ? [
298
+ {
299
+ label: 'Fill mode',
300
+ subMenu: ['filled', 'no fill', 'no fill w/ emphasis'].map((elt, idx) => ({
301
+ label: elt,
302
+ type: 'radio',
303
+ checked: self.fillSetting === idx,
304
+ onClick: () => self.setFill(idx),
305
+ })),
306
+ },
307
+ ]
308
+ : []),
309
+ ...(self.needsScalebar
310
+ ? [
311
+ {
312
+ type: 'checkbox',
313
+ label: 'Draw cross hatches',
314
+ checked: self.displayCrossHatchesSetting,
315
+ onClick: () => self.toggleCrossHatches(),
316
+ },
317
+ ]
318
+ : []),
319
+ ...(hasRenderings
320
+ ? [
321
+ {
322
+ label: 'Renderer type',
323
+ subMenu: [
324
+ 'xyplot',
325
+ 'multirowxy',
326
+ 'multirowdensity',
327
+ 'multiline',
328
+ 'multirowline',
329
+ ].map(key => ({
330
+ label: key,
331
+ type: 'radio',
332
+ checked: self.rendererTypeNameSimple === key,
333
+ onClick: () => self.setRendererType(key),
334
+ })),
335
+ },
336
+ ]
337
+ : []),
338
+ {
339
+ label: 'Edit colors/arrangement...',
340
+ onClick: () => {
341
+ getSession(self).queueDialog(handleClose => [
342
+ SetColorDlg,
343
+ { model: self, handleClose },
344
+ ]);
345
+ },
346
+ },
347
+ ];
348
+ },
349
+ };
350
+ })
351
+ .actions(self => {
352
+ const { renderSvg: superRenderSvg } = self;
353
+ return {
354
+ afterAttach() {
355
+ quantitativeStatsAutorun(self);
356
+ addDisposer(self, autorun(async () => {
357
+ const { rpcManager } = getSession(self);
358
+ const { adapterConfig } = self;
359
+ const sessionId = getRpcSessionId(self);
360
+ const sources = (await rpcManager.call(sessionId, 'MultiWiggleGetSources', {
361
+ sessionId,
362
+ adapterConfig,
363
+ }));
364
+ if (isAlive(self)) {
365
+ self.setSources(sources);
366
+ }
367
+ }));
368
+ },
369
+ /**
370
+ * #action
371
+ */
372
+ async renderSvg(opts) {
373
+ const { renderSvg } = await import('./renderSvg');
374
+ return renderSvg(self, opts, superRenderSvg);
375
+ },
376
+ };
377
+ });
378
+ }
554
379
  export default stateModelFactory;
555
380
  //# sourceMappingURL=model.js.map