diff --git a/ui (gen4)/features/all.js b/ui (gen4)/features/all.js index 8cb50124..0674195f 100755 --- a/ui (gen4)/features/all.js +++ b/ui (gen4)/features/all.js @@ -13,6 +13,7 @@ var core = require('features/core') require('features/base') require('features/sort') +require('features/tags') require('features/location') require('features/history') require('features/app') diff --git a/ui (gen4)/features/app.js b/ui (gen4)/features/app.js index e9df6fa0..8515d9ac 100755 --- a/ui (gen4)/features/app.js +++ b/ui (gen4)/features/app.js @@ -269,7 +269,10 @@ var FullScreenControllsActions = actions.Actions({ // fullscreen.... .append($('
') .addClass('button') - .html('□') + // square... + //.html('□') + // diagonal arrows... + .html('↙') .click(function(){ that.toggleFullScreen() })) // close... .append($('
') diff --git a/ui (gen4)/features/cli.js b/ui (gen4)/features/cli.js index a2b98661..56853547 100755 --- a/ui (gen4)/features/cli.js +++ b/ui (gen4)/features/cli.js @@ -62,16 +62,18 @@ var CLIActions = actions.Actions({ path = util.normalizePath(path) return this.loadImages(path) + // save base index... .then(function(){ - // save base index... - that.saveIndex(path) - - // make the previews... - that.makePreviews('all') - + return that.saveIndex(path) + }) + // make the previews... + .then(function(){ + return that.makePreviews('all') + }) + .then(function(){ //that.readAllMetadata() - that + return that .sortImages() // XXX for some reason this is not running from cli .saveIndex(path) @@ -112,12 +114,13 @@ module.CLI = core.ImageGridFeatures.Feature({ var argv = process.argv } - var package = requirejs('fs-extra').readJSONSync('./package.json') + // XXX this is not portable... + //var package = requirejs('fs-extra').readJSONSync('./package.json') var cli = requirejs('commander') cli // XXX get the version from package.json... - .version(package.version) + //.version(package.version) //.usage('[command] [options] ..') .option('-v, --verbose', 'verbose mode', function(){ diff --git a/ui (gen4)/features/filesystem.js b/ui (gen4)/features/filesystem.js index b340948a..d8aab4c2 100755 --- a/ui (gen4)/features/filesystem.js +++ b/ui (gen4)/features/filesystem.js @@ -124,7 +124,7 @@ var FileSystemLoaderActions = actions.Actions({ 'image-file-pattern': '*+(jpg|jpeg|png|JPG|JPEG|PNG)', 'image-file-read-stat': true, - 'image-file-skip-previews': true, + 'image-file-skip-previews': false, // XXX if true and multiple indexes found, load only the first // without merging... @@ -283,12 +283,70 @@ var FileSystemLoaderActions = actions.Actions({ }) }], + // Get image(s) previews... + // + // Load current image previews... + // .getPreviews() + // .getPreviews('current') + // -> promise + // + // Load previews for specific image... + // .getPreviews(gid) + // -> promise + // + // Load all image previews... + // .getPreviews('*') + // .getPreviews('all') + // -> promise + // + // Load previews that match glob pattern... + // .getPreviews(pattern) + // -> promise + // NOTE: this is useful for finding previews for example by + // image name, e.g. .getPreviews('*' + ig.image[gid].name) + // + // NOTE: this will override image .preview and .base_path + // NOTE: if multiple sets of previews are located this will use the + // last found and set image .base_path accordingly... + getPreviews: ['- File/', + function(pattern, path, images){ + images = images || this.images + pattern = pattern == 'current' ? this.current + '*' + : pattern == 'all' ? '*' + // explicit gid... + : pattern in images ? pattern + '*' + // other pattern... + : pattern != null ? pattern + // default... + : this.current + '*' + path = path || this.location.path + + var index_dir = this.config['index-dir'] + + return file.loadPreviews(path, pattern, null, index_dir) + .then(function(previews){ + for(var l in previews){ + var p = previews[l] + p && Object.keys(p).forEach(function(gid){ + if(gid in images){ + // XXX is this correct??? + images[gid].base_path = pathlib.basename(l) == index_dir ? + pathlib.dirname(l) + : l + images[gid].preview = p[gid].preview + } + }) + } + return images + }) + }], + // Get images in path... // // This will: // - get images from path // - get basic stat data - // - get previews from path if they exist + // - get previews from path if they exist (.getPreviews(..)) // // Returns: Images object // @@ -349,24 +407,13 @@ var FileSystemLoaderActions = actions.Actions({ }) // load previews if they exist... .then(function(imgs){ - if(skip_preview_search){ - return imgs - } - var index_dir = that.config['index-dir'] var index_path = path +'/'+ index_dir - return file.loadPreviews(index_path, null, index_dir) - .then(function(previews){ - previews = previews[index_path] - previews && Object.keys(previews).forEach(function(gid){ - if(gid in imgs){ - imgs[gid].preview = previews[gid].preview - } - }) - - return imgs - }) + return !skip_preview_search ? + //that.getPreviews('all', path, imgs) + that.getPreviews('all', index_path, imgs) + : imgs }) }], diff --git a/ui (gen4)/features/sharp.js b/ui (gen4)/features/sharp.js index 701962c2..03ae6d5e 100755 --- a/ui (gen4)/features/sharp.js +++ b/ui (gen4)/features/sharp.js @@ -38,6 +38,33 @@ if(typeof(process) != 'undefined'){ var ensureDir = file.denodeify(fse.ensureDir) } +function normalizeOrientation(orientation){ + return { + orientation: ({ + 0: 0, + 1: 0, + 2: 0, + 3: 180, + 4: 0, + 5: 90, + 6: 90, + 7: 90, + 8: 270, + })[orientation], + flipped: ({ + 0: null, + 1: null, + 2: ['horizontal'], + 3: null, + 4: ['vertical'], + 5: ['vertical'], + 6: null, + 7: ['horizontal'], + 8: null, + })[orientation], + } +} + /*********************************************************************/ @@ -162,11 +189,19 @@ var SharpActions = actions.Actions({ var post_handler = function(err, data){ if(data.status == 'done' || data.status == 'skipped'){ // get/make preview list... - var preview = that.images[data.gid].preview = - that.images[data.gid].preview || {} + var img = that.images[data.gid] + var preview = img.preview = + img.preview || {} + // save previews... preview[data.res + 'px'] = data.path + var o = normalizeOrientation(data.orientation) + + // save orientation... + img.orientation = o.orientation + img.flipped = o.flipped + that.markChanged(data.gid) } @@ -233,6 +268,35 @@ module.Sharp = core.ImageGridFeatures.Feature({ isApplicable: function(){ return !!sharp }, handlers: [ + // set orientation if not defined... + ['updateImage', + function(_, gid){ + var that = this + var img = this.images[gid] + + if(img && img.orientation == null){ + img.orientation = 0 + + sharp(this.getImagePath(gid)) + .metadata() + .then(function(data){ + var o = normalizeOrientation(data.orientation) + + // NOTE: we need to set orientation to something + // or we'll check it again and again... + img.orientation = o.orientation || 0 + img.flipped = o.flipped + + that.markChanged(gid) + + // update image to use the orientation... + // XXX this might be a source for recursion + // as it triggers .updateImage(..) again... + that.ribbons && that.ribbons.updateImage(gid) + }) + } + }], + // XXX need to: // - if image too large to set the preview to "loading..." // - create previews... diff --git a/ui (gen4)/features/tags.js b/ui (gen4)/features/tags.js index e8025c86..e9fc7c68 100755 --- a/ui (gen4)/features/tags.js +++ b/ui (gen4)/features/tags.js @@ -31,10 +31,10 @@ module.PersistentTags = core.ImageGridFeatures.Feature({ tag: 'persistent-tags', depends: [ - // XXX + 'base', ], - actions: TagCloudActions, + actions: PersistentTagsActions, handlers: [], }) @@ -63,7 +63,7 @@ module.TagUI = core.ImageGridFeatures.Feature({ doc: '', // XXX - tag: 'ui-tag', + tag: 'ui-tags', depends: [ // XXX ], diff --git a/ui (gen4)/imagegrid/file.js b/ui (gen4)/imagegrid/file.js index 7a52f00b..938c1933 100755 --- a/ui (gen4)/imagegrid/file.js +++ b/ui (gen4)/imagegrid/file.js @@ -127,8 +127,9 @@ function(base, index_dir, logger){ var listPreviews = module.listPreviews = -function(base){ - return gGlob(base +'/*px/*jpg') +function(base, img_pattern){ + //return gGlob(base +'/*px/*jpg') + return gGlob(base +'/*px/'+(img_pattern || '*')+'.jpg') } @@ -628,10 +629,11 @@ function(path, index_dir, from_date, logger){ // XXX handle errors.... var loadPreviews = module.loadPreviews = -function(base, previews, index_dir, absolute_path){ +function(base, pattern, previews, index_dir, absolute_path){ previews = previews || {} index_dir = index_dir || INDEX_DIR base = util.normalizePath(base) + pattern = pattern || '*' // we got an explicit index.... if(pathlib.basename(base) == index_dir){ @@ -642,7 +644,7 @@ function(base, previews, index_dir, absolute_path){ var images = previews[base] - listPreviews(base) + listPreviews(base, pattern) // XXX handle errors.... //.on('error', function(err){ //}) @@ -681,7 +683,7 @@ function(base, previews, index_dir, absolute_path){ //.on('error', function(err){ //}) .on('match', function(base){ - queue.push(loadPreviews(base, previews, index_dir, absolute_path)) + queue.push(loadPreviews(base, pattern, previews, index_dir, absolute_path)) }) .on('end', function(){ Promise.all(queue) diff --git a/ui (gen4)/lib/preview.js b/ui (gen4)/lib/preview.js index 03ab3862..4e839c1a 100755 --- a/ui (gen4)/lib/preview.js +++ b/ui (gen4)/lib/preview.js @@ -93,7 +93,8 @@ function(images, sizes, base_path, target_tpl, callback){ status: 'skipped', gid: gid, res: res, - path: rel + path: rel, + orientation: metadata.orientation, }) return @@ -113,7 +114,8 @@ function(images, sizes, base_path, target_tpl, callback){ status: 'done', gid: gid, res: res, - path: rel + path: rel, + orientation: metadata.orientation, }) }) })