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)
+
+