Mercurial > hg > digilib-old
comparison client/digitallibrary/jquery/jquery.digilib.regions.js @ 800:65e70c03870b stream
merge from juqery branch
12f790cb30de0ac42ff62fb9921d7a3215243b7b
author | robcast |
---|---|
date | Sat, 19 Feb 2011 09:56:18 +0100 |
parents | 12f790cb30de |
children | ae8e98c479d5 |
comparison
equal
deleted
inserted
replaced
774:4568e539abd2 | 800:65e70c03870b |
---|---|
1 /** optional digilib regions plugin | |
2 | |
3 markup a digilib image with rectangular regions | |
4 | |
5 TODO: | |
6 - store region in params/cookie, regarding zoom, mirror, rotation (like marks) | |
7 - set regions programmatically | |
8 - read regions from params/cookie and display | |
9 - backlink mechanism | |
10 - don't write to data.settings? | |
11 */ | |
12 | |
13 (function($) { | |
14 // the data object passed by digilib | |
15 var data; | |
16 var buttons; | |
17 var fn; | |
18 // affine geometry plugin stub | |
19 var geom; | |
20 | |
21 var FULL_AREA; | |
22 | |
23 var buttons = { | |
24 addregion : { | |
25 onclick : "setRegion", | |
26 tooltip : "set a region", | |
27 icon : "addregion.png" | |
28 }, | |
29 delregion : { | |
30 onclick : "removeRegion", | |
31 tooltip : "delete the last region", | |
32 icon : "delregion.png" | |
33 }, | |
34 regions : { | |
35 onclick : "toggleRegions", | |
36 tooltip : "show or hide regions", | |
37 icon : "regions.png" | |
38 }, | |
39 regioninfo : { | |
40 onclick : "infoRegions", | |
41 tooltip : "information about regions", | |
42 icon : "regioninfo.png" | |
43 } | |
44 }; | |
45 | |
46 var defaults = { | |
47 // are regions shown? | |
48 'isRegionVisible' : true, | |
49 // buttonset of this plugin | |
50 'regionSet' : ['addregion', 'delregion', 'regions', 'regioninfo', 'lessoptions'], | |
51 // array of defined regions | |
52 'regions' : [] | |
53 }; | |
54 | |
55 var actions = { | |
56 // define a region interactively with two clicked points | |
57 "setRegion" : function(data) { | |
58 var $elem = data.$elem; | |
59 var $scaler = data.$scaler; | |
60 var picRect = geom.rectangle($scaler); | |
61 var pt1, pt2; | |
62 // TODO: temporary rectangle only, pass values to "addRegion" factory | |
63 var $tempDiv = $('<div class="region" style="display:none"/>'); | |
64 $elem.append($tempDiv); | |
65 | |
66 var regionStart = function (evt) { | |
67 pt1 = geom.position(evt); | |
68 // setup and show zoom div | |
69 pt1.adjustDiv($tempDiv); | |
70 $tempDiv.width(0).height(0); | |
71 $tempDiv.show(); | |
72 // register events | |
73 $elem.bind("mousemove.dlRegion", regionMove); | |
74 $elem.bind("mouseup.dlRegion", regionEnd); | |
75 return false; | |
76 }; | |
77 | |
78 // mouse move handler | |
79 var regionMove = function (evt) { | |
80 pt2 = geom.position(evt); | |
81 var rect = geom.rectangle(pt1, pt2); | |
82 rect.clipTo(picRect); | |
83 // update zoom div | |
84 rect.adjustDiv($tempDiv); | |
85 return false; | |
86 }; | |
87 | |
88 // mouseup handler: end moving | |
89 var regionEnd = function (evt) { | |
90 pt2 = geom.position(evt); | |
91 // assume a click and continue if the area is too small | |
92 var clickRect = geom.rectangle(pt1, pt2); | |
93 if (clickRect.getArea() <= 5) return false; | |
94 // unregister events | |
95 $elem.unbind("mousemove.dlRegion", regionMove); | |
96 $elem.unbind("mouseup.dlRegion", regionEnd); | |
97 // clip and transform | |
98 clickRect.clipTo(picRect); | |
99 clickRect.adjustDiv($tempDiv); | |
100 $tempDiv.remove(); | |
101 data.settings.regions.push(clickRect); | |
102 // fn.redisplay(data); | |
103 return false; | |
104 }; | |
105 | |
106 // clear old handler (also ZoomDrag) | |
107 $scaler.unbind('.dlRegion'); | |
108 $elem.unbind('.dlRegion'); | |
109 // bind start zoom handler | |
110 $scaler.one('mousedown.dlRegion', regionStart); | |
111 }, | |
112 | |
113 // remove the last added region | |
114 "removeRegion" : function (data) { | |
115 var $regionDiv = data.settings.regions.pop(); | |
116 $regionDiv.remove(); | |
117 // fn.redisplay(data); | |
118 }, | |
119 | |
120 // add a region programmatically | |
121 "addRegion" : function(data, pos, url) { | |
122 // TODO: backlink mechanism | |
123 if (pos.length === 4) { | |
124 // TODO: trafo | |
125 var $regionDiv = $('<div class="region" style="display:none"/>'); | |
126 $regionDiv.attr("id", "region" + i); | |
127 var regionRect = geom.rectangle(pos[0], pos[1], pos[2], pos[3]); | |
128 regionRect.adjustDiv($regionDiv); | |
129 if (!data.regions) { | |
130 data.regions = []; | |
131 } | |
132 data.regions.push($regionDiv); | |
133 } | |
134 } | |
135 }; | |
136 | |
137 var addRegion = actions.addRegion; | |
138 | |
139 var realizeRegions = function (data) { | |
140 // create regions from parameters | |
141 var settings = data.settings; | |
142 var rg = settings.rg; | |
143 var regions = rg.split(","); | |
144 for (var i = 0; i < regions.length ; i++) { | |
145 var pos = regions.split("/", 4); | |
146 // TODO: backlink mechanism | |
147 var url = paramString.match(/http.*$/); | |
148 addRegion(data, pos, url); | |
149 } | |
150 }; | |
151 | |
152 // display current regions | |
153 var renderRegions = function (data) { | |
154 var regions = data.regions; | |
155 for (var i = 0; i < regions.length; i++) { | |
156 var region = regions[i]; | |
157 if (data.zoomArea.containsPosition(region)) { | |
158 var rpos = data.imgTrafo.transform(region); | |
159 console.debug("renderRegions: rpos=", rpos); | |
160 // create region | |
161 var $regionDiv = $('<div class="region" style="display:none"/>'); | |
162 $regionDiv.attr("id", "region" + data.regions.length); | |
163 $elem.append($regionDiv); | |
164 rpos.adjustDiv($regionDiv); | |
165 } | |
166 } | |
167 }; | |
168 | |
169 var serializeRegions = function (data) { | |
170 if (data.regions) { | |
171 settings.rg = ''; | |
172 for (var i = 0; i < data.regions.length; i++) { | |
173 if (i) { | |
174 settings.rg += ','; | |
175 } | |
176 settings.rg += | |
177 cropFloat(data.regions[i].x).toString() + '/' + | |
178 cropFloat(data.regions[i].y).toString() + '/' + | |
179 cropFloat(data.regions[i].width).toString() + '/' + | |
180 cropFloat(data.regions[i].height).toString(); | |
181 } | |
182 } | |
183 }; | |
184 | |
185 var handleSetup = function (evt) { | |
186 console.debug("regions: handleSetup"); | |
187 data = this; | |
188 // if (data.settings.isBirdDivVisible) { | |
189 // setupBirdDiv(data); | |
190 // data.$birdDiv.show(); | |
191 // } | |
192 }; | |
193 | |
194 var handleUpdate = function (evt) { | |
195 console.debug("regions: handleUpdate"); | |
196 data = this; | |
197 // if (data.settings.isBirdDivVisible) { | |
198 // renderBirdArea(data); | |
199 // setupBirdDrag(data); | |
200 // } | |
201 }; | |
202 | |
203 var handleRedisplay = function (evt) { | |
204 console.debug("regions: handleRedisplay"); | |
205 data = this; | |
206 // if (data.settings.isBirdDivVisible) { | |
207 // updateBirdDiv(data); | |
208 // } | |
209 }; | |
210 | |
211 var handleDragZoom = function (evt, zoomArea) { | |
212 console.debug("regions: handleDragZoom, zoomArea:", zoomArea); | |
213 data = this; | |
214 // if (data.settings.isBirdDivVisible) { | |
215 // setBirdZoom(data, zoomArea); | |
216 // } | |
217 }; | |
218 | |
219 // plugin installation called by digilib on plugin object. | |
220 var install = function(digilib) { | |
221 // import geometry classes | |
222 geom = digilib.fn.geometry; | |
223 FULL_AREA = geom.rectangle(0,0,1,1); | |
224 // add defaults | |
225 $.extend(digilib.defaults, defaults); | |
226 // add actions | |
227 $.extend(digilib.actions, actions); | |
228 // add buttons | |
229 $.extend(digilib.buttons, buttons); | |
230 }; | |
231 | |
232 // plugin initialization | |
233 var init = function (data) { | |
234 console.debug('initialising regions plugin. data:', data); | |
235 var $data = $(data); | |
236 var buttonSettings = data.settings.buttonSettings.fullscreen; | |
237 // configure buttons through digilib "regionSet" option | |
238 var buttonSet = data.settings.regionSet || regionSet; | |
239 // set regionSet to [] or '' for no buttons (when showing regions only) | |
240 if (buttonSet.length && buttonSet.length > 0) { | |
241 buttonSettings['regionSet'] = buttonSet; | |
242 buttonSettings.buttonSets.push('regionSet'); | |
243 } | |
244 // install event handler | |
245 $data.bind('setup', handleSetup); | |
246 $data.bind('update', handleUpdate); | |
247 $data.bind('redisplay', handleRedisplay); | |
248 $data.bind('dragZoom', handleDragZoom); | |
249 }; | |
250 | |
251 // plugin object with name and init | |
252 // shared objects filled by digilib on registration | |
253 var pluginProperties = { | |
254 name : 'region', | |
255 install : install, | |
256 init : init, | |
257 buttons : {}, | |
258 actions : {}, | |
259 fn : {}, | |
260 plugins : {} | |
261 }; | |
262 | |
263 if ($.fn.digilib == null) { | |
264 $.error("jquery.digilib.birdview must be loaded after jquery.digilib!"); | |
265 } else { | |
266 $.fn.digilib('plugin', pluginProperties); | |
267 } | |
268 })(jQuery); |