@jbrowse/plugin-circular-view 1.7.11 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/dist/BaseChordDisplay/components/BaseChordDisplay.d.ts +2 -7
  2. package/dist/BaseChordDisplay/components/BaseChordDisplay.js +18 -48
  3. package/dist/BaseChordDisplay/components/BaseChordDisplay.js.map +1 -0
  4. package/dist/BaseChordDisplay/components/DisplayError.d.ts +9 -4
  5. package/dist/BaseChordDisplay/components/DisplayError.js +24 -67
  6. package/dist/BaseChordDisplay/components/DisplayError.js.map +1 -0
  7. package/dist/BaseChordDisplay/components/Loading.d.ts +2 -3
  8. package/dist/BaseChordDisplay/components/Loading.js +98 -112
  9. package/dist/BaseChordDisplay/components/Loading.js.map +1 -0
  10. package/dist/BaseChordDisplay/components/RpcRenderedSvgGroup.d.ts +3 -3
  11. package/dist/BaseChordDisplay/components/RpcRenderedSvgGroup.js +80 -91
  12. package/dist/BaseChordDisplay/components/RpcRenderedSvgGroup.js.map +1 -0
  13. package/dist/BaseChordDisplay/index.d.ts +1 -1
  14. package/dist/BaseChordDisplay/index.js +12 -30
  15. package/dist/BaseChordDisplay/index.js.map +1 -0
  16. package/dist/BaseChordDisplay/models/BaseChordDisplayModel.d.ts +10 -10
  17. package/dist/BaseChordDisplay/models/BaseChordDisplayModel.js +204 -232
  18. package/dist/BaseChordDisplay/models/BaseChordDisplayModel.js.map +1 -0
  19. package/dist/BaseChordDisplay/models/baseChordDisplayConfig.js +12 -18
  20. package/dist/BaseChordDisplay/models/baseChordDisplayConfig.js.map +1 -0
  21. package/dist/BaseChordDisplay/models/renderReaction.js +115 -138
  22. package/dist/BaseChordDisplay/models/renderReaction.js.map +1 -0
  23. package/dist/CircularView/components/CircularView.js +111 -185
  24. package/dist/CircularView/components/CircularView.js.map +1 -0
  25. package/dist/CircularView/components/ImportForm.js +77 -92
  26. package/dist/CircularView/components/ImportForm.js.map +1 -0
  27. package/dist/CircularView/components/Ruler.js +148 -194
  28. package/dist/CircularView/components/Ruler.js.map +1 -0
  29. package/dist/CircularView/models/CircularView.d.ts +3 -3
  30. package/dist/CircularView/models/CircularView.js +346 -409
  31. package/dist/CircularView/models/CircularView.js.map +1 -0
  32. package/dist/CircularView/models/slices.js +90 -104
  33. package/dist/CircularView/models/slices.js.map +1 -0
  34. package/dist/CircularView/models/viewportVisibleRegion.js +229 -264
  35. package/dist/CircularView/models/viewportVisibleRegion.js.map +1 -0
  36. package/dist/index.d.ts +3 -1
  37. package/dist/index.js +147 -176
  38. package/dist/index.js.map +1 -0
  39. package/esm/BaseChordDisplay/components/BaseChordDisplay.d.ts +4 -0
  40. package/esm/BaseChordDisplay/components/BaseChordDisplay.js +17 -0
  41. package/esm/BaseChordDisplay/components/BaseChordDisplay.js.map +1 -0
  42. package/esm/BaseChordDisplay/components/DisplayError.d.ts +9 -0
  43. package/esm/BaseChordDisplay/components/DisplayError.js +21 -0
  44. package/esm/BaseChordDisplay/components/DisplayError.js.map +1 -0
  45. package/esm/BaseChordDisplay/components/Loading.d.ts +9 -0
  46. package/esm/BaseChordDisplay/components/Loading.js +66 -0
  47. package/esm/BaseChordDisplay/components/Loading.js.map +1 -0
  48. package/esm/BaseChordDisplay/components/RpcRenderedSvgGroup.d.ts +4 -0
  49. package/esm/BaseChordDisplay/components/RpcRenderedSvgGroup.js +48 -0
  50. package/esm/BaseChordDisplay/components/RpcRenderedSvgGroup.js.map +1 -0
  51. package/esm/BaseChordDisplay/index.d.ts +3 -0
  52. package/esm/BaseChordDisplay/index.js +4 -0
  53. package/esm/BaseChordDisplay/index.js.map +1 -0
  54. package/esm/BaseChordDisplay/models/BaseChordDisplayModel.d.ts +99 -0
  55. package/esm/BaseChordDisplay/models/BaseChordDisplayModel.js +181 -0
  56. package/esm/BaseChordDisplay/models/BaseChordDisplayModel.js.map +1 -0
  57. package/esm/BaseChordDisplay/models/baseChordDisplayConfig.d.ts +2 -0
  58. package/esm/BaseChordDisplay/models/baseChordDisplayConfig.js +11 -0
  59. package/esm/BaseChordDisplay/models/baseChordDisplayConfig.js.map +1 -0
  60. package/esm/BaseChordDisplay/models/renderReaction.d.ts +30 -0
  61. package/esm/BaseChordDisplay/models/renderReaction.js +52 -0
  62. package/esm/BaseChordDisplay/models/renderReaction.js.map +1 -0
  63. package/esm/CircularView/components/CircularView.d.ts +4 -0
  64. package/esm/CircularView/components/CircularView.js +121 -0
  65. package/esm/CircularView/components/CircularView.js.map +1 -0
  66. package/esm/CircularView/components/ImportForm.d.ts +5 -0
  67. package/esm/CircularView/components/ImportForm.js +40 -0
  68. package/esm/CircularView/components/ImportForm.js.map +1 -0
  69. package/esm/CircularView/components/Ruler.d.ts +5 -0
  70. package/esm/CircularView/components/Ruler.js +126 -0
  71. package/esm/CircularView/components/Ruler.js.map +1 -0
  72. package/esm/CircularView/models/CircularView.d.ts +97 -0
  73. package/esm/CircularView/models/CircularView.js +317 -0
  74. package/esm/CircularView/models/CircularView.js.map +1 -0
  75. package/esm/CircularView/models/slices.d.ts +27 -0
  76. package/esm/CircularView/models/slices.js +53 -0
  77. package/esm/CircularView/models/slices.js.map +1 -0
  78. package/esm/CircularView/models/viewportVisibleRegion.d.ts +6 -0
  79. package/esm/CircularView/models/viewportVisibleRegion.js +223 -0
  80. package/esm/CircularView/models/viewportVisibleRegion.js.map +1 -0
  81. package/esm/index.d.ts +10 -0
  82. package/esm/index.js +49 -0
  83. package/esm/index.js.map +1 -0
  84. package/package.json +19 -11
  85. package/src/BaseChordDisplay/components/BaseChordDisplay.tsx +13 -25
  86. package/src/BaseChordDisplay/components/DisplayError.js +64 -66
  87. package/src/BaseChordDisplay/components/Loading.tsx +104 -107
  88. package/src/BaseChordDisplay/components/RpcRenderedSvgGroup.js +44 -51
  89. package/src/BaseChordDisplay/index.ts +1 -1
  90. package/src/BaseChordDisplay/models/BaseChordDisplayModel.ts +2 -1
  91. package/src/CircularView/components/CircularView.js +17 -16
  92. package/src/CircularView/components/ImportForm.tsx +5 -5
  93. package/src/CircularView/components/Ruler.js +4 -3
  94. package/src/CircularView/models/CircularView.ts +29 -42
  95. package/src/CircularView/models/slices.ts +2 -7
  96. package/src/index.ts +5 -2
  97. package/dist/CircularView/models/slices.test.js +0 -83
  98. package/dist/CircularView/models/viewportVisibleRegion.test.js +0 -130
@@ -0,0 +1,126 @@
1
+ import React from 'react';
2
+ import { observer } from 'mobx-react';
3
+ import { getSession, polarToCartesian, radToDeg, assembleLocString, } from '@jbrowse/core/util';
4
+ import { makeContrasting } from '@jbrowse/core/util/color';
5
+ import { useTheme } from '@mui/material/styles';
6
+ import { makeStyles } from 'tss-react/mui';
7
+ const useStyles = makeStyles()({
8
+ rulerLabel: {
9
+ fontSize: '0.8rem',
10
+ fontWeight: 500,
11
+ lineHeight: 1.6,
12
+ letterSpacing: '0.0075em',
13
+ },
14
+ });
15
+ function sliceArcPath(slice, radiusPx, startBase, endBase) {
16
+ // A rx ry x-axis-rotation large-arc-flag sweep-flag x y
17
+ if (slice.flipped) {
18
+ ;
19
+ [startBase, endBase] = [endBase, startBase];
20
+ }
21
+ const startXY = slice.bpToXY(startBase, radiusPx);
22
+ const endXY = slice.bpToXY(endBase, radiusPx);
23
+ const largeArc = Math.abs(endBase - startBase) / slice.bpPerRadian > Math.PI ? '1' : '0';
24
+ const sweepFlag = '1';
25
+ return [
26
+ 'M',
27
+ ...startXY,
28
+ 'A',
29
+ radiusPx,
30
+ radiusPx,
31
+ '0',
32
+ largeArc,
33
+ sweepFlag,
34
+ ...endXY,
35
+ ].join(' ');
36
+ }
37
+ const ElisionRulerArc = observer(({ model, slice }) => {
38
+ const theme = useTheme();
39
+ const { radiusPx: modelRadiusPx } = model;
40
+ const radiusPx = modelRadiusPx + 1;
41
+ const { endRadians, startRadians, region } = slice;
42
+ const startXY = polarToCartesian(radiusPx, startRadians);
43
+ const endXY = polarToCartesian(radiusPx, endRadians);
44
+ const widthPx = (endRadians - startRadians) * radiusPx;
45
+ const largeArc = endRadians - startRadians > Math.PI ? '1' : '0';
46
+ // TODO: draw the elision
47
+ const centerRadians = (endRadians + startRadians) / 2;
48
+ const regionCountString = `[${Number(region.regions.length).toLocaleString()}]`;
49
+ return (React.createElement(React.Fragment, null,
50
+ React.createElement(RulerLabel, { text: regionCountString, view: model, maxWidthPx: widthPx, radians: centerRadians, radiusPx: radiusPx, title: `${Number(region.regions.length).toLocaleString()} more regions`, color: theme.palette.text.primary }),
51
+ React.createElement("path", { d: [
52
+ 'M',
53
+ ...startXY,
54
+ 'A',
55
+ radiusPx,
56
+ radiusPx,
57
+ '0',
58
+ largeArc,
59
+ '1',
60
+ ...endXY,
61
+ ].join(' '), stroke: theme.palette.text.secondary, strokeWidth: 2, strokeDasharray: "2,2", fill: "none" })));
62
+ });
63
+ const RulerLabel = observer(({ view, text, maxWidthPx, radians, radiusPx, title, color }) => {
64
+ const { classes } = useStyles();
65
+ const textXY = polarToCartesian(radiusPx + 5, radians);
66
+ if (!text) {
67
+ return null;
68
+ }
69
+ if (text.length * 6.5 < maxWidthPx) {
70
+ // text is rotated parallel to the ruler arc
71
+ return (React.createElement("text", { x: 0, y: 0, className: classes.rulerLabel, textAnchor: "middle", dominantBaseline: "baseline", transform: `translate(${textXY}) rotate(${radToDeg(radians) + 90})`, style: { fill: color } },
72
+ text,
73
+ React.createElement("title", null, title || text)));
74
+ }
75
+ if (maxWidthPx > 4) {
76
+ // text is rotated perpendicular to the ruler arc
77
+ const overallRotation = radToDeg(radians + view.offsetRadians - Math.PI / 2);
78
+ if (overallRotation >= 180) {
79
+ return (React.createElement("text", { x: 0, y: 0, className: classes.rulerLabel, textAnchor: "start", dominantBaseline: "middle", transform: `translate(${textXY}) rotate(${radToDeg(radians)})`, style: { fill: color } },
80
+ text,
81
+ React.createElement("title", null, title || text)));
82
+ }
83
+ return (React.createElement("text", { x: 0, y: 0, className: classes.rulerLabel, textAnchor: "end", dominantBaseline: "middle", transform: `translate(${textXY}) rotate(${radToDeg(radians) + 180})`, style: { fill: color } },
84
+ text,
85
+ React.createElement("title", null, title || text)));
86
+ }
87
+ // if you get here there is no room for the text at all
88
+ return null;
89
+ });
90
+ const RegionRulerArc = observer(({ model, slice }) => {
91
+ const theme = useTheme();
92
+ const { radiusPx } = model;
93
+ const { region, endRadians, startRadians } = slice;
94
+ const centerRadians = (endRadians + startRadians) / 2;
95
+ const widthPx = (endRadians - startRadians) * radiusPx;
96
+ const session = getSession(model);
97
+ let color;
98
+ const assembly = session.assemblyManager.get(slice.region.assemblyName);
99
+ if (assembly) {
100
+ color = assembly.getRefNameColor(region.refName);
101
+ }
102
+ if (color) {
103
+ try {
104
+ color = makeContrasting(color, theme.palette.background.paper);
105
+ }
106
+ catch (error) {
107
+ color = theme.palette.text.primary;
108
+ }
109
+ }
110
+ else {
111
+ color = theme.palette.text.primary;
112
+ }
113
+ // TODO: slice flipping
114
+ return (React.createElement(React.Fragment, null,
115
+ React.createElement(RulerLabel, { text: region.refName, view: model, maxWidthPx: widthPx, radians: centerRadians, radiusPx: radiusPx, color: color }),
116
+ React.createElement("path", { d: sliceArcPath(slice, radiusPx + 1, region.start, region.end), stroke: color, strokeWidth: 2, fill: "none" },
117
+ React.createElement("title", null, region.refName))));
118
+ });
119
+ const CircularRuler = observer(function Ruler({ model, slice }) {
120
+ if (slice.region.elided) {
121
+ return (React.createElement(ElisionRulerArc, { key: assembleLocString(slice.region.regions[0]), model: model, slice: slice }));
122
+ }
123
+ return (React.createElement(RegionRulerArc, { key: assembleLocString(slice.region), model: model, slice: slice }));
124
+ });
125
+ export default CircularRuler;
126
+ //# sourceMappingURL=Ruler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Ruler.js","sourceRoot":"","sources":["../../../src/CircularView/components/Ruler.js"],"names":[],"mappings":"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"}
@@ -0,0 +1,97 @@
1
+ import PluginManager from '@jbrowse/core/PluginManager';
2
+ import { SnapshotOrInstance, Instance } from 'mobx-state-tree';
3
+ import { Region } from '@jbrowse/core/util/types/mst';
4
+ import { AnyConfigurationModel } from '@jbrowse/core/configuration';
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: unknown;
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: unknown): 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,317 @@
1
+ import { cast, getParent, getRoot, resolveIdentifier, types, } from 'mobx-state-tree';
2
+ import { Region } from '@jbrowse/core/util/types/mst';
3
+ import { transaction } from 'mobx';
4
+ import { readConfObject, } from '@jbrowse/core/configuration';
5
+ import { getSession, clamp, isSessionModelWithWidgets, } from '@jbrowse/core/util';
6
+ import { BaseViewModel } from '@jbrowse/core/pluggableElementTypes/models';
7
+ import { calculateStaticSlices, sliceIsVisible } from './slices';
8
+ import { viewportVisibleSection } from './viewportVisibleRegion';
9
+ export default function CircularView(pluginManager) {
10
+ const minHeight = 40;
11
+ const minWidth = 100;
12
+ const defaultHeight = 400;
13
+ return types.compose(BaseViewModel, types
14
+ .model('CircularView', {
15
+ type: types.literal('CircularView'),
16
+ offsetRadians: -Math.PI / 2,
17
+ bpPerPx: 2000000,
18
+ tracks: types.array(pluginManager.pluggableMstType('track', 'stateModel')),
19
+ hideVerticalResizeHandle: false,
20
+ hideTrackSelectorButton: false,
21
+ lockedFitToWindow: true,
22
+ disableImportForm: false,
23
+ height: types.optional(types.refinement('trackHeight', types.number, n => n >= minHeight), defaultHeight),
24
+ minimumRadiusPx: 25,
25
+ spacingPx: 10,
26
+ paddingPx: 80,
27
+ lockedPaddingPx: 100,
28
+ minVisibleWidth: 6,
29
+ minimumBlockWidth: 20,
30
+ displayedRegions: types.array(Region),
31
+ scrollX: 0,
32
+ scrollY: 0,
33
+ trackSelectorType: 'hierarchical',
34
+ })
35
+ .volatile(() => ({
36
+ width: 0,
37
+ }))
38
+ .views(self => ({
39
+ get staticSlices() {
40
+ return calculateStaticSlices(self);
41
+ },
42
+ get visibleStaticSlices() {
43
+ return this.staticSlices.filter(sliceIsVisible.bind(this, self));
44
+ },
45
+ get visibleSection() {
46
+ return viewportVisibleSection([
47
+ self.scrollX,
48
+ self.scrollX + self.width,
49
+ self.scrollY,
50
+ self.scrollY + self.height,
51
+ ], this.centerXY, this.radiusPx);
52
+ },
53
+ get circumferencePx() {
54
+ let elidedBp = 0;
55
+ for (const r of this.elidedRegions) {
56
+ elidedBp += r.widthBp;
57
+ }
58
+ return (elidedBp / self.bpPerPx + self.spacingPx * this.elidedRegions.length);
59
+ },
60
+ get radiusPx() {
61
+ return this.circumferencePx / (2 * Math.PI);
62
+ },
63
+ get bpPerRadian() {
64
+ return self.bpPerPx * this.radiusPx;
65
+ },
66
+ get pxPerRadian() {
67
+ return this.radiusPx;
68
+ },
69
+ get centerXY() {
70
+ return [
71
+ this.radiusPx + self.paddingPx,
72
+ this.radiusPx + self.paddingPx,
73
+ ];
74
+ },
75
+ get totalBp() {
76
+ let total = 0;
77
+ for (const region of self.displayedRegions) {
78
+ total += region.end - region.start;
79
+ }
80
+ return total;
81
+ },
82
+ get maximumRadiusPx() {
83
+ return self.lockedFitToWindow
84
+ ? Math.min(self.width, self.height) / 2 - self.lockedPaddingPx
85
+ : 1000000;
86
+ },
87
+ get maxBpPerPx() {
88
+ const minCircumferencePx = 2 * Math.PI * self.minimumRadiusPx;
89
+ return this.totalBp / minCircumferencePx;
90
+ },
91
+ get minBpPerPx() {
92
+ // min depends on window dimensions, clamp between old min(0.01) and max
93
+ const maxCircumferencePx = 2 * Math.PI * this.maximumRadiusPx;
94
+ return clamp(this.totalBp / maxCircumferencePx, 0.0000000001, this.maxBpPerPx);
95
+ },
96
+ get atMaxBpPerPx() {
97
+ return self.bpPerPx >= this.maxBpPerPx;
98
+ },
99
+ get atMinBpPerPx() {
100
+ return self.bpPerPx <= this.minBpPerPx;
101
+ },
102
+ get tooSmallToLock() {
103
+ return this.minBpPerPx <= 0.0000000001;
104
+ },
105
+ get figureDimensions() {
106
+ return [
107
+ this.radiusPx * 2 + 2 * self.paddingPx,
108
+ this.radiusPx * 2 + 2 * self.paddingPx,
109
+ ];
110
+ },
111
+ get figureWidth() {
112
+ return this.figureDimensions[0];
113
+ },
114
+ get figureHeight() {
115
+ return this.figureDimensions[1];
116
+ },
117
+ // this is displayedRegions, post-processed to
118
+ // elide regions that are too small to see reasonably
119
+ get elidedRegions() {
120
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
121
+ const visible = [];
122
+ self.displayedRegions.forEach(region => {
123
+ const widthBp = region.end - region.start;
124
+ const widthPx = widthBp / self.bpPerPx;
125
+ if (widthPx < self.minVisibleWidth) {
126
+ // too small to see, collapse into a single elision region
127
+ const lastVisible = visible[visible.length - 1];
128
+ if (lastVisible && lastVisible.elided) {
129
+ lastVisible.regions.push({ ...region });
130
+ lastVisible.widthBp += widthBp;
131
+ }
132
+ else {
133
+ visible.push({
134
+ elided: true,
135
+ widthBp,
136
+ regions: [{ ...region }],
137
+ });
138
+ }
139
+ }
140
+ else {
141
+ // big enough to see, display it
142
+ visible.push({ ...region, widthBp });
143
+ }
144
+ });
145
+ // remove any single-region elisions
146
+ for (let i = 0; i < visible.length; i += 1) {
147
+ const v = visible[i];
148
+ if (v.elided && v.regions.length === 1) {
149
+ delete v.elided;
150
+ visible[i] = { ...v, ...v.regions[0] };
151
+ }
152
+ }
153
+ return visible;
154
+ },
155
+ get assemblyNames() {
156
+ const assemblyNames = [];
157
+ self.displayedRegions.forEach(displayedRegion => {
158
+ if (!assemblyNames.includes(displayedRegion.assemblyName)) {
159
+ assemblyNames.push(displayedRegion.assemblyName);
160
+ }
161
+ });
162
+ return assemblyNames;
163
+ },
164
+ get initialized() {
165
+ const { assemblyManager } = getSession(self);
166
+ return this.assemblyNames.every(a => { var _a; return (_a = assemblyManager.get(a)) === null || _a === void 0 ? void 0 : _a.initialized; });
167
+ },
168
+ }))
169
+ .volatile(() => ({
170
+ error: undefined,
171
+ }))
172
+ .actions(self => ({
173
+ // toggle action with a flag stating which mode it's in
174
+ setWidth(newWidth) {
175
+ self.width = Math.max(newWidth, minWidth);
176
+ return self.width;
177
+ },
178
+ setHeight(newHeight) {
179
+ self.height = Math.max(newHeight, minHeight);
180
+ return self.height;
181
+ },
182
+ resizeHeight(distance) {
183
+ const oldHeight = self.height;
184
+ const newHeight = this.setHeight(self.height + distance);
185
+ this.setModelViewWhenAdjust(!self.tooSmallToLock);
186
+ return newHeight - oldHeight;
187
+ },
188
+ resizeWidth(distance) {
189
+ const oldWidth = self.width;
190
+ const newWidth = this.setWidth(self.width + distance);
191
+ this.setModelViewWhenAdjust(!self.tooSmallToLock);
192
+ return newWidth - oldWidth;
193
+ },
194
+ rotateClockwiseButton() {
195
+ this.rotateClockwise(Math.PI / 6);
196
+ },
197
+ rotateCounterClockwiseButton() {
198
+ this.rotateCounterClockwise(Math.PI / 6);
199
+ },
200
+ rotateClockwise(distance = 0.17) {
201
+ self.offsetRadians += distance;
202
+ },
203
+ rotateCounterClockwise(distance = 0.17) {
204
+ self.offsetRadians -= distance;
205
+ },
206
+ zoomInButton() {
207
+ this.setBpPerPx(self.bpPerPx / 1.4);
208
+ },
209
+ zoomOutButton() {
210
+ this.setBpPerPx(self.bpPerPx * 1.4);
211
+ },
212
+ setBpPerPx(newVal) {
213
+ self.bpPerPx = clamp(newVal, self.minBpPerPx, self.maxBpPerPx);
214
+ },
215
+ setModelViewWhenAdjust(secondCondition) {
216
+ if (self.lockedFitToWindow && secondCondition) {
217
+ this.setBpPerPx(self.minBpPerPx);
218
+ }
219
+ },
220
+ closeView() {
221
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
222
+ getParent(self, 2).removeView(self);
223
+ },
224
+ setDisplayedRegions(regions) {
225
+ const previouslyEmpty = self.displayedRegions.length === 0;
226
+ self.displayedRegions = cast(regions);
227
+ if (previouslyEmpty) {
228
+ this.setBpPerPx(self.minBpPerPx);
229
+ }
230
+ else {
231
+ this.setBpPerPx(self.bpPerPx);
232
+ }
233
+ },
234
+ activateTrackSelector() {
235
+ if (self.trackSelectorType === 'hierarchical') {
236
+ const session = getSession(self);
237
+ if (isSessionModelWithWidgets(session)) {
238
+ const selector = session.addWidget('HierarchicalTrackSelectorWidget', 'hierarchicalTrackSelector', { view: self });
239
+ session.showWidget(selector);
240
+ return selector;
241
+ }
242
+ }
243
+ throw new Error(`invalid track selector type ${self.trackSelectorType}`);
244
+ },
245
+ toggleTrack(trackId) {
246
+ // if we have any tracks with that configuration, turn them off
247
+ const hiddenCount = this.hideTrack(trackId);
248
+ // if none had that configuration, turn one on
249
+ if (!hiddenCount) {
250
+ this.showTrack(trackId);
251
+ }
252
+ },
253
+ setError(error) {
254
+ console.error(error);
255
+ self.error = error;
256
+ },
257
+ showTrack(trackId, initialSnapshot = {}) {
258
+ const schema = pluginManager.pluggableConfigSchemaType('track');
259
+ const conf = resolveIdentifier(schema, getRoot(self), trackId);
260
+ const trackType = pluginManager.getTrackType(conf.type);
261
+ if (!trackType) {
262
+ throw new Error(`unknown track type ${conf.type}`);
263
+ }
264
+ const viewType = pluginManager.getViewType(self.type);
265
+ const supportedDisplays = viewType.displayTypes.map(d => d.name);
266
+ const displayConf = conf.displays.find((d) => supportedDisplays.includes(d.type));
267
+ const track = trackType.stateModel.create({
268
+ ...initialSnapshot,
269
+ type: conf.type,
270
+ configuration: conf,
271
+ displays: [{ type: displayConf.type, configuration: displayConf }],
272
+ });
273
+ self.tracks.push(track);
274
+ },
275
+ addTrackConf(configuration, initialSnapshot = {}) {
276
+ const { type } = configuration;
277
+ const name = readConfObject(configuration, 'name');
278
+ const trackType = pluginManager.getTrackType(type);
279
+ if (!trackType) {
280
+ throw new Error(`unknown track type ${configuration.type}`);
281
+ }
282
+ const viewType = pluginManager.getViewType(self.type);
283
+ const supportedDisplays = viewType.displayTypes.map(d => d.name);
284
+ const displayConf = configuration.displays.find((d) => supportedDisplays.includes(d.type));
285
+ const track = trackType.stateModel.create({
286
+ ...initialSnapshot,
287
+ name,
288
+ type,
289
+ configuration,
290
+ displays: [{ type: displayConf.type, configuration: displayConf }],
291
+ });
292
+ self.tracks.push(track);
293
+ },
294
+ hideTrack(trackId) {
295
+ const schema = pluginManager.pluggableConfigSchemaType('track');
296
+ const conf = resolveIdentifier(schema, getRoot(self), trackId);
297
+ const t = self.tracks.filter(t => t.configuration === conf);
298
+ transaction(() => t.forEach(t => self.tracks.remove(t)));
299
+ return t.length;
300
+ },
301
+ toggleFitToWindowLock() {
302
+ self.lockedFitToWindow = !self.lockedFitToWindow;
303
+ // when going unlocked -> locked and circle is cut off, set to the locked minBpPerPx
304
+ this.setModelViewWhenAdjust(self.atMinBpPerPx);
305
+ return self.lockedFitToWindow;
306
+ },
307
+ })));
308
+ }
309
+ /*
310
+ PLANS
311
+
312
+ - tracks
313
+ - ruler tick marks
314
+ - set viewport scroll from state snapshot
315
+
316
+ */
317
+ //# sourceMappingURL=CircularView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CircularView.js","sourceRoot":"","sources":["../../../src/CircularView/models/CircularView.ts"],"names":[],"mappings":"AACA,OAAO,EACL,IAAI,EACJ,SAAS,EACT,OAAO,EACP,iBAAiB,EACjB,KAAK,GAGN,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAA;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,MAAM,CAAA;AAClC,OAAO,EAEL,cAAc,GACf,MAAM,6BAA6B,CAAA;AAEpC,OAAO,EACL,UAAU,EACV,KAAK,EACL,yBAAyB,GAC1B,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAE,aAAa,EAAE,MAAM,4CAA4C,CAAA;AAC1E,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAEhE,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAA;AAEhE,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,aAA4B;IAC/D,MAAM,SAAS,GAAG,EAAE,CAAA;IACpB,MAAM,QAAQ,GAAG,GAAG,CAAA;IACpB,MAAM,aAAa,GAAG,GAAG,CAAA;IACzB,OAAO,KAAK,CAAC,OAAO,CAClB,aAAa,EACb,KAAK;SACF,KAAK,CAAC,cAAc,EAAE;QACrB,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC;QACnC,aAAa,EAAE,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC;QAC3B,OAAO,EAAE,OAAO;QAChB,MAAM,EAAE,KAAK,CAAC,KAAK,CACjB,aAAa,CAAC,gBAAgB,CAAC,OAAO,EAAE,YAAY,CAAC,CACtD;QAED,wBAAwB,EAAE,KAAK;QAC/B,uBAAuB,EAAE,KAAK;QAC9B,iBAAiB,EAAE,IAAI;QACvB,iBAAiB,EAAE,KAAK;QAExB,MAAM,EAAE,KAAK,CAAC,QAAQ,CACpB,KAAK,CAAC,UAAU,CAAC,aAAa,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,SAAS,CAAC,EAClE,aAAa,CACd;QACD,eAAe,EAAE,EAAE;QACnB,SAAS,EAAE,EAAE;QACb,SAAS,EAAE,EAAE;QACb,eAAe,EAAE,GAAG;QACpB,eAAe,EAAE,CAAC;QAClB,iBAAiB,EAAE,EAAE;QACrB,gBAAgB,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC;QACrC,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,CAAC;QACV,iBAAiB,EAAE,cAAc;KAClC,CAAC;SACD,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC;QACf,KAAK,EAAE,CAAC;KACT,CAAC,CAAC;SACF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,YAAY;YACd,OAAO,qBAAqB,CAAC,IAAI,CAAC,CAAA;QACpC,CAAC;QACD,IAAI,mBAAmB;YACrB,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAA;QAClE,CAAC;QACD,IAAI,cAAc;YAChB,OAAO,sBAAsB,CAC3B;gBACE,IAAI,CAAC,OAAO;gBACZ,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK;gBACzB,IAAI,CAAC,OAAO;gBACZ,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM;aAC3B,EACD,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,QAAQ,CACd,CAAA;QACH,CAAC;QACD,IAAI,eAAe;YACjB,IAAI,QAAQ,GAAG,CAAC,CAAA;YAChB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE;gBAClC,QAAQ,IAAI,CAAC,CAAC,OAAO,CAAA;aACtB;YACD,OAAO,CACL,QAAQ,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CACrE,CAAA;QACH,CAAC;QACD,IAAI,QAAQ;YACV,OAAO,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAA;QAC7C,CAAC;QACD,IAAI,WAAW;YACb,OAAO,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAA;QACrC,CAAC;QACD,IAAI,WAAW;YACb,OAAO,IAAI,CAAC,QAAQ,CAAA;QACtB,CAAC;QACD,IAAI,QAAQ;YACV,OAAO;gBACL,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,SAAS;gBAC9B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,SAAS;aAC/B,CAAA;QACH,CAAC;QACD,IAAI,OAAO;YACT,IAAI,KAAK,GAAG,CAAC,CAAA;YACb,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,gBAAgB,EAAE;gBAC1C,KAAK,IAAI,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,KAAK,CAAA;aACnC;YACD,OAAO,KAAK,CAAA;QACd,CAAC;QACD,IAAI,eAAe;YACjB,OAAO,IAAI,CAAC,iBAAiB;gBAC3B,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,eAAe;gBAC9D,CAAC,CAAC,OAAO,CAAA;QACb,CAAC;QACD,IAAI,UAAU;YACZ,MAAM,kBAAkB,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,eAAe,CAAA;YAC7D,OAAO,IAAI,CAAC,OAAO,GAAG,kBAAkB,CAAA;QAC1C,CAAC;QACD,IAAI,UAAU;YACZ,wEAAwE;YACxE,MAAM,kBAAkB,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,eAAe,CAAA;YAC7D,OAAO,KAAK,CACV,IAAI,CAAC,OAAO,GAAG,kBAAkB,EACjC,YAAY,EACZ,IAAI,CAAC,UAAU,CAChB,CAAA;QACH,CAAC;QACD,IAAI,YAAY;YACd,OAAO,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,UAAU,CAAA;QACxC,CAAC;QACD,IAAI,YAAY;YACd,OAAO,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,UAAU,CAAA;QACxC,CAAC;QACD,IAAI,cAAc;YAChB,OAAO,IAAI,CAAC,UAAU,IAAI,YAAY,CAAA;QACxC,CAAC;QACD,IAAI,gBAAgB;YAClB,OAAO;gBACL,IAAI,CAAC,QAAQ,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS;gBACtC,IAAI,CAAC,QAAQ,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS;aACvC,CAAA;QACH,CAAC;QACD,IAAI,WAAW;YACb,OAAO,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAA;QACjC,CAAC;QACD,IAAI,YAAY;YACd,OAAO,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAA;QACjC,CAAC;QACD,8CAA8C;QAC9C,qDAAqD;QACrD,IAAI,aAAa;YACf,8DAA8D;YAC9D,MAAM,OAAO,GAAU,EAAE,CAAA;YACzB,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;gBACrC,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,KAAK,CAAA;gBACzC,MAAM,OAAO,GAAG,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;gBACtC,IAAI,OAAO,GAAG,IAAI,CAAC,eAAe,EAAE;oBAClC,0DAA0D;oBAC1D,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;oBAC/C,IAAI,WAAW,IAAI,WAAW,CAAC,MAAM,EAAE;wBACrC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC,CAAA;wBACvC,WAAW,CAAC,OAAO,IAAI,OAAO,CAAA;qBAC/B;yBAAM;wBACL,OAAO,CAAC,IAAI,CAAC;4BACX,MAAM,EAAE,IAAI;4BACZ,OAAO;4BACP,OAAO,EAAE,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC;yBACzB,CAAC,CAAA;qBACH;iBACF;qBAAM;oBACL,gCAAgC;oBAChC,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,CAAC,CAAA;iBACrC;YACH,CAAC,CAAC,CAAA;YAEF,oCAAoC;YACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE;gBAC1C,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;gBACpB,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;oBACtC,OAAO,CAAC,CAAC,MAAM,CAAA;oBACf,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAA;iBACvC;aACF;YACD,OAAO,OAAO,CAAA;QAChB,CAAC;QAED,IAAI,aAAa;YACf,MAAM,aAAa,GAAa,EAAE,CAAA;YAClC,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE;gBAC9C,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,eAAe,CAAC,YAAY,CAAC,EAAE;oBACzD,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,CAAA;iBACjD;YACH,CAAC,CAAC,CAAA;YACF,OAAO,aAAa,CAAA;QACtB,CAAC;QACD,IAAI,WAAW;YACb,MAAM,EAAE,eAAe,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,CAAA;YAC5C,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,CAC7B,CAAC,CAAC,EAAE,WAAC,OAAA,MAAA,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,0CAAE,WAAW,CAAA,EAAA,CACzC,CAAA;QACH,CAAC;KACF,CAAC,CAAC;SACF,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC;QACf,KAAK,EAAE,SAAoB;KAC5B,CAAC,CAAC;SACF,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChB,uDAAuD;QACvD,QAAQ,CAAC,QAAgB;YACvB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;YACzC,OAAO,IAAI,CAAC,KAAK,CAAA;QACnB,CAAC;QACD,SAAS,CAAC,SAAiB;YACzB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;YAC5C,OAAO,IAAI,CAAC,MAAM,CAAA;QACpB,CAAC;QACD,YAAY,CAAC,QAAgB;YAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAA;YAC7B,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,CAAA;YACxD,IAAI,CAAC,sBAAsB,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;YACjD,OAAO,SAAS,GAAG,SAAS,CAAA;QAC9B,CAAC;QACD,WAAW,CAAC,QAAgB;YAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAA;YAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,CAAA;YACrD,IAAI,CAAC,sBAAsB,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;YACjD,OAAO,QAAQ,GAAG,QAAQ,CAAA;QAC5B,CAAC;QACD,qBAAqB;YACnB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;QACnC,CAAC;QAED,4BAA4B;YAC1B,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;QAC1C,CAAC;QAED,eAAe,CAAC,QAAQ,GAAG,IAAI;YAC7B,IAAI,CAAC,aAAa,IAAI,QAAQ,CAAA;QAChC,CAAC;QAED,sBAAsB,CAAC,QAAQ,GAAG,IAAI;YACpC,IAAI,CAAC,aAAa,IAAI,QAAQ,CAAA;QAChC,CAAC;QAED,YAAY;YACV,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,CAAA;QACrC,CAAC;QAED,aAAa;YACX,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,CAAA;QACrC,CAAC;QAED,UAAU,CAAC,MAAc;YACvB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAA;QAChE,CAAC;QAED,sBAAsB,CAAC,eAAwB;YAC7C,IAAI,IAAI,CAAC,iBAAiB,IAAI,eAAe,EAAE;gBAC7C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;aACjC;QACH,CAAC;QAED,SAAS;YACP,8DAA8D;YAC9D,SAAS,CAAM,IAAI,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;QAC1C,CAAC;QAED,mBAAmB,CAAC,OAA4C;YAC9D,MAAM,eAAe,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,KAAK,CAAC,CAAA;YAC1D,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC,CAAA;YAErC,IAAI,eAAe,EAAE;gBACnB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;aACjC;iBAAM;gBACL,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;aAC9B;QACH,CAAC;QAED,qBAAqB;YACnB,IAAI,IAAI,CAAC,iBAAiB,KAAK,cAAc,EAAE;gBAC7C,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,CAAA;gBAChC,IAAI,yBAAyB,CAAC,OAAO,CAAC,EAAE;oBACtC,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,CAChC,iCAAiC,EACjC,2BAA2B,EAC3B,EAAE,IAAI,EAAE,IAAI,EAAE,CACf,CAAA;oBACD,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAA;oBAC5B,OAAO,QAAQ,CAAA;iBAChB;aACF;YACD,MAAM,IAAI,KAAK,CACb,+BAA+B,IAAI,CAAC,iBAAiB,EAAE,CACxD,CAAA;QACH,CAAC;QAED,WAAW,CAAC,OAAe;YACzB,+DAA+D;YAC/D,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;YAC3C,8CAA8C;YAC9C,IAAI,CAAC,WAAW,EAAE;gBAChB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;aACxB;QACH,CAAC;QAED,QAAQ,CAAC,KAAc;YACrB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;YACpB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QACpB,CAAC;QAED,SAAS,CAAC,OAAe,EAAE,eAAe,GAAG,EAAE;YAC7C,MAAM,MAAM,GAAG,aAAa,CAAC,yBAAyB,CAAC,OAAO,CAAC,CAAA;YAC/D,MAAM,IAAI,GAAG,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAA;YAC9D,MAAM,SAAS,GAAG,aAAa,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACvD,IAAI,CAAC,SAAS,EAAE;gBACd,MAAM,IAAI,KAAK,CAAC,sBAAsB,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;aACnD;YACD,MAAM,QAAQ,GAAG,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACrD,MAAM,iBAAiB,GAAG,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;YAChE,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAwB,EAAE,EAAE,CAClE,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CACnC,CAAA;YACD,MAAM,KAAK,GAAG,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC;gBACxC,GAAG,eAAe;gBAClB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,aAAa,EAAE,IAAI;gBACnB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,CAAC;aACnE,CAAC,CAAA;YACF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACzB,CAAC;QAED,YAAY,CACV,aAAoC,EACpC,eAAe,GAAG,EAAE;YAEpB,MAAM,EAAE,IAAI,EAAE,GAAG,aAAa,CAAA;YAC9B,MAAM,IAAI,GAAG,cAAc,CAAC,aAAa,EAAE,MAAM,CAAC,CAAA;YAClD,MAAM,SAAS,GAAG,aAAa,CAAC,YAAY,CAAC,IAAI,CAAC,CAAA;YAClD,IAAI,CAAC,SAAS,EAAE;gBACd,MAAM,IAAI,KAAK,CAAC,sBAAsB,aAAa,CAAC,IAAI,EAAE,CAAC,CAAA;aAC5D;YACD,MAAM,QAAQ,GAAG,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACrD,MAAM,iBAAiB,GAAG,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;YAChE,MAAM,WAAW,GAAG,aAAa,CAAC,QAAQ,CAAC,IAAI,CAC7C,CAAC,CAAwB,EAAE,EAAE,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CACjE,CAAA;YACD,MAAM,KAAK,GAAG,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC;gBACxC,GAAG,eAAe;gBAClB,IAAI;gBACJ,IAAI;gBACJ,aAAa;gBACb,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,CAAC;aACnE,CAAC,CAAA;YACF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACzB,CAAC;QAED,SAAS,CAAC,OAAe;YACvB,MAAM,MAAM,GAAG,aAAa,CAAC,yBAAyB,CAAC,OAAO,CAAC,CAAA;YAC/D,MAAM,IAAI,GAAG,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAA;YAC9D,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,KAAK,IAAI,CAAC,CAAA;YAC3D,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;YACxD,OAAO,CAAC,CAAC,MAAM,CAAA;QACjB,CAAC;QAED,qBAAqB;YACnB,IAAI,CAAC,iBAAiB,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAA;YAChD,oFAAoF;YACpF,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;YAC9C,OAAO,IAAI,CAAC,iBAAiB,CAAA;QAC/B,CAAC;KACF,CAAC,CAAC,CACN,CAAA;AACH,CAAC;AAKD;;;;;;;EAOE"}
@@ -0,0 +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 };
@@ -0,0 +1,53 @@
1
+ import { polarToCartesian, assembleLocString } from '@jbrowse/core/util';
2
+ import { thetaRangesOverlap } from './viewportVisibleRegion';
3
+ export class Slice {
4
+ constructor(view, region, currentRadianOffset, radianWidth) {
5
+ this.region = region;
6
+ this.radianWidth = radianWidth;
7
+ const { bpPerRadian } = view;
8
+ this.key = assembleLocString(region);
9
+ this.offsetRadians = currentRadianOffset;
10
+ this.bpPerRadian = bpPerRadian;
11
+ this.flipped = false;
12
+ this.startRadians = this.offsetRadians;
13
+ this.endRadians = region.widthBp / this.bpPerRadian + this.offsetRadians;
14
+ Object.freeze(this);
15
+ }
16
+ bpToXY(bp, radiusPx) {
17
+ let offsetBp;
18
+ if (this.region.elided) {
19
+ offsetBp = this.region.widthBp / 2;
20
+ }
21
+ else if (this.flipped) {
22
+ offsetBp = this.region.end - bp;
23
+ }
24
+ else {
25
+ offsetBp = bp - this.region.start;
26
+ }
27
+ const totalRadians = offsetBp / this.bpPerRadian + this.offsetRadians;
28
+ return polarToCartesian(radiusPx, totalRadians);
29
+ }
30
+ toJSON() {
31
+ return Object.fromEntries(Object.entries(this));
32
+ }
33
+ }
34
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
35
+ function calculateStaticSlices(self) {
36
+ const slices = [];
37
+ let currentRadianOffset = 0;
38
+ for (const region of self.elidedRegions) {
39
+ const radianWidth = region.widthBp / self.bpPerRadian + self.spacingPx / self.pxPerRadian;
40
+ slices.push(new Slice(self, region, currentRadianOffset, radianWidth));
41
+ currentRadianOffset += radianWidth;
42
+ }
43
+ return slices;
44
+ }
45
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
46
+ function sliceIsVisible(self, slice) {
47
+ const {
48
+ // rho: visibleRhoRange,
49
+ theta: [visibleThetaMin, visibleThetaMax], } = self.visibleSection;
50
+ return thetaRangesOverlap(slice.offsetRadians + self.offsetRadians, slice.radianWidth, visibleThetaMin, visibleThetaMax - visibleThetaMin);
51
+ }
52
+ export { calculateStaticSlices, sliceIsVisible };
53
+ //# sourceMappingURL=slices.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slices.js","sourceRoot":"","sources":["../../../src/CircularView/models/slices.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAU,MAAM,oBAAoB,CAAA;AAChF,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAE5D,MAAM,OAAO,KAAK;IAahB,YACE,IAA6B,EACtB,MAAqD,EAC5D,mBAA2B,EACpB,WAAmB;QAFnB,WAAM,GAAN,MAAM,CAA+C;QAErD,gBAAW,GAAX,WAAW,CAAQ;QAE1B,MAAM,EAAE,WAAW,EAAE,GAAG,IAAI,CAAA;QAC5B,IAAI,CAAC,GAAG,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAA;QACpC,IAAI,CAAC,aAAa,GAAG,mBAAmB,CAAA;QACxC,IAAI,CAAC,WAAW,GAAG,WAAW,CAAA;QAC9B,IAAI,CAAC,OAAO,GAAG,KAAK,CAAA;QAEpB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,aAAa,CAAA;QACtC,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,aAAa,CAAA;QACxE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IACrB,CAAC;IAED,MAAM,CAAC,EAAU,EAAE,QAAgB;QACjC,IAAI,QAAQ,CAAA;QACZ,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;YACtB,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,CAAC,CAAA;SACnC;aAAM,IAAI,IAAI,CAAC,OAAO,EAAE;YACvB,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,GAAG,EAAE,CAAA;SAChC;aAAM;YACL,QAAQ,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAA;SAClC;QACD,MAAM,YAAY,GAAG,QAAQ,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,aAAa,CAAA;QACrE,OAAO,gBAAgB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAA;IACjD,CAAC;IAED,MAAM;QACJ,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;IACjD,CAAC;CACF;AAED,8DAA8D;AAC9D,SAAS,qBAAqB,CAAC,IAAS;IACtC,MAAM,MAAM,GAAG,EAAE,CAAA;IACjB,IAAI,mBAAmB,GAAG,CAAC,CAAA;IAC3B,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,aAAa,EAAE;QACvC,MAAM,WAAW,GACf,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,WAAW,CAAA;QACvE,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,mBAAmB,EAAE,WAAW,CAAC,CAAC,CAAA;QACtE,mBAAmB,IAAI,WAAW,CAAA;KACnC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED,8DAA8D;AAC9D,SAAS,cAAc,CAAC,IAAS,EAAE,KAAY;IAC7C,MAAM;IACJ,wBAAwB;IACxB,KAAK,EAAE,CAAC,eAAe,EAAE,eAAe,CAAC,GAC1C,GAAG,IAAI,CAAC,cAAc,CAAA;IAEvB,OAAO,kBAAkB,CACvB,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,EACxC,KAAK,CAAC,WAAW,EACjB,eAAe,EACf,eAAe,GAAG,eAAe,CAClC,CAAA;AACH,CAAC;AAED,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,CAAA"}