Mercurial > hg > digilib-old
annotate webapp/src/main/webapp/jquery/jquery.digilib.sliders.js @ 1057:d139f59a5f80
rgb slider functional, get/set values not yet
author | hertzhaft |
---|---|
date | Sat, 31 Mar 2012 00:41:28 +0200 |
parents | 4f17420392a9 |
children | 95d28c6ad018 |
rev | line source |
---|---|
1022 | 1 /** |
2 digilib sliders plugin | |
3 */ | |
4 // TODO: | |
5 // - steps | |
6 // - additional input element for numeric value | |
7 | |
8 (function($) { | |
9 // plugin object with digilib data | |
10 var digilib = null; | |
11 // the functions made available by digilib | |
12 var fn = null; | |
13 // affine geometry plugin | |
14 var geom = null; | |
15 | |
1057 | 16 var defaults = {}; |
1022 | 17 |
1042
2c5a48a624c5
TinyRange sliders now work for brgt,cont,rot (not perfect)
hertzhaft
parents:
1039
diff
changeset
|
18 var sliderOptions = { |
1022 | 19 rot : { |
20 label : "Rotation angle", | |
21 tooltip : "rotate image", | |
22 icon : "rotate.png", | |
23 'min' : 0, | |
24 'max' : 360, | |
1043 | 25 'step' : 0.1, |
1022 | 26 'start' : 90 |
27 }, | |
28 brgt : { | |
29 label : "Brightness", | |
30 tooltip : "set numeric value to be added", | |
31 icon : "brightness.png", | |
32 'min' : -255, | |
33 'max' : 255, | |
1043 | 34 'step' : 10, |
1022 | 35 'start' : 0 |
36 }, | |
37 cont : { | |
38 label : "Contrast", | |
39 tooltip : "set numeric value to be multiplied", | |
40 icon : "contrast.png", | |
41 'min' : -4, | |
42 'max' : 4, | |
1043 | 43 'step' : 0.01, |
1022 | 44 'start' : 0 |
1057 | 45 } |
1022 | 46 }; |
47 | |
1057 | 48 var rgb = { |
49 r : { | |
50 label : "red", | |
51 color : "#800000" | |
52 }, | |
53 g : { | |
54 label : "green", | |
55 color : "#008000" | |
56 }, | |
57 b : { | |
58 label : "blue", | |
59 color : "#000080" | |
60 } | |
61 } | |
1022 | 62 var actions = { |
1038 | 63 // shows brightness slider |
1042
2c5a48a624c5
TinyRange sliders now work for brgt,cont,rot (not perfect)
hertzhaft
parents:
1039
diff
changeset
|
64 tinySliderBrgt : function (data) { |
2c5a48a624c5
TinyRange sliders now work for brgt,cont,rot (not perfect)
hertzhaft
parents:
1039
diff
changeset
|
65 var callback = function(val) { |
2c5a48a624c5
TinyRange sliders now work for brgt,cont,rot (not perfect)
hertzhaft
parents:
1039
diff
changeset
|
66 digilib.actions.brightness(data, val); |
2c5a48a624c5
TinyRange sliders now work for brgt,cont,rot (not perfect)
hertzhaft
parents:
1039
diff
changeset
|
67 }; |
1057 | 68 singleSlider(data, 'brgt', callback); |
1042
2c5a48a624c5
TinyRange sliders now work for brgt,cont,rot (not perfect)
hertzhaft
parents:
1039
diff
changeset
|
69 }, |
2c5a48a624c5
TinyRange sliders now work for brgt,cont,rot (not perfect)
hertzhaft
parents:
1039
diff
changeset
|
70 |
2c5a48a624c5
TinyRange sliders now work for brgt,cont,rot (not perfect)
hertzhaft
parents:
1039
diff
changeset
|
71 // shows contrast slider |
2c5a48a624c5
TinyRange sliders now work for brgt,cont,rot (not perfect)
hertzhaft
parents:
1039
diff
changeset
|
72 tinySliderCont : function (data) { |
2c5a48a624c5
TinyRange sliders now work for brgt,cont,rot (not perfect)
hertzhaft
parents:
1039
diff
changeset
|
73 var callback = function(val) { |
2c5a48a624c5
TinyRange sliders now work for brgt,cont,rot (not perfect)
hertzhaft
parents:
1039
diff
changeset
|
74 digilib.actions.contrast(data, val, true); |
2c5a48a624c5
TinyRange sliders now work for brgt,cont,rot (not perfect)
hertzhaft
parents:
1039
diff
changeset
|
75 }; |
1057 | 76 singleSlider(data, 'cont', callback); |
1042
2c5a48a624c5
TinyRange sliders now work for brgt,cont,rot (not perfect)
hertzhaft
parents:
1039
diff
changeset
|
77 }, |
2c5a48a624c5
TinyRange sliders now work for brgt,cont,rot (not perfect)
hertzhaft
parents:
1039
diff
changeset
|
78 |
2c5a48a624c5
TinyRange sliders now work for brgt,cont,rot (not perfect)
hertzhaft
parents:
1039
diff
changeset
|
79 // shows rotate slider |
2c5a48a624c5
TinyRange sliders now work for brgt,cont,rot (not perfect)
hertzhaft
parents:
1039
diff
changeset
|
80 tinySliderRot : function (data) { |
2c5a48a624c5
TinyRange sliders now work for brgt,cont,rot (not perfect)
hertzhaft
parents:
1039
diff
changeset
|
81 var callback = function(val) { |
2c5a48a624c5
TinyRange sliders now work for brgt,cont,rot (not perfect)
hertzhaft
parents:
1039
diff
changeset
|
82 digilib.actions.rotate(data, val); |
2c5a48a624c5
TinyRange sliders now work for brgt,cont,rot (not perfect)
hertzhaft
parents:
1039
diff
changeset
|
83 }; |
1057 | 84 singleSlider(data, 'rot', callback); |
85 }, | |
1022 | 86 |
1057 | 87 // shows RGB sliders |
88 tinySliderRGB : function (data) { | |
89 var callback = function(m, a) { | |
90 digilib.actions.setRGB(data, m, a); | |
91 }; | |
92 rgbSlider(data, callback); | |
93 } | |
1022 | 94 }; |
95 | |
1045 | 96 // assign button actions to sliders (rotate, brightness, contrast) |
97 var setButtonActions = function () { | |
98 if (fn.setButtonAction == null) { | |
99 console.debug('sliders: could not assign button actions. Maybe jquery.digilib.buttons.js was not loaded?'); | |
1022 | 100 return; |
101 } | |
1045 | 102 console.debug('sliders: assign new button actions. digilib:', digilib); |
103 fn.setButtonAction('brgt', 'tinySliderBrgt'); | |
104 fn.setButtonAction('cont', 'tinySliderCont'); | |
105 fn.setButtonAction('rot', 'tinySliderRot'); | |
1057 | 106 // fn.setButtonAction('rgb', 'tinySliderRGB'); |
1022 | 107 }; |
108 | |
109 // plugin installation called by digilib on plugin object. | |
110 var install = function (plugin) { | |
111 digilib = plugin; | |
112 console.debug('installing sliders plugin. digilib:', digilib); | |
113 fn = digilib.fn; | |
114 // import geometry classes | |
115 geom = fn.geometry; | |
116 // add defaults, actions, buttons | |
117 $.extend(true, digilib.defaults, defaults); // make deep copy | |
118 $.extend(digilib.actions, actions); | |
1038 | 119 setButtonActions(digilib.buttons); |
1022 | 120 // export functions |
121 }; | |
122 | |
123 // plugin initialization | |
124 var init = function (data) { | |
125 console.debug('initialising sliders plugin. data:', data); | |
1057 | 126 // var settings = data.settings; |
127 // var $data = $(data); | |
1026 | 128 // we do setup at runtime |
129 // $data.bind('setup', handleSetup); | |
1022 | 130 }; |
131 | |
1057 | 132 /** creates a div with a form, setup events and callback |
1022 | 133 */ |
1057 | 134 var setupFormDiv = function (data, $content, cssSuffix, callback) { |
135 var cssPrefix = data.settings.cssPrefix; | |
136 var cls = cssPrefix + cssSuffix; | |
1026 | 137 var html = '\ |
1057 | 138 <div class="'+cls+'">\ |
139 <form class="'+cls+'">\ | |
140 <input class="'+cls+'cancel" type="button" value="Cancel"/>\ | |
141 <input type="submit" name="sub" value="Ok"/>\ | |
1042
2c5a48a624c5
TinyRange sliders now work for brgt,cont,rot (not perfect)
hertzhaft
parents:
1039
diff
changeset
|
142 </form>\ |
2c5a48a624c5
TinyRange sliders now work for brgt,cont,rot (not perfect)
hertzhaft
parents:
1039
diff
changeset
|
143 </div>'; |
1057 | 144 var $elem = data.$elem; |
145 var $div = $(html).appendTo($elem); | |
146 var $form = $div.find('form'); | |
147 $form.prepend($content); | |
148 // handle submit | |
149 $form.on('submit', function () { | |
150 callback(); | |
151 fn.withdraw($div); | |
152 return false; | |
153 }); | |
154 // handle cancel | |
155 $form.find('.'+cls+'cancel').on('click', function () { | |
156 fn.withdraw($div); | |
157 }); | |
158 // show div | |
159 $div.fadeIn(); | |
1042
2c5a48a624c5
TinyRange sliders now work for brgt,cont,rot (not perfect)
hertzhaft
parents:
1039
diff
changeset
|
160 // fix non-HTML5 slider |
1057 | 161 var tiny = cssPrefix + 'tinyslider'; |
162 var $range = $form.find('input.'+tiny+'range'); | |
1042
2c5a48a624c5
TinyRange sliders now work for brgt,cont,rot (not perfect)
hertzhaft
parents:
1039
diff
changeset
|
163 var HTML5 = $range.prop('type') === 'range'; |
2c5a48a624c5
TinyRange sliders now work for brgt,cont,rot (not perfect)
hertzhaft
parents:
1039
diff
changeset
|
164 if (!HTML5) { |
2c5a48a624c5
TinyRange sliders now work for brgt,cont,rot (not perfect)
hertzhaft
parents:
1039
diff
changeset
|
165 console.debug('fix input type=range'); |
2c5a48a624c5
TinyRange sliders now work for brgt,cont,rot (not perfect)
hertzhaft
parents:
1039
diff
changeset
|
166 $range.range({change: function (val) { |
2c5a48a624c5
TinyRange sliders now work for brgt,cont,rot (not perfect)
hertzhaft
parents:
1039
diff
changeset
|
167 $range.trigger('change'); |
2c5a48a624c5
TinyRange sliders now work for brgt,cont,rot (not perfect)
hertzhaft
parents:
1039
diff
changeset
|
168 }}); |
2c5a48a624c5
TinyRange sliders now work for brgt,cont,rot (not perfect)
hertzhaft
parents:
1039
diff
changeset
|
169 } |
1057 | 170 fn.centerOnScreen(data, $div); |
171 return $div; | |
172 }; | |
173 | |
174 /** creates a TinyRangeSlider | |
175 */ | |
176 var tinySlider = function (data, paramname, startval) { | |
177 var $elem = data.$elem; | |
178 var opts = sliderOptions[paramname]; | |
179 var param = startval || data.settings[paramname] || opts.start; | |
180 var cssPrefix = data.settings.cssPrefix; | |
181 var cls = cssPrefix + 'tinyslider'; | |
182 var html = '\ | |
183 <div class="'+cls+'frame">\ | |
184 <span>'+opts.label+'</span>\ | |
185 <input type="range" class="'+cls+'range" name="'+paramname+'" step="'+opts.step+'" min="'+opts.min+'" max="'+opts.max+'" value="'+param+'"/>\ | |
186 <input type="text" class="'+cls+'text" name="'+paramname+'" size="4" value="'+param+'"/>\ | |
187 </div>'; | |
188 var $slider = $(html); | |
189 var $range = $slider.find('input.'+cls+'range'); | |
190 var $text = $slider.find('input.'+cls+'text'); | |
191 $slider.data({'$text' : $text, '$range' : $range}); | |
1042
2c5a48a624c5
TinyRange sliders now work for brgt,cont,rot (not perfect)
hertzhaft
parents:
1039
diff
changeset
|
192 // connect slider and input |
2c5a48a624c5
TinyRange sliders now work for brgt,cont,rot (not perfect)
hertzhaft
parents:
1039
diff
changeset
|
193 $range.on('change', function () { |
2c5a48a624c5
TinyRange sliders now work for brgt,cont,rot (not perfect)
hertzhaft
parents:
1039
diff
changeset
|
194 var val = $range.val(); |
2c5a48a624c5
TinyRange sliders now work for brgt,cont,rot (not perfect)
hertzhaft
parents:
1039
diff
changeset
|
195 $text.val(val); |
2c5a48a624c5
TinyRange sliders now work for brgt,cont,rot (not perfect)
hertzhaft
parents:
1039
diff
changeset
|
196 }); |
2c5a48a624c5
TinyRange sliders now work for brgt,cont,rot (not perfect)
hertzhaft
parents:
1039
diff
changeset
|
197 $text.on('change', function () { |
2c5a48a624c5
TinyRange sliders now work for brgt,cont,rot (not perfect)
hertzhaft
parents:
1039
diff
changeset
|
198 var val = $text.val(); |
2c5a48a624c5
TinyRange sliders now work for brgt,cont,rot (not perfect)
hertzhaft
parents:
1039
diff
changeset
|
199 $range.val(val); |
1057 | 200 // val doesn't change the slider handle position in Tinyrange |
201 // can't use a jQuery "valHook" here because input type is reported as "text" (???) | |
202 var HTML5 = $range.prop('type') === 'range'; | |
1044 | 203 if (!HTML5) { |
204 $range.range('set', val); | |
205 } | |
1042
2c5a48a624c5
TinyRange sliders now work for brgt,cont,rot (not perfect)
hertzhaft
parents:
1039
diff
changeset
|
206 }); |
1057 | 207 return $slider; |
208 }; | |
209 | |
210 /** creates a single TinyRangeSlider for param "paramname", | |
211 the new value is passed to the "callback" function. | |
212 */ | |
213 var singleSlider = function (data, paramname, callback) { | |
214 var $slider = tinySlider(data, paramname); | |
215 var getValue = function () { | |
216 var val = $slider.data('$text').val(); | |
217 callback(val); | |
218 }; | |
219 setupFormDiv(data, $slider, 'singleslider', getValue); | |
220 }; | |
221 | |
222 /** creates a compound RGB slider | |
223 the new values are passed to the "callback" function. | |
224 */ | |
225 var rgbSlider = function (data, callback) { | |
226 var cls = data.settings.cssPrefix + 'rgbslider'; | |
227 var $table = $('<table class="'+cls+'" />'); | |
228 var makeSliders = function(index, value) { | |
229 // TODO: set start values | |
230 var $tr = $('<tr/>').appendTo($table); | |
231 var $td = $('<td class="color">'+rgb[value].label+'</td>').appendTo($tr); | |
232 var $td = $('<td class="rgb"/>').append(tinySlider(data, 'brgt')).appendTo($tr); | |
233 var $td = $('<td class="rgb"/>').append(tinySlider(data, 'cont')).appendTo($tr); | |
234 } | |
235 $.each(['r','g','b'], makeSliders); | |
236 var getValue = function () { | |
237 // TODO: get values from sliders | |
238 callback(null, null); | |
239 }; | |
240 setupFormDiv(data, $table, 'rgbslider', getValue); | |
1042
2c5a48a624c5
TinyRange sliders now work for brgt,cont,rot (not perfect)
hertzhaft
parents:
1039
diff
changeset
|
241 }; |
2c5a48a624c5
TinyRange sliders now work for brgt,cont,rot (not perfect)
hertzhaft
parents:
1039
diff
changeset
|
242 |
1022 | 243 // plugin object with name and init |
244 // shared objects filled by digilib on registration | |
245 var plugin = { | |
246 name : 'sliders', | |
247 install : install, | |
248 init : init, | |
249 buttons : {}, | |
250 actions : {}, | |
251 fn : {}, | |
252 plugins : {} | |
253 }; | |
254 | |
255 if ($.fn.digilib == null) { | |
256 $.error("jquery.digilib.sliders must be loaded after jquery.digilib!"); | |
257 } else { | |
258 $.fn.digilib('plugin', plugin); | |
259 } | |
260 })(jQuery); |