diff --git a/ui (gen4)/lib/widget/browse2.html b/ui (gen4)/lib/widget/browse2.html index 3298e6da..f36720d0 100755 --- a/ui (gen4)/lib/widget/browse2.html +++ b/ui (gen4)/lib/widget/browse2.html @@ -103,7 +103,6 @@ requirejs([ // XXX split this into several dialogues, show each and then combine... dialog_1 = browser.Browser(function(make){ - make(123) make([321, 321, 123]) make.group( make('a'), @@ -121,9 +120,12 @@ requirejs([ })) // basic nested list... make.nest('A', [ - 1, make('moo', {disabled: true}), 2, + // XXX this is not supported by .map(..)... + make.nest('AB', browser.Browser(function(make){ + make('ab') + })), ]) make('in between...') // nested browser... diff --git a/ui (gen4)/lib/widget/browse2.js b/ui (gen4)/lib/widget/browse2.js index ebd1cf4e..18ab7758 100755 --- a/ui (gen4)/lib/widget/browse2.js +++ b/ui (gen4)/lib/widget/browse2.js @@ -143,8 +143,10 @@ Items.group = function(...items){ // Place list in a sub-list of item... // +// XXX options??? Items.nest = function(item, list, options){ options = options || {} + //options = Object.assign(Object.create(this.options || {}), options || {}) options.sublist = list instanceof Array ? collectItems(this, list) : list @@ -500,8 +502,7 @@ var BaseBrowserPrototype = { // // XXX revise options handling for .__list__(..) make: function(options){ - // XXX - options = options || this.options || {} + options = Object.assign(Object.create(this.options || {}), options || {}) var items = this.items = [] var old_index = this.__item_index || {} @@ -672,7 +673,8 @@ var BaseBrowserPrototype = { // NOTE: we are not combining this with .options as nested // lists can have their own unique sets of options // independently of the root list... - options: options || this.options || {}, + //options: options || this.options || {}, + options: Object.assign(Object.create(this.options || {}), options || {}), } : options options = context.options @@ -754,6 +756,7 @@ var BaseBrowserPrototype = { // XXX skip .noniterable items... get: function(key, options){ key = key == null ? 0 : key + options = Object.assign(Object.create(this.options || {}), options || {}) // index... if(typeof(key) == typeof(123)){ @@ -851,10 +854,19 @@ var BaseBrowserPrototype = { // -> item // -> undefined // - // options format: the same as for .map(..) see that for details. + // + // options format: + // { + // ignoreKeywords: , + // + // // rest of the options are the same as for .map(..) + // ... + // } + // // // XXX this is not too fast for indexing very long lists... // XXX use cache for these -- currently these use .map(..)... + // XXX do we need to support negative indexes??? get: function(key, options){ key = key == null ? 0 : key key = typeof(key) == typeof('str') ? @@ -864,9 +876,43 @@ var BaseBrowserPrototype = { key = typeof(key) == typeof('str') ? [key] : key - options = options || {} - var iterateCollapsed = options.iterateAll || options.iterateCollapsed + options = Object.assign(Object.create(this.options || {}), options || {}) + var iterateCollapsed = options.iterateAll || options.iterateCollapsed + var ignoreKeywords = options.ignoreKeywords + + // keywords... + // XXX keyword support: first/last/next/prev/... + if(!ignoreKeywords){ + // XXX don't like how this feels... + if(key == 'next' || key == 'prev'){ + var reference = this.focused + key = key == 'next' ? + (reference ? + this.indexOf(reference) + 1 + : 0) + : (reference ? + this.indexOf(reference) - 1 + : -1) + } + + if(key == 'first'){ + var res = this.items[0] + return res.value instanceof Browser ? + res.value.get(key, options) + : res + + } else if(key == 'last'){ + var res = this.items[this.items.length - 1] + return res.value instanceof Browser ? + res.value.get(key, options) + : res.sublist && (!this.collapsed || iterateCollapsed) ? + (res.sublist instanceof Browser ? + res.sublist.get(key, options) + : res.sublist[res.sublist.length - 1]) + : res + } + } // get path... if(key instanceof Array){ @@ -882,6 +928,7 @@ var BaseBrowserPrototype = { // XXX getting an element by index is o(n) and not o(1)... // ...unless we cache .sublists() not sure if this can be // made better in the general case... + // XXX do we need to support negative indexes??? var Stop = new Error('.get(..): Result found exception.') var i = 0 var res @@ -1098,9 +1145,13 @@ var BaseBrowserPrototype = { path = path instanceof Array ? path : [path] var options = args.pop() || {} + options = Object.assign(Object.create(this.options || {}), options || {}) var iterateNonIterable = options.iterateAll || options.iterateNonIterable var iterateCollapsed = options.iterateAll || options.iterateCollapsed var skipNested = !options.iterateAll && options.skipNested + + // XXX this does not handle nesting in a correct manner + var reverse = !!options.reverseIteration var doElem = function(elem){ return [func ? @@ -1108,6 +1159,14 @@ var BaseBrowserPrototype = { : elem] } return this.items + // check if we need to go from the end... + // NOTE: we need to reverse two things: + // - level order (done here) + // - linearization order (done below) + .run(function(){ + return reverse ? + this.slice().reverse() + : this }) .map(function(elem){ return ( // item not iterable -- skip... @@ -1123,11 +1182,17 @@ var BaseBrowserPrototype = { // .sublist is Browser (nested) -- list header then browser items... : (!skipNested && elem.sublist instanceof Browser) ? - doElem(elem) - .concat((!iterateCollapsed && elem.collapsed) ? + [doElem(elem), + (!iterateCollapsed && elem.collapsed) ? [] - : elem.sublist.map(func, path.concat(elem.id), options)) + : elem.sublist.map(func, path.concat(elem.id), options)] + // handle reverse... + .run(function(){ + reverse + && this.reverse() }) + .flat() // .sublist is Array (nested) -- list header then array content... + // XXX this skips nested browser .sublists... : (!skipNested && elem.sublist instanceof Array) ? doElem(elem) @@ -1138,6 +1203,12 @@ var BaseBrowserPrototype = { .map(function(e){ return func.call(that, e, path.concat(elem.id, e.id), that) }) : elem.sublist.slice())) + // handle reverse... + // XXX if we support nested browsers in lists + // this will mess things up... + .run(function(){ + reverse + && this.reverse() }) // normal item -- list... : doElem(elem) ) }) .flat() }, @@ -1148,7 +1219,8 @@ var BaseBrowserPrototype = { // NOTE: these will return a sparse array... sublists: function(func, options){ var that = this - options = options || {} + //options = options || {} + options = Object.assign(Object.create(this.options || {}), options || {}) var skipNested = options.skipNested var skipInlined = options.skipInlined