From 2bd9c98011b42ba2f78ad0394dc11a3c70161782 Mon Sep 17 00:00:00 2001 From: "Alex A. Naanou" Date: Sat, 14 Dec 2013 06:07:22 +0400 Subject: [PATCH] more refactoring, fixed a bug in toggleMark event handling and added bookmark indicator to global info... Signed-off-by: Alex A. Naanou --- ui/data.js | 100 ------------------------------- ui/files.js | 166 +++++++++++++++++++++++++++++++++++++++------------- ui/info.js | 4 ++ ui/setup.js | 13 +--- 4 files changed, 132 insertions(+), 151 deletions(-) diff --git a/ui/data.js b/ui/data.js index 2b5cc3f6..9524e47f 100755 --- a/ui/data.js +++ b/ui/data.js @@ -1806,17 +1806,6 @@ function openImageWith(prog){ * Experimental & utility */ -// The idea here is to add markers as first-class image-like elements... -// -// + can be ordered -// - re-sorting via metadata will mess things up -// -// XXX this is not persistent... -function appendMarker(){ - return $('
').insertAfter(getImage()) -} - - // NOTE: if cmp is explicitly false then no sorting will be done. function loadRibbonsFromPath(path, cmp, reverse, dir_name){ path = path == null ? BASE_URL : path @@ -1838,95 +1827,6 @@ function loadRibbonsFromPath(path, cmp, reverse, dir_name){ } -function readImageDate(gid, images){ - images = images == null ? IMAGES : images - var img = images[gid] - return getEXIFDate(normalizePath(img.path)) - .done(function(date){ - img.ctime = Date.fromTimeStamp(date).getTime()/1000 - }) -} -function readImagesDates(images){ - images = images == null ? IMAGES : images - - return $.when.apply(null, $.map(images, function(_, gid){ - return readImageDate(gid, images) - .done(function(){ - IMAGES_UPDATED.push(gid) - }) - })) -} -function readImagesDatesQ(images){ - images = images == null ? IMAGES : images - - var queue = getWorkerQueue('date_reader') - - $.each(images, function(gid, img){ - queue.enqueue(readImageDate, gid, images) - .always(function(){ - IMAGES_UPDATED.push(gid) - queue.notify(gid, 'done') - }) - }) - - return queue -} - - -// XXX deleting images is not sported, we need to explicitly re-save... -// XXX need to reload the viewer... -// XXX not tested... -function updateImageGID(gid, images, data){ - images = images == null ? IMAGES : images - var img = images[gid] - return getEXIFGID(normalizePath(img.path)) - .done(function(gid){ - img.id = gid - // images... - images[gid] = images[key] - delete images[key] - IMAGES_UPDATED.push(gid) - - // data... - if(data != null){ - // replace current... - if(data.current == key){ - data.current = gid - } - // replace in order... - data.order[data.order.indexOf(key)] = gid - // replace in ribbons... - for(var i=0; i < data.ribbons; i++){ - var r = data.ribbons[i] - var k = r.indexOf(key) - if(k >= 0){ - r[k] = gid - } - } - } - }) -} -function updateImagesGIDs(images, data){ - images = images == null ? IMAGES : images - - return $.when.apply(null, $.map(images, function(_, key){ - return updateImageGID(key, images, data) - })) -} -function updateImagesGIDsQ(images, data){ - images = images == null ? IMAGES : images - - var queue = getWorkerQueue('gid_updater') - - $.each(images, function(_, key){ - queue.enqueue(updateImageGID, key, images, data) - .always(function(){ queue.notify(key, 'done') }) - }) - - return queue -} - - /********************************************************************** * vim:set ts=4 sw=4 spell : */ diff --git a/ui/files.js b/ui/files.js index c0270176..aabfe663 100755 --- a/ui/files.js +++ b/ui/files.js @@ -83,19 +83,6 @@ function bubbleProgress(prefix, from, to, only_progress){ } -function runFileLoaders(prefix, res){ - return $.when.apply(null, FILE_LOADERS.map(function(load){ - return bubbleProgress(prefix, load(), res, true) - })) -} -// XXX do we need bubbleProgress(..) here??? -function runFileSavers(name){ - FILE_SAVERS.map(function(save){ - return save(name) - }) -} - - // Semi-generic deferred file loader // // if pattern is given, then search for the latest (ordered last) file @@ -234,8 +221,8 @@ function makeFileLoader(title, file_dfl, file_pattern, data_set){ return res } } - - +// XXX make this check for updates -- no need to re-save if nothing +// changed... function makeFileSaver(file_dfl, data_get){ return function(name){ name = name == null @@ -247,6 +234,19 @@ function makeFileSaver(file_dfl, data_get){ } +function runFileLoaders(prefix, res){ + return $.when.apply(null, FILE_LOADERS.map(function(load){ + return bubbleProgress(prefix, load(), res, true) + })) +} +// XXX do we need bubbleProgress(..) here??? +function runFileSavers(name){ + FILE_SAVERS.map(function(save){ + return save(name) + }) +} + + /*********************************************************************/ @@ -354,7 +354,7 @@ function loadFileImages(path, no_load_diffs){ // Save current images list to file // -// If not name is given this will merge all the diffs and save a "clean" +// If no name is given this will merge all the diffs and save a "clean" // (full) images.json file. Also removing the diff files. // // NOTE: if an explicit name is given then this will not remove anything. @@ -385,7 +385,7 @@ function saveFileImages(name){ } -// Load images, ribbons and marks from cache +// Load images, ribbons and run registered load callbacks... // // XXX add support for explicit filenames... function loadFileState(path, prefix){ @@ -431,14 +431,8 @@ function loadFileState(path, prefix){ //loadFileImages(DATA.image_file != null ? // normalizePath(DATA.image_file, base) // : null), res, true), - // load marks if available... + // run registered loaders... runFileLoaders(prefix, res)) - /* - bubbleProgress(prefix, - loadFileMarks(), res, true), - bubbleProgress(prefix, - loadFileBookmarks(), res, true)) - */ .done(function(){ reloadViewer() res.resolve() @@ -458,7 +452,7 @@ function loadFileState(path, prefix){ } -// Save, ribbons and marks to cache +// Save, ribbons and run registered save callbacks... // // NOTE: this will NOT save images, that operation must be explicitly // performed by saveFileImages(...) @@ -480,8 +474,6 @@ function saveFileState(name, no_normalize_path){ data.current = DATA.current dumpJSON(name + '-data.json', data) - // XXX do we need to do this??? - runFileSavers(name) // save the updated images... if(IMAGES_UPDATED.length > 0){ @@ -492,6 +484,8 @@ function saveFileState(name, no_normalize_path){ dumpJSON(name + '-images-diff.json', updated) IMAGES_UPDATED = [] } + + runFileSavers(name) } @@ -536,10 +530,13 @@ function loadRawDir(path, no_preview_processing, prefix){ reloadViewer() // read orientation form files... - res.notify(prefix, 'Loading', 'Images orientation.') - var o = updateImagesOrientationQ() + res.notify(prefix, 'Loading', 'Images metadata.') + var o = $.when( + readImagesOrientationQ(), + readImagesDatesQ() + ) .done(function(){ - res.notify(prefix, 'Loaded', 'Images orientation.') + res.notify(prefix, 'Loaded', 'Images metadata.') }) // load/generate previews... @@ -728,12 +725,14 @@ function exportImagesTo(path, im_name, dir_name, size){ -/*********************************************************************/ +/********************************************************************** +* Metadata readers... +*/ // NOTE: this will overwrite current image orientation... // // XXX this depends on getImageOrientation(...) -function updateImageOrientation(gid, no_update_loaded){ +function readImageOrientation(gid, no_update_loaded){ gid = gid == null ? getImageGID() : gid var img = IMAGES[gid] @@ -764,23 +763,19 @@ function updateImageOrientation(gid, no_update_loaded){ } }) } - - -function updateImagesOrientation(gids, no_update_loaded){ +function readImagesOrientation(gids, no_update_loaded){ gids = gids == null ? getClosestGIDs() : gids var res = [] $.each(gids, function(_, gid){ - res.push(updateImageOrientation(gid, no_update_loaded)) + res.push(readImageOrientation(gid, no_update_loaded)) }) return $.when.apply(null, res) } - - -// queued version of updateImagesOrientation(...) +// queued version of readImagesOrientation(...) // -function updateImagesOrientationQ(gids, no_update_loaded){ +function readImagesOrientationQ(gids, no_update_loaded){ gids = gids == null ? getClosestGIDs() : gids var queue = getWorkerQueue('image_orientation_reader') @@ -789,7 +784,7 @@ function updateImagesOrientationQ(gids, no_update_loaded){ // attach workers to queue... $.each(gids, function(_, gid){ - last = queue.enqueue(updateImageOrientation, gid, no_update_loaded) + last = queue.enqueue(readImageOrientation, gid, no_update_loaded) .done(function(){ queue.notify(gid, 'done') }) .fail(function(){ queue.notify(gid, 'fail') }) }) @@ -798,6 +793,95 @@ function updateImagesOrientationQ(gids, no_update_loaded){ } +function readImageDate(gid, images){ + images = images == null ? IMAGES : images + var img = images[gid] + return getEXIFDate(normalizePath(img.path)) + .done(function(date){ + img.ctime = Date.fromTimeStamp(date).getTime()/1000 + }) +} +function readImagesDates(images){ + images = images == null ? IMAGES : images + + return $.when.apply(null, $.map(images, function(_, gid){ + return readImageDate(gid, images) + .done(function(){ + IMAGES_UPDATED.push(gid) + }) + })) +} +function readImagesDatesQ(images){ + images = images == null ? IMAGES : images + + var queue = getWorkerQueue('date_reader') + + $.each(images, function(gid, img){ + queue.enqueue(readImageDate, gid, images) + .always(function(){ + IMAGES_UPDATED.push(gid) + queue.notify(gid, 'done') + }) + }) + + return queue +} + + +// XXX deleting images is not sported, we need to explicitly re-save... +// XXX need to reload the viewer... +// XXX not tested... +function updateImageGID(gid, images, data){ + images = images == null ? IMAGES : images + var img = images[gid] + return getEXIFGID(normalizePath(img.path)) + .done(function(gid){ + img.id = gid + // images... + images[gid] = images[key] + delete images[key] + IMAGES_UPDATED.push(gid) + + // data... + if(data != null){ + // replace current... + if(data.current == key){ + data.current = gid + } + // replace in order... + data.order[data.order.indexOf(key)] = gid + // replace in ribbons... + for(var i=0; i < data.ribbons; i++){ + var r = data.ribbons[i] + var k = r.indexOf(key) + if(k >= 0){ + r[k] = gid + } + } + } + }) +} +function updateImagesGIDs(images, data){ + images = images == null ? IMAGES : images + + return $.when.apply(null, $.map(images, function(_, key){ + return updateImageGID(key, images, data) + })) +} +function updateImagesGIDsQ(images, data){ + images = images == null ? IMAGES : images + + var queue = getWorkerQueue('gid_updater') + + $.each(images, function(_, key){ + queue.enqueue(updateImageGID, key, images, data) + .always(function(){ queue.notify(key, 'done') }) + }) + + return queue +} + + /********************************************************************** * vim:set ts=4 sw=4 : */ diff --git a/ui/info.js b/ui/info.js index ff5198d3..2f24045a 100755 --- a/ui/info.js +++ b/ui/info.js @@ -32,6 +32,10 @@ function updateGlobalImageInfo(image){ var meta = [] + image.hasClass('bookmarked') ? meta.push( + 'B'+ + '') : '' + image.hasClass('marked') ? meta.push( 'M'+ '') : '' diff --git a/ui/setup.js b/ui/setup.js index ab90d6b6..cc5be786 100755 --- a/ui/setup.js +++ b/ui/setup.js @@ -42,7 +42,7 @@ function setupIndicators(){ function updateContextIndicators(image){ image = image == null ? getImage() : $(image) - + // marked... var indicator = $('.context-mode-indicators .current-image-marked') if(image.hasClass('marked')){ @@ -348,15 +348,6 @@ function setupDataBindings(viewer){ flashRibbonIndicator() } }) - .on([ - 'focusingImage', - 'togglingMark' - ].join(' '), - function(evt, image){ - image = $(image) - updateGlobalImageInfo(image) - updateContextIndicators(image) - }) .on([ 'rotatingLeft', 'rotateingRight', @@ -367,6 +358,8 @@ function setupDataBindings(viewer){ updateGlobalImageInfo($(image)) }) .on([ + 'focusingImage', + 'togglingMark', 'removeingAllMarks', 'removeingRibbonMarks', 'markingAll',