From 7f4c8fe5915266f2194646c45dc5e944f89a149a Mon Sep 17 00:00:00 2001 From: evlist Date: Wed, 12 Oct 2022 20:00:22 +0200 Subject: [PATCH] Addind wheel events support --- svgmap/src/components/map/MouseHandler.tsx | 40 ++++++++++++++++++---- 1 file changed, 34 insertions(+), 6 deletions(-) diff --git a/svgmap/src/components/map/MouseHandler.tsx b/svgmap/src/components/map/MouseHandler.tsx index 3b627a7..32ab746 100644 --- a/svgmap/src/components/map/MouseHandler.tsx +++ b/svgmap/src/components/map/MouseHandler.tsx @@ -84,14 +84,41 @@ const MouseHandler: react.FC = ( } }; + const doScale = (x: number, y: number, factor: number) => { + setShift({ + x: shift.x + (shift.x - x) * (factor - 1), + y: shift.y + (shift.y - y) * (factor - 1), + }); + setZoom(zoom * factor); + }; + const doubleClickHandler = (event: any) => { genericHandler(event); - const newZoom = zoom * Math.SQRT2; - setShift({ - x: shift.x + (shift.x - event.pageX) * (newZoom / zoom - 1), - y: shift.y + (shift.y - event.pageY) * (newZoom / zoom - 1), - }); - setZoom(newZoom); + doScale(event.pageX, event.pageY, Math.SQRT2); + }; + + const initialWheelState = { + timestamp: 0, + }; + + const [wheelState, setWheelState] = useState(initialWheelState); + + const wheelEventHandler = (event: any) => { + genericHandler(event); + if ( + event.deltaMode === WheelEvent.DOM_DELTA_PIXEL && + Date.now() - wheelState.timestamp > 100 + ) { + doScale( + event.pageX, + event.pageY, + event.deltaY < 0 ? Math.SQRT2 : Math.SQRT1_2 + ); + + setWheelState({ + timestamp: Date.now(), + }); + } }; return ( @@ -101,6 +128,7 @@ const MouseHandler: react.FC = ( onMouseUp={mouseUpHandler} onMouseLeave={mouseLeaveHandler} onDoubleClick={doubleClickHandler} + onWheel={wheelEventHandler} >