From a16cd3a34f21b8a8c7786616ee7d88703fd73f28 Mon Sep 17 00:00:00 2001 From: davidbonan Date: Thu, 9 Jan 2020 02:29:41 +0100 Subject: [PATCH] Add font size and font familly option for selection (#278) * Add font size and font familly option for selection * Allow copy font style * More clearner method name * Update options size and font-familly --- src/index.tsx | 61 +++++++++++++++++++++++++++++++++++++++- src/scene/comparisons.ts | 5 ++++ src/scene/index.ts | 3 +- 3 files changed, 67 insertions(+), 2 deletions(-) diff --git a/src/index.tsx b/src/index.tsx index b78984551..2ff0dc08b 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -29,7 +29,8 @@ import { hasStroke, getElementAtPosition, createScene, - getElementContainingPosition + getElementContainingPosition, + hasText } from "./scene"; import { renderScene } from "./renderer"; @@ -252,6 +253,10 @@ export class App extends React.Component<{}, AppState> { element.fillStyle = pastedElement?.fillStyle; element.opacity = pastedElement?.opacity; element.roughness = pastedElement?.roughness; + if(isTextElement(element)) { + element.font = pastedElement?.font; + this.redrawTextBoundingBox(element); + } } }); this.forceUpdate(); @@ -324,6 +329,14 @@ export class App extends React.Component<{}, AppState> { } }; + private redrawTextBoundingBox = (element: ExcalidrawTextElement) => { + const metrics = measureText(element.text, element.font); + element.width = metrics.width; + element.height = metrics.height; + element.baseline = metrics.baseline; + this.forceUpdate(); + } + public render() { const canvasWidth = window.innerWidth - CANVAS_WINDOW_OFFSET_LEFT; const canvasHeight = window.innerHeight - CANVAS_WINDOW_OFFSET_TOP; @@ -452,6 +465,52 @@ export class App extends React.Component<{}, AppState> { )} + {hasText(elements) && ( + <> +
Font size
+ isTextElement(element) && +element.font.split("px ")[0] + )} + onChange={value => + this.changeProperty(element => { + if(isTextElement(element)) { + element.font = `${value}px ${element.font.split("px ")[1]}`; + this.redrawTextBoundingBox(element); + } + }) + } + /> +
Font familly
+ isTextElement(element) && element.font.split("px ")[1] + )} + onChange={value => + this.changeProperty(element => { + if(isTextElement(element)) { + element.font = `${element.font.split("px ")[0]}px ${value}`; + this.redrawTextBoundingBox(element); + } + }) + } + /> + + )} +
Opacity
element.type === "arrow") ); +export const hasText = (elements: ExcalidrawElement[]) => + elements.some( + element => element.isSelected && element.type === "text" + ); + export function getElementAtPosition( elements: ExcalidrawElement[], x: number, diff --git a/src/scene/index.ts b/src/scene/index.ts index 479c60efa..171315f40 100644 --- a/src/scene/index.ts +++ b/src/scene/index.ts @@ -18,6 +18,7 @@ export { hasBackground, hasStroke, getElementAtPosition, - getElementContainingPosition + getElementContainingPosition, + hasText } from "./comparisons"; export { createScene } from "./createScene";