diff --git a/ui/compatibility.js b/ui/compatibility.js index 2156f4b4..15c1de91 100755 --- a/ui/compatibility.js +++ b/ui/compatibility.js @@ -357,18 +357,16 @@ if(window.CEF_dumpJSON != null){ })) } - window._PREVIW_CREATE_QUEUE = null - // Queued version of makeImagesPreviews(...) window.makeImagesPreviewsQ = function(gids, sizes, mode){ gids = gids == null ? getClosestGIDs() : gids // attach the the previous queue... - if(_PREVIW_CREATE_QUEUE == null){ + if(WORKERS.preview_generator == null){ var queue = makeDeferredsQ() - _PREVIW_CREATE_QUEUE = queue.start() + WORKERS.preview_generator = queue.start() } else { - var queue = _PREVIW_CREATE_QUEUE + var queue = WORKERS.preview_generator } // attach the workers to the queue... diff --git a/ui/data.js b/ui/data.js index 8d5303ba..a72222df 100755 --- a/ui/data.js +++ b/ui/data.js @@ -143,6 +143,9 @@ var UPDATE_SORT_ENABLED = false // XXX for some reason the sync version appears to work faster... var UPDATE_SYNC = false +// object to register all the worker queues... +var WORKERS = {} + /********************************************************************** @@ -1174,7 +1177,19 @@ function getPrevLocation(){ * Actions... */ -/******************************************************** Extension **/ +/********************************************************* Workers ***/ + +function killAllWorkers(){ + for(var k in WORKERS){ + console.log('Worker: Stopping:', k) + WORKERS[k].kill() + } + WORKERS = {} +} + + + +/******************************************************* Extension ***/ // Open image in an external editor/viewer // @@ -1196,7 +1211,7 @@ function openImageWith(prog){ -/********************************************************** Sorting **/ +/********************************************************* Sorting ***/ function reverseImageOrder(){ DATA.order.reverse() @@ -1227,7 +1242,7 @@ function sortImagesByName(reverse){ -/*************************************************** Manual sorting **/ +/************************************************** Manual sorting ***/ // Ordering images... // NOTE: this a bit more complicated than simply shifting an image diff --git a/ui/files.js b/ui/files.js index efe54ecd..0afbcaaf 100755 --- a/ui/files.js +++ b/ui/files.js @@ -539,6 +539,11 @@ function loadDir(path, no_preview_processing, prefix){ prefix = prefix == null ? 'Data' : prefix prefix = prefix === false ? null : prefix + // stop all workers running on current image set before we + // move to the next... + // XXX is this the correct sopot for this??? + killAllWorkers() + IMAGES_CREATED = false path = normalizePath(path) @@ -669,6 +674,10 @@ function updateImageOrientation(gid, no_update_loaded){ gid = gid == null ? getImageGID() : gid var img = IMAGES[gid] + if(img == null){ + return + } + return getImageOrientation(normalizePath(img.path)) .done(function(o){ var o_o = img.orientation @@ -712,7 +721,15 @@ function updateImagesOrientation(gids, no_update_loaded){ function updateImagesOrientationQ(gids, no_update_loaded){ gids = gids == null ? getClosestGIDs() : gids - var queue = makeDeferredsQ().start() + //var queue = makeDeferredsQ().start() + // attach the the previous queue... + if(WORKERS.image_orientation_reader == null){ + var queue = makeDeferredsQ() + WORKERS.image_orientation_reader = queue.start() + } else { + var queue = WORKERS.image_orientation_reader + } + var last = null // attach workers to queue... diff --git a/ui/lib/jli.js b/ui/lib/jli.js index 316e1e2f..d0176dae 100755 --- a/ui/lib/jli.js +++ b/ui/lib/jli.js @@ -594,7 +594,7 @@ jQuery.fn.sortChildren = function(func){ // .kill() // Stop the queue, preventing any new workers from starting. // NOTE: this will not kill the currently running worker. -// NOTE: after killing a queue it can not be restarted. +// NOTE: after a queue is killed it can not be restarted. // // .isWorking() // will return true if there is at least one worker still not @@ -623,27 +623,41 @@ function makeDeferredsQ(first){ // NOTE: .enqueue(...) accepts a worker and any number of the arguments // to be passed to the worker when it's its turn. // NOTE: the worker must porduce a deffered/promice. - queue.enqueue = function(deffered){ + queue.enqueue = function(worker){ var cur = $.Deferred() var args = Array.apply(null, arguments).slice(1) - last.done(function(){ - - // see if we are killed... - if(queue.state() == 'resolved'){ - // this will kill the queue as we continue only on success... - cur.reject() - return - } - - // do the work... - deffered.apply(null, args) + function run(){ + return worker.apply(null, args) .done(function(o){ cur.resolve(o) }) .fail(function(){ cur.resolve('fail') }) + } + + last.done(function(){ + + // XXX one way to stop and resume the queue execution is: + // 1) add a "suspended" state + // 2) in the "suspended" state bind the worker start to + // .resume(...) + if(queue.state() == 'suspended'){ + queue.resumed(function(){ + run() + }) + + // if we are killed drop the work... + } else if(queue.state() == 'resolved'){ + // this will kill the queue as we continue only on success... + cur.reject() + return + + // do the work now... + } else { + run() + } }) last = cur @@ -663,6 +677,24 @@ function makeDeferredsQ(first){ return this } + /* XXX suspend interface... + // XXX change the state... + queue.suspend = function(){ + // XXX + return this + } + // XXX change the state... + queue.resume = function(){ + // XXX + return this + } + // XXX change the state... + queue.resumed = function(){ + // XXX + return this + } + */ + // Report work state... // XXX make this a propper state, or integrate into the deferred in // a more natural way...