Mercurial > hg > digilib-old
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 = { |