Skip to content

Commit cf86a86

Browse files
authored
Merge pull request #2462 from Kitware/fix-preventdefault
Fix preventDefault usage and pointer lock target
2 parents e2f87bd + f207f82 commit cf86a86

File tree

2 files changed

+43
-10
lines changed

2 files changed

+43
-10
lines changed

Sources/Rendering/Core/RenderWindowInteractor/index.d.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ export interface IRenderWindowInteractorInitialValues {
5757
lastFrameTime?: number;
5858
wheelTimeoutID?: number;
5959
moveTimeoutID?: number;
60+
preventDefaultOnPointerDown?: boolean;
61+
preventDefaultOnPointerUp?: boolean;
6062
}
6163

6264
interface IPosition {
@@ -151,6 +153,16 @@ export interface vtkRenderWindowInteractor extends vtkObject {
151153
*/
152154
getStillUpdateRate(): number;
153155

156+
/**
157+
* @default false
158+
*/
159+
getPreventDefaultOnPointerDown(): boolean;
160+
161+
/**
162+
* @default false
163+
*/
164+
getPreventDefaultOnPointerUp(): boolean;
165+
154166
/**
155167
*
156168
* @param {IRenderWindowInteractorEvent} callData
@@ -821,6 +833,22 @@ export interface vtkRenderWindowInteractor extends vtkObject {
821833
setPicker(picker: any): boolean;
822834

823835
/**
836+
* Set whether preventDefault is called on pointer down.
837+
* @param {Boolean} preventDefault
838+
*/
839+
setPreventDefaultOnPointerDown(preventDefault: boolean): boolean;
840+
841+
/**
842+
* Set whether preventDefault is called on pointer up.
843+
*
844+
* If pointerup occurs without a preceeding pointerdown, then
845+
* this does nothing.
846+
*
847+
* @param {Boolean} preventDefault
848+
*/
849+
setPreventDefaultOnPointerUp(preventDefault: boolean): boolean;
850+
851+
/**
824852
*
825853
* @param recognizeGestures
826854
*/

Sources/Rendering/Core/RenderWindowInteractor/index.js

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -68,11 +68,8 @@ const handledEvents = [
6868

6969
function preventDefault(event) {
7070
if (event.cancelable) {
71-
event.stopPropagation();
7271
event.preventDefault();
7372
}
74-
75-
return false;
7673
}
7774

7875
function pointerCacheToPositions(cache) {
@@ -211,7 +208,6 @@ function vtkRenderWindowInteractor(publicAPI, model) {
211208
publicAPI.bindEvents = (container) => {
212209
model.container = container;
213210
container.addEventListener('contextmenu', preventDefault);
214-
// container.addEventListener('click', preventDefault); // Avoid stopping event propagation
215211
container.addEventListener('wheel', publicAPI.handleWheel);
216212
container.addEventListener('DOMMouseScroll', publicAPI.handleWheel);
217213
container.addEventListener('pointerenter', publicAPI.handlePointerEnter);
@@ -244,7 +240,6 @@ function vtkRenderWindowInteractor(publicAPI, model) {
244240
publicAPI.unbindEvents = () => {
245241
const { container } = model;
246242
container.removeEventListener('contextmenu', preventDefault);
247-
// model.container.removeEventListener('click', preventDefault); // Avoid stopping event propagation
248243
container.removeEventListener('wheel', publicAPI.handleWheel);
249244
container.removeEventListener('DOMMouseScroll', publicAPI.handleWheel);
250245
container.removeEventListener('pointerenter', publicAPI.handlePointerEnter);
@@ -315,7 +310,9 @@ function vtkRenderWindowInteractor(publicAPI, model) {
315310
// ignore events from extra mouse buttons such as `back` and `forward`
316311
return;
317312
}
318-
preventDefault(event);
313+
if (model.preventDefaultOnPointerDown) {
314+
preventDefault(event);
315+
}
319316

320317
if (event.target.hasPointerCapture(event.pointerId)) {
321318
event.target.releasePointerCapture(event.pointerId);
@@ -345,7 +342,9 @@ function vtkRenderWindowInteractor(publicAPI, model) {
345342

346343
publicAPI.handlePointerUp = (event) => {
347344
if (pointerCache.has(event.pointerId)) {
348-
preventDefault(event);
345+
if (model.preventDefaultOnPointerUp) {
346+
preventDefault(event);
347+
}
349348

350349
pointerCache.delete(event.pointerId);
351350
model.container.releasePointerCapture(event.pointerId);
@@ -422,15 +421,17 @@ function vtkRenderWindowInteractor(publicAPI, model) {
422421

423422
//----------------------------------------------------------------------
424423
publicAPI.requestPointerLock = () => {
425-
const canvas = publicAPI.getView().getCanvas();
426-
canvas.requestPointerLock();
424+
if (model.container) {
425+
model.container.requestPointerLock();
426+
}
427427
};
428428

429429
//----------------------------------------------------------------------
430430
publicAPI.exitPointerLock = () => document.exitPointerLock();
431431

432432
//----------------------------------------------------------------------
433-
publicAPI.isPointerLocked = () => !!document.pointerLockElement;
433+
publicAPI.isPointerLocked = () =>
434+
!!model.container && document.pointerLockElement === model.container;
434435

435436
//----------------------------------------------------------------------
436437
publicAPI.handlePointerLockChange = () => {
@@ -1140,6 +1141,8 @@ const DEFAULT_VALUES = {
11401141
wheelTimeoutID: 0,
11411142
moveTimeoutID: 0,
11421143
lastGamepadValues: {},
1144+
preventDefaultOnPointerDown: false,
1145+
preventDefaultOnPointerUp: false,
11431146
};
11441147

11451148
// ----------------------------------------------------------------------------
@@ -1177,6 +1180,8 @@ export function extend(publicAPI, model, initialValues = {}) {
11771180
'desiredUpdateRate',
11781181
'stillUpdateRate',
11791182
'picker',
1183+
'preventDefaultOnPointerDown',
1184+
'preventDefaultOnPointerUp',
11801185
]);
11811186
macro.moveToProtected(publicAPI, model, ['view']);
11821187

0 commit comments

Comments
 (0)