{"version":3,"sources":["https://lively-kernel.org/lively4/swd21-croquet/src/components/demo/lively-simulation-controller.js"],"names":["Morph","_","LivelySimulationController","initialize","initializeStartStopButton","initializeStepButton","initializeAppendCellButton","initializeVelocitySlider","initializeRevertSelect","initializeStopOnErrorCheckBox","initializeResetTimeButton","initializeTimeDeltaInput","startStopButton","get","addEventListener","onStartStopButton","stepButton","onStepButton","appendCellButton","event","onAppendCellButton","velocitySlider","onVelocitySlider","revertSelect","onRevertSelect","onRevertSelectChange","stopOnErrorCheckBox","target","checked","stopOnError","onStopOnError","resetTimeButton","handleResetTime","timeDeltaInput","value","timeDelta","handleTimeDelta","initializeEngine","engine","registerIsRunningUpdater","registerVelocityUpdater","registerStopOnErrorUpdater","registerTimeUpdater","registerTimeDeltaUpdater","detachedCallback","dataflow","isRunning","velocity","velocitySpan","time","timeSpan","dt","dtInput","getEngine","toggleStartStop","step","simulation","getSimulation","addCell","setVelocity","options","generateCheckpointOptions","resetRevertSelect","forEach","option","appendChild","snapshot","revert","reset","setTimeDeltaPerStepInSeconds","e","children","checkpointOptions","takeRight","child","remove","history","filter","getHistory","map","timestamp","selector","shadowRoot","querySelector","getRootNode","isFocused","isChildFocused","doc","document"],"mappings":"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","file":"lively-simulation-controller.js","sourcesContent":["/*MD\n  ![](https://lively-kernel.org/lively4/lively4-core/demos/lively-simulation/screenshots/controller.png){width=500px}\nMD*/\n\n\"enable aexpr\";\n\nimport Morph from 'src/components/widgets/lively-morph.js';\nimport _ from 'src/external/lodash/lodash.js';\n\nexport default class LivelySimulationController extends Morph {\n  \n  // life cycle\n  initialize() {\n    this.initializeStartStopButton();\n    this.initializeStepButton();\n    this.initializeAppendCellButton();\n    this.initializeVelocitySlider();\n    this.initializeRevertSelect();\n    this.initializeStopOnErrorCheckBox();\n    this.initializeResetTimeButton();\n    this.initializeTimeDeltaInput();\n  }\n  \n  initializeStartStopButton() {\n    const startStopButton = this.get('#startStopButton');\n    startStopButton.addEventListener('click', () => this.onStartStopButton());\n  }\n  \n  initializeStepButton() {\n    const stepButton = this.get('#stepButton');\n    stepButton.addEventListener('click', () => this.onStepButton());\n  }\n  \n  initializeAppendCellButton() {\n    const appendCellButton = this.get('#appendCellButton');\n    appendCellButton.addEventListener('click', (event) => this.onAppendCellButton(event));\n  }\n  \n  initializeVelocitySlider() {\n    const velocitySlider = this.get('#velocitySlider');\n    velocitySlider.addEventListener('input', (event) => this.onVelocitySlider(event));\n  }\n  \n  initializeRevertSelect() {\n    const revertSelect = this.get('#revertSelect');\n    revertSelect.addEventListener('click', () => this.onRevertSelect());\n    revertSelect.addEventListener('change', (event) => this.onRevertSelectChange(event));\n  }\n  \n  initializeStopOnErrorCheckBox() {\n    const stopOnErrorCheckBox = this.get('#stopOnErrorCheckBox');\n    stopOnErrorCheckBox.addEventListener('change', ({ target: { checked: stopOnError }}) => this.onStopOnError(stopOnError))\n  }\n  \n  initializeResetTimeButton() {\n    const resetTimeButton = this.get('#resetTime');\n    resetTimeButton.addEventListener('click', () => this.handleResetTime());\n  }\n  \n  initializeTimeDeltaInput() {\n    const timeDeltaInput = this.get('#dt');\n    timeDeltaInput.addEventListener('change', ({ target: { value: timeDelta }}) => this.handleTimeDelta(timeDelta));\n  }\n  \n  initializeEngine(engine) {\n    this.registerIsRunningUpdater(engine);\n    this.registerVelocityUpdater(engine);\n    this.registerStopOnErrorUpdater(engine);\n    this.registerTimeUpdater(engine);\n    this.registerTimeDeltaUpdater(engine);\n  }\n  \n  detachedCallback() {\n    if (this.isRunningUpdater) this.isRunningUpdater.dispose();\n    if (this.velocityUpdater) this.velocityUpdater.dispose();\n    if (this.stopOnErrorUpdater) this.stopOnErrorUpdater.dispose();\n    if (this.timeUpdater) this.timeUpdater.dispose();\n    if (this.timeDeltaUpdater) this.timeDeltaUpdater.dispose();\n  }\n  \n  registerIsRunningUpdater(engine) {\n    this.isRunningUpdater = aexpr(() => engine.isRunning).dataflow(isRunning => {\n      const startStopButton = this.get('#startStopButton');\n      startStopButton.textContent = isRunning ? 'Stop' : 'Start';\n      if (isRunning) startStopButton.classList.add('stop');\n      else startStopButton.classList.remove('stop');\n    });\n  }\n  \n  registerVelocityUpdater(engine) {\n    this.velocityUpdater = aexpr(() => engine.velocity).dataflow(velocity => {\n      const velocitySlider = this.get('#velocitySlider');\n      velocitySlider.value = velocity;\n      const velocitySpan = this.get('#velocitySpan');\n      velocitySpan.innerText = velocity;\n    });\n  }\n  \n  registerStopOnErrorUpdater(engine) {\n    this.stopOnErrorUpdater = aexpr(() => engine.stopOnError).dataflow(stopOnError => {\n      const stopOnErrorCheckBox = this.get('#stopOnErrorCheckBox');\n      stopOnErrorCheckBox.checked = stopOnError;\n    });\n  }\n  \n  registerTimeUpdater(engine) {\n    this.timeUpdater = aexpr(() => engine.time).dataflow(time => {\n      const timeSpan = this.get('#time');\n      timeSpan.innerText = time;\n    });\n  }\n  \n  registerTimeDeltaUpdater(engine) {\n    this.timeDeltaUpdater = aexpr(() => engine.timeDeltaPerStepInSeconds).dataflow(dt => {\n      const dtInput = this.get('#dt');\n      dtInput.value = dt;\n    });\n  }\n  \n  // event listener\n  onStartStopButton() {\n    const engine = this.getEngine();\n    if (!engine) return;\n    engine.toggleStartStop();\n  }\n  \n  onStepButton() {\n    const engine = this.getEngine();\n    if (!engine) return;\n    engine.step();\n  }\n  \n  onAppendCellButton(event) {\n    const simulation = this.getSimulation();\n    if (simulation && simulation.addCell) simulation.addCell(event);\n  }\n  \n  onVelocitySlider({ target: { value: velocity } }) {\n    const engine = this.getEngine();\n    if (!engine) return;\n    engine.setVelocity(velocity);\n  }\n  \n  onRevertSelect() {\n    const revertSelect = this.get('#revertSelect');\n    const options = this.generateCheckpointOptions();\n    this.resetRevertSelect();\n    _.forEach(options, option => revertSelect.appendChild(option));\n  }\n  \n  onRevertSelectChange({ target: { value: snapshot } }){\n    const simulation = this.getSimulation();\n    if (simulation && simulation.revert) simulation.revert(snapshot);\n    this.resetRevertSelect();\n  }\n  \n  onStopOnError(stopOnError) {\n    const engine = this.getEngine();\n    if (!engine) return;\n    engine.stopOnError = stopOnError;\n  }\n  \n  handleResetTime() {\n    const simulation = this.getSimulation();\n    if (!simulation.reset) return;\n    simulation.reset();\n  }\n  \n  handleTimeDelta(timeDelta) {\n    const engine = this.getEngine();\n    if (!engine) return;\n    try {\n      engine.setTimeDeltaPerStepInSeconds(parseFloat(timeDelta));\n    } catch (e) { /* ignore */ }\n  }\n  \n  // other\n  resetRevertSelect() {\n    const revertSelect = this.get('#revertSelect');\n    const { children } = revertSelect;\n    const checkpointOptions = _.takeRight(children, children.length - 1);\n    _.forEach(checkpointOptions, child => child.remove());\n    revertSelect.value = '';\n  }\n  \n  generateCheckpointOptions() {\n    const history = _.filter(this.getHistory());\n    return _.map(history, ({ snapshot, timestamp }) => (\n      <option value={snapshot}>\n        { timestamp }\n      </option>\n    ));\n  }\n  \n  get(selector) {\n    const { shadowRoot } = this;\n    return shadowRoot.querySelector(selector);\n  }\n  \n  getSimulation() {\n    return this.getRootNode().host;\n  }\n  \n  getEngine() {\n    const simulation = this.getSimulation();\n    return simulation && simulation.getEngine && simulation.getEngine();\n  }\n  \n  getHistory() {\n    const simulation = this.getSimulation();\n    return simulation && simulation.getHistory && simulation.getHistory();\n  }\n  \n  isFocused() {\n    return this.isChildFocused(this.get('#dt'));\n  }\n  \n  isChildFocused(child, doc = document) {\n    if (doc.activeElement === child) return true;\n    if (doc.activeElement && doc.activeElement.shadowRoot)\n\t\t\treturn this.isChildFocused(child, doc.activeElement.shadowRoot)\n    return false;\n  }\n}"]}