@jbrowse/plugin-circular-view 1.6.9 → 1.7.2

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 (41) hide show
  1. package/dist/BaseChordDisplay/components/BaseChordDisplay.d.ts +9 -9
  2. package/dist/BaseChordDisplay/components/BaseChordDisplay.js +53 -0
  3. package/dist/BaseChordDisplay/components/DisplayError.d.ts +4 -4
  4. package/dist/BaseChordDisplay/components/DisplayError.js +70 -0
  5. package/dist/BaseChordDisplay/components/Loading.d.ts +10 -10
  6. package/dist/BaseChordDisplay/components/Loading.js +122 -0
  7. package/dist/BaseChordDisplay/components/RpcRenderedSvgGroup.d.ts +4 -4
  8. package/dist/BaseChordDisplay/components/RpcRenderedSvgGroup.js +96 -0
  9. package/dist/BaseChordDisplay/index.d.ts +3 -3
  10. package/dist/BaseChordDisplay/index.js +31 -0
  11. package/dist/BaseChordDisplay/models/BaseChordDisplayModel.d.ts +99 -99
  12. package/dist/BaseChordDisplay/models/BaseChordDisplayModel.js +261 -0
  13. package/dist/BaseChordDisplay/models/baseChordDisplayConfig.d.ts +2 -2
  14. package/dist/BaseChordDisplay/models/baseChordDisplayConfig.js +20 -0
  15. package/dist/BaseChordDisplay/models/renderReaction.d.ts +30 -30
  16. package/dist/BaseChordDisplay/models/renderReaction.js +142 -0
  17. package/dist/CircularView/components/CircularView.d.ts +4 -4
  18. package/dist/CircularView/components/CircularView.js +203 -0
  19. package/dist/CircularView/components/ImportForm.d.ts +5 -5
  20. package/dist/CircularView/components/ImportForm.js +97 -0
  21. package/dist/CircularView/components/Ruler.d.ts +5 -5
  22. package/dist/CircularView/components/Ruler.js +205 -0
  23. package/dist/CircularView/models/CircularView.d.ts +97 -97
  24. package/dist/CircularView/models/CircularView.js +422 -0
  25. package/dist/CircularView/models/slices.d.ts +27 -27
  26. package/dist/CircularView/models/slices.js +111 -0
  27. package/dist/CircularView/models/slices.test.js +83 -0
  28. package/dist/CircularView/models/viewportVisibleRegion.d.ts +6 -6
  29. package/dist/CircularView/models/viewportVisibleRegion.js +280 -0
  30. package/dist/CircularView/models/viewportVisibleRegion.test.js +130 -0
  31. package/dist/index.d.ts +8 -8
  32. package/dist/index.js +180 -6
  33. package/package.json +5 -7
  34. package/dist/CircularView/models/slices.test.d.ts +0 -1
  35. package/dist/CircularView/models/viewportVisibleRegion.test.d.ts +0 -1
  36. package/dist/plugin-circular-view.cjs.development.js +0 -3013
  37. package/dist/plugin-circular-view.cjs.development.js.map +0 -1
  38. package/dist/plugin-circular-view.cjs.production.min.js +0 -2
  39. package/dist/plugin-circular-view.cjs.production.min.js.map +0 -1
  40. package/dist/plugin-circular-view.esm.js +0 -3004
  41. package/dist/plugin-circular-view.esm.js.map +0 -1
@@ -1,97 +1,97 @@
1
- import { AnyConfigurationModel } from '@jbrowse/core/configuration/configurationSchema';
2
- import PluginManager from '@jbrowse/core/PluginManager';
3
- import { SnapshotOrInstance, Instance } from 'mobx-state-tree';
4
- import { Region } from '@jbrowse/core/util/types/mst';
5
- export default function CircularView(pluginManager: PluginManager): import("mobx-state-tree").IModelType<{
6
- id: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<string>, [undefined]>;
7
- displayName: import("mobx-state-tree").IMaybe<import("mobx-state-tree").ISimpleType<string>>;
8
- } & {
9
- type: import("mobx-state-tree").ISimpleType<"CircularView">;
10
- offsetRadians: import("mobx-state-tree").IType<number | undefined, number, number>;
11
- bpPerPx: import("mobx-state-tree").IType<number | undefined, number, number>;
12
- tracks: import("mobx-state-tree").IArrayType<import("mobx-state-tree").IAnyType>;
13
- hideVerticalResizeHandle: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
14
- hideTrackSelectorButton: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
15
- lockedFitToWindow: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
16
- disableImportForm: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
17
- height: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<number>, [undefined]>;
18
- minimumRadiusPx: import("mobx-state-tree").IType<number | undefined, number, number>;
19
- spacingPx: import("mobx-state-tree").IType<number | undefined, number, number>;
20
- paddingPx: import("mobx-state-tree").IType<number | undefined, number, number>;
21
- lockedPaddingPx: import("mobx-state-tree").IType<number | undefined, number, number>;
22
- minVisibleWidth: import("mobx-state-tree").IType<number | undefined, number, number>;
23
- minimumBlockWidth: import("mobx-state-tree").IType<number | undefined, number, number>;
24
- displayedRegions: import("mobx-state-tree").IArrayType<import("mobx-state-tree").IModelType<{
25
- refName: import("mobx-state-tree").ISimpleType<string>;
26
- start: import("mobx-state-tree").ISimpleType<number>;
27
- end: import("mobx-state-tree").ISimpleType<number>;
28
- reversed: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<boolean>, [undefined]>;
29
- } & {
30
- assemblyName: import("mobx-state-tree").ISimpleType<string>;
31
- }, {
32
- setRefName(newRefName: string): void;
33
- }, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>>;
34
- scrollX: import("mobx-state-tree").IType<number | undefined, number, number>;
35
- scrollY: import("mobx-state-tree").IType<number | undefined, number, number>;
36
- trackSelectorType: import("mobx-state-tree").IType<string | undefined, string, string>;
37
- }, {
38
- width: number;
39
- } & {
40
- menuItems(): import("@jbrowse/core/ui").MenuItem[];
41
- } & {
42
- setDisplayName(name: string): void;
43
- setWidth(newWidth: number): void;
44
- } & {
45
- width: number;
46
- } & {
47
- readonly staticSlices: import("./slices").Slice[];
48
- readonly visibleStaticSlices: import("./slices").Slice[];
49
- readonly visibleSection: {
50
- rho: number[];
51
- theta: number[];
52
- };
53
- readonly circumferencePx: number;
54
- readonly radiusPx: number;
55
- readonly bpPerRadian: number;
56
- readonly pxPerRadian: number;
57
- readonly centerXY: [number, number];
58
- readonly totalBp: number;
59
- readonly maximumRadiusPx: number;
60
- readonly maxBpPerPx: number;
61
- readonly minBpPerPx: number;
62
- readonly atMaxBpPerPx: boolean;
63
- readonly atMinBpPerPx: boolean;
64
- readonly tooSmallToLock: boolean;
65
- readonly figureDimensions: number[];
66
- readonly figureWidth: number;
67
- readonly figureHeight: number;
68
- readonly elidedRegions: any[];
69
- readonly assemblyNames: string[];
70
- readonly initialized: boolean;
71
- } & {
72
- error: Error | undefined;
73
- } & {
74
- setWidth(newWidth: number): number;
75
- setHeight(newHeight: number): number;
76
- resizeHeight(distance: number): number;
77
- resizeWidth(distance: number): number;
78
- rotateClockwiseButton(): void;
79
- rotateCounterClockwiseButton(): void;
80
- rotateClockwise(distance?: number): void;
81
- rotateCounterClockwise(distance?: number): void;
82
- zoomInButton(): void;
83
- zoomOutButton(): void;
84
- setBpPerPx(newVal: number): void;
85
- setModelViewWhenAdjust(secondCondition: boolean): void;
86
- closeView(): void;
87
- setDisplayedRegions(regions: SnapshotOrInstance<typeof Region>[]): void;
88
- activateTrackSelector(): import("@jbrowse/core/util").Widget;
89
- toggleTrack(trackId: string): void;
90
- setError(error: Error): void;
91
- showTrack(trackId: string, initialSnapshot?: {}): void;
92
- addTrackConf(configuration: AnyConfigurationModel, initialSnapshot?: {}): void;
93
- hideTrack(trackId: string): number;
94
- toggleFitToWindowLock(): boolean;
95
- }, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>;
96
- export declare type CircularViewStateModel = ReturnType<typeof CircularView>;
97
- export declare type CircularViewModel = Instance<CircularViewStateModel>;
1
+ import { AnyConfigurationModel } from '@jbrowse/core/configuration/configurationSchema';
2
+ import PluginManager from '@jbrowse/core/PluginManager';
3
+ import { SnapshotOrInstance, Instance } from 'mobx-state-tree';
4
+ import { Region } from '@jbrowse/core/util/types/mst';
5
+ export default function CircularView(pluginManager: PluginManager): import("mobx-state-tree").IModelType<{
6
+ id: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<string>, [undefined]>;
7
+ displayName: import("mobx-state-tree").IMaybe<import("mobx-state-tree").ISimpleType<string>>;
8
+ } & {
9
+ type: import("mobx-state-tree").ISimpleType<"CircularView">;
10
+ offsetRadians: import("mobx-state-tree").IType<number | undefined, number, number>;
11
+ bpPerPx: import("mobx-state-tree").IType<number | undefined, number, number>;
12
+ tracks: import("mobx-state-tree").IArrayType<import("mobx-state-tree").IAnyType>;
13
+ hideVerticalResizeHandle: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
14
+ hideTrackSelectorButton: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
15
+ lockedFitToWindow: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
16
+ disableImportForm: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
17
+ height: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<number>, [undefined]>;
18
+ minimumRadiusPx: import("mobx-state-tree").IType<number | undefined, number, number>;
19
+ spacingPx: import("mobx-state-tree").IType<number | undefined, number, number>;
20
+ paddingPx: import("mobx-state-tree").IType<number | undefined, number, number>;
21
+ lockedPaddingPx: import("mobx-state-tree").IType<number | undefined, number, number>;
22
+ minVisibleWidth: import("mobx-state-tree").IType<number | undefined, number, number>;
23
+ minimumBlockWidth: import("mobx-state-tree").IType<number | undefined, number, number>;
24
+ displayedRegions: import("mobx-state-tree").IArrayType<import("mobx-state-tree").IModelType<{
25
+ refName: import("mobx-state-tree").ISimpleType<string>;
26
+ start: import("mobx-state-tree").ISimpleType<number>;
27
+ end: import("mobx-state-tree").ISimpleType<number>;
28
+ reversed: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<boolean>, [undefined]>;
29
+ } & {
30
+ assemblyName: import("mobx-state-tree").ISimpleType<string>;
31
+ }, {
32
+ setRefName(newRefName: string): void;
33
+ }, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>>;
34
+ scrollX: import("mobx-state-tree").IType<number | undefined, number, number>;
35
+ scrollY: import("mobx-state-tree").IType<number | undefined, number, number>;
36
+ trackSelectorType: import("mobx-state-tree").IType<string | undefined, string, string>;
37
+ }, {
38
+ width: number;
39
+ } & {
40
+ menuItems(): import("@jbrowse/core/ui").MenuItem[];
41
+ } & {
42
+ setDisplayName(name: string): void;
43
+ setWidth(newWidth: number): void;
44
+ } & {
45
+ width: number;
46
+ } & {
47
+ readonly staticSlices: import("./slices").Slice[];
48
+ readonly visibleStaticSlices: import("./slices").Slice[];
49
+ readonly visibleSection: {
50
+ rho: number[];
51
+ theta: number[];
52
+ };
53
+ readonly circumferencePx: number;
54
+ readonly radiusPx: number;
55
+ readonly bpPerRadian: number;
56
+ readonly pxPerRadian: number;
57
+ readonly centerXY: [number, number];
58
+ readonly totalBp: number;
59
+ readonly maximumRadiusPx: number;
60
+ readonly maxBpPerPx: number;
61
+ readonly minBpPerPx: number;
62
+ readonly atMaxBpPerPx: boolean;
63
+ readonly atMinBpPerPx: boolean;
64
+ readonly tooSmallToLock: boolean;
65
+ readonly figureDimensions: number[];
66
+ readonly figureWidth: number;
67
+ readonly figureHeight: number;
68
+ readonly elidedRegions: any[];
69
+ readonly assemblyNames: string[];
70
+ readonly initialized: boolean;
71
+ } & {
72
+ error: Error | undefined;
73
+ } & {
74
+ setWidth(newWidth: number): number;
75
+ setHeight(newHeight: number): number;
76
+ resizeHeight(distance: number): number;
77
+ resizeWidth(distance: number): number;
78
+ rotateClockwiseButton(): void;
79
+ rotateCounterClockwiseButton(): void;
80
+ rotateClockwise(distance?: number): void;
81
+ rotateCounterClockwise(distance?: number): void;
82
+ zoomInButton(): void;
83
+ zoomOutButton(): void;
84
+ setBpPerPx(newVal: number): void;
85
+ setModelViewWhenAdjust(secondCondition: boolean): void;
86
+ closeView(): void;
87
+ setDisplayedRegions(regions: SnapshotOrInstance<typeof Region>[]): void;
88
+ activateTrackSelector(): import("@jbrowse/core/util").Widget;
89
+ toggleTrack(trackId: string): void;
90
+ setError(error: Error): void;
91
+ showTrack(trackId: string, initialSnapshot?: {}): void;
92
+ addTrackConf(configuration: AnyConfigurationModel, initialSnapshot?: {}): void;
93
+ hideTrack(trackId: string): number;
94
+ toggleFitToWindowLock(): boolean;
95
+ }, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>;
96
+ export declare type CircularViewStateModel = ReturnType<typeof CircularView>;
97
+ export declare type CircularViewModel = Instance<CircularViewStateModel>;
@@ -0,0 +1,422 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports["default"] = CircularView;
9
+
10
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
+
12
+ var _mobxStateTree = require("mobx-state-tree");
13
+
14
+ var _mst = require("@jbrowse/core/util/types/mst");
15
+
16
+ var _mobx = require("mobx");
17
+
18
+ var _configuration = require("@jbrowse/core/configuration");
19
+
20
+ var _util = require("@jbrowse/core/util");
21
+
22
+ var _models = require("@jbrowse/core/pluggableElementTypes/models");
23
+
24
+ var _slices = require("./slices");
25
+
26
+ var _viewportVisibleRegion = require("./viewportVisibleRegion");
27
+
28
+ 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; }
29
+
30
+ 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; }
31
+
32
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
33
+
34
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
35
+
36
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
37
+
38
+ function CircularView(pluginManager) {
39
+ var minHeight = 40;
40
+ var minWidth = 100;
41
+ var defaultHeight = 400;
42
+ return _mobxStateTree.types.compose(_models.BaseViewModel, _mobxStateTree.types.model('CircularView', {
43
+ type: _mobxStateTree.types.literal('CircularView'),
44
+ offsetRadians: -Math.PI / 2,
45
+ bpPerPx: 2000000,
46
+ tracks: _mobxStateTree.types.array(pluginManager.pluggableMstType('track', 'stateModel')),
47
+ hideVerticalResizeHandle: false,
48
+ hideTrackSelectorButton: false,
49
+ lockedFitToWindow: true,
50
+ disableImportForm: false,
51
+ height: _mobxStateTree.types.optional(_mobxStateTree.types.refinement('trackHeight', _mobxStateTree.types.number, function (n) {
52
+ return n >= minHeight;
53
+ }), defaultHeight),
54
+ minimumRadiusPx: 25,
55
+ spacingPx: 10,
56
+ paddingPx: 80,
57
+ lockedPaddingPx: 100,
58
+ minVisibleWidth: 6,
59
+ minimumBlockWidth: 20,
60
+ displayedRegions: _mobxStateTree.types.array(_mst.Region),
61
+ scrollX: 0,
62
+ scrollY: 0,
63
+ trackSelectorType: 'hierarchical'
64
+ })["volatile"](function () {
65
+ return {
66
+ width: 0
67
+ };
68
+ }).views(function (self) {
69
+ return {
70
+ get staticSlices() {
71
+ return (0, _slices.calculateStaticSlices)(self);
72
+ },
73
+
74
+ get visibleStaticSlices() {
75
+ return this.staticSlices.filter(_slices.sliceIsVisible.bind(this, self));
76
+ },
77
+
78
+ get visibleSection() {
79
+ return (0, _viewportVisibleRegion.viewportVisibleSection)([self.scrollX, self.scrollX + self.width, self.scrollY, self.scrollY + self.height], this.centerXY, this.radiusPx);
80
+ },
81
+
82
+ get circumferencePx() {
83
+ var elidedBp = 0;
84
+
85
+ var _iterator = _createForOfIteratorHelper(this.elidedRegions),
86
+ _step;
87
+
88
+ try {
89
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
90
+ var r = _step.value;
91
+ elidedBp += r.widthBp;
92
+ }
93
+ } catch (err) {
94
+ _iterator.e(err);
95
+ } finally {
96
+ _iterator.f();
97
+ }
98
+
99
+ return elidedBp / self.bpPerPx + self.spacingPx * this.elidedRegions.length;
100
+ },
101
+
102
+ get radiusPx() {
103
+ return this.circumferencePx / (2 * Math.PI);
104
+ },
105
+
106
+ get bpPerRadian() {
107
+ return self.bpPerPx * this.radiusPx;
108
+ },
109
+
110
+ get pxPerRadian() {
111
+ return this.radiusPx;
112
+ },
113
+
114
+ get centerXY() {
115
+ return [this.radiusPx + self.paddingPx, this.radiusPx + self.paddingPx];
116
+ },
117
+
118
+ get totalBp() {
119
+ var total = 0;
120
+
121
+ var _iterator2 = _createForOfIteratorHelper(self.displayedRegions),
122
+ _step2;
123
+
124
+ try {
125
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
126
+ var region = _step2.value;
127
+ total += region.end - region.start;
128
+ }
129
+ } catch (err) {
130
+ _iterator2.e(err);
131
+ } finally {
132
+ _iterator2.f();
133
+ }
134
+
135
+ return total;
136
+ },
137
+
138
+ get maximumRadiusPx() {
139
+ return self.lockedFitToWindow ? Math.min(self.width, self.height) / 2 - self.lockedPaddingPx : 1000000;
140
+ },
141
+
142
+ get maxBpPerPx() {
143
+ var minCircumferencePx = 2 * Math.PI * self.minimumRadiusPx;
144
+ return this.totalBp / minCircumferencePx;
145
+ },
146
+
147
+ get minBpPerPx() {
148
+ // min depends on window dimensions, clamp between old min(0.01) and max
149
+ var maxCircumferencePx = 2 * Math.PI * this.maximumRadiusPx;
150
+ return (0, _util.clamp)(this.totalBp / maxCircumferencePx, 0.0000000001, this.maxBpPerPx);
151
+ },
152
+
153
+ get atMaxBpPerPx() {
154
+ return self.bpPerPx >= this.maxBpPerPx;
155
+ },
156
+
157
+ get atMinBpPerPx() {
158
+ return self.bpPerPx <= this.minBpPerPx;
159
+ },
160
+
161
+ get tooSmallToLock() {
162
+ return this.minBpPerPx <= 0.0000000001;
163
+ },
164
+
165
+ get figureDimensions() {
166
+ return [this.radiusPx * 2 + 2 * self.paddingPx, this.radiusPx * 2 + 2 * self.paddingPx];
167
+ },
168
+
169
+ get figureWidth() {
170
+ return this.figureDimensions[0];
171
+ },
172
+
173
+ get figureHeight() {
174
+ return this.figureDimensions[1];
175
+ },
176
+
177
+ // this is displayedRegions, post-processed to
178
+ // elide regions that are too small to see reasonably
179
+ get elidedRegions() {
180
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
181
+ var visible = [];
182
+ self.displayedRegions.forEach(function (region) {
183
+ var widthBp = region.end - region.start;
184
+ var widthPx = widthBp / self.bpPerPx;
185
+
186
+ if (widthPx < self.minVisibleWidth) {
187
+ // too small to see, collapse into a single elision region
188
+ var lastVisible = visible[visible.length - 1];
189
+
190
+ if (lastVisible && lastVisible.elided) {
191
+ lastVisible.regions.push(_objectSpread({}, region));
192
+ lastVisible.widthBp += widthBp;
193
+ } else {
194
+ visible.push({
195
+ elided: true,
196
+ widthBp: widthBp,
197
+ regions: [_objectSpread({}, region)]
198
+ });
199
+ }
200
+ } else {
201
+ // big enough to see, display it
202
+ visible.push(_objectSpread(_objectSpread({}, region), {}, {
203
+ widthBp: widthBp
204
+ }));
205
+ }
206
+ }); // remove any single-region elisions
207
+
208
+ for (var i = 0; i < visible.length; i += 1) {
209
+ var v = visible[i];
210
+
211
+ if (v.elided && v.regions.length === 1) {
212
+ delete v.elided;
213
+ visible[i] = _objectSpread(_objectSpread({}, v), v.regions[0]);
214
+ }
215
+ }
216
+
217
+ return visible;
218
+ },
219
+
220
+ get assemblyNames() {
221
+ var assemblyNames = [];
222
+ self.displayedRegions.forEach(function (displayedRegion) {
223
+ if (!assemblyNames.includes(displayedRegion.assemblyName)) {
224
+ assemblyNames.push(displayedRegion.assemblyName);
225
+ }
226
+ });
227
+ return assemblyNames;
228
+ },
229
+
230
+ get initialized() {
231
+ var _getSession = (0, _util.getSession)(self),
232
+ assemblyManager = _getSession.assemblyManager;
233
+
234
+ return this.assemblyNames.every(function (a) {
235
+ var _assemblyManager$get;
236
+
237
+ return (_assemblyManager$get = assemblyManager.get(a)) === null || _assemblyManager$get === void 0 ? void 0 : _assemblyManager$get.initialized;
238
+ });
239
+ }
240
+
241
+ };
242
+ })["volatile"](function () {
243
+ return {
244
+ error: undefined
245
+ };
246
+ }).actions(function (self) {
247
+ return {
248
+ // toggle action with a flag stating which mode it's in
249
+ setWidth: function setWidth(newWidth) {
250
+ self.width = Math.max(newWidth, minWidth);
251
+ return self.width;
252
+ },
253
+ setHeight: function setHeight(newHeight) {
254
+ self.height = Math.max(newHeight, minHeight);
255
+ return self.height;
256
+ },
257
+ resizeHeight: function resizeHeight(distance) {
258
+ var oldHeight = self.height;
259
+ var newHeight = this.setHeight(self.height + distance);
260
+ this.setModelViewWhenAdjust(!self.tooSmallToLock);
261
+ return newHeight - oldHeight;
262
+ },
263
+ resizeWidth: function resizeWidth(distance) {
264
+ var oldWidth = self.width;
265
+ var newWidth = this.setWidth(self.width + distance);
266
+ this.setModelViewWhenAdjust(!self.tooSmallToLock);
267
+ return newWidth - oldWidth;
268
+ },
269
+ rotateClockwiseButton: function rotateClockwiseButton() {
270
+ this.rotateClockwise(Math.PI / 6);
271
+ },
272
+ rotateCounterClockwiseButton: function rotateCounterClockwiseButton() {
273
+ this.rotateCounterClockwise(Math.PI / 6);
274
+ },
275
+ rotateClockwise: function rotateClockwise() {
276
+ var distance = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0.17;
277
+ self.offsetRadians += distance;
278
+ },
279
+ rotateCounterClockwise: function rotateCounterClockwise() {
280
+ var distance = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0.17;
281
+ self.offsetRadians -= distance;
282
+ },
283
+ zoomInButton: function zoomInButton() {
284
+ this.setBpPerPx(self.bpPerPx / 1.4);
285
+ },
286
+ zoomOutButton: function zoomOutButton() {
287
+ this.setBpPerPx(self.bpPerPx * 1.4);
288
+ },
289
+ setBpPerPx: function setBpPerPx(newVal) {
290
+ self.bpPerPx = (0, _util.clamp)(newVal, self.minBpPerPx, self.maxBpPerPx);
291
+ },
292
+ setModelViewWhenAdjust: function setModelViewWhenAdjust(secondCondition) {
293
+ if (self.lockedFitToWindow && secondCondition) {
294
+ this.setBpPerPx(self.minBpPerPx);
295
+ }
296
+ },
297
+ closeView: function closeView() {
298
+ (0, _mobxStateTree.getParent)(self, 2).removeView(self);
299
+ },
300
+ setDisplayedRegions: function setDisplayedRegions(regions) {
301
+ var previouslyEmpty = self.displayedRegions.length === 0;
302
+ self.displayedRegions = (0, _mobxStateTree.cast)(regions);
303
+
304
+ if (previouslyEmpty) {
305
+ this.setBpPerPx(self.minBpPerPx);
306
+ } else {
307
+ this.setBpPerPx(self.bpPerPx);
308
+ }
309
+ },
310
+ activateTrackSelector: function activateTrackSelector() {
311
+ if (self.trackSelectorType === 'hierarchical') {
312
+ var session = (0, _util.getSession)(self);
313
+
314
+ if ((0, _util.isSessionModelWithWidgets)(session)) {
315
+ var selector = session.addWidget('HierarchicalTrackSelectorWidget', 'hierarchicalTrackSelector', {
316
+ view: self
317
+ });
318
+ session.showWidget(selector);
319
+ return selector;
320
+ }
321
+ }
322
+
323
+ throw new Error("invalid track selector type ".concat(self.trackSelectorType));
324
+ },
325
+ toggleTrack: function toggleTrack(trackId) {
326
+ // if we have any tracks with that configuration, turn them off
327
+ var hiddenCount = this.hideTrack(trackId); // if none had that configuration, turn one on
328
+
329
+ if (!hiddenCount) {
330
+ this.showTrack(trackId);
331
+ }
332
+ },
333
+ setError: function setError(error) {
334
+ console.error(error);
335
+ self.error = error;
336
+ },
337
+ showTrack: function showTrack(trackId) {
338
+ var initialSnapshot = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
339
+ var trackConfigSchema = pluginManager.pluggableConfigSchemaType('track');
340
+ var configuration = (0, _mobxStateTree.resolveIdentifier)(trackConfigSchema, (0, _mobxStateTree.getRoot)(self), trackId);
341
+ var trackType = pluginManager.getTrackType(configuration.type);
342
+
343
+ if (!trackType) {
344
+ throw new Error("unknown track type ".concat(configuration.type));
345
+ }
346
+
347
+ var viewType = pluginManager.getViewType(self.type);
348
+ var supportedDisplays = viewType.displayTypes.map(function (displayType) {
349
+ return displayType.name;
350
+ });
351
+ var displayConf = configuration.displays.find(function (d) {
352
+ return supportedDisplays.includes(d.type);
353
+ });
354
+ var track = trackType.stateModel.create(_objectSpread(_objectSpread({}, initialSnapshot), {}, {
355
+ type: configuration.type,
356
+ configuration: configuration,
357
+ displays: [{
358
+ type: displayConf.type,
359
+ configuration: displayConf
360
+ }]
361
+ }));
362
+ self.tracks.push(track);
363
+ },
364
+ addTrackConf: function addTrackConf(configuration) {
365
+ var initialSnapshot = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
366
+ var type = configuration.type;
367
+ var name = (0, _configuration.readConfObject)(configuration, 'name');
368
+ var trackType = pluginManager.getTrackType(type);
369
+
370
+ if (!trackType) {
371
+ throw new Error("unknown track type ".concat(configuration.type));
372
+ }
373
+
374
+ var viewType = pluginManager.getViewType(self.type);
375
+ var supportedDisplays = viewType.displayTypes.map(function (displayType) {
376
+ return displayType.name;
377
+ });
378
+ var displayConf = configuration.displays.find(function (d) {
379
+ return supportedDisplays.includes(d.type);
380
+ });
381
+ var track = trackType.stateModel.create(_objectSpread(_objectSpread({}, initialSnapshot), {}, {
382
+ name: name,
383
+ type: type,
384
+ configuration: configuration,
385
+ displays: [{
386
+ type: displayConf.type,
387
+ configuration: displayConf
388
+ }]
389
+ }));
390
+ self.tracks.push(track);
391
+ },
392
+ hideTrack: function hideTrack(trackId) {
393
+ var trackConfigSchema = pluginManager.pluggableConfigSchemaType('track');
394
+ var configuration = (0, _mobxStateTree.resolveIdentifier)(trackConfigSchema, (0, _mobxStateTree.getRoot)(self), trackId); // if we have any tracks with that configuration, turn them off
395
+
396
+ var shownTracks = self.tracks.filter(function (t) {
397
+ return t.configuration === configuration;
398
+ });
399
+ (0, _mobx.transaction)(function () {
400
+ return shownTracks.forEach(function (t) {
401
+ return self.tracks.remove(t);
402
+ });
403
+ });
404
+ return shownTracks.length;
405
+ },
406
+ toggleFitToWindowLock: function toggleFitToWindowLock() {
407
+ self.lockedFitToWindow = !self.lockedFitToWindow; // when going unlocked -> locked and circle is cut off, set to the locked minBpPerPx
408
+
409
+ this.setModelViewWhenAdjust(self.atMinBpPerPx);
410
+ return self.lockedFitToWindow;
411
+ }
412
+ };
413
+ }));
414
+ }
415
+ /*
416
+ PLANS
417
+
418
+ - tracks
419
+ - ruler tick marks
420
+ - set viewport scroll from state snapshot
421
+
422
+ */
@@ -1,27 +1,27 @@
1
- import { Region } from '@jbrowse/core/util';
2
- export declare class Slice {
3
- region: Region & {
4
- widthBp: number;
5
- elided: boolean;
6
- };
7
- radianWidth: number;
8
- key: string;
9
- offsetRadians: number;
10
- startRadians: number;
11
- endRadians: number;
12
- bpPerRadian: number;
13
- flipped: boolean;
14
- constructor(view: {
15
- bpPerRadian: number;
16
- }, region: Region & {
17
- widthBp: number;
18
- elided: boolean;
19
- }, currentRadianOffset: number, radianWidth: number);
20
- bpToXY(bp: number, radiusPx: number): [number, number];
21
- toJSON(): {
22
- [k: string]: any;
23
- };
24
- }
25
- declare function calculateStaticSlices(self: any): Slice[];
26
- declare function sliceIsVisible(self: any, slice: Slice): boolean;
27
- export { calculateStaticSlices, sliceIsVisible };
1
+ import { Region } from '@jbrowse/core/util';
2
+ export declare class Slice {
3
+ region: Region & {
4
+ widthBp: number;
5
+ elided: boolean;
6
+ };
7
+ radianWidth: number;
8
+ key: string;
9
+ offsetRadians: number;
10
+ startRadians: number;
11
+ endRadians: number;
12
+ bpPerRadian: number;
13
+ flipped: boolean;
14
+ constructor(view: {
15
+ bpPerRadian: number;
16
+ }, region: Region & {
17
+ widthBp: number;
18
+ elided: boolean;
19
+ }, currentRadianOffset: number, radianWidth: number);
20
+ bpToXY(bp: number, radiusPx: number): [number, number];
21
+ toJSON(): {
22
+ [k: string]: any;
23
+ };
24
+ }
25
+ declare function calculateStaticSlices(self: any): Slice[];
26
+ declare function sliceIsVisible(self: any, slice: Slice): boolean;
27
+ export { calculateStaticSlices, sliceIsVisible };