mirror of
https://github.com/flynx/ImageGrid.git
synced 2025-10-30 02:40:08 +00:00
some experimentation...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
parent
662486266f
commit
080b7ea853
@ -95,6 +95,8 @@ actions.Actions({
|
|||||||
// between ribbons...
|
// between ribbons...
|
||||||
//
|
//
|
||||||
// supported modes:
|
// supported modes:
|
||||||
|
//
|
||||||
|
// XXX should this be here???
|
||||||
'ribbon-focus-modes': [
|
'ribbon-focus-modes': [
|
||||||
'visual', // select image closest visually
|
'visual', // select image closest visually
|
||||||
'order', // select image closest to current in order
|
'order', // select image closest to current in order
|
||||||
|
|||||||
@ -2385,6 +2385,7 @@ module.AutoSingleImage = core.ImageGridFeatures.Feature({
|
|||||||
// XXX add tap/click to focus...
|
// XXX add tap/click to focus...
|
||||||
// XXX add pinch-zoom...
|
// XXX add pinch-zoom...
|
||||||
// XXX add vertical scroll...
|
// XXX add vertical scroll...
|
||||||
|
// XXX disable drag in single image mode unless image is larger than the screen...
|
||||||
// XXX BUG: current image indicator gets shown in random places...
|
// XXX BUG: current image indicator gets shown in random places...
|
||||||
var DirectControljQ =
|
var DirectControljQ =
|
||||||
module.DirectControljQ = core.ImageGridFeatures.Feature({
|
module.DirectControljQ = core.ImageGridFeatures.Feature({
|
||||||
@ -2478,6 +2479,8 @@ module.DirectControljQ = core.ImageGridFeatures.Feature({
|
|||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
// XXX disable drag in single image mode unless image is larger than the screen...
|
||||||
|
// XXX do not use this for production -- GSAp has bad license...
|
||||||
var DirectControlGSAP =
|
var DirectControlGSAP =
|
||||||
module.DirectControlGSAP = core.ImageGridFeatures.Feature({
|
module.DirectControlGSAP = core.ImageGridFeatures.Feature({
|
||||||
title: '',
|
title: '',
|
||||||
@ -2527,6 +2530,8 @@ module.DirectControlGSAP = core.ImageGridFeatures.Feature({
|
|||||||
// XXX fast but uses messes up positioning...
|
// XXX fast but uses messes up positioning...
|
||||||
// ...setting type: 'left' will fix this but make things
|
// ...setting type: 'left' will fix this but make things
|
||||||
// really slow (as slow as jQuery.ui.draggable(..))...
|
// really slow (as slow as jQuery.ui.draggable(..))...
|
||||||
|
// XXX shifting to using transforms for centering fixes the align
|
||||||
|
// issue but makes the initial move jump...
|
||||||
['updateRibbon',
|
['updateRibbon',
|
||||||
function(_, target){
|
function(_, target){
|
||||||
var that = this
|
var that = this
|
||||||
@ -2536,22 +2541,12 @@ module.DirectControlGSAP = core.ImageGridFeatures.Feature({
|
|||||||
if(r.length > 0 && !r.hasClass('draggable')){
|
if(r.length > 0 && !r.hasClass('draggable')){
|
||||||
r.addClass('draggable')
|
r.addClass('draggable')
|
||||||
|
|
||||||
var o
|
var o, scale
|
||||||
|
|
||||||
Draggable.create(r, {
|
Draggable.create(r, {
|
||||||
type: 'x',
|
type: 'x',
|
||||||
onDragStart: function(){
|
cursor: 'auto',
|
||||||
o = r.position().left
|
|
||||||
},
|
|
||||||
onDragEnd: function(){
|
onDragEnd: function(){
|
||||||
var l = r.position().left
|
|
||||||
l += o - l
|
|
||||||
|
|
||||||
that.ribbons.preventTransitions(r)
|
|
||||||
r[0].style.left = l
|
|
||||||
r[0].style.transform = 'translate3d(0, 0, 0)'
|
|
||||||
that.ribbons.restoreTransitions(r)
|
|
||||||
|
|
||||||
var c = that.ribbons.getImageByPosition('center', r)
|
var c = that.ribbons.getImageByPosition('center', r)
|
||||||
that
|
that
|
||||||
.updateRibbon(c)
|
.updateRibbon(c)
|
||||||
|
|||||||
@ -176,6 +176,7 @@ typeof(require) != 'undefined' && require('nw.gui').Window.get().showDevTools()
|
|||||||
<script src="ext-lib/jquery.js"></script>
|
<script src="ext-lib/jquery.js"></script>
|
||||||
<script src="ext-lib/jquery-ui.js"></script>
|
<script src="ext-lib/jquery-ui.js"></script>
|
||||||
<script src="ext-lib/jquery.ui.touch-punch.min.js"></script>
|
<script src="ext-lib/jquery.ui.touch-punch.min.js"></script>
|
||||||
|
<!--script src="ext-lib/jquery.transit.min.js"></script-->
|
||||||
|
|
||||||
<script src="ext-lib/gsap/TweenLite.min.js"></script>
|
<script src="ext-lib/gsap/TweenLite.min.js"></script>
|
||||||
<script src="ext-lib/gsap/jquery.gsap.min.js"></script>
|
<script src="ext-lib/gsap/jquery.gsap.min.js"></script>
|
||||||
|
|||||||
@ -217,6 +217,8 @@ function setElementTransform(elem, offset, scale, duration){
|
|||||||
elem = $(elem)
|
elem = $(elem)
|
||||||
//var t3d = USE_3D_TRANSFORM ? 'translateZ(0)' : ''
|
//var t3d = USE_3D_TRANSFORM ? 'translateZ(0)' : ''
|
||||||
var t3d = USE_3D_TRANSFORM ? 'translate3d(0,0,0)' : ''
|
var t3d = USE_3D_TRANSFORM ? 'translate3d(0,0,0)' : ''
|
||||||
|
//var translate = USE_3D_TRANSFORM ? 'translate3d' : 'translate'
|
||||||
|
var translate = 'translate'
|
||||||
|
|
||||||
if(offset == null){
|
if(offset == null){
|
||||||
offset = getElementOffset(elem)
|
offset = getElementOffset(elem)
|
||||||
@ -237,9 +239,12 @@ function setElementTransform(elem, offset, scale, duration){
|
|||||||
var scale = getElementScale(elem)
|
var scale = getElementScale(elem)
|
||||||
}
|
}
|
||||||
if(USE_TRANSFORM){
|
if(USE_TRANSFORM){
|
||||||
var transform = 'translate('+
|
var transform = translate+'('+
|
||||||
Math.round(offset.left) +'px, '+
|
Math.round(offset.left) +'px, '+
|
||||||
Math.round(offset.top) +'px) scale('+ scale +') ' + t3d
|
//Math.round(offset.top) +'px'+ (USE_3D_TRANSFORM && ', 0px' || '') +') '
|
||||||
|
Math.round(offset.top) +'px) '
|
||||||
|
+'scale('+ scale +') '
|
||||||
|
+ t3d
|
||||||
elem.css({
|
elem.css({
|
||||||
'-ms-transform' : transform,
|
'-ms-transform' : transform,
|
||||||
'-webkit-transform' : transform,
|
'-webkit-transform' : transform,
|
||||||
@ -253,7 +258,10 @@ function setElementTransform(elem, offset, scale, duration){
|
|||||||
top: ''
|
top: ''
|
||||||
}, duration)
|
}, duration)
|
||||||
} else {
|
} else {
|
||||||
var transform = 'translate(0px, 0px) scale('+ scale +') ' + t3d
|
//var transform = translate+'(0px, 0px'+ (USE_3D_TRANSFORM && ', 0px' || '') +') '
|
||||||
|
var transform = translate+'(0px, 0px) '
|
||||||
|
+'scale('+ scale +') '
|
||||||
|
+ t3d
|
||||||
elem.css({
|
elem.css({
|
||||||
// NOTE: this will be wrong during a transition, that's why we
|
// NOTE: this will be wrong during a transition, that's why we
|
||||||
// can pass the pre-calculated offset as an argument...
|
// can pass the pre-calculated offset as an argument...
|
||||||
@ -465,8 +473,8 @@ function stopAnimation(elem){
|
|||||||
|
|
||||||
// XXX account for other transitions...
|
// XXX account for other transitions...
|
||||||
// XXX make a sync version...
|
// XXX make a sync version...
|
||||||
function setElementOffset(elem, l, t){
|
function setElementOffset(elem, l, t, scale){
|
||||||
return setElementTransform(elem, [l, t])
|
return setElementTransform(elem, [l, t], scale)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -11,6 +11,14 @@ define(function(require){ var module = {}
|
|||||||
|
|
||||||
/*********************************************************************/
|
/*********************************************************************/
|
||||||
|
|
||||||
|
// convert JS arguments to Array...
|
||||||
|
var args2array =
|
||||||
|
module.args2array =
|
||||||
|
function(args){
|
||||||
|
//return Array.apply(null, args)
|
||||||
|
return [].slice.call(args)
|
||||||
|
}
|
||||||
|
|
||||||
// Quote a string and convert to RegExp to match self literally.
|
// Quote a string and convert to RegExp to match self literally.
|
||||||
var quoteRegExp =
|
var quoteRegExp =
|
||||||
module.quoteRegExp =
|
module.quoteRegExp =
|
||||||
@ -67,6 +75,312 @@ function(path){
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*********************************************************************/
|
||||||
|
|
||||||
|
var _transform_parse = {
|
||||||
|
// 2d transforms:
|
||||||
|
//martix: [],
|
||||||
|
|
||||||
|
translate: ['left|0', 'top|0'],
|
||||||
|
translateX: ['left'],
|
||||||
|
translateY: ['top'],
|
||||||
|
|
||||||
|
scale: [
|
||||||
|
['scale'],
|
||||||
|
['scaleX|scale', 'scaleY|scale'],
|
||||||
|
],
|
||||||
|
scaleX: ['scaleX'],
|
||||||
|
scaleY: ['scaleY'],
|
||||||
|
|
||||||
|
rotate: ['rotate'],
|
||||||
|
|
||||||
|
skew: ['skewX', 'skewY'],
|
||||||
|
skewX: ['skewX'],
|
||||||
|
skewY: ['skewY'],
|
||||||
|
|
||||||
|
// 3d transforms:
|
||||||
|
//martix3d: [],
|
||||||
|
|
||||||
|
translate3d: ['x|0', 'y|0', 'z|0'],
|
||||||
|
translateZ: ['z'],
|
||||||
|
|
||||||
|
scale3d: ['scaleX', 'scaleY', 'scaleZ'],
|
||||||
|
scaleZ: ['scaleZ'],
|
||||||
|
|
||||||
|
// XXX
|
||||||
|
//rotate3d: [x, y, z, angle],
|
||||||
|
// rotateX
|
||||||
|
// rotateY
|
||||||
|
// rotateZ
|
||||||
|
|
||||||
|
perspective: ['perspective'],
|
||||||
|
}
|
||||||
|
var _transform_parse_rev = {}
|
||||||
|
Object.keys(_transform_parse).forEach(function(func){
|
||||||
|
var args = _transform_parse[func]
|
||||||
|
|
||||||
|
// we got multiple signatures == merge...
|
||||||
|
if(!(args[0] instanceof Array)){
|
||||||
|
args = [args]
|
||||||
|
}
|
||||||
|
|
||||||
|
args
|
||||||
|
// merge lists of args...
|
||||||
|
.reduce(function(a, b){ return [].concat.call(a, b) })
|
||||||
|
.unique()
|
||||||
|
// split alternatives...
|
||||||
|
.map(function(a){ return a.split(/\|/g) })
|
||||||
|
.forEach(function(a){
|
||||||
|
var arg = a[0]
|
||||||
|
var alt = a.slice(1)
|
||||||
|
|
||||||
|
var e = _transform_parse_rev[arg] = _transform_parse_rev[arg] || {}
|
||||||
|
|
||||||
|
e.funcs = e.funcs || []
|
||||||
|
e.funcs.indexOf(func) < 0 && e.funcs.push(func)
|
||||||
|
|
||||||
|
e.alt = e.alt || []
|
||||||
|
// XXX we explicitly support only one alternative now...
|
||||||
|
e.alt = e.alt.concat(alt).unique()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
// XXX get vendor...
|
||||||
|
|
||||||
|
//
|
||||||
|
// Set element transform...
|
||||||
|
// .transform({..})
|
||||||
|
// -> element
|
||||||
|
//
|
||||||
|
// Get element transform...
|
||||||
|
// .transform()
|
||||||
|
// .transform(<attr>[, ...])
|
||||||
|
// .transform([<attr>, ...])
|
||||||
|
// -> data
|
||||||
|
//
|
||||||
|
// Supported transformations:
|
||||||
|
// x/y
|
||||||
|
// scale
|
||||||
|
// scaleX/scaleY
|
||||||
|
// origin
|
||||||
|
// originX/originY
|
||||||
|
//
|
||||||
|
// NOTE: pixel values are converted to numbers and back by default...
|
||||||
|
//
|
||||||
|
// XXX this will get/set values only on the first element, is this correct???
|
||||||
|
// XXX how do we combine translate(..) and translate3d(..)???
|
||||||
|
jQuery.fn.transform = function(){
|
||||||
|
var that = this
|
||||||
|
var args = args2array(arguments)
|
||||||
|
|
||||||
|
// XXX get the browser prefix...
|
||||||
|
var prefix = ''
|
||||||
|
|
||||||
|
// normalize...
|
||||||
|
args = args.length == 0
|
||||||
|
|| typeof(args[0]) == typeof('str') ? args
|
||||||
|
: args[0].constructor === Array
|
||||||
|
|| args.length == 1 ? args[0]
|
||||||
|
: args
|
||||||
|
|
||||||
|
var elem = $(this)[0]
|
||||||
|
var origin_str = elem.style[prefix + 'transformOrigin']
|
||||||
|
var transform_str = elem.style[prefix + 'transform']
|
||||||
|
|
||||||
|
// build the current state...
|
||||||
|
// NOTE: we'll need this for both fetching (parsing) and writing
|
||||||
|
// (checking)...
|
||||||
|
var transform = {}
|
||||||
|
var functions = {}
|
||||||
|
|
||||||
|
// origin...
|
||||||
|
var origin = origin_str
|
||||||
|
.split(/\s+/)
|
||||||
|
// XXX add this to transform...
|
||||||
|
|
||||||
|
// transform...
|
||||||
|
transform_str
|
||||||
|
// split functions...
|
||||||
|
.split(/(\w+\([^\)]*)\)/)
|
||||||
|
// remove empty strings...
|
||||||
|
.filter(function(e){ return e.trim().length > 0})
|
||||||
|
// split each function...
|
||||||
|
.map(function(e){ return e
|
||||||
|
// split args...
|
||||||
|
.split(/\s*[\(,\s]\s*/)
|
||||||
|
// cleanup...
|
||||||
|
.filter(function(e){ return e.trim().length > 0 }) })
|
||||||
|
// build the structure...
|
||||||
|
.forEach(function(data){
|
||||||
|
var func = data.shift()
|
||||||
|
var args = data
|
||||||
|
|
||||||
|
// XXX do we care about function vendor tags here???
|
||||||
|
var spec = _transform_parse[func]
|
||||||
|
|
||||||
|
functions[func] = args
|
||||||
|
|
||||||
|
// we do not know this function...
|
||||||
|
if(spec == null){
|
||||||
|
transform[func] = args
|
||||||
|
|
||||||
|
} else {
|
||||||
|
spec = spec[0] instanceof Array ? spec : [spec]
|
||||||
|
spec.forEach(function(s){
|
||||||
|
// skip non-matching signatures...
|
||||||
|
// XXX is this correct???
|
||||||
|
if(s.length != args.length){
|
||||||
|
return
|
||||||
|
}
|
||||||
|
s.forEach(function(e, i){
|
||||||
|
// this is for things that have optional arguments
|
||||||
|
// like scale(..)
|
||||||
|
// XXX should we treat this in some special way???
|
||||||
|
if(args[i] == null){
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var alternatives = e.split(/\|/g)
|
||||||
|
var k = alternatives.shift().trim()
|
||||||
|
|
||||||
|
transform[k] = args[i].slice(-2) == 'px'
|
||||||
|
|| /[0-9\.]+/.test(args[i]) ?
|
||||||
|
parseFloat(args[i])
|
||||||
|
: args[i]
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
// get data...
|
||||||
|
if(args.constructor === Array){
|
||||||
|
var res = {}
|
||||||
|
|
||||||
|
// return the full transform...
|
||||||
|
if(args.length == 0){
|
||||||
|
return transform
|
||||||
|
}
|
||||||
|
|
||||||
|
args.forEach(function(arg){
|
||||||
|
// direct match in shorthand data...
|
||||||
|
if(arg in transform){
|
||||||
|
res[arg] = transform[arg]
|
||||||
|
|
||||||
|
// try and find an alias...
|
||||||
|
} else if(arg in _transform_parse_rev){
|
||||||
|
var funcs = _transform_parse_rev[arg].funcs
|
||||||
|
var alt = _transform_parse_rev[arg].alt[0]
|
||||||
|
|
||||||
|
// no alternatives...
|
||||||
|
if(!alt){
|
||||||
|
res[arg] = ''
|
||||||
|
|
||||||
|
// explicit number value...
|
||||||
|
} else if(/^[0-9\.]+$/.test(alt)){
|
||||||
|
res[arg] = parseFloat(alt)
|
||||||
|
|
||||||
|
// explicit string value...
|
||||||
|
} else if(/^(['"]).*\1$/.test(alt)){
|
||||||
|
res[arg] = alt.slice(1, -1)
|
||||||
|
|
||||||
|
} else {
|
||||||
|
var v = $(that).transform(alt)
|
||||||
|
res[arg] = v == '' ? alt : v
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// collect from function...
|
||||||
|
} else if(arg in _transform_parse){
|
||||||
|
var v = res[arg] = {}
|
||||||
|
_transform_parse[arg].forEach(function(e){
|
||||||
|
var alternatives = e.split(/\|/g)
|
||||||
|
var k = alternatives.shift().trim()
|
||||||
|
|
||||||
|
v[k] = transform[k] != null ? transform[k] : ''
|
||||||
|
})
|
||||||
|
|
||||||
|
// don't know about this attr...
|
||||||
|
} else {
|
||||||
|
res[arg] = ''
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
// special case: we asked for a single value...
|
||||||
|
if(args.length == 1){
|
||||||
|
return res[args[0]]
|
||||||
|
}
|
||||||
|
return res
|
||||||
|
|
||||||
|
// set data...
|
||||||
|
} else {
|
||||||
|
transform = Object.create(transform)
|
||||||
|
Object.keys(args).forEach(function(key){
|
||||||
|
// the changing value already exists...
|
||||||
|
if(key in transform
|
||||||
|
// get one of the shorthand keys...
|
||||||
|
// NOTE: we might need to pack or re-pack the date but we
|
||||||
|
// can't decide here...
|
||||||
|
|| key in _transform_parse_rev
|
||||||
|
// got one of the standard keys...
|
||||||
|
|| key in _transform_parse){
|
||||||
|
transform[key] = args[key]
|
||||||
|
|
||||||
|
// key undefined...
|
||||||
|
} else {
|
||||||
|
console.warn('Ignoring key "%s".', key)
|
||||||
|
transform[key] = args[key]
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
console.log('>>>>', transform)
|
||||||
|
|
||||||
|
// XXX set new values and resolve new functions...
|
||||||
|
// XXX
|
||||||
|
|
||||||
|
|
||||||
|
// build the value string...
|
||||||
|
var transform_str = ''
|
||||||
|
for(var f in functions){
|
||||||
|
transform_str += f +'('
|
||||||
|
+(functions[f]
|
||||||
|
// XXX test if px value...
|
||||||
|
.map(function(e){ return typeof(e) == typeof(123) ? e + 'px' : e })
|
||||||
|
.join(', '))+') '
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(transform_str)
|
||||||
|
|
||||||
|
// XXX STUB
|
||||||
|
return functions
|
||||||
|
|
||||||
|
// set the values...
|
||||||
|
elem.style.transform = transform_str
|
||||||
|
elem.style.transformOrigin = origin_str
|
||||||
|
}
|
||||||
|
|
||||||
|
return $(this)
|
||||||
|
}
|
||||||
|
|
||||||
|
// shorthands...
|
||||||
|
jQuery.fn.scale = function(value){
|
||||||
|
if(value){
|
||||||
|
return $(this).transform({scale: value})
|
||||||
|
} else {
|
||||||
|
return $(this).transform('scale')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
jQuery.fn.origin = function(value){
|
||||||
|
if(value){
|
||||||
|
return $(this).transform({origin: value})
|
||||||
|
} else {
|
||||||
|
return $(this).transform('origin')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
* vim:set ts=4 sw=4 : */
|
* vim:set ts=4 sw=4 : */
|
||||||
return module })
|
return module })
|
||||||
|
|||||||
@ -1946,8 +1946,12 @@ var RibbonsPrototype = {
|
|||||||
ribbon
|
ribbon
|
||||||
.css({
|
.css({
|
||||||
left: (rl + ((W-w)/2 + image_offset) - il) / scale,
|
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