diff --git a/ui (gen4)/file.js b/ui (gen4)/file.js index aa93c8f1..535ae9cf 100755 --- a/ui (gen4)/file.js +++ b/ui (gen4)/file.js @@ -569,31 +569,33 @@ function(json, changes){ current: json.data.current, } - // NOTE: we write the whole set ONLY if an item is true or undefined - // i.e. not false... - if(changes.bookmarked !== false){ - res.bookmarked = [ - json.data.tags.bookmark, - // NOTE: this is for bookmark metadata line comments, text, - // tags, ... etc. - // XXX currently this is not used... - json.data.bookmark_data || {}, - ] - } + if(json.data.tags != null){ + // NOTE: we write the whole set ONLY if an item is true or undefined + // i.e. not false... + if(changes.bookmarked !== false){ + res.bookmarked = [ + json.data.tags.bookmark || [], + // NOTE: this is for bookmark metadata line comments, text, + // tags, ... etc. + // XXX currently this is not used... + json.data.bookmark_data || {}, + ] + } - if(changes.selected !== false){ - res.marked = json.data.tags.selected - } + if(changes.selected !== false){ + res.marked = json.data.tags.selected || [] + } - if(changes.tags !== false){ - res.tags = json.data.tags - } + if(changes.tags !== false){ + res.tags = json.data.tags + } - // clean out some stuff from data... - delete res.data.tags.bookmark - delete res.data.tags.bookmark_data - delete res.data.tags.selected - delete res.data.tags + // clean out some stuff from data... + delete res.data.tags.bookmark + delete res.data.tags.bookmark_data + delete res.data.tags.selected + delete res.data.tags + } if(changes.images){ var diff = res['images-diff'] = {} diff --git a/ui (gen4)/images.js b/ui (gen4)/images.js index eeafad65..56f27ee4 100755 --- a/ui (gen4)/images.js +++ b/ui (gen4)/images.js @@ -279,16 +279,23 @@ module.makeImageSeqOrNameCmp = function(data, get, seq){ var ImagesClassPrototype = module.ImagesClassPrototype = { // XXX populate the image doc better... - fromArray: function(data){ + // NOTE: if base is given then it will be set as .base_path and + // removed from each url if present... + fromArray: function(data, base){ var images = new this() // XXX stub... var i = 0 + var base_pattern = base ? RegExp('^' + base) : null data.forEach(function(path){ var gid = hash('I'+i) // XXX populate the image doc better... images[gid] = { id: gid, - path: path, + path: base_pattern ? path.replace(base_pattern, './') : path, + } + // remove only of base path is given and in path... + if(base && base_pattern.test(path)){ + images[gid].base_path = base } i += 1 }) diff --git a/ui (gen4)/lib/actions.js b/ui (gen4)/lib/actions.js index 62b17ab8..62f19069 100755 --- a/ui (gen4)/lib/actions.js +++ b/ui (gen4)/lib/actions.js @@ -254,7 +254,7 @@ function Action(name, doc, ldoc, func){ //res = h.apply(that, args) res = h.apply(that, [results[0] !== undefined ? - reults[0] + results[0] : that].concat(args)) // deferred... diff --git a/ui (gen4)/viewer.js b/ui (gen4)/viewer.js index 86d8a86e..291788f7 100755 --- a/ui (gen4)/viewer.js +++ b/ui (gen4)/viewer.js @@ -263,10 +263,10 @@ actions.Actions({ // XXX should this be here??? loadURLs: ['File/Load a URL list', - function(lst){ + function(lst, base){ this.clear() - this.images = images.Images.fromArray(lst) + this.images = images.Images.fromArray(lst, base) this.data = data.Data.fromArray(this.images.keys()) }], @@ -675,8 +675,6 @@ actions.Actions({ // crop... // - // XXX should we keep this isolated or should we connect stuff like - // tags, ... crop: ['Crop/Crop image list', function(list, flatten){ list = list || this.data.order @@ -3338,14 +3336,33 @@ if(window.nodejs != null){ // .loaded_paths var FileSystemLoaderActions = actions.Actions({ config: { - //'index-dir': '.ImageGrid', + 'index-dir': '.ImageGrid', }, + // NOTE: these will remove the trailing '/' (or '\') unless the path + // is root... + // ...this is mainly to facilitate better browse support, i.e. + // to open the dir (open parent + select current) and not + // within the dir // XXX need to revise these... // XXX should there be a loaded path and a requested path??? - base_path: null, + get base_path(){ + var b = this._base_path + if(b && b != '/' && b != '\\'){ + b = b.replace(/[\/\\]+$/, '') + } + return b + }, + // XXX use .loadPath(..) + set base_path(value){ + if(value != '/' && value != '\\'){ + value = value.replace(/[\/\\]+$/, '') + } + this._base_path = value + this.loadIndex(value) + }, loaded_paths: null, - + // NOTE: when passed no path this will not do anything... // XXX should this set something like .path??? // ...and how should this be handled when merging indexes or @@ -3450,7 +3467,7 @@ var FileSystemLoaderActions = actions.Actions({ that.loaded_paths = loaded // XXX should we get the requested path or the base path currently loaded //that.base_path = loaded.length == 1 ? loaded[0] : path - that.base_path = loaded.length == 1 ? loaded[0] : path + that._base_path = loaded.length == 1 ? loaded[0] : path that.load(index) }) @@ -3468,20 +3485,29 @@ var FileSystemLoaderActions = actions.Actions({ return glob(path + '/*+(jpg|png)') .on('end', function(lst){ - that.loadURLs(lst) + that.loadURLs(lst, path) // XXX not sure if this is the way to go... - that.base_path = path + that._base_path = path }) }], // XXX auto-detect format or let the user chose... loadPath: ['File/Load path (STUB)', + function(path, logger){ + // XXX check if this.config['index-dir'] exists, if yes then + // .loadIndex(..) else .loadImages(..) + }], + + // XXX + loadNewImages: ['File/Load new and not indexed images', function(){ + // XXX list images and add ones that are not in .images + // XXX }], clear: [function(){ - delete this.base_path + delete this._base_path delete this.loaded_paths }], }) @@ -3663,6 +3689,7 @@ var FileSystemWriterActions = actions.Actions({ // // saved. // prepared: , // } + // prepareIndexForWrite: ['File/Prepare index for writing', function(json){ json = json || this.json('base') @@ -3671,7 +3698,6 @@ var FileSystemWriterActions = actions.Actions({ prepared: file.prepareIndex(json), } }], - // XXX should this get the base uncropped state or the current state??? // XXX get real base path... saveIndex: ['File/Save index', function(path, logger){ @@ -3689,7 +3715,9 @@ var FileSystemWriterActions = actions.Actions({ file.writeIndex( this.prepareIndexForWrite().prepared, - path, + // XXX should we check if index dir is present in path??? + //path, + path +'/'+ this.config['index-dir'], this.config['index-filename-template'], logger || this.logger) }], @@ -3699,9 +3727,55 @@ var FileSystemWriterActions = actions.Actions({ function(){ }], // XXX export current state as a full loadable index - // XXX might be interresting to unify this and .exportView(..) + // XXX might be interesting to unify this and .exportView(..) + // XXX local collections??? exportCollection: ['File/Export as collection', - function(){ + function(path, logger){ + var json = this.json() + + // get all loaded gids... + var gids = [] + for(var r in json.data.ribbons){ + this.data.makeSparseImages(json.data.ribbons[r], gids) + } + gids = gids.compact() + + // build .images with loaded images... + // XXX list of previews should be configurable (max size) + var images = {} + gids.forEach(function(gid){ + var img = json.images[gid] + if(img){ + images[gid] = json.images[gid] + // remove un-needed previews... + // XXX + } + }) + + // prepare and save index to target path... + json.data.order = gids + json.images = images + // XXX should we check if index dir is present in path??? + path = path +'/'+ this.config['index-dir'] + + file.writeIndex( + this.prepareIndexForWrite(json).prepared, + path, + this.config['index-filename-template'], + logger || this.logger) + + // copy previews for the loaded images... + // XXX should also optionally populate the base dir and nested favs... + var base_dir = this.base_dir + gids.forEach(function(gid){ + json.images[gid].base_path = path + var previews = json.images[gid].preview + + for(var res in previews){ + // XXX copy from .base_dir +'/'+ preview_path to path +'/'+ preview_path + // XXX + } + }) }], }) @@ -3761,7 +3835,6 @@ module.FileSystemWriterUI = ImageGridFeatures.Feature({ ImageGridFeatures.Feature('viewer-testing', [ 'base', - 'ui', // features...