gui updates
parent
3fd2d5cdbe
commit
4c34fb2b92
|
@ -17,11 +17,45 @@ GameLib.GUI = function(
|
|||
parentEntity
|
||||
) {
|
||||
if (GameLib.Utils.UndefinedOrNull(gui)) {
|
||||
throw new Error('Need Stats object')
|
||||
throw new Error('Need GUI object')
|
||||
}
|
||||
this.gui = gui;
|
||||
|
||||
GameLib.Component.call(
|
||||
/**
|
||||
* Add some GUI behaviour
|
||||
*/
|
||||
this.gui.prototype.removeEmtpyFolders = function() {
|
||||
for (var property in this.__folders) {
|
||||
if (this.__folders.hasOwnProperty(property)){
|
||||
|
||||
var folder = this.__folders[property];
|
||||
|
||||
if (folder.__listening.length == 0) {
|
||||
folder.close();
|
||||
this.__ul.removeChild(folder.domElement.parentNode);
|
||||
delete this.__folders[property];
|
||||
this.onResize();
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
this.gui.prototype.removeAllFolders = function() {
|
||||
for (var property in this.__folders) {
|
||||
if (this.__folders.hasOwnProperty(property)){
|
||||
|
||||
var folder = this.__folders[property];
|
||||
|
||||
folder.close();
|
||||
this.__ul.removeChild(folder.domElement.parentNode);
|
||||
delete this.__folders[property];
|
||||
this.onResize();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
GameLib.Component.call(
|
||||
this,
|
||||
GameLib.Component.COMPONENT_GUI,
|
||||
{
|
||||
|
@ -685,4 +719,118 @@ GameLib.GUI.prototype.build = function() {
|
|||
}.bind(this)
|
||||
);
|
||||
|
||||
};
|
||||
|
||||
//returns params, a stripped version of paramsGUI, without all the GUI fluff
|
||||
GameLib.GUI.prototype.glue = function(paramsGUI, optionsGUI){
|
||||
|
||||
//pass options to GUI e.g., { autoPlace: false }
|
||||
optionsGUI = optionsGUI || {};
|
||||
|
||||
//extra parameter whether you want folders open or closed
|
||||
optionsGUI.folded = optionsGUI.folded || false;
|
||||
|
||||
// params is a stripped version of paramsGUI, where everything
|
||||
// but its default attributes have been removed
|
||||
var params = {};
|
||||
|
||||
this.renderParameters(paramsGUI, optionsGUI, params);
|
||||
|
||||
//return stripped parameter object
|
||||
return params;
|
||||
};
|
||||
|
||||
GameLib.GUI.prototype.renderParameters = function(paramsGUI, optionsGUI, params){
|
||||
|
||||
//initial creation
|
||||
var gui = this.instance;
|
||||
|
||||
//walk the parameter tree
|
||||
unfurl(paramsGUI, gui, params);
|
||||
|
||||
function unfurl(obj, folder, params){
|
||||
|
||||
for (var key in obj) {
|
||||
|
||||
var subObj = obj[key];
|
||||
var leaf = isLeaf(subObj);
|
||||
|
||||
if (leaf){
|
||||
addToFolder(key, obj, subObj, folder, params);
|
||||
}
|
||||
else{
|
||||
//is folder
|
||||
var subfolder = folder.addFolder(key);
|
||||
if (!optionsGUI.folded)
|
||||
subfolder.open();
|
||||
|
||||
params[key] = {};
|
||||
unfurl(obj[key], subfolder, params[key]);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//a leaf object is one that contains no other objects
|
||||
//it is critical that none of the tracked parameters is itself an object
|
||||
function isLeaf(obj){
|
||||
|
||||
var Leaf = true;
|
||||
for (var key in obj){
|
||||
|
||||
if (key === 'choices' && obj.display === 'selector') continue;
|
||||
|
||||
if (Leaf){
|
||||
var isObj = (Object.prototype.toString.call( obj[key] ) !== '[object Object]');
|
||||
Leaf = Leaf && isObj;
|
||||
}
|
||||
else
|
||||
continue;
|
||||
}
|
||||
|
||||
return Leaf;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function addToFolder(key, obj, options, folder, params){
|
||||
|
||||
var handle;
|
||||
params[key] = options.value;
|
||||
|
||||
var display = options.display || '';
|
||||
|
||||
switch (display){
|
||||
case 'range':
|
||||
if (options.step)
|
||||
handle = folder.add(params, key, options.min, options.max).step(options.step);
|
||||
else
|
||||
handle = folder.add(params, key, options.min, options.max);
|
||||
break;
|
||||
case 'selector':
|
||||
handle = folder.add(params, key, options.choices);
|
||||
break;
|
||||
case 'color':
|
||||
handle = folder.addColor(params, key);
|
||||
break;
|
||||
case 'none':
|
||||
break;
|
||||
default:
|
||||
handle = folder.add(params, key);
|
||||
break;
|
||||
}
|
||||
|
||||
if (handle && options.onChange)
|
||||
handle.onChange(options.onChange);
|
||||
|
||||
if (handle && options.onFinishChange)
|
||||
handle.onChange(options.onFinishChange);
|
||||
|
||||
if (handle && options.listen)
|
||||
handle.listen();
|
||||
|
||||
}
|
||||
|
||||
return gui;
|
||||
|
||||
};
|
Loading…
Reference in New Issue