changeset 1275:05a07c9852a3

transparent plugin: adjust opacity; make sliders plugin reusable
author hertzhaft
date Thu, 06 Feb 2014 19:32:55 +0100
parents 8f8dff61535a
children d2fa5234200f
files webapp/src/main/webapp/jquery/jquery.digilib.css webapp/src/main/webapp/jquery/jquery.digilib.sliders.js webapp/src/main/webapp/jquery/jquery.digilib.transparent.js
diffstat 3 files changed, 121 insertions(+), 81 deletions(-) [+]
line wrap: on
line diff
--- a/webapp/src/main/webapp/jquery/jquery.digilib.css	Thu Feb 06 16:11:31 2014 +0100
+++ b/webapp/src/main/webapp/jquery/jquery.digilib.css	Thu Feb 06 19:32:55 2014 +0100
@@ -230,7 +230,7 @@
 	}
 
 div.dl-digilib table.dl-rgbslider td.dl-rgb {
-    width: 40%;
+    width: 180px;
     padding: 6px;
     border: 2px solid aqua;
 }
@@ -239,7 +239,6 @@
     display: none;
 	border: 2px solid aqua;
 	background-color: silver;
-	width: 400px;
 	padding: 10px;
 	position: absolute;
     top: 0px;	
--- a/webapp/src/main/webapp/jquery/jquery.digilib.sliders.js	Thu Feb 06 16:11:31 2014 +0100
+++ b/webapp/src/main/webapp/jquery/jquery.digilib.sliders.js	Thu Feb 06 19:32:55 2014 +0100
@@ -38,7 +38,8 @@
     var defaults = {};
 
     var sliderOptions = {
-        rot : {
+        rotation : {
+            param : 'rot',
             label : "Rotation angle",
             tooltip : "rotate image",
             icon : "rotate.png",
@@ -48,7 +49,8 @@
             step : 5,
             start : 0
             },
-        brgt : {
+        brightness : {
+            param : 'brgt',
             label : "Brightness",
             tooltip : "set numeric value to be added",
             icon : "brightness.png",
@@ -58,7 +60,8 @@
             step : 10,
             start : 0
             },
-        cont : {
+        contrast : {
+            param : 'cont',
             label : "Contrast",
             tooltip : "set numeric value to be multiplied",
             icon : "contrast.png",
@@ -99,8 +102,9 @@
         sliderBrgt : function (data) {
             // adjust min and max for contrast value (not nice to change sliderOptions)
             var maxBrgt = Math.max(Math.round(255 * Math.pow(2, data.settings.cont)), 255);
-            sliderOptions.brgt.min = -maxBrgt;
-            sliderOptions.brgt.max = maxBrgt;
+            var options = sliderOptions.brightness;
+            options.min = -maxBrgt;
+            options.max = maxBrgt;
             var onChange = function($slider, val) {
                 colorVals['brgt'] = parseFloat(val);
                 updatePreview($slider);
@@ -108,11 +112,12 @@
             var onSubmit = function(val) {
                 digilib.actions.brightness(data, val);
                 };
-            singleSlider(data, 'brgt', onChange, onSubmit);
+            singleSlider(data, options, onChange, onSubmit);
         },
 
         // shows contrast slider
         sliderCont : function (data) {
+            var options = sliderOptions.contrast;
             var onChange = function($slider, val) {
                 var m = Math.pow(2, parseFloat(val));
                 colorVals['cont'] = val;
@@ -122,16 +127,17 @@
             var onSubmit = function(val) {
                 digilib.actions.contrast(data, val, true);
                 };
-            singleSlider(data, 'cont', onChange, onSubmit);
+            singleSlider(data, options, onChange, onSubmit);
         },
 
         // shows rotate slider
         sliderRot : function (data) {
+            var options = sliderOptions.rotation;
             var onChange = null;
             var onSubmit = function(val) {
                 digilib.actions.rotate(data, val);
                 };
-            singleSlider(data, 'rot', onChange, onSubmit);
+            singleSlider(data, options, onChange, onSubmit);
         },
 
         // shows RGB sliders
@@ -192,6 +198,8 @@
         digilib = plugin;
         console.debug('installing sliders plugin. digilib:', digilib);
         fn = digilib.fn;
+        // export slider function
+        fn.slider = singleSlider;
         // import geometry classes
         geom = fn.geometry;
         // add defaults, actions, buttons
@@ -240,7 +248,7 @@
         var tiny = cssPrefix + 'tinyslider';
         var $elem = data.$elem;
         var sliderSelector = '#'+cssPrefix+'slider';
-        if (fn.isOnScreen(data, sliderSelector)) return; // already onscreen
+        if (fn.isOnScreen(data, sliderSelector)) return null; // already onscreen
         var html = '\
             <div id="'+cssPrefix+'slider" class="'+cls+'">\
                 <form class="'+cls+'">\
@@ -296,16 +304,15 @@
 
     /** creates a TinyRange slider
      */
-    var tinySlider = function (data, paramname, startvalue) {
+    var tinySlider = function (data, options, startvalue) {
         var $elem = data.$elem;
-        var opts = sliderOptions[paramname];
         var cssPrefix = data.settings.cssPrefix;
         var cls = cssPrefix + 'tinyslider';
         var html = '\
             <div class="'+cls+'">\
-                <span>'+opts.label+'</span>\
-                <input type="range" class="'+cls+'range" name="'+paramname+'" step="'+opts.step+'" min="'+opts.min+'" max="'+opts.max+'" value="'+startvalue+'"/>\
-                <input type="text" class="'+cls+'text" name="'+paramname+'" size="4" value="'+startvalue+'"/>\
+                <span>'+options.label+'</span>\
+                <input type="range" class="'+cls+'range" name="'+options.param+'" step="'+options.step+'" min="'+options.min+'" max="'+options.max+'" value="'+startvalue+'"/>\
+                <input type="text" class="'+cls+'text" name="'+options.param+'" size="4" value="'+startvalue+'"/>\
             </div>';
         var $slider = $(html);
         var $range = $slider.find('input.'+cls+'range');
@@ -317,8 +324,8 @@
             var update = $slider.data('update');
             if ($.isFunction(update)) {
                 update($slider, val);
-            }
-        };
+                }
+            };
         var textChange = function () {
             var val = $text.val();
             $range.val(val);
@@ -327,20 +334,20 @@
             var HTML5 = $range.prop('type') === 'range';
             if (!HTML5) {
                 $range.range('set', val);
-            }
+                }
             var update = $slider.data('update');
             if ($.isFunction(update)) {
                 update($slider, val);
-            }
-        };
+                }
+            };
         var reset = function () {
             $text.val(startvalue);
             textChange();
-        };
+            };
         var resetdefault = function () {
             $text.val(opts.start);
             textChange();
-        };
+            };
         // connect slider and input
         $range.on('change', rangeChange); 
         $text.on('change', textChange);
@@ -354,34 +361,34 @@
         return $slider;
     };
 
-    /** creates a single TinyRangeSlider for param "paramname",
+    /** creates a single TinyRangeSlider with options "options",
         the new value is passed to the "onSubmit" function.
      */
-    var singleSlider = function (data, paramname, onChange, onSubmit) {
+    var singleSlider = function (data, options, onChange, onSubmit) {
         var classname = 'singleslider';
         var $div = $('<div/>');
-        var opts = sliderOptions[paramname];
-        var startvalue = data.settings[paramname] || opts.start;
-        var $slider = tinySlider(data, paramname, startvalue);
+        var startvalue = data.settings[options.param] || options.start;
+        var $slider = tinySlider(data, options, startvalue);
         var getValue = function () {
             // get the new value and do something with it
             var val = $slider.data('$text').val();
-            onSubmit(val);
+            if (typeof onSubmit === 'function') {
+                onSubmit(val);
+                }
             };
         $div.append($slider);
         setupFormDiv(data, $div, classname, getValue);
-        var hasPreview = opts.preview;
+        var hasPreview = options.preview;
         if (hasPreview) {
             var cls = data.settings.cssPrefix + classname;
             var $preview = preview(cls);
             $div.append($preview);
             $slider.data({
                 'cls' : cls,
-                'preview' : $preview,
-                'update' : onChange
+                'preview' : $preview
                 });
-            onChange($slider, startvalue);
-        }
+            }
+        $slider.data({'update' : onChange});
     };
 
     /** creates a compound RGB slider
@@ -405,8 +412,8 @@
                     <div>'+color.label+'</div>\
                 </td>';
             $(html).appendTo($tr);
-            var $brgt = tinySlider(data, 'brgt', color.a);
-            var $cont = tinySlider(data, 'cont', color.m);
+            var $brgt = tinySlider(data, sliderOptions.brightness, color.a);
+            var $cont = tinySlider(data, sliderOptions.contrast, color.m);
             $table.data(value+'a', $brgt.data('$text'));
             $table.data(value+'m', $cont.data('$text'));
             $('<td class="'+css+'rgb"/>').append($brgt).appendTo($tr);
@@ -426,7 +433,9 @@
             var input = $table.data();
             var rgba = input['ra'].val() + '/' + input['ga'].val() + '/' + input['ba'].val();
             var rgbm = input['rm'].val() + '/' + input['gm'].val() + '/' + input['bm'].val();
-            onSubmit(rgbm, rgba);
+            if (typeof onSubmit === 'function') {
+                (rgbm, rgba);
+                }
             };
         $.each(primaryColors, insertTableRow);
         setupFormDiv(data, $div, 'rgbslider', submitSliderValues);
--- a/webapp/src/main/webapp/jquery/jquery.digilib.transparent.js	Thu Feb 06 16:11:31 2014 +0100
+++ b/webapp/src/main/webapp/jquery/jquery.digilib.transparent.js	Thu Feb 06 19:32:55 2014 +0100
@@ -64,16 +64,28 @@
                 },
     };
 
+    var sliderOptions = {
+            param : 'trop',
+            label : "Transparency",
+            tooltip : "set opacity of the transparent image",
+            icon : "set-opacity.png",
+            preview : false,
+            min : 0.0,
+            max : 1.0,
+            step : 0.05,
+            start : 0.0
+            };
+
     var defaults = {
         // is transparent image visible?
         'isTransparentVisible' : false,
-        // Transparency of image
-        'opacity' : 0.5,
+        // Opacity of transparent image
+        'trop' : 0.5,
         // digilib file path for transparent image
-        'tfn' : '',
+        'trfn' : '',
         // digilib file number for transparent image
-        'tpn' : '',
-        // relative digilib coordinates for transparent image
+        'trpn' : '',
+        // digilib coordinates for transparent image (relative to scaler image)
         'trect' : null,
         // general buttonset of this plugin
         'transparentSet' : ['toggletransparent', 'setopacity', 'movetransparent', 'zoomtransparent']
@@ -81,66 +93,83 @@
 
     var actions = {
             // show or hide transparent image
-            toggleTransparent : function (data, param) {
-                var settings = data.settings;
-                var show = !data.settings.isTransparentVisible;
-                data.settings.isTransparentVisible = show;
-                fn.highlightButtons(data, 'transparent', show);
-                renderTransparent(data);
+            toggleTransparent : function (data) {
+                if (data.$transparent == null) {
+                    createTransparent(data);
+                    }
+                showTransparent(data);
                 console.log('toggleTransparent');
-            },
+                },
+
             // make the scaler image shine through
-            setOpacity : function (data, param) {
+            setOpacity : function (data) {
+                var $tp = data.$transparent;
+                if ($tp == null) {
+                    return;
+                    }
                 var settings = data.settings;
-                console.log('setOpacity');
-            },
+                var onChange = function($slider, val) {
+                    $tp.css('opacity', val);
+                    };
+                var onSubmit = function(val) {
+                    $tp.css('opacity', val);
+                    settings.trop = val;
+                    };
+                var $slider = fn.slider(data, sliderOptions, onChange, onSubmit);
+                console.log('setOpacity', settings.trop, $slider);
+                },
+
             // move the transparent image with respect to the scaler image
             moveTransparent : function (data, param) {
                 var settings = data.settings;
                 console.log('moveTransparent');
-            },
+                },
+
             // zoom the transparent image with respect to the scaler image
             zoomTransparent : function (data, param) {
                 var settings = data.settings;
                 console.log('zoomTransparent');
-            }
+                }
     };
 
     // show a transparent image on top of the scaler image 
-    var renderTransparent = function (data) {
-        //var zoomArea = data.zoomArea;
-        //if (!data.imgTrafo) return;
+    var createTransparent = function (data) {
         var settings = data.settings;
-        var cssPrefix = data.settings.cssPrefix;
-        var selector = '#'+cssPrefix+'transparent';
-        var $tp = data.$tp;
-        if ($tp == null) {
-            $tp = $('<div id="'+cssPrefix+'transparent"/>');
-            var queryString = fn.getParamString(settings, ['dw', 'dh']);
-            var file = settings.tfn
-                ? "&fn=" + settings.tfn
-                : "&pn=" + settings.tpn;
-            var url = settings.scalerBaseUrl + '?' + queryString + file;
-            var css = {
-                'position' : 'absolute',
-                'background-image' : 'url(' + url + ')',
-                'background-repeat' : 'no-repeat',
-                'background-position' : '0px 0px',
-                'opacity' : settings.opacity
-                };
-            $tp.css(css);
-            data.$elem.append($tp);
-            data.$tp = $tp;
-            }
+        var cssPrefix = settings.cssPrefix;
+        var $tp = $('<div id="'+cssPrefix+'transparent"/>');
+        var queryString = fn.getParamString(settings, ['dw', 'dh']);
+        var file = settings.trfn
+            ? "&fn=" + settings.trfn
+            : "&pn=" + settings.trpn;
+        var url = settings.scalerBaseUrl + '?' + queryString + file;
+        var css = {
+            'background-image' : 'url(' + url + ')',
+            'background-repeat' : 'no-repeat',
+            'background-position' : '0px 0px',
+            'display' : 'none',
+            'position' : 'absolute',
+            'opacity' : settings.trop
+            };
+        $tp.css(css);
+        data.$transparent = $tp;
+        data.$elem.append($tp);
+        showTransparent(data);
+        };
+
+    // show transparent image
+    var showTransparent = function (data) {
+        var $tp = data.$transparent;
         var show = data.settings.isTransparentVisible;
-        if (show){ 
+        data.settings.isTransparentVisible = !show;
+        fn.highlightButtons(data, 'transparent', show);
+        if (show) {
             $tp.fadeIn();
             data.imgRect.adjustDiv($tp);
             }
         else {
             $tp.fadeOut();
-        }
-    };
+            }
+        };
 
     // reload display after the transparent has been moved or resized
     var redisplay = function (data) {
@@ -185,6 +214,9 @@
         geom = digilib.fn.geometry;
         // import digilib functions
         $.extend(fn, digilib.fn);
+        if (fn.slider == null) {
+            return console.error('jquery.digilib.sliders.js is needed for transparent plugin')
+            }
         FULL_AREA = geom.rectangle(0,0,1,1);
         // add defaults, actions, buttons to the main digilib object
         $.extend(digilib.defaults, defaults);