From 995e279927964cd6ef284010fb0377cd8b9f1c47 Mon Sep 17 00:00:00 2001 From: "Alex A. Naanou" Date: Sat, 16 Nov 2013 02:21:07 +0400 Subject: [PATCH] enabled intersecting ribbon crop modes... Signed-off-by: Alex A. Naanou --- ui/crop.js | 26 +++++++++++++++++++++++--- ui/marks.js | 24 +++++++++--------------- ui/modes.js | 18 ++++++++++++++++++ ui/ui.js | 13 ++++++------- 4 files changed, 56 insertions(+), 25 deletions(-) diff --git a/ui/crop.js b/ui/crop.js index 9330b191..ba8400e2 100755 --- a/ui/crop.js +++ b/ui/crop.js @@ -28,9 +28,13 @@ function getAllData(){ // NOTE: this will not update .current state... // NOTE: when keep_ribbons is set, this may generate empty ribbons... +// NOTE: this requieres all data to be present, if currently viewing +// server-side data, then cropping is a server-side operation... +// XXX another way to go here is to save the crop method and take +// it into account when loading new sections of data... // // XXX should this set the .current to anything but null or the first elem??? -function makeCroppedData(gids, keep_ribbons){ +function makeCroppedData(gids, keep_ribbons, keep_unloaded_gids){ var res = { varsion: '2.0', current: null, @@ -38,6 +42,18 @@ function makeCroppedData(gids, keep_ribbons){ order: DATA.order.slice(), } + // remove any gid that is not in IMAGES or is not loaded... + if(!keep_unloaded_gids){ + var loaded = [] + $.each(DATA.ribbons, function(i, e){ loaded = loaded.concat(e) }) + + // NOTE: if IMAGES contains only part of the data loadable this will + // be wrong... + gids = gids.filter(function(e){ + return e in IMAGES && loaded.indexOf(e) >= 0 + }) + } + // flat single ribbon crop... if(!keep_ribbons){ res.ribbons[0] = gids @@ -59,12 +75,12 @@ function makeCroppedData(gids, keep_ribbons){ // NOTE: if keep_ribbons is not set this will ALWAYS build a single ribbon // data-set... -function cropDataTo(gids, keep_ribbons){ +function cropDataTo(gids, keep_ribbons, keep_unloaded_gids){ var prev_state = DATA var cur = DATA.current var r = getRibbonIndex() - var new_data = makeCroppedData(gids, keep_ribbons) + var new_data = makeCroppedData(gids, keep_ribbons, keep_unloaded_gids) // do nothing if there is no change... // XXX is there a better way to compare states??? @@ -139,11 +155,14 @@ function showAllData(){ // uncropLastState(...) // NOTE: crop modes are exclusive -- it is not possible to enter one crop // mode from a different crop mode +// +// XXX add "exclusive" crop option -- prevent other crop modes to enter... function makeCropModeToggler(cls, crop){ var res = createCSSClassToggler( '.viewer', //cls + ' cropped-mode', cls, + /* XXX make this an option... function(action){ // prevent mixing marked-only and single-ribbon modes... if(action == 'on' @@ -152,6 +171,7 @@ function makeCropModeToggler(cls, crop){ return false } }, + */ function(action){ if(action == 'on'){ showStatusQ('Cropping current ribbon...') diff --git a/ui/marks.js b/ui/marks.js index c406dcce..548e2c50 100755 --- a/ui/marks.js +++ b/ui/marks.js @@ -16,25 +16,12 @@ // NOTE: MARKED may contain both gids that are not loaded and that do // not exist, as there is no way to distinguish between the two // situations the cleanup is optional... -function cropMarkedImages(cmp, no_cleanout_marks){ +function cropMarkedImages(cmp, keep_ribbons, no_cleanout_marks){ cmp = cmp == null ? imageOrderCmp : cmp var cur = DATA.current var marked = MARKED.slice().sort(cmp) - if(!no_cleanout_marks){ - // build all loaded images cache... - var loaded = [] - $.each(DATA.ribbons, function(i, e){ loaded = loaded.concat(e) }) - - // ignore any gid in marks that is not in IMAGES... - // NOTE: if IMAGES contains only part of the data loadable this will - // be wrong... - var marked = marked.filter(function(e){ - return e in IMAGES && loaded.indexOf(e) >= 0 - }) - } - - cropDataTo(marked) + cropDataTo(marked, keep_ribbons, no_cleanout_marks) return DATA } @@ -51,6 +38,13 @@ var toggleMarkedOnlyView = makeCropModeToggler( cropMarkedImages) +var toggleMarkedOnlyWithRibbonsView = makeCropModeToggler( + 'marked-only-view', + function(){ + cropMarkedImages(null, true) + }) + + // XXX shifting images and unmarking in this mode do not work correctly... var toggleMarkesView = createCSSClassToggler( '.viewer', diff --git a/ui/modes.js b/ui/modes.js index 9410f9de..ddf7653f 100755 --- a/ui/modes.js +++ b/ui/modes.js @@ -180,6 +180,24 @@ var toggleSingleRibbonMode = makeCropModeToggler( }) +var toggleCurrenAndAboveRibbonsMode = makeCropModeToggler( + 'current-and-above-ribbons-mode', + function(){ + var gids = [] + var c = getRibbonIndex() + var ribbons = DATA.ribbons + + // merge the ribbons... + for(var i=0; i <= c; i++){ + gids = gids.concat(ribbons[i]) + } + gids.sort(imageOrderCmp) + + // do the crop... + cropDataTo(gids) + }) + + // TODO transitions... // TODO a real setup UI (instead of prompt) var toggleSlideShowMode = createCSSClassToggler( diff --git a/ui/ui.js b/ui/ui.js index 16c2bf1d..dbfa8b09 100755 --- a/ui/ui.js +++ b/ui/ui.js @@ -1055,15 +1055,11 @@ function cropImagesDialog(){ updateStatus('Crop...').show() var alg = 'Crop:|'+ - 'Use Esc and Shift-Esc to exit crop modes.'+ - '\n\n'+ - 'NOTE: currently mixing crop modes is not supported,\n'+ - 'thus, if you are in a particular crop mode, you can\n'+ - 'only use that mode to crop again.\n'+ - '...This restriction will be removed later.' + 'Use Esc and Shift-Esc to exit crop modes.' cfg = {} cfg[alg] = [ + 'Marked images (single ribbon)', 'Marked images', 'Current ribbon', 'Current ribbon and above' @@ -1076,9 +1072,12 @@ function cropImagesDialog(){ .done(function(res){ res = res[alg] - if(/Marked/i.test(res)){ + if(/Marked.*single ribbon/i.test(res)){ var method = toggleMarkedOnlyView + } else if(/Marked/i.test(res)){ + var method = toggleMarkedOnlyWithRibbonsView + } else if(/Current ribbon/i.test(res)){ var method = toggleSingleRibbonMode