diff --git a/ui/data.js b/ui/data.js index 68d3fbe7..f90dbcc0 100755 --- a/ui/data.js +++ b/ui/data.js @@ -146,9 +146,6 @@ var IMAGES_FILE_DEFAULT = 'images.json' var IMAGES_FILE_PATTERN = /^[0-9]*-images.json$/ var IMAGES_DIFF_FILE_PATTERN = /^[0-9]*-images-diff.json$/ -var MARKED_FILE_DEFAULT = 'marked.json' -var MARKED_FILE_PATTERN = /^[0-9]*-marked.json$/ - var DATA_FILE_DEFAULT = 'data.json' var DATA_FILE_PATTERN = /^[0-9]*-data.json$/ @@ -170,6 +167,8 @@ var SYNC_IMG_LOADER = false // var SETUP_BINDINGS = [] +var IMAGE_UPDATERS = [] + /********************************************************************** @@ -508,9 +507,12 @@ function getGIDBefore(gid, ribbon, search, data){ // XXX get a ribbon without getting into DOM... // ...dependency leek... ribbon = ribbon == null ? getGIDRibbonIndex(gid, data) : ribbon - search = search == null ? binSearch : search - //search = search == null ? match2(linSearch, binSearch) : search ribbon = typeof(ribbon) == typeof(123) ? data.ribbons[ribbon] : ribbon + // get the current ribbon if gid is not in any of the loaded + // ribbons (crop mode)... + ribbon = ribbon == null ? data.ribbons[getGIDRibbonIndex(null, data)] : ribbon + //search = search == null ? match2(linSearch, binSearch) : search + search = search == null ? binSearch : search var order = data.order var target = order.indexOf(gid) @@ -1128,16 +1130,9 @@ function updateImageIndicators(gid, image){ gid = gid == null ? getImageGID() : gid image = image == null ? getImage() : $(image) - // marks... - if(MARKED.indexOf(gid) != -1){ - image.addClass('marked') - // XXX - _addMark('selected', gid, image) - } else { - image.removeClass('marked') - // XXX - _removeMark('selected', gid, image) - } + IMAGE_UPDATERS.forEach(function(update){ + update(gid, image) + }) return image } @@ -1732,6 +1727,7 @@ function showImage(gid){ // target is already loaded... } else { + // XXX this does not load images correctly at times... centerView(focusImage(img)) centerRibbons() } diff --git a/ui/files.js b/ui/files.js index c4445788..45f88339 100755 --- a/ui/files.js +++ b/ui/files.js @@ -318,51 +318,76 @@ function saveFileImages(name){ } +function makeBasicLoader(title, file_dfl, file_pattern, finalize){ + return function(path){ + var res = $.Deferred() + // default locations... + if(path == null){ + var base = normalizePath(CACHE_DIR_VAR) + var loader = loadLatestFile(base, + file_dfl, + file_pattern, + null, + []) + + // explicit path... + // XXX need to account for paths without a CACHE_DIR + } else { + path = normalizePath(path) + var base = path.split(CACHE_DIR)[0] + //base = normalizePath(path +'/'+ CACHE_DIR_VAR) + base = path +'/'+ CACHE_DIR + + // XXX is this correct??? + var loader = loadLatestFile(base, + path.split(base)[0], + RegExp(path.split(base)[0]), + null, + []) + } + + bubbleProgress(title, loader, res) + + res.done(finalize) + + return res + } +} + // Load image marks form file // // NOTE: if no marks are found then set them to [] -function loadFileMarks(path){ - var res = $.Deferred() - // default locations... - if(path == null){ - var base = normalizePath(CACHE_DIR_VAR) - var loader = loadLatestFile(base, - MARKED_FILE_DEFAULT, - MARKED_FILE_PATTERN, - null, - []) - - // explicit path... - // XXX need to account for paths without a CACHE_DIR - } else { - path = normalizePath(path) - var base = path.split(CACHE_DIR)[0] - //base = normalizePath(path +'/'+ CACHE_DIR_VAR) - base = path +'/'+ CACHE_DIR - - // XXX is this correct??? - var loader = loadLatestFile(base, - path.split(base)[0], - RegExp(path.split(base)[0]), - null, - []) - } - - bubbleProgress('Marks', loader, res) - - res.done(function(images){ - MARKED = images - }) - - return res -} +var loadFileMarks = makeBasicLoader( + 'Marks', + MARKED_FILE_DEFAULT, + MARKED_FILE_PATTERN, + function(data){ + MARKED = data + }) // Save image marks to file function saveFileMarks(name){ name = name == null ? normalizePath(CACHE_DIR_VAR +'/'+ Date.timeStamp()) : name - dumpJSON(name + '-marked.json', MARKED) + dumpJSON(name + '-' + MARKED_FILE_DEFAULT, MARKED) +} + + +var loadFileBookmarks = makeBasicLoader( + 'Bookmarks', + BOOKMARKS_FILE_DEFAULT, + BOOKMARKS_FILE_PATTERN, + function(data){ + BOOKMARKS = data[0] == null ? [] : data[0] + BOOKMARKS_DATA = data[1] == null ? {} : data[1] + }) + + +function saveFileBookmarks(name){ + name = name == null ? normalizePath(CACHE_DIR_VAR +'/'+ Date.timeStamp()) : name + + dumpJSON(name + '-' + BOOKMARKS_FILE_DEFAULT, [BOOKMARKS, BOOKMARKS_DATA]) } @@ -414,7 +439,9 @@ function loadFileState(path, prefix){ // : null), res, true), // load marks if available... bubbleProgress(prefix, - loadFileMarks(), res, true)) + loadFileMarks(), res, true), + bubbleProgress(prefix, + loadFileBookmarks(), res, true)) .done(function(){ reloadViewer() res.resolve() @@ -458,6 +485,7 @@ function saveFileState(name, no_normalize_path){ dumpJSON(name + '-data.json', data) // XXX do we need to do this??? saveFileMarks(name) + saveFileBookmarks(name) // save the updated images... if(IMAGES_UPDATED.length > 0){ diff --git a/ui/index.html b/ui/index.html index 7d0f948c..5fdc961d 100755 --- a/ui/index.html +++ b/ui/index.html @@ -194,6 +194,7 @@ $(function(){ */ updateImages() + toggleMarkesView('on') SCROLLER.start() diff --git a/ui/keybindings.js b/ui/keybindings.js index 59dc91fd..ec9e3d59 100755 --- a/ui/keybindings.js +++ b/ui/keybindings.js @@ -578,7 +578,14 @@ var KEYBOARD_CONFIG = { Enter: doc('Toggle single image view', function(){ toggleSingleImageMode() }), - B: doc('Toggle theme', function(){ toggleTheme() }), + B: { + default: doc('Toggle theme', + function(){ toggleTheme() }), + ctrl: doc('Toggle bookmark', + function(){ toggleBookmark() }), + }, + '[': doc('Previous bookmarked image', prevBookmark), + ']': doc('Next bookmarked image', nextBookmark), S: { default: doc('Start slideshow', diff --git a/ui/layout.css b/ui/layout.css index b3d81746..8096cb53 100755 --- a/ui/layout.css +++ b/ui/layout.css @@ -604,12 +604,14 @@ button:hover { .viewer:not(.marks-visible) .mark { display: none; } +.mark.bookmark, .mark.selected { width: 0px; margin-left: 0px; border: none; overflow: visible; } +.mark.bookmark:after, .mark.selected:after { display: block; position: absolute; @@ -631,6 +633,10 @@ button:hover { .marks-visible.single-image-mode.viewer .mark:after { display: none; } +.mark.bookmark:after { + background: yellow; + left: -25; +} /****************************************************** Image info ***/ .inline-image-info { display: none; diff --git a/ui/layout.less b/ui/layout.less index 02908a47..1515d45b 100755 --- a/ui/layout.less +++ b/ui/layout.less @@ -678,12 +678,14 @@ button:hover { display: none; } +.mark.bookmark, .mark.selected { width: 0px; margin-left: 0px; border: none; overflow: visible; } +.mark.bookmark:after, .mark.selected:after { display: block; position: absolute; @@ -712,6 +714,11 @@ button:hover { display: none; } +.mark.bookmark:after { + background: yellow; + left: -25; +} + /****************************************************** Image info ***/ diff --git a/ui/marks.js b/ui/marks.js index a7638932..f7a02c9c 100755 --- a/ui/marks.js +++ b/ui/marks.js @@ -6,6 +6,9 @@ //var DEBUG = DEBUG != null ? DEBUG : true +var MARKED_FILE_DEFAULT = 'marked.json' +var MARKED_FILE_PATTERN = /^[0-9]*-marked.json$/ + /********************************************************************** @@ -19,8 +22,9 @@ function _addMark(cls, gid, image){ var mark = $('.mark.'+cls+'.'+gid) if(mark.length == 0){ - mark = $('
') + mark = $('') .addClass(gid) + .addClass(cls) .insertAfter(image) } return mark @@ -76,6 +80,34 @@ function makeMarkToggler(img_class, mark_class, evt_name){ } +function makeMarkUpdater(img_class, mark_class, test){ + return function(gid, image){ + // marks... + if(test(gid)){ + image.addClass(img_class) + _addMark(mark_class, gid, image) + } else { + image.removeClass(img_class) + _removeMark(mark_class, gid, image) + } + return image + } +} + + +/********************************************************************** +* Basic marks... +*/ + +var updateSelectedImageMark = makeMarkUpdater( + 'marked', + 'selected', + function(gid){ + return MARKED.indexOf(gid) > -1 + }) +IMAGE_UPDATERS.push(updateSelectedImageMark) + + // NOTE: to disable MARKED cleanout set no_cleanout_marks to true. // 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