aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/client/views/InkStrokeProperties.ts29
1 files changed, 12 insertions, 17 deletions
diff --git a/src/client/views/InkStrokeProperties.ts b/src/client/views/InkStrokeProperties.ts
index 2048b9a19..a0fdfcd7f 100644
--- a/src/client/views/InkStrokeProperties.ts
+++ b/src/client/views/InkStrokeProperties.ts
@@ -156,29 +156,24 @@ export class InkStrokeProperties {
}, true)
/**
- * Rotates the entire selected ink instance.
+ * Rotates ink stroke(s) about a point
+ * @param inkStrokes set of ink documentViews to rotate
* @param angle The angle at which to rotate the ink in radians.
+ * @param scrpt The center point of the rotation in screen coordinates
*/
@undoBatch
@action
rotateInk = (inkStrokes: DocumentView[], angle: number, scrpt: { x: number, y: number }) => {
this.applyFunction(inkStrokes, (view: DocumentView, ink: InkData, xScale: number, yScale: number, inkStrokeWidth: number) => {
- const oldXrangeMin = Math.min(...ink.map(p => p.X));
- const oldYrangeMin = Math.min(...ink.map(p => p.Y));
- const docViewCenterPt = view.screenToLocalTransform().transformPoint(scrpt.x, scrpt.y);
- const inkCenterPt = {
- X: (docViewCenterPt[0] - inkStrokeWidth / 2) / xScale + oldXrangeMin,
- Y: (docViewCenterPt[1] - inkStrokeWidth / 2) / yScale + oldYrangeMin
- };
- const newPoints = ink.map(i => {
- const pt = { X: i.X - inkCenterPt.X, Y: i.Y - inkCenterPt.Y };
- const newX = Math.cos(angle) * pt.X - Math.sin(angle) * pt.Y * yScale / xScale;
- const newY = Math.sin(angle) * pt.X * xScale / yScale + Math.cos(angle) * pt.Y;
- return { X: newX + inkCenterPt.X, Y: newY + inkCenterPt.Y };
- });
- const doc = view.rootDoc;
- doc.rotation = NumCast(doc.rotation) + angle;
- return newPoints;
+ view.rootDoc.rotation = NumCast(view.rootDoc.rotation) + angle;
+ const inkCenterPt = view.ComponentView?.ptFromScreen?.({ X: scrpt.x, Y: scrpt.y });
+ return !inkCenterPt ? ink :
+ ink.map(i => {
+ const pt = { X: i.X - inkCenterPt.X, Y: i.Y - inkCenterPt.Y };
+ const newX = Math.cos(angle) * pt.X - Math.sin(angle) * pt.Y * yScale / xScale;
+ const newY = Math.sin(angle) * pt.X * xScale / yScale + Math.cos(angle) * pt.Y;
+ return { X: newX + inkCenterPt.X, Y: newY + inkCenterPt.Y };
+ });
});
}