glitch-images/scripts/views/controlsview.js
Georg Fischer 3ec6a6b64e add russian translation, translate share strings, add share to
vkontakte and update styles to account for longer texts
2016-01-13 14:32:49 +01:00

157 lines
4.4 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*global define*/
define(
[ 'util/addpublishers', 'util/el', 'util/localizetext' ],
function ( addPublishers, elHelper, loc ) {
// the control elements are used to change the appearance of the image
function ControlsView ( parentEl, buttonParentEl, params ) {
if ( ! ( this instanceof ControlsView ) ) {
return new ControlsView( parentEl, buttonParentEl, params );
}
params = params || { };
var self = this;
var publishers = addPublishers( self, 'update', 'random' );
var isIgnoringInput = false;
var isActive = true;
var activeTimeoutId = 0;
var inputEls = { };
var valueEls = { };
var controlsEl = elHelper.createEl( 'div', 'controls', parentEl );
var controlsWrapperEl = elHelper.createEl( 'div', 'controls-wrapper', controlsEl );
var buttonEl = elHelper.createButton( 'controls.controls', 'controls.controlstitle', 'controls-toggle-button button is-active', buttonParentEl, toggleControls );
for ( var key in params ) {
addControl( key, params[key] );
}
show();
elHelper.createButton( 'controls.randomize', 'controls.randomizetitle', 'random-button button', controlsWrapperEl, randomButtonClicked );
function loadInitialValues () {
// dispatch initial values when model is listening
var controlValues = getInputValues();
for ( var key in controlValues ) {
publishers.update.dispatch( key, controlValues[key] );
}
}
function addControl ( key, params ) {
var controlEl = elHelper.createEl( 'div', 'control', controlsWrapperEl );
var labelEl = elHelper.createLabel( 'controls.' + key, 'input-' + key, 'control-label', controlEl );
loc( labelEl, 'title', 'controls.' + key );
var inputEl = elHelper.createEl( 'input', 'control-input', controlEl );
inputEl.setAttribute( 'data-key', key );
inputEl.setAttribute( 'id', 'input-' + key );
inputEl.type = 'range';
inputEl.value = params.value || 0;
inputEl.min = params.min || 0;
inputEl.max = params.max || 100;
inputEl.addEventListener( 'input', inputUpdated );
inputEl.addEventListener( 'change', inputUpdated );
inputEls[key] = inputEl;
var valueEl = elHelper.createEl( 'input', 'control-value', controlEl );
valueEl.setAttribute( 'data-key', key );
valueEl.type = 'number';
valueEl.value = params.value || 0;
valueEl.min = params.min || 0;
valueEl.max = params.max || 100;
valueEl.addEventListener( 'input', inputUpdated );
valueEl.addEventListener( 'change', inputUpdated );
valueEls[key] = valueEl;
inputUpdated( { target: inputEl } );
}
function inputUpdated ( event ) {
if ( isActive && ! isIgnoringInput ) {
var key = event.target.getAttribute( 'data-key' );
var controlValues = getInputValues();
if ( controlValues[key] !== event.target.value ) {
controlValues[key] = parseInt( event.target.value, 10 );
publishers.update.dispatch( key, controlValues[key] );
}
}
}
function randomButtonClicked ( event ) {
if ( isActive ) {
publishers.random.dispatch();
}
}
function toggleControls () {
if ( isActive ) {
hide();
} else {
show();
}
}
function hide () {
controlsEl.classList.remove( 'is-active' );
buttonEl.classList.remove( 'is-active' );
buttonParentEl.classList.remove( 'controls-enabled' );
isActive = false;
clearTimeout( activeTimeoutId );
activeTimeoutId = setTimeout( function () {
controlsEl.classList.remove( 'is-visible' );
}, 500 );
}
function show () {
controlsEl.classList.add( 'is-visible' );
isActive = true;
clearTimeout( activeTimeoutId );
activeTimeoutId = setTimeout( function () {
controlsEl.classList.add( 'is-active' );
buttonEl.classList.add( 'is-active' );
buttonParentEl.classList.add( 'controls-enabled' );
}, 10 );
}
function getInputValues () {
var result = { };
for ( var key in inputEls ) {
result[key] = parseInt( inputEls[key].value, 10 );
}
return result;
}
// when setting a value, prevent dispatching
// of elements to avoid an infinite loop of
// input events
function setValue ( key, newValue ) {
isIgnoringInput = true;
inputEls[key].value = newValue;
valueEls[key].value = newValue;
isIgnoringInput = false;
}
self.loadInitialValues = loadInitialValues;
self.setValue = setValue;
}
return ControlsView;
}
);