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 = {