mirror of
https://github.com/flynx/ImageGrid.git
synced 2025-10-29 10:20:08 +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
|
||||
// shift when scaled...
|
||||
// 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 scale = getElementScale(elem)
|
||||
var scale = scale || getElementScale(elem)
|
||||
var offset = getElementOffset(elem)
|
||||
|
||||
// calculate the offset change and compensate...
|
||||
|
||||
@ -347,6 +347,14 @@ var transformEditor = function(){
|
||||
|
||||
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){
|
||||
var i = spec[k]
|
||||
|
||||
@ -373,10 +381,21 @@ var transformEditor = function(){
|
||||
return res != null ? res[i] : res
|
||||
})
|
||||
.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 == 'mul' ? function(a, b){ return a * b }
|
||||
: reduce == 'last' ? function(a, b){ return b != null ? b : a }
|
||||
: reduce)
|
||||
: reduce == 'mul' ? function(a, b){ return a * b }
|
||||
: reduce == 'last' ? function(a, b){ return b != null ? b : a }
|
||||
: reduce,
|
||||
reduce == 'mul' ? 1
|
||||
: reduce = 'sum'? 0
|
||||
: 0)
|
||||
*/
|
||||
}
|
||||
|
||||
// setup the aliases...
|
||||
@ -471,8 +490,8 @@ var transformEditor = function(){
|
||||
func('skew', ['', ''], 0)
|
||||
func('skewX', [''], 0)
|
||||
func('skewY', [''], 0)
|
||||
alias({skewX: 0, skew: 0})
|
||||
alias({skewY: 0, skew: 1})
|
||||
alias({skewX: 0, skew: 0}, 'sum')
|
||||
alias({skewY: 0, skew: 1}, 'sum')
|
||||
|
||||
func('perspective')
|
||||
|
||||
|
||||
@ -62,45 +62,154 @@ var RIBBON = '.ribbon:not(.clone)'
|
||||
//
|
||||
// XXX need to replace soemlegacy CSS API and make this compatible with
|
||||
// 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(..)
|
||||
getElementOffset = function(elem){
|
||||
var o = $(elem).transform('x', 'y')
|
||||
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.getElementOrigin(..)
|
||||
// - jli.getElementScale(..)
|
||||
// - jli.setElementScale(..)
|
||||
setElementScale = function(elem, scale){
|
||||
//return $(elem).velocity({scale: scale || 1}, 150)
|
||||
return $(elem).scale(scale || 1)
|
||||
}
|
||||
//
|
||||
// - jli.setElementOffset(..)
|
||||
// - 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...
|
||||
//
|
||||
//
|
||||
//
|
||||
/*********************************************************************/
|
||||
// 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 = {
|
||||
@ -181,6 +290,10 @@ var RibbonsPrototype = {
|
||||
return o
|
||||
},
|
||||
|
||||
// DOM Adapter...
|
||||
//dom: legacyDOMAdapter,
|
||||
dom: DOMAdapter,
|
||||
|
||||
// Constructors...
|
||||
createViewer: RibbonsClassPrototype.createViewer,
|
||||
createRibbon: RibbonsClassPrototype.createRibbon,
|
||||
@ -352,7 +465,7 @@ var RibbonsPrototype = {
|
||||
scale: function(scale, t, l){
|
||||
// get...
|
||||
if(arguments.length == 0){
|
||||
return getElementScale(this.getRibbonSet()) || 1
|
||||
return this.dom.getScale(this.getRibbonSet()) || 1
|
||||
|
||||
// set...
|
||||
} else {
|
||||
@ -378,7 +491,7 @@ var RibbonsPrototype = {
|
||||
this.origin(t, l)
|
||||
}
|
||||
|
||||
setElementScale(ribbon_set, scale)
|
||||
this.dom.setScale(ribbon_set, scale)
|
||||
|
||||
/* XXX not sure if this is needed yet...
|
||||
// XXX fix a render bug in chrome 38...
|
||||
@ -414,7 +527,7 @@ var RibbonsPrototype = {
|
||||
origin: function(a, b){
|
||||
// get...
|
||||
if(arguments.length == 0){
|
||||
return getElementOrigin(this.getRibbonSet())
|
||||
return this.dom.getOrigin(this.getRibbonSet())
|
||||
|
||||
// set...
|
||||
} else {
|
||||
@ -456,11 +569,11 @@ var RibbonsPrototype = {
|
||||
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...
|
||||
if($('.point').length > 0){
|
||||
setElementOffset($('.point'), l, t)
|
||||
this.dom.setOffset($('.point'), l, t)
|
||||
}
|
||||
|
||||
return this
|
||||
@ -541,7 +654,7 @@ var RibbonsPrototype = {
|
||||
|
||||
// Make a "shadow" image for use with image oriented animations...
|
||||
//
|
||||
// .makeShadwo([<image>][, <animate>][, <delay>])
|
||||
// .makeShadow([<image>][, <animate>][, <delay>])
|
||||
// -> <finalize>
|
||||
//
|
||||
// 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 when this cant find a target it will return an empty function,
|
||||
// not sure if this is correct...
|
||||
// XXX should we use transforms instead of css positions???
|
||||
makeShadow: function(target, animate, delay){
|
||||
delay = delay || 200
|
||||
var img = this.getImage(target)
|
||||
@ -614,7 +728,7 @@ var RibbonsPrototype = {
|
||||
|
||||
// make a shadow element...
|
||||
// ...we need to scale it to the current scale...
|
||||
var shadow = setElementScale(
|
||||
var shadow = this.dom.setScale(
|
||||
$('<div>')
|
||||
.addClass('shadow ribbon clone')
|
||||
.attr({
|
||||
@ -1396,7 +1510,7 @@ var RibbonsPrototype = {
|
||||
var dl = loaded.index(ref) - gids.indexOf(gid)
|
||||
|
||||
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...
|
||||
if(gids == null || gids == '*'){
|
||||
this.preventTransitions()
|
||||
setElementOffset(this.getRibbonSet(), 0, 0).children().detach()
|
||||
this.dom.setOffset(this.getRibbonSet(), 0, 0).children().detach()
|
||||
this.restoreTransitions()
|
||||
|
||||
// clear one or more gids...
|
||||
@ -1964,12 +2078,12 @@ var RibbonsPrototype = {
|
||||
|
||||
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,
|
||||
left: 0,
|
||||
}).top
|
||||
|
||||
setElementOffset(ribbon_set, 0, offset)
|
||||
this.dom.setOffset(ribbon_set, 0, offset)
|
||||
|
||||
return this
|
||||
},
|
||||
@ -1998,14 +2112,7 @@ var RibbonsPrototype = {
|
||||
: mode == 'after' ? -w/2
|
||||
: 0
|
||||
|
||||
ribbon
|
||||
.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)
|
||||
this.dom.setOffset(ribbon, ((rl + ((W-w)/2 + image_offset) - il) / scale))
|
||||
|
||||
return this
|
||||
},
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user