mirror of
				https://github.com/flynx/ImageGrid.git
				synced 2025-10-31 11:20:09 +00:00 
			
		
		
		
	refactoring ribbons.js -- temporary abstraction layer, not yet sure about it + worked around a REALLY ODD bug (see util.js @385)...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
		
							parent
							
								
									c68d47c3c8
								
							
						
					
					
						commit
						2c7d34732a
					
				| @ -529,9 +529,9 @@ function setElementOriginSync(elem, x, y, z){ | |||||||
| // this is like setElementOrigin(..) but will compensate for element 
 | // this is like setElementOrigin(..) but will compensate for element 
 | ||||||
| // shift when scaled...
 | // shift when scaled...
 | ||||||
| // NOTE: this will work only of translate is used for positioning...
 | // NOTE: this will work only of translate is used for positioning...
 | ||||||
| function shiftOriginTo(elem, l, t){ | function shiftOriginTo(elem, l, t, scale){ | ||||||
| 	var o = getElementOrigin(elem) | 	var o = getElementOrigin(elem) | ||||||
| 	var scale = getElementScale(elem) | 	var scale = scale || getElementScale(elem) | ||||||
| 	var offset = getElementOffset(elem) | 	var offset = getElementOffset(elem) | ||||||
| 
 | 
 | ||||||
| 	// calculate the offset change and compensate...
 | 	// calculate the offset change and compensate...
 | ||||||
|  | |||||||
| @ -347,6 +347,14 @@ var transformEditor = function(){ | |||||||
| 
 | 
 | ||||||
| 			var aliases = Object.keys(spec) | 			var aliases = Object.keys(spec) | ||||||
| 
 | 
 | ||||||
|  | 			var r = reduce == 'sum' ? function(a, b){ return a + b } | ||||||
|  | 				: reduce == 'mul' ? function(a, b){ return a * b } | ||||||
|  | 				: reduce == 'last' ? function(a, b){ return b != null ? b : a } | ||||||
|  | 				: reduce | ||||||
|  | 			var n = reduce == 'sum' ? 0 | ||||||
|  | 				: reduce == 'mul' ? 1 | ||||||
|  | 				: 0 | ||||||
|  | 
 | ||||||
| 			return aliases.map(function(k, j){ | 			return aliases.map(function(k, j){ | ||||||
| 					var i = spec[k] | 					var i = spec[k] | ||||||
| 
 | 
 | ||||||
| @ -373,10 +381,21 @@ var transformEditor = function(){ | |||||||
| 					return res != null ? res[i] : res | 					return res != null ? res[i] : res | ||||||
| 				}) | 				}) | ||||||
| 				.filter(function(e){ return e != null }) | 				.filter(function(e){ return e != null }) | ||||||
|  | 				.reduce(r, n) | ||||||
|  | 				// XXX for some magical reason this breaks if...
 | ||||||
|  | 				// 		t = transformEditor($('.ribbon-set'))
 | ||||||
|  | 				// 		t.x()	// works ok
 | ||||||
|  | 				// 		var x = t.data
 | ||||||
|  | 				// 		t.x()	// now this breaks because reduce is 0...
 | ||||||
|  | 				 /* | ||||||
| 				.reduce(reduce == 'sum' ? function(a, b){ return a + b } | 				.reduce(reduce == 'sum' ? function(a, b){ return a + b } | ||||||
| 						: reduce == 'mul' ? function(a, b){ return a * b } | 						: reduce == 'mul' ? function(a, b){ return a * b } | ||||||
| 						: reduce == 'last' ? function(a, b){ return b != null ? b : a } | 						: reduce == 'last' ? function(a, b){ return b != null ? b : a } | ||||||
| 					: reduce) | 						: reduce, | ||||||
|  | 					reduce == 'mul' ? 1 | ||||||
|  | 						: reduce = 'sum'? 0 | ||||||
|  | 						: 0) | ||||||
|  | 				 */ | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		// setup the aliases...
 | 		// setup the aliases...
 | ||||||
| @ -471,8 +490,8 @@ var transformEditor = function(){ | |||||||
| 	func('skew', ['', ''], 0) | 	func('skew', ['', ''], 0) | ||||||
| 	func('skewX', [''], 0) | 	func('skewX', [''], 0) | ||||||
| 	func('skewY', [''], 0) | 	func('skewY', [''], 0) | ||||||
| 	alias({skewX: 0, skew: 0}) | 	alias({skewX: 0, skew: 0}, 'sum') | ||||||
| 	alias({skewY: 0, skew: 1}) | 	alias({skewY: 0, skew: 1}, 'sum') | ||||||
| 
 | 
 | ||||||
| 	func('perspective') | 	func('perspective') | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -62,45 +62,154 @@ var RIBBON = '.ribbon:not(.clone)' | |||||||
| //
 | //
 | ||||||
| // XXX need to replace soemlegacy CSS API and make this compatible with
 | // XXX need to replace soemlegacy CSS API and make this compatible with
 | ||||||
| // 		modern libs like velocity.js...
 | // 		modern libs like velocity.js...
 | ||||||
| if(false){ // XXX still problems with translate...
 |  | ||||||
| // 			- jli.getElementOrigin(..)
 |  | ||||||
| 				getElementOrigin = function(elem){  |  | ||||||
| 					var o = $(elem).origin() || [0, 0]  |  | ||||||
| 					return { left: o[0], top: o[1], } |  | ||||||
| 				} |  | ||||||
| // 				<elem>.transform('origin')
 |  | ||||||
| //
 |  | ||||||
| // 			- jli.getElementScale(..)
 |  | ||||||
| 				getElementScale = function(elem){ return $(elem).scale() } |  | ||||||
| //
 |  | ||||||
| // 			- jli.getRelativeOffset(..)
 | // 			- jli.getRelativeOffset(..)
 | ||||||
| 				getElementOffset = function(elem){  | // 			- jli.getElementOrigin(..)
 | ||||||
| 					var o = $(elem).transform('x', 'y')  | // 			- jli.getElementScale(..)
 | ||||||
| 					return { left: o.x, top: o.y, } |  | ||||||
| 				} |  | ||||||
| //
 |  | ||||||
| // 			- jli.setElementOffset(..)
 |  | ||||||
| // 				// XXX still does not work for some reason...
 |  | ||||||
| 				setElementOffset = function(elem, l, t){  |  | ||||||
| 					//return $(elem).velocity({translateX: l, translateY: t})
 |  | ||||||
| 					return $(elem).transform({x: l || 0, y: t || 0, z: 0})  |  | ||||||
| 				} |  | ||||||
| //
 |  | ||||||
| // 			- jli.setElementScale(..)
 | // 			- jli.setElementScale(..)
 | ||||||
| 				setElementScale = function(elem, scale){  | // 			- jli.setElementOffset(..)
 | ||||||
| 					//return $(elem).velocity({scale: scale || 1}, 150)
 |  | ||||||
| 					return $(elem).scale(scale || 1)  |  | ||||||
| 				} |  | ||||||
| //
 |  | ||||||
| // 			- jli.shiftOriginTo(..)
 | // 			- jli.shiftOriginTo(..)
 | ||||||
| // 				XXX this sets origin and compensates for offsets...
 |  | ||||||
| // 					...to make shifting origin not affect element visual position...
 |  | ||||||
| //
 |  | ||||||
| } |  | ||||||
| // XXX think if a way to manage animation timings...
 | // XXX think if a way to manage animation timings...
 | ||||||
| //
 | //
 | ||||||
| //
 | //
 | ||||||
| //
 | //
 | ||||||
|  | /*********************************************************************/ | ||||||
|  | // Low Level dom access...
 | ||||||
|  | //
 | ||||||
|  | // XXX not sure if this is the right way to go...
 | ||||||
|  | 
 | ||||||
|  | var legacyDOMAdapter = { | ||||||
|  | 	getOrigin: getElementOrigin, | ||||||
|  | 	// XXX this is not used here...
 | ||||||
|  | 	setOrigin: setElementOrigin,  | ||||||
|  | 
 | ||||||
|  | 	getScale: getElementScale, | ||||||
|  | 	setScale: setElementScale, | ||||||
|  | 
 | ||||||
|  | 	getOffset: getElementOffset, | ||||||
|  | 	setOffset: setElementOffset, | ||||||
|  | 
 | ||||||
|  | 	// a bit higher level...
 | ||||||
|  | 	shiftOrigin: shiftOriginTo, | ||||||
|  | 	relativeOffset: getRelativeOffset, | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | // XXX BUG: ...
 | ||||||
|  | // 		to reproduce:
 | ||||||
|  | // 			- .focusImage('j')
 | ||||||
|  | // 			- .toggleSingleImage('on')
 | ||||||
|  | // 		the image disappears...
 | ||||||
|  | var DOMAdapter = { | ||||||
|  | 	getOrigin: function(elem){ | ||||||
|  | 		var o = $(elem).origin() || [0, 0]  | ||||||
|  | 		return { left: o[0], top: o[1], } | ||||||
|  | 	}, | ||||||
|  | 	setOrigin: function(elem, left, top){ | ||||||
|  | 		return $(elem).origin(left, top, 0) | ||||||
|  | 	}, | ||||||
|  | 	setOriginSync: function(elem, x, y, z){ | ||||||
|  | 		x = x == null ? '50%' : x | ||||||
|  | 		y = y == null ? '50%' : y | ||||||
|  | 		z = z == null ? '0' : z | ||||||
|  | 		var value = x +' '+ y +' '+ z | ||||||
|  | 
 | ||||||
|  | 		elem = $(elem) | ||||||
|  | 		var e = elem[0] | ||||||
|  | 
 | ||||||
|  | 		e.style.display = 'none' | ||||||
|  | 		// now kick the browser into recognition of our changes NOW ;)
 | ||||||
|  | 		getComputedStyle(e).display | ||||||
|  | 
 | ||||||
|  | 		e.style['-o-transform-origin'] =  value | ||||||
|  | 		e.style['-ms-transform-origin'] =  value | ||||||
|  | 		e.style['-moz-transform-origin'] =  value | ||||||
|  | 		e.style['-webkit-transform-origin'] =  value | ||||||
|  | 		e.style['transform-origin'] = value | ||||||
|  | 
 | ||||||
|  | 		e.style.display = '' | ||||||
|  | 		getComputedStyle(e).display | ||||||
|  | 
 | ||||||
|  | 		return $(elem) | ||||||
|  | 	}, | ||||||
|  | 
 | ||||||
|  | 	getScale: function(elem){  | ||||||
|  | 		return $(elem).scale() || 1 }, | ||||||
|  | 	setScale: function(elem, scale){ | ||||||
|  | 		return $(elem).scale(scale || 1) }, | ||||||
|  | 
 | ||||||
|  | 	getOffset: function(elem){ | ||||||
|  | 		var o = $(elem).transform('x', 'y')  | ||||||
|  | 		return { left: o.x, top: o.y, } | ||||||
|  | 	}, | ||||||
|  | 	setOffset: function(elem, left, top){ | ||||||
|  | 		return $(elem).transform({x: left || 0, y: top || 0, z: 0})  | ||||||
|  | 	}, | ||||||
|  | 
 | ||||||
|  | 	shiftOrigin: function(elem, left, top, scale){ | ||||||
|  | 		var o = this.getOrigin(elem) | ||||||
|  | 		var scale = scale || this.getScale(elem) | ||||||
|  | 		var offset = this.getOffset(elem) | ||||||
|  | 
 | ||||||
|  | 		// calculate the offset change and compensate...
 | ||||||
|  | 		var cl = offset.left + ((o.left - o.left*scale) - (left - left*scale)) | ||||||
|  | 		var ct = offset.top + ((o.top - o.top*scale) - (top - top*scale)) | ||||||
|  | 
 | ||||||
|  | 		this.setOffset(elem, cl, ct) | ||||||
|  | 
 | ||||||
|  | 		return this.setOriginSync(elem, left+'px', top+'px') | ||||||
|  | 	}, | ||||||
|  | 	// see docs in jli.js
 | ||||||
|  | 	relativeOffset: function(container, block, point){ | ||||||
|  | 		point = point == null ? {} : point | ||||||
|  | 		var l = point.left | ||||||
|  | 		var t = point.top | ||||||
|  | 		var scale = point.scale | ||||||
|  | 
 | ||||||
|  | 		// get the input data...
 | ||||||
|  | 		var s = this.getScale(block) || 1 | ||||||
|  | 		var o = this.getOrigin(block) | ||||||
|  | 		// get only the value we need...
 | ||||||
|  | 		var W = container.width() | ||||||
|  | 		var H = container.height() | ||||||
|  | 		// we need this to make everything relative to the container...
 | ||||||
|  | 		var co = container.offset() | ||||||
|  | 		var offset = this.getOffset(block) | ||||||
|  | 		var bo = block.offset() | ||||||
|  | 
 | ||||||
|  | 		scale = scale == 'screen' ? 1  | ||||||
|  | 			: scale == 'elem' ? s | ||||||
|  | 			: scale == null ? s | ||||||
|  | 			: scale | ||||||
|  | 
 | ||||||
|  | 		// normalize the l,t to element scale...
 | ||||||
|  | 		if(l != null && t != null){ | ||||||
|  | 
 | ||||||
|  | 			// get only the value we need...
 | ||||||
|  | 			// NOTE: width and height are used to calculate the correction
 | ||||||
|  | 			//		due to origin/scale...
 | ||||||
|  | 			var w = block.width() | ||||||
|  | 			var h = block.height() | ||||||
|  | 			o = { | ||||||
|  | 				// target offset scale...
 | ||||||
|  | 				top: t*scale  | ||||||
|  | 					// set origin to top left corner of element (compensate
 | ||||||
|  | 					// for scaling)...
 | ||||||
|  | 					+ (h - h*s) / (h / o.top),  | ||||||
|  | 				left: l*scale  | ||||||
|  | 					+ (w - w*s) / (w / o.left), | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		return { | ||||||
|  | 			top: offset.top + (H/2 - offset.top) - o.top, | ||||||
|  | 			left: offset.left + (W/2 - offset.left) - o.left, | ||||||
|  | 		} | ||||||
|  | 	}, | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| /*********************************************************************/ | /*********************************************************************/ | ||||||
| 
 | 
 | ||||||
| var RibbonsClassPrototype = { | var RibbonsClassPrototype = { | ||||||
| @ -181,6 +290,10 @@ var RibbonsPrototype = { | |||||||
| 		return o | 		return o | ||||||
| 	}, | 	}, | ||||||
| 
 | 
 | ||||||
|  | 	// DOM Adapter...
 | ||||||
|  | 	//dom: legacyDOMAdapter,
 | ||||||
|  | 	dom: DOMAdapter, | ||||||
|  | 	 | ||||||
| 	// Constructors...
 | 	// Constructors...
 | ||||||
| 	createViewer: RibbonsClassPrototype.createViewer, | 	createViewer: RibbonsClassPrototype.createViewer, | ||||||
| 	createRibbon: RibbonsClassPrototype.createRibbon, | 	createRibbon: RibbonsClassPrototype.createRibbon, | ||||||
| @ -352,7 +465,7 @@ var RibbonsPrototype = { | |||||||
| 	scale: function(scale, t, l){ | 	scale: function(scale, t, l){ | ||||||
| 		// get...
 | 		// get...
 | ||||||
| 		if(arguments.length == 0){ | 		if(arguments.length == 0){ | ||||||
| 			return getElementScale(this.getRibbonSet()) || 1 | 			return this.dom.getScale(this.getRibbonSet()) || 1 | ||||||
| 
 | 
 | ||||||
| 		// set...
 | 		// set...
 | ||||||
| 		} else { | 		} else { | ||||||
| @ -378,7 +491,7 @@ var RibbonsPrototype = { | |||||||
| 				this.origin(t, l) | 				this.origin(t, l) | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			setElementScale(ribbon_set, scale) | 			this.dom.setScale(ribbon_set, scale) | ||||||
| 
 | 
 | ||||||
| 			/* XXX not sure if this is needed yet... | 			/* XXX not sure if this is needed yet... | ||||||
| 			// XXX fix a render bug in chrome 38...
 | 			// XXX fix a render bug in chrome 38...
 | ||||||
| @ -414,7 +527,7 @@ var RibbonsPrototype = { | |||||||
| 	origin: function(a, b){ | 	origin: function(a, b){ | ||||||
| 		// get...
 | 		// get...
 | ||||||
| 		if(arguments.length == 0){ | 		if(arguments.length == 0){ | ||||||
| 			return getElementOrigin(this.getRibbonSet()) | 			return this.dom.getOrigin(this.getRibbonSet()) | ||||||
| 
 | 
 | ||||||
| 		// set...
 | 		// set...
 | ||||||
| 		} else { | 		} else { | ||||||
| @ -456,11 +569,11 @@ var RibbonsPrototype = { | |||||||
| 				var t = (io.top - ro.top)/s + h/2 | 				var t = (io.top - ro.top)/s + h/2 | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			shiftOriginTo(ribbon_set, l, t) | 			this.dom.shiftOrigin(ribbon_set, l, t) | ||||||
| 
 | 
 | ||||||
| 			// XXX DEBUG: remove when done...
 | 			// XXX DEBUG: remove when done...
 | ||||||
| 			if($('.point').length > 0){ | 			if($('.point').length > 0){ | ||||||
| 				setElementOffset($('.point'), l, t) | 				this.dom.setOffset($('.point'), l, t) | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			return this | 			return this | ||||||
| @ -541,7 +654,7 @@ var RibbonsPrototype = { | |||||||
| 
 | 
 | ||||||
| 	// Make a "shadow" image for use with image oriented animations...
 | 	// Make a "shadow" image for use with image oriented animations...
 | ||||||
| 	//
 | 	//
 | ||||||
| 	//	.makeShadwo([<image>][, <animate>][, <delay>])
 | 	//	.makeShadow([<image>][, <animate>][, <delay>])
 | ||||||
| 	//		-> <finalize>
 | 	//		-> <finalize>
 | ||||||
| 	//
 | 	//
 | ||||||
| 	// A shadow is a clone of <image> placed directly above it while it 
 | 	// A shadow is a clone of <image> placed directly above it while it 
 | ||||||
| @ -576,6 +689,7 @@ var RibbonsPrototype = { | |||||||
| 	// XXX should we also have a ribbon shadow???
 | 	// XXX should we also have a ribbon shadow???
 | ||||||
| 	// XXX when this cant find a target it will return an empty function,
 | 	// XXX when this cant find a target it will return an empty function,
 | ||||||
| 	// 		not sure if this is correct...
 | 	// 		not sure if this is correct...
 | ||||||
|  | 	// XXX should we use transforms instead of css positions???
 | ||||||
| 	makeShadow: function(target, animate, delay){ | 	makeShadow: function(target, animate, delay){ | ||||||
| 		delay = delay || 200 | 		delay = delay || 200 | ||||||
| 		var img = this.getImage(target) | 		var img = this.getImage(target) | ||||||
| @ -614,7 +728,7 @@ var RibbonsPrototype = { | |||||||
| 
 | 
 | ||||||
| 			// make a shadow element...
 | 			// make a shadow element...
 | ||||||
| 			// ...we need to scale it to the current scale...
 | 			// ...we need to scale it to the current scale...
 | ||||||
| 			var shadow = setElementScale( | 			var shadow = this.dom.setScale( | ||||||
| 				$('<div>') | 				$('<div>') | ||||||
| 					.addClass('shadow ribbon clone') | 					.addClass('shadow ribbon clone') | ||||||
| 					.attr({ | 					.attr({ | ||||||
| @ -1396,7 +1510,7 @@ var RibbonsPrototype = { | |||||||
| 				var dl = loaded.index(ref) - gids.indexOf(gid) | 				var dl = loaded.index(ref) - gids.indexOf(gid) | ||||||
| 
 | 
 | ||||||
| 				if(dl != 0){ | 				if(dl != 0){ | ||||||
| 					r.css({left: parseFloat(r.css('left')) + dl * w}) | 					this.dom.setOffset(r, this.dom.getOrigin(r) + dl * w) | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| @ -1602,7 +1716,7 @@ var RibbonsPrototype = { | |||||||
| 		// clear all...
 | 		// clear all...
 | ||||||
| 		if(gids == null || gids == '*'){ | 		if(gids == null || gids == '*'){ | ||||||
| 			this.preventTransitions() | 			this.preventTransitions() | ||||||
| 			setElementOffset(this.getRibbonSet(), 0, 0).children().detach() | 			this.dom.setOffset(this.getRibbonSet(), 0, 0).children().detach() | ||||||
| 			this.restoreTransitions() | 			this.restoreTransitions() | ||||||
| 
 | 
 | ||||||
| 		// clear one or more gids...
 | 		// clear one or more gids...
 | ||||||
| @ -1964,12 +2078,12 @@ var RibbonsPrototype = { | |||||||
| 
 | 
 | ||||||
| 		var t = (io.top - ro.top)/s + h/2 | 		var t = (io.top - ro.top)/s + h/2 | ||||||
| 
 | 
 | ||||||
| 		var offset = getRelativeOffset(this.viewer, ribbon_set, { | 		var offset = this.dom.relativeOffset(this.viewer, ribbon_set, { | ||||||
| 			top: t, | 			top: t, | ||||||
| 			left: 0, | 			left: 0, | ||||||
| 		}).top | 		}).top | ||||||
| 		 | 		 | ||||||
| 		setElementOffset(ribbon_set, 0, offset) | 		this.dom.setOffset(ribbon_set, 0, offset) | ||||||
| 
 | 
 | ||||||
| 		return this | 		return this | ||||||
| 	}, | 	}, | ||||||
| @ -1998,14 +2112,7 @@ var RibbonsPrototype = { | |||||||
| 			: mode == 'after' ? -w/2 | 			: mode == 'after' ? -w/2 | ||||||
| 			: 0 | 			: 0 | ||||||
| 
 | 
 | ||||||
| 		ribbon | 		this.dom.setOffset(ribbon, ((rl + ((W-w)/2 + image_offset) - il) / scale)) | ||||||
| 			.css({ |  | ||||||
| 				left: (rl + ((W-w)/2 + image_offset) - il) / scale, |  | ||||||
| 				//transform: 'translate3d('
 |  | ||||||
| 				//	+ ((rl + ((W-w)/2 + image_offset) - il) / scale) + 'px, 0px, 0px)'
 |  | ||||||
| 			}) |  | ||||||
| 
 |  | ||||||
| 		//setElementOffset(ribbon, ((rl + ((W-w)/2 + image_offset) - il) / scale), 0, 1)
 |  | ||||||
| 
 | 
 | ||||||
| 		return this | 		return this | ||||||
| 	}, | 	}, | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user