git @ Cat's Eye Technologies Etcha / master impl / etcha.js / src / etcha-launcher.js
master

Tree @master (Download .tar.gz)

etcha-launcher.js @masterraw · history · blame

// SPDX-FileCopyrightText: In 2012, Chris Pressey, the original author of this work, placed it into the public domain.
// For more information, please refer to <https://unlicense.org/>
// SPDX-License-Identifier: Unlicense
function launch(prefix, container, config) {
  if (typeof container === 'string') {
    container = document.getElementById(container);
  }
  config = config || {};

  function loadThese(deps, callback) {
    var loaded = 0;
    for (var i = 0; i < deps.length; i++) {
      var elem = document.createElement('script');
      elem.src = prefix + deps[i];
      elem.onload = function() {
        if (++loaded < deps.length) return;
        callback();
      }
      document.body.appendChild(elem);
    }
  }

  loadThese([
    "yoob/element-factory.js",
    "yoob/controller.js",
    "yoob/playfield.js",
    "yoob/cursor.js",
    "yoob/playfield-canvas-view.js",
    "yoob/source-html-view.js",
    "yoob/preset-manager.js",
    "yoob/source-manager.js"
  ], function() {
    loadThese(["etcha.js"], function() {
      var etchaController;
      var controlPanel = yoob.makeDiv(container);
      controlPanel.id = 'control_panel';

      var subPanel = yoob.makeDiv(container);
      var subSubPanel = yoob.makeDiv(subPanel);
      var repeatIndefinitely = yoob.makeCheckbox(subSubPanel, false, "repeat indefinitely", function(checked) {
        etchaController.setRepeatIndefinitely(checked);
      });
      var selectSource = yoob.makeSelect(subPanel, 'configuration:', []);

      var display = yoob.makeDiv(container);
      var programDisplay = yoob.makePre(display);
      programDisplay.id = 'program_display';
      var canvas = yoob.makeCanvas(display, 400, 400);
      canvas.id = 'playfield_canvas';
      var editor = yoob.makeTextArea(container, 40, 25);

      var pfView = makeEtchaPlayfieldView({
          canvas: canvas
      });
      pfView.setCellDimensions(12, 12);

      var progView = new yoob.SourceHTMLView();
      progView.init('', programDisplay);

      etchaController = (new EtchaController()).init({
          panelContainer: controlPanel,
          view: progView,
          pfView: pfView
      });

      var sourceManager = (new yoob.SourceManager()).init({
          panelContainer: controlPanel,
          editor: editor,
          hideDuringEdit: [display],
          disableDuringEdit: [etchaController.panel],
          storageKey: 'etcha.js',
          onDone: function() {
              etchaController.performReset(this.getEditorText());
          }
      });

      var presetManager = (new yoob.PresetManager()).init({
        selectElem: selectSource
      });
      function makeCallback(sourceText) {
        return function(id) {
          sourceManager.loadSource(sourceText);
        }
      }
      for (var i = 0; i < examplePrograms.length; i++) {
        presetManager.add(examplePrograms[i][0], makeCallback(examplePrograms[i][1]));
      }
      presetManager.select(examplePrograms[0][0]);
    });
  });
}