Media Editor: reset object position and rotation
This commit is contained in:
parent
d637985796
commit
d57cf86ffd
1 changed files with 56 additions and 1 deletions
|
@ -719,6 +719,7 @@ export const MediaEditor = ({
|
||||||
width: image.width,
|
width: image.width,
|
||||||
};
|
};
|
||||||
setImageState(newImageState);
|
setImageState(newImageState);
|
||||||
|
moveFabricObjectsForReset(fabricCanvas, imageState);
|
||||||
takeSnapshot('reset', newImageState);
|
takeSnapshot('reset', newImageState);
|
||||||
}}
|
}}
|
||||||
type="button"
|
type="button"
|
||||||
|
@ -740,7 +741,7 @@ export const MediaEditor = ({
|
||||||
|
|
||||||
const center = obj.getCenterPoint();
|
const center = obj.getCenterPoint();
|
||||||
|
|
||||||
obj.set('angle', ((obj.angle || 0) - 90) % 360);
|
obj.set('angle', ((obj.angle || 0) + 270) % 360);
|
||||||
|
|
||||||
obj.setPositionByOrigin(
|
obj.setPositionByOrigin(
|
||||||
new fabric.Point(center.y, imageState.width - center.x),
|
new fabric.Point(center.y, imageState.width - center.x),
|
||||||
|
@ -1131,6 +1132,60 @@ function moveFabricObjectsForCrop(
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function moveFabricObjectsForReset(
|
||||||
|
fabricCanvas: fabric.Canvas,
|
||||||
|
oldImageState: Readonly<ImageStateType>
|
||||||
|
): void {
|
||||||
|
fabricCanvas.getObjects().forEach(obj => {
|
||||||
|
if (obj.excludeFromExport) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let newCenterX: number;
|
||||||
|
let newCenterY: number;
|
||||||
|
|
||||||
|
// First, reset position changes caused by image rotation:
|
||||||
|
const oldCenter = obj.getCenterPoint();
|
||||||
|
const distanceFromRightEdge = oldImageState.width - oldCenter.x;
|
||||||
|
const distanceFromBottomEdge = oldImageState.height - oldCenter.y;
|
||||||
|
switch (oldImageState.angle % 360) {
|
||||||
|
case 0:
|
||||||
|
newCenterX = oldCenter.x;
|
||||||
|
newCenterY = oldCenter.y;
|
||||||
|
break;
|
||||||
|
case 90:
|
||||||
|
newCenterX = oldCenter.y;
|
||||||
|
newCenterY = distanceFromRightEdge;
|
||||||
|
break;
|
||||||
|
case 180:
|
||||||
|
newCenterX = distanceFromRightEdge;
|
||||||
|
newCenterY = distanceFromBottomEdge;
|
||||||
|
break;
|
||||||
|
case 270:
|
||||||
|
newCenterX = distanceFromBottomEdge;
|
||||||
|
newCenterY = oldCenter.x;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new Error('Unexpected angle');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Next, reset position changes caused by crop:
|
||||||
|
newCenterX += oldImageState.cropX;
|
||||||
|
newCenterY += oldImageState.cropY;
|
||||||
|
|
||||||
|
// It's important to set the angle *before* setting the position, because
|
||||||
|
// Fabric's positioning is affected by object angle.
|
||||||
|
obj.set('angle', (obj.angle || 0) - oldImageState.angle);
|
||||||
|
obj.setPositionByOrigin(
|
||||||
|
new fabric.Point(newCenterX, newCenterY),
|
||||||
|
'center',
|
||||||
|
'center'
|
||||||
|
);
|
||||||
|
|
||||||
|
obj.setCoords();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
function drawFabricBackgroundImage({
|
function drawFabricBackgroundImage({
|
||||||
fabricCanvas,
|
fabricCanvas,
|
||||||
image,
|
image,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue