aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/client/util/UndoManager.ts4
-rw-r--r--src/client/views/InkControlPtHandles.tsx5
-rw-r--r--src/client/views/InkStrokeProperties.ts9
-rw-r--r--src/client/views/InkTangentHandles.tsx7
-rw-r--r--src/client/views/InkingStroke.tsx6
-rw-r--r--src/client/views/nodes/DocumentView.tsx2
-rw-r--r--src/client/views/nodes/formattedText/FormattedTextBox.tsx2
-rw-r--r--src/fields/util.ts9
8 files changed, 26 insertions, 18 deletions
diff --git a/src/client/util/UndoManager.ts b/src/client/util/UndoManager.ts
index 536d90371..44e44d335 100644
--- a/src/client/util/UndoManager.ts
+++ b/src/client/util/UndoManager.ts
@@ -106,11 +106,11 @@ export namespace UndoManager {
return openBatches;
}
export function FilterBatches(fieldTypes: string[]) {
- var fieldCounts: { [key: string]: number } = {};
+ const fieldCounts: { [key: string]: number } = {};
const lastStack = UndoManager.undoStack.lastElement();
if (lastStack) {
lastStack.forEach(ev => fieldTypes.includes(ev.prop) && (fieldCounts[ev.prop] = (fieldCounts[ev.prop] || 0) + 1));
- var fieldCount2: { [key: string]: number } = {};
+ const fieldCount2: { [key: string]: number } = {};
runInAction(() =>
UndoManager.undoStack[UndoManager.undoStack.length - 1] = lastStack.filter(ev => {
if (fieldTypes.includes(ev.prop)) {
diff --git a/src/client/views/InkControlPtHandles.tsx b/src/client/views/InkControlPtHandles.tsx
index 249a0fa64..8162f3fdc 100644
--- a/src/client/views/InkControlPtHandles.tsx
+++ b/src/client/views/InkControlPtHandles.tsx
@@ -11,6 +11,7 @@ import { UndoManager } from "../util/UndoManager";
import { Colors } from "./global/globalEnums";
import { InkStrokeProperties } from "./InkStrokeProperties";
import { List } from "../../fields/List";
+import { InkingStroke } from "./InkingStroke";
export interface InkControlProps {
inkDoc: Doc;
@@ -120,7 +121,7 @@ export class InkControlPtHandles extends React.Component<InkControlProps> {
}
const screenSpaceLineWidth = this.props.screenSpaceLineWidth;
- const closed = inkData.lastElement().X === inkData[0].X && inkData.lastElement().Y === inkData[0].Y;
+ const closed = InkingStroke.IsClosed(inkData);
const nearestScreenPt = this.props.nearestScreenPt();
const TagType = (broken?: boolean) => broken ? "rect" : "circle";
const hdl = (control: { X: number, Y: number, I: number }, scale: number, color: string) => {
@@ -147,7 +148,7 @@ export class InkControlPtHandles extends React.Component<InkControlProps> {
pointerEvents="all"
cursor="default"
/>;
- }
+ };
return (<svg>
{!nearestScreenPt ? (null) :
<circle key={"npt"}
diff --git a/src/client/views/InkStrokeProperties.ts b/src/client/views/InkStrokeProperties.ts
index d5033f44b..72912ff20 100644
--- a/src/client/views/InkStrokeProperties.ts
+++ b/src/client/views/InkStrokeProperties.ts
@@ -10,6 +10,7 @@ import { DocumentType } from "../documents/DocumentTypes";
import { CurrentUserUtils } from "../util/CurrentUserUtils";
import { SelectionManager } from "../util/SelectionManager";
import { undoBatch } from "../util/UndoManager";
+import { InkingStroke } from "./InkingStroke";
export class InkStrokeProperties {
static Instance: InkStrokeProperties | undefined;
@@ -187,7 +188,7 @@ export class InkStrokeProperties {
moveControl = (deltaX: number, deltaY: number, controlIndex: number) =>
this.applyFunction((doc: Doc, ink: InkData, xScale: number, yScale: number) => {
const order = controlIndex % 4;
- const closed = ink.lastElement().X === ink[0].X && ink.lastElement().Y === ink[0].Y;
+ const closed = InkingStroke.IsClosed(ink);
const newpts = ink.map((pt, i) => {
const leftHandlePoint = order === 0 && i === controlIndex + 1;
@@ -237,7 +238,7 @@ export class InkStrokeProperties {
snapControl = (inkDoc: Doc, controlIndex: number) => {
const ink = Cast(inkDoc.data, InkField)?.inkData;
if (ink) {
- const closed = ink.lastElement().X === ink[0].X && ink.lastElement().Y === ink[0].Y;
+ const closed = InkingStroke.IsClosed(ink);
// figure out which segments we don't want to snap to - avoid the dragged control point's segment and the next and prev segments (when they exist -- ie not for endpoints of unclosed curve)
const thisseg = Math.floor(controlIndex / 4) * 4;
@@ -257,7 +258,7 @@ export class InkStrokeProperties {
(nearestPt.Y - refPt.Y) * (nearestPt.Y - refPt.Y) * ptsYscale * ptsYscale);
if (near / (this.selectedInk?.lastElement().props.ScreenToLocalTransform().Scale || 1) < 10) {
- return this.moveControl((nearestPt.X - ink[controlIndex].X) * ptsXscale, (nearestPt.Y - ink[controlIndex].Y) * ptsYscale, controlIndex)
+ return this.moveControl((nearestPt.X - ink[controlIndex].X) * ptsXscale, (nearestPt.Y - ink[controlIndex].Y) * ptsYscale, controlIndex);
}
}
return false;
@@ -331,7 +332,7 @@ export class InkStrokeProperties {
@action
moveHandle = (deltaX: number, deltaY: number, handleIndex: number, oppositeHandleIndex: number, controlIndex: number) =>
this.applyFunction((doc: Doc, ink: InkData, xScale: number, yScale: number) => {
- const closed = ink.lastElement().X === ink[0].X && ink.lastElement().Y === ink[0].Y;
+ const closed = InkingStroke.IsClosed(ink);
const oldHandlePoint = ink[handleIndex];
const oppositeHandlePoint = ink[oppositeHandleIndex];
const controlPoint = ink[controlIndex];
diff --git a/src/client/views/InkTangentHandles.tsx b/src/client/views/InkTangentHandles.tsx
index 4f1a406c2..8f7bef936 100644
--- a/src/client/views/InkTangentHandles.tsx
+++ b/src/client/views/InkTangentHandles.tsx
@@ -11,6 +11,7 @@ import { Transform } from "../util/Transform";
import { UndoManager } from "../util/UndoManager";
import { Colors } from "./global/globalEnums";
import { InkStrokeProperties } from "./InkStrokeProperties";
+import { InkingStroke } from "./InkingStroke";
export interface InkHandlesProps {
inkDoc: Doc;
@@ -53,8 +54,8 @@ export class InkTangentHandles extends React.Component<InkHandlesProps> {
*/
@action
onBreakTangent = (controlIndex: number) => {
- const closed = this.props.screenCtrlPoints.lastElement().X === this.props.screenCtrlPoints[0].X && this.props.screenCtrlPoints.lastElement().Y === this.props.screenCtrlPoints[0].Y;
- var brokenIndices = Cast(this.props.inkDoc.brokenInkIndices, listSpec("number"));
+ const closed = InkingStroke.IsClosed(this.props.screenCtrlPoints);
+ const brokenIndices = Cast(this.props.inkDoc.brokenInkIndices, listSpec("number"));
if (!brokenIndices?.includes(controlIndex) &&
((controlIndex > 0 && controlIndex < this.props.screenCtrlPoints.length - 1) || closed)) {
if (brokenIndices) brokenIndices.push(controlIndex);
@@ -70,7 +71,7 @@ export class InkTangentHandles extends React.Component<InkHandlesProps> {
const data = this.props.screenCtrlPoints;
const tangentHandles: HandlePoint[] = [];
const tangentLines: HandleLine[] = [];
- const closed = data.lastElement().X === data[0].X && data.lastElement().Y === data[0].Y;
+ const closed = InkingStroke.IsClosed(data);
if (data.length >= 4) {
for (let i = 0; i <= data.length - 4; i += 4) {
tangentHandles.push({ ...data[i + 1], I: i + 1, dot1: i, dot2: i === 0 ? (closed ? data.length - 1 : i) : i - 1 });
diff --git a/src/client/views/InkingStroke.tsx b/src/client/views/InkingStroke.tsx
index 552318e23..42a09fa52 100644
--- a/src/client/views/InkingStroke.tsx
+++ b/src/client/views/InkingStroke.tsx
@@ -29,6 +29,9 @@ const InkDocument = makeInterface(documentSchema);
export class InkingStroke extends ViewBoxBaseComponent<FieldViewProps, InkDocument>(InkDocument) {
public static LayoutString(fieldStr: string) { return FieldView.LayoutString(InkingStroke, fieldStr); }
static readonly MaskDim = 50000;
+ public static IsClosed(inkData: InkData) {
+ return inkData && inkData.lastElement().X === inkData[0].X && inkData.lastElement().Y === inkData[0].Y;
+ }
@observable private _properties?: InkStrokeProperties;
_handledClick = false; // flag denoting whether ink stroke has handled a psuedo-click onPointerUp so that the real onClick event can be stopPropagated
_selDisposer: IReactionDisposer | undefined;
@@ -144,7 +147,6 @@ export class InkingStroke extends ViewBoxBaseComponent<FieldViewProps, InkDocume
const inkDoc = this.props.Document;
const screenSpaceCenterlineStrokeWidth = 3; // the width of the blue line widget that shows the centerline of the ink stroke
const { inkData, inkScaleX, inkScaleY, inkStrokeWidth, inkTop, inkLeft } = this.inkScaledData();
- const closed = inkData.lastElement().X === inkData[0].X && inkData.lastElement().Y === inkData[0].Y;
const screenInkWidth = this.props.ScreenToLocalTransform().inverse().transformDirection(inkStrokeWidth, inkStrokeWidth);
const screenPts = inkData.map(point => this.props.ScreenToLocalTransform().inverse().transformPoint(
@@ -184,7 +186,7 @@ export class InkingStroke extends ViewBoxBaseComponent<FieldViewProps, InkDocume
const startMarker = StrCast(this.layoutDoc.strokeStartMarker);
const endMarker = StrCast(this.layoutDoc.strokeEndMarker);
- const closed = inkData.lastElement().X === inkData[0].X && inkData.lastElement().Y === inkData[0].Y;
+ const closed = InkingStroke.IsClosed(inkData);
const fillColor = StrCast(this.layoutDoc.fillColor, "transparent");
const strokeColor = !closed && fillColor && fillColor !== "transparent" ? fillColor : StrCast(this.layoutDoc.color);
diff --git a/src/client/views/nodes/DocumentView.tsx b/src/client/views/nodes/DocumentView.tsx
index 1187521b3..1ccf38de2 100644
--- a/src/client/views/nodes/DocumentView.tsx
+++ b/src/client/views/nodes/DocumentView.tsx
@@ -92,7 +92,7 @@ export interface DocComponentView {
playFrom?: (time: number, endTime?: number) => void;
Pause?: () => void;
setFocus?: () => void;
- componentUI?: (boundsLeft: number, boundsTop: number) => JSX.Element;
+ componentUI?: (boundsLeft: number, boundsTop: number) => JSX.Element | null;
fieldKey?: string;
annotationKey?: string;
getTitle?: () => string;
diff --git a/src/client/views/nodes/formattedText/FormattedTextBox.tsx b/src/client/views/nodes/formattedText/FormattedTextBox.tsx
index 7afa54d5f..aa53f751d 100644
--- a/src/client/views/nodes/formattedText/FormattedTextBox.tsx
+++ b/src/client/views/nodes/formattedText/FormattedTextBox.tsx
@@ -960,7 +960,7 @@ export class FormattedTextBox extends ViewBoxAnnotatableComponent<(FieldViewProp
GoogleApiClientUtils.Docs.write({ reference, content, mode });
}
};
- UndoManager.AddEvent({ undo, redo });
+ UndoManager.AddEvent({ undo, redo, prop: "" });
redo();
});
}
diff --git a/src/fields/util.ts b/src/fields/util.ts
index 99dfc04d9..c708affe3 100644
--- a/src/fields/util.ts
+++ b/src/fields/util.ts
@@ -405,7 +405,8 @@ export function updateFunction(target: any, prop: any, value: any, receiver: any
ind !== -1 && receiver[prop].splice(ind, 1);
});
lastValue = ObjectField.MakeCopy(receiver[prop]);
- })
+ }),
+ prop: ""
} :
diff?.op === "$remFromSet" ?
{
@@ -423,7 +424,8 @@ export function updateFunction(target: any, prop: any, value: any, receiver: any
ind !== -1 && receiver[prop].indexOf(item.value ? item.value() : item) === -1 && receiver[prop].splice(ind, 0, item);
});
lastValue = ObjectField.MakeCopy(receiver[prop]);
- }
+ },
+ prop: ""
}
: {
redo: () => {
@@ -434,7 +436,8 @@ export function updateFunction(target: any, prop: any, value: any, receiver: any
// console.log("undo list: " + prop, receiver[prop]) // bcz: uncomment to log undo
receiver[prop] = ObjectField.MakeCopy(prevValue as List<any>);
lastValue = ObjectField.MakeCopy(receiver[prop]);
- }
+ },
+ prop: ""
});
}
target[Update](op);