Mercurial > hg > digilib
changeset 1257:4f8f960a4bea
createShape now uses vertexDragHandler too. vertex dragging also works with single clicks.
author | robcast |
---|---|
date | Fri, 17 Jan 2014 22:14:39 +0100 |
parents | 677277d77cca |
children | fd90ed468eec |
files | webapp/src/main/webapp/jquery/jquery.digilib.js webapp/src/main/webapp/jquery/jquery.digilib.vector.js |
diffstat | 2 files changed, 72 insertions(+), 107 deletions(-) [+] |
line wrap: on
line diff
--- a/webapp/src/main/webapp/jquery/jquery.digilib.js Fri Jan 17 17:43:20 2014 +0100 +++ b/webapp/src/main/webapp/jquery/jquery.digilib.js Fri Jan 17 22:14:39 2014 +0100 @@ -1317,7 +1317,7 @@ if (clickRect.getArea() <= 5) { onComplete(data, null); return false; - }; + }; // unregister events $overlayDiv.off("mousemove.dlArea", areaMove); $overlayDiv.off("mouseup.dlArea", areaEnd);
--- a/webapp/src/main/webapp/jquery/jquery.digilib.vector.js Fri Jan 17 17:43:20 2014 +0100 +++ b/webapp/src/main/webapp/jquery/jquery.digilib.vector.js Fri Jan 17 22:14:39 2014 +0100 @@ -247,8 +247,8 @@ var $vertexElems = [$e1, $e2]; shape.$vertexElems = $vertexElems; $svg.append($vertexElems); - $e1.on("mousedown.dlVertexDrag", getVertexDragHandler(data, shape, 0)); - $e2.on("mousedown.dlVertexDrag", getVertexDragHandler(data, shape, 1)); + $e1.one("mousedown.dlVertexDrag", getVertexDragHandler(data, shape, 0)); + $e2.one("mousedown.dlVertexDrag", getVertexDragHandler(data, shape, 1)); } } else if (gt === 'Rectangle') { /* @@ -277,19 +277,33 @@ var $vertexElems = [$e1, $e2]; shape.$vertexElems = $vertexElems; $svg.append($vertexElems); - $e1.on("mousedown.dlVertexDrag", getVertexDragHandler(data, shape, 0)); - $e2.on("mousedown.dlVertexDrag", getVertexDragHandler(data, shape, 1)); + $e1.one("mousedown.dlVertexDrag", getVertexDragHandler(data, shape, 0)); + $e2.one("mousedown.dlVertexDrag", getVertexDragHandler(data, shape, 1)); } } }; - var getVertexDragHandler = function (data, shape, vtx) { + var getVertexDragHandler = function (data, shape, vtx, onComplete) { var $document = $(document); var hs = data.settings.editHandleSize; var $shape = shape.$elem; - var $handle = shape.$vertexElems[vtx]; + var $handle = (shape.$vertexElems != null) ? shape.$vertexElems[vtx] : $(); var shapeType = shape.geometry.type; var pt, pt0, pt1, pt2, rect; + + var dragStart = function (evt) { + // cancel if not left-click + if (evt.which != 1) return; + pt0 = geom.position(evt); + if (shapeType === 'Rectangle') { + // save rectangle screen endpoints + pt1 = data.imgTrafo.transform(geom.position(shape.geometry.coordinates[0])); + pt2 = data.imgTrafo.transform(geom.position(shape.geometry.coordinates[1])); + } + $document.on("mousemove.dlVertexDrag", dragMove); + $document.on("mouseup.dlVertexDrag", dragEnd); + return false; + }; var dragMove = function (evt) { pt = geom.position(evt); @@ -317,6 +331,9 @@ var dragEnd = function (evt) { pt = geom.position(evt); + if (pt.distance(pt0) < 5) { + return false; + } pt.clipTo(data.imgRect); var p1 = data.imgTrafo.invtransform(pt); // update shape element @@ -325,27 +342,61 @@ } else if (shapeType === 'Rectangle') { shape.geometry.coordinates[vtx] = [p1.x, p1.y]; } + // remove move/end handler $document.off("mousemove.dlVertexDrag", dragMove); $document.off("mouseup.dlVertexDrag", dragEnd); - $(data).trigger('changeShape', shape); + // rearm handle + $handle.one("mousedown.dlVertexDrag", dragStart); + if (onComplete != null) { + onComplete(shape); + } else { + $(data).trigger('changeShape', shape); + } return false; }; - // dragStart - return function (evt) { - // cancel if not left-click - if (evt.which != 1) return; - pt0 = geom.position(evt); - if (shapeType === 'Rectangle') { - // save rectangle screen endpoints - pt1 = data.imgTrafo.transform(geom.position(shape.geometry.coordinates[0])); - pt2 = data.imgTrafo.transform(geom.position(shape.geometry.coordinates[1])); + // return drag start handler + return dragStart; + }; + + /** + * define a shape by click and drag. + */ + var defineShape = function(data, shape, onComplete) { + var shapeType = shape.geometry.type; + var $elem = data.$elem; + var $body = $('body'); + var bodyRect = geom.rectangle($body); + // overlay div prevents other elements from reacting to mouse events + var $overlayDiv = $('<div class="'+data.settings.cssPrefix+'shapeOverlay" style="position:absolute; z-index:100;"/>'); + $elem.append($overlayDiv); + bodyRect.adjustDiv($overlayDiv); + + var shapeStart = function (evt) { + var pt = geom.position(evt); + // setup shape + var p = data.imgTrafo.invtransform(pt); + if (shapeType === 'Line' || shapeType === 'Rectangle') { + shape.geometry.coordinates = [[p.x, p.y], [p.x, p.y]]; + } else { + console.error("unsupported shape type: "+shapeType); } - $document.on("mousemove.dlVertexDrag", dragMove); - $document.on("mouseup.dlVertexDrag", dragEnd); + // draw shape + renderShape(data, shape); + // execute vertex drag handler on second vertex + getVertexDragHandler(data, shape, 1, function (newshape) { + // dragging vertex done + console.debug("new shape:", shape); + data.shapes.push(shape); + $overlayDiv.remove(); + if (onComplete != null) { + onComplete(data, shape); + } + })(evt); return false; - }; - + }; + // start by clicking + $overlayDiv.one('mousedown.dlShape', shapeStart); }; var handleUpdate = function (evt) { @@ -360,92 +411,6 @@ data.$svg.show(); }; - /** - * define a shape by click and drag. - */ - var defineShape = function(data, shape, onComplete) { - var shapeType = shape.geometry.type; - var shapeId = shape.id; - shapeId = digilib.fn.createId(shapeId, data.settings.cssPrefix+'shape-'); - shape.id = shapeId; - var $elem = data.$elem; - var $scaler = data.$scaler; - var picRect = geom.rectangle($scaler); - var $body = $('body'); - var bodyRect = geom.rectangle($body); - var pt1, pt2; - // overlay div prevents other elements from reacting to mouse events - var $overlayDiv = $('<div class="'+data.settings.cssPrefix+'shapeOverlay" style="position:absolute; z-index:100;"/>'); - $elem.append($overlayDiv); - bodyRect.adjustDiv($overlayDiv); - // shape element reference - var $shape = null; - var shapeStart = function (evt) { - pt1 = geom.position(evt); - // setup and show shape - p1 = data.imgTrafo.invtransform(pt1); - if (shapeType === 'Line' || shapeType === 'Rectangle') { - shape.geometry.coordinates = [[p1.x, p1.y], [p1.x, p1.y]]; - } - renderShape(data, shape); - $shape = shape.$elem; - // register events - $overlayDiv.on("mousemove.dlShape", shapeMove); - $overlayDiv.on("mouseup.dlShape", shapeEnd); - return false; - }; - - // mouse move handler - var shapeMove = function (evt) { - pt2 = geom.position(evt); - pt2.clipTo(picRect); - // update shape - if (shapeType === 'Line') { - $shape.attr({'x2': pt2.x, 'y2': pt2.y}); - } else if (shapeType === 'Rectangle') { - var rect = geom.rectangle(pt1, pt2); - $shape.attr({'x': rect.x, 'y': rect.y, - 'width': rect.width, 'height': rect.height}); - } - return false; - }; - - // mouseup handler: end moving - var shapeEnd = function (evt) { - pt2 = geom.position(evt); - // assume a click and continue if the area is too small - if (pt2.distance(pt1) < 5) { - if (onComplete != null) { - onComplete(data, null); - } - return false; - }; - // unregister events - $overlayDiv.off("mousemove.dlShape", shapeMove); - $overlayDiv.off("mouseup.dlShape", shapeEnd); - // clip and transform - pt2.clipTo(picRect); - // update shape - if (shapeType === 'Line') { - var p2 = data.imgTrafo.invtransform(pt2); - shape.geometry.coordinates[1] = [p2.x, p2.y]; - } else if (shapeType === 'Rectangle') { - var p2 = data.imgTrafo.invtransform(pt2); - shape.geometry.coordinates[1] = [p2.x, p2.y]; - } - console.debug("new shape:", shape); - data.shapes.push(shape); - $overlayDiv.remove(); - if (onComplete != null) { - onComplete(data, shape); - } - return false; - }; - - // start by clicking - $overlayDiv.one('mousedown.dlShape', shapeStart); - }; - /** * create a SVG element */