mirror of
https://github.com/flynx/ImageGrid.git
synced 2025-10-30 19:00:09 +00:00
make the bookmarks sparse...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
parent
c945b3413f
commit
f5a6fc8c87
@ -25,11 +25,11 @@ var BOOKMARKS_FILE_PATTERN = /^[0-9]*-bookmarked.json$/
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
var getBookmarked = makeMarkedLister(function(){ return BOOKMARKS })
|
var getBookmarked = makeMarkedLister(function(){ return BOOKMARKS })
|
||||||
var getUnbookmarked = makeUnmarkedLister(function(){ return BOOKMARKS })
|
var getUnbookmarked = makeUnmarkedSparseLister(function(){ return BOOKMARKS })
|
||||||
|
|
||||||
var getBookmarkedGIDBefore = makeGIDBeforeGetterFromList(
|
var getBookmarkedGIDBefore = makeGIDBeforeGetterFromList(
|
||||||
function(){
|
function(){
|
||||||
return BOOKMARKS
|
return compactSparceList(BOOKMARKS)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
@ -83,12 +83,14 @@ var toggleBookmark = makeMarkToggler(
|
|||||||
// add a bookmark...
|
// add a bookmark...
|
||||||
if(action == 'on'){
|
if(action == 'on'){
|
||||||
if(BOOKMARKS.indexOf(gid) == -1){
|
if(BOOKMARKS.indexOf(gid) == -1){
|
||||||
insertGIDToPosition(gid, BOOKMARKS)
|
//insertGIDToPosition(gid, BOOKMARKS)
|
||||||
|
BOOKMARKS[DATA.order.indexOf(gid)] = gid
|
||||||
}
|
}
|
||||||
|
|
||||||
// remove a bookmark...
|
// remove a bookmark...
|
||||||
} else {
|
} else {
|
||||||
BOOKMARKS.splice(BOOKMARKS.indexOf(gid), 1)
|
//BOOKMARKS.splice(BOOKMARKS.indexOf(gid), 1)
|
||||||
|
delete BOOKMARKED[BOOKMARKED.indexOf(gid)]
|
||||||
}
|
}
|
||||||
|
|
||||||
bookmarksUpdated()
|
bookmarksUpdated()
|
||||||
@ -99,10 +101,10 @@ var toggleBookmark = makeMarkToggler(
|
|||||||
//
|
//
|
||||||
var nextBookmark = makeNextFromListAction(
|
var nextBookmark = makeNextFromListAction(
|
||||||
getBookmarkedGIDBefore,
|
getBookmarkedGIDBefore,
|
||||||
function(){ return BOOKMARKS })
|
function(){ return compactSparceList(BOOKMARKS) })
|
||||||
var prevBookmark = makePrevFromListAction(
|
var prevBookmark = makePrevFromListAction(
|
||||||
getBookmarkedGIDBefore,
|
getBookmarkedGIDBefore,
|
||||||
function(){ return BOOKMARKS })
|
function(){ return compactSparceList(BOOKMARKS) })
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -116,7 +118,7 @@ var loadFileBookmarks = makeFileLoader(
|
|||||||
BOOKMARKS_FILE_PATTERN,
|
BOOKMARKS_FILE_PATTERN,
|
||||||
[[], {}],
|
[[], {}],
|
||||||
function(data){
|
function(data){
|
||||||
BOOKMARKS = data[0]
|
BOOKMARKS = populateSparceGIDList(data[0])
|
||||||
BOOKMARKS_DATA = data[1]
|
BOOKMARKS_DATA = data[1]
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -126,7 +128,7 @@ var saveFileBookmarks = makeFileSaver(
|
|||||||
BOOKMARKS_FILE_DEFAULT,
|
BOOKMARKS_FILE_DEFAULT,
|
||||||
function(){
|
function(){
|
||||||
return [
|
return [
|
||||||
BOOKMARKS,
|
compactSparceList(BOOKMARKS),
|
||||||
BOOKMARKS_DATA
|
BOOKMARKS_DATA
|
||||||
]
|
]
|
||||||
})
|
})
|
||||||
@ -159,12 +161,21 @@ function setupBookmarks(viewer){
|
|||||||
|
|
||||||
return viewer
|
return viewer
|
||||||
.on('sortedImages', function(){
|
.on('sortedImages', function(){
|
||||||
BOOKMARKS = fastSortGIDsByOrder(BOOKMARKS)
|
BOOKMARKS = populateSparceGIDList(BOOKMARKS)
|
||||||
bookmarksUpdated()
|
bookmarksUpdated()
|
||||||
})
|
})
|
||||||
.on('horizontalShiftedImage', function(evt, gid, direction){
|
.on('horizontalShiftedImage', function(evt, gid, direction){
|
||||||
if(shiftGIDToOrderInList(gid, direction, BOOKMARKS)){
|
var n = DATA.order.indexOf(gid)
|
||||||
bookmarksUpdated()
|
var o = BOOKMARKS.indexOf(gid)
|
||||||
|
|
||||||
|
// move the marked gid...
|
||||||
|
BOOKMARKS.splice(o, 1)
|
||||||
|
BOOKMARKS.splice(n, 0, gid)
|
||||||
|
|
||||||
|
// test if there are any marked images between n and o...
|
||||||
|
var shift = compactSparceList(BOOKMARKS.slice(Math.min(n, o)+1, Math.max(n, o)))
|
||||||
|
if(shift.length > 0){
|
||||||
|
marksUpdated()
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
93
ui/marks.js
93
ui/marks.js
@ -78,17 +78,10 @@ function makeMarkedLister(get_marked){
|
|||||||
return function(mode){
|
return function(mode){
|
||||||
var marked = get_marked()
|
var marked = get_marked()
|
||||||
mode = mode == null ? 'all' : mode
|
mode = mode == null ? 'all' : mode
|
||||||
var gids = mode == 'all' ? getLoadedGIDs(marked)
|
return mode == 'all' ? getLoadedGIDs(marked)
|
||||||
: mode.constructor.name == 'Array' ? getLoadedGIDs(mode)
|
: mode.constructor.name == 'Array' ? getLoadedGIDs(mode)
|
||||||
: typeof(mode) == typeof(123) ? getRibbonGIDs(mode)
|
: typeof(mode) == typeof(123) ? getRibbonGIDs(marked, mode)
|
||||||
: getRibbonGIDs()
|
: getRibbonGIDs(marked)
|
||||||
|
|
||||||
if(mode == 'all'){
|
|
||||||
return gids
|
|
||||||
}
|
|
||||||
return gids.filter(function(e){
|
|
||||||
return marked.indexOf(e) >= 0
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -105,63 +98,71 @@ function makeMarkedLister(get_marked){
|
|||||||
// XXX with sparce lists this is trivial: get all the null indexes...
|
// XXX with sparce lists this is trivial: get all the null indexes...
|
||||||
function makeUnmarkedLister(get_marked, get_cache){
|
function makeUnmarkedLister(get_marked, get_cache){
|
||||||
return function(mode){
|
return function(mode){
|
||||||
|
mode = mode == null ? 'all' : mode
|
||||||
|
|
||||||
var marked = get_marked()
|
var marked = get_marked()
|
||||||
var cache = get_cache != null ? get_cache() : null
|
var cache = get_cache != null ? get_cache() : null
|
||||||
|
|
||||||
mode = mode == null ? 'all' : mode
|
|
||||||
var gids = mode == 'all' ? getLoadedGIDs()
|
var gids = mode == 'all' ? getLoadedGIDs()
|
||||||
: mode.constructor.name == 'Array' ? getLoadedGIDs(mode)
|
: mode.constructor.name == 'Array' ? getLoadedGIDs(mode)
|
||||||
: typeof(mode) == typeof(123) ? getRibbonGIDs(mode)
|
: typeof(mode) == typeof(123) ? getRibbonGIDs(marked, mode)
|
||||||
: getRibbonGIDs()
|
: getRibbonGIDs(marked)
|
||||||
mode = mode == 'ribbon' ? getRibbonIndex() : mode
|
|
||||||
|
|
||||||
// get the cached set...
|
|
||||||
if(cache != null && mode in cache){
|
|
||||||
return cache[mode]
|
|
||||||
}
|
|
||||||
|
|
||||||
// calculate the set...
|
// calculate the set...
|
||||||
var res = gids.filter(function(e){
|
var res = gids.filter(function(e){
|
||||||
// keep only unmarked...
|
// keep only unmarked...
|
||||||
return marked.indexOf(e) < 0
|
return marked.indexOf(e) < 0
|
||||||
})
|
})
|
||||||
if(cache != null && typeof(mode) == typeof(123)){
|
|
||||||
cache[mode] = res
|
|
||||||
}
|
|
||||||
|
|
||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// NOTE: this is about an order of magnitude faster than the non-sparse
|
||||||
|
// version...
|
||||||
|
function makeUnmarkedSparseLister(get_marked, get_cache){
|
||||||
|
// mode can be:
|
||||||
|
// - null - default, same as 'all'
|
||||||
|
// - 'all' - process all loases gids
|
||||||
|
// - 'ribbon' - process curent ribbon
|
||||||
|
// - number - ribbon index
|
||||||
|
// - Array - list of gids
|
||||||
|
return function(mode){
|
||||||
|
mode = mode == null ? 'all' : mode
|
||||||
|
|
||||||
|
var marked = get_marked()
|
||||||
|
//var cache = get_cache != null ? get_cache() : null
|
||||||
|
|
||||||
|
var res = mode == 'all' ?
|
||||||
|
DATA.order.slice()
|
||||||
|
: mode == 'ribbon' ?
|
||||||
|
populateSparceGIDList(getRibbonGIDs())
|
||||||
|
: typeof(mode) == typeof(123) ?
|
||||||
|
populateSparceGIDList(getRibbonGIDs(mode))
|
||||||
|
: mode
|
||||||
|
|
||||||
|
// for ribbon modes, remove non-ribbon marks...
|
||||||
|
if(mode == 'ribbon'){
|
||||||
|
marked = getRibbonGIDs(marked)
|
||||||
|
} else if(typeof(mode) == typeof(123)){
|
||||||
|
marked = getRibbonGIDs(marked, mode)
|
||||||
|
mode = 'ribbon'
|
||||||
|
}
|
||||||
|
|
||||||
|
// negate the list...
|
||||||
|
marked.forEach(function(e, i){
|
||||||
|
delete res[i]
|
||||||
|
})
|
||||||
|
|
||||||
|
return getLoadedGIDs(compactSparceList(res))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
var getMarked = makeMarkedLister(function(){ return MARKED })
|
var getMarked = makeMarkedLister(function(){ return MARKED })
|
||||||
var getUnmarked = makeUnmarkedLister(
|
var getUnmarked = makeUnmarkedSparseLister(
|
||||||
function(){ return MARKED },
|
function(){ return MARKED },
|
||||||
function(){ return _UNMARKED_CACHE })
|
function(){ return _UNMARKED_CACHE })
|
||||||
|
|
||||||
// these two are about 3 orders of magnitude faster than the above...
|
|
||||||
// ...which is better I do not yet know...
|
|
||||||
function getUnmarked_s0(){
|
|
||||||
var order = DATA.order
|
|
||||||
var res = []
|
|
||||||
for(var i=0; i < order.length; i++){
|
|
||||||
if(MARKED[i] == null){
|
|
||||||
res.push(order[i])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//return res
|
|
||||||
return getLoadedGIDs(res)
|
|
||||||
}
|
|
||||||
function getUnmarked_s1(){
|
|
||||||
var res = DATA.order.slice()
|
|
||||||
// XXX is it normal that .map() and .forEach() skip undefined values?
|
|
||||||
MARKED.map(function(e, i){
|
|
||||||
delete res[i]
|
|
||||||
})
|
|
||||||
//return compactSparceList(res)
|
|
||||||
return getLoadedGIDs(compactSparceList(res))
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// XXX make this undefined tolerant -- sparse list compatibility...
|
// XXX make this undefined tolerant -- sparse list compatibility...
|
||||||
var getMarkedGIDBefore = makeGIDBeforeGetterFromList(
|
var getMarkedGIDBefore = makeGIDBeforeGetterFromList(
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user