changeset 1317:cac657d25ba9

use vector plugin defineShape method for annotation shapes.
author robcast
date Fri, 23 Jan 2015 12:16:46 +0100
parents 6afc572d63be
children bf94aaa0a2c1
files webapp/src/main/webapp/jquery/jquery.digilib.annotator.js webapp/src/main/webapp/jquery/jquery.digilib.vector.js
diffstat 2 files changed, 75 insertions(+), 31 deletions(-) [+]
line wrap: on
line diff
--- a/webapp/src/main/webapp/jquery/jquery.digilib.annotator.js	Thu Jan 22 18:49:30 2015 +0100
+++ b/webapp/src/main/webapp/jquery/jquery.digilib.annotator.js	Fri Jan 23 12:16:46 2015 +0100
@@ -31,7 +31,7 @@
  */
 (function($) {
     // version of this plugin
-    var version = 'jquery.digilib.annotator.js 1.3.1';
+    var version = 'jquery.digilib.annotator.js 1.3.2';
 
     // affine geometry
     var geom = null;
@@ -116,7 +116,7 @@
         setAnnotationMark : function (data, mpos, text) {
             if (mpos == null) {
                 // interactive
-                setAnnotationMark(data);
+                setAnnotationShape(data, 'Point');
             } else {
                 // use position and text (and user-id)
                 console.error("Sorry, currently only interactive annotations!");
@@ -133,7 +133,7 @@
         setAnnotationRegion : function (data, rect, text) {
             if (rect == null) {
                 // interactive
-                setAnnotationRegion(data);
+                setAnnotationShape(data, 'Rectangle');
             } else {
                 // use position and text (and user-id)
                 console.error("Sorry, currently only interactive annotations!");
@@ -257,6 +257,40 @@
     };
 
     /**
+     * Add a shape-annotation where clicked.
+     */
+    var setAnnotationShape = function (data, type) {
+        var annotator = data.annotator;
+        var shape = {'geometry': {'type': type}};
+        digilib.actions.addShape(data, shape, function (data, newshape) {
+        	console.debug("new annotation shape:", newshape);
+        	var annoShape = null;
+        	var pos = null;
+        	if (type === 'Point') {
+        		pos = geom.position(newshape.geometry.coordinates[0]);
+                // create annotation shape
+                annoShape = {'type': 'point', 'units': 'fraction', 'geometry': pos};
+        	} else if (type === 'Rectangle') {
+        		pos = geom.position(newshape.geometry.coordinates[0]);
+        		var pt2 = geom.position(newshape.geometry.coordinates[1]);
+        		var rect = geom.rectangle(pos, pt2);
+                // create annotation shape
+                annoShape = {'type': 'rectangle', 'units': 'fraction', 'geometry': rect};
+        	} else if (type === 'Polygon') {
+        		pos = geom.position(newshape.geometry.coordinates[0]);
+                // create annotation shape
+                annoShape = {'type': 'polygon', 'units': 'fraction', 'geometry': newshape.geometry.coordinates};
+        	} else {
+        		console.error("Unsupported annotation shape="+type);
+        		return;
+        	}
+            var mpos = data.imgTrafo.transform(pos);
+            createAnnotation(data, annoShape, mpos);        	
+        }, annotationLayer);
+    };
+    
+    
+    /**
      * Show editor and save annotation.
      */
     var createAnnotation = function (data, shape, screenPos) {
@@ -283,7 +317,7 @@
 	    annotator.subscribe('annotationEditorSubmit', save);
 	    annotator.subscribe('annotationEditorHidden', cancel);
 	    annotator.showEditor(annotation, screenPos.getAsCss());
-    }
+    };
     
     /**
      * Render all annotations on the image
@@ -372,7 +406,7 @@
                     	'annotation': annotation
             	};
             } else {
-                console.error("Unsupported shape type: "+type);
+                console.error("Unsupported annotation shape type: "+type);
                 return;
             }
         } else {
--- a/webapp/src/main/webapp/jquery/jquery.digilib.vector.js	Thu Jan 22 18:49:30 2015 +0100
+++ b/webapp/src/main/webapp/jquery/jquery.digilib.vector.js	Fri Jan 23 12:16:46 2015 +0100
@@ -625,18 +625,19 @@
             // setup shape
             var p = data.imgTrafo.invtransform(pt);
             var vtxidx = 1;
-            if (shapeType === 'Line' || shapeType === 'Rectangle' || 
+            if (shapeType === 'Point') {
+                shape.geometry.coordinates = [[p.x, p.y]];
+            } else if (shapeType === 'Line' || shapeType === 'Rectangle' || 
             		shapeType === 'LineString' || shapeType === 'Polygon') {
                 shape.geometry.coordinates = [[p.x, p.y], [p.x, p.y]];
             } else {
-                console.error("unsupported shape type: "+shapeType);
+                console.error("defineShape: unsupported shape type: "+shapeType);
                 $overlayDiv.remove();
                 return false;
             }
             // save editable state and set to non-editable
-            var isShapeEditable = false;
             if (shape.properties != null) {
-            	isShapeEditable = shape.properties.editable;
+            	shape.properties._editable = shape.properties.editable;
             	shape.properties.editable = false;
             } else {
                 shape.properties = {'editable' : false};
@@ -644,53 +645,62 @@
             // draw shape
             renderShape(data, shape, layer);
             // vertex drag end handler
-            var vertexDragDone = function (data, newshape, newevt) {
-                var coords = newshape.geometry.coordinates;
+            var vertexDragDone = function (data, shape, newevt) {
+                var coords = shape.geometry.coordinates;
             	if (shapeType === 'LineString' || shapeType === 'Polygon') {
             		if (newevt.type === 'mouseup') {
 	            		// single click adds line to LineString/Polygon
-	            		unrenderShape(data, newshape);
+	            		unrenderShape(data, shape);
 	            		// copy last vertex as starting point
 	            		coords.push(coords[vtxidx].slice());
 	            		vtxidx += 1;
 	                    // draw shape
-	                    renderShape(data, newshape, layer);            		
+	                    renderShape(data, shape, layer);            		
 	                    // execute vertex drag handler on next vertex
-	            		getVertexDragHandler(data, newshape, vtxidx, vertexDragDone)(newevt);
+	            		getVertexDragHandler(data, shape, vtxidx, vertexDragDone)(newevt);
 	            		return false;
             		} else if (newevt.type === 'dblclick') {
             			// double click ends Linestring/Polygon
 	            		if (coords[vtxidx][0] === coords[vtxidx-1][0] && 
 	            				coords[vtxidx][1] === coords[vtxidx-1][1]) {
-	            			unrenderShape(data, newshape);
+	            			unrenderShape(data, shape);
 	            			// remove duplicate last vertex (from mouseup)
 	            			coords.pop();
-		                    renderShape(data, newshape, layer);            		            			
+		                    renderShape(data, shape, layer);            		            			
 	            		}
             		} else {
             			console.error("unknown event type!");
             			return false;
             		}
             	}
-                // dragging vertex done
-            	if (shape.properties.editable !== isShapeEditable) {
-	            	// re-set editable
-	            	unrenderShape(data, newshape);
-	            	shape.properties.editable = isShapeEditable;
-	            	renderShape(data, newshape, layer);
-            	}
-            	// save shape
-                layer.shapes.push(newshape);
-                $overlayDiv.remove();
-                if (onComplete != null) {
-                    onComplete(data, newshape);
-                }
+            	shapeDone(data, shape);
             };
-            // execute vertex drag handler on second vertex
-            getVertexDragHandler(data, shape, vtxidx, vertexDragDone)(evt);
+            if (shapeType === 'Point') {
+            	// just this one vertex
+            	shapeDone(data, shape);
+            } else {
+            	// execute vertex drag handler on second vertex
+            	getVertexDragHandler(data, shape, vtxidx, vertexDragDone)(evt);
+            }
             return false;
         };
         
+        var shapeDone = function (data, shape) {
+            // defining shape done
+        	if (shape.properties._editable != null) {
+            	// re-set editable
+            	unrenderShape(data, shape);
+            	shape.properties.editable = shape.properties._editable;
+            	delete shape.properties._editable;
+            	renderShape(data, shape, layer);
+        	}
+        	// save shape
+            layer.shapes.push(shape);
+            $overlayDiv.remove();
+            if (onComplete != null) {
+                onComplete(data, shape);
+            }
+        };
         // start by clicking
         $overlayDiv.one('mousedown.dlShape', shapeStart);
     };