Mercurial > hg > digilib-old
comparison webapp/src/main/webapp/jquery/jquery.digilib.regions.js @ 1107:365f95a14057
factor out defineArea, using overlay div
author | hertzhaft |
---|---|
date | Sat, 27 Oct 2012 00:06:29 +0200 |
parents | 415da4e4b76b |
children | ae796bcac7f4 |
comparison
equal
deleted
inserted
replaced
1106:68756216e018 | 1107:365f95a14057 |
---|---|
94 icon : "regioninfo.png" | 94 icon : "regioninfo.png" |
95 } | 95 } |
96 }; | 96 }; |
97 | 97 |
98 var defaults = { | 98 var defaults = { |
99 // are regions being edited? | |
100 'editRegions' : false, | |
101 // are regions shown? | 99 // are regions shown? |
102 'isRegionVisible' : true, | 100 'isRegionVisible' : true, |
103 // are region numbers shown? | 101 // are region numbers shown? |
104 'showRegionNumbers' : true, | 102 'showRegionNumbers' : true, |
105 // default width for region when only point is given | 103 // default width for region when only point is given |
142 defineUserRegion : function(data) { | 140 defineUserRegion : function(data) { |
143 if (!data.settings.isRegionVisible) { | 141 if (!data.settings.isRegionVisible) { |
144 alert("Please turn on regions visibility!"); | 142 alert("Please turn on regions visibility!"); |
145 return; | 143 return; |
146 } | 144 } |
147 var $elem = data.$elem; | 145 var onComplete = function(data, rect) { |
148 var $body = $('body'); | 146 if (rect == null) return; |
149 var bodyRect = geom.rectangle($body); | |
150 var $scaler = data.$scaler; | |
151 var scalerRect = geom.rectangle($scaler); | |
152 var pt1, pt2; | |
153 // overlay prevents other elements from reacting to mouse events | |
154 var $overlay = $('<div class="'+CSS+'overlay" style="position:absolute"/>'); | |
155 $body.append($overlay); | |
156 bodyRect.adjustDiv($overlay); | |
157 var attr = {'class' : CSS+"regionURL"}; | |
158 var $regionDiv = newRegionDiv(data, attr); | |
159 | |
160 // mousedown handler: start sizing | |
161 var regionStart = function (evt) { | |
162 pt1 = geom.position(evt); | |
163 // setup and show zoom div | |
164 pt1.adjustDiv($regionDiv); | |
165 $regionDiv.width(0).height(0); | |
166 $regionDiv.show(); | |
167 // register mouse events | |
168 $overlay.on("mousemove.dlRegion", regionMove); | |
169 $overlay.on("mouseup.dlRegion", regionEnd); | |
170 return false; | |
171 }; | |
172 | |
173 // mousemove handler: size region | |
174 var regionMove = function (evt) { | |
175 pt2 = geom.position(evt); | |
176 var rect = geom.rectangle(pt1, pt2); | |
177 rect.clipTo(scalerRect); | |
178 // update region | |
179 rect.adjustDiv($regionDiv); | |
180 return false; | |
181 }; | |
182 | |
183 // mouseup handler: end sizing | |
184 var regionEnd = function (evt) { | |
185 pt2 = geom.position(evt); | |
186 // assume a click and continue if the area is too small | |
187 var clickRect = geom.rectangle(pt1, pt2); | |
188 if (clickRect.getArea() <= 5) return false; | |
189 // unregister mouse events and get rid of overlay | |
190 $overlay.off("mousemove.dlRegion", regionMove); | |
191 $overlay.off("mouseup.dlRegion", regionEnd); | |
192 $overlay.remove(); | |
193 // clip region | |
194 clickRect.clipTo(scalerRect); | |
195 clickRect.adjustDiv($regionDiv); | |
196 regionTrafo(data, $regionDiv); | |
197 var count = getRegions(data, 'regionURL').length; | 147 var count = getRegions(data, 'regionURL').length; |
198 addRegionNumber(data, $regionDiv, count); | 148 var attr = {'class' : CSS+'regionURL '+CSS+'overlay'}; |
149 var item = {'rect' : rect, 'index' : count, 'attributes' : attr}; | |
150 var $regionDiv = addRegionDiv(data, item); | |
199 fn.highlightButtons(data, 'defineregion', 0); | 151 fn.highlightButtons(data, 'defineregion', 0); |
200 redisplay(data); | 152 redisplay(data); |
201 $(data).trigger('newRegion', [$regionDiv]); | 153 $(data).trigger('newRegion', [$regionDiv]); |
202 return false; | 154 }; |
203 }; | |
204 | |
205 // bind start zoom handler | |
206 $overlay.one('mousedown.dlRegion', regionStart); | |
207 fn.highlightButtons(data, 'defineregion', 1); | 155 fn.highlightButtons(data, 'defineregion', 1); |
156 fn.defineArea(data, onComplete, CSS+'regionArea'); | |
208 }, | 157 }, |
209 | 158 |
210 // remove the last added URL region | 159 // remove the last added URL region |
211 removeUserRegion : function (data) { | 160 removeUserRegion : function (data) { |
212 if (!data.settings.isRegionVisible) { | 161 if (!data.settings.isRegionVisible) { |
213 alert("Please turn on regions visibility!"); | 162 alert("Please turn on regions visibility!"); |
214 return; | 163 return; |
215 } | 164 } |
216 var selector = 'div.'+CSS+'regionURL'; | 165 var selector = 'div.'+CSS+'regionURL'; |
217 var $regionDiv = data.$elem.find(selector).last(); | 166 var $regionDiv = data.$elem.find(selector).last(); |
167 if ($regionDiv.length == 0) return; | |
218 $regionDiv.remove(); | 168 $regionDiv.remove(); |
219 redisplay(data); | 169 redisplay(data); |
220 }, | 170 }, |
221 | 171 |
222 // remove all manually added regions (defined through URL "rg" parameter) | 172 // remove all manually added regions (defined through URL "rg" parameter) |
225 alert("Please turn on regions visibility!"); | 175 alert("Please turn on regions visibility!"); |
226 return; | 176 return; |
227 } | 177 } |
228 var selector = 'div.'+CSS+'regionURL'; | 178 var selector = 'div.'+CSS+'regionURL'; |
229 var $regionDivs = data.$elem.find(selector); | 179 var $regionDivs = data.$elem.find(selector); |
180 if ($regionDivs.length == 0) return; | |
230 $regionDivs.remove(); | 181 $regionDivs.remove(); |
231 redisplay(data); | 182 redisplay(data); |
232 }, | 183 }, |
233 | 184 |
234 // show/hide regions | 185 // show/hide regions |
266 var bind = function(name) { | 217 var bind = function(name) { |
267 $info.find('.'+name).on('click.regioninfo', function () { | 218 $info.find('.'+name).on('click.regioninfo', function () { |
268 $info.find('div.'+CSS+'info').hide(); | 219 $info.find('div.'+CSS+'info').hide(); |
269 $info.find('div.'+CSS+name).show(); | 220 $info.find('div.'+CSS+name).show(); |
270 fn.centerOnScreen(data, $info); | 221 fn.centerOnScreen(data, $info); |
222 return false; | |
271 }); | 223 }); |
272 }; | 224 }; |
273 bind('html'); | 225 bind('html'); |
274 bind('svgattr'); | 226 bind('svgattr'); |
275 bind('csv'); | 227 bind('csv'); |
276 bind('digilib'); | 228 bind('digilib'); |
229 $info.on('click.regioninfo', function () { | |
230 fn.withdraw($info); | |
231 }); | |
277 $info.find('.x').on('click.regioninfo', function () { | 232 $info.find('.x').on('click.regioninfo', function () { |
278 fn.withdraw($info); | 233 fn.withdraw($info); |
279 }); | 234 }); |
280 $info.fadeIn(); | 235 $info.fadeIn(); |
281 fn.centerOnScreen(data, $info); | 236 fn.centerOnScreen(data, $info); |
319 var rect = parseCoords(data, coords); | 274 var rect = parseCoords(data, coords); |
320 if (rect == null) { | 275 if (rect == null) { |
321 alert('invalid coordinates: ' + coords); | 276 alert('invalid coordinates: ' + coords); |
322 return; | 277 return; |
323 } | 278 } |
324 var attr = { 'class' : CSS+'regionURL '+CSS+'findregion' }; | 279 var attr = { 'class' : CSS+'findregion' }; |
325 var item = { 'rect' : rect, 'attributes' : attr }; | 280 var item = { 'rect' : rect, 'attributes' : attr }; |
326 var $regionDiv = addRegionDiv(data, item); | 281 var $regionDiv = addRegionDiv(data, item); |
327 var za = data.zoomArea; | 282 var za = data.zoomArea; |
328 if (!fn.isFullArea(za)) { | 283 if (!fn.isFullArea(za)) { |
329 za.setCenter(rect.getCenter()).stayInside(FULL_AREA); | 284 za.setCenter(rect.getCenter()).stayInside(FULL_AREA); |
360 $form.on('submit', function () { | 315 $form.on('submit', function () { |
361 var coords = $input.val(); | 316 var coords = $input.val(); |
362 actions.regionFromCoords(data, coords); | 317 actions.regionFromCoords(data, coords); |
363 fn.withdraw($info); | 318 fn.withdraw($info); |
364 return false; | 319 return false; |
320 }); | |
321 // handle blur | |
322 $input.on('blur', function () { | |
323 fn.withdraw($info); | |
365 }); | 324 }); |
366 // handle cancel | 325 // handle cancel |
367 $form.find('.'+CSS+'cancel').on('click', function () { | 326 $form.find('.'+CSS+'cancel').on('click', function () { |
368 fn.withdraw($info); | 327 fn.withdraw($info); |
369 }); | 328 }); |
447 }; | 406 }; |
448 | 407 |
449 // create a new regionDiv and add it to data.$elem | 408 // create a new regionDiv and add it to data.$elem |
450 var newRegionDiv = function (data, attr) { | 409 var newRegionDiv = function (data, attr) { |
451 var cls = CSS+'region'; | 410 var cls = CSS+'region'; |
452 var $regionDiv = $('<div class="'+cls+'" style="display:none"/>'); | 411 var $regionDiv = $('<div class="'+cls+'"/>'); |
453 addRegionAttributes(data, $regionDiv, attr); | 412 addRegionAttributes(data, $regionDiv, attr); |
454 data.$elem.append($regionDiv); | 413 data.$elem.append($regionDiv); |
455 return $regionDiv; | 414 return $regionDiv; |
456 }; | |
457 | |
458 // calculate the digilib coordinates of a completed user-defined region | |
459 var regionTrafo = function (data, $regionDiv) { | |
460 var screenRect = geom.rectangle($regionDiv); | |
461 var rect = data.imgTrafo.invtransform(screenRect); | |
462 $regionDiv.data('rect', rect); | |
463 console.debug("regionTrafo", $regionDiv, rect); | |
464 return rect; | |
465 }; | 415 }; |
466 | 416 |
467 // copy attributes to a region div | 417 // copy attributes to a region div |
468 var addRegionAttributes = function (data, $regionDiv, attributes) { | 418 var addRegionAttributes = function (data, $regionDiv, attributes) { |
469 if (attributes == null) return; | 419 if (attributes == null) return; |
539 if (rect == null) { | 489 if (rect == null) { |
540 return console.error('bad coords in HTML:', title, coords); | 490 return console.error('bad coords in HTML:', title, coords); |
541 } | 491 } |
542 // mark div class as regionHTML | 492 // mark div class as regionHTML |
543 var cls = $area.attr('class') || ''; | 493 var cls = $area.attr('class') || ''; |
544 cls += ' '+CSS+'regionHTML'; | 494 cls += ' '+CSS+'regionHTML '+CSS+'overlay'; |
545 var attr = {'class' : cls}; | 495 var attr = {'class' : cls}; |
546 // copy attributes | 496 // copy attributes |
547 for (var n in data.settings.regionAttributes) { | 497 for (var n in data.settings.regionAttributes) { |
548 attr[n] = $area.attr(n); | 498 attr[n] = $area.attr(n); |
549 } | 499 } |
677 if (rg == null) return []; | 627 if (rg == null) return []; |
678 var coords = rg.split(","); | 628 var coords = rg.split(","); |
679 var regions = $.map(coords, function(coord, index) { | 629 var regions = $.map(coords, function(coord, index) { |
680 var pos = coord.split("/", 4); | 630 var pos = coord.split("/", 4); |
681 var rect = geom.rectangle(pos[0], pos[1], pos[2], pos[3]); | 631 var rect = geom.rectangle(pos[0], pos[1], pos[2], pos[3]); |
682 var attr = {'class' : CSS+"regionURL"}; | 632 var attr = {'class' : CSS+"regionURL "+CSS+"overlay"}; |
683 var item = {'rect' : rect, 'index' : index+1, 'attributes' : attr}; | 633 var item = {'rect' : rect, 'index' : index+1, 'attributes' : attr}; |
684 return item; | 634 return item; |
685 }); | 635 }); |
686 return regions; | 636 return regions; |
687 }; | 637 }; |