@projectstorm/react-canvas-core
Version:
52 lines • 2.87 kB
JavaScript
import { Action, InputType } from '../core-actions/Action';
export class PanAndZoomCanvasAction extends Action {
constructor(options = {}) {
super({
type: InputType.MOUSE_WHEEL,
fire: (actionEvent) => {
const { event } = actionEvent;
// we can block layer rendering because we are only targeting the transforms
for (let layer of this.engine.getModel().getLayers()) {
layer.allowRepaint(false);
}
const model = this.engine.getModel();
event.stopPropagation();
if (event.ctrlKey) {
// Pinch and zoom gesture
const oldZoomFactor = this.engine.getModel().getZoomLevel() / 100;
let scrollDelta = options.inverseZoom ? event.deltaY : -event.deltaY;
scrollDelta /= 3;
if (model.getZoomLevel() + scrollDelta > 10) {
model.setZoomLevel(model.getZoomLevel() + scrollDelta);
}
const zoomFactor = model.getZoomLevel() / 100;
const boundingRect = event.currentTarget.getBoundingClientRect();
const clientWidth = boundingRect.width;
const clientHeight = boundingRect.height;
// compute difference between rect before and after scroll
const widthDiff = clientWidth * zoomFactor - clientWidth * oldZoomFactor;
const heightDiff = clientHeight * zoomFactor - clientHeight * oldZoomFactor;
// compute mouse coords relative to canvas
const clientX = event.clientX - boundingRect.left;
const clientY = event.clientY - boundingRect.top;
// compute width and height increment factor
const xFactor = (clientX - model.getOffsetX()) / oldZoomFactor / clientWidth;
const yFactor = (clientY - model.getOffsetY()) / oldZoomFactor / clientHeight;
model.setOffset(model.getOffsetX() - widthDiff * xFactor, model.getOffsetY() - heightDiff * yFactor);
}
else {
// Pan gesture
let yDelta = options.inverseZoom ? -event.deltaY : event.deltaY;
let xDelta = options.inverseZoom ? -event.deltaX : event.deltaX;
model.setOffset(model.getOffsetX() - xDelta, model.getOffsetY() - yDelta);
}
this.engine.repaintCanvas();
// re-enable rendering
for (let layer of this.engine.getModel().getLayers()) {
layer.allowRepaint(true);
}
}
});
}
}
//# sourceMappingURL=PanAndZoomCanvasAction.js.map