different marks architecture, a bit more complext to play with but allot more flexible (bugs expected)...

Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
Alex A. Naanou 2013-12-04 23:18:23 +04:00
parent 312e0c700d
commit 088d4201d4
6 changed files with 262 additions and 68 deletions

View File

@ -1101,6 +1101,7 @@ function convertDataGen1(data, cmp){
* Loaders * Loaders
*/ */
function updateImageIndicators(gid, image){ function updateImageIndicators(gid, image){
gid = gid == null ? getImageGID() : gid gid = gid == null ? getImageGID() : gid
image = image == null ? getImage() : $(image) image = image == null ? getImage() : $(image)
@ -1108,8 +1109,12 @@ function updateImageIndicators(gid, image){
// marks... // marks...
if(MARKED.indexOf(gid) != -1){ if(MARKED.indexOf(gid) != -1){
image.addClass('marked') image.addClass('marked')
// XXX
_addMark('selected', gid, image)
} else { } else {
image.removeClass('marked') image.removeClass('marked')
// XXX
_removeMark('selected', gid, image)
} }
return image return image
@ -1138,14 +1143,19 @@ function _loadImagePreviewURL(image, url){
// may leak to newly loaded images... // may leak to newly loaded images...
// XXX do a pre-caching framework... // XXX do a pre-caching framework...
function updateImage(image, gid, size, sync){ function updateImage(image, gid, size, sync){
image = image == null ? getImage() : $(image)
sync = sync == null ? SYNC_IMG_LOADER : sync sync = sync == null ? SYNC_IMG_LOADER : sync
image = $(image)
var oldgid = getImageGID(image) var oldgid = getImageGID(image)
if(oldgid == gid || gid == null){ if(oldgid == gid || gid == null){
gid = oldgid gid = oldgid
} else { } else {
// remove old marks...
if(typeof(oldgid) == typeof('str')){
getImageMarks(oldgid).remove()
}
// reset gid...
image image
.attr('gid', JSON.stringify(gid)) .attr('gid', JSON.stringify(gid))
.css({ .css({

View File

@ -161,6 +161,7 @@
border: dotted blue 5px; border: dotted blue 5px;
} }
.mark.tagged,
.mark.blue, .mark.blue,
.mark.red, .mark.red,
.mark.yellow { .mark.yellow {
@ -168,8 +169,8 @@
margin-left: 0px; margin-left: 0px;
border: none; border: none;
box-sizing: border-box; box-sizing: border-box;
} }
.mark.tagged:after,
.mark.blue:after, .mark.blue:after,
.mark.red:after, .mark.red:after,
.mark.yellow:after { .mark.yellow:after {
@ -194,6 +195,16 @@
border-radius: 50%; border-radius: 50%;
} }
.mark.tagged:after {
box-shadow: none;
text-shadow: black 0.1em 0.1em 0.4em, black 0.1em 0.1em;
font-size: 10pt;
vertical-align: middle;
text-align: center;
content: "T";
color: white;
background: none;
}
.mark.blue:after { .mark.blue:after {
left: -25px; left: -25px;
border: solid 3px blue; border: solid 3px blue;
@ -208,6 +219,23 @@
background: yellow; background: yellow;
} }
.ccw270,
.cw90 {
-webkit-transform: rotate(90deg);
}
.ccw180,
.cw180 {
-webkit-transform: rotate(180deg);
}
.ccw90,
.cw270 {
-webkit-transform: rotate(270deg);
}
.ccw0,
.cw0 {
-webkit-transform: rotate(0deg);
}
</style> </style>
<script src="jquery.js"></script> <script src="jquery.js"></script>
@ -264,7 +292,7 @@
<div id="0" class="image2" style="background-image: url(image.jpg)"></div> <div id="0" class="image2" style="background-image: url(image.jpg)"></div>
<div class="mark red"></div> <div class="mark red"></div>
<div id="1" class="current image2" style="background-image: url(image.jpg)"></div> <div id="1" class="current image2 cw180" style="background-image: url(image.jpg)"></div>
<div class="mark"></div> <div class="mark"></div>
<div class="mark blue" title="blue"></div> <div class="mark blue" title="blue"></div>
<div class="mark red" title="red"></div> <div class="mark red" title="red"></div>
@ -272,6 +300,7 @@
<div id="2" class="image2" style="background-image: url(image.jpg)"></div> <div id="2" class="image2" style="background-image: url(image.jpg)"></div>
<div class="mark select"></div> <div class="mark select"></div>
<div class="mark tagged" title="tagged"></div>
</div> </div>
</details> </details>

View File

@ -224,7 +224,7 @@ button:hover {
height: 20px; height: 20px;
margin-top: -20px; margin-top: -20px;
text-align: center; text-align: center;
vertical-align: center; vertical-align: middle;
font-size: 18px; font-size: 18px;
font-weight: bold; font-weight: bold;
color: silver; color: silver;
@ -270,6 +270,7 @@ button:hover {
/*********************************************************** Image ***/ /*********************************************************** Image ***/
.marker, .marker,
.current-marker, .current-marker,
.mark,
.image { .image {
position: relative; position: relative;
display: inline-block; display: inline-block;
@ -495,63 +496,64 @@ button:hover {
opacity: 0.5; opacity: 0.5;
} }
*/ */
/*
.marks-visible.viewer .marked.image:after { .marks-visible.viewer .marked.image:after {
display: block; display: block;
position: absolute; position: absolute;
content: ""; content: "";
font-size: 0pt; font-size: 0pt;
border: none; border: none;
width: 10px;
height: 10px;
top: auto;
bottom: 5px;
left: auto;
right: 5px;
border-radius: 50%;
background: blue;
/* make the mark stand out if it is over an image with similar
color/density */
box-shadow: 0px 0px 7px 0px black; width: @ribbon-mark-size;
/*border: solid 1px white;*/ height: @ribbon-mark-size;
/*border: solid 1px black;*/ top: auto;
bottom: @ribbon-mark-offset;
left: auto;
right: @ribbon-mark-offset;
border-radius: 50%;
background: blue;
box-shadow: 0px 0px 7px 0px black;
} }
.marks-visible.viewer .marked.image[orientation="270"][flipped*="vertical"][flipped*="horizontal"]:after, .marks-visible.viewer .marked.image[orientation="270"][flipped*="vertical"][flipped*="horizontal"]:after,
.marks-visible.viewer .marked.image:not([orientation])[flipped*="vertical"]:after, .marks-visible.viewer .marked.image:not([orientation])[flipped*="vertical"]:after,
.marks-visible.viewer .marked.image[orientation="0"][flipped*="vertical"]:after, .marks-visible.viewer .marked.image[orientation="0"][flipped*="vertical"]:after,
.marks-visible.viewer .marked.image[orientation="180"][flipped="horizontal"]:after, .marks-visible.viewer .marked.image[orientation="180"][flipped="horizontal"]:after,
.marks-visible.viewer .marked.image[orientation="90"]:not([flipped]):after { .marks-visible.viewer .marked.image[orientation="90"]:not([flipped]):after {
top: 5px; top: @ribbon-mark-offset;
bottom: auto: bottom: auto;
left: auto; left: auto;
right: 5px; right: @ribbon-mark-offset;
} }
.marks-visible.viewer .marked.image:not([orientation])[flipped*="vertical"][flipped*="horizontal"]:after, .marks-visible.viewer .marked.image:not([orientation])[flipped*="vertical"][flipped*="horizontal"]:after,
.marks-visible.viewer .marked.image[orientation="0"][flipped*="vertical"][flipped*="horizontal"]:after, .marks-visible.viewer .marked.image[orientation="0"][flipped*="vertical"][flipped*="horizontal"]:after,
.marks-visible.viewer .marked.image[orientation="270"][flipped="vertical"]:after, .marks-visible.viewer .marked.image[orientation="270"][flipped="vertical"]:after,
.marks-visible.viewer .marked.image[orientation="90"][flipped="horizontal"]:after, .marks-visible.viewer .marked.image[orientation="90"][flipped="horizontal"]:after,
.marks-visible.viewer .marked.image[orientation="180"]:not([flipped]):after { .marks-visible.viewer .marked.image[orientation="180"]:not([flipped]):after {
top: 5px; top: @ribbon-mark-offset;
bottom: auto; bottom: auto;
left: 5px; left: @ribbon-mark-offset;
right: auto; right: auto;
} }
.marks-visible.viewer .marked.image[orientation="90"][flipped*="vertical"][flipped*="horizontal"]:after, .marks-visible.viewer .marked.image[orientation="90"][flipped*="vertical"][flipped*="horizontal"]:after,
.marks-visible.viewer .marked.image[orientation="180"][flipped="vertical"]:after, .marks-visible.viewer .marked.image[orientation="180"][flipped="vertical"]:after,
.marks-visible.viewer .marked.image:not([orientation])[flipped*="horizontal"]:after, .marks-visible.viewer .marked.image:not([orientation])[flipped*="horizontal"]:after,
.marks-visible.viewer .marked.image[orientation="0"][flipped*="horizontal"]:after, .marks-visible.viewer .marked.image[orientation="0"][flipped*="horizontal"]:after,
.marks-visible.viewer .marked.image[orientation="270"]:not([flipped]):after { .marks-visible.viewer .marked.image[orientation="270"]:not([flipped]):after {
top: auto; top: auto;
bottom: 5px; bottom: @ribbon-mark-offset;
left: 5px; left: @ribbon-mark-offset;
right: auto; right: auto;
} }
*/
/* NOTE: we use a different mark representation for single image mode... */ /* NOTE: we use a different mark representation for single image mode... */
/*
.marks-visible.single-image-mode.viewer .marked.image:after { .marks-visible.single-image-mode.viewer .marked.image:after {
display: none; display: none;
} }
*/
/* corner mark... (a-la bookmarks in PortableMag) /* corner mark... (a-la bookmarks in PortableMag)
* XXX account for flipping... */ * XXX account for flipping... */
/* /*
@ -586,12 +588,48 @@ button:hover {
bottom: @ribbon-mark-offset; bottom: @ribbon-mark-offset;
right: @ribbon-mark-offset; right: @ribbon-mark-offset;
} }
/
/* XXX should we use opacity??? */
.marked-only-view.viewer:not(.marks-visible) .image:not(.marked) { .marked-only-view.viewer:not(.marks-visible) .image:not(.marked) {
opacity: 0.3; opacity: 0.3;
}
*/
/* new gen marks... */
.mark {
/* this fully covers the image to simplify positioning of actual marks */
margin-left: -300px;
border: none;
}
.viewer:not(.marks-visible) .mark {
display: none;
}
.mark.selected {
width: 0px;
margin-left: 0px;
border: none;
overflow: visible;
}
.mark.selected:after {
display: block;
position: absolute;
content: "";
font-size: 0pt;
border: none;
width: 5px;
height: 5px;
top: auto;
bottom: 10px;
left: auto;
right: 10px;
box-shadow: 2px 2px 20px -2px rgba(0, 0, 0, 0.7);
box-sizing: border-box;
border-radius: 50%;
background: blue;
left: -15;
}
.marks-visible.single-image-mode.viewer .mark:after {
display: none;
} }
/****************************************************** Image info ***/ /****************************************************** Image info ***/
.inline-image-info { .inline-image-info {
@ -959,7 +997,7 @@ button:hover {
.global-mode-indicators > *, .global-mode-indicators > *,
.context-mode-indicators > * { .context-mode-indicators > * {
font-size: small; font-size: small;
vertical-align: center; vertical-align: middle;
margin-left: 10px; margin-left: 10px;
} }
.global-mode-indicators .circle, .global-mode-indicators .circle,
@ -986,7 +1024,7 @@ button:hover {
.context-mode-indicators .indicator { .context-mode-indicators .indicator {
display: none; display: none;
height: 20px; height: 20px;
vertical-align: center; vertical-align: middle;
} }
/* actual indicators */ /* actual indicators */
/* marks... */ /* marks... */
@ -1143,9 +1181,10 @@ button:hover {
.dark.viewer .ribbon-indicator:hover:after { .dark.viewer .ribbon-indicator:hover:after {
opacity: 0.8; opacity: 0.8;
} }
.large.viewer:not(.single-image-mode) .current.image { .large.viewer:not(.single-image-mode) .current-marker {
border-width: 3px; border-width: 2px;
} }
.large.viewer:not(.single-image-mode) .mark:after,
.large.viewer:not(.single-image-mode) .marked.image:after { .large.viewer:not(.single-image-mode) .marked.image:after {
-webkit-transform: rotate(0deg) scaleY(0.7) scaleX(0.7); -webkit-transform: rotate(0deg) scaleY(0.7) scaleX(0.7);
-moz-transform: rotate(0deg) scaleY(0.7) scaleX(0.7); -moz-transform: rotate(0deg) scaleY(0.7) scaleX(0.7);
@ -1153,6 +1192,7 @@ button:hover {
-ms-transform: rotate(0deg) scaleY(0.7) scaleX(0.7); -ms-transform: rotate(0deg) scaleY(0.7) scaleX(0.7);
transform: rotate(0deg) scaleY(0.7) scaleX(0.7); transform: rotate(0deg) scaleY(0.7) scaleX(0.7);
} }
.small.viewer:not(.single-image-mode) .mark:after,
.small.viewer:not(.single-image-mode) .marked.image:after { .small.viewer:not(.single-image-mode) .marked.image:after {
-webkit-transform: rotate(0deg) scaleY(1.8) scaleX(1.8); -webkit-transform: rotate(0deg) scaleY(1.8) scaleX(1.8);
-moz-transform: rotate(0deg) scaleY(1.8) scaleX(1.8); -moz-transform: rotate(0deg) scaleY(1.8) scaleX(1.8);
@ -1163,8 +1203,8 @@ button:hover {
/********************************************************* Overlay ***/ /********************************************************* Overlay ***/
.overlay-block { .overlay-block {
display: none; display: none;
position: absolute: position: absolute;
top: 0px; top: 0px;
left: 0px; left: 0px;
height: 100%; height: 100%;
width: 100%; width: 100%;
@ -1237,7 +1277,7 @@ button:hover {
border-radius: 3px; border-radius: 3px;
background: gray; background: gray;
padding: 20px; padding: 20px;
vertical-align: center; vertical-align: middle;
box-shadow: 0px 5px 50px 0px black; box-shadow: 0px 5px 50px 0px black;
} }
/* tables in dialogs... */ /* tables in dialogs... */

View File

@ -4,6 +4,8 @@
/******************************************************** Settings ***/ /******************************************************** Settings ***/
@image-tile-size: 300px;
@ribbon-mark-offset: 5px; @ribbon-mark-offset: 5px;
@ribbon-mark-size: 10px; @ribbon-mark-size: 10px;
@ -318,7 +320,7 @@ button:hover {
margin-top: -20px; margin-top: -20px;
text-align: center; text-align: center;
vertical-align: center; vertical-align: middle;
font-size: 18px; font-size: 18px;
font-weight: bold; font-weight: bold;
@ -375,13 +377,14 @@ button:hover {
/*********************************************************** Image ***/ /*********************************************************** Image ***/
.marker, .marker,
.current-marker, .current-marker,
.mark,
.image { .image {
position: relative; position: relative;
display: inline-block; display: inline-block;
vertical-align: middle; vertical-align: middle;
text-align:left; text-align:left;
width: 300px; width: @image-tile-size;
height: 300px; height: @image-tile-size;
font-size: 12pt; font-size: 12pt;
overflow: hidden; overflow: hidden;
@ -560,6 +563,7 @@ button:hover {
} }
*/ */
/*
.marks-visible.viewer .marked.image:after { .marks-visible.viewer .marked.image:after {
display: block; display: block;
position: absolute; position: absolute;
@ -578,11 +582,7 @@ button:hover {
border-radius: 50%; border-radius: 50%;
background: blue; background: blue;
/* make the mark stand out if it is over an image with similar
color/density */
box-shadow: 0px 0px 7px 0px black; box-shadow: 0px 0px 7px 0px black;
/*border: solid 1px white;*/
/*border: solid 1px black;*/
} }
.marks-visible.viewer .marked.image[orientation="270"][flipped*="vertical"][flipped*="horizontal"]:after, .marks-visible.viewer .marked.image[orientation="270"][flipped*="vertical"][flipped*="horizontal"]:after,
.marks-visible.viewer .marked.image:not([orientation])[flipped*="vertical"]:after, .marks-visible.viewer .marked.image:not([orientation])[flipped*="vertical"]:after,
@ -590,7 +590,7 @@ button:hover {
.marks-visible.viewer .marked.image[orientation="180"][flipped="horizontal"]:after, .marks-visible.viewer .marked.image[orientation="180"][flipped="horizontal"]:after,
.marks-visible.viewer .marked.image[orientation="90"]:not([flipped]):after { .marks-visible.viewer .marked.image[orientation="90"]:not([flipped]):after {
top: @ribbon-mark-offset; top: @ribbon-mark-offset;
bottom: auto: bottom: auto;
left: auto; left: auto;
right: @ribbon-mark-offset; right: @ribbon-mark-offset;
} }
@ -614,11 +614,14 @@ button:hover {
left: @ribbon-mark-offset; left: @ribbon-mark-offset;
right: auto; right: auto;
} }
*/
/* NOTE: we use a different mark representation for single image mode... */ /* NOTE: we use a different mark representation for single image mode... */
/*
.marks-visible.single-image-mode.viewer .marked.image:after { .marks-visible.single-image-mode.viewer .marked.image:after {
display: none; display: none;
} }
*/
/* corner mark... (a-la bookmarks in PortableMag) /* corner mark... (a-la bookmarks in PortableMag)
@ -655,13 +658,59 @@ button:hover {
bottom: @ribbon-mark-offset; bottom: @ribbon-mark-offset;
right: @ribbon-mark-offset; right: @ribbon-mark-offset;
} }
/
/* XXX should we use opacity??? */
.marked-only-view.viewer:not(.marks-visible) .image:not(.marked) { .marked-only-view.viewer:not(.marks-visible) .image:not(.marked) {
opacity: 0.3; opacity: 0.3;
} }
*/
/* new gen marks... */
.mark {
/* this fully covers the image to simplify positioning of actual marks */
margin-left: -@image-tile-size;
border: none;
}
.viewer:not(.marks-visible) .mark {
display: none;
}
.mark.selected {
width: 0px;
margin-left: 0px;
border: none;
overflow: visible;
}
.mark.selected:after {
display: block;
position: absolute;
content: "";
font-size: 0pt;
border: none;
width: 5px;
height: 5px;
top: auto;
bottom: 10px;
left: auto;
right: 10px;
box-shadow: 2px 2px 20px -2px rgba(0,0,0,0.7);
box-sizing: border-box;
border-radius: 50%;
background: blue;
left: -15;
}
.marks-visible.single-image-mode.viewer .mark:after {
display: none;
}
@ -941,7 +990,7 @@ button:hover {
position: absolute; position: absolute;
height: 20px; height: 20px;
width: auto; width: auto;
min-width: 300px; min-width: @image-tile-size;
text-align: right; text-align: right;
color: transparent; color: transparent;
@ -971,7 +1020,7 @@ button:hover {
.global-mode-indicators > *, .global-mode-indicators > *,
.context-mode-indicators > * { .context-mode-indicators > * {
font-size: small; font-size: small;
vertical-align: center; vertical-align: middle;
margin-left: 10px; margin-left: 10px;
} }
@ -1001,7 +1050,7 @@ button:hover {
.context-mode-indicators .indicator { .context-mode-indicators .indicator {
display: none; display: none;
height: 20px; height: 20px;
vertical-align: center; vertical-align: middle;
} }
@ -1182,13 +1231,15 @@ button:hover {
.large.viewer:not(.single-image-mode) .current.image { .large.viewer:not(.single-image-mode) .current-marker {
border-width: 3px; border-width: 2px;
} }
.large.viewer:not(.single-image-mode) .mark:after,
.large.viewer:not(.single-image-mode) .marked.image:after { .large.viewer:not(.single-image-mode) .marked.image:after {
.scale(0.7); .scale(0.7);
} }
.small.viewer:not(.single-image-mode) .mark:after,
.small.viewer:not(.single-image-mode) .marked.image:after { .small.viewer:not(.single-image-mode) .marked.image:after {
.scale(1.8); .scale(1.8);
} }
@ -1199,7 +1250,7 @@ button:hover {
.overlay-block { .overlay-block {
display: none; display: none;
position: absolute: position: absolute;
top: 0px; top: 0px;
left: 0px; left: 0px;
height: 100%; height: 100%;
@ -1280,7 +1331,7 @@ button:hover {
padding: 20px; padding: 20px;
vertical-align: center; vertical-align: middle;
box-shadow: 0px 5px 50px 0px black; box-shadow: 0px 5px 50px 0px black;
} }

View File

@ -12,6 +12,32 @@
* helpers... * helpers...
*/ */
function _addMark(cls, gid, image){
gid = gid == null ? getImageGID() : gid
image = image == null ? getImage() : $(image)
var mark = $('.mark.'+cls+'.'+gid)
if(mark.length == 0){
mark = $('<div class="mark selected"/>')
.addClass(gid)
.insertAfter(image)
}
return mark
}
function _removeMark(cls, gid, image){
gid = gid == null ? getImageGID() : gid
image = image == null ? getImage() : $(image)
var mark = $('.mark.'+cls+'.'+gid)
if(mark.length != 0){
mark.detach()
}
return mark
}
// NOTE: to disable MARKED cleanout set no_cleanout_marks to true. // NOTE: to disable MARKED cleanout set no_cleanout_marks to true.
// NOTE: MARKED may contain both gids that are not loaded and that do // NOTE: MARKED may contain both gids that are not loaded and that do
// not exist, as there is no way to distinguish between the two // not exist, as there is no way to distinguish between the two
@ -81,6 +107,12 @@ var toggleImageMark = createCSSClassToggler(
'marked', 'marked',
function(action){ function(action){
toggleMarkesView('on') toggleMarkesView('on')
// XXX
if(action == 'on'){
_addMark('selected')
} else {
_removeMark('selected')
}
$('.viewer').trigger('togglingMark', [getImage(), action]) $('.viewer').trigger('togglingMark', [getImage(), action])
}) })

View File

@ -126,6 +126,22 @@ function getImageGID(image){
} }
// Get marks associated with image...
//
// img can be:
// - literal gid
// - image
// - null -- assume current image
//
// NOTE: this does not understand selectors as arguments...
function getImageMarks(img){
gid = typeof(img) == typeof('str') ? img : null
gid = gid == null ? getImageGID(img) : gid
return $('.mark.'+gid)
}
function getRibbon(a){ function getRibbon(a){
a = a == null ? getImage() : a a = a == null ? getImage() : a
@ -241,15 +257,24 @@ function getImageBefore(image, ribbon){
function shiftTo(image, ribbon){ function shiftTo(image, ribbon){
var target = getImageBefore(image, ribbon) var target = getImageBefore(image, ribbon)
var cur_ribbon = getRibbon(image) var cur_ribbon = getRibbon(image)
var marks = getImageMarks(image)
// insert before the first image if nothing is before the target... // insert before the first image if nothing is before the target...
if(target.length == 0){ if(target.length == 0){
image.prependTo($(ribbon)) image.prependTo($(ribbon))
} else { } else {
image.insertAfter(target) var target_marks = getImageMarks(target).last()
image.insertAfter(
// if target has marks, insert after them...
target_marks.length > 0
? target_marks
: target)
} }
// move the marks...
image.after(marks)
$('.viewer').trigger('shiftedImage', [image, cur_ribbon, ribbon]) $('.viewer').trigger('shiftedImage', [image, cur_ribbon, ribbon])
// if removing last image out of a ribbon, remove the ribbon.... // if removing last image out of a ribbon, remove the ribbon....
@ -312,7 +337,13 @@ function createImage(n, force_create_new){
'class': 'image' 'class': 'image'
}) })
} else { } else {
return $('<div order="'+n+'" gid="'+n+'" class="image"/>') return $('<div/>')
.attr({
order: n,
gid: JSON.stringify(n),
// need to strip extra classes...
'class': 'image',
})
} }
} }
@ -398,9 +429,7 @@ function removeRibbon(ribbon){
// NOTE: this will remove everything out of a ribbon if left/right are // NOTE: this will remove everything out of a ribbon if left/right are
// more than the length of the ribbon... // more than the length of the ribbon...
function extendRibbon(left, right, ribbon, no_compensate_shift){ function extendRibbon(left, right, ribbon, no_compensate_shift){
ribbon = ribbon == null ? ribbon = ribbon == null ? getRibbon() : $(ribbon)
getRibbon()
: $(ribbon)
left = left == null ? 0 : left left = left == null ? 0 : left
right = right == null ? 0 : right right = right == null ? 0 : right
var images = ribbon.children('.image') var images = ribbon.children('.image')
@ -420,12 +449,10 @@ function extendRibbon(left, right, ribbon, no_compensate_shift){
// NOTE: we save the detached elements to reuse them on extending, // NOTE: we save the detached elements to reuse them on extending,
// if needed... // if needed...
if(left < 0){ if(left < 0){
//removed = $(images.splice(0, -left)).detach()
removed = removed.concat($(images.splice(0, -left)).detach().toArray()) removed = removed.concat($(images.splice(0, -left)).detach().toArray())
} }
if(right < 0){ if(right < 0){
var l = images.length var l = images.length
//removed = $(images.splice(l+right, l)).detach()
removed = removed.concat($(images.splice(l+right, l)).detach().toArray()) removed = removed.concat($(images.splice(l+right, l)).detach().toArray())
} }
// calculate the maximum number of new elements left to create... // calculate the maximum number of new elements left to create...
@ -444,6 +471,11 @@ function extendRibbon(left, right, ribbon, no_compensate_shift){
res.right = createImages(right, removed).appendTo(ribbon) res.right = createImages(right, removed).appendTo(ribbon)
} }
// cleanup...
$(removed).each(function(){
getImageMarks($(this)).remove()
})
// compensate the position... // compensate the position...
// NOTE: this is fool-proof as it's based on relative visual // NOTE: this is fool-proof as it's based on relative visual
// position... // position...