From 9e30b7c53af47c7b366056a214cacfeecebf016c Mon Sep 17 00:00:00 2001 From: dsc Date: Fri, 17 Dec 2010 18:00:31 -0800 Subject: [PATCH] Now persists config values via cookie. Also resolves issue with deepcopy --- src/Y/index.cjs | 10 ++++---- src/Y/modules/y.config.cjs | 4 ++- src/Y/modules/y.cookies.cjs | 30 +++++++++++++++++++++++---- src/Y/modules/y.scaffold.cjs | 4 ++- src/Y/types/object.cjs | 45 ++++++++++++++++++++++++++++++++++++----- src/tanks/ui/configui.cjs | 21 +++++++++++++++--- www/deps.html | 5 +-- 7 files changed, 94 insertions(+), 25 deletions(-) diff --git a/src/Y/index.cjs b/src/Y/index.cjs index 387f5d7..dd9f2b5 100644 --- a/src/Y/index.cjs +++ b/src/Y/index.cjs @@ -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; diff --git a/src/Y/modules/y.config.cjs b/src/Y/modules/y.config.cjs index 9e6e42d..91a694c 100644 --- a/src/Y/modules/y.config.cjs +++ b/src/Y/modules/y.config.cjs @@ -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 }; diff --git a/src/Y/modules/y.cookies.cjs b/src/Y/modules/y.cookies.cjs index b3aedac..378938f 100644 --- a/src/Y/modules/y.cookies.cjs +++ b/src/Y/modules/y.cookies.cjs @@ -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. diff --git a/src/Y/modules/y.scaffold.cjs b/src/Y/modules/y.scaffold.cjs index 75d23d3..9a499df 100644 --- a/src/Y/modules/y.scaffold.cjs +++ b/src/Y/modules/y.scaffold.cjs @@ -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('
') @@ -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; } ; diff --git a/src/Y/types/object.cjs b/src/Y/types/object.cjs index e3a57ba..63e89f7 100644 --- a/src/Y/types/object.cjs +++ b/src/Y/types/object.cjs @@ -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) ); + } }); diff --git a/src/tanks/ui/configui.cjs b/src/tanks/ui/configui.cjs index 87df7b6..750d923 100644 --- a/src/tanks/ui/configui.cjs +++ b/src/tanks/ui/configui.cjs @@ -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('
') ); + 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('
') ); 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(){ diff --git a/www/deps.html b/www/deps.html index e1bea90..e4ffb4b 100644 --- a/www/deps.html +++ b/www/deps.html @@ -45,14 +45,13 @@ - - - + + -- 1.7.0.4