From 4c34fb2b92c80d77cafc29c50b54f76a7f2d1a85 Mon Sep 17 00:00:00 2001 From: -=yb4f310 Date: Sat, 20 May 2017 09:45:50 +0200 Subject: [PATCH] gui updates --- src/game-lib-gui.js | 152 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 150 insertions(+), 2 deletions(-) diff --git a/src/game-lib-gui.js b/src/game-lib-gui.js index a220cfa..b0acee6 100644 --- a/src/game-lib-gui.js +++ b/src/game-lib-gui.js @@ -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; + }; \ No newline at end of file