Mercurial > hg > digilib-old
diff webapp/src/main/webapp/jquery/jquery.digilib.js @ 944:3916303b8f17
"preview" works now also for zoomIn/Out
author | robcast |
---|---|
date | Wed, 28 Dec 2011 22:04:18 +0100 |
parents | 79cbc4694b14 |
children | d90eb52966be |
line wrap: on
line diff
--- a/webapp/src/main/webapp/jquery/jquery.digilib.js Wed Dec 28 11:47:18 2011 +0100 +++ b/webapp/src/main/webapp/jquery/jquery.digilib.js Wed Dec 28 22:04:18 2011 +0100 @@ -285,8 +285,10 @@ var fn; // affine geometry plugin stub var geom; - + // rectangle with maximum zoom area var FULL_AREA; + // limit for float comparison + var EPSILON = 0.000001; var actions = { // init: digilib initialization @@ -349,8 +351,6 @@ settings : elemSettings, // and of the URL query parameters queryParams : params, - // TODO: move plugins reference out of data - plugins : plugins }; // store in jQuery data element $elem.data('digilib', data); @@ -364,6 +364,7 @@ break; } } + data.hasPreviewBg = false; // check if browser supports AJAX-like URL-replace without reload data.hasAsyncReload = (typeof history.replaceState === 'function'); // check digilib base URL @@ -500,18 +501,15 @@ // move zoomed area moveZoomArea : function (data, dx, dy) { - var fullBgRect = setZoomBg(data); - var za = data.zoomArea; + var za = data.zoomArea.copy(); var factor = data.settings.zoomArrowMoveFactor; var deltaX = dx * factor * za.width; var deltaY = dy * factor * za.height; var delta = geom.position(deltaX, deltaY); za.addPosition(delta); - data.zoomArea = FULL_AREA.fit(za); + za = FULL_AREA.fit(za); $(data).trigger('changeZoomArea', za); - // TODO: improve this calculation - var deltapix = geom.position(-dx*factor*data.imgRect.width,-dy*factor*data.imgRect.height); - moveZoomBg(data, fullBgRect, deltapix); + data.zoomArea = za; redisplay(data); }, @@ -980,7 +978,7 @@ } highlightButtons(data); // TODO: better solution // invalidate background - data.hasPreviewBg = null; + data.hasPreviewBg = false; // send event $(data).trigger('redisplay'); } catch (e) { @@ -1007,7 +1005,7 @@ } highlightButtons(data); // TODO: better solution // invalidate background - data.hasPreviewBg = null; + data.hasPreviewBg = false; // send event $(data).trigger('redisplay'); } @@ -1499,16 +1497,27 @@ var handleChangeZoomArea = function (evt, newZa) { console.debug("handleChangeZoomArea:", newZa); var data = this; - if (data.hasPreviewBg == null) { - // no background yet - setZoomBg(data); - } else { + var delta = data.zoomArea.delta(newZa); + if (Math.abs(delta.width) > EPSILON || Math.abs(delta.height) > EPSILON) { + // zoom changed -- set new background + console.debug("zoom level changed!"); + var dw = data.zoomArea.width / newZa.width; + var dh = data.zoomArea.height / newZa.height; + var deltapix = geom.size(dw, dh); + setZoomBg(data, deltapix); + } else if (Math.abs(delta.x) > EPSILON || Math.abs(delta.y) > EPSILON) { // move background - // TODO: improve this calculation - var deltapix = geom.position(-dx*factor*data.imgRect.width,-dy*factor*data.imgRect.height); - moveZoomBg(data, fullBgRect, deltapix); + console.debug("zoom area moved:", delta); + var opx = data.imgTrafo.transform(data.zoomArea.getPosition()); + var npx = data.imgTrafo.transform(newZa.getPosition()); + var deltapix = npx.delta(opx); + if (data.hasPreviewBg) { + moveZoomBg(data, deltapix); + } else { + // no background yet + setZoomBg(data, deltapix); + } } - }; @@ -1546,6 +1555,7 @@ newarea.x -= 0.5 * (newarea.width - area.width); newarea.y -= 0.5 * (newarea.height - area.height); newarea = FULL_AREA.fit(newarea); + $(data).trigger('changeZoomArea', newarea); data.zoomArea = newarea; redisplay(data); }; @@ -1634,7 +1644,7 @@ }; // set zoom background (returns rectangle with fullsize backgroud coordinates) - var setZoomBg = function(data) { + var setZoomBg = function(data, delta) { var $scaler = data.$scaler; var $img = data.$img; var fullRect = null; @@ -1649,6 +1659,17 @@ 'cursor' : 'move' }; if (data.hasBgSize) { + if (delta != null && delta.width != null) { + // scale background by delta + var nw = Math.round(data.imgRect.width * delta.width); + var nh = Math.round(data.imgRect.height * delta.height); + scalerCss[data.bgSizeName] = nw + 'px ' + nh + 'px'; + // correct offset + scalerCss['background-position'] = Math.round((data.imgRect.width - nw) / 2) + 'px ' + + Math.round((data.imgRect.height - nh) / 2) + 'px'; + } else { + scalerCss[data.bgSizeName] = 'auto'; + } // additional full-size background using CSS3-background-size fullRect = data.imgTrafo.transform(FULL_AREA); if (fullRect.height < data.settings.maxBgSize && fullRect.width < data.settings.maxBgSize) { @@ -1658,8 +1679,19 @@ var url = getBgImgUrl(data); // add second background url, size and position (CSS3) scalerCss['background-image'] += ', url(' + url + ')'; - scalerCss[data.bgSizeName] = 'auto, ' + fullRect.width + 'px ' + fullRect.height + 'px'; - scalerCss['background-position'] += ', ' + fullRect.x + 'px '+ fullRect.y + 'px'; + if (delta != null && delta.width != null) { + // scale second background by delta + var nw = Math.round(fullRect.width * delta.width); + var nh = Math.round(fullRect.height * delta.height); + scalerCss[data.bgSizeName] += ', ' + nw + 'px ' + nh + 'px'; + // and correct position + var nx = Math.round(fullRect.x + (fullRect.width - nw) / 2); + var ny = Math.round(fullRect.y + (fullRect.height - nh) / 2); + scalerCss['background-position'] += ', ' + nx + 'px '+ ny + 'px'; + } else { + scalerCss[data.bgSizeName] += ', ' + fullRect.width + 'px ' + fullRect.height + 'px'; + scalerCss['background-position'] += ', ' + fullRect.x + 'px '+ fullRect.y + 'px'; + } } else { // scaled full-size background image too big fullRect = null; @@ -1668,6 +1700,9 @@ $scaler.css(scalerCss); data.hasPreviewBg = true; data.fullBgRect = fullRect; + if (delta != null && delta.x != null) { + moveZoomBg(data, delta); + } return fullRect; }; @@ -1677,7 +1712,7 @@ var bgPos = delta.x + "px " + delta.y + "px"; if (data.fullBgRect != null) { // add full-size background position - var bp = fullRect.getPosition().add(delta); + var bp = data.fullBgRect.getPosition().add(delta); bgPos += ', ' + bp.x + "px " + bp.y + "px"; } // move the background image to the new position @@ -1695,6 +1730,8 @@ // drag the image and load a new detail on mouse up var dragStart = function (evt) { + // cancel if not left-click + if (evt.which != 1) return; console.debug("dragstart at=", evt); // don't start dragging if not zoomed if (isFullArea(data.zoomArea)) return false; @@ -1730,7 +1767,7 @@ // no movement $img.css('visibility', 'visible'); $scaler.css({'opacity' : '1', 'background-image' : 'none'}); - data.hasPreviewBg = null; + data.hasPreviewBg = false; // unhide marks data.$elem.find('div.mark').show(); $(data).trigger('redisplay');