Skip to content

Commit e5bf9a7

Browse files
committed
feat: support scroll wheel panning
This is similar to tools like figma, where the scroll wheel pans the view and scroll is only done if the control key is pressed. New bindings: scroll wheel: pan y shift + scroll wheel: pan x ctrl + scroll wheel: zoom
1 parent 402e40a commit e5bf9a7

File tree

1 file changed

+37
-18
lines changed

1 file changed

+37
-18
lines changed

src/components/EditorCanvas/Canvas.jsx

+37-18
Original file line numberDiff line numberDiff line change
@@ -439,24 +439,43 @@ export default function Canvas() {
439439
"wheel",
440440
(e) => {
441441
e.preventDefault();
442-
// How "eager" the viewport is to
443-
// center the cursor's coordinates
444-
const eagernessFactor = 0.05;
445-
setTransform((prev) => ({
446-
pan: {
447-
x:
448-
prev.pan.x -
449-
(pointer.spaces.diagram.x - prev.pan.x) *
450-
eagernessFactor *
451-
Math.sign(e.deltaY),
452-
y:
453-
prev.pan.y -
454-
(pointer.spaces.diagram.y - prev.pan.y) *
455-
eagernessFactor *
456-
Math.sign(e.deltaY),
457-
},
458-
zoom: e.deltaY <= 0 ? prev.zoom * 1.05 : prev.zoom / 1.05,
459-
}));
442+
443+
if (e.ctrlKey) {
444+
// How "eager" the viewport is to
445+
// center the cursor's coordinates
446+
const eagernessFactor = 0.05;
447+
setTransform((prev) => ({
448+
pan: {
449+
x:
450+
prev.pan.x -
451+
(pointer.spaces.diagram.x - prev.pan.x) *
452+
eagernessFactor *
453+
Math.sign(e.deltaY),
454+
y:
455+
prev.pan.y -
456+
(pointer.spaces.diagram.y - prev.pan.y) *
457+
eagernessFactor *
458+
Math.sign(e.deltaY),
459+
},
460+
zoom: e.deltaY <= 0 ? prev.zoom * 1.05 : prev.zoom / 1.05,
461+
}));
462+
} else if (e.shiftKey) {
463+
setTransform((prev) => ({
464+
...prev,
465+
pan: {
466+
...prev.pan,
467+
x: prev.pan.x + e.deltaY / prev.zoom,
468+
},
469+
}));
470+
} else {
471+
setTransform((prev) => ({
472+
...prev,
473+
pan: {
474+
...prev.pan,
475+
y: prev.pan.y + e.deltaY / prev.zoom,
476+
},
477+
}));
478+
}
460479
},
461480
canvasRef,
462481
{ passive: false },

0 commit comments

Comments
 (0)