mirror of
https://github.com/flynx/ImageGrid.git
synced 2025-10-29 18:30:09 +00:00
several bug fixes and tweaks...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
parent
e3dd16a6ff
commit
952fb7f7dd
@ -345,18 +345,26 @@ module.ImagesPrototype = {
|
|||||||
//gid = gid == null ? getImageGID(): gid
|
//gid = gid == null ? getImageGID(): gid
|
||||||
//size = size == null ? getVisibleImageSize('max') : size
|
//size = size == null ? getVisibleImageSize('max') : size
|
||||||
img_data = img_data == null ? this[gid] : img_data
|
img_data = img_data == null ? this[gid] : img_data
|
||||||
|
|
||||||
|
// XXX if no usable images are available use STUB data...
|
||||||
|
if((img_data.preview == null
|
||||||
|
|| Object.keys(img_data.preview).length == 0)
|
||||||
|
&& img_data.path == null){
|
||||||
|
img_data = STUB_IMAGE_DATA
|
||||||
|
}
|
||||||
|
|
||||||
var s
|
var s
|
||||||
var url = img_data.path
|
var url = img_data.path
|
||||||
var preview_size = 'Original'
|
var preview_size = 'Original'
|
||||||
var p = Infinity
|
var p = Infinity
|
||||||
var previews = img_data.preview || {}
|
var previews = img_data.preview || {}
|
||||||
|
|
||||||
for(var k in img_data.preview){
|
for(var k in previews){
|
||||||
s = parseInt(k)
|
s = parseInt(k)
|
||||||
if(s < p && s > size){
|
if(s < p && s > size){
|
||||||
preview_size = k
|
preview_size = k
|
||||||
p = s
|
p = s
|
||||||
url = img_data.preview[k]
|
url = previews[k]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return {
|
return {
|
||||||
@ -454,6 +462,9 @@ module.ImagesPrototype = {
|
|||||||
var that = this
|
var that = this
|
||||||
gids.forEach(function(key){
|
gids.forEach(function(key){
|
||||||
var img = that[key]
|
var img = that[key]
|
||||||
|
if(img == null){
|
||||||
|
img = that[key] = {}
|
||||||
|
}
|
||||||
var o = direction == 'cw' || direction == 'ccw'
|
var o = direction == 'cw' || direction == 'ccw'
|
||||||
? module.calcRelativeRotation(img.orientation, direction)
|
? module.calcRelativeRotation(img.orientation, direction)
|
||||||
: direction*1
|
: direction*1
|
||||||
@ -480,9 +491,13 @@ module.ImagesPrototype = {
|
|||||||
// XXX add reference support...
|
// XXX add reference support...
|
||||||
flipImage: function(gids, direction, reference){
|
flipImage: function(gids, direction, reference){
|
||||||
gids = gids.constructor !== Array ? [gids] : gids
|
gids = gids.constructor !== Array ? [gids] : gids
|
||||||
|
reference = reference || 'image'
|
||||||
var that = this
|
var that = this
|
||||||
gids.forEach(function(key){
|
gids.forEach(function(key){
|
||||||
var img = that[key]
|
var img = that[key]
|
||||||
|
if(img == null){
|
||||||
|
img = that[key] = {}
|
||||||
|
}
|
||||||
var state = img.flipped
|
var state = img.flipped
|
||||||
state = state == null ? [] : state
|
state = state == null ? [] : state
|
||||||
// toggle the specific state...
|
// toggle the specific state...
|
||||||
|
|||||||
@ -23,6 +23,10 @@ var IMAGE_UPDATERS =
|
|||||||
module.IMAGE_UPDATERS = []
|
module.IMAGE_UPDATERS = []
|
||||||
|
|
||||||
|
|
||||||
|
var IMAGE = '.image:not(.clone)'
|
||||||
|
var RIBBON = '.ribbon:not(.clone)'
|
||||||
|
|
||||||
|
|
||||||
/*********************************************************************/
|
/*********************************************************************/
|
||||||
//
|
//
|
||||||
// This expects the following HTML structure...
|
// This expects the following HTML structure...
|
||||||
@ -211,7 +215,7 @@ module.RibbonsPrototype = {
|
|||||||
getVisibleImageSize: function(dim, scale){
|
getVisibleImageSize: function(dim, scale){
|
||||||
scale = scale || this.getScale()
|
scale = scale || this.getScale()
|
||||||
dim = dim == null ? 'width' : dim
|
dim = dim == null ? 'width' : dim
|
||||||
var img = this.viewer.find('.image')
|
var img = this.viewer.find(IMAGE)
|
||||||
|
|
||||||
return dim == 'height' ? img.outerHeight(true) * scale
|
return dim == 'height' ? img.outerHeight(true) * scale
|
||||||
: dim == 'width' ? img.outerWidth(true) * scale
|
: dim == 'width' ? img.outerWidth(true) * scale
|
||||||
@ -435,7 +439,7 @@ module.RibbonsPrototype = {
|
|||||||
// ...we need to scale it to the current scale...
|
// ...we need to scale it to the current scale...
|
||||||
var shadow = setElementScale(
|
var shadow = setElementScale(
|
||||||
$('<div>')
|
$('<div>')
|
||||||
.addClass('shadow')
|
.addClass('shadow ribbon')
|
||||||
.attr({
|
.attr({
|
||||||
gid: gid,
|
gid: gid,
|
||||||
ticket: ticket,
|
ticket: ticket,
|
||||||
@ -444,6 +448,7 @@ module.RibbonsPrototype = {
|
|||||||
// clone the target into the shadow..
|
// clone the target into the shadow..
|
||||||
img
|
img
|
||||||
.clone()
|
.clone()
|
||||||
|
.addClass('clone')
|
||||||
.removeClass('current')
|
.removeClass('current')
|
||||||
.attr('gid', null)),
|
.attr('gid', null)),
|
||||||
s)
|
s)
|
||||||
@ -566,7 +571,7 @@ module.RibbonsPrototype = {
|
|||||||
|
|
||||||
// we got a collection...
|
// we got a collection...
|
||||||
if(img == null){
|
if(img == null){
|
||||||
return $(target).filter('.image')
|
return $(target).filter(IMAGE)
|
||||||
}
|
}
|
||||||
|
|
||||||
// get the offset...
|
// get the offset...
|
||||||
@ -577,7 +582,7 @@ module.RibbonsPrototype = {
|
|||||||
: offset
|
: offset
|
||||||
var list = offset > 0 ? 'nextAll' : 'prevAll'
|
var list = offset > 0 ? 'nextAll' : 'prevAll'
|
||||||
offset = Math.abs(offset)-1
|
offset = Math.abs(offset)-1
|
||||||
var res = img[list]('.image')
|
var res = img[list](IMAGE)
|
||||||
// handle overflow...
|
// handle overflow...
|
||||||
res = res.eq(Math.min(offset, res.length-1))
|
res = res.eq(Math.min(offset, res.length-1))
|
||||||
img = res.length == 0 ? img : res
|
img = res.length == 0 ? img : res
|
||||||
@ -655,13 +660,13 @@ module.RibbonsPrototype = {
|
|||||||
} else if(target == 'base'){
|
} else if(target == 'base'){
|
||||||
var r = this.viewer.find('.base.ribbon').first()
|
var r = this.viewer.find('.base.ribbon').first()
|
||||||
if(r.length == 0){
|
if(r.length == 0){
|
||||||
return this.viewer.find('.ribbon').first()
|
return this.viewer.find(RIBBON).first()
|
||||||
}
|
}
|
||||||
return r
|
return r
|
||||||
|
|
||||||
// index...
|
// index...
|
||||||
} else if(typeof(target) == typeof(123)){
|
} else if(typeof(target) == typeof(123)){
|
||||||
return this.viewer.find('.ribbon').eq(target)
|
return this.viewer.find(RIBBON).eq(target)
|
||||||
|
|
||||||
// gid...
|
// gid...
|
||||||
} else if(typeof(target) == typeof('str')){
|
} else if(typeof(target) == typeof('str')){
|
||||||
@ -672,12 +677,12 @@ module.RibbonsPrototype = {
|
|||||||
? this.getImage(target).parents('.ribbon').first()
|
? this.getImage(target).parents('.ribbon').first()
|
||||||
: r
|
: r
|
||||||
}
|
}
|
||||||
return $(target).filter('.ribbon')
|
return $(target).filter(RIBBON)
|
||||||
},
|
},
|
||||||
// Like .getRibbon(..) but returns ribbon index instead of the actual
|
// Like .getRibbon(..) but returns ribbon index instead of the actual
|
||||||
// ribbon object...
|
// ribbon object...
|
||||||
getRibbonOrder: function(target){
|
getRibbonOrder: function(target){
|
||||||
return this.viewer.find('.ribbon').index(this.getRibbon(target))
|
return this.viewer.find(RIBBON).index(this.getRibbon(target))
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
@ -721,7 +726,7 @@ module.RibbonsPrototype = {
|
|||||||
ribbon = ribbon.length == 0 ? this.createRibbon(target) : ribbon
|
ribbon = ribbon.length == 0 ? this.createRibbon(target) : ribbon
|
||||||
var ribbon_set = this.getRibbonSet(true)
|
var ribbon_set = this.getRibbonSet(true)
|
||||||
|
|
||||||
var ribbons = this.viewer.find('.ribbon')
|
var ribbons = this.viewer.find(RIBBON)
|
||||||
|
|
||||||
// normalize the position...
|
// normalize the position...
|
||||||
if(typeof(position) == typeof(123)){
|
if(typeof(position) == typeof(123)){
|
||||||
@ -804,7 +809,7 @@ module.RibbonsPrototype = {
|
|||||||
}
|
}
|
||||||
var i = to
|
var i = to
|
||||||
var images = img[i > 0 ? 'last' : 'first']()
|
var images = img[i > 0 ? 'last' : 'first']()
|
||||||
[i > 0 ? 'nextAll' : 'prevAll']('.image')
|
[i > 0 ? 'nextAll' : 'prevAll'](IMAGE)
|
||||||
to = images.length > 0
|
to = images.length > 0
|
||||||
? images.eq(Math.min(Math.abs(i), images.length)-1)
|
? images.eq(Math.min(Math.abs(i), images.length)-1)
|
||||||
: img
|
: img
|
||||||
@ -826,7 +831,7 @@ module.RibbonsPrototype = {
|
|||||||
if(to[0] == img[0]){
|
if(to[0] == img[0]){
|
||||||
return img
|
return img
|
||||||
}
|
}
|
||||||
var images = to[mode]('.image')
|
var images = to[mode](IMAGE)
|
||||||
}
|
}
|
||||||
|
|
||||||
// place the image...
|
// place the image...
|
||||||
@ -836,9 +841,9 @@ module.RibbonsPrototype = {
|
|||||||
// after...
|
// after...
|
||||||
} else if(i > 0){
|
} else if(i > 0){
|
||||||
// XXX this stumbles on non-images...
|
// XXX this stumbles on non-images...
|
||||||
//to.next('.image')
|
//to.next(IMAGE)
|
||||||
// XXX is this fast enough??
|
// XXX is this fast enough??
|
||||||
to.nextAll('.image').first()
|
to.nextAll(IMAGE).first()
|
||||||
.before(img)
|
.before(img)
|
||||||
// before...
|
// before...
|
||||||
} else {
|
} else {
|
||||||
@ -904,7 +909,7 @@ module.RibbonsPrototype = {
|
|||||||
// XXX this depends on .images...
|
// XXX this depends on .images...
|
||||||
// ...a good candidate to move to images, but not yet sure...
|
// ...a good candidate to move to images, but not yet sure...
|
||||||
updateImage: function(image, gid, size, sync){
|
updateImage: function(image, gid, size, sync){
|
||||||
image = (image == '*' ? this.viewer.find('.image')
|
image = (image == '*' ? this.viewer.find(IMAGE)
|
||||||
: image == null
|
: image == null
|
||||||
|| typeof(image) == typeof('str') ? this.getImage(image)
|
|| typeof(image) == typeof('str') ? this.getImage(image)
|
||||||
: $(image))
|
: $(image))
|
||||||
@ -1050,7 +1055,7 @@ module.RibbonsPrototype = {
|
|||||||
r = this.placeRibbon(ribbon, this.viewer.find('.ribbon').length)
|
r = this.placeRibbon(ribbon, this.viewer.find('.ribbon').length)
|
||||||
}
|
}
|
||||||
|
|
||||||
var loaded = r.find('.image')
|
var loaded = r.find(IMAGE)
|
||||||
|
|
||||||
// compensate for new/removed images...
|
// compensate for new/removed images...
|
||||||
if(reference != null){
|
if(reference != null){
|
||||||
@ -1216,7 +1221,7 @@ module.RibbonsPrototype = {
|
|||||||
: data.ribbons != null ? Object.keys(data.ribbons)
|
: data.ribbons != null ? Object.keys(data.ribbons)
|
||||||
: []
|
: []
|
||||||
|
|
||||||
that.viewer.find('.ribbon').each(function(){
|
that.viewer.find(RIBBON).each(function(){
|
||||||
var r = $(this)
|
var r = $(this)
|
||||||
if(ribbons.indexOf(that.getElemGID(r)) < 0){
|
if(ribbons.indexOf(that.getElemGID(r)) < 0){
|
||||||
r.remove()
|
r.remove()
|
||||||
|
|||||||
@ -410,17 +410,31 @@ actions.Actions({
|
|||||||
|
|
||||||
// basic image editing...
|
// basic image editing...
|
||||||
//
|
//
|
||||||
// XXX these are not data stuff... should this be split into a
|
|
||||||
// separate images block???
|
|
||||||
// XXX should we have .rotate(..) and .flip(..) generic actions???
|
// XXX should we have .rotate(..) and .flip(..) generic actions???
|
||||||
rotateCW: [
|
rotateCW: [
|
||||||
function(){ }],
|
function(target){
|
||||||
|
if(this.images != null){
|
||||||
|
this.images.rotateImage(this.data.getImage(target), 'cw')
|
||||||
|
}
|
||||||
|
}],
|
||||||
rotateCCW: [
|
rotateCCW: [
|
||||||
function(){ }],
|
function(target){
|
||||||
|
if(this.images != null){
|
||||||
|
this.images.rotateImage(this.data.getImage(target), 'ccw')
|
||||||
|
}
|
||||||
|
}],
|
||||||
flipVertical: [
|
flipVertical: [
|
||||||
function(){ }],
|
function(target){
|
||||||
|
if(this.images != null){
|
||||||
|
this.images.flipImage(this.data.getImage(target), 'vertical')
|
||||||
|
}
|
||||||
|
}],
|
||||||
flipHorizontal: [
|
flipHorizontal: [
|
||||||
function(){ }],
|
function(target){
|
||||||
|
if(this.images != null){
|
||||||
|
this.images.flipImage(this.data.getImage(target), 'horizontal')
|
||||||
|
}
|
||||||
|
}],
|
||||||
|
|
||||||
|
|
||||||
// crop...
|
// crop...
|
||||||
@ -551,7 +565,7 @@ actions.Actions(Client, {
|
|||||||
: viewer
|
: viewer
|
||||||
|
|
||||||
if(this.ribbons == null){
|
if(this.ribbons == null){
|
||||||
this.ribbons = ribbons.Ribbons(viewer, data.images)
|
this.ribbons = ribbons.Ribbons(viewer, this.images)
|
||||||
}
|
}
|
||||||
|
|
||||||
this.reload()
|
this.reload()
|
||||||
@ -653,8 +667,14 @@ actions.Actions(Client, {
|
|||||||
.centerImage(gid)
|
.centerImage(gid)
|
||||||
.centerRibbon(gid)
|
.centerRibbon(gid)
|
||||||
|
|
||||||
|
// if we are going fast we might skip an update...
|
||||||
|
if(this._align_timeout != null){
|
||||||
|
clearTimeout(this._align_timeout)
|
||||||
|
this._align_timeout = null
|
||||||
|
}
|
||||||
var that = this
|
var that = this
|
||||||
//setTimeout(function(){
|
this._align_timeout = setTimeout(function(){
|
||||||
|
this._align_timeout = null
|
||||||
// align other ribbons...
|
// align other ribbons...
|
||||||
var ribbon = data.getRibbon(gid)
|
var ribbon = data.getRibbon(gid)
|
||||||
for(var r in data.ribbons){
|
for(var r in data.ribbons){
|
||||||
@ -663,7 +683,7 @@ actions.Actions(Client, {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
// XXX skip off-screen ribbons...
|
// XXX skip off-screen ribbons... (???)
|
||||||
|
|
||||||
// center...
|
// center...
|
||||||
// XXX is there a 'last' special case here???
|
// XXX is there a 'last' special case here???
|
||||||
@ -679,7 +699,7 @@ actions.Actions(Client, {
|
|||||||
that.centerImage(t, 'after')
|
that.centerImage(t, 'after')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//}, 10)
|
}, 50)
|
||||||
}],
|
}],
|
||||||
// XXX these should also affect up/down navigation...
|
// XXX these should also affect up/down navigation...
|
||||||
// ...navigate by proximity (closest to center) rather than by
|
// ...navigate by proximity (closest to center) rather than by
|
||||||
@ -1075,8 +1095,8 @@ var PartialRibbonsActions = actions.Actions({
|
|||||||
|| 1) * w
|
|| 1) * w
|
||||||
|
|
||||||
// next/prev loaded...
|
// next/prev loaded...
|
||||||
var nl = this.ribbons.getImage(target).nextAll('.image').length
|
var nl = this.ribbons.getImage(target).nextAll('.image:not(.clone)').length
|
||||||
var pl = this.ribbons.getImage(target).prevAll('.image').length
|
var pl = this.ribbons.getImage(target).prevAll('.image:not(.clone)').length
|
||||||
|
|
||||||
// next/prev available...
|
// next/prev available...
|
||||||
var na = this.data.getImages(target, size/2, 'after').length - 1
|
var na = this.data.getImages(target, size/2, 'after').length - 1
|
||||||
@ -1287,7 +1307,7 @@ module.SingleImageView = Feature({
|
|||||||
|
|
||||||
// ribbon mode -- restore original image size...
|
// ribbon mode -- restore original image size...
|
||||||
} else {
|
} else {
|
||||||
this.ribbons.viewer.find('.image').css({
|
this.ribbons.viewer.find('.image:not(.clone)').css({
|
||||||
width: '',
|
width: '',
|
||||||
height: ''
|
height: ''
|
||||||
})
|
})
|
||||||
@ -1519,7 +1539,7 @@ var CurrentImageIndicatorActions = actions.Actions({
|
|||||||
// get marker globally...
|
// get marker globally...
|
||||||
marker = this.ribbons.viewer.find('.current-marker')
|
marker = this.ribbons.viewer.find('.current-marker')
|
||||||
|
|
||||||
// create a marker...
|
// no marker exists -- create a marker...
|
||||||
if(marker.length == 0){
|
if(marker.length == 0){
|
||||||
var marker = $('<div/>')
|
var marker = $('<div/>')
|
||||||
.addClass('current-marker '+ this.tag)
|
.addClass('current-marker '+ this.tag)
|
||||||
@ -1610,7 +1630,8 @@ module.CurrentImageIndicator = Feature({
|
|||||||
['resizeRibbon.post',
|
['resizeRibbon.post',
|
||||||
function(target, s){
|
function(target, s){
|
||||||
var m = this.ribbons.viewer.find('.current-marker')
|
var m = this.ribbons.viewer.find('.current-marker')
|
||||||
if(m.length != 0){
|
// only update if marker exists and we are in current ribbon...
|
||||||
|
if(m.length != 0 && this.currentRibbon == this.data.getRibbon(target)){
|
||||||
this.ribbons.preventTransitions(m)
|
this.ribbons.preventTransitions(m)
|
||||||
this.updateCurrentImageIndicator(target, false)
|
this.updateCurrentImageIndicator(target, false)
|
||||||
this.ribbons.restoreTransitions(m, true)
|
this.ribbons.restoreTransitions(m, true)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user