Mercurial > hg > digilib
changeset 1254:7410a158ca7b
vector shapes can be editable now (properties:{editable:true}).
author | robcast |
---|---|
date | Fri, 17 Jan 2014 17:17:47 +0100 |
parents | 4d1a50cd41c1 |
children | 021ebb62fd10 |
files | webapp/src/main/webapp/jquery/digilib-vector.html webapp/src/main/webapp/jquery/jquery.digilib.vector.js |
diffstat | 2 files changed, 85 insertions(+), 16 deletions(-) [+] |
line wrap: on
line diff
--- a/webapp/src/main/webapp/jquery/digilib-vector.html Fri Jan 17 14:57:20 2014 +0100 +++ b/webapp/src/main/webapp/jquery/digilib-vector.html Fri Jan 17 17:17:47 2014 +0100 @@ -49,7 +49,8 @@ 'coordinates' : [[0.2, 0.2], [0.3, 0.3]] }, 'properties' : { - 'stroke' : 'green' + 'stroke' : 'green', + 'editable' : true }, 'id' : 'myBestRect' }]); @@ -57,7 +58,7 @@ </script> </head> - <!-- <body onload="$('#digilib').digilib('addShape', {'geometry':{'type':'Rectangle','coordinates':null}})"> --> + <!-- <body onload="$('#digilib').digilib('addShape', {'geometry':{'type':'Line','coordinates':null}})"> --> <body> <div id="digilib"> <p>digilib doesn't work! Please switch on Javascript or notify the server administrator!</p>
--- a/webapp/src/main/webapp/jquery/jquery.digilib.vector.js Fri Jan 17 14:57:20 2014 +0100 +++ b/webapp/src/main/webapp/jquery/jquery.digilib.vector.js Fri Jan 17 17:17:47 2014 +0100 @@ -236,17 +236,19 @@ shape.$elem = $elem; $svg.append($elem); if (props.editable) { - var e1 = createSvg('rect', { + var $e1 = $(createSvg('rect', { 'x': p1.x-hs/2, 'y': p1.y-hs/2, 'width': hs, 'height': hs, 'stroke': 'darkgrey', 'stroke-width': 1, 'fill': 'none', - 'class': css+'svg-handle', 'style': 'pointer-events:all'}); - var e2 = createSvg('rect', { + 'class': css+'svg-handle', 'style': 'pointer-events:all'})); + var $e2 = $(createSvg('rect', { 'x': p2.x-hs/2, 'y': p2.y-hs/2, 'width': hs, 'height': hs, 'stroke': 'darkgrey', 'stroke-width': 1, 'fill': 'none', - 'class': css+'svg-handle', 'style': 'pointer-events:all'}); - var $editElems = $([e1, e2]); - shape.$editElems = $editElems; - $svg.append($editElems); + 'class': css+'svg-handle', 'style': 'pointer-events:all'})); + 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)); } } else if (gt === 'Rectangle') { /* @@ -264,21 +266,87 @@ shape.$elem = $elem; $svg.append($elem); if (props.editable) { - var e1 = createSvg('rect', { + var $e1 = $(createSvg('rect', { 'x': p1.x-hs/2, 'y': p1.y-hs/2, 'width': hs, 'height': hs, 'stroke': 'darkgrey', 'stroke-width': 1, 'fill': 'none', - 'class': css+'svg-handle', 'style': 'pointer-events:all'}); - var e2 = createSvg('rect', { + 'class': css+'svg-handle', 'style': 'pointer-events:all'})); + var $e2 = $(createSvg('rect', { 'x': p2.x-hs/2, 'y': p2.y-hs/2, 'width': hs, 'height': hs, 'stroke': 'darkgrey', 'stroke-width': 1, 'fill': 'none', - 'class': css+'svg-handle', 'style': 'pointer-events:all'}); - var $editElems = $([e1, e2]); - shape.$editElems = $editElems; - $svg.append($editElems); + 'class': css+'svg-handle', 'style': 'pointer-events:all'})); + 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)); } } }; + var getVertexDragHandler = function (data, shape, vtx) { + var $document = $(document); + var hs = data.settings.editHandleSize; + var $shape = shape.$elem; + var $handle = shape.$vertexElems[vtx]; + var shapeType = shape.geometry.type; + var pt, pt0, pt1, pt2, rect; + + var dragMove = function (evt) { + pt = geom.position(evt); + pt.clipTo(data.imgRect); + // move handle + $handle.attr({'x': pt.x-hs/2, 'y': pt.y-hs/2}); + // update shape element + if (shapeType === 'Line') { + if (vtx === 0) { + $shape.attr({'x1': pt.x, 'y1': pt.y}); + } else if (vtx === 1) { + $shape.attr({'x2': pt.x, 'y2': pt.y}); + } + } else if (shapeType === 'Rectangle') { + if (vtx === 0) { + rect = geom.rectangle(pt, pt2); + } else if (vtx === 1) { + rect = geom.rectangle(pt1, pt); + } + $shape.attr({'x': rect.x, 'y': rect.y, + 'width': rect.width, 'height': rect.height}); + } + return false; + }; + + var dragEnd = function (evt) { + pt = geom.position(evt); + pt.clipTo(data.imgRect); + var p1 = data.imgTrafo.invtransform(pt); + // update shape element + if (shapeType === 'Line') { + shape.geometry.coordinates[vtx] = [p1.x, p1.y]; + } else if (shapeType === 'Rectangle') { + shape.geometry.coordinates[vtx] = [p1.x, p1.y]; + } + $document.off("mousemove.dlVertexDrag", dragMove); + $document.off("mouseup.dlVertexDrag", dragEnd); + 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])); + } + $document.on("mousemove.dlVertexDrag", dragMove); + $document.on("mouseup.dlVertexDrag", dragEnd); + return false; + }; + + }; + var handleUpdate = function (evt) { console.debug("vector: handleUpdate"); var data = this;