// Set the UI in sequencer. This Will generate HTML based on // Image Sequencer events : // onSetup : Called every time a step is added // onDraw : Called every time a step starts draw // onComplete : Called every time a step finishes drawing // onRemove : Called everytime a step is removed // The variable 'step' stores useful data like input and // output values, step information. // See documetation for more details. function DefaultHtmlStepUi(_sequencer, options) { options = options || {}; var stepsEl = options.stepsEl || document.querySelector("#steps"); var selectStepSel = options.selectStepSel = options.selectStepSel || "#selectStep"; function onSetup(step) { if (step.options && step.options.description) step.description = step.options.description; step.ui = '\
\
\

' + step.name + "

\

" + (step.description || "") + '

\
\
\ \ \
\
\ '; var tools = '
\ \
'; var parser = new DOMParser(); step.ui = parser.parseFromString(step.ui, "text/html"); step.ui = step.ui.querySelector("div.row"); step.linkElement = step.ui.querySelector("a"); step.imgElement = step.ui.querySelector("a img"); if (_sequencer.modulesInfo().hasOwnProperty(step.name)) { var inputs = _sequencer.modulesInfo(step.name).inputs; var outputs = _sequencer.modulesInfo(step.name).outputs; var merged = Object.assign(inputs, outputs); // combine outputs w inputs for (var paramName in merged) { var isInput = inputs.hasOwnProperty(paramName); var html = ""; var inputDesc = isInput ? inputs[paramName] : {}; if (!isInput) { html += ''; } else if (inputDesc.type.toLowerCase() == "select") { html += '"; } else { html = ''; } var div = document.createElement("div"); div.className = "row"; div.setAttribute("name", paramName); var description = inputs[paramName].desc || paramName; div.innerHTML = "
\ \ " + html + "\
"; step.ui.querySelector("div.details").appendChild(div); } $(step.ui.querySelector("div.details")).append( "

" ); function saveOptions() { $(step.ui.querySelector("div.details")) .find("input,select") .each(function(i, input) { step.options[$(input).attr("name")] = input.value; }); _sequencer.run(); // modify the url hash setUrlHashParameter("steps", _sequencer.toString()); } // on clicking Save in the details pane of the step $(step.ui.querySelector("div.details .btn-save")).click(saveOptions); } if (step.name != "load-image") step.ui .querySelector("div.details") .appendChild( parser.parseFromString(tools, "text/html").querySelector("div") ); stepsEl.appendChild(step.ui); } function onDraw(step) { $(step.ui.querySelector(".load")).show(); $(step.ui.querySelector("img")).hide(); } function onComplete(step) { $(step.ui.querySelector(".load")).hide(); $(step.ui.querySelector("img")).show(); step.imgElement.src = step.output; step.linkElement.href = step.output; // TODO: use a generalized version of this function fileExtension(output) { return output.split("/")[1].split(";")[0]; } step.linkElement.download = step.name + "." + fileExtension(step.output); step.linkElement.target = "_blank"; // fill inputs with stored step options if (_sequencer.modulesInfo().hasOwnProperty(step.name)) { var inputs = _sequencer.modulesInfo(step.name).inputs; var outputs = _sequencer.modulesInfo(step.name).outputs; for (var i in inputs) { if ( step.options[i] !== undefined && inputs[i].type.toLowerCase() === "input" ) step.ui.querySelector('div[name="' + i + '"] input').value = step.options[i]; if ( step.options[i] !== undefined && inputs[i].type.toLowerCase() === "select" ) step.ui.querySelector('div[name="' + i + '"] select').value = step.options[i]; } for (var i in outputs) { if (step[i] !== undefined) step.ui.querySelector('div[name="' + i + '"] input').value = step[i]; } } } function onRemove(step) { step.ui.remove(); } function getPreview() { return step.imgElement; } return { getPreview: getPreview, onSetup: onSetup, onComplete: onComplete, onRemove: onRemove, onDraw: onDraw } }