diff options
| author | Melissa Zhang <mzhang19096@gmail.com> | 2020-07-30 15:38:44 -0700 | 
|---|---|---|
| committer | Melissa Zhang <mzhang19096@gmail.com> | 2020-07-30 15:38:44 -0700 | 
| commit | 3d02d928ad869b9157019aec356e2f1ea2ce47d6 (patch) | |
| tree | 00c9ccb1b5487f145b7512d4531757731781249b /src/client/views/InkingStroke.tsx | |
| parent | ba8549220295d03fb7eb7d7d31c90af72b30b1a6 (diff) | |
| parent | a9ec139961b0262698851cd7e2dd3430a0acddd7 (diff) | |
merge with master
Diffstat (limited to 'src/client/views/InkingStroke.tsx')
| -rw-r--r-- | src/client/views/InkingStroke.tsx | 97 | 
1 files changed, 97 insertions, 0 deletions
diff --git a/src/client/views/InkingStroke.tsx b/src/client/views/InkingStroke.tsx index e26ad47f9..5892e8346 100644 --- a/src/client/views/InkingStroke.tsx +++ b/src/client/views/InkingStroke.tsx @@ -17,6 +17,7 @@ import { Scripting } from "../util/Scripting";  import { Doc } from "../../fields/Doc";  import FormatShapePane from "./collections/collectionFreeForm/FormatShapePane";  import { action } from "mobx"; +import { setupMoveUpEvents } from "../../Utils";  library.add(faPaintBrush); @@ -45,6 +46,38 @@ export class InkingStroke extends ViewBoxBaseComponent<FieldViewProps, InkDocume          FormatShapePane.Instance.Pinned = true;      } +    private _prevX = 0; +    private _prevY = 0; +    private _controlNum = 0; +    @action +    onControlDown = (e: React.PointerEvent, i: number): void => { +        setupMoveUpEvents(this, e, this.onControlMove, this.onControlup, (e) => { }); +        this._prevX = e.clientX; +        this._prevY = e.clientY; +        this._controlNum = i; +    } + +    @action +    changeCurrPoint = (i: number) => { +        FormatShapePane.Instance._currPoint = i; +    } + +    @action +    onControlMove = (e: PointerEvent, down: number[]): boolean => { +        const xDiff = this._prevX - e.clientX; +        const yDiff = this._prevY - e.clientY; +        FormatShapePane.Instance.control(xDiff, yDiff, this._controlNum); +        this._prevX = e.clientX; +        this._prevY = e.clientY; +        return false; +    } + +    onControlup = (e: PointerEvent) => { +        this._prevX = 0; +        this._prevY = 0; +        this._controlNum = 0; +    } +      public static MaskDim = 50000;      render() {          TraceMobx(); @@ -62,14 +95,74 @@ export class InkingStroke extends ViewBoxBaseComponent<FieldViewProps, InkDocume          const scaleX = (this.props.PanelWidth() - strokeWidth) / (width - strokeWidth);          const scaleY = (this.props.PanelHeight() - strokeWidth) / (height - strokeWidth);          const strokeColor = StrCast(this.layoutDoc.color, ""); +          const points = InteractionUtils.CreatePolyline(data, left, top, strokeColor, strokeWidth, strokeWidth,              StrCast(this.layoutDoc.strokeBezier), StrCast(this.layoutDoc.fillColor, "transparent"),              StrCast(this.layoutDoc.strokeStartMarker), StrCast(this.layoutDoc.strokeEndMarker),              StrCast(this.layoutDoc.strokeDash), scaleX, scaleY, "", "none", this.props.isSelected() && strokeWidth <= 5, false); +          const hpoints = InteractionUtils.CreatePolyline(data, left, top,              this.props.isSelected() && strokeWidth > 5 ? strokeColor : "transparent", strokeWidth, (strokeWidth + 15),              StrCast(this.layoutDoc.strokeBezier), StrCast(this.layoutDoc.fillColor, "transparent"),              "none", "none", "0", scaleX, scaleY, "", this.props.active() ? "visiblepainted" : "none", false, true); + +        var controlPoints: { X: number, Y: number, I: number }[] = []; +        var handlePoints: { X: number, Y: number, I: number, dot1: number, dot2: number }[] = []; +        var handleLine: { X1: number, Y1: number, X2: number, Y2: number, X3: number, Y3: number, dot1: number, dot2: number }[] = []; +        if (data.length >= 4) { +            for (var i = 0; i <= data.length - 4; i += 4) { +                controlPoints.push({ X: data[i].X, Y: data[i].Y, I: i }); +                controlPoints.push({ X: data[i + 3].X, Y: data[i + 3].Y, I: i + 3 }); +                handlePoints.push({ X: data[i + 1].X, Y: data[i + 1].Y, I: i + 1, dot1: i, dot2: i === 0 ? i : i - 1 }); +                handlePoints.push({ X: data[i + 2].X, Y: data[i + 2].Y, I: i + 2, dot1: i + 3, dot2: i === data.length ? i + 3 : i + 4 }); +            } + +            handleLine.push({ X1: data[0].X, Y1: data[0].Y, X2: data[0].X, Y2: data[0].Y, X3: data[1].X, Y3: data[1].Y, dot1: 0, dot2: 0 }); +            for (var i = 2; i < data.length - 4; i += 4) { + +                handleLine.push({ X1: data[i].X, Y1: data[i].Y, X2: data[i + 1].X, Y2: data[i + 1].Y, X3: data[i + 3].X, Y3: data[i + 3].Y, dot1: i + 1, dot2: i + 2 }); + +            } +            handleLine.push({ X1: data[data.length - 2].X, Y1: data[data.length - 2].Y, X2: data[data.length - 1].X, Y2: data[data.length - 1].Y, X3: data[data.length - 1].X, Y3: data[data.length - 1].Y, dot1: data.length - 1, dot2: data.length - 1 }); + + +        } +        if (data.length <= 4) { +            handlePoints = []; +            handleLine = []; +            controlPoints = []; +            for (var i = 0; i < data.length; i++) { +                controlPoints.push({ X: data[i].X, Y: data[i].Y, I: i }); +            } + +        } +        const dotsize = String(Math.min(width * scaleX, height * scaleY) / 40); + +        const controls = controlPoints.map((pts, i) => + +            <svg height="10" width="10"> +                <circle cx={(pts.X - left - strokeWidth / 2) * scaleX + strokeWidth / 2} cy={(pts.Y - top - strokeWidth / 2) * scaleY + strokeWidth / 2} r={dotsize} stroke="black" stroke-width={String(Number(dotsize) / 2)} fill="red" +                    onPointerDown={(e) => { this.changeCurrPoint(pts.I); this.onControlDown(e, pts.I); }} pointerEvents="all" cursor="all-scroll" /> +            </svg>); +        const handles = handlePoints.map((pts, i) => + +            <svg height="10" width="10"> +                <circle cx={(pts.X - left - strokeWidth / 2) * scaleX + strokeWidth / 2} cy={(pts.Y - top - strokeWidth / 2) * scaleY + strokeWidth / 2} r={dotsize} stroke="black" stroke-width={String(Number(dotsize) / 2)} fill="green" +                    onPointerDown={(e) => this.onControlDown(e, pts.I)} pointerEvents="all" cursor="all-scroll" display={(pts.dot1 === FormatShapePane.Instance._currPoint || pts.dot2 === FormatShapePane.Instance._currPoint) ? "inherit" : "none"} /> +            </svg>); +        const handleLines = handleLine.map((pts, i) => + +            <svg height="100" width="100"> +                <line x1={(pts.X1 - left - strokeWidth / 2) * scaleX + strokeWidth / 2} y1={(pts.Y1 - top - strokeWidth / 2) * scaleY + strokeWidth / 2} +                    x2={(pts.X2 - left - strokeWidth / 2) * scaleX + strokeWidth / 2} y2={(pts.Y2 - top - strokeWidth / 2) * scaleY + strokeWidth / 2} stroke="green" stroke-width={String(Number(dotsize) / 2)} +                    display={(pts.dot1 === FormatShapePane.Instance._currPoint || pts.dot2 === FormatShapePane.Instance._currPoint) ? "inherit" : "none"} /> +                <line x1={(pts.X2 - left - strokeWidth / 2) * scaleX + strokeWidth / 2} y1={(pts.Y2 - top - strokeWidth / 2) * scaleY + strokeWidth / 2} +                    x2={(pts.X3 - left - strokeWidth / 2) * scaleX + strokeWidth / 2} y2={(pts.Y3 - top - strokeWidth / 2) * scaleY + strokeWidth / 2} stroke="green" stroke-width={String(Number(dotsize) / 2)} +                    display={(pts.dot1 === FormatShapePane.Instance._currPoint || pts.dot2 === FormatShapePane.Instance._currPoint) ? "inherit" : "none"} /> + +            </svg>); + +          return (              <svg className="inkingStroke"                  width={width} @@ -92,6 +185,10 @@ export class InkingStroke extends ViewBoxBaseComponent<FieldViewProps, InkDocume                  </defs>                  {hpoints}                  {points} +                {FormatShapePane.Instance._controlBtn && this.props.isSelected() ? controls : ""} +                {FormatShapePane.Instance._controlBtn && this.props.isSelected() ? handles : ""} +                {FormatShapePane.Instance._controlBtn && this.props.isSelected() ? handleLines : ""} +              </svg>          );      }  | 
