react-msaview 9.2.0 → 9.4.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.
- package/bundle/index.js +74 -74
- package/bundle/index.js.map +4 -4
- package/dist/components/DragHandle.js +2 -1
- package/dist/components/DragHandle.js.map +1 -1
- package/dist/components/MSAViewer.d.ts +29 -19
- package/dist/components/MSAViewer.js +2 -1
- package/dist/components/MSAViewer.js.map +1 -1
- package/dist/components/Track.js +2 -5
- package/dist/components/Track.js.map +1 -1
- package/dist/components/VerticalScrollbar.js +1 -1
- package/dist/components/VerticalScrollbar.js.map +1 -1
- package/dist/components/header/Header.js +2 -1
- package/dist/components/header/Header.js.map +1 -1
- package/dist/components/minimap/Minimap.js +1 -1
- package/dist/components/minimap/Minimap.js.map +1 -1
- package/dist/components/msa/MSACanvas.js +16 -27
- package/dist/components/msa/MSACanvas.js.map +1 -1
- package/dist/components/rowpanels/RowPanels.js +8 -6
- package/dist/components/rowpanels/RowPanels.js.map +1 -1
- package/dist/components/settings/SettingsPanel.js +2 -1
- package/dist/components/settings/SettingsPanel.js.map +1 -1
- package/dist/components/tree/TreeCanvas.js +8 -6
- package/dist/components/tree/TreeCanvas.js.map +1 -1
- package/dist/constants.d.ts +1 -0
- package/dist/constants.js +2 -0
- package/dist/constants.js.map +1 -1
- package/dist/element.d.ts +11 -7
- package/dist/element.js +46 -8
- package/dist/element.js.map +1 -1
- package/dist/featurePanels.d.ts +0 -7
- package/dist/featurePanels.js +1 -16
- package/dist/featurePanels.js.map +1 -1
- package/dist/ggplotPalettes.js +12 -1
- package/dist/ggplotPalettes.js.map +1 -1
- package/dist/groupKeys.d.ts +6 -0
- package/dist/groupKeys.js +52 -0
- package/dist/groupKeys.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/model.d.ts +38 -18
- package/dist/model.js +107 -56
- package/dist/model.js.map +1 -1
- package/dist/scales.d.ts +114 -13
- package/dist/scales.js +154 -19
- package/dist/scales.js.map +1 -1
- package/dist/svgTestUtil.d.ts +20 -12
- package/dist/types.d.ts +29 -27
- package/dist/useDragScroll.d.ts +4 -3
- package/dist/useDragScroll.js +9 -6
- package/dist/useDragScroll.js.map +1 -1
- package/dist/useWheelScroll.d.ts +26 -8
- package/dist/useWheelScroll.js +108 -71
- package/dist/useWheelScroll.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/viewerSnapshot.js +2 -1
- package/dist/viewerSnapshot.js.map +1 -1
- package/package.json +3 -3
- package/src/components/DragHandle.tsx +2 -1
- package/src/components/MSAViewer.tsx +11 -8
- package/src/components/Track.tsx +2 -8
- package/src/components/VerticalScrollbar.tsx +1 -1
- package/src/components/header/Header.tsx +2 -1
- package/src/components/minimap/Minimap.tsx +1 -1
- package/src/components/msa/MSACanvas.tsx +14 -35
- package/src/components/rowpanels/RowPanels.tsx +8 -10
- package/src/components/settings/SettingsPanel.tsx +2 -1
- package/src/components/tree/TreeCanvas.tsx +8 -10
- package/src/constants.ts +2 -0
- package/src/element.ts +53 -8
- package/src/featurePanels.ts +1 -25
- package/src/ggplotPalettes.ts +13 -1
- package/src/groupKeys.ts +54 -0
- package/src/index.ts +13 -2
- package/src/model.ts +159 -74
- package/src/scales.ts +268 -25
- package/src/types.ts +28 -25
- package/src/useDragScroll.ts +11 -8
- package/src/useWheelScroll.ts +124 -84
- package/src/version.ts +1 -1
- package/src/viewerSnapshot.ts +3 -1
package/dist/useWheelScroll.js
CHANGED
|
@@ -1,19 +1,65 @@
|
|
|
1
1
|
import { useEffect, useRef, useState } from 'react';
|
|
2
2
|
import { WheelZoomSmoother } from './wheelZoom.js';
|
|
3
3
|
const zoomSettleMs = 150;
|
|
4
|
-
|
|
4
|
+
// a wheel event this soon after one the view took belongs to the same gesture,
|
|
5
|
+
// so the view keeps it at an edge rather than handing the momentum to the page
|
|
6
|
+
const wheelLatchMs = 150;
|
|
7
|
+
/**
|
|
8
|
+
* Whether a vertical wheel `delta` moves a view at `scrollY`. At the top or
|
|
9
|
+
* bottom, or when every row fits, the page scrolls instead, so an embedded
|
|
10
|
+
* viewer never traps the reader scrolling past it.
|
|
11
|
+
*/
|
|
12
|
+
export function canScrollY(model, delta) {
|
|
13
|
+
const { scrollY, maxScrollY } = model;
|
|
14
|
+
return delta > 0 ? scrollY > maxScrollY : delta < 0 && scrollY < 0;
|
|
15
|
+
}
|
|
16
|
+
// Safari reads a touch-action holding pinch-zoom as invalid and falls back to
|
|
17
|
+
// auto, which hands every swipe to the page
|
|
18
|
+
const pinchZoom = typeof CSS !== 'undefined' && CSS.supports('touch-action', 'pinch-zoom')
|
|
19
|
+
? 'pinch-zoom'
|
|
20
|
+
: undefined;
|
|
21
|
+
function withPinch(pan) {
|
|
22
|
+
return pinchZoom ? `${pan} ${pinchZoom}` : pan;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* The CSS touch-action for a pannable area: the browser keeps a touch pan
|
|
26
|
+
* along every axis the view cannot scroll, and pinch zoom on the page where it
|
|
27
|
+
* supports that value.
|
|
28
|
+
*/
|
|
29
|
+
export function panTouchAction(model, axes) {
|
|
30
|
+
const x = axes.includes('x') && model.maxScrollX < 0;
|
|
31
|
+
const y = axes.includes('y') && model.maxScrollY < 0;
|
|
32
|
+
return x && y
|
|
33
|
+
? (pinchZoom ?? 'none')
|
|
34
|
+
: x
|
|
35
|
+
? withPinch('pan-y')
|
|
36
|
+
: y
|
|
37
|
+
? withPinch('pan-x')
|
|
38
|
+
: 'auto';
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Wheel scrolling, wheel zoom and pointer-drag panning of `model` over `ref`,
|
|
42
|
+
* along `axes`. The returned `onPointerDown` starts a pan with a mouse, a pen
|
|
43
|
+
* or a finger; put `touchAction` on the same element.
|
|
44
|
+
*/
|
|
45
|
+
export function useWheelScroll({ ref, model, axes, zoom, onWheelScroll, }) {
|
|
5
46
|
const scheduled = useRef(false);
|
|
6
47
|
const zoomFrame = useRef(undefined);
|
|
7
48
|
const zoomSettle = useRef(undefined);
|
|
8
49
|
const deltaX = useRef(0);
|
|
9
50
|
const deltaY = useRef(0);
|
|
51
|
+
const lastTaken = useRef(Number.NEGATIVE_INFINITY);
|
|
10
52
|
const zoomSmoother = useRef(new WheelZoomSmoother());
|
|
11
53
|
const zoomX = useRef(0);
|
|
12
54
|
const zoomY = useRef(0);
|
|
13
55
|
const lastZoomTime = useRef(null);
|
|
14
|
-
const
|
|
15
|
-
const
|
|
16
|
-
const
|
|
56
|
+
const prev = useRef({ x: 0, y: 0 });
|
|
57
|
+
const latest = useRef({ x: 0, y: 0 });
|
|
58
|
+
const panFrame = useRef(false);
|
|
59
|
+
// the pointer that started the pan; a second finger neither moves nor ends it
|
|
60
|
+
const [panPointer, setPanPointer] = useState();
|
|
61
|
+
const x = axes.includes('x');
|
|
62
|
+
const y = axes.includes('y');
|
|
17
63
|
useEffect(() => {
|
|
18
64
|
const curr = ref.current;
|
|
19
65
|
if (!curr) {
|
|
@@ -24,11 +70,10 @@ export function useWheelScroll({ ref, onScrollX, onScrollY, onZoom, onZoomSettle
|
|
|
24
70
|
// scrollZoom is on, a plain vertical-dominant wheel zooms too; holding
|
|
25
71
|
// shift is the escape hatch to pan instead.
|
|
26
72
|
const isCtrlZoom = event.ctrlKey || event.metaKey;
|
|
27
|
-
const isScrollZoom = scrollZoom &&
|
|
73
|
+
const isScrollZoom = model.scrollZoom &&
|
|
28
74
|
!event.shiftKey &&
|
|
29
75
|
Math.abs(event.deltaY) >= Math.abs(event.deltaX);
|
|
30
|
-
if (
|
|
31
|
-
const zoom = onZoom;
|
|
76
|
+
if (zoom && (isCtrlZoom || isScrollZoom)) {
|
|
32
77
|
const rect = curr.getBoundingClientRect();
|
|
33
78
|
zoomSmoother.current.add(event.deltaY, event.deltaMode, isCtrlZoom);
|
|
34
79
|
zoomX.current = event.clientX - rect.left;
|
|
@@ -38,10 +83,10 @@ export function useWheelScroll({ ref, onScrollX, onScrollY, onZoom, onZoomSettle
|
|
|
38
83
|
const frame = (now) => {
|
|
39
84
|
const elapsed = lastZoomTime.current === null ? 16.67 : now - lastZoomTime.current;
|
|
40
85
|
lastZoomTime.current = now;
|
|
41
|
-
|
|
86
|
+
model.wheelZoomToPos(zoomSmoother.current.step(Math.min(100, elapsed)), zoomX.current, zoomY.current);
|
|
42
87
|
clearTimeout(zoomSettle.current);
|
|
43
88
|
zoomSettle.current = setTimeout(() => {
|
|
44
|
-
|
|
89
|
+
model.endWheelZoom();
|
|
45
90
|
}, zoomSettleMs);
|
|
46
91
|
zoomFrame.current = zoomSmoother.current.idle
|
|
47
92
|
? undefined
|
|
@@ -53,29 +98,29 @@ export function useWheelScroll({ ref, onScrollX, onScrollY, onZoom, onZoomSettle
|
|
|
53
98
|
event.stopPropagation();
|
|
54
99
|
return;
|
|
55
100
|
}
|
|
56
|
-
//
|
|
57
|
-
//
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
101
|
+
// the dominant axis decides: a trackpad's vertical swipe carries a pixel
|
|
102
|
+
// or two of deltaX, which must not hold the page at the bottom row. A
|
|
103
|
+
// horizontal wheel stays taken at the edges, where the page would read
|
|
104
|
+
// it as a swipe back through history.
|
|
105
|
+
const { deltaX: dx, deltaY: dy } = event;
|
|
106
|
+
const vertical = Math.abs(dy) >= Math.abs(dx);
|
|
107
|
+
const latched = event.timeStamp - lastTaken.current < wheelLatchMs;
|
|
108
|
+
const takeY = y && dy !== 0 && (latched || canScrollY(model, dy) || !vertical);
|
|
109
|
+
const takeX = x && dx !== 0 && (!vertical || takeY);
|
|
110
|
+
if (takeX || takeY) {
|
|
111
|
+
if (takeY && vertical) {
|
|
112
|
+
lastTaken.current = event.timeStamp;
|
|
67
113
|
}
|
|
114
|
+
onWheelScroll?.(event);
|
|
115
|
+
deltaX.current += takeX ? event.deltaX : 0;
|
|
116
|
+
deltaY.current += takeY ? event.deltaY : 0;
|
|
68
117
|
if (!scheduled.current) {
|
|
69
118
|
scheduled.current = true;
|
|
70
119
|
requestAnimationFrame(() => {
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
if (onScrollY) {
|
|
76
|
-
onScrollY(-deltaY.current);
|
|
77
|
-
deltaY.current = 0;
|
|
78
|
-
}
|
|
120
|
+
model.doScrollX(-deltaX.current);
|
|
121
|
+
model.doScrollY(-deltaY.current);
|
|
122
|
+
deltaX.current = 0;
|
|
123
|
+
deltaY.current = 0;
|
|
79
124
|
scheduled.current = false;
|
|
80
125
|
});
|
|
81
126
|
}
|
|
@@ -92,59 +137,51 @@ export function useWheelScroll({ ref, onScrollX, onScrollY, onZoom, onZoomSettle
|
|
|
92
137
|
}
|
|
93
138
|
clearTimeout(zoomSettle.current);
|
|
94
139
|
};
|
|
95
|
-
}, [
|
|
96
|
-
ref,
|
|
97
|
-
onScrollX,
|
|
98
|
-
onScrollY,
|
|
99
|
-
onZoom,
|
|
100
|
-
onZoomSettle,
|
|
101
|
-
onWheelScroll,
|
|
102
|
-
scrollZoom,
|
|
103
|
-
]);
|
|
140
|
+
}, [ref, model, x, y, zoom, onWheelScroll]);
|
|
104
141
|
useEffect(() => {
|
|
105
|
-
if (
|
|
142
|
+
if (panPointer === undefined) {
|
|
106
143
|
return;
|
|
107
144
|
}
|
|
108
|
-
|
|
145
|
+
// a frame applies the distance from the last applied position to the
|
|
146
|
+
// newest one, so a move landing while a frame is pending is not dropped
|
|
147
|
+
function onMove(event) {
|
|
148
|
+
if (event.pointerId !== panPointer) {
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
109
151
|
event.preventDefault();
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
prevY.current = event.clientY;
|
|
121
|
-
});
|
|
122
|
-
}
|
|
152
|
+
latest.current = { x: event.clientX, y: event.clientY };
|
|
153
|
+
if (!panFrame.current) {
|
|
154
|
+
panFrame.current = true;
|
|
155
|
+
requestAnimationFrame(() => {
|
|
156
|
+
const to = latest.current;
|
|
157
|
+
model.doScrollX(x ? to.x - prev.current.x : 0);
|
|
158
|
+
model.doScrollY(y ? to.y - prev.current.y : 0);
|
|
159
|
+
prev.current = to;
|
|
160
|
+
panFrame.current = false;
|
|
161
|
+
});
|
|
123
162
|
}
|
|
124
163
|
}
|
|
125
|
-
function
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
164
|
+
function onUp(event) {
|
|
165
|
+
if (event.pointerId === panPointer) {
|
|
166
|
+
setPanPointer(undefined);
|
|
167
|
+
}
|
|
129
168
|
}
|
|
130
|
-
window.addEventListener('
|
|
131
|
-
window.addEventListener('
|
|
169
|
+
window.addEventListener('pointermove', onMove, true);
|
|
170
|
+
window.addEventListener('pointerup', onUp, true);
|
|
171
|
+
window.addEventListener('pointercancel', onUp, true);
|
|
132
172
|
return () => {
|
|
133
|
-
window.removeEventListener('
|
|
134
|
-
window.removeEventListener('
|
|
173
|
+
window.removeEventListener('pointermove', onMove, true);
|
|
174
|
+
window.removeEventListener('pointerup', onUp, true);
|
|
175
|
+
window.removeEventListener('pointercancel', onUp, true);
|
|
135
176
|
};
|
|
136
|
-
}, [
|
|
137
|
-
function
|
|
138
|
-
if (event.button === 0) {
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
177
|
+
}, [panPointer, model, x, y]);
|
|
178
|
+
function onPointerDown(event) {
|
|
179
|
+
if (event.button === 0 && event.isPrimary && panPointer === undefined) {
|
|
180
|
+
prev.current = { x: event.clientX, y: event.clientY };
|
|
181
|
+
latest.current = prev.current;
|
|
182
|
+
setPanPointer(event.pointerId);
|
|
142
183
|
}
|
|
143
184
|
}
|
|
144
|
-
|
|
145
|
-
event.preventDefault();
|
|
146
|
-
setMouseDragging(false);
|
|
147
|
-
}
|
|
148
|
-
return { onMouseDown, onMouseUp };
|
|
185
|
+
return { onPointerDown, touchAction: panTouchAction(model, axes) };
|
|
149
186
|
}
|
|
150
187
|
//# sourceMappingURL=useWheelScroll.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useWheelScroll.js","sourceRoot":"","sources":["../src/useWheelScroll.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAEnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"useWheelScroll.js","sourceRoot":"","sources":["../src/useWheelScroll.ts"],"names":[],"mappings":"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"}
|
package/dist/version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const version = "9.
|
|
1
|
+
export declare const version = "9.4.0";
|
package/dist/version.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export const version = '9.
|
|
1
|
+
export const version = '9.4.0';
|
|
2
2
|
//# sourceMappingURL=version.js.map
|
package/dist/viewerSnapshot.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { createJBrowseTheme } from '@jbrowse/core/ui/theme';
|
|
2
|
+
import { letterColors } from './scales.js';
|
|
2
3
|
export function colorSchemeSnapshot(scheme) {
|
|
3
4
|
return typeof scheme === 'string'
|
|
4
5
|
? { colorSchemeName: scheme }
|
|
5
6
|
: scheme
|
|
6
|
-
? { customColorScheme: scheme
|
|
7
|
+
? { customColorScheme: letterColors(scheme) }
|
|
7
8
|
: {};
|
|
8
9
|
}
|
|
9
10
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"viewerSnapshot.js","sourceRoot":"","sources":["../src/viewerSnapshot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAA;
|
|
1
|
+
{"version":3,"file":"viewerSnapshot.js","sourceRoot":"","sources":["../src/viewerSnapshot.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-msaview",
|
|
3
3
|
"author": "Colin",
|
|
4
|
-
"version": "9.
|
|
4
|
+
"version": "9.4.0",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"repository": {
|
|
@@ -50,10 +50,10 @@
|
|
|
50
50
|
},
|
|
51
51
|
"dependencies": {
|
|
52
52
|
"@gmod/newick": "^1.0.3",
|
|
53
|
-
"@jbrowse/svgcanvas": "9.
|
|
53
|
+
"@jbrowse/svgcanvas": "9.4.0",
|
|
54
54
|
"colord": "^2.10.0",
|
|
55
55
|
"flatbush": "^4.6.2",
|
|
56
|
-
"msa-parsers": "9.
|
|
56
|
+
"msa-parsers": "9.4.0"
|
|
57
57
|
},
|
|
58
58
|
"scripts": {
|
|
59
59
|
"clean": "rimraf dist bundle",
|
|
@@ -85,11 +85,12 @@ export default function DragHandle({
|
|
|
85
85
|
onMouseLeave={() => {
|
|
86
86
|
setHovered(false)
|
|
87
87
|
}}
|
|
88
|
-
|
|
88
|
+
onPointerDown={event => {
|
|
89
89
|
startDrag(event, getStart())
|
|
90
90
|
}}
|
|
91
91
|
style={{
|
|
92
92
|
position,
|
|
93
|
+
touchAction: 'none',
|
|
93
94
|
zIndex,
|
|
94
95
|
cursor: cursor(axis),
|
|
95
96
|
background: hovered ? fillHovered(theme) : fill(theme),
|
|
@@ -12,6 +12,7 @@ import { ThemeProvider } from '@mui/material/styles'
|
|
|
12
12
|
import { compareStructural, reaction, when } from 'mobx'
|
|
13
13
|
|
|
14
14
|
import MSAModelF from '../model.ts'
|
|
15
|
+
import { letterColors } from '../scales.ts'
|
|
15
16
|
import {
|
|
16
17
|
fileLocations,
|
|
17
18
|
resolveTheme,
|
|
@@ -57,8 +58,9 @@ export interface MSAViewerProps {
|
|
|
57
58
|
/** a URL the viewer fetches the GFF from; `gffFilehandle` wins */
|
|
58
59
|
gffUrl?: string
|
|
59
60
|
/**
|
|
60
|
-
* a scheme name from the built-in table, or `{
|
|
61
|
-
* letter that leaves every other letter uncolored
|
|
61
|
+
* a scheme name from the built-in table, or `{domain, range}`, a color per
|
|
62
|
+
* residue letter that leaves every other letter uncolored. The earlier
|
|
63
|
+
* `{map}` still reads
|
|
62
64
|
*/
|
|
63
65
|
colorScheme?: ColorScheme
|
|
64
66
|
height?: number
|
|
@@ -103,15 +105,16 @@ export interface MSAViewerProps {
|
|
|
103
105
|
/** extra fields per row name, such as a lineage or a host (see docs/layers.md) */
|
|
104
106
|
rowData?: RowDataInput
|
|
105
107
|
/**
|
|
106
|
-
* what the viewer's marks read from a table:
|
|
107
|
-
*
|
|
108
|
-
* `
|
|
108
|
+
* what the viewer's marks read from a table:
|
|
109
|
+
* `{channel, field, range?, domain?, title?}`, where `channel` is
|
|
110
|
+
* `tipLabel`, `rowTint` or `branch` over `rowData`, or `featureFill` or
|
|
111
|
+
* `featureLabel` over the annotations (see docs/layers.md)
|
|
109
112
|
*/
|
|
110
113
|
encodings?: Encoding[]
|
|
111
114
|
/**
|
|
112
115
|
* panels between the tree and the alignment, one cell per row:
|
|
113
|
-
* `{kind: 'strip', field,
|
|
114
|
-
* `rowData` field (see docs/layers.md)
|
|
116
|
+
* `{kind: 'strip', field, range?, domain?, title?, width?, header?}` colors
|
|
117
|
+
* each row by a `rowData` field (see docs/layers.md)
|
|
115
118
|
*/
|
|
116
119
|
rowPanels?: RowPanelSpec[]
|
|
117
120
|
/** draw the phylogenetic tree (default true); false leaves a labels-only gutter */
|
|
@@ -357,7 +360,7 @@ const syncedProps = [
|
|
|
357
360
|
if (typeof scheme === 'string') {
|
|
358
361
|
m.setColorSchemeName(scheme)
|
|
359
362
|
} else if (scheme) {
|
|
360
|
-
m.setCustomColorScheme(scheme
|
|
363
|
+
m.setCustomColorScheme(letterColors(scheme))
|
|
361
364
|
}
|
|
362
365
|
},
|
|
363
366
|
),
|
package/src/components/Track.tsx
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React, { lazy,
|
|
1
|
+
import React, { lazy, useRef, useState } from 'react'
|
|
2
2
|
|
|
3
3
|
import BaseTooltip from '@jbrowse/core/ui/BaseTooltip'
|
|
4
4
|
import { makeStyles } from '@jbrowse/core/util/tss-react'
|
|
@@ -153,13 +153,7 @@ const Track = observer(function ({
|
|
|
153
153
|
model: { height },
|
|
154
154
|
} = track
|
|
155
155
|
const ref = useRef<HTMLDivElement>(null)
|
|
156
|
-
|
|
157
|
-
(d: number) => {
|
|
158
|
-
model.doScrollX(d)
|
|
159
|
-
},
|
|
160
|
-
[model],
|
|
161
|
-
)
|
|
162
|
-
useWheelScroll({ ref, onScrollX })
|
|
156
|
+
useWheelScroll({ ref, model, axes: 'x' })
|
|
163
157
|
const { classes } = useStyles()
|
|
164
158
|
const { anchor, onMouseMove, onMouseDown, onMouseLeave } = useTrackHover({
|
|
165
159
|
model,
|
|
@@ -23,7 +23,7 @@ const VerticalScrollbar = observer(({ model }: { model: MsaViewModel }) => {
|
|
|
23
23
|
|
|
24
24
|
return (
|
|
25
25
|
<div
|
|
26
|
-
|
|
26
|
+
onPointerDown={event => {
|
|
27
27
|
if (event.button === 0 && event.target === event.currentTarget) {
|
|
28
28
|
const y =
|
|
29
29
|
event.clientY - event.currentTarget.getBoundingClientRect().top
|
|
@@ -2,7 +2,8 @@ import React, { useEffect } from 'react'
|
|
|
2
2
|
|
|
3
3
|
import useMeasure from '@jbrowse/core/util/useMeasure'
|
|
4
4
|
import Tune from '@mui/icons-material/Tune'
|
|
5
|
-
import {
|
|
5
|
+
import { Button, IconButton, Toolbar, Tooltip } from '@mui/material'
|
|
6
|
+
import AppBar from '@mui/material/AppBar'
|
|
6
7
|
import { observer } from 'mobx-react'
|
|
7
8
|
|
|
8
9
|
import StatusMessage from '../StatusMessage.tsx'
|
|
@@ -78,7 +78,7 @@ const Minimap = observer(function ({ model }: { model: MsaViewModel }) {
|
|
|
78
78
|
ref={ref}
|
|
79
79
|
width={barWidth}
|
|
80
80
|
height={barHeight}
|
|
81
|
-
|
|
81
|
+
onPointerDown={event => {
|
|
82
82
|
if (event.button === 0 && unit > 0) {
|
|
83
83
|
const x =
|
|
84
84
|
event.clientX - event.currentTarget.getBoundingClientRect().left
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React, {
|
|
1
|
+
import React, { useRef } from 'react'
|
|
2
2
|
|
|
3
3
|
import { observer } from 'mobx-react'
|
|
4
4
|
|
|
@@ -19,7 +19,6 @@ const MSACanvas = observer(function ({ model }: { model: MsaViewModel }) {
|
|
|
19
19
|
height,
|
|
20
20
|
msaCanvasWidth,
|
|
21
21
|
blocks2d,
|
|
22
|
-
scrollZoom,
|
|
23
22
|
scrollX,
|
|
24
23
|
scrollY,
|
|
25
24
|
zoomSnapshot,
|
|
@@ -33,36 +32,13 @@ const MSACanvas = observer(function ({ model }: { model: MsaViewModel }) {
|
|
|
33
32
|
? zoomSnapshotScale(model, zoomSnapshot)
|
|
34
33
|
: undefined
|
|
35
34
|
const ref = useRef<HTMLDivElement>(null)
|
|
36
|
-
const onScrollX = useCallback(
|
|
37
|
-
(d: number) => {
|
|
38
|
-
model.doScrollX(d)
|
|
39
|
-
},
|
|
40
|
-
[model],
|
|
41
|
-
)
|
|
42
|
-
const onScrollY = useCallback(
|
|
43
|
-
(d: number) => {
|
|
44
|
-
model.doScrollY(d)
|
|
45
|
-
},
|
|
46
|
-
[model],
|
|
47
|
-
)
|
|
48
|
-
const onZoom = useCallback(
|
|
49
|
-
(scaleFactor: number, offsetX: number, offsetY: number) => {
|
|
50
|
-
model.wheelZoomToPos(scaleFactor, offsetX, offsetY)
|
|
51
|
-
},
|
|
52
|
-
[model],
|
|
53
|
-
)
|
|
54
|
-
const onZoomSettle = useCallback(() => {
|
|
55
|
-
model.endWheelZoom()
|
|
56
|
-
}, [model])
|
|
57
35
|
const hint = useWheelZoomHint(model)
|
|
58
|
-
const {
|
|
36
|
+
const { onPointerDown, touchAction } = useWheelScroll({
|
|
59
37
|
ref,
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
onZoomSettle,
|
|
38
|
+
model,
|
|
39
|
+
axes: 'xy',
|
|
40
|
+
zoom: true,
|
|
64
41
|
onWheelScroll: hint.onWheelScroll,
|
|
65
|
-
scrollZoom,
|
|
66
42
|
})
|
|
67
43
|
|
|
68
44
|
return (
|
|
@@ -78,20 +54,23 @@ const MSACanvas = observer(function ({ model }: { model: MsaViewModel }) {
|
|
|
78
54
|
event.preventDefault()
|
|
79
55
|
}
|
|
80
56
|
}}
|
|
57
|
+
// a shifted press selects cells (useMsaBlockMouse), so it takes the
|
|
58
|
+
// focus Escape clears from, and leaves out the pan and the page's own
|
|
59
|
+
// text selection
|
|
81
60
|
onMouseDown={event => {
|
|
82
|
-
// a shifted press selects cells (useMsaBlockMouse), so it takes the
|
|
83
|
-
// focus Escape clears from, and leaves out the pan and the page's own
|
|
84
|
-
// text selection
|
|
85
61
|
if (event.shiftKey) {
|
|
86
62
|
event.preventDefault()
|
|
87
63
|
ref.current?.focus({ preventScroll: true })
|
|
88
|
-
} else {
|
|
89
|
-
onMouseDown(event)
|
|
90
64
|
}
|
|
91
65
|
}}
|
|
92
|
-
|
|
66
|
+
onPointerDown={event => {
|
|
67
|
+
if (!event.shiftKey) {
|
|
68
|
+
onPointerDown(event)
|
|
69
|
+
}
|
|
70
|
+
}}
|
|
93
71
|
style={{
|
|
94
72
|
position: 'relative',
|
|
73
|
+
touchAction,
|
|
95
74
|
height,
|
|
96
75
|
width: msaCanvasWidth,
|
|
97
76
|
overflow: 'hidden',
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React, {
|
|
1
|
+
import React, { useRef } from 'react'
|
|
2
2
|
|
|
3
3
|
import { observer } from 'mobx-react'
|
|
4
4
|
|
|
@@ -17,21 +17,19 @@ const RowPanel = observer(function ({
|
|
|
17
17
|
}) {
|
|
18
18
|
const ref = useRef<HTMLDivElement>(null)
|
|
19
19
|
const { height, blocksY, scrollY } = model
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
)
|
|
26
|
-
const { onMouseDown, onMouseUp } = useWheelScroll({ ref, onScrollY })
|
|
20
|
+
const { onPointerDown, touchAction } = useWheelScroll({
|
|
21
|
+
ref,
|
|
22
|
+
model,
|
|
23
|
+
axes: 'y',
|
|
24
|
+
})
|
|
27
25
|
|
|
28
26
|
return (
|
|
29
27
|
<div
|
|
30
28
|
ref={ref}
|
|
31
29
|
data-testid={`rowpanel_${panel.id}`}
|
|
32
|
-
|
|
33
|
-
onMouseUp={onMouseUp}
|
|
30
|
+
onPointerDown={onPointerDown}
|
|
34
31
|
style={{
|
|
32
|
+
touchAction,
|
|
35
33
|
height,
|
|
36
34
|
width: panel.width,
|
|
37
35
|
flexShrink: 0,
|
|
@@ -3,7 +3,8 @@ import React, { useState } from 'react'
|
|
|
3
3
|
import ArrowDropDown from '@mui/icons-material/ArrowDropDown'
|
|
4
4
|
import ArrowRight from '@mui/icons-material/ArrowRight'
|
|
5
5
|
import Close from '@mui/icons-material/Close'
|
|
6
|
-
import { Box,
|
|
6
|
+
import { Box, IconButton, Typography } from '@mui/material'
|
|
7
|
+
import ButtonBase from '@mui/material/ButtonBase'
|
|
7
8
|
import { observer } from 'mobx-react'
|
|
8
9
|
|
|
9
10
|
import { settingsPanelWidth } from '../../constants.ts'
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React, {
|
|
1
|
+
import React, { useRef } from 'react'
|
|
2
2
|
|
|
3
3
|
import { isAlive } from '@jbrowse/mobx-state-tree'
|
|
4
4
|
import { observer } from 'mobx-react'
|
|
@@ -20,13 +20,11 @@ const TreeCanvas = observer(function ({ model }: { model: MsaViewModel }) {
|
|
|
20
20
|
scrollY,
|
|
21
21
|
highResScaleFactor,
|
|
22
22
|
} = model
|
|
23
|
-
const
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
)
|
|
29
|
-
const { onMouseDown, onMouseUp } = useWheelScroll({ ref, onScrollY })
|
|
23
|
+
const { onPointerDown, touchAction } = useWheelScroll({
|
|
24
|
+
ref,
|
|
25
|
+
model,
|
|
26
|
+
axes: 'y',
|
|
27
|
+
})
|
|
30
28
|
|
|
31
29
|
const canvasWidth = effectiveTreeAreaWidth * highResScaleFactor
|
|
32
30
|
const canvasHeight = height * highResScaleFactor
|
|
@@ -44,9 +42,9 @@ const TreeCanvas = observer(function ({ model }: { model: MsaViewModel }) {
|
|
|
44
42
|
return (
|
|
45
43
|
<div
|
|
46
44
|
ref={ref}
|
|
47
|
-
|
|
48
|
-
onMouseUp={onMouseUp}
|
|
45
|
+
onPointerDown={onPointerDown}
|
|
49
46
|
style={{
|
|
47
|
+
touchAction,
|
|
50
48
|
height,
|
|
51
49
|
position: 'relative',
|
|
52
50
|
width: effectiveTreeAreaWidth,
|