diff --git a/src/index.tsx b/src/index.tsx index 9edb0c21..5a16cbfd 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -105,7 +105,15 @@ function hitTest(element: ExcaliburElement, x: number, y: number): boolean { } } -function newElement(type: string, x: number, y: number, width = 0, height = 0) { +function newElement( + type: string, + x: number, + y: number, + strokeColor: string, + backgroundColor: string, + width = 0, + height = 0 +) { const element = { type: type, x: x, @@ -113,6 +121,8 @@ function newElement(type: string, x: number, y: number, width = 0, height = 0) { width: width, height: height, isSelected: false, + strokeColor: strokeColor, + backgroundColor: backgroundColor, draw(rc: RoughCanvas, context: CanvasRenderingContext2D) {} }; return element; @@ -122,11 +132,11 @@ function renderScene( rc: RoughCanvas, context: CanvasRenderingContext2D, // null indicates transparent bg - viewBgColor: string | null + viewBackgroundColor: string | null ) { const fillStyle = context.fillStyle; - if (typeof viewBgColor === "string") { - context.fillStyle = viewBgColor; + if (typeof viewBackgroundColor === "string") { + context.fillStyle = viewBackgroundColor; context.fillRect(-0.5, -0.5, canvas.width, canvas.height); } else { context.clearRect(-0.5, -0.5, canvas.width, canvas.height); @@ -159,12 +169,12 @@ function exportAsPNG({ exportBackground, exportVisibleOnly, exportPadding = 10, - viewBgColor + viewBackgroundColor }: { exportBackground: boolean; exportVisibleOnly: boolean; exportPadding?: number; - viewBgColor: string; + viewBackgroundColor: string; }) { if (!elements.length) return window.alert("Cannot export empty canvas."); @@ -228,7 +238,7 @@ function exportAsPNG({ // reset transparent bg back to original if (!exportBackground) { - renderScene(rc, context, viewBgColor); + renderScene(rc, context, viewBackgroundColor); } // create a temporary elem which we'll use to download the image @@ -283,11 +293,7 @@ function getArrowPoints(element: ExcaliburElement) { return [x1, y1, x2, y2, x3, y3, x4, y4]; } -function generateDraw( - element: ExcaliburElement, - itemStrokeColor: string, - itemBackgroundColorColor: string -) { +function generateDraw(element: ExcaliburElement) { if (element.type === "selection") { element.draw = (rc, context) => { const fillStyle = context.fillStyle; @@ -297,8 +303,8 @@ function generateDraw( }; } else if (element.type === "rectangle") { const shape = generator.rectangle(0, 0, element.width, element.height, { - stroke: itemStrokeColor, - fill: itemBackgroundColorColor + stroke: element.strokeColor, + fill: element.backgroundColor }); element.draw = (rc, context) => { context.translate(element.x, element.y); @@ -311,7 +317,7 @@ function generateDraw( element.height / 2, element.width, element.height, - { stroke: itemStrokeColor, fill: itemBackgroundColorColor } + { stroke: element.strokeColor, fill: element.backgroundColor } ); element.draw = (rc, context) => { context.translate(element.x, element.y); @@ -322,11 +328,11 @@ function generateDraw( const [x1, y1, x2, y2, x3, y3, x4, y4] = getArrowPoints(element); const shapes = [ // \ - generator.line(x3, y3, x2, y2, { stroke: itemStrokeColor }), + generator.line(x3, y3, x2, y2, { stroke: element.strokeColor }), // ----- - generator.line(x1, y1, x2, y2, { stroke: itemStrokeColor }), + generator.line(x1, y1, x2, y2, { stroke: element.strokeColor }), // / - generator.line(x4, y4, x2, y2, { stroke: itemStrokeColor }) + generator.line(x4, y4, x2, y2, { stroke: element.strokeColor }) ]; element.draw = (rc, context) => { @@ -407,9 +413,9 @@ type AppState = { exportBackground: boolean; exportVisibleOnly: boolean; exportPadding: number; - itemStrokeColor: string; - itemBackgroundColor: string; - viewBgColor: string; + currentItemStrokeColor: string; + currentItemBackgroundColor: string; + viewBackgroundColor: string; }; class App extends React.Component<{}, AppState> { @@ -427,9 +433,9 @@ class App extends React.Component<{}, AppState> { exportBackground: false, exportVisibleOnly: true, exportPadding: 10, - itemStrokeColor: "#000000", - itemBackgroundColor: "#ffffff", - viewBgColor: "#ffffff" + currentItemStrokeColor: "#000000", + currentItemBackgroundColor: "#ffffff", + viewBackgroundColor: "#ffffff" }; private onKeyDown = (event: KeyboardEvent) => { @@ -528,11 +534,7 @@ class App extends React.Component<{}, AppState> { parsedElements.forEach(parsedElement => { parsedElement.x += 10; parsedElement.y += 10; - generateDraw( - parsedElement, - this.state.itemStrokeColor, - this.state.itemBackgroundColor - ); + generateDraw(parsedElement); elements.push(parsedElement); }); this.forceUpdate(); @@ -556,7 +558,13 @@ class App extends React.Component<{}, AppState> { onMouseDown={e => { const x = e.clientX - (e.target as HTMLElement).offsetLeft; const y = e.clientY - (e.target as HTMLElement).offsetTop; - const element = newElement(this.state.elementType, x, y); + const element = newElement( + this.state.elementType, + x, + y, + this.state.currentItemStrokeColor, + this.state.currentItemBackgroundColor + ); let isDraggingElements = false; const cursorStyle = document.documentElement.style.cursor; if (this.state.elementType === "selection") { @@ -613,11 +621,7 @@ class App extends React.Component<{}, AppState> { element.height = height; } - generateDraw( - element, - this.state.itemStrokeColor, - this.state.itemBackgroundColor - ); + generateDraw(element); elements.push(element); if (this.state.elementType === "text") { this.setState({ @@ -664,11 +668,7 @@ class App extends React.Component<{}, AppState> { // Make a perfect square or circle when shift is enabled draggingElement.height = e.shiftKey ? width : height; - generateDraw( - draggingElement, - this.state.itemStrokeColor, - this.state.itemBackgroundColor - ); + generateDraw(draggingElement); if (this.state.elementType === "selection") { setSelection(draggingElement); @@ -718,9 +718,9 @@ class App extends React.Component<{}, AppState> {