mirror of
https://github.com/dataarts/dat.gui.git
synced 2024-12-12 04:08:27 +00:00
3b4f6e3944
Included prettify.js in the repo so people checking the demo localy doesn't need the internets. Changed way of hidding the panel (controllerContainer.style.height rather than this.domElement.stylemarginTop).
133 lines
3.7 KiB
JavaScript
133 lines
3.7 KiB
JavaScript
// TODO: Provide alternate controllers for non-html5 browsers?
|
|
var NumberController = function() {
|
|
|
|
this.type = "number";
|
|
|
|
Controller.apply(this, arguments);
|
|
|
|
var _this = this;
|
|
|
|
// If we simply click and release a number field, we want to highlight it.
|
|
// This variable keeps track of whether or not we've dragged
|
|
var draggedNumberField = false;
|
|
|
|
var clickedNumberField = false;
|
|
|
|
var y = py = 0;
|
|
|
|
var min = arguments[2];
|
|
var max = arguments[3];
|
|
var step = arguments[4];
|
|
|
|
if (!step) {
|
|
if (min != undefined && max != undefined) {
|
|
step = (max-min)*0.01;
|
|
} else {
|
|
step = 1;
|
|
}
|
|
}
|
|
|
|
console.log("step " + step);
|
|
|
|
var numberField = document.createElement('input');
|
|
numberField.setAttribute('id', this.propertyName);
|
|
|
|
// Little up and down arrows are pissing me off.
|
|
numberField.setAttribute('type', 'text');
|
|
numberField.setAttribute('value', this.getValue());
|
|
|
|
if (step) numberField.setAttribute('step', step);
|
|
|
|
this.domElement.appendChild(numberField);
|
|
|
|
var slider;
|
|
|
|
if (min != undefined && max != undefined) {
|
|
slider = new Slider(this, min, max, step, this.getValue());
|
|
this.domElement.appendChild(slider.domElement);
|
|
}
|
|
|
|
numberField.addEventListener('blur', function(e) {
|
|
var val = parseFloat(this.value);
|
|
if (!isNaN(val)) {
|
|
_this.updateValue(val);
|
|
} else {
|
|
this.value = _this.getValue();
|
|
}
|
|
}, false);
|
|
|
|
numberField.addEventListener('mousewheel', function(e) {
|
|
e.preventDefault();
|
|
this.updateValue(_this.getValue() + Math.abs(e.wheelDeltaY)/e.wheelDeltaY*step);
|
|
return false;
|
|
}, false);
|
|
|
|
numberField.addEventListener('mousedown', function(e) {
|
|
py = y = e.pageY;
|
|
clickedNumberField = true;
|
|
document.addEventListener('mousemove', dragNumberField, false);
|
|
}, false);
|
|
|
|
document.addEventListener('mouseup', function(e) {
|
|
document.removeEventListener('mousemove', dragNumberField, false);
|
|
_this.makeSelectable(_this.parent.domElement);
|
|
_this.makeSelectable(numberField);
|
|
if (clickedNumberField && !draggedNumberField) {
|
|
numberField.focus();
|
|
numberField.select();
|
|
}
|
|
draggedNumberField = false;
|
|
clickedNumberField = false;
|
|
}, false);
|
|
|
|
// Kinda nast
|
|
if (navigator.appVersion.indexOf('chrome') != -1) {
|
|
document.addEventListener('mouseout', function(e) {
|
|
document.removeEventListener('mousemove', dragNumberField, false);
|
|
}, false);
|
|
}
|
|
|
|
var dragNumberField = function(e) {
|
|
draggedNumberField = true;
|
|
e.preventDefault();
|
|
|
|
// We don't want to be highlighting this field as we scroll.
|
|
// Or any other fields in this gui for that matter ...
|
|
// TODO: Make makeUselectable go through each element and child element.
|
|
_this.makeUnselectable(GUI.domElement);
|
|
_this.makeUnselectable(numberField);
|
|
|
|
py = y;
|
|
y = e.pageY;
|
|
var dy = py - y;
|
|
var newVal = _this.getValue() + dy*step;
|
|
_this.updateValue(newVal);
|
|
return false;
|
|
}
|
|
|
|
this.updateValue = function(val) {
|
|
|
|
val = parseFloat(val);
|
|
|
|
if (min != undefined && val <= min) {
|
|
val = min;
|
|
} else if (max != undefined && val >= max) {
|
|
val = max;
|
|
}
|
|
|
|
_this.setValue(val);
|
|
|
|
numberField.value = roundToDecimal(_this.getValue(), 4);
|
|
if (slider) slider.value = _this.getValue();
|
|
}
|
|
|
|
var roundToDecimal = function(n, decimals) {
|
|
var t = Math.pow(10, decimals);
|
|
return Math.round(n*t)/t;
|
|
}
|
|
|
|
};
|
|
|
|
NumberController.prototype = new Controller();
|
|
NumberController.prototype.constructor = NumberController;
|