mirror of
https://github.com/flynx/ImageGrid.git
synced 2025-10-29 10:20:08 +00:00
still experementing + bugfix...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
parent
80505f1563
commit
fa1b7312ba
@ -60,6 +60,16 @@ VALUE.prototype.hook = function(elem, prop){
|
|||||||
&& elem.setAttribute(prop, this.value) }
|
&& elem.setAttribute(prop, this.value) }
|
||||||
|
|
||||||
|
|
||||||
|
function PREVIEW(ig, gid, url){
|
||||||
|
this.ig = ig
|
||||||
|
this.gid = gid
|
||||||
|
this.url = url
|
||||||
|
}
|
||||||
|
PREVIEW.prototype.hook = function(elem, prop){
|
||||||
|
this.ig.ribbons._loadImagePreviewURL(elem, this.url)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------
|
//---------------------------------------------------------------------
|
||||||
|
|
||||||
var VirtualDOMRibbonsClassPrototype = {
|
var VirtualDOMRibbonsClassPrototype = {
|
||||||
@ -103,8 +113,9 @@ var VirtualDOMRibbonsPrototype = {
|
|||||||
|
|
||||||
// constructors...
|
// constructors...
|
||||||
// XXX should these be here or be stateless and in VirtualDOMRibbonsClassPrototype???
|
// XXX should these be here or be stateless and in VirtualDOMRibbonsClassPrototype???
|
||||||
// XXX Q: do we need to set align target and current image separately...
|
|
||||||
makeView: function(state){
|
makeView: function(state){
|
||||||
|
state = state || {}
|
||||||
|
var that = this
|
||||||
var ig = this.imagegrid
|
var ig = this.imagegrid
|
||||||
|
|
||||||
var target = state.target || ig.current
|
var target = state.target || ig.current
|
||||||
@ -123,7 +134,7 @@ var VirtualDOMRibbonsPrototype = {
|
|||||||
|
|
||||||
var ribbons = data.ribbon_order
|
var ribbons = data.ribbon_order
|
||||||
.map(function(gid){
|
.map(function(gid){
|
||||||
return this.makeRibbon(gid, count, target) })
|
return that.makeRibbon(gid, count, state) })
|
||||||
|
|
||||||
return vdom.h('div.ribbon-set', {
|
return vdom.h('div.ribbon-set', {
|
||||||
key: 'ribbon-set',
|
key: 'ribbon-set',
|
||||||
@ -141,37 +152,44 @@ var VirtualDOMRibbonsPrototype = {
|
|||||||
ribbons)
|
ribbons)
|
||||||
])
|
])
|
||||||
},
|
},
|
||||||
// XXX calc offset (y)...
|
// XXX calc offset (x)...
|
||||||
// XXX should we setup handlers here???
|
// XXX should we setup handlers here???
|
||||||
makeRibbon: function(gid, count, state){
|
makeRibbon: function(gid, count, state){
|
||||||
|
state = state || {}
|
||||||
|
var that = this
|
||||||
var ig = this.imagegrid
|
var ig = this.imagegrid
|
||||||
var data = ig.data
|
var data = ig.data
|
||||||
var images = ig.images
|
var images = ig.images
|
||||||
|
var base = data.base == gid ? '.base' : ''
|
||||||
var imgs = []
|
var imgs = []
|
||||||
|
|
||||||
var x = state.ribbons && state.ribbons[gid]
|
this.state = this.state || {}
|
||||||
x = x || (this.state.ribbons && this.state.ribbons[gid])
|
|
||||||
x = x || 0
|
|
||||||
this.state.ribbons = this.state.ribbons || {}
|
this.state.ribbons = this.state.ribbons || {}
|
||||||
this.state.ribbons[gid] = x
|
|
||||||
|
var x = this.state.ribbons[gid] =
|
||||||
|
(state.ribbons && state.ribbons[gid])
|
||||||
|
|| this.state.ribbons[gid]
|
||||||
|
// XXX calculate new offset...
|
||||||
|
|| parseFloat(ig.ribbons.getRibbon(gid).transform('x'))
|
||||||
|
|
||||||
data.getImages(gid, count, 'total')
|
data.getImages(gid, count, 'total')
|
||||||
.forEach(function(gid){
|
.forEach(function(gid){
|
||||||
imgs.push(this.makeImage(gid))
|
imgs.push(that.makeImage(gid))
|
||||||
|
|
||||||
this.makeImageMarks(gid)
|
that.makeImageMarks(gid)
|
||||||
.forEach(function(mark){
|
.forEach(function(mark){
|
||||||
imgs.push(mark) })
|
imgs.push(mark) })
|
||||||
})
|
})
|
||||||
|
|
||||||
return vdom.h('div.ribbon', {
|
return vdom.h('div.ribbon'+base, {
|
||||||
key: 'ribbon-'+gid,
|
key: 'ribbon-'+gid,
|
||||||
|
|
||||||
gid: new GID(gid),
|
|
||||||
|
|
||||||
// XXX events, hammer, ...???
|
// XXX events, hammer, ...???
|
||||||
|
|
||||||
|
attributes: {
|
||||||
|
gid: JSON.stringify(gid)
|
||||||
|
.replace(/^"(.*)"$/g, '$1'),
|
||||||
|
},
|
||||||
style: {
|
style: {
|
||||||
transform: 'translate3d('+ x +'vmin, 0px, 0px)',
|
transform: 'translate3d('+ x +'vmin, 0px, 0px)',
|
||||||
},
|
},
|
||||||
@ -179,67 +197,99 @@ var VirtualDOMRibbonsPrototype = {
|
|||||||
imgs)
|
imgs)
|
||||||
},
|
},
|
||||||
// NOTE: at this point this does not account for previews at all...
|
// NOTE: at this point this does not account for previews at all...
|
||||||
// XXX handle previews -- hook???
|
makeImage: function(gid, size){
|
||||||
makeImage: function(gid){
|
var ig = this.imagegrid
|
||||||
|
size = this.state.tile_size = size
|
||||||
|
|| this.state.tile_size
|
||||||
|
|| ig.ribbons.getVisibleImageSize('max')
|
||||||
var data = this.imagegrid.data
|
var data = this.imagegrid.data
|
||||||
var images = this.imagegrid.images || {}
|
var images = this.imagegrid.images || {}
|
||||||
|
|
||||||
var image = images[gid] || {}
|
|
||||||
var current = data.current == gid ? '.current' : ''
|
var current = data.current == gid ? '.current' : ''
|
||||||
|
|
||||||
// XXX stuff needed to get a preview:
|
var image = images[gid] || {}
|
||||||
// - image tile size -- .ribbons.getVisibleImageSize(..)
|
var seen = []
|
||||||
// - preview url -- .ribbons.getBestPreview(..)
|
while(image.type == 'group'){
|
||||||
// - actual preview size -- w and h
|
// error, recursive group...
|
||||||
// XXX need a strategy on how to update images...
|
if(seen.indexOf(image.id) >= 0){
|
||||||
|
image = images.IMAGE_DATA
|
||||||
|
console.error('Recursive group:', gid)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
seen.push(image.id)
|
||||||
|
|
||||||
|
image = that.images[image.cover]
|
||||||
|
}
|
||||||
|
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,
|
||||||
|
|
||||||
gid: new GID(gid),
|
attributes: {
|
||||||
|
gid: JSON.stringify(gid)
|
||||||
|
.replace(/^"(.*)"$/g, '$1'),
|
||||||
|
orientation: image.orientation,
|
||||||
|
flipped: image.flipped,
|
||||||
|
|
||||||
orientation: new VALUE(image.orientation),
|
//'preview-width': w,
|
||||||
flipped: new VALUE(image.flipped),
|
//'preview-height': h,
|
||||||
|
},
|
||||||
// XXX preview stuff...
|
style: {
|
||||||
//'preview-width': new VALUE(w),
|
backgroundImage: 'url("'+ url +'")',
|
||||||
//'preview-height': new VALUE(h),
|
}
|
||||||
//style: {
|
|
||||||
// backgroundImage: 'url('+ url +')',
|
|
||||||
//}
|
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
// XXX get marks...
|
// XXX get marks...
|
||||||
makeImageMarks: function(gid){
|
makeImageMarks: function(gid){
|
||||||
// XXX get marks...
|
var that = this
|
||||||
var marks = []
|
var marks = []
|
||||||
|
var tags = this.imagegrid.data.getTags(gid)
|
||||||
|
|
||||||
|
// XXX STUB: make this extensible...
|
||||||
|
tags.indexOf('bookmark') >= 0
|
||||||
|
&& marks.push('bookmark')
|
||||||
|
tags.indexOf('selected') >= 0
|
||||||
|
&& marks.push('selected')
|
||||||
|
|
||||||
return marks
|
return marks
|
||||||
.map(function(type){
|
.map(function(type){
|
||||||
return makeImageMark(gid, type) })
|
return that.makeImageMark(gid, type) })
|
||||||
},
|
},
|
||||||
makeImageMark: function(gid, type){
|
makeImageMark: function(gid, type){
|
||||||
return vdom.h('div.mark'+(type || ''), {
|
return vdom.h('div.mark.'+(type || ''), {
|
||||||
key: 'mark-'+gid,
|
key: 'mark-'+gid,
|
||||||
gid: new GID(gid),
|
attributes: {
|
||||||
|
gid: JSON.stringify(gid)
|
||||||
|
.replace(/^"(.*)"$/g, '$1'),
|
||||||
|
},
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
// XXX add ability to hook in things like current image marker...
|
||||||
|
|
||||||
|
|
||||||
// XXX Q: do we actually need to align things here???
|
// XXX update .state...
|
||||||
// ...intuitively, yes, on the other hand (in the static case)
|
update: function(){
|
||||||
// we just need to load in the same image alignment as current,
|
|
||||||
// but this might require us to hook into the construction
|
|
||||||
// process to add alignment in the last moment...
|
|
||||||
// ...an alternative (no) approach would require to overload not
|
|
||||||
// just .updateRibbon(..) but also .centerRibbon(..) / .centerImage(..)
|
|
||||||
// and friends...
|
|
||||||
update: function(target, count, scale){
|
|
||||||
this.vdom = this.makeView(target, count, scale)
|
|
||||||
},
|
},
|
||||||
// XXX sync .vdom to DOM...
|
// NOTE: virtual-dom architecture is designed around a fast-render-on-demand
|
||||||
|
// concept, so we build the state on demand...
|
||||||
sync: function(){
|
sync: function(){
|
||||||
// XXX
|
var dom = this.dom = this.dom || this.imagegrid.ribbons.getRibbonSet()
|
||||||
|
|
||||||
|
// build initial state...
|
||||||
|
if(this.vdom == null){
|
||||||
|
var n = this.vdom = this.makeView(this.state || {})
|
||||||
|
var v = vdom.create(n)
|
||||||
|
dom.replaceWith(v)
|
||||||
|
this.dom = v
|
||||||
|
|
||||||
|
// patch state...
|
||||||
|
} else {
|
||||||
|
var n = this.makeView(this.state || {})
|
||||||
|
vdom.patch(dom, vdom.diff(this.vdom, n))
|
||||||
|
this.vdom = n
|
||||||
|
}
|
||||||
|
|
||||||
|
return this
|
||||||
},
|
},
|
||||||
|
|
||||||
__init__: function(imagegrid){
|
__init__: function(imagegrid){
|
||||||
|
|||||||
@ -927,13 +927,16 @@ var DataPrototype = {
|
|||||||
|
|
||||||
// NOTE: list can be null if we got an image gid or ribbon order...
|
// NOTE: list can be null if we got an image gid or ribbon order...
|
||||||
// get the ribbon gids...
|
// get the ribbon gids...
|
||||||
list = list || this.ribbons[this.getRibbon(target)] || []
|
list = list
|
||||||
|
|| this.ribbons[this.getRibbon(target)]
|
||||||
|
|| []
|
||||||
|
|
||||||
if(count == null){
|
if(count == null){
|
||||||
return list.compact()
|
return list.compact()
|
||||||
}
|
}
|
||||||
|
|
||||||
target = this.getImage(target)
|
target = this.getImage(target)
|
||||||
|
|| this.getImage(target, 'after')
|
||||||
var i = list.indexOf(target)
|
var i = list.indexOf(target)
|
||||||
|
|
||||||
// prepare to slice the list...
|
// prepare to slice the list...
|
||||||
|
|||||||
@ -1323,7 +1323,6 @@ var RibbonsPrototype = {
|
|||||||
// collect marks...
|
// collect marks...
|
||||||
image.after(this.getImageMarks(gid))
|
image.after(this.getImageMarks(gid))
|
||||||
|
|
||||||
|
|
||||||
if(this.__image_updaters != null){
|
if(this.__image_updaters != null){
|
||||||
this.__image_updaters.forEach(function(update){
|
this.__image_updaters.forEach(function(update){
|
||||||
update(gid, image)
|
update(gid, image)
|
||||||
@ -1338,10 +1337,9 @@ var RibbonsPrototype = {
|
|||||||
// pre-cache and load image...
|
// pre-cache and load image...
|
||||||
// NOTE: this will make images load without a blackout...
|
// NOTE: this will make images load without a blackout...
|
||||||
var img = new Image()
|
var img = new Image()
|
||||||
|
var i = image instanceof jQuery ? image[0] : image
|
||||||
img.onload = function(){
|
img.onload = function(){
|
||||||
var i = image[0]
|
|
||||||
i.style.backgroundImage = 'url("'+ url +'")',
|
i.style.backgroundImage = 'url("'+ url +'")',
|
||||||
|
|
||||||
// NOTE: these do not account for rotation...
|
// NOTE: these do not account for rotation...
|
||||||
i.setAttribute('preview-width', img.width)
|
i.setAttribute('preview-width', img.width)
|
||||||
i.setAttribute('preview-height', img.height)
|
i.setAttribute('preview-height', img.height)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user