You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
120 lines
3.5 KiB
120 lines
3.5 KiB
import Rx, { Observable } from 'rxjs';
|
|
|
|
function Controls(node, { speed, otherstuff }) {
|
|
this.node = node;
|
|
}
|
|
|
|
Controls.prototype.mount = function(customNodes) {
|
|
const countCtrl = renderCountControl();
|
|
const speedCtrl = renderSpeedControl();
|
|
const radiusCtrl = renderRadiusControl();
|
|
const rotationCtrl = renderRotationControl();
|
|
const startStopCtrl = renderStartStopControl();
|
|
|
|
this.node.appendChild(countCtrl);
|
|
this.node.appendChild(speedCtrl);
|
|
this.node.appendChild(radiusCtrl);
|
|
this.node.appendChild(rotationCtrl);
|
|
this.node.appendChild(startStopCtrl);
|
|
|
|
return Rx.Observable.merge(
|
|
Rx.Observable.fromEvent(countCtrl, 'change')
|
|
.map(evt => ({ key: 'count', value: evt.target.value * 1 })),
|
|
Rx.Observable.fromEvent(speedCtrl, 'change')
|
|
.map(evt => ({ key: 'speed', value: evt.target.value * 1 })),
|
|
Rx.Observable.fromEvent(radiusCtrl, 'change')
|
|
.map(evt => ({ key: 'radius', value: evt.target.checked })),
|
|
Rx.Observable.fromEvent(rotationCtrl, 'change')
|
|
.map(evt => ({ key: 'rotation', value: evt.target.checked })),
|
|
Rx.Observable.fromEvent(startStopCtrl, 'click')
|
|
.map(evt => ({ key: 'startstop', value: null })),
|
|
);
|
|
}
|
|
|
|
const renderCountControl = function() {
|
|
const label = document.createElement('label');
|
|
label.className = 'controls-label';
|
|
|
|
const text = document.createElement('span');
|
|
text.innerHTML = 'Number of particles';
|
|
text.className = 'controls-label-text';
|
|
|
|
const slider = document.createElement('input');
|
|
slider.type = 'range';
|
|
slider.min = 1;
|
|
slider.max = 10;
|
|
slider.className = 'controls-slider';
|
|
|
|
label.appendChild(text);
|
|
label.appendChild(slider);
|
|
|
|
return label;
|
|
}
|
|
|
|
const renderSpeedControl = function() {
|
|
const label = document.createElement('label');
|
|
label.className = 'controls-label';
|
|
|
|
const text = document.createElement('span');
|
|
text.innerHTML = 'Animation speed';
|
|
text.className = 'controls-label-text';
|
|
|
|
const slider = document.createElement('input');
|
|
slider.type = 'range';
|
|
slider.min = 1;
|
|
slider.max = 10;
|
|
slider.className = 'controls-slider';
|
|
|
|
label.appendChild(text);
|
|
label.appendChild(slider);
|
|
|
|
return label;
|
|
}
|
|
|
|
const renderRadiusControl = function() {
|
|
const label = document.createElement('label');
|
|
label.className = 'controls-label';
|
|
|
|
const text = document.createElement('span');
|
|
text.innerHTML = 'Random radii';
|
|
text.className = 'controls-label-text';
|
|
|
|
const checkbox = document.createElement('input');
|
|
checkbox.type = 'checkbox';
|
|
checkbox.className = 'controls-label-checkbox';
|
|
|
|
label.appendChild(checkbox);
|
|
label.appendChild(text);
|
|
|
|
return label;
|
|
}
|
|
|
|
const renderRotationControl = function() {
|
|
const label = document.createElement('label');
|
|
label.className = 'controls-label';
|
|
|
|
const text = document.createElement('span');
|
|
text.innerHTML = 'Random rotation';
|
|
text.className = 'controls-label-text';
|
|
|
|
const checkbox = document.createElement('input');
|
|
checkbox.type = 'checkbox';
|
|
checkbox.className = 'controls-label-checkbox';
|
|
|
|
label.appendChild(checkbox);
|
|
label.appendChild(text);
|
|
|
|
return label;
|
|
}
|
|
|
|
const renderStartStopControl = function() {
|
|
const button = document.createElement('button');
|
|
button.className = 'controls-button controls-bottom';
|
|
button.innerHTML = '▶ Start';
|
|
|
|
// button.innerHTML = '◼ Stop';
|
|
|
|
return button;
|
|
}
|
|
|
|
export default Controls;
|
|
|