|  | @@ -99,6 +99,7 @@ import { mutateElement, newElementWith } from "../element/mutateElement";
 | 
	
		
			
				|  |  |  import { invalidateShapeForElement } from "../renderer/renderElement";
 | 
	
		
			
				|  |  |  import { unstable_batchedUpdates } from "react-dom";
 | 
	
		
			
				|  |  |  import { SceneStateCallbackRemover } from "../scene/globalScene";
 | 
	
		
			
				|  |  | +import { rescalePoints } from "../points";
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  function withBatchedUpdates<
 | 
	
		
			
				|  |  |    TFunction extends ((event: any) => void) | (() => void)
 | 
	
	
		
			
				|  | @@ -1801,89 +1802,68 @@ export class App extends React.Component<any, AppState> {
 | 
	
		
			
				|  |  |                }
 | 
	
		
			
				|  |  |                break;
 | 
	
		
			
				|  |  |              case "n": {
 | 
	
		
			
				|  |  | -              let points;
 | 
	
		
			
				|  |  | -              if (element.points.length > 0) {
 | 
	
		
			
				|  |  | -                const len = element.points.length;
 | 
	
		
			
				|  |  | -                points = [...element.points].sort((a, b) => a[1] - b[1]) as [
 | 
	
		
			
				|  |  | -                  number,
 | 
	
		
			
				|  |  | -                  number,
 | 
	
		
			
				|  |  | -                ][];
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -                for (let i = 1; i < points.length; ++i) {
 | 
	
		
			
				|  |  | -                  const pnt = points[i];
 | 
	
		
			
				|  |  | -                  pnt[1] -= deltaY / (len - i);
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | +              const height = element.height - deltaY;
 | 
	
		
			
				|  |  | +              if (height <= 0) {
 | 
	
		
			
				|  |  | +                break;
 | 
	
		
			
				|  |  |                }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                mutateElement(element, {
 | 
	
		
			
				|  |  | -                height: element.height - deltaY,
 | 
	
		
			
				|  |  | +                height,
 | 
	
		
			
				|  |  |                  y: element.y + deltaY,
 | 
	
		
			
				|  |  | -                points,
 | 
	
		
			
				|  |  | +                points:
 | 
	
		
			
				|  |  | +                  element.points.length > 0
 | 
	
		
			
				|  |  | +                    ? rescalePoints(1, height, element.points)
 | 
	
		
			
				|  |  | +                    : undefined,
 | 
	
		
			
				|  |  |                });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |                break;
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |              case "w": {
 | 
	
		
			
				|  |  | -              let points;
 | 
	
		
			
				|  |  | -              if (element.points.length > 0) {
 | 
	
		
			
				|  |  | -                const len = element.points.length;
 | 
	
		
			
				|  |  | -                points = [...element.points].sort((a, b) => a[0] - b[0]) as [
 | 
	
		
			
				|  |  | -                  number,
 | 
	
		
			
				|  |  | -                  number,
 | 
	
		
			
				|  |  | -                ][];
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -                for (let i = 0; i < points.length; ++i) {
 | 
	
		
			
				|  |  | -                  const pnt = points[i];
 | 
	
		
			
				|  |  | -                  pnt[0] -= deltaX / (len - i);
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | +              const width = element.width - deltaX;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +              if (width <= 0) {
 | 
	
		
			
				|  |  | +                // Someday we should implement logic to flip the shape. But for now, just stop.
 | 
	
		
			
				|  |  | +                break;
 | 
	
		
			
				|  |  |                }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                mutateElement(element, {
 | 
	
		
			
				|  |  | -                width: element.width - deltaX,
 | 
	
		
			
				|  |  | +                width,
 | 
	
		
			
				|  |  |                  x: element.x + deltaX,
 | 
	
		
			
				|  |  | -                points,
 | 
	
		
			
				|  |  | +                points:
 | 
	
		
			
				|  |  | +                  element.points.length > 0
 | 
	
		
			
				|  |  | +                    ? rescalePoints(0, width, element.points)
 | 
	
		
			
				|  |  | +                    : undefined,
 | 
	
		
			
				|  |  |                });
 | 
	
		
			
				|  |  |                break;
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |              case "s": {
 | 
	
		
			
				|  |  | -              let points;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -              if (element.points.length > 0) {
 | 
	
		
			
				|  |  | -                const len = element.points.length;
 | 
	
		
			
				|  |  | -                points = [...element.points].sort((a, b) => a[1] - b[1]) as [
 | 
	
		
			
				|  |  | -                  number,
 | 
	
		
			
				|  |  | -                  number,
 | 
	
		
			
				|  |  | -                ][];
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -                for (let i = 1; i < points.length; ++i) {
 | 
	
		
			
				|  |  | -                  const pnt = points[i];
 | 
	
		
			
				|  |  | -                  pnt[1] += deltaY / (len - i);
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | +              const height = element.height + deltaY;
 | 
	
		
			
				|  |  | +              if (height <= 0) {
 | 
	
		
			
				|  |  | +                break;
 | 
	
		
			
				|  |  |                }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                mutateElement(element, {
 | 
	
		
			
				|  |  | -                height: element.height + deltaY,
 | 
	
		
			
				|  |  | -                points,
 | 
	
		
			
				|  |  | +                height,
 | 
	
		
			
				|  |  | +                points:
 | 
	
		
			
				|  |  | +                  element.points.length > 0
 | 
	
		
			
				|  |  | +                    ? rescalePoints(1, height, element.points)
 | 
	
		
			
				|  |  | +                    : undefined,
 | 
	
		
			
				|  |  |                });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |                break;
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |              case "e": {
 | 
	
		
			
				|  |  | -              let points;
 | 
	
		
			
				|  |  | -              if (element.points.length > 0) {
 | 
	
		
			
				|  |  | -                const len = element.points.length;
 | 
	
		
			
				|  |  | -                points = [...element.points].sort((a, b) => a[0] - b[0]) as [
 | 
	
		
			
				|  |  | -                  number,
 | 
	
		
			
				|  |  | -                  number,
 | 
	
		
			
				|  |  | -                ][];
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -                for (let i = 1; i < points.length; ++i) {
 | 
	
		
			
				|  |  | -                  const pnt = points[i];
 | 
	
		
			
				|  |  | -                  pnt[0] += deltaX / (len - i);
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | +              const width = element.width + deltaX;
 | 
	
		
			
				|  |  | +              if (width <= 0) {
 | 
	
		
			
				|  |  | +                break;
 | 
	
		
			
				|  |  |                }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                mutateElement(element, {
 | 
	
		
			
				|  |  | -                width: element.width + deltaX,
 | 
	
		
			
				|  |  | -                points,
 | 
	
		
			
				|  |  | +                width,
 | 
	
		
			
				|  |  | +                points:
 | 
	
		
			
				|  |  | +                  element.points.length > 0
 | 
	
		
			
				|  |  | +                    ? rescalePoints(0, width, element.points)
 | 
	
		
			
				|  |  | +                    : undefined,
 | 
	
		
			
				|  |  |                });
 | 
	
		
			
				|  |  |                break;
 | 
	
		
			
				|  |  |              }
 |