mirror of
				https://github.com/flynx/ImageGrid.git
				synced 2025-10-31 03:10:07 +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