@jbrowse/core 2.0.0 → 2.0.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/BaseFeatureWidget/BaseFeatureDetail.d.ts +3 -3
- package/BaseFeatureWidget/BaseFeatureDetail.js +48 -37
- package/BaseFeatureWidget/SequenceFeatureDetails.js +1 -0
- package/BaseFeatureWidget/types.d.ts +1 -0
- package/PluginManager.d.ts +11 -19
- package/ReExports/modules.d.ts +11 -19
- package/package.json +2 -2
- package/pluggableElementTypes/renderers/FeatureRendererType.js +17 -8
- package/rpc/coreRpcMethods.d.ts +1 -3
- package/rpc/coreRpcMethods.js +5 -5
- package/tsconfig.build.tsbuildinfo +1 -1
- package/util/Base1DUtils.d.ts +32 -0
- package/util/Base1DUtils.js +213 -0
- package/util/Base1DViewModel.d.ts +16 -30
- package/util/Base1DViewModel.js +31 -161
- package/util/index.d.ts +10 -12
- package/util/index.js +20 -57
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { ViewSnap } from './index';
|
|
2
|
+
export interface BpOffset {
|
|
3
|
+
refName?: string;
|
|
4
|
+
index: number;
|
|
5
|
+
offset: number;
|
|
6
|
+
start?: number;
|
|
7
|
+
end?: number;
|
|
8
|
+
}
|
|
9
|
+
export declare function moveTo(self: ViewSnap & {
|
|
10
|
+
zoomTo: (arg: number) => number;
|
|
11
|
+
scrollTo: (arg: number) => void;
|
|
12
|
+
}, start?: BpOffset, end?: BpOffset): void;
|
|
13
|
+
export declare function pxToBp(self: ViewSnap, px: number): {
|
|
14
|
+
coord: number;
|
|
15
|
+
index: number;
|
|
16
|
+
refName: string;
|
|
17
|
+
oob: boolean;
|
|
18
|
+
assemblyName: string;
|
|
19
|
+
offset: number;
|
|
20
|
+
start: number;
|
|
21
|
+
end: number;
|
|
22
|
+
reversed: boolean;
|
|
23
|
+
};
|
|
24
|
+
export declare function bpToPx({ refName, coord, regionNumber, self, }: {
|
|
25
|
+
refName: string;
|
|
26
|
+
coord: number;
|
|
27
|
+
regionNumber?: number;
|
|
28
|
+
self: ViewSnap;
|
|
29
|
+
}): {
|
|
30
|
+
index: number;
|
|
31
|
+
offsetPx: number;
|
|
32
|
+
} | undefined;
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.bpToPx = bpToPx;
|
|
9
|
+
exports.moveTo = moveTo;
|
|
10
|
+
exports.pxToBp = pxToBp;
|
|
11
|
+
|
|
12
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
13
|
+
|
|
14
|
+
var _mobxStateTree = require("mobx-state-tree");
|
|
15
|
+
|
|
16
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
17
|
+
|
|
18
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
19
|
+
|
|
20
|
+
function lengthBetween(self, start, end) {
|
|
21
|
+
var bpSoFar = 0;
|
|
22
|
+
var displayedRegions = self.displayedRegions;
|
|
23
|
+
|
|
24
|
+
if (start.index === end.index) {
|
|
25
|
+
bpSoFar += end.offset - start.offset;
|
|
26
|
+
} else {
|
|
27
|
+
var s = displayedRegions[start.index];
|
|
28
|
+
bpSoFar += s.end - s.start - start.offset;
|
|
29
|
+
|
|
30
|
+
if (end.index - start.index >= 2) {
|
|
31
|
+
for (var i = start.index + 1; i < end.index; i++) {
|
|
32
|
+
var region = displayedRegions[i];
|
|
33
|
+
var len = region.end - region.start;
|
|
34
|
+
bpSoFar += len;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
bpSoFar += end.offset;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
return bpSoFar;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function moveTo(self, start, end) {
|
|
45
|
+
if (!start || !end) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
var width = self.width,
|
|
50
|
+
interRegionPaddingWidth = self.interRegionPaddingWidth;
|
|
51
|
+
var len = lengthBetween(self, start, end);
|
|
52
|
+
var numBlocks = end.index - start.index;
|
|
53
|
+
var targetBpPerPx = len / (width - interRegionPaddingWidth * numBlocks);
|
|
54
|
+
var newBpPerPx = self.zoomTo(targetBpPerPx); // If our target bpPerPx was smaller than the allowed minBpPerPx, adjust
|
|
55
|
+
// the scroll so the requested range is in the middle of the screen
|
|
56
|
+
|
|
57
|
+
var extraBp = 0;
|
|
58
|
+
|
|
59
|
+
if (targetBpPerPx < newBpPerPx) {
|
|
60
|
+
extraBp = (newBpPerPx - targetBpPerPx) * self.width / 2;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
var bpToStart = -extraBp;
|
|
64
|
+
|
|
65
|
+
for (var i = 0; i < self.displayedRegions.length; i += 1) {
|
|
66
|
+
var region = self.displayedRegions[i];
|
|
67
|
+
|
|
68
|
+
if (start.index === i) {
|
|
69
|
+
bpToStart += start.offset;
|
|
70
|
+
break;
|
|
71
|
+
} else {
|
|
72
|
+
bpToStart += region.end - region.start;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
self.scrollTo(Math.round(bpToStart / self.bpPerPx));
|
|
77
|
+
} // manual return type since getSnapshot hard to infer here
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
function pxToBp(self, px) {
|
|
81
|
+
var bpSoFar = 0;
|
|
82
|
+
var bpPerPx = self.bpPerPx,
|
|
83
|
+
offsetPx = self.offsetPx,
|
|
84
|
+
displayedRegions = self.displayedRegions,
|
|
85
|
+
interRegionPaddingWidth = self.interRegionPaddingWidth,
|
|
86
|
+
staticBlocks = self.staticBlocks;
|
|
87
|
+
var blocks = staticBlocks.contentBlocks;
|
|
88
|
+
var bp = (offsetPx + px) * bpPerPx;
|
|
89
|
+
|
|
90
|
+
if (bp < 0) {
|
|
91
|
+
var region = displayedRegions[0];
|
|
92
|
+
var snap = (0, _mobxStateTree.getSnapshot)(region); // @ts-ignore
|
|
93
|
+
|
|
94
|
+
return _objectSpread(_objectSpread({}, snap), {}, {
|
|
95
|
+
oob: true,
|
|
96
|
+
coord: region.reversed ? Math.floor(region.end - bp) + 1 : Math.floor(region.start + bp) + 1,
|
|
97
|
+
offset: bp,
|
|
98
|
+
index: 0
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
var interRegionPaddingBp = interRegionPaddingWidth * bpPerPx;
|
|
103
|
+
var currBlock = 0;
|
|
104
|
+
|
|
105
|
+
for (var i = 0; i < displayedRegions.length; i++) {
|
|
106
|
+
var _blocks$currBlock;
|
|
107
|
+
|
|
108
|
+
var _region = displayedRegions[i];
|
|
109
|
+
var len = _region.end - _region.start;
|
|
110
|
+
var offset = bp - bpSoFar;
|
|
111
|
+
|
|
112
|
+
if (len + bpSoFar > bp && bpSoFar <= bp) {
|
|
113
|
+
var _snap = (0, _mobxStateTree.getSnapshot)(_region); // @ts-ignore
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
return _objectSpread(_objectSpread({}, _snap), {}, {
|
|
117
|
+
oob: false,
|
|
118
|
+
offset: offset,
|
|
119
|
+
coord: _region.reversed ? Math.floor(_region.end - offset) + 1 : Math.floor(_region.start + offset) + 1,
|
|
120
|
+
index: i
|
|
121
|
+
});
|
|
122
|
+
} // add the interRegionPaddingWidth if the boundary is in the screen e.g. in
|
|
123
|
+
// a static block
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
if (((_blocks$currBlock = blocks[currBlock]) === null || _blocks$currBlock === void 0 ? void 0 : _blocks$currBlock.regionNumber) === i) {
|
|
127
|
+
bpSoFar += len + interRegionPaddingBp;
|
|
128
|
+
currBlock++;
|
|
129
|
+
} else {
|
|
130
|
+
bpSoFar += len;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
if (bp >= bpSoFar) {
|
|
135
|
+
var _region2 = displayedRegions[displayedRegions.length - 1];
|
|
136
|
+
|
|
137
|
+
var _len = _region2.end - _region2.start;
|
|
138
|
+
|
|
139
|
+
var _offset = bp - bpSoFar + _len;
|
|
140
|
+
|
|
141
|
+
var _snap2 = (0, _mobxStateTree.getSnapshot)(_region2); // @ts-ignore
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
return _objectSpread(_objectSpread({}, _snap2), {}, {
|
|
145
|
+
oob: true,
|
|
146
|
+
offset: _offset,
|
|
147
|
+
coord: _region2.reversed ? Math.floor(_region2.end - _offset) + 1 : Math.floor(_region2.start + _offset) + 1,
|
|
148
|
+
index: displayedRegions.length - 1
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
return {
|
|
153
|
+
coord: 0,
|
|
154
|
+
index: 0,
|
|
155
|
+
refName: '',
|
|
156
|
+
oob: true,
|
|
157
|
+
assemblyName: '',
|
|
158
|
+
offset: 0,
|
|
159
|
+
start: 0,
|
|
160
|
+
end: 0,
|
|
161
|
+
reversed: false
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
function bpToPx(_ref) {
|
|
166
|
+
var refName = _ref.refName,
|
|
167
|
+
coord = _ref.coord,
|
|
168
|
+
regionNumber = _ref.regionNumber,
|
|
169
|
+
self = _ref.self;
|
|
170
|
+
var bpSoFar = 0;
|
|
171
|
+
var interRegionPaddingWidth = self.interRegionPaddingWidth,
|
|
172
|
+
bpPerPx = self.bpPerPx,
|
|
173
|
+
displayedRegions = self.displayedRegions,
|
|
174
|
+
staticBlocks = self.staticBlocks;
|
|
175
|
+
var blocks = staticBlocks.contentBlocks;
|
|
176
|
+
var interRegionPaddingBp = interRegionPaddingWidth * bpPerPx;
|
|
177
|
+
var currBlock = 0;
|
|
178
|
+
var i = 0;
|
|
179
|
+
|
|
180
|
+
for (; i < displayedRegions.length; i++) {
|
|
181
|
+
var _blocks$currBlock2;
|
|
182
|
+
|
|
183
|
+
var region = displayedRegions[i];
|
|
184
|
+
var len = region.end - region.start;
|
|
185
|
+
|
|
186
|
+
if (refName === region.refName && coord >= region.start && coord <= region.end) {
|
|
187
|
+
if (regionNumber ? regionNumber === i : true) {
|
|
188
|
+
bpSoFar += region.reversed ? region.end - coord : coord - region.start;
|
|
189
|
+
break;
|
|
190
|
+
}
|
|
191
|
+
} // add the interRegionPaddingWidth if the boundary is in the screen e.g. in
|
|
192
|
+
// a static block
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
if (((_blocks$currBlock2 = blocks[currBlock]) === null || _blocks$currBlock2 === void 0 ? void 0 : _blocks$currBlock2.regionNumber) === i) {
|
|
196
|
+
bpSoFar += len + interRegionPaddingBp;
|
|
197
|
+
currBlock++;
|
|
198
|
+
} else {
|
|
199
|
+
bpSoFar += len;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
var found = displayedRegions[i];
|
|
204
|
+
|
|
205
|
+
if (found) {
|
|
206
|
+
return {
|
|
207
|
+
index: i,
|
|
208
|
+
offsetPx: Math.round(bpSoFar / bpPerPx)
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
return undefined;
|
|
213
|
+
}
|
|
@@ -1,13 +1,7 @@
|
|
|
1
1
|
import { Instance } from 'mobx-state-tree';
|
|
2
2
|
import { Feature } from './simpleFeature';
|
|
3
3
|
import { Region as IRegion } from './types';
|
|
4
|
-
|
|
5
|
-
refName?: string;
|
|
6
|
-
index: number;
|
|
7
|
-
offset: number;
|
|
8
|
-
start?: number;
|
|
9
|
-
end?: number;
|
|
10
|
-
}
|
|
4
|
+
import { BpOffset } from './Base1DUtils';
|
|
11
5
|
declare const Base1DView: import("mobx-state-tree").IModelType<{
|
|
12
6
|
id: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<string>, [undefined]>;
|
|
13
7
|
displayedRegions: import("mobx-state-tree").IArrayType<import("mobx-state-tree").IModelType<{
|
|
@@ -38,30 +32,22 @@ declare const Base1DView: import("mobx-state-tree").IModelType<{
|
|
|
38
32
|
readonly maxOffset: number;
|
|
39
33
|
readonly minOffset: number;
|
|
40
34
|
readonly totalBp: number;
|
|
35
|
+
} & {
|
|
36
|
+
readonly dynamicBlocks: import("./blockTypes").BlockSet;
|
|
37
|
+
readonly staticBlocks: import("./blockTypes").BlockSet;
|
|
38
|
+
readonly currBp: number;
|
|
39
|
+
} & {
|
|
41
40
|
pxToBp(px: number): {
|
|
42
|
-
oob: boolean;
|
|
43
41
|
coord: number;
|
|
44
|
-
offset: number;
|
|
45
42
|
index: number;
|
|
46
43
|
refName: string;
|
|
47
|
-
start: number;
|
|
48
|
-
end: number;
|
|
49
|
-
reversed: boolean;
|
|
50
|
-
assemblyName: string;
|
|
51
|
-
} | {
|
|
52
|
-
coord: number;
|
|
53
|
-
index: number;
|
|
54
|
-
start: number;
|
|
55
|
-
refName: string;
|
|
56
44
|
oob: boolean;
|
|
57
45
|
assemblyName: string;
|
|
58
46
|
offset: number;
|
|
47
|
+
start: number;
|
|
48
|
+
end: number;
|
|
59
49
|
reversed: boolean;
|
|
60
50
|
};
|
|
61
|
-
} & {
|
|
62
|
-
readonly dynamicBlocks: import("./blockTypes").BlockSet;
|
|
63
|
-
readonly staticBlocks: import("./blockTypes").BlockSet;
|
|
64
|
-
readonly currBp: number;
|
|
65
51
|
bpToPx({ refName, coord, regionNumber, }: {
|
|
66
52
|
refName: string;
|
|
67
53
|
coord: number;
|
|
@@ -69,8 +55,14 @@ declare const Base1DView: import("mobx-state-tree").IModelType<{
|
|
|
69
55
|
}): number | undefined;
|
|
70
56
|
} & {
|
|
71
57
|
setFeatures(features: Feature[]): void;
|
|
72
|
-
zoomToDisplayedRegions(leftPx: BpOffset | undefined, rightPx: BpOffset | undefined): void;
|
|
73
58
|
showAllRegions(): void;
|
|
59
|
+
zoomOut(): void;
|
|
60
|
+
zoomIn(): void;
|
|
61
|
+
zoomTo(newBpPerPx: number, offset?: number): number;
|
|
62
|
+
scrollTo(offsetPx: number): number;
|
|
63
|
+
centerAt(coord: number, refName: string | undefined, regionNumber: number): void;
|
|
64
|
+
scroll(distance: number): number;
|
|
65
|
+
} & {
|
|
74
66
|
/**
|
|
75
67
|
* offset is the base-pair-offset in the displayed region, index is the index of the
|
|
76
68
|
* displayed region in the linear genome view
|
|
@@ -78,13 +70,7 @@ declare const Base1DView: import("mobx-state-tree").IModelType<{
|
|
|
78
70
|
* @param start - object as `{start, end, offset, index}`
|
|
79
71
|
* @param end - object as `{start, end, offset, index}`
|
|
80
72
|
*/
|
|
81
|
-
moveTo(start
|
|
82
|
-
zoomOut(): void;
|
|
83
|
-
zoomIn(): void;
|
|
84
|
-
zoomTo(newBpPerPx: number, offset?: number): void;
|
|
85
|
-
scrollTo(offsetPx: number): number;
|
|
86
|
-
centerAt(coord: number, refName: string, regionNumber: number): void;
|
|
87
|
-
scroll(distance: number): number;
|
|
73
|
+
moveTo(start?: BpOffset, end?: BpOffset): void;
|
|
88
74
|
}, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>;
|
|
89
75
|
export declare type Base1DViewStateModel = typeof Base1DView;
|
|
90
76
|
export declare type Base1DViewModel = Instance<Base1DViewStateModel>;
|
package/util/Base1DViewModel.js
CHANGED
|
@@ -7,8 +7,6 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
7
7
|
});
|
|
8
8
|
exports.default = void 0;
|
|
9
9
|
|
|
10
|
-
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
11
|
-
|
|
12
10
|
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
13
11
|
|
|
14
12
|
var _mobxStateTree = require("mobx-state-tree");
|
|
@@ -21,9 +19,7 @@ var _calculateDynamicBlocks = _interopRequireDefault(require("./calculateDynamic
|
|
|
21
19
|
|
|
22
20
|
var _calculateStaticBlocks = _interopRequireDefault(require("./calculateStaticBlocks"));
|
|
23
21
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
22
|
+
var _Base1DUtils = require("./Base1DUtils");
|
|
27
23
|
|
|
28
24
|
var Base1DView = _mobxStateTree.types.model('Base1DView', {
|
|
29
25
|
id: _mst.ElementId,
|
|
@@ -83,82 +79,8 @@ var Base1DView = _mobxStateTree.types.model('Base1DView', {
|
|
|
83
79
|
}).reduce(function (a, b) {
|
|
84
80
|
return a + b;
|
|
85
81
|
}, 0);
|
|
86
|
-
},
|
|
87
|
-
|
|
88
|
-
pxToBp: function pxToBp(px) {
|
|
89
|
-
var bpSoFar = 0;
|
|
90
|
-
var bp = (self.offsetPx + px) * self.bpPerPx;
|
|
91
|
-
var n = self.displayedRegions.length;
|
|
92
|
-
|
|
93
|
-
if (bp < 0) {
|
|
94
|
-
var region = self.displayedRegions[0];
|
|
95
|
-
var offset = bp;
|
|
96
|
-
var snap = (0, _mobxStateTree.getSnapshot)(region);
|
|
97
|
-
return _objectSpread(_objectSpread({}, snap), {}, {
|
|
98
|
-
oob: true,
|
|
99
|
-
coord: region.reversed ? Math.floor(region.end - offset) + 1 : Math.floor(region.start + offset) + 1,
|
|
100
|
-
offset: offset,
|
|
101
|
-
index: 0
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
var interRegionPaddingBp = self.interRegionPaddingWidth * self.bpPerPx;
|
|
106
|
-
var minimumBlockBp = self.minimumBlockWidth * self.bpPerPx;
|
|
107
|
-
|
|
108
|
-
for (var index = 0; index < self.displayedRegions.length; index += 1) {
|
|
109
|
-
var _region = self.displayedRegions[index];
|
|
110
|
-
var len = _region.end - _region.start;
|
|
111
|
-
|
|
112
|
-
var _offset = bp - bpSoFar;
|
|
113
|
-
|
|
114
|
-
if (len + bpSoFar > bp && bpSoFar <= bp) {
|
|
115
|
-
var _snap = (0, _mobxStateTree.getSnapshot)(_region);
|
|
116
|
-
|
|
117
|
-
return _objectSpread(_objectSpread({}, _snap), {}, {
|
|
118
|
-
oob: false,
|
|
119
|
-
offset: _offset,
|
|
120
|
-
coord: _region.reversed ? Math.floor(_region.end - _offset) + 1 : Math.floor(_region.start + _offset) + 1,
|
|
121
|
-
index: index
|
|
122
|
-
});
|
|
123
|
-
} // add the interRegionPaddingWidth if the boundary is in the screen
|
|
124
|
-
// e.g. offset>0 && offset<width
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
if (_region.end - _region.start > minimumBlockBp && _offset / self.bpPerPx > 0 && _offset / self.bpPerPx < this.width) {
|
|
128
|
-
bpSoFar += len + interRegionPaddingBp;
|
|
129
|
-
} else {
|
|
130
|
-
bpSoFar += len;
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
if (bp >= bpSoFar) {
|
|
135
|
-
var _region2 = self.displayedRegions[n - 1];
|
|
136
|
-
|
|
137
|
-
var _len = _region2.end - _region2.start;
|
|
138
|
-
|
|
139
|
-
var _offset2 = bp - bpSoFar + _len;
|
|
140
|
-
|
|
141
|
-
var _snap2 = (0, _mobxStateTree.getSnapshot)(_region2);
|
|
142
|
-
|
|
143
|
-
return _objectSpread(_objectSpread({}, _snap2), {}, {
|
|
144
|
-
oob: true,
|
|
145
|
-
offset: _offset2,
|
|
146
|
-
coord: _region2.reversed ? Math.floor(_region2.end - _offset2) + 1 : Math.floor(_region2.start + _offset2) + 1,
|
|
147
|
-
index: n - 1
|
|
148
|
-
});
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
return {
|
|
152
|
-
coord: 0,
|
|
153
|
-
index: 0,
|
|
154
|
-
start: 0,
|
|
155
|
-
refName: '',
|
|
156
|
-
oob: true,
|
|
157
|
-
assemblyName: '',
|
|
158
|
-
offset: 0,
|
|
159
|
-
reversed: false
|
|
160
|
-
};
|
|
161
82
|
}
|
|
83
|
+
|
|
162
84
|
};
|
|
163
85
|
}).views(function (self) {
|
|
164
86
|
return {
|
|
@@ -176,20 +98,26 @@ var Base1DView = _mobxStateTree.types.model('Base1DView', {
|
|
|
176
98
|
}).reduce(function (a, b) {
|
|
177
99
|
return a + b;
|
|
178
100
|
}, 0);
|
|
179
|
-
}
|
|
101
|
+
}
|
|
180
102
|
|
|
103
|
+
};
|
|
104
|
+
}).views(function (self) {
|
|
105
|
+
return {
|
|
106
|
+
pxToBp: function pxToBp(px) {
|
|
107
|
+
return (0, _Base1DUtils.pxToBp)(self, px);
|
|
108
|
+
},
|
|
181
109
|
bpToPx: function bpToPx(_ref) {
|
|
182
|
-
var
|
|
110
|
+
var _bpToPx2;
|
|
183
111
|
|
|
184
112
|
var refName = _ref.refName,
|
|
185
113
|
coord = _ref.coord,
|
|
186
114
|
regionNumber = _ref.regionNumber;
|
|
187
|
-
return (
|
|
115
|
+
return (_bpToPx2 = (0, _Base1DUtils.bpToPx)({
|
|
188
116
|
refName: refName,
|
|
189
117
|
coord: coord,
|
|
190
118
|
regionNumber: regionNumber,
|
|
191
119
|
self: self
|
|
192
|
-
})) === null ||
|
|
120
|
+
})) === null || _bpToPx2 === void 0 ? void 0 : _bpToPx2.offsetPx;
|
|
193
121
|
}
|
|
194
122
|
};
|
|
195
123
|
}).actions(function (self) {
|
|
@@ -197,88 +125,12 @@ var Base1DView = _mobxStateTree.types.model('Base1DView', {
|
|
|
197
125
|
setFeatures: function setFeatures(features) {
|
|
198
126
|
self.features = features;
|
|
199
127
|
},
|
|
200
|
-
zoomToDisplayedRegions: function zoomToDisplayedRegions(leftPx, rightPx) {
|
|
201
|
-
if (leftPx === undefined || rightPx === undefined) {
|
|
202
|
-
return;
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
var singleRefSeq = leftPx.refName === rightPx.refName && leftPx.index === rightPx.index; // zooming into one displayed Region
|
|
206
|
-
|
|
207
|
-
if (singleRefSeq && rightPx.offset < leftPx.offset || leftPx.index > rightPx.index) {
|
|
208
|
-
;
|
|
209
|
-
var _ref2 = [rightPx, leftPx];
|
|
210
|
-
leftPx = _ref2[0];
|
|
211
|
-
rightPx = _ref2[1];
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
var startOffset = {
|
|
215
|
-
start: leftPx.start,
|
|
216
|
-
end: leftPx.end,
|
|
217
|
-
index: leftPx.index,
|
|
218
|
-
offset: leftPx.offset
|
|
219
|
-
};
|
|
220
|
-
var endOffset = {
|
|
221
|
-
start: rightPx.start,
|
|
222
|
-
end: rightPx.end,
|
|
223
|
-
index: rightPx.index,
|
|
224
|
-
offset: rightPx.offset
|
|
225
|
-
};
|
|
226
|
-
|
|
227
|
-
if (startOffset && endOffset) {
|
|
228
|
-
this.moveTo(startOffset, endOffset);
|
|
229
|
-
} else {
|
|
230
|
-
throw new Error('regions not found');
|
|
231
|
-
}
|
|
232
|
-
},
|
|
233
128
|
// this makes a zoomed out view that shows all displayedRegions
|
|
234
129
|
// that makes the overview bar square with the scale bar
|
|
235
130
|
showAllRegions: function showAllRegions() {
|
|
236
131
|
self.bpPerPx = self.totalBp / self.width;
|
|
237
132
|
self.offsetPx = 0;
|
|
238
133
|
},
|
|
239
|
-
|
|
240
|
-
/**
|
|
241
|
-
* offset is the base-pair-offset in the displayed region, index is the index of the
|
|
242
|
-
* displayed region in the linear genome view
|
|
243
|
-
*
|
|
244
|
-
* @param start - object as `{start, end, offset, index}`
|
|
245
|
-
* @param end - object as `{start, end, offset, index}`
|
|
246
|
-
*/
|
|
247
|
-
moveTo: function moveTo(start, end) {
|
|
248
|
-
// find locations in the modellist
|
|
249
|
-
var bpSoFar = 0;
|
|
250
|
-
|
|
251
|
-
if (start.index === end.index) {
|
|
252
|
-
bpSoFar += end.offset - start.offset;
|
|
253
|
-
} else {
|
|
254
|
-
var s = self.displayedRegions[start.index];
|
|
255
|
-
bpSoFar += s.end - s.start - start.offset;
|
|
256
|
-
|
|
257
|
-
if (end.index - start.index >= 2) {
|
|
258
|
-
for (var i = start.index + 1; i < end.index; i += 1) {
|
|
259
|
-
bpSoFar += self.displayedRegions[i].end - self.displayedRegions[i].start;
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
bpSoFar += end.offset;
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
this.zoomTo(bpSoFar / (self.width - self.interRegionPaddingWidth * (end.index - start.index)));
|
|
267
|
-
var bpToStart = 0;
|
|
268
|
-
|
|
269
|
-
for (var _i = 0; _i < self.displayedRegions.length; _i += 1) {
|
|
270
|
-
var region = self.displayedRegions[_i];
|
|
271
|
-
|
|
272
|
-
if (start.index === _i) {
|
|
273
|
-
bpToStart += start.offset;
|
|
274
|
-
break;
|
|
275
|
-
} else {
|
|
276
|
-
bpToStart += region.end - region.start;
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
self.offsetPx = Math.round(bpToStart / self.bpPerPx) + self.interRegionPaddingWidth * start.index;
|
|
281
|
-
},
|
|
282
134
|
zoomOut: function zoomOut() {
|
|
283
135
|
this.zoomTo(self.bpPerPx * 2);
|
|
284
136
|
},
|
|
@@ -290,13 +142,14 @@ var Base1DView = _mobxStateTree.types.model('Base1DView', {
|
|
|
290
142
|
var bpPerPx = newBpPerPx;
|
|
291
143
|
|
|
292
144
|
if (bpPerPx === self.bpPerPx) {
|
|
293
|
-
return;
|
|
145
|
+
return self.bpPerPx;
|
|
294
146
|
}
|
|
295
147
|
|
|
296
148
|
var oldBpPerPx = self.bpPerPx;
|
|
297
149
|
self.bpPerPx = bpPerPx; // tweak the offset so that the center of the view remains at the same coordinate
|
|
298
150
|
|
|
299
151
|
self.offsetPx = (0, _index.clamp)(Math.round((self.offsetPx + offset) * oldBpPerPx / bpPerPx - offset), self.minOffset, self.maxOffset);
|
|
152
|
+
return self.bpPerPx;
|
|
300
153
|
},
|
|
301
154
|
scrollTo: function scrollTo(offsetPx) {
|
|
302
155
|
var newOffsetPx = (0, _index.clamp)(offsetPx, self.minOffset, self.maxOffset);
|
|
@@ -304,6 +157,10 @@ var Base1DView = _mobxStateTree.types.model('Base1DView', {
|
|
|
304
157
|
return newOffsetPx;
|
|
305
158
|
},
|
|
306
159
|
centerAt: function centerAt(coord, refName, regionNumber) {
|
|
160
|
+
if (!refName) {
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
|
|
307
164
|
var centerPx = self.bpToPx({
|
|
308
165
|
refName: refName,
|
|
309
166
|
coord: coord,
|
|
@@ -322,6 +179,19 @@ var Base1DView = _mobxStateTree.types.model('Base1DView', {
|
|
|
322
179
|
return newOffsetPx - oldOffsetPx;
|
|
323
180
|
}
|
|
324
181
|
};
|
|
182
|
+
}).actions(function (self) {
|
|
183
|
+
return {
|
|
184
|
+
/**
|
|
185
|
+
* offset is the base-pair-offset in the displayed region, index is the index of the
|
|
186
|
+
* displayed region in the linear genome view
|
|
187
|
+
*
|
|
188
|
+
* @param start - object as `{start, end, offset, index}`
|
|
189
|
+
* @param end - object as `{start, end, offset, index}`
|
|
190
|
+
*/
|
|
191
|
+
moveTo: function moveTo(start, end) {
|
|
192
|
+
(0, _Base1DUtils.moveTo)(self, start, end);
|
|
193
|
+
}
|
|
194
|
+
};
|
|
325
195
|
});
|
|
326
196
|
|
|
327
197
|
var _default = Base1DView;
|
package/util/index.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { IAnyStateTreeNode } from 'mobx-state-tree';
|
|
1
|
+
import { IAnyStateTreeNode, IStateTreeNode } from 'mobx-state-tree';
|
|
2
2
|
import { IReactionPublic, IReactionOptions } from 'mobx';
|
|
3
3
|
import SimpleFeature, { Feature, isFeature } from './simpleFeature';
|
|
4
4
|
import { AssemblyManager, Region, TypeTestedByPredicate } from './types';
|
|
5
|
+
import { BaseBlock } from './blockTypes';
|
|
5
6
|
export type { Feature };
|
|
6
7
|
export * from './types';
|
|
7
8
|
export * from './aborting';
|
|
@@ -318,22 +319,19 @@ export declare type ViewSnap = {
|
|
|
318
319
|
interRegionPaddingWidth: number;
|
|
319
320
|
minimumBlockWidth: number;
|
|
320
321
|
width: number;
|
|
321
|
-
|
|
322
|
+
offsetPx: number;
|
|
323
|
+
staticBlocks: {
|
|
324
|
+
contentBlocks: BaseBlock[];
|
|
325
|
+
blocks: BaseBlock[];
|
|
326
|
+
};
|
|
327
|
+
displayedRegions: (IStateTreeNode & {
|
|
322
328
|
start: number;
|
|
323
329
|
end: number;
|
|
324
330
|
refName: string;
|
|
325
331
|
reversed: boolean;
|
|
326
|
-
|
|
332
|
+
assemblyName: string;
|
|
333
|
+
})[];
|
|
327
334
|
};
|
|
328
|
-
export declare function viewBpToPx({ refName, coord, regionNumber, self, }: {
|
|
329
|
-
refName: string;
|
|
330
|
-
coord: number;
|
|
331
|
-
regionNumber?: number;
|
|
332
|
-
self: ViewSnap;
|
|
333
|
-
}): {
|
|
334
|
-
index: number;
|
|
335
|
-
offsetPx: number;
|
|
336
|
-
} | undefined;
|
|
337
335
|
export declare function supportedIndexingAdapters(type: string): boolean;
|
|
338
336
|
export declare function getBpDisplayStr(totalBp: number): string;
|
|
339
337
|
export declare function toLocale(n: number): string;
|