fix: do not deselect when not zooming using touchscreen pinch (#5181)
* Do not deselect when zooming * do not deselect when trackpad zooming on Safari Co-authored-by: dwelle <luzar.david@gmail.com>
This commit is contained in:
parent
33bb23d2f3
commit
ef8559d060
@ -1921,23 +1921,47 @@ class App extends React.Component<AppProps, AppState> {
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* returns whether user is making a gesture with >= 2 fingers (points)
|
||||
* on o touch screen (not on a trackpad). Currently only relates to Darwin
|
||||
* (iOS/iPadOS,MacOS), but may work on other devices in the future if
|
||||
* GestureEvent is standardized.
|
||||
*/
|
||||
private isTouchScreenMultiTouchGesture = () => {
|
||||
// we don't want to deselect when using trackpad, and multi-point gestures
|
||||
// only work on touch screens, so checking for >= pointers means we're on a
|
||||
// touchscreen
|
||||
return gesture.pointers.size >= 2;
|
||||
};
|
||||
|
||||
// fires only on Safari
|
||||
private onGestureStart = withBatchedUpdates((event: GestureEvent) => {
|
||||
event.preventDefault();
|
||||
|
||||
// we only want to deselect on touch screens because user may have selected
|
||||
// elements by mistake while zooming
|
||||
if (this.isTouchScreenMultiTouchGesture()) {
|
||||
this.setState({
|
||||
selectedElementIds: {},
|
||||
});
|
||||
}
|
||||
gesture.initialScale = this.state.zoom.value;
|
||||
});
|
||||
|
||||
// fires only on Safari
|
||||
private onGestureChange = withBatchedUpdates((event: GestureEvent) => {
|
||||
event.preventDefault();
|
||||
|
||||
// onGestureChange only has zoom factor but not the center.
|
||||
// If we're on iPad or iPhone, then we recognize multi-touch and will
|
||||
// zoom in at the right location on the touchMove handler already.
|
||||
// On Macbook, we don't have those events so will zoom in at the
|
||||
// zoom in at the right location in the touchmove handler
|
||||
// (handleCanvasPointerMove).
|
||||
//
|
||||
// On Macbook trackpad, we don't have those events so will zoom in at the
|
||||
// current location instead.
|
||||
if (gesture.pointers.size >= 2) {
|
||||
//
|
||||
// As such, bail from this handler on touch devices.
|
||||
if (this.isTouchScreenMultiTouchGesture()) {
|
||||
return;
|
||||
}
|
||||
|
||||
@ -1956,12 +1980,16 @@ class App extends React.Component<AppProps, AppState> {
|
||||
}
|
||||
});
|
||||
|
||||
// fires only on Safari
|
||||
private onGestureEnd = withBatchedUpdates((event: GestureEvent) => {
|
||||
event.preventDefault();
|
||||
// reselect elements only on touch screens (see onGestureStart)
|
||||
if (this.isTouchScreenMultiTouchGesture()) {
|
||||
this.setState({
|
||||
previousSelectedElementIds: {},
|
||||
selectedElementIds: this.state.previousSelectedElementIds,
|
||||
});
|
||||
}
|
||||
gesture.initialScale = null;
|
||||
});
|
||||
|
||||
@ -5636,7 +5664,6 @@ class App extends React.Component<AppProps, AppState> {
|
||||
}
|
||||
|
||||
const { deltaX, deltaY } = event;
|
||||
const { selectedElementIds, previousSelectedElementIds } = this.state;
|
||||
// note that event.ctrlKey is necessary to handle pinch zooming
|
||||
if (event.metaKey || event.ctrlKey) {
|
||||
const sign = Math.sign(deltaY);
|
||||
@ -5646,14 +5673,6 @@ class App extends React.Component<AppProps, AppState> {
|
||||
if (absDelta > MAX_STEP) {
|
||||
delta = MAX_STEP * sign;
|
||||
}
|
||||
if (Object.keys(previousSelectedElementIds).length !== 0) {
|
||||
setTimeout(() => {
|
||||
this.setState({
|
||||
selectedElementIds: previousSelectedElementIds,
|
||||
previousSelectedElementIds: {},
|
||||
});
|
||||
}, 1000);
|
||||
}
|
||||
|
||||
let newZoom = this.state.zoom.value - delta / 100;
|
||||
// increase zoom steps the more zoomed-in we are (applies to >100% only)
|
||||
@ -5672,11 +5691,6 @@ class App extends React.Component<AppProps, AppState> {
|
||||
},
|
||||
state,
|
||||
),
|
||||
selectedElementIds: {},
|
||||
previousSelectedElementIds:
|
||||
Object.keys(selectedElementIds).length !== 0
|
||||
? selectedElementIds
|
||||
: previousSelectedElementIds,
|
||||
shouldCacheIgnoreZoom: true,
|
||||
}));
|
||||
this.resetShouldCacheIgnoreZoomDebounced();
|
||||
|
Loading…
x
Reference in New Issue
Block a user