diff --git a/newIDE/app/src/InstancesEditor/InstancesResizer.js b/newIDE/app/src/InstancesEditor/InstancesResizer.js index c6acb8d6b9ec..8dd8dcae6814 100644 --- a/newIDE/app/src/InstancesEditor/InstancesResizer.js +++ b/newIDE/app/src/InstancesEditor/InstancesResizer.js @@ -139,7 +139,8 @@ export default class InstancesResizer { deltaY: number, grabbingLocation: ResizeGrabbingLocation, proportional: boolean, - noGridSnap: boolean + noGridSnap: boolean, + centeredResize: boolean ) { this.totalDeltaX += deltaX; this.totalDeltaY += deltaY; @@ -210,14 +211,17 @@ export default class InstancesResizer { : roundedTotalDeltaX; const flippedTotalDeltaY = isTop ? -roundedTotalDeltaY : roundedTotalDeltaY; + // While rezising both sides, TotalDelta must be doubled + const altOffset = centeredResize ? 2 : 1; + let scaleX = initialSelectionAABB.width() !== 0 - ? (initialSelectionAABB.width() + flippedTotalDeltaX) / + ? (initialSelectionAABB.width() + flippedTotalDeltaX * altOffset) / initialSelectionAABB.width() : flippedTotalDeltaX; let scaleY = initialSelectionAABB.height() !== 0 - ? (initialSelectionAABB.height() + flippedTotalDeltaY) / + ? (initialSelectionAABB.height() + flippedTotalDeltaY * altOffset) / initialSelectionAABB.height() : flippedTotalDeltaY; let scaleZ = 1; @@ -348,12 +352,21 @@ export default class InstancesResizer { newWidth = scaleX * initialWidth; newHeight = scaleY * initialHeight; newDepth = scaleZ * initialDepth; - newX = - (initialInstanceOriginPosition.x - fixedPointX) * scaleX + - fixedPointX; - newY = - (initialInstanceOriginPosition.y - fixedPointY) * scaleY + - fixedPointY; + + if (centeredResize) { + // fixedPoint will not be needed since resize will be done in both sides + newX = + initialInstanceOriginPosition.x + (initialWidth - newWidth) / 2; + newY = + initialInstanceOriginPosition.y + (initialHeight - newHeight) / 2; + } else { + newX = + (initialInstanceOriginPosition.x - fixedPointX) * scaleX + + fixedPointX; + newY = + (initialInstanceOriginPosition.y - fixedPointY) * scaleY + + fixedPointY; + } } // After resizing, we round the new positions and dimensions to the nearest pixel. diff --git a/newIDE/app/src/InstancesEditor/index.js b/newIDE/app/src/InstancesEditor/index.js index 688dd596e74c..713aab1a4dca 100644 --- a/newIDE/app/src/InstancesEditor/index.js +++ b/newIDE/app/src/InstancesEditor/index.js @@ -977,7 +977,8 @@ export default class InstancesEditor extends Component { sceneDeltaY, grabbingLocation, proportional, - this.keyboardShortcuts.shouldNotSnapToGrid() + this.keyboardShortcuts.shouldNotSnapToGrid(), + this.keyboardShortcuts.shouldCenteredResize() ); }; diff --git a/newIDE/app/src/UI/KeyboardShortcuts/index.js b/newIDE/app/src/UI/KeyboardShortcuts/index.js index a62b72b73457..9cf54297b91e 100644 --- a/newIDE/app/src/UI/KeyboardShortcuts/index.js +++ b/newIDE/app/src/UI/KeyboardShortcuts/index.js @@ -118,6 +118,10 @@ export default class KeyboardShortcuts { return this._altPressed; } + shouldCenteredResize() { + return this._altPressed; + } + shouldMoveView() { return this._spacePressed || this._mouseMidButtonPressed; }