2022-10-12 17:51:49 +00:00
|
|
|
import react, { useState } from 'react';
|
2022-10-13 12:39:03 +00:00
|
|
|
import './Map.css';
|
|
|
|
|
|
|
|
interface Point {
|
|
|
|
x: number;
|
|
|
|
y: number;
|
|
|
|
}
|
2022-10-12 17:51:49 +00:00
|
|
|
|
|
|
|
interface MouseHandlerProperties {
|
|
|
|
boardSize: number;
|
2022-10-13 12:39:03 +00:00
|
|
|
shift: Point;
|
|
|
|
addShift: (shift: Point) => void;
|
2022-10-12 17:51:49 +00:00
|
|
|
zoom: number;
|
2022-10-13 12:39:03 +00:00
|
|
|
addZoom: (zoomFactor: number, center: Point) => void;
|
2022-10-12 17:51:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
const MouseHandler: react.FC<MouseHandlerProperties> = (
|
|
|
|
props: MouseHandlerProperties
|
|
|
|
) => {
|
|
|
|
const initialMouseState = {
|
|
|
|
down: false,
|
|
|
|
starting: { x: -1, y: -1 },
|
|
|
|
timestamp: 0,
|
|
|
|
};
|
|
|
|
|
|
|
|
const [mouseState, setMouseState] = useState(initialMouseState);
|
|
|
|
|
2022-10-14 15:48:00 +00:00
|
|
|
// console.log('MouseHandler, mouseState: ' + JSON.stringify(mouseState));
|
|
|
|
// console.log(
|
|
|
|
// 'MouseHandler, shift: ' +
|
|
|
|
// JSON.stringify(props.shift) +
|
|
|
|
// ', zoom:' +
|
|
|
|
// props.zoom
|
|
|
|
// );
|
2022-10-12 17:51:49 +00:00
|
|
|
|
|
|
|
const genericHandler = (event: any) => {
|
2022-10-14 15:48:00 +00:00
|
|
|
// console.log(`Log - Event: ${event.type}`);
|
|
|
|
// if (event.pageX !== undefined) {
|
|
|
|
// console.log(
|
|
|
|
// `Mouse : ${event.pageX}, ${event.pageY}, target: ${event.target}`
|
|
|
|
// );
|
|
|
|
// console.log(
|
|
|
|
// `mouseState: ' ${JSON.stringify(mouseState)} (+${
|
|
|
|
// Date.now() - mouseState.timestamp
|
|
|
|
// }ms) `
|
|
|
|
// );
|
|
|
|
// return;
|
|
|
|
//}
|
2022-10-12 17:51:49 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
const mouseLeaveHandler = (event: any) => {
|
|
|
|
genericHandler(event);
|
|
|
|
setMouseState(initialMouseState);
|
|
|
|
};
|
|
|
|
|
|
|
|
const mouseDownHandler = (event: any) => {
|
|
|
|
genericHandler(event);
|
|
|
|
setMouseState({
|
|
|
|
down: true,
|
|
|
|
starting: { x: event.pageX, y: event.pageY },
|
|
|
|
timestamp: Date.now(),
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
const mouseUpHandler = (event: any) => {
|
|
|
|
genericHandler(event);
|
|
|
|
setMouseState(initialMouseState);
|
|
|
|
};
|
|
|
|
|
|
|
|
const mouseMoveHandler = (event: any) => {
|
|
|
|
if (mouseState.down && Date.now() - mouseState.timestamp > 5) {
|
|
|
|
genericHandler(event);
|
2022-10-14 15:48:00 +00:00
|
|
|
//console.log(
|
|
|
|
// `dispatch ${JSON.stringify({
|
|
|
|
// x: event.pageX - mouseState.starting.x,
|
|
|
|
// y: event.pageY - mouseState.starting.y,
|
|
|
|
// })}`
|
|
|
|
// );
|
2022-10-13 12:39:03 +00:00
|
|
|
props.addShift({
|
|
|
|
x: event.pageX - mouseState.starting.x,
|
|
|
|
y: event.pageY - mouseState.starting.y,
|
2022-10-12 17:51:49 +00:00
|
|
|
});
|
|
|
|
setMouseState({
|
|
|
|
down: true,
|
|
|
|
starting: {
|
|
|
|
x: event.pageX,
|
|
|
|
y: event.pageY,
|
|
|
|
},
|
|
|
|
timestamp: Date.now(),
|
|
|
|
});
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2022-10-12 18:00:22 +00:00
|
|
|
const doubleClickHandler = (event: any) => {
|
|
|
|
genericHandler(event);
|
2022-10-13 12:39:03 +00:00
|
|
|
props.addZoom(Math.SQRT2, { x: event.pageX, y: event.pageY });
|
2022-10-12 18:00:22 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
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
|
|
|
|
) {
|
2022-10-13 12:39:03 +00:00
|
|
|
props.addZoom(event.deltaY < 0 ? Math.SQRT2 : Math.SQRT1_2, {
|
|
|
|
x: event.pageX,
|
|
|
|
y: event.pageY,
|
|
|
|
});
|
2022-10-12 18:00:22 +00:00
|
|
|
|
|
|
|
setWheelState({
|
|
|
|
timestamp: Date.now(),
|
|
|
|
});
|
|
|
|
}
|
2022-10-12 17:51:49 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
return (
|
2022-10-14 15:48:00 +00:00
|
|
|
<div
|
|
|
|
className='handler'
|
2022-10-12 17:51:49 +00:00
|
|
|
onMouseDown={mouseDownHandler}
|
|
|
|
onMouseMove={mouseMoveHandler}
|
|
|
|
onMouseUp={mouseUpHandler}
|
|
|
|
onMouseLeave={mouseLeaveHandler}
|
|
|
|
onDoubleClick={doubleClickHandler}
|
2022-10-12 18:00:22 +00:00
|
|
|
onWheel={wheelEventHandler}
|
2022-10-13 12:39:03 +00:00
|
|
|
></div>
|
2022-10-12 17:51:49 +00:00
|
|
|
);
|
|
|
|
};
|
|
|
|
|
|
|
|
export default MouseHandler;
|