{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-bp2019/src/babylonian-programming-editor/ui/slider-widget.js"],"names":["InputWidget","DeleteButton","defaultExample","BabylonianWorker","SliderWidget","constructor","editor","location","kind","changeCallback","deleteCallback","_maxValues","Map","_elements","_fireFunctions","maxValues","_update","statusString","value","maxValue","makeElementForExample","example","input","status","fireFunction","valueAsNumber","textContent","get","id","_changeCallback","set","addEventListener","exampleName","color","name","length","element","nameElement","elementForExample","has","HTMLElement","style","backgroundColor","updateElementForExample","index","newMax","setAttribute","leftSpace","_deleteCallback","leftSpaceContainer","querySelector","innerHTML","appendChild","_table","_element","examples","Array","from","activeExamples","filter","e","forEach","size","display","fire"],"mappings":"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","file":"slider-widget.js","sourcesContent":["import InputWidget from \"./input-widget.js\";\nimport { DeleteButton } from \"./buttons.js\";\nimport { defaultExample } from \"../utils/defaults.js\";\nimport BabylonianWorker from \"../worker/babylonian-worker.js\";\n\n\nexport default class SliderWidget extends InputWidget {\n  constructor(editor, location, kind, changeCallback, deleteCallback) {\n    super(editor, location, kind, changeCallback, deleteCallback);\n    this._maxValues = new Map() // Map(exampleId, maxValue)\n    this._elements = new Map() // Map(exampleId, {element, input})\n    this._fireFunctions = new Map(); // Map(exampleId, function)\n  }\n  \n  get maxValues() {\n    return this._maxValues;\n  }\n  \n  set maxValues(maxValues) {\n    this._maxValues = maxValues;\n    this._update();\n  }\n  \n  _update() {\n    // Generates the status string\n    const statusString = (value, maxValue) => {\n      if(value === 0) {\n        return `all ${maxValue}`;\n      } else {\n        return `${value} of ${maxValue}`;\n      }\n    }\n    \n    // Creates a single element\n    const makeElementForExample = (example) => {\n      const input = <input\n                      type=\"range\"\n                      min=\"0\"\n                      max=\"0\"\n                      value=\"0\"\n                      class=\"slider-input space-after\"\n                    ></input>;\n\n      const status = <span class=\"status\"></span>;\n\n      const fireFunction = () => {\n        const value = input.valueAsNumber;\n        status.textContent = statusString(value, this._maxValues.get(example.id));\n        this._changeCallback(example.id, value - 1);\n      };\n      this._fireFunctions.set(example.id, fireFunction);\n      input.addEventListener(\"input\", fireFunction);\n      \n      let exampleName = \"\";\n      if(example.id !== defaultExample().id) {\n        exampleName = <span\n          class=\"example-name space-after\"\n          style={\"background-color:\" + example.color}>\n          {example.name.value.length ? example.name.value : \"\\u00A0\"}\n        </span>;\n      }\n      \n      return {\n        element: (\n          <tr class=\"widget-line\">\n            <td class=\"probe-meta\">\n              <span class=\"left-space space-after\"></span>\n            </td>\n            <td class=\"probe-example\">\n              {exampleName}\n              {input}\n              {status}\n            </td>\n          </tr>),\n        input: input,\n        nameElement: exampleName,\n        status: status\n      };\n    };\n    \n    // Gets a dom element for a single example\n    const elementForExample = (example) => {\n      // example: {id, name, color}\n      if(!this._elements.has(example.id)) {\n        this._elements.set(example.id, makeElementForExample(example));\n      }\n      \n      const element = this._elements.get(example.id);\n      if(element.nameElement instanceof HTMLElement) {\n        element.nameElement.style.backgroundColor = example.color;\n      }\n      \n      return element;\n    }\n    \n    // Updates the element for a given example\n    const updateElementForExample = (example, index) => {\n      const element = elementForExample(example);\n      const newMax = this._maxValues.get(example.id);\n      if(newMax < element.input.valueAsNumber) {\n        element.input.valueAsNumber = newMax;\n        this._fireFunctions.get(example.id)();\n      }\n      element.input.setAttribute(\"max\", newMax);\n      element.status.textContent = statusString(element.input.valueAsNumber, newMax);\n      \n      // Show a delete button for the first element, and just a space for all others\n      let leftSpace = <span></span>;\n      if(index === 0) {\n        leftSpace = DeleteButton(this._deleteCallback);\n      }\n      const leftSpaceContainer = element.element.querySelector(\".left-space\");\n      leftSpaceContainer.innerHTML = \"\";\n      leftSpaceContainer.appendChild(leftSpace);\n      \n      this._table.appendChild(element.element);\n    };\n    \n    this._element.textContent = \"\";\n    this._table = <table></table>;\n    this._element.appendChild(this._table);\n    \n    // Generate UI for all examples\n    let examples = Array.from(BabylonianWorker.activeExamples);\n    examples.filter((e) => this._maxValues.has(e.id))\n            .forEach(updateElementForExample);\n    \n    // Hide if empty\n    if(this._maxValues.size === 0) {\n      this._element.style.display = \"none\";\n    } else {\n      this._element.style.display = \"\";\n    }\n  }\n  \n  fire() {\n    Array.from(BabylonianWorker.activeExamples).forEach((e) => {\n      const fireFunction = this._fireFunctions.get(e.id);\n      if(typeof fireFunction === \"function\") {\n        fireFunction();\n      }\n    });\n  }\n}\n"]}