mirror of
				https://github.com/flynx/ImageGrid.git
				synced 2025-10-30 19:00:09 +00:00 
			
		
		
		
	more work on dynamic loading, rewritten gid search (now simple to debug and appears to be correct-ish)...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
		
							parent
							
								
									63193db367
								
							
						
					
					
						commit
						345c9b7286
					
				
							
								
								
									
										125
									
								
								ui/ImageGrid.js
									
									
									
									
									
								
							
							
						
						
									
										125
									
								
								ui/ImageGrid.js
									
									
									
									
									
								
							| @ -146,6 +146,60 @@ function getImageBefore(image, ribbon, mode){ | |||||||
| 	return $(prev) | 	return $(prev) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // XXX this gets infinite at the start and end of the list...
 | ||||||
|  | function binSearch(target, lst, check){ | ||||||
|  | 	// special case: target in the list directly...
 | ||||||
|  | 	if(check(target, lst.indexOf(target), lst) == 0){ | ||||||
|  | 		return target | ||||||
|  | 	} | ||||||
|  | 	// special case: tail...
 | ||||||
|  | 	if(check(target, lst.length-1, lst) >= 0){ | ||||||
|  | 		return lst[lst.length-1] | ||||||
|  | 	} | ||||||
|  | 	// special case: head...
 | ||||||
|  | 	if(check(target, 0, lst) == 0){ | ||||||
|  | 		return lst[0] | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	var l = Math.ceil(lst.length/2) | ||||||
|  | 	var i = l | ||||||
|  | 	var res | ||||||
|  | 
 | ||||||
|  | 	while(l > 0){ | ||||||
|  | 		l = Math.ceil(l/2) | ||||||
|  | 		res = check(target, i, lst) | ||||||
|  | 		// right branch...
 | ||||||
|  | 		if(res > 0){ | ||||||
|  | 			i += l | ||||||
|  | 		// left branch...
 | ||||||
|  | 		} else if(res < 0){ | ||||||
|  | 			i -= l | ||||||
|  | 		// hit...
 | ||||||
|  | 		} else { | ||||||
|  | 			// XXX return position or object???
 | ||||||
|  | 			return lst[i] | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	// no hit...
 | ||||||
|  | 	return null | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | function isBetween(a, i, lst){ | ||||||
|  | 	var b = lst[i] | ||||||
|  | 	var c = lst[i+1] | ||||||
|  | 	// hit...
 | ||||||
|  | 	if(a == b || (a > b && a < c)){ | ||||||
|  | 		return 0 | ||||||
|  | 	// before...
 | ||||||
|  | 	} else if(a < b){ | ||||||
|  | 		return -1 | ||||||
|  | 	// later...
 | ||||||
|  | 	} else { | ||||||
|  | 		return 1 | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| // same as getImageBefore, but uses gids and searches in DATA...
 | // same as getImageBefore, but uses gids and searches in DATA...
 | ||||||
| // XXX check for corner cases...
 | // XXX check for corner cases...
 | ||||||
| // XXX getGIDBefore(1, 1) does not work...
 | // XXX getGIDBefore(1, 1) does not work...
 | ||||||
| @ -153,33 +207,22 @@ function getGIDBefore(gid, ribbon){ | |||||||
| 	ribbon = DATA.ribbons[ribbon] | 	ribbon = DATA.ribbons[ribbon] | ||||||
| 	var order = DATA.order | 	var order = DATA.order | ||||||
| 
 | 
 | ||||||
| 	var target = ribbon.indexOf(gid) | 	var target = order.indexOf(gid) | ||||||
| 
 |  | ||||||
| 	if(target >= 0){ |  | ||||||
| 		return gid |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	target = order.indexOf(gid) |  | ||||||
| 
 |  | ||||||
| 	var i = ribbon.length |  | ||||||
| 
 |  | ||||||
| 	while(i > 0){ |  | ||||||
| 		i = Math.floor(ribbon.length/2) |  | ||||||
| 
 |  | ||||||
| 		console.log('>>>', target, i, order.indexOf(ribbon[i]), order.indexOf(ribbon[i+1])) |  | ||||||
| 
 |  | ||||||
| 		if(target >= order.indexOf(ribbon[i]) && target < order.indexOf(ribbon[i+1])){ |  | ||||||
| 			return ribbon[i] |  | ||||||
| 
 |  | ||||||
| 		// XXX I do not understand why this works correctly, think I need some sleep...
 |  | ||||||
| 		} else if(target < order.indexOf(ribbon[i])){ |  | ||||||
| 			ribbon = ribbon.slice(0, i) |  | ||||||
| 
 | 
 | ||||||
|  | 	return binSearch(target, ribbon, function (a, i, lst){ | ||||||
|  | 		var b = order.indexOf(lst[i]) | ||||||
|  | 		var c = order.indexOf(lst[i+1]) | ||||||
|  | 		// hit...
 | ||||||
|  | 		if(a == b || (a > b && a < c)){ | ||||||
|  | 			return 0 | ||||||
|  | 		// before...
 | ||||||
|  | 		} else if(a < b){ | ||||||
|  | 			return -1 | ||||||
|  | 		// later...
 | ||||||
| 		} else { | 		} else { | ||||||
| 			ribbon = ribbon.slice(i) | 			return 1 | ||||||
| 		} | 		} | ||||||
| 	}	 | 	}) | ||||||
| 	return null |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| @ -453,8 +496,30 @@ function updateImage(image, gid, size){ | |||||||
| //
 | //
 | ||||||
| // NOTE: this will reload the current image elements...
 | // NOTE: this will reload the current image elements...
 | ||||||
| // NOTE: this is similar to extendRibbon(...) but different in interface...
 | // NOTE: this is similar to extendRibbon(...) but different in interface...
 | ||||||
| function loadImages(image, count, ribbon){ | function loadImages(ref_gid, count, ribbon){ | ||||||
| 	// XXX
 | 	ribbon = $(ribbon) | ||||||
|  | 	var images = ribbon.find('.image') | ||||||
|  | 	var ribbon_i = getRibbonIndex(ribbon) | ||||||
|  | 	var gid = getGIDBefore(ref_gid, ribbon_i) | ||||||
|  | 
 | ||||||
|  | 	// start/end points...
 | ||||||
|  | 	var from_i = DATA.ribbons[ribbon_i].indexOf(gid) - Math.floor(count/2) | ||||||
|  | 	from_i = from_i < 0 ? 0 : from_i | ||||||
|  | 	var from_gid = DATA.ribbons[ribbon_i][from_i] | ||||||
|  | 
 | ||||||
|  | 	// XXX make this load only what is needed instead of reloading everything...
 | ||||||
|  | 
 | ||||||
|  | 	var size = getVisibleImageSize() | ||||||
|  | 	var gids = getImageGIDs(from_gid, count) | ||||||
|  | 	// XXX is this the only special case???
 | ||||||
|  | 	if(from_gid == from_gid){ | ||||||
|  | 		gids.splice(0, 0, ref_gid) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return createImages(gids.length, images.detach()) | ||||||
|  | 		.each(function(i, e){ | ||||||
|  | 			updateImage(e, gids[i], size) | ||||||
|  | 		}).appendTo(ribbon) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| @ -644,6 +709,10 @@ function centerImage(image, mode){ | |||||||
| 		//mode = 'css'
 | 		//mode = 'css'
 | ||||||
| 		mode = 'animate' | 		mode = 'animate' | ||||||
| 	} | 	} | ||||||
|  | 
 | ||||||
|  | 	// XXX is this the correct spot for this?
 | ||||||
|  | 	$('.viewer').trigger('preCenteringRibbon', [getRibbon(image), image]) | ||||||
|  | 
 | ||||||
| 	if(image == null || image.length == 0){ | 	if(image == null || image.length == 0){ | ||||||
| 		image = $('.current.image') | 		image = $('.current.image') | ||||||
| 	} | 	} | ||||||
| @ -701,6 +770,7 @@ function centerImage(image, mode){ | |||||||
| // 		...or make a generic centering function...
 | // 		...or make a generic centering function...
 | ||||||
| //
 | //
 | ||||||
| // XXX this does not work in marked-only mode...
 | // XXX this does not work in marked-only mode...
 | ||||||
|  | // XXX this needs the image to exist... should be GID compatible...
 | ||||||
| function centerRibbon(ribbon, image, mode){ | function centerRibbon(ribbon, image, mode){ | ||||||
| 	if(mode == null){ | 	if(mode == null){ | ||||||
| 		//mode = 'css'
 | 		//mode = 'css'
 | ||||||
| @ -716,6 +786,9 @@ function centerRibbon(ribbon, image, mode){ | |||||||
| 		return ribbon | 		return ribbon | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	// XXX is this the correct spot for this?
 | ||||||
|  | 	$('.viewer').trigger('preCenteringRibbon', [ribbon, image]) | ||||||
|  | 
 | ||||||
| 	var scale = getElementScale($('.ribbon-set')) | 	var scale = getElementScale($('.ribbon-set')) | ||||||
| 	var target = getImageBefore(image, ribbon, null) | 	var target = getImageBefore(image, ribbon, null) | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -256,7 +256,20 @@ $(function(){ | |||||||
| 	var LOADER_THRESHOLD = 2 | 	var LOADER_THRESHOLD = 2 | ||||||
| 	// XXX update this depending on zoom and navigation speed... | 	// XXX update this depending on zoom and navigation speed... | ||||||
| 	var LOADER_CHUNK = LOADER_THRESHOLD * 2 | 	var LOADER_CHUNK = LOADER_THRESHOLD * 2 | ||||||
|  | 	var IMAGES_IN_RIBBON = 30 | ||||||
| 	$('.viewer') | 	$('.viewer') | ||||||
|  | 		/* XXX this is distructive... | ||||||
|  | 		.on('preCenteringRibbon', function(evt, ribbon, image){ | ||||||
|  | 			// XXX load ONLY if getGIDBefore(getImageGID(image)) is not currently loaded... | ||||||
|  | 			if( ribbon | ||||||
|  | 					.find('[gid="'+getGIDBefore(getImageGID(image),  | ||||||
|  | 										getRibbonIndex(ribbon))+'"]') | ||||||
|  | 					.length > 0 ){ | ||||||
|  | 				console.log('>>> Loading...') | ||||||
|  | 				loadImages(getImageGID(image), IMAGES_IN_RIBBON, ribbon) | ||||||
|  | 			} | ||||||
|  | 		}) | ||||||
|  | 		*/ | ||||||
| 		// XXX it takes several steps for adjacent ribbons to catch up... | 		// XXX it takes several steps for adjacent ribbons to catch up... | ||||||
| 		.on('centeringRibbon', function(evt, ribbon, image){ | 		.on('centeringRibbon', function(evt, ribbon, image){ | ||||||
| 			// check if we are in the right range... | 			// check if we are in the right range... | ||||||
| @ -272,8 +285,12 @@ $(function(){ | |||||||
| 				var images = ribbon.find('.image') | 				var images = ribbon.find('.image') | ||||||
| 				var cur = getImageGID(images.eq(Math.round(images.length/2))) | 				var cur = getImageGID(images.eq(Math.round(images.length/2))) | ||||||
| 				var gr = DATA.ribbons[r] | 				var gr = DATA.ribbons[r] | ||||||
| 				console.log('>>>', gr.indexOf(gid_before) - gr.indexOf(cur)) | 				//console.log('>>>', gr.indexOf(gid_before) - gr.indexOf(cur)) | ||||||
| 				rollImages(gr.indexOf(gid_before) - gr.indexOf(cur), ribbon) | 				rollImages(gr.indexOf(gid_before) - gr.indexOf(cur), ribbon) | ||||||
|  | 
 | ||||||
|  | 				//centerRibbon(ribbon, image) | ||||||
|  | 
 | ||||||
|  | 				//return | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			if(img_before.length == 0){ | 			if(img_before.length == 0){ | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user