// Mode Switcher import { Tool } from '../tool.js'; import { MODE_MASS_GENERATION, MODE_PAN_VIEW, MODE_OBJECT_SELECT, EVENT_MODE_LEAVE, EVENT_MODE_ENTER, WIDE_CLASSNAME, } from '../config.js'; export class ModeSwitch extends Tool { currentMode = undefined; modes = [ [MODE_MASS_GENERATION, 'Generate Mass'], [MODE_PAN_VIEW, 'Pan View'], [MODE_OBJECT_SELECT, 'Select'], ]; buttons = []; setContainer(container) { super.setContainer(container); // First listed mode is the default const [[currentModeID, ]] = this.modes; this.setCurrentMode(currentModeID); // Add global method to set/get current mode this.sim.setCurrentMode = (modeID) => this.setCurrentMode(modeID); this.sim.getCurrentMode = () => this.currentMode; this.sim.isCurrentMode = (modeID) => modeID === this.currentMode; this.sim.onModeLeave = (modeID, cb) => this.onModeLeave(modeID, cb); this.sim.onModeEnter = (modeID, cb) => this.onModeEnter(modeID, cb); } constructor(container) { super(container); const modesDiv = document.createElement('div'); const heading = document.createElement('h2'); heading.innerHTML = 'Modes'; // this.div.appendChild(heading); this.div.appendChild(modesDiv); modesDiv.style.display = 'flex'; modesDiv.style.flexDirection = 'column'; for (let [modeID, modeTitle] of this.modes) { const button = document.createElement('button'); this.buttons.push(button); button.modeID = modeID; modesDiv.appendChild(button); button.innerHTML = modeTitle; button.classList.add(WIDE_CLASSNAME); button.addEventListener('click', () => this.setCurrentMode(modeID)); } } setModesOpacity() { for (let button of this.buttons) { button.style.opacity = button.modeID === this.currentMode ? '50%' : '100%'; } } setCurrentMode(modeID) { if (modeID === this.currentMode) return; const leave = new CustomEvent(EVENT_MODE_LEAVE, {detail: {modeID: this.currentMode}}); const enter = new CustomEvent(EVENT_MODE_LEAVE, {detail: {modeID}}); this.currentMode = modeID; this.setModesOpacity(); this.div.dispatchEvent(leave); this.div.dispatchEvent(enter); } // cb: () => {} onModeLeave(modeID, cb) { this.div.addEventListener(EVENT_MODE_LEAVE, (e) => { if (e.detail?.modeID === modeID) { cb(); } }); } // cb: () => {} onModeEnter(modeID, cb) { this.div.addEventListener(EVENT_MODE_ENTER, (e) => { if (e.detail?.modeID === modeID) { cb(); } }); } }