class EventManager { constructor(app) { this.app = app; } // Setup all event listeners setupEventListeners() { console.log('Setting up event listeners...'); this.setupToolbarEvents(); this.setupCanvasEvents(); this.setupControlEvents(); this.setupKeyboardEvents(); this.setupDebugEvents(); this.setup3DControlEvents(); console.log('✓ All event listeners set up'); } // Setup toolbar tool buttons setupToolbarEvents() { const toolButtons = [ // Selection tools { id: 'pointerToolTop', tool: 'pointer' }, { id: 'handToolTop', tool: 'hand' }, { id: 'moveToolTop', tool: 'move' }, { id: 'rotateToolTop', tool: 'rotate' }, // Drawing tools { id: 'roomToolTop', tool: 'room' }, { id: 'wallToolTop', tool: 'wall' }, { id: 'floorToolTop', tool: 'floor' }, { id: 'doorToolTop', tool: 'door' }, { id: 'windowToolTop', tool: 'window' } ]; toolButtons.forEach(({ id, tool }) => { const element = document.getElementById(id); if (element) { element.addEventListener('click', () => { console.log(`${tool} tool clicked`); this.app.toolManager.setTool(tool); }); console.log(`✓ ${id} event listener added`); } else { console.error(`✗ Element ${id} not found`); } }); // Fallback: Also try to set up old sidebar tool buttons if they exist const fallbackButtons = [ { id: 'roomTool', tool: 'room' }, { id: 'wallTool', tool: 'wall' }, { id: 'doorTool', tool: 'door' }, { id: 'windowTool', tool: 'window' } ]; fallbackButtons.forEach(({ id, tool }) => { const element = document.getElementById(id); if (element) { element.addEventListener('click', () => { console.log(`Fallback ${tool} tool clicked`); this.app.toolManager.setTool(tool); }); console.log(`✓ Fallback ${id} event listener added`); } }); } // Setup canvas mouse events setupCanvasEvents() { console.log('Setting up canvas events...'); this.app.canvas.addEventListener('mousedown', (e) => { console.log('Canvas mousedown event, current tool:', this.app.toolManager.getCurrentTool()); this.app.interactionManager.handleMouseDown(e); }); this.app.canvas.addEventListener('mousemove', (e) => { this.app.interactionManager.handleMouseMove(e); }); this.app.canvas.addEventListener('mouseup', (e) => { this.app.interactionManager.handleMouseUp(e); }); this.app.canvas.addEventListener('click', (e) => { console.log('Canvas click event'); // Prevent double handling - click fires after mouseup if (!this.app.toolManager.isCurrentlyDrawing()) { this.app.interactionManager.selectElement(e); } }); this.app.canvas.addEventListener('contextmenu', (e) => this.handleRightClick(e)); // Separate zoom/pan events this.app.canvas.addEventListener('wheel', (e) => { e.preventDefault(); this.app.zoomPanManager.handleWheel(e); }); console.log('✓ Canvas events set up'); } // Setup view and control events setupControlEvents() { // View toggle buttons this.setupViewControls(); this.setupDisplayToggles(); this.setupZoomControls(); this.setupMaterialControls(); this.setupActionButtons(); this.setupSidebarControls(); } setupViewControls() { const view2DTop = document.getElementById('view2DBtnTop'); const view3DTop = document.getElementById('view3DBtnTop'); if (view2DTop) { view2DTop.addEventListener('click', (e) => { console.log('2D button clicked'); e.preventDefault(); e.stopPropagation(); this.app.viewManager.switchTo2D(); }); console.log('✓ view2DBtnTop event listener added'); } else { console.error('✗ view2DBtnTop not found'); } if (view3DTop) { view3DTop.addEventListener('click', (e) => { console.log('3D button clicked'); e.preventDefault(); e.stopPropagation(); this.app.viewManager.switchTo3D(); }); console.log('✓ view3DBtnTop event listener added'); } else { console.error('✗ view3DBtnTop not found'); } // Quick access view buttons (always visible) const view2DQuick = document.getElementById('view2DBtnQuick'); const view3DQuick = document.getElementById('view3DBtnQuick'); if (view2DQuick) { view2DQuick.addEventListener('click', (e) => { console.log('Quick 2D button clicked'); e.preventDefault(); this.app.viewManager.switchTo2D(); }); console.log('✓ view2DBtnQuick event listener added'); } if (view3DQuick) { view3DQuick.addEventListener('click', (e) => { console.log('Quick 3D button clicked'); e.preventDefault(); this.app.viewManager.switchTo3D(); }); console.log('✓ view3DBtnQuick event listener added'); } // Fallback view buttons (sidebar) const view2D = document.getElementById('view2DBtn'); const view3D = document.getElementById('view3DBtn'); if (view2D) { view2D.addEventListener('click', () => this.app.viewManager.switchTo2D()); console.log('✓ Fallback view2DBtn event listener added'); } if (view3D) { view3D.addEventListener('click', () => this.app.viewManager.switchTo3D()); console.log('✓ Fallback view3DBtn event listener added'); } } setupDisplayToggles() { const toggleButtons = [ { id: 'toggleGridBtn', method: 'toggleGrid' }, { id: 'toggleMeasurementsBtn', method: 'toggleMeasurements' }, { id: 'toggleSnapBtn', method: 'toggleSnap' } ]; toggleButtons.forEach(({ id, method }) => { const element = document.getElementById(id); if (element) { element.addEventListener('click', () => { console.log(`${method} clicked`); this.app.viewManager[method](); }); console.log(`✓ ${id} event listener added`); } else { console.error(`✗ Element ${id} not found`); } }); } setupZoomControls() { const zoomInBtnTop = document.getElementById('zoomInBtnTop'); const zoomOutBtnTop = document.getElementById('zoomOutBtnTop'); const resetViewBtn = document.getElementById('resetViewBtn'); if (zoomInBtnTop) zoomInBtnTop.addEventListener('click', () => this.app.viewManager.zoomIn()); if (zoomOutBtnTop) zoomOutBtnTop.addEventListener('click', () => this.app.viewManager.zoomOut()); if (resetViewBtn) resetViewBtn.addEventListener('click', () => this.app.viewManager.resetZoom()); // Fallback zoom controls const zoomInBtn = document.getElementById('zoomInBtn'); const zoomOutBtn = document.getElementById('zoomOutBtn'); const resetZoomBtn = document.getElementById('resetZoomBtn'); if (zoomInBtn) zoomInBtn.addEventListener('click', () => this.app.viewManager.zoomIn()); if (zoomOutBtn) zoomOutBtn.addEventListener('click', () => this.app.viewManager.zoomOut()); if (resetZoomBtn) resetZoomBtn.addEventListener('click', () => this.app.viewManager.resetZoom()); } setupMaterialControls() { const materialSelectTop = document.getElementById('materialSelectTop'); const colorPickerTop = document.getElementById('colorPickerTop'); const wallThicknessSliderTop = document.getElementById('wallThicknessSliderTop'); const wallThicknessValueTop = document.getElementById('wallThicknessValueTop'); if (materialSelectTop) { materialSelectTop.addEventListener('change', (e) => { const sidebarSelect = document.getElementById('materialSelect'); if (sidebarSelect) sidebarSelect.value = e.target.value; if (this.app.uiManager.getSelectedElement()) { this.app.uiManager.getSelectedElement().material = e.target.value; this.app.canvasDrawingManager.redraw(); } }); } if (colorPickerTop) { colorPickerTop.addEventListener('change', (e) => { const sidebarPicker = document.getElementById('colorPicker'); if (sidebarPicker) sidebarPicker.value = e.target.value; if (this.app.uiManager.getSelectedElement()) { this.app.uiManager.getSelectedElement().color = e.target.value; this.app.canvasDrawingManager.redraw(); } }); } if (wallThicknessSliderTop && wallThicknessValueTop) { wallThicknessSliderTop.addEventListener('input', (e) => { const value = e.target.value; wallThicknessValueTop.textContent = value + 'px'; this.app.wallManager.updateGlobalWallThickness(value); }); } this.setupTopToolbarTypeControls(); } setupTopToolbarTypeControls() { const doorTypeTop = document.getElementById('doorTypeSelectTop'); const doorSwingTop = document.getElementById('doorSwingSelectTop'); const windowTypeTop = document.getElementById('windowTypeSelectTop'); if (doorTypeTop) { doorTypeTop.addEventListener('change', (e) => { const sidebarSelect = document.getElementById('doorTypeSelect'); if (sidebarSelect) sidebarSelect.value = e.target.value; }); } if (doorSwingTop) { doorSwingTop.addEventListener('change', (e) => { const sidebarSelect = document.getElementById('doorSwingSelect'); if (sidebarSelect) sidebarSelect.value = e.target.value; }); } if (windowTypeTop) { windowTypeTop.addEventListener('change', (e) => { const sidebarSelect = document.getElementById('windowTypeSelect'); if (sidebarSelect) sidebarSelect.value = e.target.value; }); } } setupActionButtons() { const saveBtn = document.getElementById('saveBtn'); const newDesignBtn = document.getElementById('newDesignBtn'); const undoBtn = document.getElementById('undoBtn'); const redoBtn = document.getElementById('redoBtn'); const deleteSelectedBtn = document.getElementById('deleteSelectedBtn'); if (saveBtn) saveBtn.addEventListener('click', () => this.app.designManager.saveDesign()); if (newDesignBtn) newDesignBtn.addEventListener('click', () => this.app.designManager.newDesign()); if (undoBtn) { undoBtn.addEventListener('click', () => { console.log('Undo button clicked'); this.app.undo(); }); } if (redoBtn) { redoBtn.addEventListener('click', () => { console.log('Redo button clicked'); this.app.redo(); }); } if (deleteSelectedBtn) { deleteSelectedBtn.addEventListener('click', () => { console.log('Delete selected button clicked'); this.app.deleteElement(); }); } } setupSidebarControls() { const showGrid = document.getElementById('showGrid'); const showMeasurements = document.getElementById('showMeasurements'); const snapToGrid = document.getElementById('snapToGrid'); const autoNameRooms = document.getElementById('autoNameRooms'); const wallThicknessSlider = document.getElementById('wallThicknessSlider'); if (showGrid) { showGrid.addEventListener('change', (e) => { this.app.canvasManager.showGrid = e.target.checked; this.app.canvasManager.updateGridStatus(); this.app.canvasDrawingManager.redraw(); }); } if (showMeasurements) { showMeasurements.addEventListener('change', (e) => { this.app.canvasManager.showMeasurements = e.target.checked; this.app.canvasDrawingManager.redraw(); }); } if (snapToGrid) { snapToGrid.addEventListener('change', (e) => { this.app.toolManager.snapToGrid = e.target.checked; }); } if (autoNameRooms) { autoNameRooms.addEventListener('change', (e) => { this.app.roomManager.autoNameRooms = e.target.checked; }); } if (wallThicknessSlider) { wallThicknessSlider.addEventListener('change', (e) => { this.app.wallManager.updateGlobalWallThickness(e.target.value); }); } } setupKeyboardEvents() { document.addEventListener('keydown', (e) => this.handleKeyDown(e)); } setupDebugEvents() { const debugTestBtn = document.getElementById('debugTestBtn'); const debugClearBtn = document.getElementById('debugClearBtn'); if (debugTestBtn) { debugTestBtn.addEventListener('click', () => { console.log('Debug test button clicked'); this.app.designManager.debugTest(); }); } if (debugClearBtn) { debugClearBtn.addEventListener('click', () => { console.log('Debug clear button clicked'); this.app.canvasManager.clearCanvas(); this.app.designElements = []; this.app.canvasDrawingManager.redraw(); }); } } setup3DControlEvents() { // Toggle 3D controls button const toggle3DControlsBtn = document.getElementById('toggle3DControlsBtn'); if (toggle3DControlsBtn) { toggle3DControlsBtn.addEventListener('click', () => { const controls = document.getElementById('camera3DControls'); if (controls) { controls.classList.toggle('hidden'); } }); } // Setup draggable and scalable 3D controls this.app.cameraControlsManager.setup3DControlsDragAndScale(); } // Event handlers handleRightClick(e) { e.preventDefault(); if (this.app.toolManager.isCurrentlyDrawing()) { this.app.toolManager.resetStates(); this.app.redraw(); } } handleKeyDown(e) { // Handle Ctrl/Cmd + Z for undo and Ctrl/Cmd + Shift + Z or Ctrl/Cmd + Y for redo if ((e.ctrlKey || e.metaKey) && !e.shiftKey && e.key === 'z') { e.preventDefault(); this.app.undo(); return; } if ((e.ctrlKey || e.metaKey) && (e.shiftKey && e.key === 'z' || e.key === 'y')) { e.preventDefault(); this.app.redo(); return; } switch(e.key) { case 'Delete': case 'Backspace': const selectedElement = this.app.uiManager.getSelectedElement(); if (selectedElement) { this.app.canvasDrawingManager.deleteElement(); } break; case 'g': this.app.viewManager.toggleGrid(); break; case 'm': this.app.viewManager.toggleMeasurements(); break; case 's': this.app.viewManager.toggleSnap(); break; case 'v': this.app.viewManager.toggleView(); break; case 'r': if (this.app.threeJSManager.is3DViewActive()) { this.app.threeJSManager.resetCamera(); } else { this.app.viewManager.resetZoom(); } break; case '+': case '=': if (this.app.threeJSManager.is3DViewActive()) { this.app.threeJSManager.zoomIn(); } else { this.app.viewManager.zoomIn(); } break; case '-': if (this.app.threeJSManager.is3DViewActive()) { this.app.threeJSManager.zoomOut(); } else { this.app.viewManager.zoomOut(); } break; case '0': this.app.viewManager.resetZoom(); break; } } }