mirror of
				https://github.com/flynx/ImageGrid.git
				synced 2025-10-31 03:10:07 +00:00 
			
		
		
		
	more cleanup, tweaking and experimenting...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
		
							parent
							
								
									626001b90b
								
							
						
					
					
						commit
						3e9774742b
					
				| @ -64,9 +64,13 @@ core.ImageGridFeatures.Feature('viewer-testing', [ | |||||||
| 
 | 
 | ||||||
| 	'ui-single-image', | 	'ui-single-image', | ||||||
| 	//'ui-partial-ribbons',
 | 	//'ui-partial-ribbons',
 | ||||||
| 	// XXX this still has problems...
 | 	'ui-partial-ribbons-2', | ||||||
| 	//'ui-partial-ribbons-2',
 | 	// XXX EXPERIMENTAL...
 | ||||||
| 	'ui-partial-ribbons-vdom', | 	'ui-partial-ribbons-vdom', | ||||||
|  | 		'-ui-partial-ribbons-2', | ||||||
|  | 		// XXX this conflicts with ui-partial-ribbons-vdom...
 | ||||||
|  | 		'-ui-current-image-indicator', | ||||||
|  | 		//*/
 | ||||||
| 
 | 
 | ||||||
| 	'marks', | 	'marks', | ||||||
| 	'ui-range', | 	'ui-range', | ||||||
| @ -93,6 +97,7 @@ core.ImageGridFeatures.Feature('viewer-testing', [ | |||||||
| 		// NOTE: only one of these can be set...
 | 		// NOTE: only one of these can be set...
 | ||||||
| 		'ui-current-image-indicator-hide-on-fast-screen-nav', | 		'ui-current-image-indicator-hide-on-fast-screen-nav', | ||||||
| 		//'ui-current-image-indicator-hide-on-screen-nav',
 | 		//'ui-current-image-indicator-hide-on-screen-nav',
 | ||||||
|  | 	//*/
 | ||||||
| 	//'ui-base-ribbon-indicator',
 | 	//'ui-base-ribbon-indicator',
 | ||||||
| 	'ui-passive-base-ribbon-indicator', | 	'ui-passive-base-ribbon-indicator', | ||||||
| 	'ui-status-bar', | 	'ui-status-bar', | ||||||
|  | |||||||
| @ -77,6 +77,7 @@ var VirtualDOMRibbonsPrototype = { | |||||||
| 	// 		scale: <scale>,
 | 	// 		scale: <scale>,
 | ||||||
| 	//
 | 	//
 | ||||||
| 	// 		top: <offset>,
 | 	// 		top: <offset>,
 | ||||||
|  | 	//
 | ||||||
| 	// 		ribbons: {
 | 	// 		ribbons: {
 | ||||||
| 	// 			<gid>: <offset>,
 | 	// 			<gid>: <offset>,
 | ||||||
| 	// 			...
 | 	// 			...
 | ||||||
| @ -85,6 +86,7 @@ var VirtualDOMRibbonsPrototype = { | |||||||
| 	state: null, | 	state: null, | ||||||
| 
 | 
 | ||||||
| 	// constructors...
 | 	// constructors...
 | ||||||
|  | 	// XXX calculate top...
 | ||||||
| 	makeView: function(state){ | 	makeView: function(state){ | ||||||
| 		state = state || {} | 		state = state || {} | ||||||
| 		var that = this | 		var that = this | ||||||
| @ -99,6 +101,7 @@ var VirtualDOMRibbonsPrototype = { | |||||||
| 			|| ig.scale | 			|| ig.scale | ||||||
| 		var top = state.top = state.top  | 		var top = state.top = state.top  | ||||||
| 			|| this.state.top  | 			|| this.state.top  | ||||||
|  | 			// XXX do a real calculation...
 | ||||||
| 			|| ig.ribbons.getRibbonLocator().transform('y')  | 			|| ig.ribbons.getRibbonLocator().transform('y')  | ||||||
| 
 | 
 | ||||||
| 		var data = ig.data | 		var data = ig.data | ||||||
| @ -109,13 +112,13 @@ var VirtualDOMRibbonsPrototype = { | |||||||
| 				return that.makeRibbon(gid, count, state) }) | 				return that.makeRibbon(gid, count, state) }) | ||||||
| 
 | 
 | ||||||
| 		return vdom.h('div.ribbon-set', { | 		return vdom.h('div.ribbon-set', { | ||||||
| 			key: 'ribbon-set', | 			//key: 'ribbon-set',
 | ||||||
| 			style: { | 			style: { | ||||||
| 				transform: 'scale('+ s +', '+ s +')', | 				transform: 'scale('+ s +', '+ s +')', | ||||||
| 			} | 			} | ||||||
| 		}, [ | 		}, [ | ||||||
| 			vdom.h('div.ribbon-locator', { | 			vdom.h('div.ribbon-locator', { | ||||||
| 				key: 'ribbon-locator', | 				//key: 'ribbon-locator',
 | ||||||
| 				style: { | 				style: { | ||||||
| 					// XXX should this be in vh???
 | 					// XXX should this be in vh???
 | ||||||
| 					transform: 'translate3d(0px, '+ top +'px, 0px)', | 					transform: 'translate3d(0px, '+ top +'px, 0px)', | ||||||
| @ -126,6 +129,7 @@ var VirtualDOMRibbonsPrototype = { | |||||||
| 	}, | 	}, | ||||||
| 	// XXX setup handlers (???)
 | 	// XXX setup handlers (???)
 | ||||||
| 	// XXX current image marker (???)
 | 	// XXX current image marker (???)
 | ||||||
|  | 	// XXX STUB: make aligning more extensible... (???)
 | ||||||
| 	makeRibbon: function(gid, count, state){ | 	makeRibbon: function(gid, count, state){ | ||||||
| 		state = state || {} | 		state = state || {} | ||||||
| 		var that = this | 		var that = this | ||||||
| @ -143,14 +147,19 @@ var VirtualDOMRibbonsPrototype = { | |||||||
| 		var imgs = [] | 		var imgs = [] | ||||||
| 
 | 
 | ||||||
| 		this.state = this.state || {} | 		this.state = this.state || {} | ||||||
| 		this.state.ribbons = this.state.ribbons || {} | 		//this.state.ribbons = this.state.ribbons || {}
 | ||||||
|  | 		 | ||||||
|  | 		// XXX
 | ||||||
|  | 		var size = this.state.tile_size =  | ||||||
|  | 			this.state.tile_size  | ||||||
|  | 				|| ig.ribbons.getVisibleImageSize('max') | ||||||
| 
 | 
 | ||||||
| 		// build the images...
 | 		// build the images...
 | ||||||
| 		var gids = data.getImages(gid, count, 'total') | 		var gids = data.getImages(gid, count, 'total') | ||||||
| 		gids | 		gids | ||||||
| 			.forEach(function(gid){ | 			.forEach(function(gid){ | ||||||
| 				// image...
 | 				// image...
 | ||||||
| 				imgs.push(that.makeImage(gid)) | 				imgs.push(that.makeImage(gid, size)) | ||||||
| 
 | 
 | ||||||
| 				// marks...
 | 				// marks...
 | ||||||
| 				that.makeImageMarks(gid) | 				that.makeImageMarks(gid) | ||||||
| @ -168,14 +177,10 @@ var VirtualDOMRibbonsPrototype = { | |||||||
| 			: 0 | 			: 0 | ||||||
| 		ref = ref || data.getImage(current, 'after', gids) | 		ref = ref || data.getImage(current, 'after', gids) | ||||||
| 		var l = gids.indexOf(ref) | 		var l = gids.indexOf(ref) | ||||||
| 		var x = //this.state.ribbons[gid] = 
 | 		var x = (-(l * size) - offset) | ||||||
| 			(state.ribbons && state.ribbons[gid]) |  | ||||||
| 				|| this.state.ribbons[gid] |  | ||||||
| 				//|| parseFloat(ig.ribbons.getRibbon(gid).transform('x'))
 |  | ||||||
| 				|| (-(l * size) - offset) |  | ||||||
| 
 | 
 | ||||||
| 		return vdom.h('div.ribbon'+base, { | 		return vdom.h('div.ribbon'+base, { | ||||||
| 			key: 'ribbon-'+gid, | 			//key: 'ribbon-'+gid,
 | ||||||
| 
 | 
 | ||||||
| 			// XXX events, hammer, ...???
 | 			// XXX events, hammer, ...???
 | ||||||
| 
 | 
 | ||||||
| @ -191,9 +196,11 @@ var VirtualDOMRibbonsPrototype = { | |||||||
| 	}, | 	}, | ||||||
| 	// XXX setup image handlers...
 | 	// XXX setup image handlers...
 | ||||||
| 	// 		...or move them up to viewer or some other spot (viewer?)...
 | 	// 		...or move them up to viewer or some other spot (viewer?)...
 | ||||||
|  | 	// XXX update image previews...
 | ||||||
| 	makeImage: function(gid, size){ | 	makeImage: function(gid, size){ | ||||||
| 		var ig = this.imagegrid | 		var ig = this.imagegrid | ||||||
| 		size = this.state.tile_size = size  | 		//size = this.state.tile_size = size 
 | ||||||
|  | 		size = size  | ||||||
| 			|| this.state.tile_size | 			|| this.state.tile_size | ||||||
| 			|| ig.ribbons.getVisibleImageSize('max') | 			|| ig.ribbons.getVisibleImageSize('max') | ||||||
| 		var data = this.imagegrid.data | 		var data = this.imagegrid.data | ||||||
| @ -216,7 +223,7 @@ var VirtualDOMRibbonsPrototype = { | |||||||
| 		var url = ig.images.getBestPreview(gid, size, image, true).url | 		var url = ig.images.getBestPreview(gid, size, image, true).url | ||||||
| 
 | 
 | ||||||
| 		return vdom.h('div.image'+current, { | 		return vdom.h('div.image'+current, { | ||||||
| 			key: 'image-'+gid, | 			//key: 'image-'+gid,
 | ||||||
| 
 | 
 | ||||||
| 			attributes: { | 			attributes: { | ||||||
| 				gid: JSON.stringify(gid) | 				gid: JSON.stringify(gid) | ||||||
| @ -250,7 +257,7 @@ var VirtualDOMRibbonsPrototype = { | |||||||
| 	}, | 	}, | ||||||
| 	makeImageMark: function(gid, type){ | 	makeImageMark: function(gid, type){ | ||||||
| 		return vdom.h('div.mark.'+(type || ''), { | 		return vdom.h('div.mark.'+(type || ''), { | ||||||
| 			key: 'mark-'+type+'-'+gid, | 			//key: 'mark-'+type+'-'+gid,
 | ||||||
| 			attributes: { | 			attributes: { | ||||||
| 				gid: JSON.stringify(gid) | 				gid: JSON.stringify(gid) | ||||||
| 					.replace(/^"(.*)"$/g, '$1'), | 					.replace(/^"(.*)"$/g, '$1'), | ||||||
| @ -260,30 +267,51 @@ var VirtualDOMRibbonsPrototype = { | |||||||
| 
 | 
 | ||||||
| 	// XXX add ability to hook in things like current image marker...
 | 	// XXX add ability to hook in things like current image marker...
 | ||||||
| 	 | 	 | ||||||
|  | 	clear: function(){ | ||||||
|  | 		delete this.state | ||||||
|  | 		delete this.dom | ||||||
|  | 		delete this.vdom | ||||||
|  | 		return this | ||||||
|  | 	}, | ||||||
|  | 
 | ||||||
| 	// NOTE: virtual-dom architecture is designed around a fast-render-on-demand
 | 	// NOTE: virtual-dom architecture is designed around a fast-render-on-demand
 | ||||||
| 	// 		concept, so we build the state on demand...
 | 	// 		concept, so we build the state on demand...
 | ||||||
| 	sync: function(){ | 	sync: function(target, size){ | ||||||
| 		var dom = this.dom = this.dom  | 		var dom = this.dom = this.dom  | ||||||
| 			// get/create the ribbon-set...
 | 			// get/create the ribbon-set...
 | ||||||
| 			|| this.imagegrid.ribbons.getRibbonSet(true) | 			|| this.imagegrid.ribbons.getRibbonSet(true) | ||||||
|  | 		var state = this.state ? Object.create(this.state) : {} | ||||||
|  | 		target && (state.target = target) | ||||||
|  | 		size && (state.count = size) | ||||||
| 
 | 
 | ||||||
| 		// build initial state...
 | 		// build initial state...
 | ||||||
| 		if(this.vdom == null){ | 		if(this.vdom == null){ | ||||||
| 			var n = this.vdom = this.makeView(this.state || {}) | 			var n = this.vdom = this.makeView(state) | ||||||
| 			var v = vdom.create(n) | 			var v = vdom.create(n) | ||||||
| 			dom.replaceWith(v) | 			dom.replaceWith(v) | ||||||
| 			this.dom = v | 			this.dom = v | ||||||
| 
 | 
 | ||||||
| 		// patch state...
 | 		// patch state...
 | ||||||
| 		} else { | 		} else { | ||||||
| 			var n = this.makeView(this.state || {}) | 			var n = this.makeView(state) | ||||||
| 			vdom.patch(dom, vdom.diff(this.vdom, n)) | 			var diff = vdom.diff(this.vdom, n) | ||||||
|  | 			vdom.patch(dom, diff) | ||||||
| 			this.vdom = n | 			this.vdom = n | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		return this | 		return this | ||||||
| 	}, | 	}, | ||||||
|  | 	// XXX should this do a full or partial .clear()???
 | ||||||
|  | 	reset: function(){ | ||||||
|  | 		delete this.dom | ||||||
|  | 		delete this.vdom | ||||||
|  | 		if(this.state){  | ||||||
|  | 			delete this.state.tile_size  | ||||||
|  | 		} | ||||||
| 
 | 
 | ||||||
|  | 		return this | ||||||
|  | 			.sync() | ||||||
|  | 	}, | ||||||
| 
 | 
 | ||||||
| 	__init__: function(imagegrid){ | 	__init__: function(imagegrid){ | ||||||
| 		this.imagegrid = imagegrid | 		this.imagegrid = imagegrid | ||||||
| @ -330,13 +358,6 @@ var PartialRibbonsActions = actions.Actions({ | |||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 	// XXX
 | 	// XXX
 | ||||||
| 	centerImage: [ |  | ||||||
| 		function(target, align, offset, scale){ |  | ||||||
| 		}], |  | ||||||
| 	centerRibbon: [ |  | ||||||
| 		function(target){ |  | ||||||
| 		}], |  | ||||||
| 
 |  | ||||||
| 	updateRibbon: ['- Interface/Update partial ribbon size',  | 	updateRibbon: ['- Interface/Update partial ribbon size',  | ||||||
| 		function(target, w, size, threshold){ | 		function(target, w, size, threshold){ | ||||||
| 			target = target instanceof jQuery  | 			target = target instanceof jQuery  | ||||||
| @ -350,104 +371,15 @@ var PartialRibbonsActions = actions.Actions({ | |||||||
| 			size = (size  | 			size = (size  | ||||||
| 				|| this.config['ribbon-size-screens']  | 				|| this.config['ribbon-size-screens']  | ||||||
| 				|| 9) * w | 				|| 9) * w | ||||||
| 			threshold = threshold == 0 ? threshold |  | ||||||
| 				: (threshold  |  | ||||||
| 					|| this.config['ribbon-resize-threshold']  |  | ||||||
| 					|| 2) |  | ||||||
| 			var update_threshold = (this.config['ribbon-update-threshold'] || 2)  * w |  | ||||||
| 			var data = this.data |  | ||||||
| 			var ribbons = this.ribbons |  | ||||||
| 
 | 
 | ||||||
| 			var t = Date.now() | 			size = 5 | ||||||
| 			this.__last_ribbon_update = this.__last_ribbon_update || t |  | ||||||
| 			var timeout = this.config['ribbons-in-place-update-timeout'] |  | ||||||
| 			var	update_timeout = this.config['ribbon-update-timeout'] |  | ||||||
| 
 | 
 | ||||||
| 			// localize transition prevention... 
 | 			// XXX add threshold test -- we do not need this on every action...
 | ||||||
| 			// NOTE: we can't get ribbon via target directly here as
 | 			// XXX this messes up align when exiting single image view...
 | ||||||
| 			// 		the target might not be loaded...
 | 			// XXX this does not work out of the box...
 | ||||||
| 			var r_gid = data.getRibbon(target) |  | ||||||
| 			if(r_gid == null){ |  | ||||||
| 				return |  | ||||||
| 			} |  | ||||||
| 			// NOTE: for the initial load this may be empty...
 |  | ||||||
| 			var r = ribbons.getRibbon(r_gid) |  | ||||||
| 
 |  | ||||||
| 			// next/prev loaded... 
 |  | ||||||
| 			var img = this.ribbons.getImage(target) |  | ||||||
| 			var nl = img.nextAll('.image:not(.clone)').length |  | ||||||
| 			var pl = img.prevAll('.image:not(.clone)').length |  | ||||||
| 			var loaded = nl + pl + 1 |  | ||||||
| 
 |  | ||||||
| 			// next/prev available...
 |  | ||||||
| 			// NOTE: we do not include target in counts...
 |  | ||||||
| 			var gids = this.data.getImages(target, size, 'total') |  | ||||||
| 			var na = gids.slice(gids.indexOf(target)+1).length |  | ||||||
| 			var pa = gids.slice(0, gids.indexOf(target)).length |  | ||||||
| 
 |  | ||||||
| 			// full resize...
 |  | ||||||
| 			if(threshold == 0 |  | ||||||
| 					// ribbon not loaded...
 |  | ||||||
| 					|| img.length == 0 |  | ||||||
| 					// ribbon shorter than we expect...
 |  | ||||||
| 					|| (loaded < size && na + pa > loaded) |  | ||||||
| 					// ribbon too long...
 |  | ||||||
| 					|| loaded > size * threshold |  | ||||||
| 					// passed hard threshold -- too close to edge...
 |  | ||||||
| 					|| (nl < w && na > nl) || (pl < w && pa > pl)){ |  | ||||||
| 				//console.log('RESIZE (sync)')
 |  | ||||||
| 				this.resizeRibbon(target, size) |  | ||||||
| 
 |  | ||||||
| 			// more complex cases...
 |  | ||||||
| 			// passed threshold on the right...
 |  | ||||||
| 			} else if((nl < update_threshold && na > nl)  |  | ||||||
| 					// passed threshold on the left...
 |  | ||||||
| 					|| (pl < update_threshold && pa > pl)  |  | ||||||
| 					// loaded more than we need by threshold...
 |  | ||||||
| 					|| nl + pl + 1 > size + update_threshold){ |  | ||||||
| 				// resize...
 |  | ||||||
| 				if(this.config['ribbons-in-place-update-mode'] == 'resize' |  | ||||||
| 						// no ribbon loaded...
 |  | ||||||
| 						|| r.length == 0  |  | ||||||
| 						// only if we are going slow...
 |  | ||||||
| 						|| (timeout != null  |  | ||||||
| 							&& (t - this.__last_ribbon_update > timeout)) |  | ||||||
| 						// full screen...
 |  | ||||||
| 						|| (this.toggleSingleImage  |  | ||||||
| 							&& this.toggleSingleImage('?') == 'on')){ |  | ||||||
| 			return function(){ | 			return function(){ | ||||||
| 						var that = this | 				this.virtualdom.sync(target, size) | ||||||
| 						// sync update...
 |  | ||||||
| 						if(update_timeout == null){ |  | ||||||
| 							//console.log('RESIZE (post)', t-this.__last_ribbon_update)
 |  | ||||||
| 							this.resizeRibbon(target, size) |  | ||||||
| 
 |  | ||||||
| 						// async update...
 |  | ||||||
| 						} else { |  | ||||||
| 							this.__update_timeout |  | ||||||
| 								&& clearTimeout(this.__update_timeout) |  | ||||||
| 							this.__update_timeout = setTimeout(function(){  |  | ||||||
| 								//console.log('RESIZE (timeout)', t-this.__last_ribbon_update)
 |  | ||||||
| 								delete that.__update_timeout |  | ||||||
| 								that.resizeRibbon(target, size)  |  | ||||||
| 							}, update_timeout) |  | ||||||
| 			} | 			} | ||||||
| 					} |  | ||||||
| 
 |  | ||||||
| 				// in-place update...
 |  | ||||||
| 				} else { |  | ||||||
| 					//console.log('UPDATE', t - this.__last_ribbon_update)
 |  | ||||||
| 					var c = gids.indexOf(data.getImage('current', r_gid)) |  | ||||||
| 					var t = gids.indexOf(target) |  | ||||||
| 
 |  | ||||||
| 					ribbons |  | ||||||
| 						.preventTransitions(r) |  | ||||||
| 						.updateRibbonInPlace(gids, r_gid, target) |  | ||||||
| 						.restoreTransitions(r, true) |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 			this.__last_ribbon_update = t  |  | ||||||
| 		}], | 		}], | ||||||
| }) | }) | ||||||
| 
 | 
 | ||||||
| @ -472,8 +404,14 @@ module.PartialRibbons = core.ImageGridFeatures.Feature({ | |||||||
| 	handlers: [ | 	handlers: [ | ||||||
| 		['start', | 		['start', | ||||||
| 			function(){ | 			function(){ | ||||||
| 				console.warn( | 				console.warn('EXPERIMENTAL: ' | ||||||
| 					'EXPERIMENTAL: starting virtual-dom version of partial ribbons...') }], | 					+'starting virtual-dom version of partial ribbons...') }], | ||||||
|  | 
 | ||||||
|  | 		['clear', | ||||||
|  | 			function(){ this.virtualdom.clear() }], | ||||||
|  | 		['fitImage', | ||||||
|  | 			function(){ delete this.virtualdom.state.tile_size }], | ||||||
|  | 
 | ||||||
| 		['focusImage.pre centerImage.pre',  | 		['focusImage.pre centerImage.pre',  | ||||||
| 			function(target, list){ | 			function(target, list){ | ||||||
| 				// NOTE: we have to do this as we are called BEFORE the 
 | 				// NOTE: we have to do this as we are called BEFORE the 
 | ||||||
| @ -483,36 +421,6 @@ module.PartialRibbons = core.ImageGridFeatures.Feature({ | |||||||
| 
 | 
 | ||||||
| 				this.updateRibbon(target) | 				this.updateRibbon(target) | ||||||
| 			}], | 			}], | ||||||
| 		['resizing.post', |  | ||||||
| 			function(_, unit, size){ |  | ||||||
| 				// keep constant size in single image...
 |  | ||||||
| 				if(this.toggleSingleImage && this.toggleSingleImage('?') == 'on'){ |  | ||||||
| 					this.updateRibbon( |  | ||||||
| 						'current',  |  | ||||||
| 						this.config['ribbons-resize-single-image'] || 13) |  | ||||||
| 
 |  | ||||||
| 				} else if(unit == 'scale'){ |  | ||||||
| 					this.updateRibbon('current', this.screenwidth / size || 1) |  | ||||||
| 
 |  | ||||||
| 				} else if(unit == 'screenwidth'){ |  | ||||||
| 					this.updateRibbon('current', size || 1) |  | ||||||
| 
 |  | ||||||
| 				} else if(unit == 'screenheight'){ |  | ||||||
| 					size = size || 1 |  | ||||||
| 
 |  | ||||||
| 					// convert target height in ribbons to width in images...
 |  | ||||||
| 					// NOTE: this does not account for compensation that 
 |  | ||||||
| 					// 		.updateRibbon(..) makes for fitting whole image
 |  | ||||||
| 					// 		counts, this is a small enough error so as not
 |  | ||||||
| 					// 		to waste time on...
 |  | ||||||
| 					var s = this.ribbons.scale() |  | ||||||
| 					var h = this.ribbons.getScreenHeightRibbons() |  | ||||||
| 					var w = this.ribbons.getScreenWidthImages() |  | ||||||
| 					var nw = w / (h/size) |  | ||||||
| 
 |  | ||||||
| 					this.updateRibbon('current', nw) |  | ||||||
| 				} |  | ||||||
| 			}], |  | ||||||
| 	], | 	], | ||||||
| }) | }) | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user