mirror of
				https://github.com/flynx/ImageGrid.git
				synced 2025-10-30 19:00:09 +00:00 
			
		
		
		
	fixed sorting (id sort stil flaky) and some refactoring...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
		
							parent
							
								
									dc9b94f50c
								
							
						
					
					
						commit
						79f3095294
					
				
							
								
								
									
										31
									
								
								ui/TODO.otl
									
									
									
									
									
								
							
							
						
						
									
										31
									
								
								ui/TODO.otl
									
									
									
									
									
								
							| @ -1,13 +1,7 @@ | |||||||
| Priority work | Priority work | ||||||
| 	[_] 79% Preview II | 	[_] 87% Preview II | ||||||
| 		[_] 54% native client | 		[_] 43% native client | ||||||
| 			[X] 100% Standalone utils | 			[_] make cache generator accept command-line args... | ||||||
| 				[X] generate cache |  | ||||||
| 				| resize images and put them into .ImageGrid.cache/<size>px directory |  | ||||||
| 				| |  | ||||||
| 				| should rebuild JSON |  | ||||||
| 				[X] generate JSON |  | ||||||
| 				| build JSON data from a directory... |  | ||||||
| 			[_] 0% Generic | 			[_] 0% Generic | ||||||
| 				[_] default settings in platform-specific JSON file | 				[_] default settings in platform-specific JSON file | ||||||
| 				| this file should be auto-loaded on first run -- when no | 				| this file should be auto-loaded on first run -- when no | ||||||
| @ -34,12 +28,21 @@ Priority work | |||||||
| 					[_] directory lister | 					[_] directory lister | ||||||
| 				[X] basic test | 				[X] basic test | ||||||
| 				[X] disable transitions... | 				[X] disable transitions... | ||||||
| 		[_] load sorted images from JSON data | 			[X] 100% Standalone utils | ||||||
| 		| curently the sort is as in file... | 				[X] generate cache | ||||||
| 		[_] load higher resolution images OVER lower res to avoid "blackouts" | 				| resize images and put them into .ImageGrid.cache/<size>px directory | ||||||
| 		| plus, might be good to keep the low-res versions loaded... |  | ||||||
| 				| | 				| | ||||||
| 		| this can either be done via pre-loading or double layering... | 				| should rebuild JSON | ||||||
|  | 				[X] generate JSON | ||||||
|  | 				| build JSON data from a directory... | ||||||
|  | 		[_] make loading of different resolution images smooth... | ||||||
|  | 		| can be done in several ways: | ||||||
|  | 		| 	- cache images before loading... | ||||||
|  | 		| 	- two layers... | ||||||
|  | 		| 	- always keep the lowest res image loaded... | ||||||
|  | 		[X] load sorted images from JSON data | ||||||
|  | 		| curently the sort is as in file... | ||||||
|  | 		[X] fix image ordering... | ||||||
| 		[X] 100% dynamic loading of images | 		[X] 100% dynamic loading of images | ||||||
| 			[X] 100% stream on navigate | 			[X] 100% stream on navigate | ||||||
| 				| parameters that affect loading: | 				| parameters that affect loading: | ||||||
|  | |||||||
| @ -1,7 +1,7 @@ | |||||||
| #======================================================================= | #======================================================================= | ||||||
| 
 | 
 | ||||||
| __version__ = '''0.0.01''' | __version__ = '''0.0.01''' | ||||||
| __sub_version__ = '''20120923194735''' | __sub_version__ = '''20120923233459''' | ||||||
| __copyright__ = '''(c) Alex A. Naanou 2012''' | __copyright__ = '''(c) Alex A. Naanou 2012''' | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| @ -181,6 +181,7 @@ def make_cache_images(path, config=config): | |||||||
| 	for name in os.listdir(path): | 	for name in os.listdir(path): | ||||||
| 		# skip non-images... | 		# skip non-images... | ||||||
| 		iid, ext = os.path.splitext(name) | 		iid, ext = os.path.splitext(name) | ||||||
|  | 		source_path = pathjoin(path, name) | ||||||
| 		if ext != IMAGE_EXT: | 		if ext != IMAGE_EXT: | ||||||
| 			continue | 			continue | ||||||
| 		n += 1 | 		n += 1 | ||||||
| @ -190,8 +191,9 @@ def make_cache_images(path, config=config): | |||||||
| ##			'path': pathjoin(path, name), | ##			'path': pathjoin(path, name), | ||||||
| 			##!!! absolute paths??? | 			##!!! absolute paths??? | ||||||
| 			'path': 'file:///' + urllib2.quote(pathjoin(path, name), safe='/:'), | 			'path': 'file:///' + urllib2.quote(pathjoin(path, name), safe='/:'), | ||||||
|  | 			'ctime': os.path.getctime(source_path), | ||||||
| 		} | 		} | ||||||
| 		img = Image.open(pathjoin(path, name), 'r') | 		img = Image.open(source_path, 'r') | ||||||
| 		try: | 		try: | ||||||
| 			iid = sha.sha(img.tostring()).hexdigest() | 			iid = sha.sha(img.tostring()).hexdigest() | ||||||
| 		except IOError, e: | 		except IOError, e: | ||||||
|  | |||||||
| @ -439,12 +439,27 @@ jQuery.fn.sortChildren = function(func){ | |||||||
| 
 | 
 | ||||||
| /********************************************************** Helpers **/ | /********************************************************** Helpers **/ | ||||||
| 
 | 
 | ||||||
| function getImageOrder(img){ | function getImagePath(img){ | ||||||
| 	// XXX HACK need to parseInt this because '13' is less than '2'... 
 | 	var data = getImageData($(img).attr('id')) | ||||||
| 	// 	   ...figure a way out of this!!!
 | 	if(data != null){ | ||||||
| 	//return parseInt($(img).attr('id'))
 | 		return data.path | ||||||
| 	return $(img).attr('id') |  | ||||||
| 	} | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | function getImageDate(img){ | ||||||
|  | 	var data = getImageData($(img).attr('id')) | ||||||
|  | 	if(data != null){ | ||||||
|  | 		return data.ctime | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | function getImageId(img){ | ||||||
|  | 	var id = $(img).attr('id') | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // XXX make this an attr...
 | ||||||
|  | var getImageOrder = getImagePath | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| function setImageOrder(img, order){ | function setImageOrder(img, order){ | ||||||
| @ -453,13 +468,8 @@ function setImageOrder(img, order){ | |||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| function cmpImageOrder(a, b){ | function cmpImageOrder(a, b){ | ||||||
| 	return getImageOrder(a) - getImageOrder(b) | 	a = getImageOrder(a) | ||||||
| } | 	b = getImageOrder(b) | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| function cmpImagePaths(a, b){  |  | ||||||
| 	a = getURL($(a).attr('id')) |  | ||||||
| 	b = getURL($(b).attr('id')) |  | ||||||
| 	return a > b ? 1 : a < b ? -1 : 0 | 	return a > b ? 1 : a < b ? -1 : 0 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -789,13 +799,14 @@ function getImageBefore_lin(id, ribbon, get_order){ | |||||||
| 	if(get_order == null){ | 	if(get_order == null){ | ||||||
| 		get_order = getImageOrder | 		get_order = getImageOrder | ||||||
| 	} | 	} | ||||||
|  | 	var order = get_order($('#'+id)) | ||||||
| 	// walk the ribbon till we find two images one with an ID less and 
 | 	// walk the ribbon till we find two images one with an ID less and 
 | ||||||
| 	// another greater that id...
 | 	// another greater that id...
 | ||||||
| 	var images = ribbon.children('.image') | 	var images = ribbon.children('.image') | ||||||
| 	var prev = null | 	var prev = null | ||||||
| 	for(var i=0; i < images.length; i++){ | 	for(var i=0; i < images.length; i++){ | ||||||
| 		// XXX replace the id attr with a universal getter
 | 		// XXX replace the id attr with a universal getter
 | ||||||
| 		if(get_order(images[i]) > id){ | 		if(get_order(images[i]) > order){ | ||||||
| 			return prev | 			return prev | ||||||
| 		} | 		} | ||||||
| 		prev = $(images[i]) | 		prev = $(images[i]) | ||||||
| @ -806,7 +817,7 @@ function getImageBefore_lin(id, ribbon, get_order){ | |||||||
| // generic binery search for element just before the id...
 | // generic binery search for element just before the id...
 | ||||||
| // NOTE: if id is in lst, this will return the element just before it.
 | // NOTE: if id is in lst, this will return the element just before it.
 | ||||||
| // NOTE: lst must be sorted.
 | // NOTE: lst must be sorted.
 | ||||||
| function binarySearch(id, lst, get_order){ | function binarySearch(order, lst, get_order){ | ||||||
| 	if(get_order == null){ | 	if(get_order == null){ | ||||||
| 		get_order = function(o){return o} | 		get_order = function(o){return o} | ||||||
| 	} | 	} | ||||||
| @ -822,31 +833,31 @@ function binarySearch(id, lst, get_order){ | |||||||
| 	var i = l | 	var i = l | ||||||
| 
 | 
 | ||||||
| 	while(true){ | 	while(true){ | ||||||
| 		var i_id = get_order(lst[i]) | 		var i_order = get_order(lst[i]) | ||||||
| 		// beginning of the array...
 | 		// beginning of the array...
 | ||||||
| 		if(i == 0){ | 		if(i == 0){ | ||||||
| 			if(id > i_id){ | 			if(order > i_order){ | ||||||
| 				return i | 				return i | ||||||
| 			} | 			} | ||||||
| 			return null | 			return null | ||||||
| 		} | 		} | ||||||
| 		// we got a hit...
 | 		// we got a hit...
 | ||||||
| 		if(i_id == id){ | 		if(i_order == order){ | ||||||
| 			return i-1 | 			return i-1 | ||||||
| 		} | 		} | ||||||
| 		// we are at the end...
 | 		// we are at the end...
 | ||||||
| 		if(i == lst.length-1 && id > i_id){ | 		if(i == lst.length-1 && order > i_order){ | ||||||
| 			return i | 			return i | ||||||
| 		} | 		} | ||||||
| 		var ii_id = get_order(lst[i+1]) | 		var ii_order = get_order(lst[i+1]) | ||||||
| 		// test if id is between i and i+1...
 | 		// test if order is between i and i+1...
 | ||||||
| 		if( i_id < id && id < ii_id ){ | 		if( i_order < order && order < ii_order ){ | ||||||
| 			return i | 			return i | ||||||
| 		} | 		} | ||||||
| 		// prepare for next iteration...
 | 		// prepare for next iteration...
 | ||||||
| 		// NOTE: we saturate the values so we will never get out of bounds.
 | 		// NOTE: we saturate the values so we will never get out of bounds.
 | ||||||
| 		l = Math.round(l/2) | 		l = Math.round(l/2) | ||||||
| 		if(id < i_id){ | 		if(order < i_order){ | ||||||
| 			// lower half...
 | 			// lower half...
 | ||||||
| 			i = Math.max(0, i-l) | 			i = Math.max(0, i-l) | ||||||
| 		} else { | 		} else { | ||||||
| @ -862,8 +873,9 @@ function getImageBefore_bin(id, ribbon, get_order){ | |||||||
| 	if(get_order == null){ | 	if(get_order == null){ | ||||||
| 		get_order = getImageOrder | 		get_order = getImageOrder | ||||||
| 	} | 	} | ||||||
|  | 	var order = get_order($('#'+id)) | ||||||
| 	var images = ribbon.children('.image')  | 	var images = ribbon.children('.image')  | ||||||
| 	var i = binarySearch(id, images, get_order) | 	var i = binarySearch(order, images, get_order) | ||||||
| 	if(i == null){ | 	if(i == null){ | ||||||
| 		return null | 		return null | ||||||
| 	} | 	} | ||||||
| @ -1017,12 +1029,9 @@ function alignRibbon(image, position){ | |||||||
| 
 | 
 | ||||||
| // center other ribbons relative to current image...
 | // center other ribbons relative to current image...
 | ||||||
| // NOTE: only two ribbons are positioned at this point...
 | // NOTE: only two ribbons are positioned at this point...
 | ||||||
| function alignRibbons(get_order){ | function alignRibbons(){ | ||||||
| 	if(get_order == null){ |  | ||||||
| 		get_order = getImageOrder |  | ||||||
| 	} |  | ||||||
| 	// XXX might be good to move this to a more generic location...
 | 	// XXX might be good to move this to a more generic location...
 | ||||||
| 	var id = get_order($('.current.image')) | 	var id = $('.current.image').attr('id') | ||||||
| 	var directions = ['prev', 'next'] | 	var directions = ['prev', 'next'] | ||||||
| 	for(var i in directions){ | 	for(var i in directions){ | ||||||
| 		var ribbon = $('.current.ribbon')[directions[i]]('.ribbon') | 		var ribbon = $('.current.ribbon')[directions[i]]('.ribbon') | ||||||
| @ -1378,15 +1387,12 @@ function loadImagesFromList(images){ | |||||||
|  * 	} |  * 	} | ||||||
|  */ |  */ | ||||||
| // XXX add incremental or partial updates...
 | // XXX add incremental or partial updates...
 | ||||||
| function buildJSON(get_order){ | function buildJSON(){ | ||||||
| 	/* XXX can't return this yet as we are not updating this properly yet... | 	/* XXX can't return this yet as we are not updating this properly yet... | ||||||
| 	if(ImageGrid.image_data != null){ | 	if(ImageGrid.image_data != null){ | ||||||
| 		return ImageGrid.image_data | 		return ImageGrid.image_data | ||||||
| 	} | 	} | ||||||
| 	*/ | 	*/ | ||||||
| 	if(get_order == null){ |  | ||||||
| 		get_order = getImageOrder |  | ||||||
| 	} |  | ||||||
| 	var size = getCurrentImageSize() | 	var size = getCurrentImageSize() | ||||||
| 	var ribbons = $('.ribbon') | 	var ribbons = $('.ribbon') | ||||||
| 	res = { | 	res = { | ||||||
| @ -1403,8 +1409,8 @@ function buildJSON(get_order){ | |||||||
| 		res.ribbons.push(ribbon) | 		res.ribbons.push(ribbon) | ||||||
| 		for(var j=0; j < images.length; j++){ | 		for(var j=0; j < images.length; j++){ | ||||||
| 			var image = $(images[j]) | 			var image = $(images[j]) | ||||||
| 			var id = get_order(image) | 			var data = getImageData(image.attr('id')) | ||||||
| 			ribbon[id] = getImageData(id) | 			ribbon[data.id] = data | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	ImageGrid.image_data = res | 	ImageGrid.image_data = res | ||||||
| @ -1414,6 +1420,7 @@ function buildJSON(get_order){ | |||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| // XXX might be good to add images in packs here, not one by one...
 | // XXX might be good to add images in packs here, not one by one...
 | ||||||
|  | // make this work on detached elements...
 | ||||||
| function loadJSON(data, position, set_order){ | function loadJSON(data, position, set_order){ | ||||||
| 	if(position == null){ | 	if(position == null){ | ||||||
| 		position = data.position | 		position = data.position | ||||||
| @ -1430,6 +1437,10 @@ function loadJSON(data, position, set_order){ | |||||||
| 	ImageGrid.image_data = data | 	ImageGrid.image_data = data | ||||||
| 
 | 
 | ||||||
| 	var field = $('.field') | 	var field = $('.field') | ||||||
|  | 	field.hide() | ||||||
|  | 	//var c = field.parent()
 | ||||||
|  | 
 | ||||||
|  | 	//field.detach()
 | ||||||
| 
 | 
 | ||||||
| 	// drop all old content...
 | 	// drop all old content...
 | ||||||
| 	field.children('.ribbon').remove() | 	field.children('.ribbon').remove() | ||||||
| @ -1444,26 +1455,26 @@ function loadJSON(data, position, set_order){ | |||||||
| 		} | 		} | ||||||
| 		// create ribbon...
 | 		// create ribbon...
 | ||||||
| 		var ribbon = $('<div class="ribbon"></div>') | 		var ribbon = $('<div class="ribbon"></div>') | ||||||
| 			.appendTo(field) |  | ||||||
| 		var new_images = {} | 		var new_images = {} | ||||||
| 		for(var j in images){ | 		for(var j in images){ | ||||||
| 			var image = images[j] | 			var image = images[j] | ||||||
| 			// update index...
 |  | ||||||
| 			//new_images[order] = image
 |  | ||||||
| 			// create image...
 |  | ||||||
| 			//makeImage(order, set_order)
 |  | ||||||
| 			makeImage(j, set_order) | 			makeImage(j, set_order) | ||||||
| 				.appendTo(ribbon) | 				.appendTo(ribbon) | ||||||
| 			order++ | 			order++ | ||||||
| 		} | 		} | ||||||
| 		//ribbons[i] = new_images
 | 		ribbon.appendTo(field) | ||||||
| 	} | 	} | ||||||
|  | 	// sort images...
 | ||||||
|  | 	ImageGrid.sortImages() | ||||||
| 	console.log('loaded: ', order) | 	console.log('loaded: ', order) | ||||||
| 	if(position != null && $('#' + position).length != 0){ | 	if(position != null && $('#' + position).length != 0){ | ||||||
| 		$('#' + position).click() | 		$('#' + position).click() | ||||||
| 	} else { | 	} else { | ||||||
| 		$('.image').first().click() | 		$('.image').first().click() | ||||||
| 	} | 	} | ||||||
|  | 
 | ||||||
|  | 	//field.appendTo(c)
 | ||||||
|  | 	field.show() | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| @ -2014,11 +2025,8 @@ ImageGrid.GROUP('Navigation', | |||||||
| 			doc: 'Focus ribbon in specified direction', | 			doc: 'Focus ribbon in specified direction', | ||||||
| 			display: false, | 			display: false, | ||||||
| 		}, | 		}, | ||||||
| 		function focusRibbon(direction, get_order){ | 		function focusRibbon(direction){ | ||||||
| 			if(get_order == null){ | 			var id = $('.current.image').attr('id') | ||||||
| 				get_order = getImageOrder |  | ||||||
| 			} |  | ||||||
| 			var id = get_order($('.current.image')) |  | ||||||
| 			var prev = getImageBefore(id, $('.current.ribbon')[direction]('.ribbon')) | 			var prev = getImageBefore(id, $('.current.ribbon')[direction]('.ribbon')) | ||||||
| 			if(prev){ | 			if(prev){ | ||||||
| 				var next = prev.next() | 				var next = prev.next() | ||||||
| @ -2167,16 +2175,13 @@ ImageGrid.GROUP('Ribbon manipulations', | |||||||
| 				'ribbon and add them to current.', | 				'ribbon and add them to current.', | ||||||
| 			display: false, | 			display: false, | ||||||
| 		}, | 		}, | ||||||
| 		function mergeRibbons(direction, get_order){ | 		function mergeRibbons(direction){ | ||||||
| 			if(get_order == null){ |  | ||||||
| 				get_order = getImageOrder |  | ||||||
| 			} |  | ||||||
| 			var current_ribbon = $('.current.ribbon') | 			var current_ribbon = $('.current.ribbon') | ||||||
| 			var images = $('.current.ribbon')[direction]('.ribbon').children() | 			var images = $('.current.ribbon')[direction]('.ribbon').children() | ||||||
| 			for(var i=0; i < images.length; i++){ | 			for(var i=0; i < images.length; i++){ | ||||||
| 				var image = $(images[i]) | 				var image = $(images[i]) | ||||||
| 				// get previous element after which we need to put the current...
 | 				// get previous element after which we need to put the current...
 | ||||||
| 				var prev_elem = getImageBefore(get_order(image), current_ribbon) | 				var prev_elem = getImageBefore(image.attr('id'), current_ribbon) | ||||||
| 				// check if we need to be before the first element...
 | 				// check if we need to be before the first element...
 | ||||||
| 				if(prev_elem == null){ | 				if(prev_elem == null){ | ||||||
| 					image | 					image | ||||||
| @ -2216,17 +2221,14 @@ ImageGrid.GROUP('Image manipulation', | |||||||
| 			title: 'Shift image in direction', | 			title: 'Shift image in direction', | ||||||
| 			display: false, | 			display: false, | ||||||
| 		}, | 		}, | ||||||
| 		function shiftImage(direction, get_order){ | 		function shiftImage(direction){ | ||||||
| 			if(get_order == null){ |  | ||||||
| 				get_order = getImageOrder |  | ||||||
| 			} |  | ||||||
| 			if($('.current.ribbon')[direction]('.ribbon').length == 0){ | 			if($('.current.ribbon')[direction]('.ribbon').length == 0){ | ||||||
| 				ImageGrid.createRibbon(direction) | 				ImageGrid.createRibbon(direction) | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			// get previous element after which we need to put the current...
 | 			// get previous element after which we need to put the current...
 | ||||||
| 			var prev_elem = getImageBefore( | 			var prev_elem = getImageBefore( | ||||||
| 								get_order($('.current.image')),  | 								$('.current.image').attr('id'),  | ||||||
| 								$('.current.ribbon')[direction]('.ribbon')) | 								$('.current.ribbon')[direction]('.ribbon')) | ||||||
| 
 | 
 | ||||||
| 			// last image in ribbon, merge...
 | 			// last image in ribbon, merge...
 | ||||||
| @ -2294,12 +2296,7 @@ ImageGrid.GROUP('Image manipulation', | |||||||
| 				'NOTE: this will only realign three ribbons.' | 				'NOTE: this will only realign three ribbons.' | ||||||
| 		},  | 		},  | ||||||
| 		function sortImages(){ | 		function sortImages(){ | ||||||
| 			/* XXX this is broken: need a good default... | 			ImageGrid.sortImagesVia(cmpImageOrder) | ||||||
| 			$('.ribbon').sortChildren(cmpImageOrder) |  | ||||||
| 			// compensate for offset cange...
 |  | ||||||
| 			updateRibbonImages($('.current.image').click()) |  | ||||||
| 			*/ |  | ||||||
| 			return ImageGrid.sortImagesByPath() |  | ||||||
| 		}), | 		}), | ||||||
| 	ImageGrid.ACTION({  | 	ImageGrid.ACTION({  | ||||||
| 			title: 'Reverse order of images', | 			title: 'Reverse order of images', | ||||||
| @ -2307,14 +2304,29 @@ ImageGrid.GROUP('Image manipulation', | |||||||
| 		},  | 		},  | ||||||
| 		function reverseImageOrder(){ | 		function reverseImageOrder(){ | ||||||
| 			// this is done by reversing their id attr
 | 			// this is done by reversing their id attr
 | ||||||
| 			ImageGrid.sortImagesVia(function(a, b){return cmpImagePaths(b, a)}) | 			ImageGrid.sortImagesVia(function(a, b){return cmpImageOrder(b, a)}) | ||||||
|  | 		}), | ||||||
|  | 	ImageGrid.ACTION({  | ||||||
|  | 			title: 'Sort images by ID', | ||||||
|  | 		},  | ||||||
|  | 		function sortImagesById(){ | ||||||
|  | 			getImageOrder = getImageId | ||||||
|  | 			ImageGrid.sortImages() | ||||||
|  | 		}), | ||||||
|  | 	ImageGrid.ACTION({  | ||||||
|  | 			title: 'Sort images by date', | ||||||
|  | 		},  | ||||||
|  | 		function sortImagesByDate(){ | ||||||
|  | 			getImageOrder = getImageDate | ||||||
|  | 			ImageGrid.sortImages() | ||||||
| 		}), | 		}), | ||||||
| 	ImageGrid.ACTION({  | 	ImageGrid.ACTION({  | ||||||
| 			title: 'Sort images by their full path', | 			title: 'Sort images by their full path', | ||||||
| 		},  | 		},  | ||||||
| 		// XXX this should use a normalized path...
 | 		// XXX this should use a normalized path...
 | ||||||
| 		function sortImagesByPath(){ | 		function sortImagesByPath(){ | ||||||
| 			ImageGrid.sortImagesVia(cmpImagePaths) | 			getImageOrder = getImagePath | ||||||
|  | 			ImageGrid.sortImages() | ||||||
| 		})) | 		})) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user