// 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 stepRemovedNotify() { if ($('#stepRemovedNotification').length == 0) { var notification = document.createElement('span'); notification.innerHTML = ' Step Removed '; notification.id = 'stepRemovedNotification'; $('body').append(notification); } $('#stepRemovedNotification').fadeIn(500).delay(200).fadeOut(500); } function DefaultHtmlStepUi(_sequencer, options) { options = options || {}; var stepsEl = options.stepsEl || document.querySelector("#steps"); var selectStepSel = options.selectStepSel = options.selectStepSel || "#selectStep"; function onSetup(step, stepOptions) { if (step.options && step.options.description) step.description = step.options.description; step.ui = '\
\ '; var tools = 'Press apply to see changes
" ); } if (step.name != "load-image") { step.ui .querySelector("div.details") .appendChild( parser.parseFromString(tools, "text/html").querySelector("div") ); $(step.ui.querySelectorAll(".insert-step")).on('click', function() { util.insertStep(step.ID) }); // Insert the step's UI in the right place if (stepOptions.index == _sequencer.images.image1.steps.length) { stepsEl.appendChild(step.ui); $("#steps .container:nth-last-child(1) .insert-step").prop('disabled',true); if($("#steps .container:nth-last-child(2)")) $("#steps .container:nth-last-child(2) .insert-step").prop('disabled',false); } else { stepsEl.insertBefore(step.ui, $(stepsEl).children()[stepOptions.index]); } } else { $("#load-image").append(step.ui); } function saveOptions(e) { e.preventDefault(); if (optionsChanged){ $(step.ui.querySelector("div.details")) .find("input,select") .each(function(i, input) { $(input) .data('initValue', $(input).val()) .data('hasChangedBefore', false); step.options[$(input).attr("name")] = $(input).val(); }); _sequencer.run({ index: step.index - 1 }); // modify the url hash setUrlHashParameter("steps", _sequencer.toString()); // disable the save button $(step.ui.querySelector('.btn-save')).prop('disabled', true); optionsChanged = false; changedInputs = 0; } } function handleInputValueChange(currentValue, initValue, hasChangedBefore) { var inputChanged = !(isNaN(initValue) || isNaN(currentValue) ? currentValue === initValue : currentValue - initValue === 0); changedInputs += hasChangedBefore ? inputChanged ? 0 : -1 : inputChanged ? 1 : 0; optionsChanged = changedInputs > 0; $(step.ui.querySelector('.btn-save')).prop('disabled', !optionsChanged); return inputChanged; } var changedInputs = 0, optionsChanged = false; $(step.ui.querySelector('.input-form')).on('submit', saveOptions); $(step.ui.querySelectorAll('.target')).each(function(i, input) { $(input) .data('initValue', $(input).val()) .data('hasChangedBefore', false) .on('input', function() { $(this) .focus() .data('hasChangedBefore', handleInputValueChange( $(this).val(), $(this).data('initValue'), $(this).data('hasChangedBefore') ) ) }) }) $('input[type="range"]').on('input', function() { $(this).next().html($(this).val()); }) } 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; var imgthumbnail = step.ui.querySelector(".img-thumbnail"); for (let index = 0; index < step.linkElements.length; index++) { if (step.linkElements[index].contains(imgthumbnail)) step.linkElements[index].href = step.output; } // TODO: use a generalized version of this function fileExtension(output) { return output.split("/")[1].split(";")[0]; } for (let index = 0; index < step.linkElements.length; index++) { step.linkElements[index].download = step.name + "." + fileExtension(step.output); step.linkElements[index].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) { if (inputs[i].type.toLowerCase() === "input") $(step.ui.querySelector('div[name="' + i + '"] input')) .val(step.options[i]) .data('initValue', step.options[i]); if (inputs[i].type.toLowerCase() === "select") $(step.ui.querySelector('div[name="' + i + '"] select')) .val(step.options[i]) .data('initValue', step.options[i]); } } for (var i in outputs) { if (step[i] !== undefined) $(step.ui.querySelector('div[name="' + i + '"] input')) .val(step[i]); } } } function onRemove(step) { step.ui.remove(); $("#steps .container:nth-last-child(1) .insert-step").prop('disabled',true); $('div[class^=imgareaselect-]').remove(); } function getPreview() { return step.imgElement; } return { getPreview: getPreview, onSetup: onSetup, onComplete: onComplete, onRemove: onRemove, onDraw: onDraw } }