From 6604a5c2be5bf99201235474c2e3dbe8e64f6b66 Mon Sep 17 00:00:00 2001 From: Gasim Gasimzada Date: Mon, 6 Jan 2020 16:49:05 +0400 Subject: [PATCH] Move scene, elements, and history into their respective modules - Add "elements" argument to all scene functions to break reliance on global vars - Move all scene functions under scene directory encapsulated by `index.ts` - Move all element functions under `element` directory encapsulated by index.ts - Create a SceneHistory class to store scene history state - Add `createScene` function to create scene object --- src/components/ButtonSelect.tsx | 25 + src/components/ColorPicker.tsx | 52 ++ src/components/EditableText.tsx | 2 +- src/element/bounds.ts | 52 ++ src/element/collision.ts | 124 +++ src/element/generateDraw.ts | 145 ++++ src/element/handlerRectangles.ts | 85 ++ src/element/index.ts | 15 + src/element/newElement.ts | 40 + src/element/resizeTest.ts | 32 + src/element/typeChecks.ts | 7 + src/element/types.ts | 9 + src/history.ts | 48 ++ src/index.tsx | 1280 +++--------------------------- src/math.ts | 16 + src/scene/comparisons.ts | 38 + src/scene/createScene.ts | 6 + src/scene/data.ts | 183 +++++ src/scene/index.ts | 19 + src/scene/render.ts | 109 +++ src/{ => scene}/roundRect.ts | 0 src/scene/scrollbars.ts | 115 +++ src/scene/selection.ts | 70 ++ src/scene/types.ts | 12 + src/shapes.tsx | 70 ++ src/types.ts | 14 + src/utils.ts | 25 + 27 files changed, 1411 insertions(+), 1182 deletions(-) create mode 100644 src/components/ButtonSelect.tsx create mode 100644 src/components/ColorPicker.tsx create mode 100644 src/element/bounds.ts create mode 100644 src/element/collision.ts create mode 100644 src/element/generateDraw.ts create mode 100644 src/element/handlerRectangles.ts create mode 100644 src/element/index.ts create mode 100644 src/element/newElement.ts create mode 100644 src/element/resizeTest.ts create mode 100644 src/element/typeChecks.ts create mode 100644 src/element/types.ts create mode 100644 src/history.ts create mode 100644 src/scene/comparisons.ts create mode 100644 src/scene/createScene.ts create mode 100644 src/scene/data.ts create mode 100644 src/scene/index.ts create mode 100644 src/scene/render.ts rename src/{ => scene}/roundRect.ts (100%) create mode 100644 src/scene/scrollbars.ts create mode 100644 src/scene/selection.ts create mode 100644 src/scene/types.ts create mode 100644 src/shapes.tsx create mode 100644 src/types.ts create mode 100644 src/utils.ts diff --git a/src/components/ButtonSelect.tsx b/src/components/ButtonSelect.tsx new file mode 100644 index 000000000..ec9b55f07 --- /dev/null +++ b/src/components/ButtonSelect.tsx @@ -0,0 +1,25 @@ +import React from "react"; + +export function ButtonSelect({ + options, + value, + onChange +}: { + options: { value: T; text: string }[]; + value: T | null; + onChange: (value: T) => void; +}) { + return ( +
+ {options.map(option => ( + + ))} +
+ ); +} diff --git a/src/components/ColorPicker.tsx b/src/components/ColorPicker.tsx new file mode 100644 index 000000000..65dfc78b5 --- /dev/null +++ b/src/components/ColorPicker.tsx @@ -0,0 +1,52 @@ +import React from "react"; +import { TwitterPicker } from "react-color"; + +export function ColorPicker({ + color, + onChange +}: { + color: string | null; + onChange: (color: string) => void; +}) { + const [isActive, setActive] = React.useState(false); + return ( +
+ - ))} -
- ); -} - -function ColorPicker({ - color, - onChange -}: { - color: string | null; - onChange: (color: string) => void; -}) { - const [isActive, setActive] = React.useState(false); - return ( -
-
- {someElementIsSelected() && ( + {someElementIsSelected(elements) && (

Selection

@@ -1479,15 +383,19 @@ class App extends React.Component<{}, AppState> {
Stroke Color
element.strokeColor)} + color={getSelectedAttribute( + elements, + element => element.strokeColor + )} onChange={color => this.changeStrokeColor(color)} /> - {hasBackground() && ( + {hasBackground(elements) && ( <>
Background Color
element.backgroundColor )} onChange={color => this.changeBackgroundColor(color)} @@ -1499,7 +407,10 @@ class App extends React.Component<{}, AppState> { { value: "hachure", text: "Hachure" }, { value: "cross-hatch", text: "Cross-hatch" } ]} - value={getSelectedAttribute(element => element.fillStyle)} + value={getSelectedAttribute( + elements, + element => element.fillStyle + )} onChange={value => { this.changeProperty(element => { element.fillStyle = value; @@ -1509,7 +420,7 @@ class App extends React.Component<{}, AppState> { )} - {hasStroke() && ( + {hasStroke(elements) && ( <>
Stroke Width
{ { value: 2, text: "Bold" }, { value: 4, text: "Extra Bold" } ]} - value={getSelectedAttribute(element => element.strokeWidth)} + value={getSelectedAttribute( + elements, + element => element.strokeWidth + )} onChange={value => { this.changeProperty(element => { element.strokeWidth = value; @@ -1533,7 +447,10 @@ class App extends React.Component<{}, AppState> { { value: 1, text: "Artist" }, { value: 3, text: "Cartoonist" } ]} - value={getSelectedAttribute(element => element.roughness)} + value={getSelectedAttribute( + elements, + element => element.roughness + )} onChange={value => this.changeProperty(element => { element.roughness = value; @@ -1550,7 +467,7 @@ class App extends React.Component<{}, AppState> { max="100" onChange={this.changeOpacity} value={ - getSelectedAttribute(element => element.opacity) || + getSelectedAttribute(elements, element => element.opacity) || 0 /* Put the opacity at 0 if there are two conflicting ones */ } /> @@ -1586,7 +503,7 @@ class App extends React.Component<{}, AppState> {
Image