Create RotateSeatingGroupTool.ts to implement rotation functionality

This commit is contained in:
2026-06-22 21:12:38 +00:00
parent ce33001b1e
commit 8deb1f1844
@@ -0,0 +1,75 @@
import { Tool } from '../Tool';
import { YjsDocument } from '../../crdt/YjsDocument';
class RotateSeatingGroupTool extends Tool {
private selectedElementIds: string[] = [];
private rotationAngle: number = 90; // Default rotation angle in degrees
constructor(yjsDoc: YjsDocument) {
super(yjsDoc);
this.name = 'RotateSeatingGroupTool';
}
onMouseDown(event: MouseEvent): void {
// This tool works on selected elements, not on mouse clicks
// The actual rotation logic would be triggered through a UI action
}
onMouseMove(event: MouseEvent): void {
// No preview needed for this tool
}
onMouseUp(event: MouseEvent): void {
// No action needed on mouse up
}
onKeyUp(event: KeyboardEvent): void {
// Handle key up events
if (event.key === 'Escape') {
this.reset();
}
}
reset(): void {
// Reset any state if needed
this.selectedElementIds = [];
}
// Rotate selected elements
rotateSelectedElements(): void {
// Get all elements from the document
const elements = this.yjsDoc.getElements();
// Filter for selected elements
const selectedElements = elements.filter(element =>
this.selectedElementIds.includes(element.id)
);
// Rotate each selected element
selectedElements.forEach(element => {
// Calculate new rotation (add rotation angle, wrapping at 360 degrees)
let newRotation = element.properties.rotation || 0;
newRotation = (newRotation + this.rotationAngle) % 360;
// Update element with new rotation property
this.yjsDoc.updateElement(element.id, {
properties: {
...element.properties,
rotation: newRotation
}
});
});
}
// Set selected elements
setSelectedElements(elementIds: string[]): void {
this.selectedElementIds = elementIds;
}
// Set rotation angle
setRotationAngle(angle: number): void {
this.rotationAngle = angle;
}
}
export { RotateSeatingGroupTool };