comparison webapp/src/main/webapp/jquery/jquery.digilib.sliders.js @ 1061:4f5c5c578aa4

rgb slider: color indicator functional, reset works only partially
author hertzhaft
date Sat, 31 Mar 2012 22:34:50 +0200
parents d9abeaa44c49
children 41991d1598f1
comparison
equal deleted inserted replaced
1060:d9abeaa44c49 1061:4f5c5c578aa4
67 } 67 }
68 } 68 }
69 var actions = { 69 var actions = {
70 // shows brightness slider 70 // shows brightness slider
71 tinySliderBrgt : function (data) { 71 tinySliderBrgt : function (data) {
72 var callback = function(val) { 72 var onSubmit = function(val) {
73 digilib.actions.brightness(data, val); 73 digilib.actions.brightness(data, val);
74 }; 74 };
75 singleSlider(data, 'brgt', callback); 75 singleSlider(data, 'brgt', onSubmit);
76 }, 76 },
77 77
78 // shows contrast slider 78 // shows contrast slider
79 tinySliderCont : function (data) { 79 tinySliderCont : function (data) {
80 var callback = function(val) { 80 var onSubmit = function(val) {
81 digilib.actions.contrast(data, val, true); 81 digilib.actions.contrast(data, val, true);
82 }; 82 };
83 singleSlider(data, 'cont', callback); 83 singleSlider(data, 'cont', onSubmit);
84 }, 84 },
85 85
86 // shows rotate slider 86 // shows rotate slider
87 tinySliderRot : function (data) { 87 tinySliderRot : function (data) {
88 var callback = function(val) { 88 var onSubmit = function(val) {
89 digilib.actions.rotate(data, val); 89 digilib.actions.rotate(data, val);
90 }; 90 };
91 singleSlider(data, 'rot', callback); 91 singleSlider(data, 'rot', onSubmit);
92 }, 92 },
93 93
94 // shows RGB sliders 94 // shows RGB sliders
95 tinySliderRGB : function (data) { 95 tinySliderRGB : function (data) {
96 var callback = function(m, a) { 96 var onSubmit = function(m, a) {
97 digilib.actions.setRGB(data, m, a); 97 digilib.actions.setRGB(data, m, a);
98 }; 98 };
99 rgbSlider(data, callback); 99 rgbSlider(data, onSubmit);
100 } 100 }
101 }; 101 };
102 102
103 // assign button actions to sliders (rotate, brightness, contrast) 103 // assign button actions to sliders (rotate, brightness, contrast)
104 var setButtonActions = function () { 104 var setButtonActions = function () {
154 rgb.b[code] = values[2] || 0; 154 rgb.b[code] = values[2] || 0;
155 }; 155 };
156 156
157 /** creates a div with a form, setup events and callback 157 /** creates a div with a form, setup events and callback
158 */ 158 */
159 var setupFormDiv = function (data, $content, cssSuffix, callback) { 159 var setupFormDiv = function (data, $content, cssSuffix, onSubmit) {
160 var cssPrefix = data.settings.cssPrefix; 160 var cssPrefix = data.settings.cssPrefix;
161 var cls = cssPrefix + cssSuffix; 161 var cls = cssPrefix + cssSuffix;
162 var $elem = data.$elem; 162 var $elem = data.$elem;
163 var sliderSelector = '#'+cssPrefix+'slider'; 163 var sliderSelector = '#'+cssPrefix+'slider';
164 if (fn.isOnScreen(data, sliderSelector)) return; // already onscreen 164 if (fn.isOnScreen(data, sliderSelector)) return; // already onscreen
165 var html = '\ 165 var html = '\
166 <div id="'+cssPrefix+'slider" class="'+cls+'">\ 166 <div id="'+cssPrefix+'slider" class="'+cls+'">\
167 <form class="'+cls+'">\ 167 <form class="'+cls+'">\
168 <input class="'+cls+'cancel" type="button" value="Cancel"/>\ 168 <input class="'+cls+'cancel" type="button" value="Cancel"/>\
169 <input class="'+cls+'reset" type="reset" value="Reset"/>\
169 <input type="submit" name="sub" value="Ok"/>\ 170 <input type="submit" name="sub" value="Ok"/>\
170 </form>\ 171 </form>\
171 </div>'; 172 </div>';
172 $div = $(html).appendTo($elem); 173 $div = $(html).appendTo($elem);
173 var $form = $div.find('form'); 174 var $form = $div.find('form');
174 $form.prepend($content); 175 $form.prepend($content);
175 // handle submit 176 // handle submit
176 $form.on('submit', function () { 177 $form.on('submit', function () {
177 callback(); 178 onSubmit();
178 fn.withdraw($div); 179 fn.withdraw($div);
179 return false; 180 return false;
180 }); 181 });
181 // handle cancel 182 // handle cancel
182 $form.find('.'+cls+'cancel').on('click', function () { 183 $form.find('.'+cls+'cancel').on('click', function () {
198 return $div; 199 return $div;
199 }; 200 };
200 201
201 /** creates a TinyRangeSlider 202 /** creates a TinyRangeSlider
202 */ 203 */
203 var tinySlider = function (data, paramname, startval) { 204 var tinySlider = function (data, paramname, onChange, startval) {
204 var $elem = data.$elem; 205 var $elem = data.$elem;
205 var opts = sliderOptions[paramname]; 206 var opts = sliderOptions[paramname];
206 var param = startval || data.settings[paramname] || opts.start; 207 var param = startval || data.settings[paramname] || opts.start;
207 var cssPrefix = data.settings.cssPrefix; 208 var cssPrefix = data.settings.cssPrefix;
208 var cls = cssPrefix + 'tinyslider'; 209 var cls = cssPrefix + 'tinyslider';
219 // connect slider and input 220 // connect slider and input
220 $range.on('change', function () { 221 $range.on('change', function () {
221 // crop floating point imprecision 222 // crop floating point imprecision
222 var val = parseFloat($range.val()).toFixed(4); 223 var val = parseFloat($range.val()).toFixed(4);
223 $text.val(parseFloat(val)); 224 $text.val(parseFloat(val));
225 if ($.isFunction(onChange)) {
226 onChange($slider, val);
227 }
224 }); 228 });
225 $text.on('change', function () { 229 $text.on('change', function () {
226 var val = $text.val(); 230 var val = $text.val();
227 $range.val(val); 231 $range.val(val);
228 // val doesn't change the slider handle position in Tinyrange 232 // val doesn't change the slider handle position in Tinyrange
229 // can't use a jQuery "valHook" here because input type is reported as "text" (???) 233 // can't use a jQuery "valHook" here because input type is reported as "text" (???)
230 var HTML5 = $range.prop('type') === 'range'; 234 var HTML5 = $range.prop('type') === 'range';
231 if (!HTML5) { 235 if (!HTML5) {
232 $range.range('set', val); 236 $range.range('set', val);
233 } 237 }
238 if ($.isFunction(onChange)) {
239 onChange($slider, val);
240 }
234 }); 241 });
235 return $slider; 242 return $slider;
236 }; 243 };
237 244
238 /** creates a single TinyRangeSlider for param "paramname", 245 /** creates a single TinyRangeSlider for param "paramname",
239 the new value is passed to the "callback" function. 246 the new value is passed to the "onSubmit" function.
240 */ 247 */
241 var singleSlider = function (data, paramname, callback) { 248 var singleSlider = function (data, paramname, onSubmit) {
242 var $slider = tinySlider(data, paramname); 249 var onChange = null;
250 var $slider = tinySlider(data, paramname, onChange);
243 var getValue = function () { 251 var getValue = function () {
252 // get the new value and do something with it
244 var val = $slider.data('$text').val(); 253 var val = $slider.data('$text').val();
245 callback(val); 254 onSubmit(val);
246 }; 255 };
247 setupFormDiv(data, $slider, 'singleslider', getValue); 256 setupFormDiv(data, $slider, 'singleslider', getValue);
248 }; 257 };
249 258
250 /** creates a compound RGB slider 259 /** creates a compound RGB slider
251 the new values are passed to the "callback" function. 260 the new values are passed to the "onSubmit" function.
252 */ 261 */
253 var rgbSlider = function (data, callback) { 262 var rgbSlider = function (data, onSubmit) {
254 var css = data.settings.cssPrefix; 263 var css = data.settings.cssPrefix;
255 var cls = css + 'rgbslider'; 264 var cls = css + 'rgbslider';
256 var html = '\ 265 var html = '\
257 <div>\ 266 <div>\
258 <table class="'+cls+'" />\ 267 <table class="'+cls+'" />\
263 <span/><span/><span/><span/><span/><span/><span/><span/><span/>\ 272 <span/><span/><span/><span/><span/><span/><span/><span/><span/>\
264 </div>\ 273 </div>\
265 </div>'; 274 </div>';
266 var $div = $(html); 275 var $div = $(html);
267 var $table = $div.find('table'); 276 var $table = $div.find('table');
277 var onChange = function () {
278 // show effects of color brightness/contrast on a grey scale
279 var input = $table.data();
280 var ra = parseFloat(input['ra'].val());
281 var ga = parseFloat(input['ga'].val());
282 var ba = parseFloat(input['ba'].val());
283 var rm = parseFloat(input['rm'].val());
284 var gm = parseFloat(input['gm'].val());
285 var bm = parseFloat(input['bm'].val());
286 var setRGBValue = function (index) {
287 var val = index * 32;
288 var r = Math.min(Math.max(Math.round(Math.pow(2, rm) * val + ra), 0), 255);
289 var g = Math.min(Math.max(Math.round(Math.pow(2, gm) * val + ga), 0), 255);
290 var b = Math.min(Math.max(Math.round(Math.pow(2, bm) * val + ba), 0), 255);
291 $(this).css('background-color', 'rgb('+r+','+g+','+b+')');
292 };
293 $div.find('div.'+cls+'indicator span').each(setRGBValue);
294 };
268 var setupTableRow = function(index, value) { 295 var setupTableRow = function(index, value) {
269 var color = rgb[value]; 296 var color = rgb[value];
270 // start values are set in "handleSetup" 297 // start values are set in "handleSetup"
271 var $tr = $('<tr/>').appendTo($table); 298 var $tr = $('<tr/>').appendTo($table);
272 var html = '\ 299 var html = '\
273 <td class="'+css+'color '+css+value+'">\ 300 <td class="'+css+'color '+css+value+'">\
274 <div>'+color.label+'</div>\ 301 <div>'+color.label+'</div>\
275 </td>'; 302 </td>';
276 $(html).appendTo($tr); 303 $(html).appendTo($tr);
277 var $brgt = tinySlider(data, 'brgt', color.a); 304 var $brgt = tinySlider(data, 'brgt', onChange, color.a);
278 var $cont = tinySlider(data, 'cont', color.m); 305 var $cont = tinySlider(data, 'cont', onChange, color.m);
279 $table.data(value+'a', $brgt.data('$text')); 306 $table.data(value+'a', $brgt.data('$text'));
280 $table.data(value+'m', $cont.data('$text')); 307 $table.data(value+'m', $cont.data('$text'));
281 $('<td class="'+css+'rgb"/>').append($brgt).appendTo($tr); 308 $('<td class="'+css+'rgb"/>').append($brgt).appendTo($tr);
282 $('<td class="'+css+'rgb"/>').append($cont).appendTo($tr); 309 $('<td class="'+css+'rgb"/>').append($cont).appendTo($tr);
283 } 310 };
284 $.each(primaryColors, setupTableRow); 311 var setGreyScale = function (index) {
285 var setGreyValue = function (index) { 312 // set a series of grey values
286 var val = index * 32; 313 var val = index * 32;
287 $(this).css('background-color', 'rgb('+val+','+val+','+val+')'); 314 $(this).css('background-color', 'rgb('+val+','+val+','+val+')');
288 }; 315 };
289 $div.find('div.'+cls+'grey span').each(setGreyValue);
290 $div.find('div.'+cls+'indicator span').each(setGreyValue);
291 var getValues = function () { 316 var getValues = function () {
292 // get values from sliders 317 // get values from sliders
293 var input = $table.data(); 318 var input = $table.data();
294 var rgba = input['ra'].val() + '/' + input['ga'].val() + '/' + input['ba'].val(); 319 var rgba = input['ra'].val() + '/' + input['ga'].val() + '/' + input['ba'].val();
295 var rgbm = input['rm'].val() + '/' + input['gm'].val() + '/' + input['bm'].val(); 320 var rgbm = input['rm'].val() + '/' + input['gm'].val() + '/' + input['bm'].val();
296 callback(rgbm, rgba); 321 onSubmit(rgbm, rgba);
297 }; 322 };
323 $.each(primaryColors, setupTableRow);
324 $div.find('div.'+cls+'grey span').each(setGreyScale);
298 setupFormDiv(data, $div, 'rgbslider', getValues); 325 setupFormDiv(data, $div, 'rgbslider', getValues);
326 onChange();
299 }; 327 };
300 328
301 // plugin object with name and init 329 // plugin object with name and init
302 // shared objects filled by digilib on registration 330 // shared objects filled by digilib on registration
303 var plugin = { 331 var plugin = {