feat: close mobile canvas menu on canvas pointerdown
This commit is contained in:
parent
790c9fd02e
commit
c96b0404ba
@ -2280,115 +2280,119 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
invalidateContextMenu = true;
|
invalidateContextMenu = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
private handleCanvasPointerDown = (
|
private handleCanvasPointerDown = withBatchedUpdates(
|
||||||
event: React.PointerEvent<HTMLCanvasElement>,
|
(event: React.PointerEvent<HTMLCanvasElement>) => {
|
||||||
) => {
|
event.persist();
|
||||||
event.persist();
|
|
||||||
|
|
||||||
// remove any active selection when we start to interact with canvas
|
if (this.state.openMenu === "canvas") {
|
||||||
// (mainly, we care about removing selection outside the component which
|
this.setState({ openMenu: null });
|
||||||
// would prevent our copy handling otherwise)
|
}
|
||||||
const selection = document.getSelection();
|
|
||||||
if (selection?.anchorNode) {
|
|
||||||
selection.removeAllRanges();
|
|
||||||
}
|
|
||||||
|
|
||||||
this.maybeOpenContextMenuAfterPointerDownOnTouchDevices(event);
|
// remove any active selection when we start to interact with canvas
|
||||||
this.maybeCleanupAfterMissingPointerUp(event);
|
// (mainly, we care about removing selection outside the component which
|
||||||
|
// would prevent our copy handling otherwise)
|
||||||
|
const selection = document.getSelection();
|
||||||
|
if (selection?.anchorNode) {
|
||||||
|
selection.removeAllRanges();
|
||||||
|
}
|
||||||
|
|
||||||
if (isPanning) {
|
this.maybeOpenContextMenuAfterPointerDownOnTouchDevices(event);
|
||||||
return;
|
this.maybeCleanupAfterMissingPointerUp(event);
|
||||||
}
|
|
||||||
|
|
||||||
this.setState({
|
if (isPanning) {
|
||||||
lastPointerDownWith: event.pointerType,
|
return;
|
||||||
cursorButton: "down",
|
}
|
||||||
});
|
|
||||||
this.savePointer(event.clientX, event.clientY, "down");
|
|
||||||
|
|
||||||
if (this.handleCanvasPanUsingWheelOrSpaceDrag(event)) {
|
this.setState({
|
||||||
return;
|
lastPointerDownWith: event.pointerType,
|
||||||
}
|
cursorButton: "down",
|
||||||
|
});
|
||||||
|
this.savePointer(event.clientX, event.clientY, "down");
|
||||||
|
|
||||||
// only handle left mouse button or touch
|
if (this.handleCanvasPanUsingWheelOrSpaceDrag(event)) {
|
||||||
if (
|
return;
|
||||||
event.button !== POINTER_BUTTON.MAIN &&
|
}
|
||||||
event.button !== POINTER_BUTTON.TOUCH
|
|
||||||
) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.updateGestureOnPointerDown(event);
|
// only handle left mouse button or touch
|
||||||
|
if (
|
||||||
|
event.button !== POINTER_BUTTON.MAIN &&
|
||||||
|
event.button !== POINTER_BUTTON.TOUCH
|
||||||
|
) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// don't select while panning
|
this.updateGestureOnPointerDown(event);
|
||||||
if (gesture.pointers.size > 1) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// State for the duration of a pointer interaction, which starts with a
|
// don't select while panning
|
||||||
// pointerDown event, ends with a pointerUp event (or another pointerDown)
|
if (gesture.pointers.size > 1) {
|
||||||
const pointerDownState = this.initialPointerDownState(event);
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (this.handleDraggingScrollBar(event, pointerDownState)) {
|
// State for the duration of a pointer interaction, which starts with a
|
||||||
return;
|
// pointerDown event, ends with a pointerUp event (or another pointerDown)
|
||||||
}
|
const pointerDownState = this.initialPointerDownState(event);
|
||||||
|
|
||||||
this.clearSelectionIfNotUsingSelection();
|
if (this.handleDraggingScrollBar(event, pointerDownState)) {
|
||||||
this.updateBindingEnabledOnPointerMove(event);
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (this.handleSelectionOnPointerDown(event, pointerDownState)) {
|
this.clearSelectionIfNotUsingSelection();
|
||||||
return;
|
this.updateBindingEnabledOnPointerMove(event);
|
||||||
}
|
|
||||||
|
|
||||||
if (this.state.elementType === "text") {
|
if (this.handleSelectionOnPointerDown(event, pointerDownState)) {
|
||||||
this.handleTextOnPointerDown(event, pointerDownState);
|
return;
|
||||||
return;
|
}
|
||||||
} else if (
|
|
||||||
this.state.elementType === "arrow" ||
|
if (this.state.elementType === "text") {
|
||||||
this.state.elementType === "line"
|
this.handleTextOnPointerDown(event, pointerDownState);
|
||||||
) {
|
return;
|
||||||
this.handleLinearElementOnPointerDown(
|
} else if (
|
||||||
event,
|
this.state.elementType === "arrow" ||
|
||||||
this.state.elementType,
|
this.state.elementType === "line"
|
||||||
|
) {
|
||||||
|
this.handleLinearElementOnPointerDown(
|
||||||
|
event,
|
||||||
|
this.state.elementType,
|
||||||
|
pointerDownState,
|
||||||
|
);
|
||||||
|
} else if (this.state.elementType === "freedraw") {
|
||||||
|
this.handleFreeDrawElementOnPointerDown(
|
||||||
|
event,
|
||||||
|
this.state.elementType,
|
||||||
|
pointerDownState,
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
this.createGenericElementOnPointerDown(
|
||||||
|
this.state.elementType,
|
||||||
|
pointerDownState,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const onPointerMove = this.onPointerMoveFromPointerDownHandler(
|
||||||
pointerDownState,
|
pointerDownState,
|
||||||
);
|
);
|
||||||
} else if (this.state.elementType === "freedraw") {
|
|
||||||
this.handleFreeDrawElementOnPointerDown(
|
const onPointerUp = this.onPointerUpFromPointerDownHandler(
|
||||||
event,
|
|
||||||
this.state.elementType,
|
|
||||||
pointerDownState,
|
pointerDownState,
|
||||||
);
|
);
|
||||||
} else {
|
|
||||||
this.createGenericElementOnPointerDown(
|
|
||||||
this.state.elementType,
|
|
||||||
pointerDownState,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
const onPointerMove = this.onPointerMoveFromPointerDownHandler(
|
const onKeyDown = this.onKeyDownFromPointerDownHandler(pointerDownState);
|
||||||
pointerDownState,
|
const onKeyUp = this.onKeyUpFromPointerDownHandler(pointerDownState);
|
||||||
);
|
|
||||||
|
|
||||||
const onPointerUp = this.onPointerUpFromPointerDownHandler(
|
lastPointerUp = onPointerUp;
|
||||||
pointerDownState,
|
|
||||||
);
|
|
||||||
|
|
||||||
const onKeyDown = this.onKeyDownFromPointerDownHandler(pointerDownState);
|
if (!this.state.viewModeEnabled) {
|
||||||
const onKeyUp = this.onKeyUpFromPointerDownHandler(pointerDownState);
|
window.addEventListener(EVENT.POINTER_MOVE, onPointerMove);
|
||||||
|
window.addEventListener(EVENT.POINTER_UP, onPointerUp);
|
||||||
lastPointerUp = onPointerUp;
|
window.addEventListener(EVENT.KEYDOWN, onKeyDown);
|
||||||
|
window.addEventListener(EVENT.KEYUP, onKeyUp);
|
||||||
if (!this.state.viewModeEnabled) {
|
pointerDownState.eventListeners.onMove = onPointerMove;
|
||||||
window.addEventListener(EVENT.POINTER_MOVE, onPointerMove);
|
pointerDownState.eventListeners.onUp = onPointerUp;
|
||||||
window.addEventListener(EVENT.POINTER_UP, onPointerUp);
|
pointerDownState.eventListeners.onKeyUp = onKeyUp;
|
||||||
window.addEventListener(EVENT.KEYDOWN, onKeyDown);
|
pointerDownState.eventListeners.onKeyDown = onKeyDown;
|
||||||
window.addEventListener(EVENT.KEYUP, onKeyUp);
|
}
|
||||||
pointerDownState.eventListeners.onMove = onPointerMove;
|
},
|
||||||
pointerDownState.eventListeners.onUp = onPointerUp;
|
);
|
||||||
pointerDownState.eventListeners.onKeyUp = onKeyUp;
|
|
||||||
pointerDownState.eventListeners.onKeyDown = onKeyDown;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
private maybeOpenContextMenuAfterPointerDownOnTouchDevices = (
|
private maybeOpenContextMenuAfterPointerDownOnTouchDevices = (
|
||||||
event: React.PointerEvent<HTMLCanvasElement>,
|
event: React.PointerEvent<HTMLCanvasElement>,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user