# HG changeset patch
# User hertzhaft
# Date 1332705923 -7200
# Node ID 4f17420392a95b54f284f3241586103a99c787f5
# Parent b67f388df888817ff34c8c3d558d33bda877234b
factor out calibration/scalemode to new dialogs plugin
diff -r b67f388df888 -r 4f17420392a9 webapp/src/main/webapp/jquery/digilib.html
--- a/webapp/src/main/webapp/jquery/digilib.html Sat Mar 24 23:01:46 2012 +0100
+++ b/webapp/src/main/webapp/jquery/digilib.html Sun Mar 25 22:05:23 2012 +0200
@@ -19,6 +19,7 @@
+
diff -r b67f388df888 -r 4f17420392a9 webapp/src/main/webapp/jquery/jquery.digilib.buttons.js
--- a/webapp/src/main/webapp/jquery/jquery.digilib.buttons.js Sat Mar 24 23:01:46 2012 +0100
+++ b/webapp/src/main/webapp/jquery/jquery.digilib.buttons.js Sun Mar 25 22:05:23 2012 +0200
@@ -108,12 +108,14 @@
icon : "size.png"
},
calibrationx : {
- onclick : "showCalibrationDiv",
+ // onclick : "showCalibrationDiv",
+ onclick : "calibrate",
tooltip : "calibrate screen resolution",
icon : "calibration-x.png"
},
scale : {
- onclick : "showScaleModeSelector",
+ // onclick : "showScaleModeSelector",
+ onclick : "setScaleMode",
tooltip : "change image scale",
icon : "original-size.png"
},
@@ -207,43 +209,6 @@
data.currentInsets['buttons'] = getInsets(data);
// persist setting
fn.storeOptions(data);
- },
-
- // shows Calibration Div
- showCalibrationDiv : function (data) {
- var $elem = data.$elem;
- var cssPrefix = data.settings.cssPrefix;
- var $calDiv = $elem.find('.'+cssPrefix+'calibration');
- var $input = $elem.find('.'+cssPrefix+'calibration-input');
- $calDiv.fadeIn();
- $input.focus();
- },
-
- // shows ScaleModeSelector
- showScaleModeSelector : function (data) {
- var $elem = data.$elem;
- var cssPrefix = data.settings.cssPrefix;
- var $div = $elem.find('div#'+cssPrefix+'scalemode');
- if ($div.is(':visible')) {
- $div.fadeOut();
- return;
- }
- // select current mode
- var mode = data.scaleMode;
- $div.find('option').each(function () {
- $(this).prop('selected', $(this).attr('name') == mode);
- });
- var $button = $elem.find('div.'+cssPrefix+'button-scale');
- var buttonRect = geom.rectangle($button);
- $('body').on("click.scalemode", function(event) {
- $div.fadeOut();
- });
- $div.fadeIn();
- var divRect = geom.rectangle($div);
- $div.offset({
- left : Math.abs(buttonRect.x - divRect.width - 4),
- top : buttonRect.y + 4
- });
}
};
@@ -284,10 +249,6 @@
for (var i = 0; i < settings.visibleButtonSets; ++i) {
showButtons(data, true, i);
}
- // create ScaleMode selector;
- setupScaleModeDiv(data);
- // create Calibration div;
- setupCalibrationDiv(data);
};
/**
@@ -300,107 +261,6 @@
return insets;
};
- /** creates HTML structure for the calibration div
- */
- var setupCalibrationDiv = function (data) {
- var $elem = data.$elem;
- var settings = data.settings;
- var cssPrefix = settings.cssPrefix;
- var html = '\
-
\
-
\
-
Please enter the length of this scale on your screen
\
-
\
- cm\
- \
- \
-
\
-
Please enter a numeric value like this: 12.3
\
-
\
-
';
- var $calDiv = $(html);
- $elem.append($calDiv);
- var $input = $calDiv.find('input');
- var $ok = $calDiv.find('#'+cssPrefix+'calibrationOk');
- var $cancel = $calDiv.find("#calibrationCancel");
- data.calibrationDiv = $calDiv;
- data.calibrationErrorDiv = $calDiv.find('div.'+cssPrefix+'calibration-error');
- data.calibrationInput = $input;
- fn.centerOnScreen(data, $calDiv);
- var handler = function(event) {
- var _data = data;
- if (event.keyCode == 27 || event.target.id == cssPrefix+'calibrationCancel') {
- $calDiv.fadeOut();
- return false;
- }
- if (event.keyCode == 13 || event.target.id == cssPrefix+'calibrationOk') {
- changeCalibration(_data);
- return false;
- }
- _data.calibrationInput.removeClass(cssPrefix+'error');
- };
- $ok.on("click", handler);
- $cancel.on("click", handler);
- $input.on("keypress", handler);
- };
-
- /** creates HTML structure for the scale mode menu
- */
- var setupScaleModeDiv = function (data) {
- var $elem = data.$elem;
- var settings = data.settings;
- var cssPrefix = settings.cssPrefix;
- var currentMode = digilib.fn.getScaleMode(data);
- var $scaleModeDiv = $('');
- data.scaleModeDiv = $scaleModeDiv;
- var $scaleModeSelect = $('');
- $elem.append($scaleModeDiv);
- $scaleModeDiv.append($scaleModeSelect);
- for (var i = 0; i < modes.length; i++) {
- var mode = modes[i];
- var selected = (mode.name == currentMode) ? ' selected="selected"' : '';
- $scaleModeSelect.append($(''));
- }
- $scaleModeDiv.on("click.scalemode", function(event) {
- return false;
- });
- $scaleModeSelect.on('change.scalemode', function(event) {
- var d = data;
- changeMode(event, d);
- });
- };
-
- /** event handler
- */
- var changeMode = function (event, data) {
- var $select = $(event.target);
- var newMode = $select.find("option:selected").attr("name");
- console.debug('setting mode to:', newMode);
- var $div = data.scaleModeDiv;
- $('body').off("click.scalemode");
- $div.fadeOut();
- digilib.actions.setScaleMode(data, newMode);
- };
-
- /** event handler
- */
- var changeCalibration = function (data) {
- var $calDiv = data.calibrationDiv;
- var $input = data.calibrationInput;
- var cm = $input.val();
- var w = $calDiv.width();
- var dpi = fn.cropFloat(w / parseFloat(cm) * 2.54);
- console.debug('width', w, 'cm', cm, 'input dpi:', dpi);
- if(!fn.isNumber(dpi)) {
- $input.addClass(data.settings.cssPrefix+'error');
- return;
- }
- digilib.actions.calibrate(data, dpi);
- $calDiv.fadeOut();
- };
-
/**
* creates HTML structure for a single button
*/
@@ -432,6 +292,7 @@
$a.append($img);
// add attributes and bindings
$button.attr('title', tooltip);
+ $button.attr('id', cssPrefix+'button-'+buttonName);
$button.addClass(cssPrefix+'button-'+buttonName);
$img.attr('src', icon);
// create handler for the buttons
@@ -453,6 +314,7 @@
};
}
})());
+ return $button;
};
// creates HTML structure for buttons in elem
@@ -472,7 +334,8 @@
var buttonNames = buttonSettings[buttonGroup];
for (var i = 0; i < buttonNames.length; i++) {
var buttonName = buttonNames[i];
- createButton(data, $buttonsDiv, buttonName);
+ var $button = createButton(data, $buttonsDiv, buttonName);
+ settings.buttons[buttonName].button = $button;
}
// make buttons div scroll if too large for window
if ($buttonsDiv.height() > $(window).height() - 10) {
diff -r b67f388df888 -r 4f17420392a9 webapp/src/main/webapp/jquery/jquery.digilib.css
--- a/webapp/src/main/webapp/jquery/jquery.digilib.css Sat Mar 24 23:01:46 2012 +0100
+++ b/webapp/src/main/webapp/jquery/jquery.digilib.css Sun Mar 25 22:05:23 2012 +0200
@@ -3,6 +3,14 @@
*
* Martin Raspe, Robert Casties, 11.1.2011
*/
+
+div.dl-digilib,
+div.dl-digilib button,
+div.dl-digilib input {
+ font-family: Verdana, Arial, Helvetica, sans-serif;
+ font-size: 12px;
+}
+
div.dl-digilib div.dl-scaler {
background-color: grey;
z-index: 0;
@@ -116,7 +124,7 @@
font-weight: bold;
}
-div.dl-digilib div.dl-calibration {
+div.dl-digilib #dl-calibration {
background: url('img/blue.png');
position: absolute;
border: 1px solid lightcyan;
@@ -125,7 +133,7 @@
z-index: 9999;
}
-div.dl-digilib div.dl-ruler {
+div.dl-digilib #dl-ruler {
width: 100%;
height: 100%;
padding-bottom: 10px;
@@ -137,23 +145,23 @@
background: url('img/ruler-top.gif') 0px -1px repeat-x;
}
-div.dl-digilib div.dl-cm {
+div.dl-digilib #dl-cm {
padding: 5px;
}
-div.dl-digilib div.dl-calibration-error {
+div.dl-digilib #dl-calibrationError {
color: red;
padding: 10px;
display: none;
}
-div.dl-digilib input.dl-calibration-input {
+div.dl-digilib #dl-calibrationInput {
margin: 0px 10px;
}
-div.dl-digilib input.dl-error {
+div.dl-digilib .dl-error {
color: red;
- background-color: khaki;
+ background-color: darkred;
}
div.dl-digilib button.dl-button {
@@ -165,6 +173,14 @@
background: transparent;
}
+div.dl-digilib div.dl-tinyslider {
+ display: none;
+ border: 1px solid lightcyan;
+ background-color: lightgrey;
+ width: 300px;
+ padding:10px;
+ }
+
div.dl-digilib div.dl-slider {
border: 1px solid lightcyan;
margin: 30px;
diff -r b67f388df888 -r 4f17420392a9 webapp/src/main/webapp/jquery/jquery.digilib.dialogs.js
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/webapp/src/main/webapp/jquery/jquery.digilib.dialogs.js Sun Mar 25 22:05:23 2012 +0200
@@ -0,0 +1,199 @@
+/**
+digilib dialogs plugin
+ */
+
+(function($) {
+
+ // plugin object with digilib data
+ var digilib = null;
+ // the functions made available by digilib
+ var fn = null;
+ // affine geometry plugin
+ var geom = null;
+
+ var modes = [
+ { name : "screen",
+ label : "fit to screen",
+ tooltip : "scales the graphic file so that it fills the screen"
+ },
+ { name : "pixel",
+ label : "pixel by pixel",
+ tooltip : "all pixels of the current part of the graphic file are shown"
+ },
+ { name : "size",
+ label : "original size",
+ tooltip : "tries to display the current part of the graphic file in the size of the orginal resource (after screen calibration)"
+ }
+ ];
+
+ var defaults = {
+ };
+
+ var actions = {
+ // shows Calibration Div
+ dialogCalibration : function (data) {
+ fn.showCalibrationDialog(data);
+ },
+
+ // shows ScaleModeSelector
+ dialogScaleMode : function (data) {
+ fn.showScaleModeDialog(data);
+ }
+ };
+
+ /** creates and displays HTML structure for screen calibration
+ */
+ var showCalibrationDialog = function (data) {
+ var $elem = data.$elem;
+ var settings = data.settings;
+ var cssPrefix = settings.cssPrefix;
+ var $calDiv = $elem.find('#'+cssPrefix+'calibration');
+ if ($calDiv.length > 0) return; // already onscreen
+ var html = '\
+ \
+
\
+
Please enter the length of this scale on your screen
\
+
\
+ cm\
+ \
+ \
+
\
+
Please enter a numeric value like this: 12.3
\
+
\
+
';
+ $calDiv = $(html);
+ $calDiv.appendTo($elem);
+ var $input = $calDiv.find('#'+cssPrefix+'calibrationInput');
+ var $ok = $calDiv.find('#'+cssPrefix+'calibrationOk');
+ var $cancel = $calDiv.find('#'+cssPrefix+'calibrationCancel');
+ var $error = $calDiv.find('#'+cssPrefix+'calibrationError');
+ var handler = function(event) {
+ // var _data = data;
+ console.log("HANDLER calibration");
+ if (event.keyCode == 27 || event.target.id == cssPrefix+'calibrationCancel') {
+ fn.withdraw($calDiv);
+ return false;
+ }
+ if (event.keyCode == 13 || event.target.id == cssPrefix+'calibrationOk') {
+ var w = $calDiv.width();
+ var cm = $input.val();
+ var dpi = fn.cropFloat(w / parseFloat(cm) * 2.54);
+ console.debug('width', w, 'cm', cm, 'input dpi:', dpi);
+ if (!fn.isNumber(dpi)) {
+ $input.addClass(cssPrefix+'error');
+ $error.fadeIn();
+ return;
+ }
+ digilib.actions.calibrate(data, dpi);
+ fn.withdraw($calDiv);
+ return false;
+ }
+ $error.fadeOut();
+ $input.removeClass(cssPrefix+'error');
+ };
+ $ok.on("click.dialog", handler);
+ $cancel.on("click.dialog", handler);
+ $input.on("keypress.dialog", handler);
+ $input.on("focus.dialog", handler);
+ $calDiv.fadeIn();
+ fn.centerOnScreen(data, $calDiv);
+ $input.focus();
+ return $calDiv;
+ };
+
+ /** creates and displays HTML structure for scale mode selection
+ */
+ var showScaleModeDialog = function (data) {
+ var $elem = data.$elem;
+ var settings = data.settings;
+ var cssPrefix = settings.cssPrefix;
+ var $scaleDiv = $elem.find('#'+cssPrefix+'scalemode');
+ if ($scaleDiv.length > 0) return; // already onscreen
+ var html = '\
+ \
+ \
+
';
+ $scaleDiv = $(html);
+ $scaleDiv.appendTo($elem);
+ var mode = fn.getScaleMode(data);
+ var $select = $scaleDiv.find('select');
+ for (var i = 0; i < modes.length; i++) {
+ var m = modes[i];
+ var selected = (m.name == mode) ? ' selected="selected"' : '';
+ html = '';
+ $select.append($(html));
+ }
+ $select.on('change.scalemode', function(event) {
+ var newMode = $select.find("option:selected").attr("name");
+ console.debug('setting mode to:', newMode);
+ digilib.actions.setScaleMode(data, newMode);
+ fn.withdraw($scaleDiv);
+ });
+ $select.on('blur.scalemode', function(event) {
+ fn.withdraw($scaleDiv);
+ });
+ // position the element next to the scale button
+ var $button = $elem.find('#'+cssPrefix+'button-scale');
+ // var $button = digilib.buttons['scale'].button;
+ var buttonRect = geom.rectangle($button);
+ $scaleDiv.fadeIn();
+ $select.focus();
+ var divRect = geom.rectangle($scaleDiv);
+ $scaleDiv.offset({
+ left : Math.abs(buttonRect.x - divRect.width - 4),
+ top : buttonRect.y + 4
+ });
+ };
+
+ // plugin installation called by digilib on plugin object.
+ var install = function (plugin) {
+ digilib = plugin;
+ console.debug('installing dialogs plugin. digilib:', digilib);
+ fn = digilib.fn;
+ // import geometry classes
+ geom = fn.geometry;
+ // add defaults, actions, buttons
+ $.extend(true, digilib.defaults, defaults); // make deep copy
+ $.extend(digilib.actions, actions);
+ fn.setButtonAction('calibrationx', 'dialogCalibration');
+ fn.setButtonAction('scale', 'dialogScaleMode');
+ // export functions
+ fn.showCalibrationDialog = showCalibrationDialog;
+ fn.showScaleModeDialog = showScaleModeDialog;
+ };
+
+ // plugin initialization
+ var init = function (data) {
+ console.debug('initialising dialogs plugin. data:', data);
+ var $data = $(data);
+ $data.bind('setup', handleSetup);
+ // create ScaleMode selector;
+ // setupScaleModeDiv(data);
+ // create Calibration div;
+ // setupCalibrationDiv(data);
+ };
+
+ var handleSetup = function (evt) {
+ console.debug("dialogs: handleSetup");
+ var data = this;
+ var settings = data.settings;
+ };
+
+ // plugin object with name and init
+ // shared objects filled by digilib on registration
+ var plugin = {
+ name : 'dialogs',
+ install : install,
+ init : init,
+ buttons : {},
+ actions : {},
+ fn : {},
+ plugins : {}
+ };
+
+ if ($.fn.digilib == null) {
+ $.error("jquery.digilib.dialogs must be loaded after jquery.digilib!");
+ } else {
+ $.fn.digilib('plugin', plugin);
+ }
+})(jQuery);
diff -r b67f388df888 -r 4f17420392a9 webapp/src/main/webapp/jquery/jquery.digilib.js
--- a/webapp/src/main/webapp/jquery/jquery.digilib.js Sat Mar 24 23:01:46 2012 +0100
+++ b/webapp/src/main/webapp/jquery/jquery.digilib.js Sun Mar 25 22:05:23 2012 +0200
@@ -1603,12 +1603,13 @@
};
/** return string from number with reduced precision.
- *
*/
var cropFloatStr = function (x) {
return cropFloat(x).toString();
};
+ /** center an item on the visible screen rect
+ */
var centerOnScreen = function (data, $div) {
var r = geom.rectangle($div);
var s = fn.getFullscreenRect(data);
@@ -1616,6 +1617,15 @@
r.adjustDiv($div);
};
+ /** fade out and remove an item
+ */
+ var withdraw = function ($item) {
+ $item.fadeOut(function () {
+ $item.remove();
+ });
+ };
+
+
// fallback for console.log calls
if (customConsole) {
var logFunction = function(type) {
@@ -1667,7 +1677,8 @@
getBorderWidth : getBorderWidth,
cropFloat : cropFloat,
cropFloatStr : cropFloatStr,
- centerOnScreen : centerOnScreen
+ centerOnScreen : centerOnScreen,
+ withdraw : withdraw
};
// hook digilib plugin into jquery
diff -r b67f388df888 -r 4f17420392a9 webapp/src/main/webapp/jquery/jquery.digilib.sliders.js
--- a/webapp/src/main/webapp/jquery/jquery.digilib.sliders.js Sat Mar 24 23:01:46 2012 +0100
+++ b/webapp/src/main/webapp/jquery/jquery.digilib.sliders.js Sun Mar 25 22:05:23 2012 +0200
@@ -266,9 +266,7 @@
var settings = $this.data('settings');
var $handle = settings.$handle;
$handle.off('mousedown.slider');
- $this.fadeOut(function(){
- $this.remove()
- });
+ fn.withdraw($this);
};
// assign button actions to sliders (rotate, brightness, contrast)
@@ -399,9 +397,7 @@
callback(data);
}
}
- $panel.fadeOut(function() {
- $panel.remove();
- });
+ fn.withdraw($panel);
return false;
};
$div.children().on('click', handler);
@@ -417,17 +413,18 @@
var cssPrefix = data.settings.cssPrefix;
var cssClass = cssPrefix + 'tinyslider';
var sliderHtml = '\
- \
+
\
\
';
var $slider = $(sliderHtml);
$elem.append($slider);
+ $slider.fadeIn();
var $range = $slider.find('input.'+cssClass+'range');
var $text = $slider.find('input.'+cssClass+'text');
// fix non-HTML5 slider
@@ -455,14 +452,13 @@
$slider.find('form').on('submit', function () {
// console.debug("brgt-form:", this, " sub=", this.sub);
callback($text.val());
- $slider.remove();
+ fn.withdraw($slider);
return false;
});
// handle cancel
$slider.find('.'+cssClass+'cancel').on('click', function () {
- $slider.remove();
+ fn.withdraw($slider);
});
- $slider.fadeIn();
fn.centerOnScreen(data, $slider);
};
diff -r b67f388df888 -r 4f17420392a9 webapp/src/main/webapp/jquery/jquery.range.js
--- a/webapp/src/main/webapp/jquery/jquery.range.js Sat Mar 24 23:01:46 2012 +0100
+++ b/webapp/src/main/webapp/jquery/jquery.range.js Sun Mar 25 22:05:23 2012 +0200
@@ -127,15 +127,15 @@
if(options.range){
prev = options.values.slice(); // clone
- options.values[0] = pxToValue($handle.position().left);
- options.values[1] = pxToValue($handle2.position().left);
+ options.values[0] = bound(pxToValue($handle.position().left));
+ options.values[1] = bound(pxToValue($handle2.position().left));
// set value on original element
$original.val(options.values[0] +','+options.values[1]);
} else {
prev = options.values;
- options.values = pxToValue($handle.position().left);
+ options.values = bound(pxToValue($handle.position().left));
// set value on original element
$original.val(options.values);
@@ -170,7 +170,9 @@
var valspan = options.max - options.min;
var v = px * valspan / w + options.min;
if (options.snap) {
- var tmp = Math.round(v / options.snap) * options.snap;
+ var tmp = v < 0
+ ? Math.floor(v / options.snap) * options.snap
+ : Math.round(v / options.snap) * options.snap;
// hack to cut off floating point imprecision
var result = parseFloat(tmp.toFixed(4));
return result;