@jbrowse/plugin-circular-view 1.6.8 → 1.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/BaseChordDisplay/components/BaseChordDisplay.d.ts +9 -9
- package/dist/BaseChordDisplay/components/BaseChordDisplay.js +53 -0
- package/dist/BaseChordDisplay/components/DisplayError.d.ts +4 -4
- package/dist/BaseChordDisplay/components/DisplayError.js +70 -0
- package/dist/BaseChordDisplay/components/Loading.d.ts +10 -10
- package/dist/BaseChordDisplay/components/Loading.js +122 -0
- package/dist/BaseChordDisplay/components/RpcRenderedSvgGroup.d.ts +4 -4
- package/dist/BaseChordDisplay/components/RpcRenderedSvgGroup.js +96 -0
- package/dist/BaseChordDisplay/index.d.ts +3 -3
- package/dist/BaseChordDisplay/index.js +31 -0
- package/dist/BaseChordDisplay/models/BaseChordDisplayModel.d.ts +99 -99
- package/dist/BaseChordDisplay/models/BaseChordDisplayModel.js +261 -0
- package/dist/BaseChordDisplay/models/baseChordDisplayConfig.d.ts +2 -2
- package/dist/BaseChordDisplay/models/baseChordDisplayConfig.js +20 -0
- package/dist/BaseChordDisplay/models/renderReaction.d.ts +30 -30
- package/dist/BaseChordDisplay/models/renderReaction.js +142 -0
- package/dist/CircularView/components/CircularView.d.ts +4 -4
- package/dist/CircularView/components/CircularView.js +203 -0
- package/dist/CircularView/components/ImportForm.d.ts +5 -5
- package/dist/CircularView/components/ImportForm.js +97 -0
- package/dist/CircularView/components/Ruler.d.ts +5 -5
- package/dist/CircularView/components/Ruler.js +205 -0
- package/dist/CircularView/models/CircularView.d.ts +97 -97
- package/dist/CircularView/models/CircularView.js +422 -0
- package/dist/CircularView/models/slices.d.ts +27 -27
- package/dist/CircularView/models/slices.js +111 -0
- package/dist/CircularView/models/slices.test.js +83 -0
- package/dist/CircularView/models/viewportVisibleRegion.d.ts +6 -6
- package/dist/CircularView/models/viewportVisibleRegion.js +280 -0
- package/dist/CircularView/models/viewportVisibleRegion.test.js +130 -0
- package/dist/index.d.ts +8 -8
- package/dist/index.js +180 -6
- package/package.json +5 -7
- package/dist/CircularView/models/slices.test.d.ts +0 -1
- package/dist/CircularView/models/viewportVisibleRegion.test.d.ts +0 -1
- package/dist/plugin-circular-view.cjs.development.js +0 -3013
- package/dist/plugin-circular-view.cjs.development.js.map +0 -1
- package/dist/plugin-circular-view.cjs.production.min.js +0 -2
- package/dist/plugin-circular-view.cjs.production.min.js.map +0 -1
- package/dist/plugin-circular-view.esm.js +0 -3004
- package/dist/plugin-circular-view.esm.js.map +0 -1
|
@@ -0,0 +1,203 @@
|
|
|
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"] = void 0;
|
|
9
|
+
|
|
10
|
+
var _react = _interopRequireDefault(require("react"));
|
|
11
|
+
|
|
12
|
+
var _mobxReact = require("mobx-react");
|
|
13
|
+
|
|
14
|
+
var _ui = require("@jbrowse/core/ui");
|
|
15
|
+
|
|
16
|
+
var _util = require("@jbrowse/core/util");
|
|
17
|
+
|
|
18
|
+
var _core = require("@material-ui/core");
|
|
19
|
+
|
|
20
|
+
var _colors = require("@material-ui/core/colors");
|
|
21
|
+
|
|
22
|
+
var _ZoomOut = _interopRequireDefault(require("@material-ui/icons/ZoomOut"));
|
|
23
|
+
|
|
24
|
+
var _ZoomIn = _interopRequireDefault(require("@material-ui/icons/ZoomIn"));
|
|
25
|
+
|
|
26
|
+
var _RotateLeft = _interopRequireDefault(require("@material-ui/icons/RotateLeft"));
|
|
27
|
+
|
|
28
|
+
var _RotateRight = _interopRequireDefault(require("@material-ui/icons/RotateRight"));
|
|
29
|
+
|
|
30
|
+
var _LockOutlined = _interopRequireDefault(require("@material-ui/icons/LockOutlined"));
|
|
31
|
+
|
|
32
|
+
var _LockOpen = _interopRequireDefault(require("@material-ui/icons/LockOpen"));
|
|
33
|
+
|
|
34
|
+
var _Icons = require("@jbrowse/core/ui/Icons");
|
|
35
|
+
|
|
36
|
+
var _Ruler = _interopRequireDefault(require("./Ruler"));
|
|
37
|
+
|
|
38
|
+
var _ImportForm = _interopRequireDefault(require("./ImportForm"));
|
|
39
|
+
|
|
40
|
+
// icons
|
|
41
|
+
// locals
|
|
42
|
+
var dragHandleHeight = 3;
|
|
43
|
+
var useStyles = (0, _core.makeStyles)(function (theme) {
|
|
44
|
+
return {
|
|
45
|
+
root: {
|
|
46
|
+
position: 'relative',
|
|
47
|
+
marginBottom: theme.spacing(1),
|
|
48
|
+
overflow: 'hidden',
|
|
49
|
+
background: 'white'
|
|
50
|
+
},
|
|
51
|
+
scroller: {
|
|
52
|
+
overflow: 'auto'
|
|
53
|
+
},
|
|
54
|
+
sliceRoot: {
|
|
55
|
+
background: 'none',
|
|
56
|
+
// background: theme.palette.background.paper,
|
|
57
|
+
boxSizing: 'content-box',
|
|
58
|
+
display: 'block'
|
|
59
|
+
},
|
|
60
|
+
iconButton: {
|
|
61
|
+
padding: '4px',
|
|
62
|
+
margin: '0 2px 0 2px'
|
|
63
|
+
},
|
|
64
|
+
controls: {
|
|
65
|
+
overflow: 'hidden',
|
|
66
|
+
whiteSpace: 'nowrap',
|
|
67
|
+
position: 'absolute',
|
|
68
|
+
background: _colors.grey[200],
|
|
69
|
+
boxSizing: 'border-box',
|
|
70
|
+
borderRight: '1px solid #a2a2a2',
|
|
71
|
+
borderBottom: '1px solid #a2a2a2',
|
|
72
|
+
left: 0,
|
|
73
|
+
top: 0
|
|
74
|
+
},
|
|
75
|
+
importFormContainer: {
|
|
76
|
+
marginBottom: theme.spacing(4)
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
});
|
|
80
|
+
var Slices = (0, _mobxReact.observer)(function (_ref) {
|
|
81
|
+
var model = _ref.model;
|
|
82
|
+
return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, model.staticSlices.map(function (slice) {
|
|
83
|
+
return /*#__PURE__*/_react["default"].createElement(_Ruler["default"], {
|
|
84
|
+
key: (0, _util.assembleLocString)(slice.region.elided ? slice.region.regions[0] : slice.region),
|
|
85
|
+
model: model,
|
|
86
|
+
slice: slice
|
|
87
|
+
});
|
|
88
|
+
}), model.tracks.map(function (track) {
|
|
89
|
+
var display = track.displays[0];
|
|
90
|
+
return /*#__PURE__*/_react["default"].createElement(display.RenderingComponent, {
|
|
91
|
+
key: display.id,
|
|
92
|
+
display: display,
|
|
93
|
+
view: model
|
|
94
|
+
});
|
|
95
|
+
}));
|
|
96
|
+
});
|
|
97
|
+
var Controls = (0, _mobxReact.observer)(function (_ref2) {
|
|
98
|
+
var model = _ref2.model,
|
|
99
|
+
showingFigure = _ref2.showingFigure;
|
|
100
|
+
var classes = useStyles();
|
|
101
|
+
return /*#__PURE__*/_react["default"].createElement("div", {
|
|
102
|
+
className: classes.controls
|
|
103
|
+
}, /*#__PURE__*/_react["default"].createElement(_core.IconButton, {
|
|
104
|
+
onClick: model.zoomOutButton,
|
|
105
|
+
className: classes.iconButton,
|
|
106
|
+
title: model.lockedFitToWindow ? 'unlock to zoom out' : 'zoom out',
|
|
107
|
+
disabled: !showingFigure || model.atMaxBpPerPx || model.lockedFitToWindow,
|
|
108
|
+
color: "secondary"
|
|
109
|
+
}, /*#__PURE__*/_react["default"].createElement(_ZoomOut["default"], null)), /*#__PURE__*/_react["default"].createElement(_core.IconButton, {
|
|
110
|
+
onClick: model.zoomInButton,
|
|
111
|
+
className: classes.iconButton,
|
|
112
|
+
title: "zoom in",
|
|
113
|
+
disabled: !showingFigure || model.atMinBpPerPx,
|
|
114
|
+
color: "secondary"
|
|
115
|
+
}, /*#__PURE__*/_react["default"].createElement(_ZoomIn["default"], null)), /*#__PURE__*/_react["default"].createElement(_core.IconButton, {
|
|
116
|
+
onClick: model.rotateCounterClockwiseButton,
|
|
117
|
+
className: classes.iconButton,
|
|
118
|
+
title: "rotate counter-clockwise",
|
|
119
|
+
disabled: !showingFigure,
|
|
120
|
+
color: "secondary"
|
|
121
|
+
}, /*#__PURE__*/_react["default"].createElement(_RotateLeft["default"], null)), /*#__PURE__*/_react["default"].createElement(_core.IconButton, {
|
|
122
|
+
onClick: model.rotateClockwiseButton,
|
|
123
|
+
className: classes.iconButton,
|
|
124
|
+
title: "rotate clockwise",
|
|
125
|
+
disabled: !showingFigure,
|
|
126
|
+
color: "secondary"
|
|
127
|
+
}, /*#__PURE__*/_react["default"].createElement(_RotateRight["default"], null)), /*#__PURE__*/_react["default"].createElement(_core.IconButton, {
|
|
128
|
+
onClick: model.toggleFitToWindowLock,
|
|
129
|
+
className: classes.iconButton,
|
|
130
|
+
title: model.lockedFitToWindow ? 'locked model to window size' : 'unlocked model to zoom further',
|
|
131
|
+
disabled: model.tooSmallToLock,
|
|
132
|
+
color: "secondary"
|
|
133
|
+
}, model.lockedFitToWindow ? /*#__PURE__*/_react["default"].createElement(_LockOutlined["default"], null) : /*#__PURE__*/_react["default"].createElement(_LockOpen["default"], null)), model.hideTrackSelectorButton ? null : /*#__PURE__*/_react["default"].createElement(_core.IconButton, {
|
|
134
|
+
onClick: model.activateTrackSelector,
|
|
135
|
+
title: "Open track selector",
|
|
136
|
+
"data-testid": "circular_track_select",
|
|
137
|
+
color: "secondary"
|
|
138
|
+
}, /*#__PURE__*/_react["default"].createElement(_Icons.TrackSelector, null)));
|
|
139
|
+
});
|
|
140
|
+
var CircularView = (0, _mobxReact.observer)(function (_ref3) {
|
|
141
|
+
var model = _ref3.model;
|
|
142
|
+
var classes = useStyles();
|
|
143
|
+
var initialized = !!model.displayedRegions.length && model.figureWidth && model.figureHeight;
|
|
144
|
+
var showImportForm = !initialized && !model.disableImportForm;
|
|
145
|
+
var showFigure = initialized && !showImportForm;
|
|
146
|
+
return /*#__PURE__*/_react["default"].createElement("div", {
|
|
147
|
+
className: classes.root,
|
|
148
|
+
style: {
|
|
149
|
+
width: model.width,
|
|
150
|
+
height: model.height
|
|
151
|
+
},
|
|
152
|
+
"data-testid": model.id
|
|
153
|
+
}, model.error ? /*#__PURE__*/_react["default"].createElement(_ui.ErrorMessage, {
|
|
154
|
+
error: model.error
|
|
155
|
+
}) : /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, showImportForm ? /*#__PURE__*/_react["default"].createElement(_ImportForm["default"], {
|
|
156
|
+
model: model
|
|
157
|
+
}) : null, /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, !showFigure ? null : /*#__PURE__*/_react["default"].createElement("div", {
|
|
158
|
+
className: classes.scroller,
|
|
159
|
+
style: {
|
|
160
|
+
width: model.width,
|
|
161
|
+
height: model.height
|
|
162
|
+
}
|
|
163
|
+
}, /*#__PURE__*/_react["default"].createElement("div", {
|
|
164
|
+
className: classes.rotator,
|
|
165
|
+
style: {
|
|
166
|
+
transform: ["rotate(".concat(model.offsetRadians, "rad)")].join(' '),
|
|
167
|
+
transition: 'transform 0.5s',
|
|
168
|
+
transformOrigin: model.centerXY.map(function (x) {
|
|
169
|
+
return "".concat(x, "px");
|
|
170
|
+
}).join(' ')
|
|
171
|
+
}
|
|
172
|
+
}, /*#__PURE__*/_react["default"].createElement("svg", {
|
|
173
|
+
style: {
|
|
174
|
+
position: 'absolute',
|
|
175
|
+
left: 0,
|
|
176
|
+
top: 0
|
|
177
|
+
},
|
|
178
|
+
className: classes.sliceRoot,
|
|
179
|
+
width: "".concat(model.figureWidth, "px"),
|
|
180
|
+
height: "".concat(model.figureHeight, "px"),
|
|
181
|
+
version: "1.1"
|
|
182
|
+
}, /*#__PURE__*/_react["default"].createElement("g", {
|
|
183
|
+
transform: "translate(".concat(model.centerXY, ")")
|
|
184
|
+
}, /*#__PURE__*/_react["default"].createElement(Slices, {
|
|
185
|
+
model: model
|
|
186
|
+
}))))), /*#__PURE__*/_react["default"].createElement(Controls, {
|
|
187
|
+
model: model,
|
|
188
|
+
showingFigure: showFigure
|
|
189
|
+
}), model.hideVerticalResizeHandle ? null : /*#__PURE__*/_react["default"].createElement(_ui.ResizeHandle, {
|
|
190
|
+
onDrag: model.resizeHeight,
|
|
191
|
+
style: {
|
|
192
|
+
height: dragHandleHeight,
|
|
193
|
+
position: 'absolute',
|
|
194
|
+
bottom: 0,
|
|
195
|
+
left: 0,
|
|
196
|
+
background: '#ccc',
|
|
197
|
+
boxSizing: 'border-box',
|
|
198
|
+
borderTop: '1px solid #fafafa'
|
|
199
|
+
}
|
|
200
|
+
}))));
|
|
201
|
+
});
|
|
202
|
+
var _default = CircularView;
|
|
203
|
+
exports["default"] = _default;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
/// <reference types="react" />
|
|
2
|
-
declare const ImportForm: ({ model }: {
|
|
3
|
-
model: any;
|
|
4
|
-
}) => JSX.Element;
|
|
5
|
-
export default ImportForm;
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
declare const ImportForm: ({ model }: {
|
|
3
|
+
model: any;
|
|
4
|
+
}) => JSX.Element;
|
|
5
|
+
export default ImportForm;
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
5
|
+
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
6
|
+
|
|
7
|
+
Object.defineProperty(exports, "__esModule", {
|
|
8
|
+
value: true
|
|
9
|
+
});
|
|
10
|
+
exports["default"] = void 0;
|
|
11
|
+
|
|
12
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
13
|
+
|
|
14
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
15
|
+
|
|
16
|
+
var _core = require("@material-ui/core");
|
|
17
|
+
|
|
18
|
+
var _mobxReact = require("mobx-react");
|
|
19
|
+
|
|
20
|
+
var _util = require("@jbrowse/core/util");
|
|
21
|
+
|
|
22
|
+
var _ErrorMessage = _interopRequireDefault(require("@jbrowse/core/ui/ErrorMessage"));
|
|
23
|
+
|
|
24
|
+
var _AssemblySelector = _interopRequireDefault(require("@jbrowse/core/ui/AssemblySelector"));
|
|
25
|
+
|
|
26
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
27
|
+
|
|
28
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
29
|
+
|
|
30
|
+
var useStyles = (0, _core.makeStyles)(function (theme) {
|
|
31
|
+
return {
|
|
32
|
+
importFormContainer: {
|
|
33
|
+
marginBottom: theme.spacing(4)
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
}); // eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
37
|
+
|
|
38
|
+
var ImportForm = (0, _mobxReact.observer)(function (_ref) {
|
|
39
|
+
var model = _ref.model;
|
|
40
|
+
var classes = useStyles();
|
|
41
|
+
var session = (0, _util.getSession)(model);
|
|
42
|
+
var modelError = model.error;
|
|
43
|
+
var assemblyNames = session.assemblyNames,
|
|
44
|
+
assemblyManager = session.assemblyManager;
|
|
45
|
+
|
|
46
|
+
var _useState = (0, _react.useState)(assemblyNames[0]),
|
|
47
|
+
_useState2 = (0, _slicedToArray2["default"])(_useState, 2),
|
|
48
|
+
selectedAsm = _useState2[0],
|
|
49
|
+
setSelectedAsm = _useState2[1];
|
|
50
|
+
|
|
51
|
+
var _useState3 = (0, _react.useState)(modelError),
|
|
52
|
+
_useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
|
|
53
|
+
error = _useState4[0],
|
|
54
|
+
setError = _useState4[1];
|
|
55
|
+
|
|
56
|
+
var assembly = assemblyManager.get(selectedAsm);
|
|
57
|
+
var assemblyError = assemblyNames.length ? assembly === null || assembly === void 0 ? void 0 : assembly.error : 'No configured assemblies';
|
|
58
|
+
var regions = (assembly === null || assembly === void 0 ? void 0 : assembly.regions) || [];
|
|
59
|
+
var err = assemblyError || error;
|
|
60
|
+
return /*#__PURE__*/_react["default"].createElement(_core.Container, {
|
|
61
|
+
className: classes.importFormContainer
|
|
62
|
+
}, err ? /*#__PURE__*/_react["default"].createElement(_core.Grid, {
|
|
63
|
+
container: true,
|
|
64
|
+
spacing: 1,
|
|
65
|
+
justifyContent: "center",
|
|
66
|
+
alignItems: "center"
|
|
67
|
+
}, /*#__PURE__*/_react["default"].createElement(_core.Grid, {
|
|
68
|
+
item: true
|
|
69
|
+
}, /*#__PURE__*/_react["default"].createElement(_ErrorMessage["default"], {
|
|
70
|
+
error: err
|
|
71
|
+
}))) : null, /*#__PURE__*/_react["default"].createElement(_core.Grid, {
|
|
72
|
+
container: true,
|
|
73
|
+
spacing: 1,
|
|
74
|
+
justifyContent: "center",
|
|
75
|
+
alignItems: "center"
|
|
76
|
+
}, /*#__PURE__*/_react["default"].createElement(_core.Grid, {
|
|
77
|
+
item: true
|
|
78
|
+
}, /*#__PURE__*/_react["default"].createElement(_AssemblySelector["default"], {
|
|
79
|
+
onChange: function onChange(val) {
|
|
80
|
+
setError(undefined);
|
|
81
|
+
setSelectedAsm(val);
|
|
82
|
+
},
|
|
83
|
+
session: session,
|
|
84
|
+
selected: selectedAsm
|
|
85
|
+
})), /*#__PURE__*/_react["default"].createElement(_core.Grid, {
|
|
86
|
+
item: true
|
|
87
|
+
}, /*#__PURE__*/_react["default"].createElement(_core.Button, {
|
|
88
|
+
disabled: !(regions !== null && regions !== void 0 && regions.length),
|
|
89
|
+
onClick: function onClick() {
|
|
90
|
+
return model.setDisplayedRegions(regions);
|
|
91
|
+
},
|
|
92
|
+
variant: "contained",
|
|
93
|
+
color: "primary"
|
|
94
|
+
}, regions.length ? 'Open' : 'Loading…'))));
|
|
95
|
+
});
|
|
96
|
+
var _default = ImportForm;
|
|
97
|
+
exports["default"] = _default;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export default CircularRuler;
|
|
2
|
-
declare function CircularRuler({ model, slice }: {
|
|
3
|
-
model: any;
|
|
4
|
-
slice: any;
|
|
5
|
-
}): JSX.Element;
|
|
1
|
+
export default CircularRuler;
|
|
2
|
+
declare function CircularRuler({ model, slice }: {
|
|
3
|
+
model: any;
|
|
4
|
+
slice: any;
|
|
5
|
+
}): JSX.Element;
|
|
@@ -0,0 +1,205 @@
|
|
|
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"] = void 0;
|
|
9
|
+
|
|
10
|
+
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
11
|
+
|
|
12
|
+
var _react = _interopRequireDefault(require("react"));
|
|
13
|
+
|
|
14
|
+
var _mobxReact = require("mobx-react");
|
|
15
|
+
|
|
16
|
+
var _util = require("@jbrowse/core/util");
|
|
17
|
+
|
|
18
|
+
var _color = require("@jbrowse/core/util/color");
|
|
19
|
+
|
|
20
|
+
var _styles = require("@material-ui/core/styles");
|
|
21
|
+
|
|
22
|
+
var useStyles = (0, _styles.makeStyles)({
|
|
23
|
+
rulerLabel: {
|
|
24
|
+
fontSize: '0.8rem',
|
|
25
|
+
fontWeight: 500,
|
|
26
|
+
lineHeight: 1.6,
|
|
27
|
+
letterSpacing: '0.0075em'
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
function sliceArcPath(slice, radiusPx, startBase, endBase) {
|
|
32
|
+
// A rx ry x-axis-rotation large-arc-flag sweep-flag x y
|
|
33
|
+
if (slice.flipped) {
|
|
34
|
+
;
|
|
35
|
+
var _ref = [endBase, startBase];
|
|
36
|
+
startBase = _ref[0];
|
|
37
|
+
endBase = _ref[1];
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
var startXY = slice.bpToXY(startBase, radiusPx);
|
|
41
|
+
var endXY = slice.bpToXY(endBase, radiusPx);
|
|
42
|
+
var largeArc = Math.abs(endBase - startBase) / slice.bpPerRadian > Math.PI ? '1' : '0';
|
|
43
|
+
var sweepFlag = '1';
|
|
44
|
+
return ['M'].concat((0, _toConsumableArray2["default"])(startXY), ['A', radiusPx, radiusPx, '0', largeArc, sweepFlag], (0, _toConsumableArray2["default"])(endXY)).join(' ');
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
var ElisionRulerArc = (0, _mobxReact.observer)(function (_ref2) {
|
|
48
|
+
var model = _ref2.model,
|
|
49
|
+
slice = _ref2.slice;
|
|
50
|
+
var theme = (0, _styles.useTheme)();
|
|
51
|
+
var modelRadiusPx = model.radiusPx;
|
|
52
|
+
var radiusPx = modelRadiusPx + 1;
|
|
53
|
+
var endRadians = slice.endRadians,
|
|
54
|
+
startRadians = slice.startRadians,
|
|
55
|
+
region = slice.region;
|
|
56
|
+
var startXY = (0, _util.polarToCartesian)(radiusPx, startRadians);
|
|
57
|
+
var endXY = (0, _util.polarToCartesian)(radiusPx, endRadians);
|
|
58
|
+
var widthPx = (endRadians - startRadians) * radiusPx;
|
|
59
|
+
var largeArc = endRadians - startRadians > Math.PI ? '1' : '0'; // TODO: draw the elision
|
|
60
|
+
|
|
61
|
+
var centerRadians = (endRadians + startRadians) / 2;
|
|
62
|
+
var regionCountString = "[".concat(Number(region.regions.length).toLocaleString(), "]");
|
|
63
|
+
return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(RulerLabel, {
|
|
64
|
+
text: regionCountString,
|
|
65
|
+
view: model,
|
|
66
|
+
maxWidthPx: widthPx,
|
|
67
|
+
radians: centerRadians,
|
|
68
|
+
radiusPx: radiusPx,
|
|
69
|
+
title: "".concat(Number(region.regions.length).toLocaleString(), " more regions"),
|
|
70
|
+
color: theme.palette.text.primary
|
|
71
|
+
}), /*#__PURE__*/_react["default"].createElement("path", {
|
|
72
|
+
d: ['M'].concat((0, _toConsumableArray2["default"])(startXY), ['A', radiusPx, radiusPx, '0', largeArc, '1'], (0, _toConsumableArray2["default"])(endXY)).join(' '),
|
|
73
|
+
stroke: theme.palette.text.secondary,
|
|
74
|
+
strokeWidth: 2,
|
|
75
|
+
strokeDasharray: "2,2",
|
|
76
|
+
fill: "none"
|
|
77
|
+
}));
|
|
78
|
+
});
|
|
79
|
+
var RulerLabel = (0, _mobxReact.observer)(function (_ref3) {
|
|
80
|
+
var view = _ref3.view,
|
|
81
|
+
text = _ref3.text,
|
|
82
|
+
maxWidthPx = _ref3.maxWidthPx,
|
|
83
|
+
radians = _ref3.radians,
|
|
84
|
+
radiusPx = _ref3.radiusPx,
|
|
85
|
+
title = _ref3.title,
|
|
86
|
+
color = _ref3.color;
|
|
87
|
+
var classes = useStyles();
|
|
88
|
+
var textXY = (0, _util.polarToCartesian)(radiusPx + 5, radians);
|
|
89
|
+
|
|
90
|
+
if (!text) {
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
if (text.length * 6.5 < maxWidthPx) {
|
|
95
|
+
// text is rotated parallel to the ruler arc
|
|
96
|
+
return /*#__PURE__*/_react["default"].createElement("text", {
|
|
97
|
+
x: 0,
|
|
98
|
+
y: 0,
|
|
99
|
+
className: classes.rulerLabel,
|
|
100
|
+
textAnchor: "middle",
|
|
101
|
+
dominantBaseline: "baseline",
|
|
102
|
+
transform: "translate(".concat(textXY, ") rotate(").concat((0, _util.radToDeg)(radians) + 90, ")"),
|
|
103
|
+
style: {
|
|
104
|
+
fill: color
|
|
105
|
+
}
|
|
106
|
+
}, text, /*#__PURE__*/_react["default"].createElement("title", null, title || text));
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
if (maxWidthPx > 4) {
|
|
110
|
+
// text is rotated perpendicular to the ruler arc
|
|
111
|
+
var overallRotation = (0, _util.radToDeg)(radians + view.offsetRadians - Math.PI / 2);
|
|
112
|
+
|
|
113
|
+
if (overallRotation >= 180) {
|
|
114
|
+
return /*#__PURE__*/_react["default"].createElement("text", {
|
|
115
|
+
x: 0,
|
|
116
|
+
y: 0,
|
|
117
|
+
className: classes.rulerLabel,
|
|
118
|
+
textAnchor: "start",
|
|
119
|
+
dominantBaseline: "middle",
|
|
120
|
+
transform: "translate(".concat(textXY, ") rotate(").concat((0, _util.radToDeg)(radians), ")"),
|
|
121
|
+
style: {
|
|
122
|
+
fill: color
|
|
123
|
+
}
|
|
124
|
+
}, text, /*#__PURE__*/_react["default"].createElement("title", null, title || text));
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
return /*#__PURE__*/_react["default"].createElement("text", {
|
|
128
|
+
x: 0,
|
|
129
|
+
y: 0,
|
|
130
|
+
className: classes.rulerLabel,
|
|
131
|
+
textAnchor: "end",
|
|
132
|
+
dominantBaseline: "middle",
|
|
133
|
+
transform: "translate(".concat(textXY, ") rotate(").concat((0, _util.radToDeg)(radians) + 180, ")"),
|
|
134
|
+
style: {
|
|
135
|
+
fill: color
|
|
136
|
+
}
|
|
137
|
+
}, text, /*#__PURE__*/_react["default"].createElement("title", null, title || text));
|
|
138
|
+
} // if you get here there is no room for the text at all
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
return null;
|
|
142
|
+
});
|
|
143
|
+
var RegionRulerArc = (0, _mobxReact.observer)(function (_ref4) {
|
|
144
|
+
var model = _ref4.model,
|
|
145
|
+
slice = _ref4.slice;
|
|
146
|
+
var theme = (0, _styles.useTheme)();
|
|
147
|
+
var radiusPx = model.radiusPx;
|
|
148
|
+
var region = slice.region,
|
|
149
|
+
endRadians = slice.endRadians,
|
|
150
|
+
startRadians = slice.startRadians;
|
|
151
|
+
var centerRadians = (endRadians + startRadians) / 2;
|
|
152
|
+
var widthPx = (endRadians - startRadians) * radiusPx;
|
|
153
|
+
var session = (0, _util.getSession)(model);
|
|
154
|
+
var color;
|
|
155
|
+
var assembly = session.assemblyManager.get(slice.region.assemblyName);
|
|
156
|
+
|
|
157
|
+
if (assembly) {
|
|
158
|
+
color = assembly.getRefNameColor(region.refName);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
if (color) {
|
|
162
|
+
try {
|
|
163
|
+
color = (0, _color.makeContrasting)(color, theme.palette.background.paper);
|
|
164
|
+
} catch (error) {
|
|
165
|
+
color = theme.palette.text.primary;
|
|
166
|
+
}
|
|
167
|
+
} else {
|
|
168
|
+
color = theme.palette.text.primary;
|
|
169
|
+
} // TODO: slice flipping
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(RulerLabel, {
|
|
173
|
+
text: region.refName,
|
|
174
|
+
view: model,
|
|
175
|
+
maxWidthPx: widthPx,
|
|
176
|
+
radians: centerRadians,
|
|
177
|
+
radiusPx: radiusPx,
|
|
178
|
+
color: color
|
|
179
|
+
}), /*#__PURE__*/_react["default"].createElement("path", {
|
|
180
|
+
d: sliceArcPath(slice, radiusPx + 1, region.start, region.end),
|
|
181
|
+
stroke: color,
|
|
182
|
+
strokeWidth: 2,
|
|
183
|
+
fill: "none"
|
|
184
|
+
}, /*#__PURE__*/_react["default"].createElement("title", null, region.refName)));
|
|
185
|
+
});
|
|
186
|
+
var CircularRuler = (0, _mobxReact.observer)(function Ruler(_ref5) {
|
|
187
|
+
var model = _ref5.model,
|
|
188
|
+
slice = _ref5.slice;
|
|
189
|
+
|
|
190
|
+
if (slice.region.elided) {
|
|
191
|
+
return /*#__PURE__*/_react["default"].createElement(ElisionRulerArc, {
|
|
192
|
+
key: (0, _util.assembleLocString)(slice.region.regions[0]),
|
|
193
|
+
model: model,
|
|
194
|
+
slice: slice
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
return /*#__PURE__*/_react["default"].createElement(RegionRulerArc, {
|
|
199
|
+
key: (0, _util.assembleLocString)(slice.region),
|
|
200
|
+
model: model,
|
|
201
|
+
slice: slice
|
|
202
|
+
});
|
|
203
|
+
});
|
|
204
|
+
var _default = CircularRuler;
|
|
205
|
+
exports["default"] = _default;
|