@@ -9,6 +9,10 @@ import type {
99
1010export type OnPanningHandler = Handler < "wheel" , WheelEvent > ;
1111
12+ export type OnPanningStartHandler = ( ) => void ;
13+
14+ export type OnPanningEndHandler = ( ) => void ;
15+
1216export type OnZoomingHandler = Handler <
1317 "pinch" ,
1418 WheelEvent | PointerEvent | TouchEvent | WebKitGestureEvent
@@ -45,8 +49,8 @@ export function CanvasEventTarget({
4549 {
4650 onZoomToFit ?: ( ) => void ;
4751 onPanning : OnPanningHandler ;
48- onPanningStart : OnPanningHandler ;
49- onPanningEnd : OnPanningHandler ;
52+ onPanningStart : OnPanningStartHandler ;
53+ onPanningEnd : OnPanningEndHandler ;
5054 onZooming : OnZoomingHandler ;
5155 onZoomingStart : OnZoomingHandler ;
5256 onZoomingEnd : OnZoomingHandler ;
@@ -64,37 +68,68 @@ export function CanvasEventTarget({
6468 const interactionEventTargetRef = useRef ( ) ;
6569
6670 const [ isSpacebarPressed , setIsSpacebarPressed ] = useState ( false ) ;
71+ const [ isAuxPressed , setIsAuxPressed ] = useState ( false ) ;
72+
73+ const panningMetaKeyPressed = isSpacebarPressed || isAuxPressed ;
74+
6775 let platform : PlatformName = "other" ;
6876 useEffect ( ( ) => {
6977 platform = getCurrentPlatform ( window . navigator ) ;
7078 } ) ;
7179
7280 useEffect ( ( ) => {
7381 const kd = ( e ) => {
74- // if spacebar is pressed, enable panning wirt dragging.
82+ // if spacebar is pressed, enable panning with dragging.
7583 if ( e . code === "Space" ) {
7684 setIsSpacebarPressed ( true ) ;
7785 }
86+
7887 // if shift + 0
7988 else if ( e . code === "Digit0" && e . shiftKey ) {
8089 onZoomToFit ?.( ) ;
8190 }
8291 } ;
8392 const ku = ( e ) => {
93+ // space bar
8494 if ( e . code === "Space" ) {
8595 setIsSpacebarPressed ( false ) ;
8696 }
8797 } ;
98+ const md = ( e ) => {
99+ // mouse weehl (physical) - as well as space bar, mouse wheel + drag will enable panning.
100+ if ( e . button === 1 ) {
101+ setIsAuxPressed ( true ) ;
102+ }
103+ } ;
104+
105+ const mu = ( e ) => {
106+ // mouse wheel (physical)
107+ if ( e . button === 1 ) {
108+ setIsAuxPressed ( false ) ;
109+ }
110+ } ;
88111
89112 document . addEventListener ( "keydown" , kd ) ;
90113 document . addEventListener ( "keyup" , ku ) ;
114+ document . addEventListener ( "mousedown" , md ) ;
115+ document . addEventListener ( "mouseup" , mu ) ;
91116
92117 return ( ) => {
93118 document . removeEventListener ( "keydown" , kd ) ;
94119 document . removeEventListener ( "keyup" , ku ) ;
120+ document . removeEventListener ( "mousedown" , md ) ;
121+ document . removeEventListener ( "mouseup" , mu ) ;
95122 } ;
96123 } , [ ] ) ;
97124
125+ useEffect ( ( ) => {
126+ if ( isAuxPressed ) {
127+ onPanningStart ?.( ) ;
128+ } else {
129+ onPanningEnd ?.( ) ;
130+ }
131+ } , [ isAuxPressed ] ) ;
132+
98133 const transform_wheel_to_zoom = ( s ) => {
99134 return {
100135 ...s ,
@@ -148,18 +183,30 @@ export function CanvasEventTarget({
148183 } ,
149184 onWheelStart : ( s ) => {
150185 set_first_wheel_event ( s ) ;
151- onPanningStart ( s ) ;
186+ onPanningStart ( ) ;
152187 s . event . stopPropagation ( ) ;
153188 s . event . preventDefault ( ) ;
154189 } ,
155190 onWheelEnd : ( s ) => {
156191 set_first_wheel_event ( undefined ) ;
157- onPanningEnd ( s ) ;
192+ onPanningEnd ( ) ;
193+ } ,
194+ onMove : ( s ) => {
195+ if ( isAuxPressed ) {
196+ // @ts -ignore
197+ onPanning ( {
198+ ...s ,
199+ // reverse delta
200+ delta : [ - s . delta [ 0 ] , - s . delta [ 1 ] ] ,
201+ } ) ;
202+ return ;
203+ } else {
204+ onPointerMove ( s ) ;
205+ }
158206 } ,
159- onMove : onPointerMove ,
160207 onDragStart : ( s ) => {
161- if ( isSpacebarPressed ) {
162- onPanningStart ( s as any ) ;
208+ if ( panningMetaKeyPressed ) {
209+ onPanningStart ( ) ;
163210 return ;
164211 }
165212
@@ -169,7 +216,7 @@ export function CanvasEventTarget({
169216 }
170217 } ,
171218 onDrag : ( s ) => {
172- if ( isSpacebarPressed ) {
219+ if ( panningMetaKeyPressed ) {
173220 onPanning ( {
174221 ...s ,
175222 delta : [ - s . delta [ 0 ] , - s . delta [ 1 ] ] ,
@@ -184,8 +231,8 @@ export function CanvasEventTarget({
184231 onDrag ( s ) ;
185232 } ,
186233 onDragEnd : ( s ) => {
187- if ( isSpacebarPressed ) {
188- onPanningEnd ( s as any ) ;
234+ if ( panningMetaKeyPressed ) {
235+ onPanningEnd ( ) ;
189236 return ;
190237 }
191238
@@ -214,7 +261,7 @@ export function CanvasEventTarget({
214261 inset : 0 ,
215262 overflow : "hidden" ,
216263 touchAction : "none" ,
217- cursor : isSpacebarPressed ? "grab" : cursor ,
264+ cursor : panningMetaKeyPressed ? "grab" : cursor ,
218265 userSelect : "none" ,
219266 WebkitUserSelect : "none" ,
220267 } }
0 commit comments