# HG changeset patch
# User robcast
# Date 1328289167 -3600
# Node ID f4757bf6ab65beb1e2683a450460f7b5a8ad89ad
# Parent b6261d3d68c21ce6f78d6a579176a9a1bf688aeb
new arrows plugin for scroll arrows next to the image.
also new mechanism for specifying insets.
diff -r b6261d3d68c2 -r f4757bf6ab65 webapp/src/main/webapp/jquery/jquery.digilib.arrows.js
--- a/webapp/src/main/webapp/jquery/jquery.digilib.arrows.js Tue Jan 31 00:53:24 2012 +0100
+++ b/webapp/src/main/webapp/jquery/jquery.digilib.arrows.js Fri Feb 03 18:12:47 2012 +0100
@@ -5,22 +5,14 @@
(function($) {
// affine geometry
- var geom;
+ var geom = null;
// plugin object with digilib data
- var digilib;
-
- var FULL_AREA;
+ var digilib = null;
- var buttons = {
- stub : {
- onclick : [ "doStub", 1 ],
- tooltip : "what does this button do?",
- icon : "stub.png"
- }
- };
+ var FULL_AREA = null;
var defaults = {
- // arrow bar overlays for moving the zoomed area
+ // arrow bars for moving the zoomed area
'showZoomArrows' : true,
// zoom arrow bar minimal width (for small images)
'zoomArrowMinWidth' : 6,
@@ -28,6 +20,43 @@
'zoomArrowWidth' : 32,
// by what percentage should the arrows move the zoomed area?
'zoomArrowMoveFactor' : 0.5,
+ // defaults for digilib buttons
+ 'buttonSettings' : {
+ 'fullscreen' : {
+ // path to button images (must end with a slash)
+ 'imagePath' : 'img/fullscreen/',
+ 'buttonSetWidth' : 36,
+ 'arrowSet' : [ "up", "down", "left", "right" ],
+ },
+ 'embedded' : {
+ 'imagePath' : 'img/embedded/16/',
+ 'buttonSetWidth' : 18,
+ 'arrowSet' : [ "up", "down", "left", "right" ],
+ }
+ }
+ };
+
+ var buttons = {
+ up : {
+ onclick : [ "moveZoomArea", 0, -1 ],
+ tooltip : "move zoom area up",
+ icon : "up.png"
+ },
+ down : {
+ onclick : [ "moveZoomArea", 0, 1 ],
+ tooltip : "move zoom area down",
+ icon : "down.png"
+ },
+ left : {
+ onclick : [ "moveZoomArea", -1, 0 ],
+ tooltip : "move zoom area left",
+ icon : "left.png"
+ },
+ right : {
+ onclick : [ "moveZoomArea", 1, 0 ],
+ tooltip : "move zoom area right",
+ icon : "right.png"
+ }
};
var actions = {
@@ -59,20 +88,22 @@
// import geometry classes
geom = digilib.fn.geometry;
FULL_AREA = geom.rectangle(0, 0, 1, 1);
- // add defaults, actions, buttons
- $.extend(digilib.defaults, defaults);
+ // add defaults, actions
+ $.extend(true, digilib.defaults, defaults); // make deep copy
+ $.extend(digilib.buttons, buttons);
$.extend(digilib.actions, actions);
- $.extend(digilib.buttons, buttons);
};
// plugin initialization
var init = function(data) {
console.debug('initialising arrows plugin. data:', data);
var $data = $(data);
+ // adjust insets
+ data.currentInsets['arrows'] = getInsets(data);
// install event handler
$data.bind('setup', handleSetup);
$data.bind('update', handleUpdate);
- //$data.bind('redisplay', handleRedisplay);
+ // $data.bind('redisplay', handleRedisplay);
};
var handleSetup = function(evt) {
@@ -87,14 +118,70 @@
renderZoomArrows(data);
};
- var handleRedisplay = function(evt) {
- console.debug("arrows: handleRedisplay");
- var data = this;
+
+ /**
+ * returns insets for arrows (based on canMove and buttonSetWidth
+ */
+ var getInsets = function(data) {
+ var settings = data.settings;
+ var insets = {
+ 'x' : 0,
+ 'y' : 0
+ };
+ if (settings.showZoomArrows) {
+ var mode = settings.interactionMode;
+ var bw = settings.buttonSettings[mode].buttonSetWidth;
+ if (digilib.fn.canMove(data, 0, -1))
+ insets.y += bw;
+ if (digilib.fn.canMove(data, 0, 1))
+ insets.y += bw;
+ if (digilib.fn.canMove(data, -1, 0))
+ insets.x += bw;
+ if (digilib.fn.canMove(data, 1, 0))
+ insets.x += bw;
+ }
+ return insets;
};
/**
- * create arrow overlays for moving the zoomed area.
- *
+ * creates HTML structure for a single button
+ */
+ var createButton = function(data, $div, buttonName, show) {
+ var $elem = data.$elem;
+ var settings = data.settings;
+ var mode = settings.interactionMode;
+ var imagePath = settings.buttonSettings[mode].imagePath;
+ // make relative imagePath absolute
+ if (imagePath.charAt(0) !== '/' && imagePath.substring(0, 3) !== 'http') {
+ imagePath = settings.digilibBaseUrl + '/jquery/' + imagePath;
+ }
+ var buttonConfig = settings.buttons[buttonName];
+ // button properties
+ var action = buttonConfig.onclick;
+ var tooltip = buttonConfig.tooltip;
+ var icon = imagePath + buttonConfig.icon;
+ // construct the button html
+ var $button = $('

');
+ if (!show) {
+ $button.hide();
+ }
+ $div.append($button);
+ // add attributes and bindings
+ $button.attr('title', tooltip);
+ $button.addClass('arrow-' + buttonName);
+ // create handler for the buttons on the div (necessary for horizontal
+ // scroll arrows)
+ $div.on('click.digilib', function(evt) {
+ // the handler function calls digilib with action and parameters
+ console.debug('click action=', action, ' evt=', evt);
+ $elem.digilib.apply($elem, action);
+ return false;
+ });
+ return $button;
+ };
+
+ /**
+ * create arrows for moving the zoomed area.
*/
var setupZoomArrows = function(data) {
var $elem = data.$elem;
@@ -105,83 +192,66 @@
return;
var mode = settings.interactionMode;
var arrowNames = settings.buttonSettings[mode].arrowSet;
- if (arrowNames == null)
+ if (arrowNames == null) {
+ console.error("No buttons for scroll arrows!");
+ settings.showZoomArrows = false;
return;
- // arrow divs are marked with class "keep"
- var $arrowsDiv = $('');
- $elem.append($arrowsDiv);
- // create all arrow buttons
- // TODO: do this without buttons plugin?
- $.each(arrowNames, function(i, arrowName) {
- digilib.fn.createButton(data, $arrowsDiv, arrowName);
- });
+ }
+ // wrap scaler img in table
+ data.$scaler.wrap('');
+ // middle row with img has three elements
+ data.$scaler.parent().before(' | ').after(' | ');
+ // first and last row has only one
+ var $table = $elem.find('table.scalertable');
+ $table.find('tr.midrow').before(' |
').after(
+ ' |
');
+ // add arrow buttons
+ var ar = {};
+ ar.$up = createButton(data, $table.find('td.up'), 'up', digilib.fn.canMove(data, 0, -1));
+ ar.$down = createButton(data, $table.find('td.down'), 'down', digilib.fn.canMove(data, 0, 1));
+ ar.$left = createButton(data, $table.find('td.left'), 'left', digilib.fn.canMove(data, -1, 0));
+ ar.$right = createButton(data, $table.find('td.right'), 'right', digilib.fn.canMove(data, 1, 0));
+ data.arrows = ar;
+
};
/**
- * size and show arrow overlays, called after scaler img is loaded.
+ * show or hide arrows, called after scaler img is loaded.
*
*/
var renderZoomArrows = function(data) {
var settings = data.settings;
- var $arrowsDiv = data.$elem.find('div.arrows');
+ var arrows = data.arrows;
if (digilib.fn.isFullArea(data.zoomArea) || !settings.showZoomArrows) {
- $arrowsDiv.hide();
+ arrows.$up.hide();
+ arrows.$down.hide();
+ arrows.$left.hide();
+ arrows.$right.hide();
+ data.currentInsets['arrows'] = {'x' : 0, 'y' : 0};
return;
}
- $arrowsDiv.show();
- var r = geom.rectangle(data.$scaler);
- // calculate arrow bar width
- var aw = settings.zoomArrowWidth;
- var minWidth = settings.zoomArrowMinWidth;
- // arrow bar width should not exceed 10% of scaler width/height
- var maxWidth = Math.min(r.width, r.height) / 10;
- if (aw > maxWidth) {
- aw = maxWidth;
- if (aw < minWidth) {
- aw = minWidth;
- }
+ if (digilib.fn.canMove(data, 0, -1)) {
+ arrows.$up.show();
+ } else {
+ arrows.$up.hide();
+ }
+ if (digilib.fn.canMove(data, 0, 1)) {
+ arrows.$down.show();
+ } else {
+ arrows.$down.hide();
}
- // vertical position of left/right image
- var arrowData = [ {
- name : 'up',
- rect : geom.rectangle(r.x, r.y, r.width, aw),
- show : digilib.fn.canMove(data, 0, -1)
- }, {
- name : 'down',
- rect : geom.rectangle(r.x, r.y + r.height - aw, r.width, aw),
- show : digilib.fn.canMove(data, 0, 1)
- }, {
- name : 'left',
- rect : geom.rectangle(r.x, r.y, aw, r.height),
- show : digilib.fn.canMove(data, -1, 0)
- }, {
- name : 'right',
- rect : geom.rectangle(r.x + r.width - aw, r.y, aw, r.height),
- show : digilib.fn.canMove(data, 1, 0)
- } ];
- // render a single zoom Arrow
- var render = function(i, item) {
- var $arrow = $arrowsDiv.find('div.button-' + item.name);
- if (item.show) {
- $arrow.show();
- } else {
- $arrow.hide();
- return;
- }
- var r = item.rect;
- r.adjustDiv($arrow);
- var $a = $arrow.contents('a');
- var $img = $a.contents('img');
- $img.width(aw).height(aw);
- // hack for missing vertical-align
- if (item.name.match(/left|right/)) {
- var top = (r.height - $a.height()) / 2;
- $a.css({
- 'top' : top
- }); // position : 'relative'
- }
- };
- $.each(arrowData, render);
+ if (digilib.fn.canMove(data, -1, 0)) {
+ arrows.$left.show();
+ } else {
+ arrows.$left.hide();
+ }
+ if (digilib.fn.canMove(data, 1, 0)) {
+ arrows.$right.show();
+ } else {
+ arrows.$right.hide();
+ }
+ // adjust insets
+ data.currentInsets['arrows'] = getInsets(data);
};
// plugin object with name and init
diff -r b6261d3d68c2 -r f4757bf6ab65 webapp/src/main/webapp/jquery/jquery.digilib.buttons.js
--- a/webapp/src/main/webapp/jquery/jquery.digilib.buttons.js Tue Jan 31 00:53:24 2012 +0100
+++ b/webapp/src/main/webapp/jquery/jquery.digilib.buttons.js Fri Feb 03 18:12:47 2012 +0100
@@ -145,26 +145,6 @@
tooltip : "less options",
icon : "options.png"
},
- up : {
- onclick : ["moveZoomArea", 0, -1],
- tooltip : "move zoom area up",
- icon : "up.png"
- },
- down : {
- onclick : ["moveZoomArea", 0, 1],
- tooltip : "move zoom area down",
- icon : "down.png"
- },
- left : {
- onclick : ["moveZoomArea", -1, 0],
- tooltip : "move zoom area left",
- icon : "left.png"
- },
- right : {
- onclick : ["moveZoomArea", 1, 0],
- tooltip : "move zoom area right",
- icon : "right.png"
- },
SEP : {
icon : "sep.png"
}
@@ -195,7 +175,6 @@
'buttonSetWidth' : 36,
'standardSet' : ["reference","zoomin","zoomout","zoomarea","zoomfull","pagewidth","back","fwd","page","help","reset","toggleoptions"],
'specialSet' : ["mark","delmark","hmir","vmir","rot","brgt","cont","rgb","quality","size","calibrationx","scale","lessoptions"],
- 'arrowSet' : ["up", "down", "left", "right"],
'buttonSets' : ['standardSet', 'specialSet']
},
'embedded' : {
@@ -203,7 +182,6 @@
'buttonSetWidth' : 18,
'standardSet' : ["reference","zoomin","zoomout","zoomarea","zoomfull","help","reset","toggleoptions"],
'specialSet' : ["mark","delmark","hmir","vmir","rot","brgt","cont","rgb","quality","scale","lessoptions"],
- 'arrowSet' : ["up", "down", "left", "right"],
'buttonSets' : ['standardSet', 'specialSet']
}
},
@@ -237,6 +215,8 @@
settings.visibleButtonSets++;
}
}
+ // adjust insets
+ data.currentInsets['buttons'] = getInsets(data);
// persist setting
fn.storeOptions(data);
},
@@ -300,9 +280,9 @@
// import geometry classes
geom = fn.geometry;
// add defaults, actions, buttons
- $.extend(digilib.defaults, defaults);
+ $.extend(digilib.buttons, buttons);
+ $.extend(true, digilib.defaults, defaults); // make deep copy
$.extend(digilib.actions, actions);
- $.extend(digilib.buttons, buttons);
// update buttons reference in defaults
digilib.defaults.buttons = digilib.buttons;
// export functions
@@ -313,10 +293,8 @@
// plugin initialization
var init = function (data) {
console.debug('initialising buttons plugin. data:', data);
- /* create buttons before scaler
- for (var i = 0; i < data.settings.visibleButtonSets; ++i) {
- showButtons(data, true, i);
- } */
+ // adjust insets
+ data.currentInsets['buttons'] = getInsets(data);
// install event handler
var $data = $(data);
$data.bind('setup', handleSetup);
@@ -326,8 +304,9 @@
var handleSetup = function (evt) {
console.debug("buttons: handleSetup");
var data = this;
+ var settings = data.settings;
// create buttons before scaler
- for (var i = 0; i < data.settings.visibleButtonSets; ++i) {
+ for (var i = 0; i < settings.visibleButtonSets; ++i) {
showButtons(data, true, i);
}
// create ScaleMode selector;
@@ -336,6 +315,16 @@
setupCalibrationDiv(data);
};
+ /**
+ * returns insets for buttons (based on visibleButtonSets and buttonSetWidth
+ */
+ var getInsets = function (data) {
+ var settings = data.settings;
+ var bw = settings.visibleButtonSets * settings.buttonSettings[settings.interactionMode].buttonSetWidth;
+ var insets = {'x' : bw, 'y' : 0};
+ return insets;
+ };
+
var centerOnScreen = function (data, $div) {
var r = geom.rectangle($div);
var s = fn.getFullscreenRect(data);
@@ -602,7 +591,7 @@
var icon = imagePath + buttonConfig.icon;
// construct the button html
var $button = $('');
- var $a = $('');
+ var $a = $('');
var $img = $('
');
$div.append($button);
$button.append($a);
diff -r b6261d3d68c2 -r f4757bf6ab65 webapp/src/main/webapp/jquery/jquery.digilib.css
--- a/webapp/src/main/webapp/jquery/jquery.digilib.css Tue Jan 31 00:53:24 2012 +0100
+++ b/webapp/src/main/webapp/jquery/jquery.digilib.css Fri Feb 03 18:12:47 2012 +0100
@@ -196,24 +196,22 @@
margin-bottom: 20px;
}
-div.digilib div.arrows {
- display: none;
+/* scroll arrows */
+div.digilib table.scalertable {
+ border: 0;
+ padding: 0;
}
-
-div.digilib div.arrows div.button {
- position: absolute;
- text-align: center;
+div.digilib table.scalertable td {
+ padding: 0;
+}
+div.digilib table.scalertable td.arrow {
+}
+div.digilib table.scalertable td.arrow:hover {
background-color: black;
- opacity: 0.08;
- z-index: 200;
- }
-
-div.digilib div.arrows div.button:hover {
- opacity: 0.5;
+ opacity: 0.3;
}
-
-div.digilib div.arrows div.button a {
- position: relative;
+div.digilib table.scalertable img.button {
+ opacity: 1;
}
/* special definitions for fullscreen */
diff -r b6261d3d68c2 -r f4757bf6ab65 webapp/src/main/webapp/jquery/jquery.digilib.js
--- a/webapp/src/main/webapp/jquery/jquery.digilib.js Tue Jan 31 00:53:24 2012 +0100
+++ b/webapp/src/main/webapp/jquery/jquery.digilib.js Fri Feb 03 18:12:47 2012 +0100
@@ -38,7 +38,7 @@
var defaults = {
// version of this script
- 'version' : 'jquery.digilib.js 2.1.2b1',
+ 'version' : 'jquery.digilib.js 2.1.2b2',
// logo url
'logoUrl' : 'img/digilib-logo-text1.png',
// homepage url (behind logo)
@@ -88,8 +88,8 @@
'maxBgSize' : 10000,
// parameters used by background image
'previewImgParamNames' : ['fn','pn','dw','dh','mo','rot'],
- // reserved space in full page display (default value accounts for vertical scrollbar)
- 'scalerInset' : 10
+ // reserved space in full page display (default value accounts for body margins)
+ 'scalerInsets' : { 'x' : 16, 'y': 20 }
};
// list of plugins
@@ -179,6 +179,8 @@
elemSettings = data.settings;
}
unpackParams(data);
+ // list of current insets (dynamic for buttons etc.)
+ data.currentInsets = {'static' : elemSettings.scalerInsets};
// check if browser knows *background-size
for (var bs in {'':1, '-moz-':1, '-webkit-':1, '-o-':1}) {
if ($elem.css(bs+'background-size')) {
@@ -915,31 +917,20 @@
* returns maximum size for scaler img in fullscreen mode.
*/
var getFullscreenImgSize = function (data) {
- var mode = data.settings.interactionMode;
+ //var mode = data.settings.interactionMode;
var $win = $(window);
var winH = $win.height();
var winW = $win.width();
- var $body = $('body');
- // include standard body margins and check plausibility
- var borderW = $body.outerWidth(true) - $body.width();
- if (borderW === 0 || borderW > 100) {
- console.debug("fixing border width for getFullscreenImgSize!");
- borderW = data.settings.scalerInset;
- }
- var borderH = $body.outerHeight(true) - $body.height();
- if (borderH === 0 || borderH > 100) {
- console.debug("fixing border height for getFullscreenImgSize!");
- borderH = 5;
- }
- var buttonsW = 0;
- if (data.buttons != null) {
- // get button width from settings
- buttonsW = data.settings.buttonSettings[mode].buttonSetWidth * data.settings.visibleButtonSets;
- }
- // account for left/right border, body margins and additional requirements
- var imgW = winW - borderW - buttonsW;
- var imgH = winH - borderH;
- console.debug('screen w/h:', winW, winH, 'window.width', $win.width(), 'border:', borderW, 'buttonsW:', buttonsW, 'img w/h:', imgW, imgH);
+ // add all current insets
+ var insets = { 'x' : 0, 'y' : 0};
+ for (var n in data.currentInsets) {
+ insets.x += data.currentInsets[n].x;
+ insets.y += data.currentInsets[n].y;
+ };
+ // accounting for left/right border, body margins and additional requirements
+ var imgW = winW - insets.x;
+ var imgH = winH - insets.y;
+ console.debug('screen w/h:', winW, winH, 'window.width', $win.width(), 'img w/h:', imgW, imgH);
return geom.size(imgW, imgH);
};