Now persists config values via cookie. Also resolves issue with deepcopy
authordsc <david.schoonover@gmail.com>
Sat, 18 Dec 2010 02:00:31 +0000 (18:00 -0800)
committerdsc <david.schoonover@gmail.com>
Sat, 18 Dec 2010 02:00:31 +0000 (18:00 -0800)
src/Y/index.cjs
src/Y/modules/y.config.cjs
src/Y/modules/y.cookies.cjs
src/Y/modules/y.scaffold.cjs
src/Y/types/object.cjs
src/tanks/ui/configui.cjs
www/deps.html

index 387f5d7..dd9f2b5 100644 (file)
@@ -50,11 +50,11 @@ addNames('Class subclass instantiate fabricate YBase', require('Y/class'));
 
 
 /// Now start assembling the normal sub-modules ///
-addNames('YCollection',   require('Y/types/collection'));
-addNames('YArray',        require('Y/types/array'));
-addNames('YObject',       require('Y/types/object'));
-addNames('YString',       require('Y/types/string'));
-addNames('YNumber range', require('Y/types/number'));
+addNames('YCollection',      require('Y/types/collection'));
+addNames('YArray',           require('Y/types/array'));
+addNames('YObject deepcopy', require('Y/types/object'));
+addNames('YString',          require('Y/types/string'));
+addNames('YNumber range',    require('Y/types/number'));
 
 var utils = require('Y/utils');
 Y['bindAll'] = utils.bindAll;
index 9e6e42d..91a694c 100644 (file)
@@ -12,7 +12,8 @@ Y.YObject.subclass('Config', function(Config){
         
         init : function initConfig(defaults){
             this._defaults = defaults || {};
-            this._o = Y({}, this._defaults);
+            // this._o = Y({}, this._defaults);
+            this._o = Y(Y.deepcopy(this._defaults));
             this.__emitter__ = new Emitter(this);
         },
         
@@ -59,6 +60,7 @@ Y.YObject.subclass('Config', function(Config){
                     'key'    : key,
                     'oldval' : oldval,
                     'newval' : newval,
+                    'defval' : this.getDefault(key),
                     'obj'    : obj,
                     'root'   : this
                 };
index b3aedac..378938f 100644 (file)
@@ -1,26 +1,46 @@
+//#ensure "Y/modules/y.kv"
 var _document = document
 ,   Y   = require('Y').Y
 ,   enc = encodeURIComponent
 ,   dec = decodeURIComponent
-;
+,
 
-Y['cookies'] = exports;
+getAll =
+exports['all'] =
+    function getAll(){
+        return Y(_document.cookie+'').fromKV('; ');
+    }
+,
 
+getCookie =
 exports['get'] =
     function getCookie(k){
-        var cookies = Y(_document.cookie+'').fromKV('; ');
+        var cookies = getAll();
         if (k !== undefined)
             return cookies[k];
         else
             return cookies;
-    };
+    }
+,
 
+setCookie =
 exports['set'] = 
     function setCookie(k, v, expires, path){
         expires = 'expires='+(expires || "Sun, 24-Mar-2024 11:11:11 GMT");
         path = 'path='+(path || "/");
         _document.cookie = [ enc(k)+'='+enc(v), expires, path ].join('; ');
         return Y.cookies.get();
-    };
+    }
+,
+
+removeCookie =
+exports['remove'] =
+    function removeCookie(k, path){
+        if (_document.cookie)
+            _document.cookie = k+'= ; expires=Fri, 15-Jun-1984 11:11:11 GMT; path='+(path || '/');
+    }
+;
+
+Y['cookies'] = exports;
 
 // TODO: YCollection methods on ns over kv pairs.
index 75d23d3..9a499df 100644 (file)
@@ -122,6 +122,7 @@ Y.subclass('Field', {
 create =
 exports['create'] =
 function create(config, el){
+    var fields = {};
     config.parts(
         function createGroup(oldGroup, value, chain){
             return jQuery('<fieldset/>')
@@ -134,6 +135,7 @@ function create(config, el){
             var def = config.getDefault(chain)
             ,   field = new Field(chain, def, value);
             
+            fields[chain] = field;
             group.append(field.el);
             config.addEventListener('set:'+chain, function onConfigSet(evt){
                 field.update(evt.data.newval);
@@ -145,7 +147,7 @@ function create(config, el){
             return group;
         },
         el);
-    return el;
+    return fields;
 }
 ;
 
index e3a57ba..63e89f7 100644 (file)
@@ -78,19 +78,52 @@ function getNested(o, chain, def){
 function setNested(o, chain, value){
     if (o && chain){
         var prop = getNestedMeta(ensure(o,chain), chain);
-        prop.obj[prop.key] = value;
+        del.attr(prop.obj, prop.key, value);
     }
     return o;
 }
 
-var YObject =
+var deepcopy =
+exports['deepcopy'] =
+function deepcopy(o){
+    if (!o)
+        return o;
+    
+    if ( Y.isFunction(o.clone) )
+        return o.clone();
+    
+    var path = new Y.YArray();
+    return core.reduce(o, function _deepcopy(acc, v, k){
+        var chain = path.push(k).join('.');
+        
+        if ( v && Y.isFunction(v.clone) )
+            acc.setNested(chain, v.clone());
+        
+        // Nested object -- recurse
+        else if ( Y.isPlainObject(v) )
+            core.reduce(v, _deepcopy, acc);
+            
+        // "Normal" value -- just set
+        else
+            acc.setNested(chain, v);
+        
+        path.pop();
+        return acc;
+    }, new YObject()).end();
+}
+,
+
+YObject =
 exports['YObject'] =
-YCollection.subclass('YObject', function setupYObject(YObject){
+YCollection.subclass('YObject', {
     
-    this['init'] =
-    function initYObject(o){
+    init : function initYObject(o){
         this._o = o || {};
-    };
+    },
+    
+    clone : function clone(){
+        return new YObject( deepcopy(this._o) );
+    }
     
 });
 
index 87df7b6..750d923 100644 (file)
@@ -1,21 +1,34 @@
 //#ensure "jquery"
 var Y = require('Y').Y
-,   EventLoop = require('ezl/loop/eventloop').EventLoop
+,   cookies   = require('Y/modules/y.cookies')
 ,   scaffold  = require('Y/modules/y.scaffold')
+,   EventLoop = require('ezl/loop/eventloop').EventLoop
 ,   config    = require('tanks/config').values
-,   configUI
+,   configUI, fields
 ;
 
 exports['init'] =
 function initConfigUi(){
-    configUI = scaffold.create(config, jQuery('#config .box'));
-    configUI.append( jQuery('<div class="clearer"></div>') );
+    configUI = jQuery('#config .box');
+    fields   = scaffold.create(config, configUI);
+    Y.core.forEach(fields, function(field, key){
+        var cookie = cookies.get(key);
+        if (cookie) config.set(key, field.cast(cookie));
+    });
     
+    configUI.append( jQuery('<div class="clearer"></div>') );
     config.addEventListener('set:game.timeDilation', function(evt){
         EventLoop.fn.dilation = evt.data.newval;
     });
 };
 
+config.addEventListener('set', function(evt){
+    var d = evt.data;
+    if (d.newval !== d.defval)
+        cookies.set(d.key, d.newval);
+    else
+        cookies.remove(d.key);
+});
 
 // exports['init'] =
 // function initConfigUi(){
index e1bea90..e4ffb4b 100644 (file)
 <script src="build/ezl.js" type="text/javascript"></script>
 <script src="build/tanks/globals.js" type="text/javascript"></script>
 <script src="build/jquery.hotkeys.js" type="text/javascript"></script>
-<script src="build/mustache.js" type="text/javascript"></script>
-<script src="build/jquery.mustache.js" type="text/javascript"></script>
 <script src="build/ezl/util/binaryheap.js" type="text/javascript"></script>
 <script src="build/ezl/util/astar.js" type="text/javascript"></script>
-<script src="build/Y/modules/y.scaffold.js" type="text/javascript"></script>
+<script src="build/Y/modules/y.cookies.js" type="text/javascript"></script>
 <script src="build/Y/modules/y.kv.js" type="text/javascript"></script>
 <script src="build/ezl/util/tree/quadtree.js" type="text/javascript"></script>
 <script src="build/y/modules/y.config.js" type="text/javascript"></script>
+<script src="build/Y/modules/y.scaffold.js" type="text/javascript"></script>
 <script src="build/tanks/config.js" type="text/javascript"></script>
 <script src="build/tanks/ui/configui.js" type="text/javascript"></script>
 <script src="build/tanks/thing/thing.js" type="text/javascript"></script>