Skip to content

Commit

Permalink
fix: scale font correctly when using shift (#5935)
Browse files Browse the repository at this point in the history
* fix: scale font correctly when using shift

* fix

* Empty-Commit

* Add spec

* fix
  • Loading branch information
ad1992 committed Nov 30, 2022
1 parent 88b2f47 commit 66bbfda
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 3 deletions.
14 changes: 12 additions & 2 deletions src/element/resizeElements.ts
Expand Up @@ -20,6 +20,7 @@ import {
getCommonBoundingBox,
} from "./bounds";
import {
isBoundToContainer,
isFreeDrawElement,
isLinearElement,
isTextElement,
Expand All @@ -39,9 +40,11 @@ import {
getApproxMinLineWidth,
getBoundTextElement,
getBoundTextElementId,
getContainerElement,
handleBindTextResize,
measureText,
} from "./textElement";
import { getMaxContainerWidth } from "./newElement";

export const normalizeAngle = (angle: number): number => {
if (angle >= 2 * Math.PI) {
Expand Down Expand Up @@ -182,14 +185,21 @@ const measureFontSizeFromWH = (
nextHeight: number,
): { size: number; baseline: number } | null => {
// We only use width to scale font on resize
const nextFontSize = element.fontSize * (nextWidth / element.width);
let width = element.width;

const hasContainer = isBoundToContainer(element);
if (hasContainer) {
const container = getContainerElement(element)!;
width = getMaxContainerWidth(container);
}
const nextFontSize = element.fontSize * (nextWidth / width);
if (nextFontSize < MIN_FONT_SIZE) {
return null;
}
const metrics = measureText(
element.text,
getFontString({ fontSize: nextFontSize, fontFamily: element.fontFamily }),
element.containerId ? element.width : null,
hasContainer ? width : null,
);
return {
size: nextFontSize,
Expand Down
22 changes: 22 additions & 0 deletions src/element/textWysiwyg.test.tsx
Expand Up @@ -1099,5 +1099,27 @@ describe("textWysiwyg", () => {
{ id: text.id, type: "text" },
]);
});

it("should scale font size correctly when resizing using shift", async () => {
Keyboard.keyPress(KEYS.ENTER);

const editor = document.querySelector(
".excalidraw-textEditorContainer > textarea",
) as HTMLTextAreaElement;
await new Promise((r) => setTimeout(r, 0));
fireEvent.change(editor, { target: { value: "Hello" } });
editor.blur();
const textElement = h.elements[1] as ExcalidrawTextElement;
expect(rectangle.width).toBe(90);
expect(rectangle.height).toBe(75);
expect(textElement.fontSize).toBe(20);

resize(rectangle, "ne", [rectangle.x + 100, rectangle.y - 50], {
shift: true,
});
expect(rectangle.width).toBe(200);
expect(rectangle.height).toBe(166.66666666666669);
expect(textElement.fontSize).toBe(47.5);
});
});
});
5 changes: 4 additions & 1 deletion src/element/typeChecks.ts
Expand Up @@ -139,6 +139,9 @@ export const isBoundToContainer = (
element: ExcalidrawElement | null,
): element is ExcalidrawTextElementWithContainer => {
return (
element !== null && isTextElement(element) && element.containerId !== null
element !== null &&
"containerId" in element &&
element.containerId !== null &&
isTextElement(element)
);
};

2 comments on commit 66bbfda

@vercel
Copy link

@vercel vercel bot commented on 66bbfda Nov 30, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Successfully deployed to the following URLs:

excalidraw-package-example – ./src/packages/excalidraw

excalidraw-package-example.vercel.app
excalidraw-package-example-excalidraw.vercel.app
excalidraw-package-example-git-master-excalidraw.vercel.app

@vercel
Copy link

@vercel vercel bot commented on 66bbfda Nov 30, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please sign in to comment.