diff --git a/ui/bookmarks.js b/ui/bookmarks.js index 84719208..ec3adc3e 100755 --- a/ui/bookmarks.js +++ b/ui/bookmarks.js @@ -131,6 +131,7 @@ var saveFileBookmarks = makeFileSaver( function bookmarksUpdated(){ fileUpdated('Bookmarks') + $('.viewer').trigger('bookmarksUpdated') } diff --git a/ui/data.js b/ui/data.js index eed1c543..ff462e3f 100755 --- a/ui/data.js +++ b/ui/data.js @@ -884,7 +884,7 @@ function makeGIDBeforeGetterFromList(get_list, restrict_to_ribbon){ ribbon = ribbon == null && restrict_to_ribbon == true ? getGIDRibbonIndex(gid) : ribbon - var list = get_list() + var list = get_list(ribbon) if(list.length == 0){ return null } @@ -1325,7 +1325,7 @@ function makeNextFromListAction(get_closest, get_list, restrict_to_ribbon){ get_list = get_list == null ? getRibbonGIDs : get_list return function(ribbon){ - var list = get_list() + var list = get_list(ribbon) if(list.length == 0){ flashIndicator('end') return getImage() diff --git a/ui/files.js b/ui/files.js index 54bd0678..28391095 100755 --- a/ui/files.js +++ b/ui/files.js @@ -312,6 +312,7 @@ var saveFileData = makeFileSaver( function dataUpdated(){ if(!isViewCropped()){ fileUpdated('Data') + $('.viewer').trigger('dataUpdated') } } diff --git a/ui/keybindings.js b/ui/keybindings.js index a87b5019..7276a201 100755 --- a/ui/keybindings.js +++ b/ui/keybindings.js @@ -590,6 +590,18 @@ var KEYBOARD_CONFIG = { function(){ prevBookmark() }), ']': doc('Next bookmarked image', function(){ nextBookmark() }), + ',': { + default: doc('Previous marked image', + function(){ prevMark() }), + shift: doc('Previous unmarked image', + function(){ prevUnmarked() }), + }, + '.': { + default: doc('Next marked image', + function(){ nextMark() }), + shift: doc('Next unmarked image', + function(){ nextUnmarked() }), + }, '{': doc('Previous unsorted section edge', function(){ prevUnsortedSection() }), '}': doc('Next unsorted section edge', diff --git a/ui/marks.js b/ui/marks.js index 6ae6fd51..f11b75df 100755 --- a/ui/marks.js +++ b/ui/marks.js @@ -13,6 +13,10 @@ var MARKED_FILE_DEFAULT = 'marked.json' var MARKED_FILE_PATTERN = /^[0-9]*-marked.json$/ +// NOTE: if this is set to null, caching will be disabled... +var _UNMARKED_CACHE = {} + + /********************************************************************** * helpers... @@ -61,12 +65,61 @@ function _removeMark(cls, gid, image){ } +// Invalidate unmarked image cache... +// +function invalidateMarksCache(){ + if(_UNMARKED_CACHE != null){ + _UNMARKED_CACHE = {} + } +} + + +// Get list of unmarked images... +// +// mode can be: +// - 'ribbon' +// - 'all' +// - number - ribbon index +// - null - same as all +function getUnmarked(mode){ + mode = mode == null ? 'all' : mode + var gids = mode == 'all' ? getLoadedGIDs() + : typeof(mode) == typeof(123) ? getRibbonGIDs(mode) + : getRibbonGIDs() + mode = mode == 'ribbon' ? getRibbonIndex() : mode + + // get the cached set... + if(_UNMARKED_CACHE != null && mode in _UNMARKED_CACHE){ + return _UNMARKED_CACHE[mode] + } + + // calculate the set... + var res = gids.filter(function(e){ + // keep only unmarked... + return MARKED.indexOf(e) < 0 + }) + if(_UNMARKED_CACHE != null){ + _UNMARKED_CACHE[mode] = res + } + + return res +} + + var getMarkedGIDBefore = makeGIDBeforeGetterFromList( function(){ return MARKED }) +// NOTE: this is not too fast as it will filter the marked images... +// NOTE: this is restricted to current ribbon... +var getUnmarkedGIDBefore = makeGIDBeforeGetterFromList( + function(ribbon){ + return getUnmarked(ribbon) + }, true) + + // Make a mark toggler // // The toggler will: @@ -485,6 +538,17 @@ var prevMark = makePrevFromListAction( function(){ return MARKED }) +var nextUnmarked = makeNextFromListAction( + getUnmarkedGIDBefore, + function(ribbon){ + return getUnmarked(ribbon == null ? 'ribbon' : ribbon) + }) +var prevUnmarked = makePrevFromListAction( + getUnmarkedGIDBefore, + function(ribbon){ + return getUnmarked(ribbon == null ? 'ribbon' : ribbon) + }) + /********************************************************************** @@ -604,6 +668,8 @@ var saveFileMarks = makeFileSaver( function marksUpdated(){ fileUpdated('Marks') + invalidateMarksCache() + $('.viewer').trigger('marksUpdated') } @@ -640,6 +706,9 @@ function setupMarks(viewer){ viewer.trigger('togglingMark', [gid, action]) }) }) + .on('baseURLChanged', function(){ + invalidateMarksCache() + }) } SETUP_BINDINGS.push(setupMarks) diff --git a/ui/tags.js b/ui/tags.js index ea8217b6..b2cfa320 100755 --- a/ui/tags.js +++ b/ui/tags.js @@ -495,6 +495,7 @@ var saveFileTags = makeFileSaver( function tagsUpdated(){ fileUpdated('Tags') + $('.viewer').trigger('tagsUpdated') }