{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-constraints/src/components/demo/lively-simulation.js"],"names":["Morph","Engine","History","_","EMPTY_PLACEHOLDER","RESERVED_CELL_NAMES","LivelySimulation","initialize","initializeEngine","initializeController","initializeContainerRoot","velocity","has","undefined","stopOnError","time","dt","collectCells","engine","controller","get","hideController","hasAttribute","parentElement","initializeHistory","getInnerHTML","attachedCallback","detachedCallback","history","stop","shutdown","livelyPrepareSave","timeDeltaPerStepInMilliseconds","onKeyDown","event","isCellFocusActive","matched","toggleStartStop","increaseVelocity","decreaseVelocity","step","reset","addCell","preventDefault","selector","shadowRoot","querySelector","querySelectorAll","resolve","cell","appendChild","setName","ensureUniqueCellName","getName","startGrabbing","cellNameProposal","counterSlug","cellNameProposalWithSlug","cellNames","concat","map","toAlphaNumeric","sameNameCount","filter","name","toLowerCase","str","replace","revert","snapshot","cells","some","isFocused","cloneCell","clone","cloneNode","executeSingleCell","innerHTML","getForegroundCell","maxBy","getEngine","getHistory","toggleHighlight","cellRef","currentHighlight","forEach","highlight"],"mappings":"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","file":"lively-simulation.js","sourcesContent":["\"enable aexpr\";\n\nimport Morph from 'src/components/widgets/lively-morph.js';\nimport Engine from 'demos/engery-sim/engine.js';\nimport History from 'demos/engery-sim/history.js';\nimport _ from 'src/external/lodash/lodash.js';\n\nconst EMPTY_PLACEHOLDER = 'EMPTY';\nconst RESERVED_CELL_NAMES = ['simulation'];\n\nexport default class LivelySimulation extends Morph {\n  \n  // life cycle\n  initialize() {\n    this.windowTitle = 'Simulation';\n    lively.html.registerKeys(this);\n    this.initializeEngine();\n    this.initializeController();\n    this.initializeContainerRoot();\n  }\n  \n  initializeEngine() {\n    const velocity = _.has(this.dataset, 'velocity') ? parseInt(this.dataset['velocity']) : undefined;\n    const stopOnError = this.dataset['stoponerror'] || undefined;\n    const time = _.has(this.dataset, 'time') ? parseInt(this.dataset['time']) : undefined;\n    const dt = _.has(this.dataset, 'dt') ? parseFloat(this.dataset['dt']) : undefined;\n    this.engine = new Engine(velocity, () => this.collectCells(), stopOnError, time, dt);\n  }\n  \n  initializeController() {\n    const { engine } = this;\n    const controller = this.get('#controller');\n    controller.initializeEngine(engine);\n    const hideController = !!this.hasAttribute('data-hide-controller');\n    if (hideController) controller.style.display = 'none';\n  }\n  \n  initializeContainerRoot() {\n    const { parentElement } = this;\n    if (parentElement.id === 'container-root') {\n      parentElement.style.width = '100%';\n      parentElement.style.height = '100%';\n    }\n  }\n  \n  initializeHistory() {\n    this.history = new History(() => this.getInnerHTML());\n  }\n  \n  attachedCallback() {\n    this.initializeHistory();\n  }\n  \n  detachedCallback() {\n    const { engine, history } = this;\n    engine.stop();\n    history.shutdown();\n  }\n  \n  livelyPrepareSave() {\n    const { engine: { stopOnError, time, timeDeltaPerStepInMilliseconds, velocity } } = this;\n    this.dataset['velocity'] = velocity;\n    this.dataset['stoponerror'] = stopOnError;\n    this.dataset['time'] = time;\n    this.dataset['dt'] = timeDeltaPerStepInMilliseconds;\n  }\n  \n  // event listener\n  onKeyDown(event) {\n    const { engine } = this;\n    if(this.isCellFocusActive() || this.get('#controller').isFocused()) return;\n    let matched = true;\n    switch (event.key) {\n      case ' ':\n        engine.toggleStartStop();\n        break;\n      case '+':\n        engine.increaseVelocity();\n        break;\n      case '-':\n        engine.decreaseVelocity();\n        break;\n      case 's':\n        engine.step();\n        break;\n      case 'r':\n        engine.reset();\n        break;\n      case 'a':\n        this.addCell();\n        break;\n      default:\n        matched = false;\n    }\n    if (matched) event.preventDefault();\n  }\n  \n  // other\n  get(selector) {\n    const { shadowRoot } = this;\n    return shadowRoot.querySelector(selector);\n  }\n  \n  collectCells() {\n    return [...this.querySelectorAll('lively-simulation-cell')];\n  }\n  \n  addCell(event) {\n    return Promise\n      .resolve(<lively-simulation-cell></lively-simulation-cell>)\n      .then(cell => {\n        this.appendChild(cell);\n        cell.setName(this.ensureUniqueCellName(cell.getName()));\n        if (!event) return;\n        cell.startGrabbing(event);\n      });\n  }\n  \n  ensureUniqueCellName(cellNameProposal, counterSlug = 1) {\n    const cellNameProposalWithSlug = \n        counterSlug > 1 ? `${cellNameProposal} (${counterSlug})` : cellNameProposal;\n    const cellNames = _.concat(\n      _.map(this.collectCells(), cell => this.toAlphaNumeric(cell.getName().toLowerCase())), \n      RESERVED_CELL_NAMES\n    );\n    const sameNameCount = _.filter(cellNames, name => name === this.toAlphaNumeric(cellNameProposalWithSlug.toLowerCase())).length;\n    if (sameNameCount - (counterSlug === 1) <= 0) return cellNameProposalWithSlug;\n    return this.ensureUniqueCellName(cellNameProposal, counterSlug + 1);\n  }\n  \n  toAlphaNumeric(str) {\n    return str.replace(/\\W/g, '');\n  }\n  \n  revert(snapshot) {\n    this.innerHTML = snapshot === EMPTY_PLACEHOLDER ? '' : snapshot;\n  }\n  \n  isCellFocusActive() {\n    const cells = this.collectCells();\n    return _.some(cells, cell => cell.isFocused());\n  }\n  \n  cloneCell(event, cell) {\n    cell.livelyPrepareSave();\n    const clone = cell.cloneNode();\n    this.appendChild(clone);\n    setTimeout(() => {\n      clone.setName(this.ensureUniqueCellName(clone.getName()));\n      clone.startGrabbing(event);\n    }, 0);\n  }\n  \n  executeSingleCell(cell) {\n    const { engine } = this;\n    return engine.step([ cell ]);\n  }\n  \n  getInnerHTML() {\n    const { innerHTML } = this;\n    return innerHTML.length ? innerHTML : EMPTY_PLACEHOLDER;\n  }\n  \n  getForegroundCell() {\n    return _.maxBy(this.collectCells(), cell => parseInt(cell.style.zIndex || 1));\n  }\n  \n  getEngine() {\n    const { engine } = this;\n    return engine;\n  }\n  \n  getHistory() {\n    const { history } = this;\n    return history.get();\n  }\n  \n  toggleHighlight(cellRef) {\n    const { currentHighlight } = this;\n    this.currentHighlight = (currentHighlight === cellRef) ? undefined : cellRef;\n    const cells = this.collectCells();\n    _.forEach(cells, cell => cell.highlight(this.currentHighlight));\n    \n  }\n}"]}