@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.
- package/dist/BigWigAdapter/BigWigAdapter.js +2 -1
- package/dist/BigWigAdapter/BigWigAdapter.js.map +1 -1
- package/dist/CreateMultiWiggleExtension/ConfirmDialog.d.ts +2 -1
- package/dist/LinearWiggleDisplay/components/SetColorDialog.d.ts +2 -1
- package/dist/LinearWiggleDisplay/components/Tooltip.d.ts +1 -1
- package/dist/LinearWiggleDisplay/components/WiggleDisplayComponent.d.ts +2 -1
- package/dist/LinearWiggleDisplay/index.js +27 -4
- package/dist/LinearWiggleDisplay/index.js.map +1 -1
- package/dist/LinearWiggleDisplay/models/configSchema.d.ts +18 -35
- package/dist/LinearWiggleDisplay/models/configSchema.js +6 -67
- package/dist/LinearWiggleDisplay/models/configSchema.js.map +1 -1
- package/dist/LinearWiggleDisplay/models/model.d.ts +147 -342
- package/dist/LinearWiggleDisplay/models/model.js +17 -432
- package/dist/LinearWiggleDisplay/models/model.js.map +1 -1
- package/dist/LinearWiggleDisplay/models/renderSvg.d.ts +4 -0
- package/dist/LinearWiggleDisplay/models/renderSvg.js +21 -0
- package/dist/LinearWiggleDisplay/models/renderSvg.js.map +1 -0
- package/dist/MultiDensityRenderer/MultiDensityRenderer.js +1 -1
- package/dist/MultiDensityRenderer/MultiDensityRenderer.js.map +1 -1
- package/dist/MultiLineRenderer/MultiLineRenderer.js +1 -1
- package/dist/MultiLineRenderer/MultiLineRenderer.js.map +1 -1
- package/dist/MultiLinearWiggleDisplay/components/DraggableDialog.d.ts +2 -1
- package/dist/MultiLinearWiggleDisplay/components/SetColorDialog.d.ts +2 -1
- package/dist/MultiLinearWiggleDisplay/components/SetColorDialog.js +2 -2
- package/dist/MultiLinearWiggleDisplay/components/SetColorDialog.js.map +1 -1
- package/dist/MultiLinearWiggleDisplay/components/Tooltip.d.ts +1 -1
- package/dist/MultiLinearWiggleDisplay/components/WiggleDisplayComponent.d.ts +3 -2
- package/dist/MultiLinearWiggleDisplay/index.js +25 -2
- package/dist/MultiLinearWiggleDisplay/index.js.map +1 -1
- package/dist/MultiLinearWiggleDisplay/models/configSchema.d.ts +24 -44
- package/dist/MultiLinearWiggleDisplay/models/configSchema.js +6 -66
- package/dist/MultiLinearWiggleDisplay/models/configSchema.js.map +1 -1
- package/dist/MultiLinearWiggleDisplay/models/model.d.ts +263 -175
- package/dist/MultiLinearWiggleDisplay/models/model.js +335 -508
- package/dist/MultiLinearWiggleDisplay/models/model.js.map +1 -1
- package/dist/MultiLinearWiggleDisplay/models/renderSvg.d.ts +4 -0
- package/dist/MultiLinearWiggleDisplay/models/renderSvg.js +20 -0
- package/dist/MultiLinearWiggleDisplay/models/renderSvg.js.map +1 -0
- package/dist/MultiRowLineRenderer/MultiRowLineRenderer.js +1 -1
- package/dist/MultiRowLineRenderer/MultiRowLineRenderer.js.map +1 -1
- package/dist/MultiRowXYPlotRenderer/MultiRowXYPlotRenderer.js +1 -1
- package/dist/MultiRowXYPlotRenderer/MultiRowXYPlotRenderer.js.map +1 -1
- package/dist/MultiWiggleAddTrackWidget/AddTrackWorkflow.d.ts +2 -1
- package/dist/MultiWiggleAddTrackWidget/AddTrackWorkflow.js +1 -1
- package/dist/MultiWiggleAddTrackWidget/AddTrackWorkflow.js.map +1 -1
- package/dist/MultiWiggleRendering.d.ts +2 -1
- package/dist/MultiXYPlotRenderer/MultiXYPlotRenderer.js +3 -2
- package/dist/MultiXYPlotRenderer/MultiXYPlotRenderer.js.map +1 -1
- package/dist/Tooltip.d.ts +1 -1
- package/dist/WiggleBaseRenderer.d.ts +1 -1
- package/dist/WiggleRendering.d.ts +2 -1
- package/dist/index.d.ts +222 -198
- package/dist/shared/SetMinMaxDialog.d.ts +2 -1
- package/dist/shared/YScaleBar.d.ts +4 -2
- package/dist/shared/YScaleBar.js +1 -1
- package/dist/shared/YScaleBar.js.map +1 -1
- package/dist/shared/configShared.d.ts +85 -0
- package/dist/shared/configShared.js +84 -0
- package/dist/shared/configShared.js.map +1 -0
- package/dist/shared/modelShared.d.ts +576 -0
- package/dist/shared/modelShared.js +480 -0
- package/dist/shared/modelShared.js.map +1 -0
- package/dist/util.d.ts +0 -3
- package/dist/util.js +1 -11
- package/dist/util.js.map +1 -1
- package/esm/BigWigAdapter/BigWigAdapter.js +2 -1
- package/esm/BigWigAdapter/BigWigAdapter.js.map +1 -1
- package/esm/CreateMultiWiggleExtension/ConfirmDialog.d.ts +2 -1
- package/esm/LinearWiggleDisplay/components/SetColorDialog.d.ts +2 -1
- package/esm/LinearWiggleDisplay/components/Tooltip.d.ts +1 -1
- package/esm/LinearWiggleDisplay/components/WiggleDisplayComponent.d.ts +2 -1
- package/esm/LinearWiggleDisplay/index.js +2 -2
- package/esm/LinearWiggleDisplay/index.js.map +1 -1
- package/esm/LinearWiggleDisplay/models/configSchema.d.ts +18 -35
- package/esm/LinearWiggleDisplay/models/configSchema.js +3 -67
- package/esm/LinearWiggleDisplay/models/configSchema.js.map +1 -1
- package/esm/LinearWiggleDisplay/models/model.d.ts +147 -342
- package/esm/LinearWiggleDisplay/models/model.js +20 -435
- package/esm/LinearWiggleDisplay/models/model.js.map +1 -1
- package/esm/LinearWiggleDisplay/models/renderSvg.d.ts +4 -0
- package/esm/LinearWiggleDisplay/models/renderSvg.js +14 -0
- package/esm/LinearWiggleDisplay/models/renderSvg.js.map +1 -0
- package/esm/MultiDensityRenderer/MultiDensityRenderer.js +1 -1
- package/esm/MultiDensityRenderer/MultiDensityRenderer.js.map +1 -1
- package/esm/MultiLineRenderer/MultiLineRenderer.js +1 -1
- package/esm/MultiLineRenderer/MultiLineRenderer.js.map +1 -1
- package/esm/MultiLinearWiggleDisplay/components/DraggableDialog.d.ts +2 -1
- package/esm/MultiLinearWiggleDisplay/components/SetColorDialog.d.ts +2 -1
- package/esm/MultiLinearWiggleDisplay/components/SetColorDialog.js +1 -1
- package/esm/MultiLinearWiggleDisplay/components/SetColorDialog.js.map +1 -1
- package/esm/MultiLinearWiggleDisplay/components/Tooltip.d.ts +1 -1
- package/esm/MultiLinearWiggleDisplay/components/WiggleDisplayComponent.d.ts +3 -2
- package/esm/MultiLinearWiggleDisplay/index.js +2 -2
- package/esm/MultiLinearWiggleDisplay/index.js.map +1 -1
- package/esm/MultiLinearWiggleDisplay/models/configSchema.d.ts +24 -44
- package/esm/MultiLinearWiggleDisplay/models/configSchema.js +3 -66
- package/esm/MultiLinearWiggleDisplay/models/configSchema.js.map +1 -1
- package/esm/MultiLinearWiggleDisplay/models/model.d.ts +263 -175
- package/esm/MultiLinearWiggleDisplay/models/model.js +337 -512
- package/esm/MultiLinearWiggleDisplay/models/model.js.map +1 -1
- package/esm/MultiLinearWiggleDisplay/models/renderSvg.d.ts +4 -0
- package/esm/MultiLinearWiggleDisplay/models/renderSvg.js +13 -0
- package/esm/MultiLinearWiggleDisplay/models/renderSvg.js.map +1 -0
- package/esm/MultiRowLineRenderer/MultiRowLineRenderer.js +1 -1
- package/esm/MultiRowLineRenderer/MultiRowLineRenderer.js.map +1 -1
- package/esm/MultiRowXYPlotRenderer/MultiRowXYPlotRenderer.js +1 -1
- package/esm/MultiRowXYPlotRenderer/MultiRowXYPlotRenderer.js.map +1 -1
- package/esm/MultiWiggleAddTrackWidget/AddTrackWorkflow.d.ts +2 -1
- package/esm/MultiWiggleAddTrackWidget/AddTrackWorkflow.js +1 -1
- package/esm/MultiWiggleAddTrackWidget/AddTrackWorkflow.js.map +1 -1
- package/esm/MultiWiggleRendering.d.ts +2 -1
- package/esm/MultiXYPlotRenderer/MultiXYPlotRenderer.js +2 -1
- package/esm/MultiXYPlotRenderer/MultiXYPlotRenderer.js.map +1 -1
- package/esm/Tooltip.d.ts +1 -1
- package/esm/WiggleBaseRenderer.d.ts +1 -1
- package/esm/WiggleRendering.d.ts +2 -1
- package/esm/index.d.ts +222 -198
- package/esm/shared/SetMinMaxDialog.d.ts +2 -1
- package/esm/shared/YScaleBar.d.ts +4 -2
- package/esm/shared/YScaleBar.js +1 -1
- package/esm/shared/YScaleBar.js.map +1 -1
- package/esm/shared/configShared.d.ts +85 -0
- package/esm/shared/configShared.js +81 -0
- package/esm/shared/configShared.js.map +1 -0
- package/esm/shared/modelShared.d.ts +576 -0
- package/esm/shared/modelShared.js +454 -0
- package/esm/shared/modelShared.js.map +1 -0
- package/esm/util.d.ts +0 -3
- package/esm/util.js +0 -9
- package/esm/util.js.map +1 -1
- package/package.json +3 -3
- package/src/BigWigAdapter/BigWigAdapter.ts +2 -4
- package/src/LinearWiggleDisplay/index.ts +2 -2
- package/src/LinearWiggleDisplay/models/configSchema.ts +4 -73
- package/src/LinearWiggleDisplay/models/model.tsx +22 -503
- package/src/LinearWiggleDisplay/models/renderSvg.tsx +29 -0
- package/src/MultiDensityRenderer/MultiDensityRenderer.ts +1 -2
- package/src/MultiLineRenderer/MultiLineRenderer.ts +1 -2
- package/src/MultiLinearWiggleDisplay/components/SetColorDialog.tsx +1 -1
- package/src/MultiLinearWiggleDisplay/index.ts +2 -2
- package/src/MultiLinearWiggleDisplay/models/configSchema.ts +4 -72
- package/src/MultiLinearWiggleDisplay/models/model.tsx +132 -371
- package/src/MultiLinearWiggleDisplay/models/renderSvg.tsx +26 -0
- package/src/MultiRowLineRenderer/MultiRowLineRenderer.ts +1 -2
- package/src/MultiRowXYPlotRenderer/MultiRowXYPlotRenderer.ts +1 -2
- package/src/MultiWiggleAddTrackWidget/AddTrackWorkflow.tsx +1 -1
- package/src/MultiXYPlotRenderer/MultiXYPlotRenderer.ts +2 -2
- package/src/shared/YScaleBar.tsx +4 -2
- package/src/shared/configShared.ts +90 -0
- package/src/shared/modelShared.ts +510 -0
- package/src/util.ts +1 -10
|
@@ -1,21 +1,19 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { lazy } from 'react';
|
|
2
2
|
import { addDisposer, isAlive, types } from 'mobx-state-tree';
|
|
3
|
-
import { autorun
|
|
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 {
|
|
8
|
-
import { getSession
|
|
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 {
|
|
12
|
+
import { getScale, quantitativeStatsAutorun, YSCALEBAR_LABEL_OFFSET, } from '../../util';
|
|
14
13
|
import Tooltip from '../components/Tooltip';
|
|
15
|
-
import
|
|
16
|
-
const randomColor = () => '#000000'.
|
|
17
|
-
//
|
|
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
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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
|
-
|
|
270
|
-
|
|
271
|
-
|
|
53
|
+
/**
|
|
54
|
+
* #action
|
|
55
|
+
*/
|
|
56
|
+
clearLayout() {
|
|
57
|
+
self.layout = [];
|
|
272
58
|
},
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
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
|
-
|
|
289
|
-
|
|
290
|
-
|
|
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
|
|
96
|
+
return rendererType;
|
|
293
97
|
},
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
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
|
-
|
|
305
|
-
|
|
306
|
-
|
|
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
|
-
|
|
309
|
-
|
|
310
|
-
|
|
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
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
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
|
-
|
|
401
|
-
|
|
402
|
-
const hasRenderings = getConf(self, 'defaultRendering');
|
|
403
|
-
return {
|
|
404
|
-
trackMenuItems() {
|
|
210
|
+
/**
|
|
211
|
+
* #getter
|
|
212
|
+
*/
|
|
213
|
+
get colors() {
|
|
405
214
|
return [
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
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
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
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
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
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
|