diff --git a/frontend/src/tools/drawing/AutoChairPlacementTool.ts b/frontend/src/tools/drawing/AutoChairPlacementTool.ts new file mode 100644 index 0000000..80a93be --- /dev/null +++ b/frontend/src/tools/drawing/AutoChairPlacementTool.ts @@ -0,0 +1,149 @@ +import { Tool } from '../Tool'; +import { YjsDocument } from '../../crdt/YjsDocument'; + +class AutoChairPlacementTool extends Tool { + private chairSpacing: number = 60; // Default spacing between chairs + private chairsPerSide: number = 2; // Default chairs per side for rectangular tables + private chairsAroundRound: number = 8; // Default chairs around round tables + + constructor(yjsDoc: YjsDocument) { + super(yjsDoc); + this.name = 'AutoChairPlacementTool'; + } + + onMouseDown(event: MouseEvent): void { + // This tool works on selected tables, not on mouse clicks + // The actual placement logic would be triggered through a UI action + // rather than a mouse click on the canvas + } + + 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 + } + + // Place chairs around a rectangular table + placeChairsAroundRectangularTable(table: any): void { + const { x, y, width, height } = table; + const chairWidth = 45; + const chairHeight = 45; + + // Calculate chairs per side based on table dimensions + const chairsOnLongSides = this.chairsPerSide; + const chairsOnShortSides = Math.max(1, Math.floor(this.chairsPerSide * (Math.min(width, height) / Math.max(width, height)))); + + // Place chairs on the longer sides (top and bottom) + for (let i = 0; i < chairsOnLongSides; i++) { + const positionRatio = (i + 1) / (chairsOnLongSides + 1); + + // Top side + this.yjsDoc.createElement({ + id: Date.now().toString() + '_chair_top_' + i, + type: 'chair', + layerId: 'default', + x: x + positionRatio * width - chairWidth / 2, + y: y - this.chairSpacing - chairHeight, + width: chairWidth, + height: chairHeight, + properties: {} + }); + + // Bottom side + this.yjsDoc.createElement({ + id: Date.now().toString() + '_chair_bottom_' + i, + type: 'chair', + layerId: 'default', + x: x + positionRatio * width - chairWidth / 2, + y: y + height + this.chairSpacing, + width: chairWidth, + height: chairHeight, + properties: {} + }); + } + + // Place chairs on the shorter sides (left and right) + for (let i = 0; i < chairsOnShortSides; i++) { + const positionRatio = (i + 1) / (chairsOnShortSides + 1); + + // Left side + this.yjsDoc.createElement({ + id: Date.now().toString() + '_chair_left_' + i, + type: 'chair', + layerId: 'default', + x: x - this.chairSpacing - chairWidth, + y: y + positionRatio * height - chairHeight / 2, + width: chairWidth, + height: chairHeight, + properties: {} + }); + + // Right side + this.yjsDoc.createElement({ + id: Date.now().toString() + '_chair_right_' + i, + type: 'chair', + layerId: 'default', + x: x + width + this.chairSpacing, + y: y + positionRatio * height - chairHeight / 2, + width: chairWidth, + height: chairHeight, + properties: {} + }); + } + } + + // Place chairs around a round table + placeChairsAroundRoundTable(table: any): void { + const { centerX, centerY, radius } = table.properties; + const chairWidth = 45; + const chairHeight = 45; + + // Place chairs in a circle around the table + for (let i = 0; i < this.chairsAroundRound; i++) { + const angle = (2 * Math.PI * i) / this.chairsAroundRound; + const chairX = centerX + (radius + this.chairSpacing) * Math.cos(angle) - chairWidth / 2; + const chairY = centerY + (radius + this.chairSpacing) * Math.sin(angle) - chairHeight / 2; + + this.yjsDoc.createElement({ + id: Date.now().toString() + '_chair_' + i, + type: 'chair', + layerId: 'default', + x: chairX, + y: chairY, + width: chairWidth, + height: chairHeight, + properties: {} + }); + } + } + + // Set chair spacing + setChairSpacing(spacing: number): void { + this.chairSpacing = spacing; + } + + // Set chairs per side for rectangular tables + setChairsPerSide(count: number): void { + this.chairsPerSide = count; + } + + // Set chairs around round tables + setChairsAroundRound(count: number): void { + this.chairsAroundRound = count; + } +} + +export { AutoChairPlacementTool }; \ No newline at end of file