Skip to content

Commit 8184732

Browse files
add space+drag to pan
1 parent 73496b3 commit 8184732

2 files changed

Lines changed: 57 additions & 1 deletion

File tree

editor-packages/editor-canvas/canvas-event-target/canvas-event-target.tsx

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,34 @@ export function CanvasEventTarget({
4747
}) {
4848
const interactionEventTargetRef = useRef();
4949

50+
const [isSpacebarPressed, setIsSpacebarPressed] = useState(false);
5051
let platform: PlatformName = "other";
5152
useEffect(() => {
5253
platform = getCurrentPlatform(window.navigator);
5354
});
5455

56+
useEffect(() => {
57+
const kd = (e) => {
58+
// if spacebar is pressed, enable panning wirt dragging.
59+
if (e.code === "Space") {
60+
setIsSpacebarPressed(true);
61+
}
62+
};
63+
const ku = (e) => {
64+
if (e.code === "Space") {
65+
setIsSpacebarPressed(false);
66+
}
67+
};
68+
69+
document.addEventListener("keydown", kd);
70+
document.addEventListener("keyup", ku);
71+
72+
return () => {
73+
document.removeEventListener("keydown", kd);
74+
document.removeEventListener("keyup", ku);
75+
};
76+
});
77+
5578
const transform_wheel_to_zoom = (s) => {
5679
return {
5780
...s,
@@ -65,6 +88,10 @@ export function CanvasEventTarget({
6588
onPinchStart: onZoomingStart,
6689
onPinchEnd: onZoomingEnd,
6790
onWheel: (s) => {
91+
if (s.altKey) {
92+
// altkey prevents panning the canvas.
93+
return;
94+
}
6895
if (s.ctrlKey) {
6996
// crtl key is also enabled on onPinch - we don't have to explicitly add linux & windows support for ctrl + scroll.
7097
return;
@@ -80,6 +107,24 @@ export function CanvasEventTarget({
80107
onWheelStart: onPanningStart,
81108
onWheelEnd: onPanningEnd,
82109
onMove: onPointerMove,
110+
onDragStart: (s) => {
111+
if (isSpacebarPressed) {
112+
onPanningStart(s as any);
113+
}
114+
},
115+
onDrag: (s) => {
116+
if (isSpacebarPressed) {
117+
onPanning({
118+
...s,
119+
delta: [-s.delta[0], -s.delta[1]],
120+
} as any);
121+
}
122+
},
123+
onDragEnd: (s) => {
124+
if (isSpacebarPressed) {
125+
onPanningEnd(s as any);
126+
}
127+
},
83128
onMouseDown: onPointerDown,
84129
onMoveStart: onPointerMoveStart,
85130
onMoveEnd: onPointerMoveEnd,
@@ -89,6 +134,9 @@ export function CanvasEventTarget({
89134

90135
return (
91136
<EventTargetContainer
137+
style={{
138+
cursor: isSpacebarPressed ? "grab" : "default",
139+
}}
92140
id="gesture-event-listener"
93141
ref={interactionEventTargetRef}
94142
/>

editor-packages/editor-canvas/canvas/canvas.tsx

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,14 +96,22 @@ export function Canvas({
9696
};
9797

9898
const onPointerDown: OnPointerDownHandler = (state) => {
99+
if (isPanning || isZooming) {
100+
return;
101+
}
99102
if (hoveringLayer) {
100103
onSelectNode(hoveringLayer);
101104
} else {
102105
onClearSelection();
103106
}
104107
};
105108

106-
const onPanning: OnPanningHandler = ({ delta: [x, y], wheeling }) => {
109+
const onPanning: OnPanningHandler = (s) => {
110+
const {
111+
delta: [x, y],
112+
wheeling,
113+
} = s;
114+
107115
setXY([xy[0] - x / zoom, xy[1] - y / zoom]);
108116
};
109117
const onZooming: OnZoomingHandler = (state) => {

0 commit comments

Comments
 (0)