@jbrowse/plugin-circular-view 1.6.9 → 1.7.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.
@@ -0,0 +1,142 @@
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 _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
11
+
12
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
13
+
14
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
15
+
16
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
17
+
18
+ var _excluded = ["html"];
19
+
20
+ 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; }
21
+
22
+ 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; }
23
+
24
+ var _default = function _default(_ref) {
25
+ var jbrequire = _ref.jbrequire;
26
+
27
+ var _jbrequire = jbrequire('@jbrowse/core/util/tracks'),
28
+ getRpcSessionId = _jbrequire.getRpcSessionId;
29
+
30
+ var _jbrequire2 = jbrequire('@jbrowse/core/util'),
31
+ getContainingView = _jbrequire2.getContainingView;
32
+
33
+ var _jbrequire3 = jbrequire('@jbrowse/core/util'),
34
+ getSession = _jbrequire3.getSession;
35
+
36
+ function renderReactionData(self) {
37
+ var _view$displayedRegion;
38
+
39
+ var view = getContainingView(self);
40
+ var rendererType = self.rendererType;
41
+
42
+ var _getSession = getSession(view),
43
+ rpcManager = _getSession.rpcManager;
44
+
45
+ return {
46
+ rendererType: rendererType,
47
+ rpcManager: rpcManager,
48
+ renderProps: self.renderProps(),
49
+ renderArgs: {
50
+ assemblyName: (_view$displayedRegion = view.displayedRegions[0]) === null || _view$displayedRegion === void 0 ? void 0 : _view$displayedRegion.assemblyName,
51
+ adapterConfig: JSON.parse(JSON.stringify(self.adapterConfig)),
52
+ rendererType: rendererType.name,
53
+ regions: JSON.parse(JSON.stringify(view.displayedRegions)),
54
+ blockDefinitions: self.blockDefinitions,
55
+ sessionId: getRpcSessionId(self),
56
+ timeout: 1000000
57
+ }
58
+ };
59
+ }
60
+
61
+ function renderReactionEffect(_x, _x2, _x3) {
62
+ return _renderReactionEffect.apply(this, arguments);
63
+ }
64
+
65
+ function _renderReactionEffect() {
66
+ _renderReactionEffect = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(props, signal, self) {
67
+ var rendererType, rpcManager, cannotBeRenderedReason, renderArgs, renderProps, _yield$rendererType$r, html, data;
68
+
69
+ return _regenerator["default"].wrap(function _callee$(_context) {
70
+ while (1) {
71
+ switch (_context.prev = _context.next) {
72
+ case 0:
73
+ if (props) {
74
+ _context.next = 2;
75
+ break;
76
+ }
77
+
78
+ throw new Error('cannot render with no props');
79
+
80
+ case 2:
81
+ rendererType = props.rendererType, rpcManager = props.rpcManager, cannotBeRenderedReason = props.cannotBeRenderedReason, renderArgs = props.renderArgs, renderProps = props.renderProps;
82
+
83
+ if (!cannotBeRenderedReason) {
84
+ _context.next = 5;
85
+ break;
86
+ }
87
+
88
+ return _context.abrupt("return", {
89
+ message: cannotBeRenderedReason
90
+ });
91
+
92
+ case 5:
93
+ if (!(!props.renderProps.radius || !props.renderArgs.regions || !props.renderArgs.regions.length)) {
94
+ _context.next = 7;
95
+ break;
96
+ }
97
+
98
+ return _context.abrupt("return", {
99
+ message: 'Skipping render'
100
+ });
101
+
102
+ case 7:
103
+ if (self.isCompatibleWithRenderer(rendererType)) {
104
+ _context.next = 9;
105
+ break;
106
+ }
107
+
108
+ throw new Error("renderer ".concat(rendererType.name, " is not compatible with this display type"));
109
+
110
+ case 9:
111
+ _context.next = 11;
112
+ return rendererType.renderInClient(rpcManager, _objectSpread(_objectSpread(_objectSpread({}, renderArgs), renderProps), {}, {
113
+ signal: signal
114
+ }));
115
+
116
+ case 11:
117
+ _yield$rendererType$r = _context.sent;
118
+ html = _yield$rendererType$r.html;
119
+ data = (0, _objectWithoutProperties2["default"])(_yield$rendererType$r, _excluded);
120
+ return _context.abrupt("return", {
121
+ html: html,
122
+ data: data,
123
+ renderingComponent: rendererType.ReactComponent
124
+ });
125
+
126
+ case 15:
127
+ case "end":
128
+ return _context.stop();
129
+ }
130
+ }
131
+ }, _callee);
132
+ }));
133
+ return _renderReactionEffect.apply(this, arguments);
134
+ }
135
+
136
+ return {
137
+ renderReactionData: renderReactionData,
138
+ renderReactionEffect: renderReactionEffect
139
+ };
140
+ };
141
+
142
+ exports["default"] = _default;
@@ -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;
@@ -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;
@@ -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;