From 8bc1076a03e662533e21245113ad799a62728dae Mon Sep 17 00:00:00 2001 From: "Alex A. Naanou" Date: Thu, 7 Nov 2013 02:20:20 +0400 Subject: [PATCH] export dialog now can export single images in single image view -- effectively WYSIWYG... Signed-off-by: Alex A. Naanou --- ui/data.js | 9 +++++- ui/files.js | 79 +++++++++++++++++++++++++++++++---------------------- ui/ui.js | 63 ++++++++++++++++++++++++++++++------------ 3 files changed, 100 insertions(+), 51 deletions(-) diff --git a/ui/data.js b/ui/data.js index b440a3eb..2a1cc975 100755 --- a/ui/data.js +++ b/ui/data.js @@ -1657,6 +1657,9 @@ function readImagesDates(images){ return $.when.apply(null, $.map(images, function(_, gid){ return readImageDate(gid, images) + .done(function(){ + IMAGES_UPDATED.push(gid) + }) })) } function readImagesDatesQ(images){ @@ -1666,13 +1669,17 @@ function readImagesDatesQ(images){ $.each(images, function(gid, img){ queue.enqueue(readImageDate, gid, images) - .always(function(){ queue.notify(gid, 'done') }) + .always(function(){ + IMAGES_UPDATED.push(gid) + queue.notify(gid, 'done') + }) }) return queue } +// XXX after running this we need to re-save the images... function updateImageGID(gid, images, data){ images = images == null ? IMAGES : images var img = images[gid] diff --git a/ui/files.js b/ui/files.js index ce984794..c4445788 100755 --- a/ui/files.js +++ b/ui/files.js @@ -607,12 +607,55 @@ function updateRibbonsFromFavDirs(){ } +function exportImageTo(gid, path, im_name, size){ + path = path == null ? BASE_URL : path + im_name = im_name == null ? '%f' : im_name + size = size == null ? 1000 : size + + // get correct preview... + var src = getBestPreview(gid, size).url + var orig = getImageFileName(gid) + + // XXX might be a good idea to combine this with docs as a + // single mechanism... + // form image name... + var dest = im_name + // full filename... + dest = dest.replace('%f', orig) + // file name w.o. ext... + dest = dest.replace('%n', orig.split('.')[0]) + // ext... + dest = dest.replace('%e', '.'+src.split('.').pop()) + // marked status... + dest = dest.replace(/%\(([^)]*)\)m/, MARKED.indexOf(gid) >= 0 ? '$1' : '') + // gid... + dest = dest.replace('%gid', gid) + dest = dest.replace('%g', gid.slice(34)) + // XXX Metadata... + // XXX + + dest = path +'/'+ dest + + // copy... + // NOTE: the sad smily face here is here for JS compatibility ;) + ;(function(src, dest){ + copyFile(src, dest) + .done(function(){ + console.log(src, 'done.') + }) + .fail(function(err){ + console.warn(src, 'err:', err) + }) + })(src, dest) +} + + // Export current state to directory... // // XXX this copies the files in parallel, make it sync and sequential... // ...reason is simple, if we stop the copy we need to end up with // part of the files copied full rather than all partially... -function exportTo(path, im_name, dir_name, size){ +function exportImagesTo(path, im_name, dir_name, size){ path = path == null ? BASE_URL : path im_name = im_name == null ? '%f' : im_name dir_name = dir_name == null ? 'fav' : dir_name @@ -642,47 +685,17 @@ function exportTo(path, im_name, dir_name, size){ // go through images... for(var j=0; j < ribbon.length; j++){ var gid = ribbon[j] - // get correct preview... - var src = getBestPreview(gid, size).url - var orig = getImageFileName(gid) - // XXX might be a good idea to combine this with docs as a - // single mechanism... - // form image name... + // do global naming... var dest = im_name - // full filename... - dest = dest.replace('%f', orig) - // file name w.o. ext... - dest = dest.replace('%n', orig.split('.')[0]) - // ext... - dest = dest.replace('%e', '.'+src.split('.').pop()) - // marked status... - dest = dest.replace(/%\(([^)]*)\)m/, MARKED.indexOf(gid) >= 0 ? '$1' : '') - // gid... - dest = dest.replace('%gid', gid) - dest = dest.replace('%g', gid.slice(34)) // global order... var o = order.indexOf(gid) + '' dest = dest.replace('%I', (Z + o).slice(o.length)) // current order... var o = selection.indexOf(gid) + '' dest = dest.replace('%i', (z + o).slice(o.length)) - // XXX Metadata... - // XXX - dest = path +'/'+ dest - - // copy... - // NOTE: the sad smily face here is here for JS compatibility ;) - ;(function(src, dest){ - copyFile(src, dest) - .done(function(){ - console.log(src, 'done.') - }) - .fail(function(err){ - console.warn(src, 'err:', err) - }) - })(src, dest) + exportImageTo(gid, path, dest, size) } path = normalizePath(path +'/'+ dir_name) diff --git a/ui/ui.js b/ui/ui.js index f44c4d68..85b3c05a 100755 --- a/ui/ui.js +++ b/ui/ui.js @@ -867,6 +867,7 @@ function exportPreviewsDialog(state, dfl){ if(state == null){ state = toggleMarkedOnlyView('?') == 'on' ? 'marked images' : state state = toggleSingleRibbonMode('?') == 'on' ? 'current ribbon' : state + state = toggleSingleImageMode('?') == 'on' ? 'current image' : state state = state == null ? 'all images' : state } @@ -878,16 +879,28 @@ function exportPreviewsDialog(state, dfl){ // keys become unreadable with JS syntax preventing us from // splitting the key into several lines... var cfg = {} - cfg['Image name pattern | '+ - '%f - full filename\n'+ - '%n - filename\n'+ - '%e - extension (with leading dot)\n'+ - '%(abc)m - if marked insert "abc"\n'+ - '%gid - log gid\n'+ - '%g - short gid\n'+ - '%I - global order\n'+ - '%i - current selection order'] = '%f' - cfg['Level directory name'] = 'fav' + // multiple images... + if(state != 'current image'){ + cfg['Image name pattern | '+ + '%f - full filename\n'+ + '%n - filename\n'+ + '%e - extension (with leading dot)\n'+ + '%(abc)m - if marked insert "abc"\n'+ + '%gid - log gid\n'+ + '%g - short gid\n'+ + '%I - global order\n'+ + '%i - current selection order'] = '%f' + cfg['Level directory name'] = 'fav' + // single image... + } else { + cfg['Image name pattern | '+ + '%f - full filename\n'+ + '%n - filename\n'+ + '%e - extension (with leading dot)\n'+ + '%(abc)m - if marked insert "abc"\n'+ + '%gid - log gid\n'+ + '%g - short gid'] = '%f' + } cfg['Size | '+ 'The selected size is aproximate, the actual\n'+ 'preview will be copied from cache.\n\n'+ @@ -908,13 +921,27 @@ function exportPreviewsDialog(state, dfl){ formDialog(null, 'Export: '+ state +'.', cfg, 'OK', 'exportPreviewsDialog') .done(function(data){ - var s = data[keys[2]] - s = s == 'Original image' ? Math.max.apply(null, PREVIEW_SIZES)*2 : parseInt(s)-5 - exportTo( - normalizePath(data[keys[3]]), - data[keys[0]], - data[keys[1]], - s) + // get the form data... + var name = data[keys[0]] + if(state != 'current image'){ + var size = data[keys[2]] + var path = normalizePath(data[keys[3]]) + var dir = data[keys[1]] + + } else { + var size = data[keys[1]] + var path = normalizePath(data[keys[2]]) + } + size = size == 'Original image' ? Math.max.apply(null, PREVIEW_SIZES)*2 : parseInt(size)-5 + + // do the actual exporting... + if(state != 'current image'){ + exportImagesTo(path, name, dir, size) + + } else { + exportImageTo(getImageGID(), path, name, size) + } + // XXX do real reporting... showStatusQ('Copying data...') res.resolve(data['']) @@ -1028,6 +1055,7 @@ function showImageInfo(){ flipped = flipped == null ? '' : ', flipped '+flipped+'ly' var order = DATA.order.indexOf(gid) var name = getImageFileName(gid) + var date = new Date(data.ctime * 1000) var comment = data.comment comment = comment == null ? '' : comment comment = comment.replace(/\n/g, '
') @@ -1040,6 +1068,7 @@ function showImageInfo(){ // basic info... '
'+ 'GID: '+ gid +''+ + 'Date: '+ date +''+ 'Path: "'+ unescape(data.path) +'"'+ 'Orientation: '+ orientation +'°'+flipped+''+ 'Order: '+ order +''+