@jbrowse/plugin-linear-genome-view 2.10.0 → 2.10.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/LinearGenomeView/components/OverviewScalebar.d.ts +0 -8
- package/dist/LinearGenomeView/components/OverviewScalebar.js +23 -55
- package/dist/LinearGenomeView/components/OverviewScalebarPolygon.d.ts +9 -0
- package/dist/LinearGenomeView/components/OverviewScalebarPolygon.js +46 -0
- package/dist/LinearGenomeView/svgcomponents/SVGHeader.js +2 -2
- package/esm/LinearGenomeView/components/OverviewScalebar.d.ts +0 -8
- package/esm/LinearGenomeView/components/OverviewScalebar.js +23 -53
- package/esm/LinearGenomeView/components/OverviewScalebarPolygon.d.ts +9 -0
- package/esm/LinearGenomeView/components/OverviewScalebarPolygon.js +41 -0
- package/esm/LinearGenomeView/svgcomponents/SVGHeader.js +2 -2
- package/package.json +2 -2
|
@@ -1,16 +1,8 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import { Base1DViewModel } from '@jbrowse/core/util/Base1DViewModel';
|
|
3
2
|
import { LinearGenomeViewModel } from '..';
|
|
4
|
-
declare const Polygon: ({ model, overview, useOffset, }: {
|
|
5
|
-
model: LGV;
|
|
6
|
-
overview: Base1DViewModel;
|
|
7
|
-
useOffset?: boolean | undefined;
|
|
8
|
-
}) => React.JSX.Element | null;
|
|
9
3
|
type LGV = LinearGenomeViewModel;
|
|
10
4
|
declare const OverviewScalebar: ({ model, children, }: {
|
|
11
5
|
model: LGV;
|
|
12
6
|
children: React.ReactNode;
|
|
13
7
|
}) => React.JSX.Element;
|
|
14
|
-
export { Polygon };
|
|
15
|
-
export { default as Cytobands } from './Cytobands';
|
|
16
8
|
export default OverviewScalebar;
|
|
@@ -26,7 +26,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
26
26
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
27
|
};
|
|
28
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
-
exports.Cytobands = exports.Polygon = void 0;
|
|
30
29
|
const react_1 = __importStar(require("react"));
|
|
31
30
|
const material_1 = require("@mui/material");
|
|
32
31
|
const mui_1 = require("tss-react/mui");
|
|
@@ -38,9 +37,10 @@ const blockTypes_1 = require("@jbrowse/core/util/blockTypes");
|
|
|
38
37
|
// locals
|
|
39
38
|
const __1 = require("..");
|
|
40
39
|
const util_2 = require("../util");
|
|
40
|
+
const util_3 = require("./util");
|
|
41
41
|
const OverviewRubberband_1 = __importDefault(require("./OverviewRubberband"));
|
|
42
42
|
const Cytobands_1 = __importDefault(require("./Cytobands"));
|
|
43
|
-
const
|
|
43
|
+
const OverviewScalebarPolygon_1 = __importDefault(require("./OverviewScalebarPolygon"));
|
|
44
44
|
const wholeSeqSpacer = 2;
|
|
45
45
|
const useStyles = (0, mui_1.makeStyles)()(theme => ({
|
|
46
46
|
scalebar: {
|
|
@@ -94,56 +94,14 @@ const useStyles = (0, mui_1.makeStyles)()(theme => ({
|
|
|
94
94
|
position: 'absolute',
|
|
95
95
|
},
|
|
96
96
|
}));
|
|
97
|
-
const Polygon = (0, mobx_react_1.observer)(function ({ model, overview, useOffset = true, }) {
|
|
98
|
-
const theme = (0, material_1.useTheme)();
|
|
99
|
-
const multiplier = Number(useOffset);
|
|
100
|
-
const { interRegionPaddingWidth, offsetPx, dynamicBlocks, cytobandOffset } = model;
|
|
101
|
-
const { contentBlocks, totalWidthPxWithoutBorders } = dynamicBlocks;
|
|
102
|
-
const { tertiary, primary } = theme.palette;
|
|
103
|
-
const polygonColor = tertiary ? tertiary.light : primary.light;
|
|
104
|
-
// catches possible null from at's below
|
|
105
|
-
if (!contentBlocks.length) {
|
|
106
|
-
return null;
|
|
107
|
-
}
|
|
108
|
-
const first = contentBlocks.at(0);
|
|
109
|
-
const last = contentBlocks.at(-1);
|
|
110
|
-
const topLeft = (overview.bpToPx({
|
|
111
|
-
...first,
|
|
112
|
-
coord: first.reversed ? first.end : first.start,
|
|
113
|
-
}) || 0) +
|
|
114
|
-
cytobandOffset * multiplier;
|
|
115
|
-
const topRight = (overview.bpToPx({
|
|
116
|
-
...last,
|
|
117
|
-
coord: last.reversed ? last.start : last.end,
|
|
118
|
-
}) || 0) +
|
|
119
|
-
cytobandOffset * multiplier;
|
|
120
|
-
const startPx = Math.max(0, -offsetPx);
|
|
121
|
-
const endPx = startPx +
|
|
122
|
-
totalWidthPxWithoutBorders +
|
|
123
|
-
(contentBlocks.length * interRegionPaddingWidth) / 2;
|
|
124
|
-
const points = [
|
|
125
|
-
[startPx, __1.HEADER_BAR_HEIGHT],
|
|
126
|
-
[endPx, __1.HEADER_BAR_HEIGHT],
|
|
127
|
-
[topRight, 0],
|
|
128
|
-
[topLeft, 0],
|
|
129
|
-
];
|
|
130
|
-
return (react_1.default.createElement("polygon", { points: points.toString(), fill: (0, material_1.alpha)(polygonColor, 0.3), stroke: (0, material_1.alpha)(polygonColor, 0.8) }));
|
|
131
|
-
});
|
|
132
|
-
exports.Polygon = Polygon;
|
|
133
97
|
const OverviewBox = (0, mobx_react_1.observer)(function ({ scale, model, block, overview, }) {
|
|
134
98
|
const { classes, cx } = useStyles();
|
|
135
99
|
const theme = (0, material_1.useTheme)();
|
|
136
100
|
const { cytobandOffset, showCytobands } = model;
|
|
137
|
-
const {
|
|
138
|
-
const { majorPitch } = (0, util_2.chooseGridPitch)(scale, 120, 15);
|
|
101
|
+
const { reversed, refName, assemblyName } = block;
|
|
139
102
|
const { assemblyManager } = (0, util_1.getSession)(model);
|
|
140
103
|
const assembly = assemblyManager.get(assemblyName);
|
|
141
104
|
const refNameColor = assembly === null || assembly === void 0 ? void 0 : assembly.getRefNameColor(refName);
|
|
142
|
-
const tickLabels = [];
|
|
143
|
-
for (let i = 0; i < Math.floor((end - start) / majorPitch); i++) {
|
|
144
|
-
const offsetLabel = (i + 1) * majorPitch;
|
|
145
|
-
tickLabels.push(reversed ? end - offsetLabel : start + offsetLabel);
|
|
146
|
-
}
|
|
147
105
|
const canDisplayCytobands = showCytobands && (0, util_3.getCytobands)(assembly, block.refName).length;
|
|
148
106
|
return (react_1.default.createElement("div", null,
|
|
149
107
|
react_1.default.createElement(material_1.Typography, { style: {
|
|
@@ -161,16 +119,28 @@ const OverviewBox = (0, mobx_react_1.observer)(function ({ scale, model, block,
|
|
|
161
119
|
width: block.widthPx,
|
|
162
120
|
borderColor: refNameColor,
|
|
163
121
|
} },
|
|
164
|
-
!canDisplayCytobands
|
|
165
|
-
? tickLabels.map((tickLabel, labelIdx) => (react_1.default.createElement(material_1.Typography, { key: `${JSON.stringify(block)}-${tickLabel}-${labelIdx}`, className: classes.scalebarLabel, variant: "body2", style: {
|
|
166
|
-
left: ((labelIdx + 1) * majorPitch) / scale,
|
|
167
|
-
pointerEvents: 'none',
|
|
168
|
-
color: refNameColor,
|
|
169
|
-
} }, (0, util_1.getTickDisplayStr)(tickLabel, overview.bpPerPx))))
|
|
170
|
-
: null,
|
|
122
|
+
!canDisplayCytobands ? (react_1.default.createElement(TickLabels, { model: model, overview: overview, scale: scale, block: block })) : null,
|
|
171
123
|
canDisplayCytobands ? (react_1.default.createElement("svg", { style: { width: '100%' } },
|
|
172
124
|
react_1.default.createElement(Cytobands_1.default, { overview: overview, assembly: assembly, block: block }))) : null)));
|
|
173
125
|
});
|
|
126
|
+
const TickLabels = (0, mobx_react_1.observer)(function ({ block, scale, overview, model, }) {
|
|
127
|
+
const { classes } = useStyles();
|
|
128
|
+
const { start, end, reversed, refName, assemblyName } = block;
|
|
129
|
+
const { majorPitch } = (0, util_2.chooseGridPitch)(scale, 120, 15);
|
|
130
|
+
const { assemblyManager } = (0, util_1.getSession)(model);
|
|
131
|
+
const assembly = assemblyManager.get(assemblyName);
|
|
132
|
+
const refNameColor = assembly === null || assembly === void 0 ? void 0 : assembly.getRefNameColor(refName);
|
|
133
|
+
const tickLabels = [];
|
|
134
|
+
for (let i = 0; i < Math.floor((end - start) / majorPitch); i++) {
|
|
135
|
+
const offsetLabel = (i + 1) * majorPitch;
|
|
136
|
+
tickLabels.push(reversed ? end - offsetLabel : start + offsetLabel);
|
|
137
|
+
}
|
|
138
|
+
return tickLabels.map((tickLabel, labelIdx) => (react_1.default.createElement(material_1.Typography, { key: `${JSON.stringify(block)}-${tickLabel}-${labelIdx}`, className: classes.scalebarLabel, variant: "body2", style: {
|
|
139
|
+
left: ((labelIdx + 1) * majorPitch) / scale,
|
|
140
|
+
pointerEvents: 'none',
|
|
141
|
+
color: refNameColor,
|
|
142
|
+
} }, (0, util_1.getTickDisplayStr)(tickLabel, overview.bpPerPx))));
|
|
143
|
+
});
|
|
174
144
|
const Scalebar = (0, mobx_react_1.observer)(function ({ model, scale, overview, }) {
|
|
175
145
|
const { classes } = useStyles();
|
|
176
146
|
const theme = (0, material_1.useTheme)();
|
|
@@ -235,9 +205,7 @@ const OverviewScalebar = (0, mobx_react_1.observer)(function ({ model, children,
|
|
|
235
205
|
react_1.default.createElement(OverviewRubberband_1.default, { model: model, overview: overview, ControlComponent: react_1.default.createElement(Scalebar, { model: model, overview: overview, scale: scale }) }),
|
|
236
206
|
react_1.default.createElement("div", { className: classes.overview },
|
|
237
207
|
react_1.default.createElement("svg", { height: __1.HEADER_BAR_HEIGHT, className: classes.overviewSvg },
|
|
238
|
-
react_1.default.createElement(
|
|
208
|
+
react_1.default.createElement(OverviewScalebarPolygon_1.default, { model: model, overview: overview })),
|
|
239
209
|
children)));
|
|
240
210
|
});
|
|
241
|
-
var Cytobands_2 = require("./Cytobands");
|
|
242
|
-
Object.defineProperty(exports, "Cytobands", { enumerable: true, get: function () { return __importDefault(Cytobands_2).default; } });
|
|
243
211
|
exports.default = OverviewScalebar;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Base1DViewModel } from '@jbrowse/core/util/Base1DViewModel';
|
|
3
|
+
import { LinearGenomeViewModel } from '..';
|
|
4
|
+
declare const OverviewScalebarPolygon: ({ model, overview, useOffset, }: {
|
|
5
|
+
model: LinearGenomeViewModel;
|
|
6
|
+
overview: Base1DViewModel;
|
|
7
|
+
useOffset?: boolean | undefined;
|
|
8
|
+
}) => React.JSX.Element | null;
|
|
9
|
+
export default OverviewScalebarPolygon;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const react_1 = __importDefault(require("react"));
|
|
7
|
+
const material_1 = require("@mui/material");
|
|
8
|
+
const mobx_react_1 = require("mobx-react");
|
|
9
|
+
// locals
|
|
10
|
+
const __1 = require("..");
|
|
11
|
+
const OverviewScalebarPolygon = (0, mobx_react_1.observer)(function ({ model, overview, useOffset = true, }) {
|
|
12
|
+
const theme = (0, material_1.useTheme)();
|
|
13
|
+
const multiplier = Number(useOffset);
|
|
14
|
+
const { interRegionPaddingWidth, offsetPx, dynamicBlocks, cytobandOffset } = model;
|
|
15
|
+
const { contentBlocks, totalWidthPxWithoutBorders } = dynamicBlocks;
|
|
16
|
+
const { tertiary, primary } = theme.palette;
|
|
17
|
+
const polygonColor = tertiary ? tertiary.light : primary.light;
|
|
18
|
+
// catches possible null from at's below
|
|
19
|
+
if (!contentBlocks.length) {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
const first = contentBlocks.at(0);
|
|
23
|
+
const last = contentBlocks.at(-1);
|
|
24
|
+
const topLeft = (overview.bpToPx({
|
|
25
|
+
...first,
|
|
26
|
+
coord: first.reversed ? first.end : first.start,
|
|
27
|
+
}) || 0) +
|
|
28
|
+
cytobandOffset * multiplier;
|
|
29
|
+
const topRight = (overview.bpToPx({
|
|
30
|
+
...last,
|
|
31
|
+
coord: last.reversed ? last.start : last.end,
|
|
32
|
+
}) || 0) +
|
|
33
|
+
cytobandOffset * multiplier;
|
|
34
|
+
const startPx = Math.max(0, -offsetPx);
|
|
35
|
+
const endPx = startPx +
|
|
36
|
+
totalWidthPxWithoutBorders +
|
|
37
|
+
(contentBlocks.length * interRegionPaddingWidth) / 2;
|
|
38
|
+
const points = [
|
|
39
|
+
[startPx, __1.HEADER_BAR_HEIGHT],
|
|
40
|
+
[endPx, __1.HEADER_BAR_HEIGHT],
|
|
41
|
+
[topRight, 0],
|
|
42
|
+
[topLeft, 0],
|
|
43
|
+
];
|
|
44
|
+
return (react_1.default.createElement("polygon", { points: points.toString(), fill: (0, material_1.alpha)(polygonColor, 0.3), stroke: (0, material_1.alpha)(polygonColor, 0.8) }));
|
|
45
|
+
});
|
|
46
|
+
exports.default = OverviewScalebarPolygon;
|
|
@@ -10,9 +10,9 @@ const material_1 = require("@mui/material");
|
|
|
10
10
|
// locals
|
|
11
11
|
const __1 = require("..");
|
|
12
12
|
const Cytobands_1 = __importDefault(require("../components/Cytobands"));
|
|
13
|
-
const OverviewScalebar_1 = require("../components/OverviewScalebar");
|
|
14
13
|
const SVGRuler_1 = __importDefault(require("./SVGRuler"));
|
|
15
14
|
const SVGScalebar_1 = __importDefault(require("./SVGScalebar"));
|
|
15
|
+
const OverviewScalebarPolygon_1 = __importDefault(require("../components/OverviewScalebarPolygon"));
|
|
16
16
|
function SVGHeader({ model, fontSize, cytobandHeight, rulerHeight, }) {
|
|
17
17
|
const { width, assemblyNames, showCytobands, displayedRegions } = model;
|
|
18
18
|
const { assemblyManager } = (0, util_1.getSession)(model);
|
|
@@ -49,7 +49,7 @@ function SVGHeader({ model, fontSize, cytobandHeight, rulerHeight, }) {
|
|
|
49
49
|
react_1.default.createElement(Cytobands_1.default, { overview: overview, assembly: assembly, block: block }),
|
|
50
50
|
react_1.default.createElement("rect", { stroke: "red", fill: "rgb(255,0,0,0.1)", width: Math.max(lastOverviewPx - firstOverviewPx, 0.5), height: __1.HEADER_OVERVIEW_HEIGHT - 1, x: firstOverviewPx, y: 0.5 }),
|
|
51
51
|
react_1.default.createElement("g", { transform: `translate(0,${__1.HEADER_OVERVIEW_HEIGHT})` },
|
|
52
|
-
react_1.default.createElement(
|
|
52
|
+
react_1.default.createElement(OverviewScalebarPolygon_1.default, { overview: overview, model: model, useOffset: false })))) : null,
|
|
53
53
|
react_1.default.createElement("g", { transform: `translate(0 ${fontSize + y})` },
|
|
54
54
|
react_1.default.createElement(SVGScalebar_1.default, { model: model, fontSize: fontSize })),
|
|
55
55
|
react_1.default.createElement("g", { transform: `translate(0 ${rulerHeight + y})` },
|
|
@@ -1,16 +1,8 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import { Base1DViewModel } from '@jbrowse/core/util/Base1DViewModel';
|
|
3
2
|
import { LinearGenomeViewModel } from '..';
|
|
4
|
-
declare const Polygon: ({ model, overview, useOffset, }: {
|
|
5
|
-
model: LGV;
|
|
6
|
-
overview: Base1DViewModel;
|
|
7
|
-
useOffset?: boolean | undefined;
|
|
8
|
-
}) => React.JSX.Element | null;
|
|
9
3
|
type LGV = LinearGenomeViewModel;
|
|
10
4
|
declare const OverviewScalebar: ({ model, children, }: {
|
|
11
5
|
model: LGV;
|
|
12
6
|
children: React.ReactNode;
|
|
13
7
|
}) => React.JSX.Element;
|
|
14
|
-
export { Polygon };
|
|
15
|
-
export { default as Cytobands } from './Cytobands';
|
|
16
8
|
export default OverviewScalebar;
|
|
@@ -9,9 +9,10 @@ import { ContentBlock } from '@jbrowse/core/util/blockTypes';
|
|
|
9
9
|
// locals
|
|
10
10
|
import { HEADER_BAR_HEIGHT, HEADER_OVERVIEW_HEIGHT, } from '..';
|
|
11
11
|
import { chooseGridPitch } from '../util';
|
|
12
|
+
import { getCytobands } from './util';
|
|
12
13
|
import OverviewRubberband from './OverviewRubberband';
|
|
13
14
|
import Cytobands from './Cytobands';
|
|
14
|
-
import
|
|
15
|
+
import OverviewScalebarPolygon from './OverviewScalebarPolygon';
|
|
15
16
|
const wholeSeqSpacer = 2;
|
|
16
17
|
const useStyles = makeStyles()(theme => ({
|
|
17
18
|
scalebar: {
|
|
@@ -65,55 +66,14 @@ const useStyles = makeStyles()(theme => ({
|
|
|
65
66
|
position: 'absolute',
|
|
66
67
|
},
|
|
67
68
|
}));
|
|
68
|
-
const Polygon = observer(function ({ model, overview, useOffset = true, }) {
|
|
69
|
-
const theme = useTheme();
|
|
70
|
-
const multiplier = Number(useOffset);
|
|
71
|
-
const { interRegionPaddingWidth, offsetPx, dynamicBlocks, cytobandOffset } = model;
|
|
72
|
-
const { contentBlocks, totalWidthPxWithoutBorders } = dynamicBlocks;
|
|
73
|
-
const { tertiary, primary } = theme.palette;
|
|
74
|
-
const polygonColor = tertiary ? tertiary.light : primary.light;
|
|
75
|
-
// catches possible null from at's below
|
|
76
|
-
if (!contentBlocks.length) {
|
|
77
|
-
return null;
|
|
78
|
-
}
|
|
79
|
-
const first = contentBlocks.at(0);
|
|
80
|
-
const last = contentBlocks.at(-1);
|
|
81
|
-
const topLeft = (overview.bpToPx({
|
|
82
|
-
...first,
|
|
83
|
-
coord: first.reversed ? first.end : first.start,
|
|
84
|
-
}) || 0) +
|
|
85
|
-
cytobandOffset * multiplier;
|
|
86
|
-
const topRight = (overview.bpToPx({
|
|
87
|
-
...last,
|
|
88
|
-
coord: last.reversed ? last.start : last.end,
|
|
89
|
-
}) || 0) +
|
|
90
|
-
cytobandOffset * multiplier;
|
|
91
|
-
const startPx = Math.max(0, -offsetPx);
|
|
92
|
-
const endPx = startPx +
|
|
93
|
-
totalWidthPxWithoutBorders +
|
|
94
|
-
(contentBlocks.length * interRegionPaddingWidth) / 2;
|
|
95
|
-
const points = [
|
|
96
|
-
[startPx, HEADER_BAR_HEIGHT],
|
|
97
|
-
[endPx, HEADER_BAR_HEIGHT],
|
|
98
|
-
[topRight, 0],
|
|
99
|
-
[topLeft, 0],
|
|
100
|
-
];
|
|
101
|
-
return (React.createElement("polygon", { points: points.toString(), fill: alpha(polygonColor, 0.3), stroke: alpha(polygonColor, 0.8) }));
|
|
102
|
-
});
|
|
103
69
|
const OverviewBox = observer(function ({ scale, model, block, overview, }) {
|
|
104
70
|
const { classes, cx } = useStyles();
|
|
105
71
|
const theme = useTheme();
|
|
106
72
|
const { cytobandOffset, showCytobands } = model;
|
|
107
|
-
const {
|
|
108
|
-
const { majorPitch } = chooseGridPitch(scale, 120, 15);
|
|
73
|
+
const { reversed, refName, assemblyName } = block;
|
|
109
74
|
const { assemblyManager } = getSession(model);
|
|
110
75
|
const assembly = assemblyManager.get(assemblyName);
|
|
111
76
|
const refNameColor = assembly === null || assembly === void 0 ? void 0 : assembly.getRefNameColor(refName);
|
|
112
|
-
const tickLabels = [];
|
|
113
|
-
for (let i = 0; i < Math.floor((end - start) / majorPitch); i++) {
|
|
114
|
-
const offsetLabel = (i + 1) * majorPitch;
|
|
115
|
-
tickLabels.push(reversed ? end - offsetLabel : start + offsetLabel);
|
|
116
|
-
}
|
|
117
77
|
const canDisplayCytobands = showCytobands && getCytobands(assembly, block.refName).length;
|
|
118
78
|
return (React.createElement("div", null,
|
|
119
79
|
React.createElement(Typography, { style: {
|
|
@@ -131,16 +91,28 @@ const OverviewBox = observer(function ({ scale, model, block, overview, }) {
|
|
|
131
91
|
width: block.widthPx,
|
|
132
92
|
borderColor: refNameColor,
|
|
133
93
|
} },
|
|
134
|
-
!canDisplayCytobands
|
|
135
|
-
? tickLabels.map((tickLabel, labelIdx) => (React.createElement(Typography, { key: `${JSON.stringify(block)}-${tickLabel}-${labelIdx}`, className: classes.scalebarLabel, variant: "body2", style: {
|
|
136
|
-
left: ((labelIdx + 1) * majorPitch) / scale,
|
|
137
|
-
pointerEvents: 'none',
|
|
138
|
-
color: refNameColor,
|
|
139
|
-
} }, getTickDisplayStr(tickLabel, overview.bpPerPx))))
|
|
140
|
-
: null,
|
|
94
|
+
!canDisplayCytobands ? (React.createElement(TickLabels, { model: model, overview: overview, scale: scale, block: block })) : null,
|
|
141
95
|
canDisplayCytobands ? (React.createElement("svg", { style: { width: '100%' } },
|
|
142
96
|
React.createElement(Cytobands, { overview: overview, assembly: assembly, block: block }))) : null)));
|
|
143
97
|
});
|
|
98
|
+
const TickLabels = observer(function ({ block, scale, overview, model, }) {
|
|
99
|
+
const { classes } = useStyles();
|
|
100
|
+
const { start, end, reversed, refName, assemblyName } = block;
|
|
101
|
+
const { majorPitch } = chooseGridPitch(scale, 120, 15);
|
|
102
|
+
const { assemblyManager } = getSession(model);
|
|
103
|
+
const assembly = assemblyManager.get(assemblyName);
|
|
104
|
+
const refNameColor = assembly === null || assembly === void 0 ? void 0 : assembly.getRefNameColor(refName);
|
|
105
|
+
const tickLabels = [];
|
|
106
|
+
for (let i = 0; i < Math.floor((end - start) / majorPitch); i++) {
|
|
107
|
+
const offsetLabel = (i + 1) * majorPitch;
|
|
108
|
+
tickLabels.push(reversed ? end - offsetLabel : start + offsetLabel);
|
|
109
|
+
}
|
|
110
|
+
return tickLabels.map((tickLabel, labelIdx) => (React.createElement(Typography, { key: `${JSON.stringify(block)}-${tickLabel}-${labelIdx}`, className: classes.scalebarLabel, variant: "body2", style: {
|
|
111
|
+
left: ((labelIdx + 1) * majorPitch) / scale,
|
|
112
|
+
pointerEvents: 'none',
|
|
113
|
+
color: refNameColor,
|
|
114
|
+
} }, getTickDisplayStr(tickLabel, overview.bpPerPx))));
|
|
115
|
+
});
|
|
144
116
|
const Scalebar = observer(function ({ model, scale, overview, }) {
|
|
145
117
|
const { classes } = useStyles();
|
|
146
118
|
const theme = useTheme();
|
|
@@ -205,9 +177,7 @@ const OverviewScalebar = observer(function ({ model, children, }) {
|
|
|
205
177
|
React.createElement(OverviewRubberband, { model: model, overview: overview, ControlComponent: React.createElement(Scalebar, { model: model, overview: overview, scale: scale }) }),
|
|
206
178
|
React.createElement("div", { className: classes.overview },
|
|
207
179
|
React.createElement("svg", { height: HEADER_BAR_HEIGHT, className: classes.overviewSvg },
|
|
208
|
-
React.createElement(
|
|
180
|
+
React.createElement(OverviewScalebarPolygon, { model: model, overview: overview })),
|
|
209
181
|
children)));
|
|
210
182
|
});
|
|
211
|
-
export { Polygon };
|
|
212
|
-
export { default as Cytobands } from './Cytobands';
|
|
213
183
|
export default OverviewScalebar;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Base1DViewModel } from '@jbrowse/core/util/Base1DViewModel';
|
|
3
|
+
import { LinearGenomeViewModel } from '..';
|
|
4
|
+
declare const OverviewScalebarPolygon: ({ model, overview, useOffset, }: {
|
|
5
|
+
model: LinearGenomeViewModel;
|
|
6
|
+
overview: Base1DViewModel;
|
|
7
|
+
useOffset?: boolean | undefined;
|
|
8
|
+
}) => React.JSX.Element | null;
|
|
9
|
+
export default OverviewScalebarPolygon;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { useTheme, alpha } from '@mui/material';
|
|
3
|
+
import { observer } from 'mobx-react';
|
|
4
|
+
// locals
|
|
5
|
+
import { HEADER_BAR_HEIGHT } from '..';
|
|
6
|
+
const OverviewScalebarPolygon = observer(function ({ model, overview, useOffset = true, }) {
|
|
7
|
+
const theme = useTheme();
|
|
8
|
+
const multiplier = Number(useOffset);
|
|
9
|
+
const { interRegionPaddingWidth, offsetPx, dynamicBlocks, cytobandOffset } = model;
|
|
10
|
+
const { contentBlocks, totalWidthPxWithoutBorders } = dynamicBlocks;
|
|
11
|
+
const { tertiary, primary } = theme.palette;
|
|
12
|
+
const polygonColor = tertiary ? tertiary.light : primary.light;
|
|
13
|
+
// catches possible null from at's below
|
|
14
|
+
if (!contentBlocks.length) {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
const first = contentBlocks.at(0);
|
|
18
|
+
const last = contentBlocks.at(-1);
|
|
19
|
+
const topLeft = (overview.bpToPx({
|
|
20
|
+
...first,
|
|
21
|
+
coord: first.reversed ? first.end : first.start,
|
|
22
|
+
}) || 0) +
|
|
23
|
+
cytobandOffset * multiplier;
|
|
24
|
+
const topRight = (overview.bpToPx({
|
|
25
|
+
...last,
|
|
26
|
+
coord: last.reversed ? last.start : last.end,
|
|
27
|
+
}) || 0) +
|
|
28
|
+
cytobandOffset * multiplier;
|
|
29
|
+
const startPx = Math.max(0, -offsetPx);
|
|
30
|
+
const endPx = startPx +
|
|
31
|
+
totalWidthPxWithoutBorders +
|
|
32
|
+
(contentBlocks.length * interRegionPaddingWidth) / 2;
|
|
33
|
+
const points = [
|
|
34
|
+
[startPx, HEADER_BAR_HEIGHT],
|
|
35
|
+
[endPx, HEADER_BAR_HEIGHT],
|
|
36
|
+
[topRight, 0],
|
|
37
|
+
[topLeft, 0],
|
|
38
|
+
];
|
|
39
|
+
return (React.createElement("polygon", { points: points.toString(), fill: alpha(polygonColor, 0.3), stroke: alpha(polygonColor, 0.8) }));
|
|
40
|
+
});
|
|
41
|
+
export default OverviewScalebarPolygon;
|
|
@@ -5,9 +5,9 @@ import { useTheme } from '@mui/material';
|
|
|
5
5
|
// locals
|
|
6
6
|
import { HEADER_OVERVIEW_HEIGHT } from '..';
|
|
7
7
|
import Cytobands from '../components/Cytobands';
|
|
8
|
-
import { Polygon } from '../components/OverviewScalebar';
|
|
9
8
|
import SVGRuler from './SVGRuler';
|
|
10
9
|
import SVGScalebar from './SVGScalebar';
|
|
10
|
+
import OverviewScalebarPolygon from '../components/OverviewScalebarPolygon';
|
|
11
11
|
export default function SVGHeader({ model, fontSize, cytobandHeight, rulerHeight, }) {
|
|
12
12
|
const { width, assemblyNames, showCytobands, displayedRegions } = model;
|
|
13
13
|
const { assemblyManager } = getSession(model);
|
|
@@ -44,7 +44,7 @@ export default function SVGHeader({ model, fontSize, cytobandHeight, rulerHeight
|
|
|
44
44
|
React.createElement(Cytobands, { overview: overview, assembly: assembly, block: block }),
|
|
45
45
|
React.createElement("rect", { stroke: "red", fill: "rgb(255,0,0,0.1)", width: Math.max(lastOverviewPx - firstOverviewPx, 0.5), height: HEADER_OVERVIEW_HEIGHT - 1, x: firstOverviewPx, y: 0.5 }),
|
|
46
46
|
React.createElement("g", { transform: `translate(0,${HEADER_OVERVIEW_HEIGHT})` },
|
|
47
|
-
React.createElement(
|
|
47
|
+
React.createElement(OverviewScalebarPolygon, { overview: overview, model: model, useOffset: false })))) : null,
|
|
48
48
|
React.createElement("g", { transform: `translate(0 ${fontSize + y})` },
|
|
49
49
|
React.createElement(SVGScalebar, { model: model, fontSize: fontSize })),
|
|
50
50
|
React.createElement("g", { transform: `translate(0 ${rulerHeight + y})` },
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jbrowse/plugin-linear-genome-view",
|
|
3
|
-
"version": "2.10.
|
|
3
|
+
"version": "2.10.1",
|
|
4
4
|
"description": "JBrowse 2 linear genome view",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"jbrowse",
|
|
@@ -63,5 +63,5 @@
|
|
|
63
63
|
"access": "public"
|
|
64
64
|
},
|
|
65
65
|
"module": "esm/index.js",
|
|
66
|
-
"gitHead": "
|
|
66
|
+
"gitHead": "442b5f87efddfdf4ccf520b4d9dd01ddd370cb07"
|
|
67
67
|
}
|