Mercurial > hg > digilib
comparison client/digitallibrary/jquery/jquery.digilib.birdseye.js @ 788:040e9bc1602e jquery
birds eye view now as a plugin.
digilib now 200 lines less!
author | robcast |
---|---|
date | Fri, 18 Feb 2011 18:58:52 +0100 |
parents | 912519475259 |
children | 32d1d6601968 |
comparison
equal
deleted
inserted
replaced
787:1eef3e7a2270 | 788:040e9bc1602e |
---|---|
14 tooltip : "show bird's eye view", | 14 tooltip : "show bird's eye view", |
15 icon : "birds-eye.png" | 15 icon : "birds-eye.png" |
16 } | 16 } |
17 }; | 17 }; |
18 | 18 |
19 var defaults = { | |
20 // is birdView shown? | |
21 'isBirdDivVisible' : false, | |
22 // dimensions of bird's eye div | |
23 'birdDivWidth' : 200, | |
24 'birdDivHeight' : 200, | |
25 // parameters used by bird's eye div | |
26 'birdDivParams' : ['fn','pn','dw','dh'] | |
27 }; | |
28 | |
19 var actions = { | 29 var actions = { |
20 // event handler: toggles the visibility of the bird's eye window | 30 // event handler: toggles the visibility of the bird's eye window |
21 showBirdDiv : function (data, show) { | 31 showBirdDiv : function (data, show) { |
22 var settings = data.settings; | 32 var settings = data.settings; |
23 if (data.$birdDiv == null) { | 33 if (data.$birdDiv == null) { |
24 // no bird div -> create | 34 // no bird div -> create |
25 setupBirdDiv(data); | 35 setupBirdDiv(data); |
26 } | 36 } |
27 var on = showDiv(settings.isBirdDivVisible, data.$birdDiv, show); | 37 var on = digilib.fn.showDiv(settings.isBirdDivVisible, data.$birdDiv, show); |
28 settings.isBirdDivVisible = on; | 38 settings.isBirdDivVisible = on; |
29 highlightButtons(data, 'bird', on); | 39 digilib.fn.highlightButtons(data, 'bird', on); |
30 updateBirdDiv(data); | 40 updateBirdDiv(data); |
31 storeOptions(data); | 41 digilib.fn.storeOptions(data); |
32 } | 42 } |
33 }; | 43 }; |
34 | 44 |
35 // plugin initialization called by digilib on plugin object. | 45 // plugin installation called by digilib on plugin object. |
36 var install = function() { | 46 var install = function(digilib) { |
37 // import geometry classes | 47 // import geometry classes |
38 geom = this.fn.geometry; | 48 geom = digilib.fn.geometry; |
39 FULL_AREA = digilib.fn.FULL_AREA; | 49 FULL_AREA = geom.rectangle(0,0,1,1); |
40 // TODO: add actions | 50 // add defaults |
41 // TODO: add buttons | 51 $.extend(digilib.defaults, defaults); |
42 // TODO: add event handlers | 52 // add actions |
53 $.extend(digilib.actions, actions); | |
54 // add buttons | |
55 $.extend(digilib.buttons, buttons); | |
56 // insert in button list -- not elegant | |
57 digilib.defaults.buttonSettings.fullscreen.standardSet.splice(9, 0, 'bird'); | |
58 digilib.defaults.buttonSettings.embedded.standardSet.splice(5, 0, 'bird'); | |
59 }; | |
60 | |
61 // plugin initialization | |
62 var init = function (data) { | |
63 var $data = $(data); | |
64 // install event handler | |
65 $data.bind('setup', handleSetup); | |
66 $data.bind('update', handleUpdate); | |
67 $data.bind('dragZoom', handleDragZoom); | |
43 }; | 68 }; |
44 | 69 |
45 | 70 |
71 var handleSetup = function (evt) { | |
72 console.debug("birdseye: handleSetup"); | |
73 data = this; | |
74 // bird's eye view creation | |
75 if (data.settings.isBirdDivVisible) { | |
76 setupBirdDiv(data); | |
77 data.$birdDiv.show(); | |
78 } | |
79 }; | |
80 | |
81 var handleUpdate = function (evt) { | |
82 console.debug("birdseye: handleUpdate"); | |
83 data = this; | |
84 if (data.settings.isBirdDivVisible) { | |
85 renderBirdArea(data); | |
86 setupBirdDrag(data); | |
87 } | |
88 }; | |
89 | |
90 var handleDragZoom = function (evt, zoomArea) { | |
91 //console.debug("birdseye: handleDragZoom za="+zoomArea); | |
92 data = this; | |
93 if (data.settings.isBirdDivVisible) { | |
94 setBirdZoom(data, zoomArea); | |
95 } | |
96 }; | |
97 | |
46 // returns URL for bird's eye view image | 98 // returns URL for bird's eye view image |
47 var getBirdImgUrl = function (data, moreParams) { | 99 var getBirdImgUrl = function (data) { |
48 var settings = data.settings; | 100 var settings = data.settings; |
49 var birdDivOptions = { | 101 var birdDivOptions = { |
50 dw : settings.birdDivWidth, | 102 dw : settings.birdDivWidth, |
51 dh : settings.birdDivHeight | 103 dh : settings.birdDivHeight |
52 }; | 104 }; |
53 var birdSettings = $.extend({}, settings, birdDivOptions); | 105 var birdSettings = $.extend({}, settings, birdDivOptions); |
54 // use only the relevant parameters | 106 // use only the relevant parameters |
55 if (moreParams == null) { | 107 var params = digilib.fn.getParamString(birdSettings, settings.birdDivParams, digilib.defaults); |
56 var params = getParamString(birdSettings, settings.birdDivParams, defaults); | |
57 } else { | |
58 // filter scaler flags | |
59 if (birdSettings.mo != null) { | |
60 var mo = ''; | |
61 if (data.scalerFlags.hmir != null) { | |
62 mo += 'hmir,'; | |
63 } | |
64 if (data.scalerFlags.vmir != null) { | |
65 mo += 'vmir'; | |
66 } | |
67 birdSettings.mo = mo; | |
68 } | |
69 var params = getParamString(birdSettings, | |
70 settings.birdDivParams.concat(moreParams), defaults); | |
71 } | |
72 var url = settings.scalerBaseUrl + '?' + params; | 108 var url = settings.scalerBaseUrl + '?' + params; |
73 return url; | 109 return url; |
74 }; | 110 }; |
75 | 111 |
76 // creates HTML structure for the bird's eye view in elem | 112 // creates HTML structure for the bird's eye view in elem |
121 if (birdRect.width === 0) { | 157 if (birdRect.width === 0) { |
122 // malheureusement IE7 calls load handler when there is no size info yet | 158 // malheureusement IE7 calls load handler when there is no size info yet |
123 setTimeout(function () { $birdImg.triggerHandler('load'); }, 200); | 159 setTimeout(function () { $birdImg.triggerHandler('load'); }, 200); |
124 } | 160 } |
125 // update display (zoom area indicator) | 161 // update display (zoom area indicator) |
126 updateDisplay(data); | 162 digilib.fn.updateDisplay(data); |
127 }; | 163 }; |
128 }; | 164 }; |
129 | 165 |
130 // show zoom area indicator on bird's eye view | 166 // show zoom area indicator on bird's eye view |
131 var renderBirdArea = function (data) { | 167 var renderBirdArea = function (data) { |
132 if (data.$birdImg == null || ! data.$birdImg.get(0).complete) return; | 168 if (data.$birdImg == null || ! data.$birdImg.get(0).complete) return; |
133 var $birdZoom = data.$birdZoom; | 169 var $birdZoom = data.$birdZoom; |
134 var zoomArea = data.zoomArea; | 170 var zoomArea = data.zoomArea; |
135 var normalSize = isFullArea(zoomArea); | 171 var normalSize = digilib.fn.isFullArea(zoomArea); |
136 if (normalSize) { | 172 if (normalSize) { |
137 $birdZoom.hide(); | 173 $birdZoom.hide(); |
138 return; | 174 return; |
139 } else { | 175 } else { |
140 $birdZoom.show(); | 176 $birdZoom.show(); |
141 } | 177 } |
142 // create Transform from current area and picsize | 178 // create Transform from current area and picsize |
143 data.birdTrafo = getImgTrafo(data.$birdImg, FULL_AREA); | 179 data.birdTrafo = digilib.fn.getImgTrafo(data.$birdImg, FULL_AREA); |
144 var zoomRect = data.birdTrafo.transform(zoomArea); | 180 var zoomRect = data.birdTrafo.transform(zoomArea); |
145 console.debug("renderBirdArea:", zoomRect, "zoomArea:", zoomArea, "$birdTrafo:", data.birdTrafo); | 181 console.debug("renderBirdArea:", zoomRect, "zoomArea:", zoomArea, "$birdTrafo:", data.birdTrafo); |
146 // acount for border width | 182 // acount for border width |
147 var bw = getBorderWidth($birdZoom); | 183 var bw = digilib.fn.getBorderWidth($birdZoom); |
148 zoomRect.addPosition({x : -bw, y : -bw}); | 184 zoomRect.addPosition({x : -bw, y : -bw}); |
149 if (data.settings.interactionMode === 'fullscreen') { | 185 if (data.settings.interactionMode === 'fullscreen') { |
150 // no animation for fullscreen | 186 // no animation for fullscreen |
151 zoomRect.adjustDiv($birdZoom); | 187 zoomRect.adjustDiv($birdZoom); |
152 } else { | 188 } else { |
168 var $birdImg = data.$birdImg; | 204 var $birdImg = data.$birdImg; |
169 var $birdZoom = data.$birdZoom; | 205 var $birdZoom = data.$birdZoom; |
170 var $document = $(document); | 206 var $document = $(document); |
171 var $scaler = data.$scaler; | 207 var $scaler = data.$scaler; |
172 var startPos, newRect, birdImgRect, birdZoomRect, fullRect, scalerPos; | 208 var startPos, newRect, birdImgRect, birdZoomRect, fullRect, scalerPos; |
173 var bw = getBorderWidth($birdZoom); | 209 var bw = digilib.fn.getBorderWidth($birdZoom); |
174 | 210 |
175 // mousedown handler: start dragging bird zoom to a new position | 211 // mousedown handler: start dragging bird zoom to a new position |
176 var birdZoomStartDrag = function(evt) { | 212 var birdZoomStartDrag = function(evt) { |
177 startPos = geom.position(evt); | 213 startPos = geom.position(evt); |
178 // position may have changed | 214 // position may have changed |
179 data.birdTrafo = getImgTrafo($birdImg, FULL_AREA); | 215 data.birdTrafo = digilib.fn.getImgTrafo($birdImg, FULL_AREA); |
180 birdImgRect = geom.rectangle($birdImg); | 216 birdImgRect = geom.rectangle($birdImg); |
181 birdZoomRect = geom.rectangle($birdZoom); | 217 birdZoomRect = geom.rectangle($birdZoom); |
182 scalerPos = geom.position($scaler); | 218 scalerPos = geom.position($scaler); |
183 newRect = null; | 219 newRect = null; |
184 fullRect = setZoomBG(data); // setup zoom background image | 220 fullRect = digilib.fn.setZoomBG(data); // setup zoom background image |
185 $document.bind("mousemove.dlBirdMove", birdZoomMove); | 221 $document.bind("mousemove.dlBirdMove", birdZoomMove); |
186 $document.bind("mouseup.dlBirdMove", birdZoomEndDrag); | 222 $document.bind("mouseup.dlBirdMove", birdZoomEndDrag); |
187 return false; | 223 return false; |
188 }; | 224 }; |
189 | 225 |
227 } | 263 } |
228 // ugly, but needed to prevent double border width compensation | 264 // ugly, but needed to prevent double border width compensation |
229 newRect.addPosition({x : bw, y : bw}); | 265 newRect.addPosition({x : bw, y : bw}); |
230 var newArea = data.birdTrafo.invtransform(newRect); | 266 var newArea = data.birdTrafo.invtransform(newRect); |
231 data.zoomArea = newArea; | 267 data.zoomArea = newArea; |
232 redisplay(data); | 268 digilib.fn.redisplay(data); |
233 return false; | 269 return false; |
234 }; | 270 }; |
235 | 271 |
236 // clear old handler | 272 // clear old handler |
237 $document.unbind(".dlBirdMove"); | 273 $document.unbind(".dlBirdMove"); |
238 $birdImg.unbind(".dlBirdMove"); | 274 $birdImg.unbind(".dlBirdMove"); |
239 $birdZoom.unbind(".dlBirdMove"); | 275 $birdZoom.unbind(".dlBirdMove"); |
240 if (! isFullArea(data.zoomArea)) { | 276 if (! digilib.fn.isFullArea(data.zoomArea)) { |
241 // set new handler | 277 // set new handler |
242 $birdImg.bind("mousedown.dlBirdMove", birdZoomStartDrag); | 278 $birdImg.bind("mousedown.dlBirdMove", birdZoomStartDrag); |
243 $birdZoom.bind("mousedown.dlBirdMove", birdZoomStartDrag); | 279 $birdZoom.bind("mousedown.dlBirdMove", birdZoomStartDrag); |
244 } | 280 } |
245 }; | 281 }; |
246 | 282 |
247 // move bird zoom indicator to reflect zoomed detail area | 283 // move bird zoom indicator to reflect zoomed detail area |
248 var setBirdZoom = function(data, rect) { | 284 var setBirdZoom = function(data, rect) { |
249 var part = data.imgTrafo.invtransform(rect); | 285 var part = data.imgTrafo.invtransform(rect); |
250 // area = FULL_AREA.fit(part); // no, we want to see where we transcend the borders | 286 // area = FULL_AREA.fit(part); // no, we want to see where we transcend the borders |
251 birdTrafo = getImgTrafo(data.$birdImg, FULL_AREA); | 287 birdTrafo = digilib.fn.getImgTrafo(data.$birdImg, FULL_AREA); |
252 var birdRect = birdTrafo.transform(part); | 288 var birdRect = birdTrafo.transform(part); |
253 var $birdZoom = data.$birdZoom; | 289 var $birdZoom = data.$birdZoom; |
254 // acount for border width | 290 // acount for border width |
255 var bw = getBorderWidth($birdZoom); | 291 var bw = digilib.fn.getBorderWidth($birdZoom); |
256 birdRect.addPosition({x : -bw, y : -bw}); | 292 birdRect.addPosition({x : -bw, y : -bw}); |
257 birdRect.adjustDiv(data.$birdZoom); | 293 birdRect.adjustDiv(data.$birdZoom); |
258 }; | 294 }; |
259 | 295 |
260 // plugin object with name and init | 296 // plugin object with name and init |
261 // shared objects filled by digilib on registration | 297 // shared objects filled by digilib on registration |
262 var digilib = { | 298 var digilib = { |
263 name : 'birdseye', | 299 name : 'birdseye', |
264 install : install, | 300 install : install, |
301 init : init, | |
265 buttons : {}, | 302 buttons : {}, |
266 actions : {}, | 303 actions : {}, |
267 fn : {}, | 304 fn : {}, |
268 plugins : {} | 305 plugins : {} |
269 }; | 306 }; |