Mercurial > hg > digilib-old
comparison client/digitallibrary/jquery/jquery.digilib.regions.js @ 792:d742bd92b05a jquery
first step to a regions plugin
author | hertzhaft |
---|---|
date | Fri, 18 Feb 2011 11:11:49 +0100 |
parents | |
children | 12f790cb30de |
comparison
equal
deleted
inserted
replaced
791:304488c72344 | 792:d742bd92b05a |
---|---|
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 var geom; | |
19 | |
20 var buttons = { | |
21 addregion : { | |
22 onclick : "setRegion", | |
23 tooltip : "set a region", | |
24 icon : "addregion.png" | |
25 }, | |
26 delregion : { | |
27 onclick : "removeRegion", | |
28 tooltip : "delete the last region", | |
29 icon : "delregion.png" | |
30 }, | |
31 regions : { | |
32 onclick : "toggleRegions", | |
33 tooltip : "show or hide regions", | |
34 icon : "regions.png" | |
35 }, | |
36 regioninfo : { | |
37 onclick : "infoRegions", | |
38 tooltip : "information about regions", | |
39 icon : "regioninfo.png" | |
40 } | |
41 }; | |
42 var regionSet = ['addregion', 'delregion', 'regions', 'regioninfo', 'lessoptions']; | |
43 | |
44 var actions = { | |
45 // define a region interactively with two clicked points | |
46 "setRegion" : function(data) { | |
47 $elem = data.$elem; | |
48 $scaler = data.$scaler; | |
49 var pt1, pt2; | |
50 var $regionDiv = $('<div class="region" style="display:none"/>'); | |
51 $regionDiv.attr("id", "region" + data.regions.length); | |
52 $elem.append($regionDiv); | |
53 var picRect = geom.rectangle($scaler); | |
54 | |
55 var regionStart = function (evt) { | |
56 pt1 = geom.position(evt); | |
57 // setup and show zoom div | |
58 pt1.adjustDiv($regionDiv); | |
59 $regionDiv.width(0).height(0); | |
60 $regionDiv.show(); | |
61 // register events | |
62 $elem.bind("mousemove.dlRegion", regionMove); | |
63 $elem.bind("mouseup.dlRegion", regionEnd); | |
64 return false; | |
65 }; | |
66 | |
67 // mouse move handler | |
68 var regionMove = function (evt) { | |
69 pt2 = geom.position(evt); | |
70 var rect = geom.rectangle(pt1, pt2); | |
71 rect.clipTo(picRect); | |
72 // update zoom div | |
73 rect.adjustDiv($regionDiv); | |
74 return false; | |
75 }; | |
76 | |
77 // mouseup handler: end moving | |
78 var regionEnd = function (evt) { | |
79 pt2 = geom.position(evt); | |
80 // assume a click and continue if the area is too small | |
81 var clickRect = geom.rectangle(pt1, pt2); | |
82 if (clickRect.getArea() <= 5) return false; | |
83 // unregister events | |
84 $elem.unbind("mousemove.dlRegion", regionMove); | |
85 $elem.unbind("mouseup.dlRegion", regionEnd); | |
86 // clip and transform | |
87 clickRect.clipTo(picRect); | |
88 clickRect.adjustDiv($regionDiv); | |
89 data.regions.push($regionDiv); | |
90 // fn.redisplay(data); | |
91 return false; | |
92 }; | |
93 | |
94 // clear old handler (also ZoomDrag) | |
95 $scaler.unbind('.dlRegion'); | |
96 $elem.unbind('.dlRegion'); | |
97 // bind start zoom handler | |
98 $scaler.one('mousedown.dlRegion', regionStart); | |
99 }, | |
100 | |
101 // remove the last added region | |
102 "removeRegion" : function (data) { | |
103 var $regionDiv = data.regions.pop(); | |
104 $regionDiv.remove(); | |
105 // fn.redisplay(data); | |
106 }, | |
107 | |
108 // add a region programmatically | |
109 "addRegion" : function(data, pos, url) { | |
110 // TODO: backlink mechanism | |
111 if (pos.length === 4) { | |
112 // TODO: trafo | |
113 var $regionDiv = $('<div class="region" style="display:none"/>'); | |
114 $regionDiv.attr("id", "region" + i); | |
115 var regionRect = geom.rectangle(pos[0], pos[1], pos[2], pos[3]); | |
116 regionRect.adjustDiv($regionDiv); | |
117 if (!data.regions) { | |
118 data.regions = []; | |
119 } | |
120 data.regions.push($regionDiv); | |
121 } | |
122 } | |
123 }; | |
124 | |
125 var addRegion = actions.addRegion; | |
126 | |
127 var realizeRegions = function (data) { | |
128 // create regions from parameters | |
129 var settings = data.settings; | |
130 var rg = settings.rg; | |
131 var regions = rg.split(","); | |
132 for (var i = 0; i < regions.length ; i++) { | |
133 var pos = regions.split("/", 4); | |
134 // TODO: backlink mechanism | |
135 var url = paramString.match(/http.*$/); | |
136 addRegion(data, pos, url); | |
137 } | |
138 }; | |
139 | |
140 // display current regions | |
141 var renderRegions = function (data) { | |
142 var regions = data.regions; | |
143 for (var i = 0; i < regions.length; i++) { | |
144 var region = regions[i]; | |
145 if (data.zoomArea.containsPosition(region)) { | |
146 var rpos = data.imgTrafo.transform(region); | |
147 console.debug("renderRegions: rpos=", rpos); | |
148 // create region | |
149 var $regionDiv = $('<div class="region" style="display:none"/>'); | |
150 $regionDiv.attr("id", "region" + data.regions.length); | |
151 $elem.append($regionDiv); | |
152 rpos.adjustDiv($regionDiv); | |
153 } | |
154 } | |
155 }; | |
156 | |
157 var serializeRegions = function (data) { | |
158 if (data.regions) { | |
159 settings.rg = ''; | |
160 for (var i = 0; i < data.regions.length; i++) { | |
161 if (i) { | |
162 settings.rg += ','; | |
163 } | |
164 settings.rg += | |
165 cropFloat(data.regions[i].x).toString() + '/' + | |
166 cropFloat(data.regions[i].y).toString() + '/' + | |
167 cropFloat(data.regions[i].width).toString() + '/' + | |
168 cropFloat(data.regions[i].height).toString(); | |
169 } | |
170 } | |
171 }; | |
172 | |
173 // export constructor functions to digilib plugin | |
174 var init = function (digilibdata) { | |
175 console.log('initialising regions plugin. data:', digilibdata); | |
176 data = digilibdata; | |
177 data.regions = []; | |
178 // setup geometry object | |
179 geom = data.plugins.geometry.init(); | |
180 // add buttons and actions from this plugin | |
181 $.extend(this.buttons, buttons); | |
182 $.extend(this.actions, actions); | |
183 var buttonSettings = data.settings.buttonSettings.fullscreen; | |
184 // configure buttons through digilib "regionSet" option | |
185 var buttonSet = data.settings.regionSet || regionSet; | |
186 // set regionSet to [] or '' for no buttons (when showing regions only) | |
187 if (buttonSet.length && buttonSet.length > 0) { | |
188 buttonSettings['regionSet'] = buttonSet; | |
189 buttonSettings.buttonSets.push('regionSet'); | |
190 } | |
191 fn = this.fn; | |
192 // console.log(data.settings.buttonSettings.fullscreen.buttonSets); | |
193 return { | |
194 }; | |
195 }; | |
196 if ($.fn.digilib == null) { | |
197 $.error("jquery.digilib.regions must be loaded after jquery.digilib!"); | |
198 } else { | |
199 $.fn.digilib('plugin', {name : 'regions', init : init}); | |
200 } | |
201 })(jQuery); |