From 58d81280c9742e71e1e55eeed4278922fcd1e253 Mon Sep 17 00:00:00 2001 From: Alex Bratsos Date: Sat, 4 Jan 2020 01:08:34 +0200 Subject: [PATCH] Add shortcuts (#85) * Add yarn.lock to .gitignore * Extract available shapes to one place * Add event listeners for shapes shortcuts * fixup! Add event listeners for shapes shortcuts * Underline first letter of shapes to indicate interactivity * fixup! Extract available shapes to one place * fixup! Add event listeners for shapes shortcuts --- .gitignore | 3 ++ src/index.tsx | 81 +++++++++++++++++++++++++++++++++----------------- src/styles.css | 8 +++++ 3 files changed, 64 insertions(+), 28 deletions(-) diff --git a/.gitignore b/.gitignore index 05176d52..f171f6f9 100644 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,9 @@ build # Dependency directories node_modules/ +# lock file +yarn.lock + # Editors .vscode/ diff --git a/src/index.tsx b/src/index.tsx index af62a54f..d4c6492e 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -118,6 +118,9 @@ function hitTest(element: ExcalidrawElement, x: number, y: number): boolean { const y2 = getElementAbsoluteY2(element); return x >= x1 && x <= x2 && y >= y1 && y <= y2; + } else if (element.type === "selection") { + console.warn("This should not happen, we need to investigate why it does."); + return false; } else { throw new Error("Unimplemented type " + element.type); } @@ -571,6 +574,40 @@ const KEYS = { BACKSPACE: "Backspace" }; +const SHAPES = [ + { + label: "Rectange", + value: "rectangle" + }, + { + label: "Ellipse", + value: "ellipse" + }, + { + label: "Arrow", + value: "arrow" + }, + { + label: "Text", + value: "text" + }, + { + label: "Selection", + value: "selection" + } +]; + +const shapesShortcutKeys = SHAPES.map(shape => shape.label[0].toLowerCase()); + +function findElementByKey(key: string) { + const defaultElement = "selection"; + return SHAPES.reduce((element, shape) => { + if (shape.value[0] !== key) return element; + + return shape.value; + }, defaultElement); +} + function isArrowKey(keyCode: string) { return ( keyCode === KEYS.ARROW_LEFT || @@ -643,32 +680,11 @@ class App extends React.Component<{}, AppState> { }); this.forceUpdate(); event.preventDefault(); + } else if (shapesShortcutKeys.includes(event.key.toLowerCase())) { + this.setState({ elementType: findElementByKey(event.key) }); } }; - private renderOption({ - type, - children - }: { - type: string; - children: React.ReactNode; - }) { - return ( - - ); - } - public render() { return (
{ >
Shapes - {this.renderOption({ type: "rectangle", children: "Rectangle" })} - {this.renderOption({ type: "ellipse", children: "Ellipse" })} - {this.renderOption({ type: "arrow", children: "Arrow" })} - {this.renderOption({ type: "text", children: "Text" })} - {this.renderOption({ type: "selection", children: "Selection" })} + {SHAPES.map(({ value, label }) => ( + + ))}