feat: limit zoom by translateCanvas

This commit is contained in:
Arnošt Pleskot 2023-06-30 17:24:20 +02:00
parent 75f8e904cc
commit a8158691b7
No known key found for this signature in database

View File

@ -2249,7 +2249,8 @@ class App extends React.Component<AppProps, AppState> {
/** decimal fraction between 0.1 (10% zoom) and 30 (3000% zoom) */ /** decimal fraction between 0.1 (10% zoom) and 30 (3000% zoom) */
value: number, value: number,
) => { ) => {
this.setState({ this.setState(
this.constrainScroll({
...getStateForZoom( ...getStateForZoom(
{ {
viewportX: this.state.width / 2 + this.state.offsetLeft, viewportX: this.state.width / 2 + this.state.offsetLeft,
@ -2258,7 +2259,8 @@ class App extends React.Component<AppProps, AppState> {
}, },
this.state, this.state,
), ),
}); }),
);
}; };
private cancelInProgresAnimation: (() => void) | null = null; private cancelInProgresAnimation: (() => void) | null = null;
@ -7663,9 +7665,13 @@ class App extends React.Component<AppProps, AppState> {
const scaledWidth = width / zoom.value; const scaledWidth = width / zoom.value;
const scaledHeight = height / zoom.value; const scaledHeight = height / zoom.value;
const maxZoomX = width / scrollConstraints.width;
const maxZoomY = height / scrollConstraints.height;
// Set default constrainedScrollX and constrainedScrollY values // Set default constrainedScrollX and constrainedScrollY values
let constrainedScrollX = scrollX; let constrainedScrollX = scrollX;
let constrainedScrollY = scrollY; let constrainedScrollY = scrollY;
let constrainedZoom = zoom;
// If scrollX is part of the nextState, constrain it within the scroll constraints // If scrollX is part of the nextState, constrain it within the scroll constraints
if ("scrollX" in nextState) { if ("scrollX" in nextState) {
@ -7689,10 +7695,19 @@ class App extends React.Component<AppProps, AppState> {
); );
} }
// If zoom is part of the nextState, constrain it within the scroll constraints
if ("zoom" in nextState) {
const zoomLimit = Math.min(maxZoomX, maxZoomY);
constrainedZoom = {
value: getNormalizedZoom(Math.max(nextState.zoom.value, zoomLimit)),
};
}
return { return {
...nextState, ...nextState,
scrollX: constrainedScrollX, scrollX: constrainedScrollX,
scrollY: constrainedScrollY, scrollY: constrainedScrollY,
zoom: constrainedZoom,
}; };
}; };
} }