diff --git a/index.html b/index.html index 450f659..57f3d1d 100644 --- a/index.html +++ b/index.html @@ -1,4 +1,5 @@ + dat.gui @@ -129,7 +130,7 @@
  • Download the minified source [11kb] + id="buildsize">[255.9kb]
  • diff --git a/src/DAT/GUI/GUI.js b/src/DAT/GUI/GUI.js index 6693c18..d71e804 100644 --- a/src/DAT/GUI/GUI.js +++ b/src/DAT/GUI/GUI.js @@ -6,10 +6,6 @@ DAT.GUI = function(parameters) { parameters = {}; } - if (parameters.height == undefined) { - parameters.height = 300; - } - var MIN_WIDTH = 240; var MAX_WIDTH = 500; @@ -23,9 +19,11 @@ DAT.GUI = function(parameters) { // Sum total of heights of controllers in this gui var controllerHeight; + var curControllerContainerHeight = 0; + var _this = this; - var open = true; + var open = false; var width = 280; // Prevents checkForOverflow bug in which loaded gui appearance @@ -47,10 +45,9 @@ DAT.GUI = function(parameters) { this.domElement.setAttribute('class', 'guidat'); this.domElement.style.width = width + 'px'; - var curControllerContainerHeight = parameters.height; var controllerContainer = document.createElement('div'); controllerContainer.setAttribute('class', 'guidat-controllers'); - controllerContainer.style.height = curControllerContainerHeight + 'px'; + controllerContainer.style.height = '0px'; // Firefox hack to prevent horizontal scrolling controllerContainer.addEventListener('DOMMouseScroll', function(e) { @@ -74,10 +71,11 @@ DAT.GUI = function(parameters) { }, false); + var toggleButton = document.createElement('a'); toggleButton.setAttribute('class', 'guidat-toggle'); toggleButton.setAttribute('href', '#'); - toggleButton.innerHTML = open ? closeString : openString; + toggleButton.innerHTML = openString; var toggleDragged = false; var dragDisplacementY = 0; @@ -310,7 +308,7 @@ DAT.GUI = function(parameters) { return; } - var args = [this]; // Set first arg (parent) to this + var args = [this]; // Set first arg (parent) to this for (var j = 0; j < arguments.length; j++) { args.push(arguments[j]); } @@ -367,10 +365,13 @@ DAT.GUI = function(parameters) { 'function': DAT.GUI.ControllerFunction }; + this.reset = function() { // TODO ... Set all values back to their initials. } + // DAT.GUI ... DAT.GUI + this.toggle = function() { open ? this.close() : this.open(); }; @@ -380,7 +381,6 @@ DAT.GUI = function(parameters) { resizeTo = openHeight; clearTimeout(resizeTimeout); beginResize(); - adaptToScrollbar(); open = true; } @@ -389,7 +389,6 @@ DAT.GUI = function(parameters) { resizeTo = 0; clearTimeout(resizeTimeout); beginResize(); - adaptToScrollbar(); open = false; } @@ -405,12 +404,13 @@ DAT.GUI = function(parameters) { var beginResize = function() { - curControllerContainerHeight = controllerContainer.offsetHeight; curControllerContainerHeight += (resizeTo - curControllerContainerHeight) * 0.6; if (Math.abs(curControllerContainerHeight - resizeTo) < 1) { curControllerContainerHeight = resizeTo; + adaptToScrollbar(); + } else { resizeTimeout = setTimeout(beginResize, 1000 / 30); } @@ -421,14 +421,15 @@ DAT.GUI = function(parameters) { } var adaptToScrollbar = function() { - // Clears lingering scrollbar column - _this.domElement.style.width = (width - 1) + 'px'; + // Clears lingering slider column + _this.domElement.style.width = (width + 1) + 'px'; setTimeout(function() { _this.domElement.style.width = width + 'px'; }, 1); }; + // Load saved appearance: if (DAT.GUI.guiIndex < DAT.GUI.savedAppearanceVars.length) { @@ -460,12 +461,10 @@ DAT.GUI = function(parameters) { DAT.GUI.allGuis.push(this); // Add hide listener if this is the first DAT.GUI. - if (DAT.GUI.allGuis.length == 1) { - window.addEventListener('keyup', function(e) { // Hide on 'H' - if (!DAT.GUI.supressHotKeys && e.keyCode == 72) { + if (e.keyCode == 72) { DAT.GUI.toggleHide(); } }, false); @@ -491,7 +490,6 @@ DAT.GUI.autoPlaceContainer = null; DAT.GUI.allControllers = []; DAT.GUI.allGuis = []; -DAT.GUI.supressHotKeys = false; DAT.GUI.toggleHide = function() { if (DAT.GUI.hidden) { @@ -542,7 +540,8 @@ DAT.GUI.savedAppearanceVars = []; DAT.GUI.getSaveString = function() { - var vals = [], i; + var vals = [], + i; vals.push(DAT.GUI.allGuis.length); vals.push(document.body.scrollTop); @@ -687,17 +686,19 @@ DAT.GUI.extendController = function(clazz) { DAT.GUI.addClass = function(domElement, className) { if (DAT.GUI.hasClass(domElement, className)) return; domElement.className += ' ' + className; -} +}; DAT.GUI.hasClass = function(domElement, className) { return domElement.className.indexOf(className) != -1; -} +}; DAT.GUI.removeClass = function(domElement, className) { var reg = new RegExp(' ' + className, 'g'); domElement.className = domElement.className.replace(reg, ''); -} +}; if (DAT.GUI.getVarFromURL('saveString') != null) { DAT.GUI.load(DAT.GUI.getVarFromURL('saveString')); } + +window["DAT.GUI"] = DAT.GUI; diff --git a/utils/barnraiser.py b/utils/barnraiser.py new file mode 100644 index 0000000..81e9ad9 --- /dev/null +++ b/utils/barnraiser.py @@ -0,0 +1,138 @@ +#/usr/bin/env python + +from optparse import OptionParser +import httplib, urllib +import os, fnmatch, shutil, re + +usage = """usage: %prog [options] command + +Commands: + build build the script + debug print the header to include js files + clean remove any built files +""" +parser = OptionParser(usage=usage) +parser.add_option('-l', '--level', dest='level', default='ADVANCED_OPTIMIZATIONS', + help='Closure compilation level [WHITESPACE_ONLY, SIMPLE_OPTIMIZATIONS, \ + ADVANCED_OPTIMIZATIONS]') + +UTILS = os.path.dirname(os.path.abspath(__file__)) + +SRC_ROOT= os.path.join(UTILS,'..','src') +BUILD_ROOT = os.path.join(UTILS,'..','build') +INDEX = os.path.join(UTILS,'..','index.html') +BUILD_NAME = 'DAT.GUI' +ALL = ['DAT'] + + +def flatten(l, ltypes=(list, tuple)): + ltype = type(l) + l = list(l) + i = 0 + while i < len(l): + while isinstance(l[i], ltypes): + if not l[i]: + l.pop(i) + i -= 1 + break + else: + l[i:i + 1] = l[i] + i += 1 + return ltype(l) + +def expand(path, globby): + matches = [] + path = path.split('.') + path.insert(0,SRC_ROOT) + path = os.path.join(*path) + for root, dirnames, filenames in os.walk(path): + for filename in fnmatch.filter(filenames, globby): + matches.append(os.path.join(root, filename)) + return matches + +def source_list(src, globby='*.js'): + def expander(f): + return expand(f,globby) + return set(flatten(map(expander, src))) + +def compile(code): + params = urllib.urlencode([ + ('js_code', code), + ('compilation_level', options.level), + ('output_format', 'text'), + ('output_info', 'compiled_code'), + ]) + headers = { 'Content-type': 'application/x-www-form-urlencoded' } + conn = httplib.HTTPConnection('closure-compiler.appspot.com') + conn.request('POST', '/compile', params, headers) + response = conn.getresponse() + data = response.read() + conn.close() + return data + +def bytes_to_kb(b,digits=1): + return round(0.0078125 * b, digits) + +def clean(): + if os.path.exists(BUILD_ROOT): + shutil.rmtree(BUILD_ROOT) + print('DONE. Removed %s'%(BUILD_ROOT,)) + else: + print('DONE. Nothing to clean') + +def build(src): + if not os.path.exists(BUILD_ROOT): + os.makedirs(BUILD_ROOT) + + cssfiles = source_list(src, '*.css') + css = '\n'.join([open(f).read() for f in cssfiles]) + css = re.sub(r'[ \t\n\r]+',' ',css) + + jsfiles = source_list(src, '*.js') + code = '\n'.join([open(f).read() for f in jsfiles]) + code += """DAT.GUI.inlineCSS = '%s';\n"""%(css,) + + outpath = os.path.join(BUILD_ROOT, BUILD_NAME+'.js') + with open(outpath,'w') as f: + f.write(code) + + compiled = compile(code) + outpath = os.path.join(BUILD_ROOT, BUILD_NAME+'.min.js') + with open(outpath,'w') as f: + f.write(compiled) + + outpath = os.path.join(BUILD_ROOT, BUILD_NAME+'.css') + with open(outpath,'w') as f: + f.write(code) + + size = bytes_to_kb(os.path.getsize(outpath)) + with open(INDEX,'r') as f: + index = f.read() + with open(INDEX,'w') as f: + index = re.sub(r'\[[0-9.]+kb\]','[%skb]'%(size,),index) + f.write(index) + + print('DONE. Built files in %s.'%(BUILD_ROOT,)) + +def debug(src): + files = source_list(src) + scripts = "" + for f in files: + scripts += '\n'%(f,) + print(scripts) + +if __name__ == '__main__': + global options + (options, args) = parser.parse_args() + if len(args) != 1: + print(parser.usage) + exit(0) + command = args[0] + if command == 'build': + build(ALL) + elif command == 'clean': + clean() + elif command == 'debug': + debug(ALL) + +