mirror of
				https://github.com/flynx/ImageGrid.git
				synced 2025-10-30 19:00:09 +00:00 
			
		
		
		
	some work on cropping, fixed several bugs in Data.updateData(..) and friends...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
		
							parent
							
								
									84953a947e
								
							
						
					
					
						commit
						2e43544625
					
				| @ -422,7 +422,7 @@ module.DataPrototype = { | |||||||
| 		// normalize the list to a sparse list of gids...
 | 		// normalize the list to a sparse list of gids...
 | ||||||
| 		list = list == null ?  | 		list = list == null ?  | ||||||
| 				this.ribbons[this.getRibbon(target)] | 				this.ribbons[this.getRibbon(target)] | ||||||
| 			: list.constructor.name == 'Array' ?  | 			: list.constructor === Array ?  | ||||||
| 				this.makeSparseImages(list) | 				this.makeSparseImages(list) | ||||||
| 			: this.ribbons[this.getRibbon(list)] | 			: this.ribbons[this.getRibbon(list)] | ||||||
| 
 | 
 | ||||||
| @ -1348,13 +1348,43 @@ module.DataPrototype = { | |||||||
| 	//
 | 	//
 | ||||||
| 	// XXX flatten as an option...
 | 	// XXX flatten as an option...
 | ||||||
| 	// XXX should this link to .root and .parent data???
 | 	// XXX should this link to .root and .parent data???
 | ||||||
| 	crop: function(list){ | 	crop: function(list, flatten){ | ||||||
| 		var crop = this.clone() | 		var crop = this.clone() | ||||||
| 		list = crop.makeSparseImages(list) | 		list = crop.makeSparseImages(list) | ||||||
| 		for(var k in crop.ribbons){ | 
 | ||||||
| 			crop.ribbons[k] = crop.makeSparseImages(crop.ribbons[k].filter(function(_, i){ | 		if(!flatten){ | ||||||
| 				return list[i] != null | 			// place images in ribbons...
 | ||||||
| 			})) | 			for(var k in crop.ribbons){ | ||||||
|  | 				crop.ribbons[k] = crop.makeSparseImages(crop.ribbons[k].filter(function(_, i){ | ||||||
|  | 					return list[i] != null | ||||||
|  | 				})) | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 		// flatten the crop...
 | ||||||
|  | 		} else { | ||||||
|  | 			crop.ribbons = {} | ||||||
|  | 			crop.ribbon_order = [] | ||||||
|  | 			crop.ribbons[crop.newRibbon()] = list | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		// clear empty ribbons...
 | ||||||
|  | 		Object.keys(crop.ribbons) | ||||||
|  | 			.forEach(function(k){  | ||||||
|  | 				if(crop.ribbons[k].length == 0){ | ||||||
|  | 					crop.ribbon_order.splice(crop.ribbon_order.indexOf(k), 1) | ||||||
|  | 					delete crop.ribbons[k] | ||||||
|  | 				}  | ||||||
|  | 			}) | ||||||
|  | 
 | ||||||
|  | 		// set the current image in the crop...
 | ||||||
|  | 		var r = this.getRibbon() | ||||||
|  | 		// if current ribbon is not empty get the closest image in it...
 | ||||||
|  | 		if(r in crop.ribbons && crop.ribbons[r].length > 0){ | ||||||
|  | 			crop.focusImage(this.current, 'after', this.getRibbon()) | ||||||
|  | 
 | ||||||
|  | 		// if ribbon got deleted, get the closest loaded image...
 | ||||||
|  | 		} else { | ||||||
|  | 			crop.focusImage(this.current, list) | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		// XXX ???
 | 		// XXX ???
 | ||||||
|  | |||||||
| @ -203,7 +203,6 @@ module.RibbonsPrototype = { | |||||||
| 				getComputedStyle(v).transition | 				getComputedStyle(v).transition | ||||||
| 		} | 		} | ||||||
| 	}, | 	}, | ||||||
| 
 |  | ||||||
| 	noTransitions: function(func){ | 	noTransitions: function(func){ | ||||||
| 		this.preventTransitions() | 		this.preventTransitions() | ||||||
| 		func.apply(this, args2array(arguments).slice(1)) | 		func.apply(this, args2array(arguments).slice(1)) | ||||||
| @ -966,14 +965,18 @@ module.RibbonsPrototype = { | |||||||
| 		})) | 		})) | ||||||
| 	}, | 	}, | ||||||
| 
 | 
 | ||||||
| 	// update a set of images in a ribbon...
 | 	// Update a set of images in a ribbon...
 | ||||||
| 	//
 | 	//
 | ||||||
| 	// This will reuse the images that already exist, thus if updating or
 | 	// This will reuse the images that already exist, thus if updating or
 | ||||||
| 	// adding images to an already loaded set this should be very fast.
 | 	// adding images to an already loaded set this should be very fast.
 | ||||||
| 	//
 | 	//
 | ||||||
| 	// NOTE: gids and ribbon must be .getImage(..) and .getRibbon(..) 
 | 	// NOTE: gids and ribbon must be .getImage(..) and .getRibbon(..) 
 | ||||||
| 	// 		compatible...
 | 	// 		compatible...
 | ||||||
|  | 	//
 | ||||||
|  | 	// XXX at this point this expects gids to be a list of gids, need 
 | ||||||
|  | 	// 		to make this compatible with jQuery collections...
 | ||||||
| 	updateRibbon: function(gids, ribbon){ | 	updateRibbon: function(gids, ribbon){ | ||||||
|  | 		var that = this | ||||||
| 		// get/create the ribbon...
 | 		// get/create the ribbon...
 | ||||||
| 		var r = this.getRibbon(ribbon) | 		var r = this.getRibbon(ribbon) | ||||||
| 		if(r.length == 0){ | 		if(r.length == 0){ | ||||||
| @ -982,24 +985,30 @@ module.RibbonsPrototype = { | |||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		var loaded = r.find('.image') | 		var loaded = r.find('.image') | ||||||
|  | 		 | ||||||
|  | 		// remove all images that we do not need...
 | ||||||
|  | 		loaded = loaded | ||||||
|  | 			.filter(function(i, img){  | ||||||
|  | 				// XXX .indexOf(..) will not work for a jQuery collection...
 | ||||||
|  | 				if(gids.indexOf(that.getElemGID($(img))) >= 0){ | ||||||
|  | 					return true | ||||||
|  | 				} | ||||||
|  | 				$(img).remove() | ||||||
|  | 				return false | ||||||
|  | 			}) | ||||||
| 
 | 
 | ||||||
| 		var that = this |  | ||||||
| 		$(gids).each(function(i, gid){ | 		$(gids).each(function(i, gid){ | ||||||
| 			// support for sparse ribbons...
 | 			// support for sparse ribbons...
 | ||||||
| 			if(gid == null){ | 			if(gid == null){ | ||||||
| 				return  | 				return  | ||||||
| 			} | 			} | ||||||
| 			// get/create image...
 | 			// get/create image...
 | ||||||
|  | 			// XXX this may affect other ribbons...
 | ||||||
| 			var img = that.getImage(gid) | 			var img = that.getImage(gid) | ||||||
| 			img = img.length == 0 ? that.createImage(gid) : img | 			img = img.length == 0 ? that.createImage(gid) : img | ||||||
| 
 | 
 | ||||||
| 			// clear a chunk of images that are not in gids until one that is...
 | 			// see of we are loaded in the right position...
 | ||||||
| 			var g = loaded.length > i ? that.getElemGID(loaded.eq(i)) : null | 			var g = loaded.length > i ? that.getElemGID(loaded.eq(i)) : null | ||||||
| 			while(g != null && gids.indexOf(g) < 0){ |  | ||||||
| 				that.clear(g) |  | ||||||
| 				loaded.splice(i, 1) |  | ||||||
| 				g = loaded.length > i ? that.getElemGID(loaded.eq(i)) : null |  | ||||||
| 			} |  | ||||||
| 
 | 
 | ||||||
| 			// check if we need to reattach the image...
 | 			// check if we need to reattach the image...
 | ||||||
| 			if(gid != g){ | 			if(gid != g){ | ||||||
| @ -1111,14 +1120,9 @@ module.RibbonsPrototype = { | |||||||
| 			// clear the ribbons that did not get updated...
 | 			// clear the ribbons that did not get updated...
 | ||||||
| 			if(!settings.keep_ribbons  | 			if(!settings.keep_ribbons  | ||||||
| 					&& (data.ribbon_order != null || data.ribbons != null)){ | 					&& (data.ribbon_order != null || data.ribbons != null)){ | ||||||
| 				var ribbons = [] | 				var ribbons = data.ribbon_order != null ? data.ribbon_order.slice()  | ||||||
| 				ribbons = data.ribbon_order != null  | 					: data.ribbons != null ? Object.keys(data.ribbons) | ||||||
| 					? ribbons.concat(Object.keys(data.ribbon_order))  | 					: [] | ||||||
| 					: ribbons |  | ||||||
| 				ribbons = data.ribbons != null  |  | ||||||
| 					? ribbons.concat(Object.keys(data.ribbons))  |  | ||||||
| 					: ribbons |  | ||||||
| 				ribbons.push(data.base) |  | ||||||
| 
 | 
 | ||||||
| 				that.viewer.find('.ribbon').each(function(){ | 				that.viewer.find('.ribbon').each(function(){ | ||||||
| 					var r = $(this) | 					var r = $(this) | ||||||
|  | |||||||
| @ -49,11 +49,14 @@ module.GLOBAL_KEYBOARD = { | |||||||
| 		pattern: '*', | 		pattern: '*', | ||||||
| 
 | 
 | ||||||
| 		F4: { | 		F4: { | ||||||
|  | 			alt: 'close', | ||||||
|  | 			/* | ||||||
| 			alt: doc('Close viewer',  | 			alt: doc('Close viewer',  | ||||||
| 				function(){  | 				function(){  | ||||||
| 					window.close()  | 					window.close()  | ||||||
| 					return false | 					return false | ||||||
| 				}), | 				}), | ||||||
|  | 			*/ | ||||||
| 		}, | 		}, | ||||||
| 		F5: doc('Full reload viewer',  | 		F5: doc('Full reload viewer',  | ||||||
| 			function(){  | 			function(){  | ||||||
| @ -66,25 +69,13 @@ module.GLOBAL_KEYBOARD = { | |||||||
| 				location.reload() | 				location.reload() | ||||||
| 				return false | 				return false | ||||||
| 			}), | 			}), | ||||||
| 		F12: doc('Show devTools',  | 		F12: 'showDevTools', | ||||||
| 			function(){  |  | ||||||
| 				if(window.showDevTools != null){ |  | ||||||
| 					showDevTools()  |  | ||||||
| 					return false |  | ||||||
| 
 |  | ||||||
| 				// if no showDevTools defined pass the button further...
 |  | ||||||
| 				} else { |  | ||||||
| 					return true |  | ||||||
| 				} |  | ||||||
| 			}), |  | ||||||
| 		// NOTE: these are for systems where F** keys are not available 
 | 		// NOTE: these are for systems where F** keys are not available 
 | ||||||
| 		// 		or do other stuff...
 | 		// 		or do other stuff...
 | ||||||
| 		R: { | 		R: { | ||||||
| 			'ctrl+alt': 'reload!', | 			default: 'reverseImages!', | ||||||
|  | 			ctrl: 'reload!', | ||||||
| 			'ctrl+shift': 'F5', | 			'ctrl+shift': 'F5', | ||||||
| 
 |  | ||||||
| 			// XXX testing...
 |  | ||||||
| 			ctrl: 'reverseImages!', |  | ||||||
| 		}, | 		}, | ||||||
| 		P: { | 		P: { | ||||||
| 			'ctrl+shift': 'F12', | 			'ctrl+shift': 'F12', | ||||||
|  | |||||||
| @ -350,33 +350,46 @@ actions.Actions({ | |||||||
| 
 | 
 | ||||||
| 	// crop...
 | 	// crop...
 | ||||||
| 	//
 | 	//
 | ||||||
| 	// XXX
 |  | ||||||
| 	crop: [  | 	crop: [  | ||||||
| 		function(list){  | 		function(list, flatten){  | ||||||
|  | 			list = list || this.data.order | ||||||
| 			if(this.crop_stack == null){ | 			if(this.crop_stack == null){ | ||||||
| 				this.crop_stack = [] | 				this.crop_stack = [] | ||||||
| 			} | 			} | ||||||
| 
 |  | ||||||
| 			this.crop_stack.push(this.data) | 			this.crop_stack.push(this.data) | ||||||
| 			this.data = this.data.crop(list) | 			this.data = this.data.crop(list, flatten) | ||||||
| 
 |  | ||||||
| 			this.focusImage() |  | ||||||
| 		}], | 		}], | ||||||
| 	// XXX add level...
 | 	uncrop: ['Uncrop ribbons', | ||||||
| 	uncrop: ['', | 		function(level, restore_current){ | ||||||
| 		function(){ | 			level = level || 1 | ||||||
|  | 
 | ||||||
|  | 			var cur = this.current | ||||||
|  | 
 | ||||||
| 			if(this.crop_stack == null){ | 			if(this.crop_stack == null){ | ||||||
| 				return | 				return | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			this.data = this.crop_stack.pop() | 			// uncrop all...
 | ||||||
|  | 			if(level == 'all'){ | ||||||
|  | 				this.data = this.crop_stack[0] | ||||||
|  | 				this.crop_stack = [] | ||||||
| 
 | 
 | ||||||
| 			if(this.crop_stack.length == 0){ | 			// get the element at level and drop the tail...
 | ||||||
| 				delete this.crop_stac | 			} else { | ||||||
|  | 				this.data = this.crop_stack.splice(-level, this.crop_stack.length)[0] | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			this.focusImage() | 			// by default set the current from the crop...
 | ||||||
|  | 			if(!restore_current){ | ||||||
|  | 				this.data.focusImage(cur) | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			if(this.crop_stack.length == 0){ | ||||||
|  | 				delete this.crop_stack | ||||||
|  | 			} | ||||||
| 		}], | 		}], | ||||||
|  | 	uncropAll: ['', | ||||||
|  | 		function(restore_current){ this.uncrop('all', restore_current) }], | ||||||
| 	// XXX same as uncrop but will also try and merge changes...
 | 	// XXX same as uncrop but will also try and merge changes...
 | ||||||
| 	mergeCrop: ['', | 	mergeCrop: ['', | ||||||
| 		function(){ | 		function(){ | ||||||
| @ -427,22 +440,27 @@ actions.Actions(Client, { | |||||||
| 		}], | 		}], | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | 	// XXX move this to a viewer window action set
 | ||||||
| 	close: ['Cloase viewer', | 	close: ['Cloase viewer', | ||||||
| 		function(){ | 		function(){ | ||||||
| 			// XXX should we do anything else here like auto-save???
 | 			// XXX should we do anything else here like auto-save???
 | ||||||
| 			window.close()  | 			window.close()  | ||||||
| 		}], | 		}], | ||||||
|  | 	// XXX where should toggleFullscreenMode(..) be defined...
 | ||||||
| 	toggleFullScreen: ['', | 	toggleFullScreen: ['', | ||||||
| 		function(){ | 		function(){ | ||||||
| 			// XXX
 | 			toggleFullscreenMode()  | ||||||
| 		}], | 		}], | ||||||
| 	toggleSingleImage: ['', | 	toggleSingleImage: ['', | ||||||
| 		function(){ | 		function(){ | ||||||
| 			// XXX
 | 			// XXX
 | ||||||
| 		}], | 		}], | ||||||
|  | 	// XXX revise this...
 | ||||||
| 	showDevTools: ['', | 	showDevTools: ['', | ||||||
| 		function(){ | 		function(){ | ||||||
| 			// XXX
 | 			if(window.showDevTools != null){ | ||||||
|  | 				showDevTools()  | ||||||
|  | 			} | ||||||
| 		}], | 		}], | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| @ -641,6 +659,30 @@ actions.Actions(Client, { | |||||||
| 
 | 
 | ||||||
| 	crop: [ reloadAfter() ], | 	crop: [ reloadAfter() ], | ||||||
| 	uncrop: [ reloadAfter() ], | 	uncrop: [ reloadAfter() ], | ||||||
|  | 
 | ||||||
|  | 	// XXX need flat version of these...
 | ||||||
|  | 	cropRibbon: ['Crop current ribbon', | ||||||
|  | 		function(ribbon, flatten){ | ||||||
|  | 			ribbon = ribbon || 'current' | ||||||
|  | 			this.crop(this.data.getImages(ribbon), flatten) | ||||||
|  | 		}], | ||||||
|  | 	cropRibbonAndAbove: ['', | ||||||
|  | 		function(ribbon, flatten){ | ||||||
|  | 			ribbon = ribbon || this.data.getRibbon() | ||||||
|  | 
 | ||||||
|  | 			var data = this.data | ||||||
|  | 			var that = this | ||||||
|  | 
 | ||||||
|  | 			var i = data.ribbon_order.indexOf(ribbon) | ||||||
|  | 			var ribbons = data.ribbon_order.slice(0, i) | ||||||
|  | 			var images = ribbons | ||||||
|  | 				.reduce(function(a, b){  | ||||||
|  | 						return data.getImages(a).concat(data.getImages(b))  | ||||||
|  | 					}, data.getImages(ribbon)) | ||||||
|  | 				.compact() | ||||||
|  | 
 | ||||||
|  | 			this.crop(data.getImages(images), flatten) | ||||||
|  | 		}], | ||||||
| }) | }) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| @ -678,6 +720,7 @@ module.Animation = { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | // XXX
 | ||||||
| var CurrentIndicator =  | var CurrentIndicator =  | ||||||
| module.CurrentIndicator = { | module.CurrentIndicator = { | ||||||
| 	tag: 'ui-current-indicator', | 	tag: 'ui-current-indicator', | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user