Mercurial > hg > digilib-old
comparison client/digitallibrary/jquery/jquery.digilib.regions.js @ 813:1a7b14deae3a jquery
regions plugin works, inclunding event handlers
author | hertzhaft |
---|---|
date | Mon, 21 Feb 2011 01:03:55 +0100 |
parents | ae8e98c479d5 |
children | 60e8cca7ac81 |
comparison
equal
deleted
inserted
replaced
812:b484631f37c1 | 813:1a7b14deae3a |
---|---|
9 - backlink mechanism | 9 - backlink mechanism |
10 - don't write to data.settings? | 10 - don't write to data.settings? |
11 */ | 11 */ |
12 | 12 |
13 (function($) { | 13 (function($) { |
14 // the digilib object | |
15 var digilib; | |
14 // the data object passed by digilib | 16 // the data object passed by digilib |
15 var data; | 17 var data; |
16 var buttons; | 18 // the functions made available by digilib |
17 var fn; | 19 var fn; |
18 // affine geometry plugin stub | 20 // affine geometry plugin |
19 var geom; | 21 var geom; |
20 | 22 |
21 var FULL_AREA; | 23 var FULL_AREA; |
24 | |
25 var ID_PREFIX = "digilib-region-"; | |
22 | 26 |
23 var buttons = { | 27 var buttons = { |
24 addregion : { | 28 addregion : { |
25 onclick : "setRegion", | 29 onclick : "defineRegion", |
26 tooltip : "set a region", | 30 tooltip : "define a region", |
27 icon : "addregion.png" | 31 icon : "addregion.png" |
28 }, | 32 }, |
29 delregion : { | 33 delregion : { |
30 onclick : "removeRegion", | 34 onclick : "removeRegion", |
31 tooltip : "delete the last region", | 35 tooltip : "delete the last region", |
44 }; | 48 }; |
45 | 49 |
46 var defaults = { | 50 var defaults = { |
47 // are regions shown? | 51 // are regions shown? |
48 'isRegionVisible' : true, | 52 'isRegionVisible' : true, |
53 // are region numbers shown? | |
54 'showRegionNumbers' : false, | |
49 // buttonset of this plugin | 55 // buttonset of this plugin |
50 'regionSet' : ['addregion', 'delregion', 'regions', 'regioninfo', 'lessoptions'], | 56 'regionSet' : ['addregion', 'delregion', 'regions', 'regioninfo', 'lessoptions'], |
51 // array of defined regions | 57 // url param for regions |
52 'regions' : [] | 58 'rg' : null, |
53 }; | 59 }; |
54 | 60 |
55 var actions = { | 61 var actions = { |
56 | 62 |
57 // define a region interactively with two clicked points | 63 // define a region interactively with two clicked points |
58 "setRegion" : function(data) { | 64 "defineRegion" : function(data) { |
65 if (!data.settings.isRegionVisible) { | |
66 alert("Please turn on regions visibility!"); | |
67 return; | |
68 } | |
59 var $elem = data.$elem; | 69 var $elem = data.$elem; |
60 var $body = $('body'); | 70 var $body = $('body'); |
61 var bodyRect = geom.rectangle($body); | 71 var bodyRect = geom.rectangle($body); |
62 var $scaler = data.$scaler; | 72 var $scaler = data.$scaler; |
63 var scalerRect = geom.rectangle($scaler); | 73 var scalerRect = geom.rectangle($scaler); |
64 var pt1, pt2; | 74 var pt1, pt2; |
65 // overlay prevents other elements from reacting to mouse events | 75 // overlay prevents other elements from reacting to mouse events |
66 var $overlay = $('<div class="digilib-overlay"/>'); | 76 var $overlay = $('<div class="digilib-overlay"/>'); |
67 $body.append($overlay); | 77 $body.append($overlay); |
68 bodyRect.adjustDiv($overlay); | 78 bodyRect.adjustDiv($overlay); |
69 // the region to be defined | 79 // we count regions from 1 |
70 var $regionDiv = $('<div class="region" style="display:none"/>'); | 80 var $regionDiv = addRegionDiv(data, data.regions.length + 1); |
71 $elem.append($regionDiv); | |
72 | 81 |
73 // mousedown handler: start sizing | 82 // mousedown handler: start sizing |
74 var regionStart = function (evt) { | 83 var regionStart = function (evt) { |
75 pt1 = geom.position(evt); | 84 pt1 = geom.position(evt); |
76 // setup and show zoom div | 85 // setup and show zoom div |
104 $overlay.unbind("mouseup.dlRegion", regionEnd); | 113 $overlay.unbind("mouseup.dlRegion", regionEnd); |
105 $overlay.remove(); | 114 $overlay.remove(); |
106 // clip region | 115 // clip region |
107 clickRect.clipTo(scalerRect); | 116 clickRect.clipTo(scalerRect); |
108 clickRect.adjustDiv($regionDiv); | 117 clickRect.adjustDiv($regionDiv); |
109 data.settings.regions.push(clickRect); // TODO: trafo, params | 118 storeRegion(data, $regionDiv); |
110 // fn.redisplay(data); | 119 // fn.redisplay(data); |
120 fn.highlightButtons(data, 'addregion', 0); | |
121 redisplay(data); | |
111 return false; | 122 return false; |
112 }; | 123 }; |
113 | 124 |
114 // bind start zoom handler | 125 // bind start zoom handler |
115 $overlay.one('mousedown.dlRegion', regionStart); | 126 $overlay.one('mousedown.dlRegion', regionStart); |
127 fn.highlightButtons(data, 'addregion', 1); | |
116 }, | 128 }, |
117 | 129 |
118 // remove the last added region | 130 // remove the last added region |
119 "removeRegion" : function (data) { | 131 "removeRegion" : function (data) { |
120 var $regionDiv = data.settings.regions.pop(); | 132 if (!data.settings.isRegionVisible) { |
133 alert("Please turn on regions visibility!"); | |
134 return; | |
135 } | |
136 var region = data.regions.pop(); | |
137 if (region == null) return; | |
138 var $regionDiv = region.$div; | |
121 $regionDiv.remove(); | 139 $regionDiv.remove(); |
122 // fn.redisplay(data); | 140 redisplay(data); |
123 }, | 141 }, |
124 | 142 |
125 // add a region programmatically | 143 // show/hide regions |
126 "addRegion" : function(data, pos, url) { | 144 "toggleRegions" : function (data) { |
145 var show = !data.settings.isRegionVisible; | |
146 data.settings.isRegionVisible = show; | |
147 fn.highlightButtons(data, 'regions' , show); | |
148 showRegionDivs(data); | |
149 } | |
150 }; | |
151 | |
152 var addRegion = actions.addRegion; | |
153 | |
154 // store a region div | |
155 var storeRegion = function (data, $regionDiv) { | |
156 var regions = data.regions; | |
157 var rect = geom.rectangle($regionDiv); | |
158 var regionRect = data.imgTrafo.invtransform(rect); | |
159 regionRect.$div = $regionDiv; | |
160 regions.push(regionRect); | |
161 console.debug("regions", data.regions, "regionRect", regionRect); | |
162 }; | |
163 | |
164 // add a region to data.$elem | |
165 var addRegionDiv = function (data, nr) { | |
166 var $regionDiv = $('<div class="region overlay" style="display:none"/>'); | |
167 $regionDiv.attr("id", ID_PREFIX + nr); | |
168 data.$elem.append($regionDiv); | |
169 if (data.settings.showRegionNumbers) { | |
170 var $regionNr = $('<div class="regionnumber" />'); | |
171 $regionNr.text(nr); | |
172 $regionDiv.append($regionNr); | |
173 } | |
174 return $regionDiv; | |
175 }; | |
176 | |
177 // create a region div from the data.regions collection | |
178 var createRegionDiv = function (data, index) { | |
179 var regions = data.regions; | |
180 if (index > regions.length) return null; | |
181 var region = regions[index]; | |
182 var $regionDiv = addRegionDiv(data, index + 1); // we count regions from 1 | |
183 region.$div = $regionDiv; | |
184 // TODO store original coords in $regionDiv.data for embedded mode? | |
185 return $regionDiv; | |
186 }; | |
187 | |
188 // create regions | |
189 var createRegionDivs = function (data) { | |
190 for (var i = 0; i < data.regions.length ; i++) { | |
191 createRegionDiv(data, i); | |
192 } | |
193 }; | |
194 | |
195 // show a region on top of the scaler image | |
196 var showRegionDiv = function (data, index) { | |
197 if (!data.imgTrafo) return; | |
198 var $elem = data.$elem; | |
199 var regions = data.regions; | |
200 if (index > regions.length) return; | |
201 var region = regions[index] | |
202 var $regionDiv = region.$div; | |
203 if (!$regionDiv) { | |
204 console.debug("showRegionDiv: region has no $div", region); | |
205 // alert("showRegionDiv: region has no $div to show"); | |
206 return; | |
207 } | |
208 var regionRect = region.copy(); | |
209 var show = data.settings.isRegionVisible; | |
210 if (show && data.zoomArea.overlapsRect(regionRect)) { | |
211 regionRect.clipTo(data.zoomArea); | |
212 var screenRect = data.imgTrafo.transform(regionRect); | |
213 screenRect.adjustDiv($regionDiv); | |
214 $regionDiv.show(); | |
215 } else { | |
216 $regionDiv.hide(); | |
217 } | |
218 }; | |
219 | |
220 // show regions | |
221 var showRegionDivs = function (data) { | |
222 for (var i = 0; i < data.regions.length ; i++) { | |
223 showRegionDiv(data, i); | |
224 } | |
225 }; | |
226 | |
227 var unpackRegions = function (data) { | |
228 // create regions from parameters | |
229 var rg = data.settings.rg; | |
230 if (rg == null) return; | |
231 var regions = data.regions; | |
232 var rs = rg.split(","); | |
233 for (var i = 0; i < rs.length; i++) { | |
234 var r = rs[i]; | |
235 var pos = r.split("/", 4); | |
236 var rect = geom.rectangle(pos[0], pos[1], pos[2], pos[3]); | |
237 regions.push(rect); | |
127 // TODO: backlink mechanism | 238 // TODO: backlink mechanism |
128 if (pos.length === 4) { | 239 // var url = paramString.match(/http.*$/); |
129 // TODO: trafo | 240 } |
130 var $regionDiv = $('<div class="region" style="display:none"/>'); | 241 }; |
131 $regionDiv.attr("id", "region" + i); | 242 |
132 var regionRect = geom.rectangle(pos[0], pos[1], pos[2], pos[3]); | 243 // pack regions array into a parameter string |
133 regionRect.adjustDiv($regionDiv); | 244 var packRegions = function (data) { |
134 if (!data.regions) { | 245 var regions = data.regions; |
135 data.regions = []; | 246 if (!regions.length) return; |
136 } | 247 var rg = ''; |
137 data.regions.push($regionDiv); | |
138 } | |
139 } | |
140 }; | |
141 | |
142 var addRegion = actions.addRegion; | |
143 | |
144 var realizeRegions = function (data) { | |
145 // create regions from parameters | |
146 var settings = data.settings; | |
147 var rg = settings.rg; | |
148 var regions = rg.split(","); | |
149 for (var i = 0; i < regions.length ; i++) { | |
150 var pos = regions.split("/", 4); | |
151 // TODO: backlink mechanism | |
152 var url = paramString.match(/http.*$/); | |
153 addRegion(data, pos, url); | |
154 } | |
155 }; | |
156 | |
157 // display current regions | |
158 var renderRegions = function (data) { | |
159 var regions = data.regions; | |
160 for (var i = 0; i < regions.length; i++) { | 248 for (var i = 0; i < regions.length; i++) { |
161 var region = regions[i]; | 249 region = regions[i]; |
162 if (data.zoomArea.containsPosition(region)) { | 250 if (i) { |
163 var rpos = data.imgTrafo.transform(region); | 251 rg += ','; |
164 console.debug("renderRegions: rpos=", rpos); | 252 } |
165 // create region | 253 rg += [ |
166 var $regionDiv = $('<div class="region" style="display:none"/>'); | 254 fn.cropFloatStr(region.x), |
167 $regionDiv.attr("id", "region" + data.regions.length); | 255 fn.cropFloatStr(region.y), |
168 $elem.append($regionDiv); | 256 fn.cropFloatStr(region.width), |
169 rpos.adjustDiv($regionDiv); | 257 fn.cropFloatStr(region.height) |
170 } | 258 ].join('/'); |
171 } | 259 } |
172 }; | 260 data.settings.rg = rg; |
173 | 261 }; |
174 var serializeRegions = function (data) { | 262 |
175 if (data.regions) { | 263 var redisplay = function (data) { |
176 settings.rg = ''; | 264 packRegions(data); |
177 for (var i = 0; i < data.regions.length; i++) { | 265 fn.redisplay(data); |
178 if (i) { | 266 } |
179 settings.rg += ','; | |
180 } | |
181 settings.rg += | |
182 cropFloat(data.regions[i].x).toString() + '/' + | |
183 cropFloat(data.regions[i].y).toString() + '/' + | |
184 cropFloat(data.regions[i].width).toString() + '/' + | |
185 cropFloat(data.regions[i].height).toString(); | |
186 } | |
187 } | |
188 }; | |
189 | 267 |
190 var handleSetup = function (evt) { | 268 var handleSetup = function (evt) { |
191 console.debug("regions: handleSetup"); | |
192 data = this; | 269 data = this; |
193 // if (data.settings.isBirdDivVisible) { | 270 console.debug("regions: handleSetup", data.settings.rg); |
194 // setupBirdDiv(data); | 271 unpackRegions(data); |
195 // data.$birdDiv.show(); | 272 createRegionDivs(data); |
196 // } | |
197 }; | 273 }; |
198 | 274 |
199 var handleUpdate = function (evt) { | 275 var handleUpdate = function (evt) { |
200 console.debug("regions: handleUpdate"); | |
201 data = this; | 276 data = this; |
202 // if (data.settings.isBirdDivVisible) { | 277 fn.highlightButtons(data, 'regions' , data.settings.isRegionVisible); |
203 // renderBirdArea(data); | 278 showRegionDivs(data); |
204 // setupBirdDrag(data); | 279 console.debug("regions: handleUpdate", data.settings.rg); |
205 // } | |
206 }; | 280 }; |
207 | 281 |
208 var handleRedisplay = function (evt) { | 282 var handleRedisplay = function (evt) { |
283 data = this; | |
284 showRegionDivs(data); | |
209 console.debug("regions: handleRedisplay"); | 285 console.debug("regions: handleRedisplay"); |
210 data = this; | |
211 // if (data.settings.isBirdDivVisible) { | |
212 // updateBirdDiv(data); | |
213 // } | |
214 }; | 286 }; |
215 | 287 |
216 var handleDragZoom = function (evt, zoomArea) { | 288 var handleDragZoom = function (evt, zoomArea) { |
217 console.debug("regions: handleDragZoom, zoomArea:", zoomArea); | 289 console.debug("regions: handleDragZoom, zoomArea:", zoomArea); |
218 data = this; | 290 data = this; |
219 // if (data.settings.isBirdDivVisible) { | |
220 // setBirdZoom(data, zoomArea); | |
221 // } | |
222 }; | 291 }; |
223 | 292 |
224 // plugin installation called by digilib on plugin object. | 293 // plugin installation called by digilib on plugin object. |
225 var install = function(digilib) { | 294 var install = function(plugin) { |
295 digilib = plugin; | |
226 console.debug('installing regions plugin. digilib:', digilib); | 296 console.debug('installing regions plugin. digilib:', digilib); |
297 fn = digilib.fn; | |
227 // import geometry classes | 298 // import geometry classes |
228 geom = digilib.fn.geometry; | 299 geom = fn.geometry; |
229 FULL_AREA = geom.rectangle(0,0,1,1); | 300 FULL_AREA = geom.rectangle(0,0,1,1); |
230 // add defaults, actions, buttons | 301 // add defaults, actions, buttons |
231 $.extend(digilib.defaults, defaults); | 302 $.extend(digilib.defaults, defaults); |
232 $.extend(digilib.actions, actions); | 303 $.extend(digilib.actions, actions); |
233 $.extend(digilib.buttons, buttons); | 304 $.extend(digilib.buttons, buttons); |
242 var buttonSet = data.settings.regionSet || regionSet; | 313 var buttonSet = data.settings.regionSet || regionSet; |
243 // set regionSet to [] or '' for no buttons (when showing regions only) | 314 // set regionSet to [] or '' for no buttons (when showing regions only) |
244 if (buttonSet.length && buttonSet.length > 0) { | 315 if (buttonSet.length && buttonSet.length > 0) { |
245 buttonSettings['regionSet'] = buttonSet; | 316 buttonSettings['regionSet'] = buttonSet; |
246 buttonSettings.buttonSets.push('regionSet'); | 317 buttonSettings.buttonSets.push('regionSet'); |
247 } | 318 } |
248 // install event handler | 319 // install event handler |
249 $data.bind('setup', handleSetup); | 320 $data.bind('setup', handleSetup); |
250 $data.bind('update', handleUpdate); | 321 $data.bind('update', handleUpdate); |
251 $data.bind('redisplay', handleRedisplay); | 322 $data.bind('redisplay', handleRedisplay); |
252 $data.bind('dragZoom', handleDragZoom); | 323 $data.bind('dragZoom', handleDragZoom); |
324 // regions array | |
325 data.regions = []; | |
326 // add "rg" to digilibParamNames | |
327 data.settings.digilibParamNames.push('rg'); | |
253 }; | 328 }; |
254 | 329 |
255 // plugin object with name and install/init methods | 330 // plugin object with name and install/init methods |
256 // shared objects filled by digilib on registration | 331 // shared objects filled by digilib on registration |
257 var pluginProperties = { | 332 var pluginProperties = { |