From a207da0cdd760ff7e75dc9db011dc4b0a81b7f20 Mon Sep 17 00:00:00 2001 From: sashadev-sky Date: Sat, 23 Mar 2019 21:56:58 -0400 Subject: [PATCH 01/63] dist file --- dist/leaflet.distortableimage.js | 180 ++++++++----------------------- 1 file changed, 42 insertions(+), 138 deletions(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index 0040ad9f2..e04116628 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -784,11 +784,6 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ L.DistortableImage = L.DistortableImage || {}; var EditOverlayAction = LeafletToolbar.ToolbarAction.extend({ -<<<<<<< HEAD - initialize: function(map, overlay, options) { - this._overlay = overlay; - this._map = map; -======= initialize: function(map, overlay, options) { this._overlay = overlay; this._map = map; @@ -833,160 +828,54 @@ var EditOverlayAction = LeafletToolbar.ToolbarAction.extend({ tooltip: 'Delete image', title: 'Delete image' }}, ->>>>>>> 7d1dc5bdd8e16a65b9204667f6066757f5245d1d - LeafletToolbar.ToolbarAction.prototype.initialize.call(this, options); - } - }), - ToggleTransparency = EditOverlayAction.extend({ - options: { - toolbarIcon: { - html: '', - tooltip: "Toggle Image Transparency", - title: "Toggle Image Transparency" - } - }, + addHooks: function() { + var map = this._map; + + map.removeLayer(this._overlay); + this._overlay.fire('delete'); + this.disable(); + } + }), -<<<<<<< HEAD - addHooks: function() { - var editing = this._overlay.editing; -======= ToggleEditable = EditOverlayAction.extend({ options: { toolbarIcon: { html: '', tooltip: 'Lock / Unlock editing', title: 'Lock / Unlock editing' }}, ->>>>>>> 7d1dc5bdd8e16a65b9204667f6066757f5245d1d - editing._toggleTransparency(); - this.disable(); - } - }), - ToggleOutline = EditOverlayAction.extend({ - options: { - toolbarIcon: { - html: '', - tooltip: "Toggle Image Outline", - title: "Toggle Image Outline" - } - }, + addHooks: function() { + var editing = this._overlay.editing; - addHooks: function() { - var editing = this._overlay.editing; + editing._toggleLock(); + this.disable(); + } + }), - editing._toggleOutline(); - this.disable(); - } - }), - RemoveOverlay = EditOverlayAction.extend({ - options: { - toolbarIcon: { - html: '', - tooltip: "Delete image", - title: "Delete image" - } - }, + ToggleRotateDistort = EditOverlayAction.extend({ + initialize: function(map, overlay, options) { + var icon = overlay.editing._mode === 'rotate' ? 'image' : 'rotate-left'; -<<<<<<< HEAD - addHooks: function() { - var map = this._map; -======= options = options || {}; options.toolbarIcon = { html: '', tooltip: 'Rotate', title: 'Rotate' }; ->>>>>>> 7d1dc5bdd8e16a65b9204667f6066757f5245d1d - - map.removeLayer(this._overlay); - this._overlay.fire("delete"); - this.disable(); - } - }), - ToggleEditable = EditOverlayAction.extend({ - options: { - toolbarIcon: { - html: '', - tooltip: "Lock / Unlock editing", - title: "Lock / Unlock editing" - } - }, - - addHooks: function() { - var editing = this._overlay.editing; - editing._toggleLock(); - this.disable(); - } - }), - ToggleRotateDistort = EditOverlayAction.extend({ - initialize: function(map, overlay, options) { - var icon = overlay.editing._mode === "rotate" ? "image" : "rotate-left"; - - options = options || {}; - options.toolbarIcon = { - html: '', - tooltip: "Rotate", - title: "Rotate" - }; - - EditOverlayAction.prototype.initialize.call(this, map, overlay, options); - }, - - addHooks: function() { - var editing = this._overlay.editing; - - editing._toggleRotateDistort(); - this.disable(); - } - }), - ToggleExport = EditOverlayAction.extend({ - options: { - toolbarIcon: { - html: '', - tooltip: "Export Image", - title: "Export Image" - } - }, + EditOverlayAction.prototype.initialize.call(this, map, overlay, options); + }, - addHooks: function() { - var editing = this._overlay.editing; + addHooks: function() { + var editing = this._overlay.editing; -<<<<<<< HEAD - editing._toggleExport(); - this.disable(); - } - }), - EnableEXIF = EditOverlayAction.extend({ - options: { - toolbarIcon: { - html: '', - tooltip: "Enable EXIF", - title: "Geocode Image" - } - }, + editing._toggleRotateDistort(); + this.disable(); + } + }), - addHooks: function() { - var image = this._overlay._image; - EXIF.getData(image, L.EXIF(image)); - } - }); -L.DistortableImage.EditToolbar = LeafletToolbar.Popup.extend({ - options: { - actions: [ - ToggleTransparency, - RemoveOverlay, - ToggleOutline, - ToggleEditable, - ToggleRotateDistort, - ToggleExport, - EnableEXIF - ] - } -======= ToggleExport = EditOverlayAction.extend({ options: { toolbarIcon: { @@ -1021,7 +910,22 @@ L.DistortableImage.EditToolbar = LeafletToolbar.Popup.extend({ editing._toggleOrder(); this.disable(); } - }); + }), + + EnableEXIF = EditOverlayAction.extend({ + options: { + toolbarIcon: { + html: '', + tooltip: "Enable EXIF", + title: "Geocode Image" + } + }, + + addHooks: function() { + var image = this._overlay._image; + EXIF.getData(image, L.EXIF(image)); + } + }); L.DistortableImage.EditToolbar = LeafletToolbar.Popup.extend({ options: { @@ -1032,10 +936,10 @@ L.DistortableImage.EditToolbar = LeafletToolbar.Popup.extend({ ToggleEditable, ToggleRotateDistort, ToggleExport, + EnableEXIF, ToggleOrder ] } ->>>>>>> 7d1dc5bdd8e16a65b9204667f6066757f5245d1d }); L.DistortableImage = L.DistortableImage || {}; From b2eb23d664896103a0aaa1614d1481e371775114 Mon Sep 17 00:00:00 2001 From: sashadev-sky Date: Tue, 26 Feb 2019 06:17:12 -0500 Subject: [PATCH 02/63] Add ability to return array of all images on the map --- Gruntfile.js | 1 + dist/leaflet.distortableimage.js | 107 +++++++++++++++++++++++++-- dist/leaflet.distortableimage.js.map | 1 + src/edit/BoxSelectHandle.js | 96 ++++++++++++++++++++++++ src/edit/DistortableImage.Edit.js | 10 +-- 5 files changed, 205 insertions(+), 10 deletions(-) create mode 100644 dist/leaflet.distortableimage.js.map create mode 100644 src/edit/BoxSelectHandle.js diff --git a/Gruntfile.js b/Gruntfile.js index 5290d5ab9..e5f6ce5f9 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -90,6 +90,7 @@ module.exports = function(grunt) { 'src/DistortableImageOverlay.js', 'src/edit/DistortableImage.EditToolbar.js', 'src/edit/DistortableImage.Edit.js', + 'src/edit/BoxSelectHandle.js' ], dest: 'dist/leaflet.distortableimage.js', } diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index e04116628..cf6842740 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -949,19 +949,19 @@ L.DistortableImage.Edit = L.Handler.extend({ opacity: 0.7, outline: '1px solid red', keymap: { + 8: "_removeOverlay", // backspace windows / delete mac + 46: "_removeOverlay", // delete windows / delete + fn mac + 20: '_toggleRotate', // CAPS 68: '_toggleRotateDistort', // d 69: '_toggleIsolate', // e 73: '_toggleIsolate', // i + 74: '_sendUp', // j + 75: '_sendDown', // k 76: '_toggleLock', // l 79: '_toggleOutline', // o 82: '_toggleRotateDistort', // r - 74: '_sendUp', // j - 75: '_sendDown', // k - 46: "_removeOverlay", // delete windows / delete + fn mac - 8: "_removeOverlay", // backspace windows / delete mac 83: '_toggleScale', // s 84: '_toggleTransparency', // t - 20: '_toggleRotate' // CAPS } }, @@ -1356,3 +1356,100 @@ L.DistortableImageOverlay.addInitHook(function() { if (this.editing) { this.editing.disable(); } }); }); + +L.Map.mergeOptions({ boxSelector: true, boxZoom: false }); + +L.Map.BoxSelectHandle = L.Map.BoxZoom.extend({ + + addHooks: function () { + L.DomEvent.on(this._container, 'mousedown', this._onMouseDown, this); + }, + + removeHooks: function () { + L.DomEvent.off(this._container, 'mousedown', this._onMouseDown); + }, + + _onMouseDown: function (e) { + if (!e.shiftKey || ((e.which !== 1) && (e.button !== 1))) { return false; } + + L.DomUtil.disableTextSelection(); + + this._startLayerPoint = this._map.mouseEventToLayerPoint(e); + + this._box = L.DomUtil.create('div', 'leaflet-zoom-box', this._pane); + L.DomUtil.setPosition(this._box, this._startLayerPoint); + + this._container.style.cursor = 'crosshair'; + + L.DomEvent + .on(document, 'mousemove', this._onMouseMove, this) + .on(document, 'mouseup', this._onMouseUp, this) + .on(document, 'keydown', this._onKeyDown, this) + .preventDefault(e); + + this._map.fire('boxzoomstart'); + }, + + _onMouseMove: function (e) { + var startPoint = this._startLayerPoint, + box = this._box, + + layerPoint = this._map.mouseEventToLayerPoint(e), + offset = layerPoint.subtract(startPoint), + + newPos = new L.Point( + Math.min(layerPoint.x, startPoint.x), + Math.min(layerPoint.y, startPoint.y)); + + L.DomUtil.setPosition(box, newPos); + + box.style.width = (Math.max(0, Math.abs(offset.x) - 4)) + 'px'; + box.style.height = (Math.max(0, Math.abs(offset.y) - 4)) + 'px'; + }, + + _onMouseUp: function (e) { + // window.e = e; + var map = this._map, + layerPoint = map.mouseEventToLayerPoint(e); + + if (this._startLayerPoint.equals(layerPoint)) { return; } + + // var bounds = new L.LatLngBounds( + // map.layerPointToLatLng(this._startLayerPoint), + // map.layerPointToLatLng(layerPoint)); + + map.fire('boxzoomend', { + // boxBounds: bounds + }); + + let contents = $(this._pane).children(); + let images = contents.filter('img'); + window.images = images; + + this._finish(); + console.log(images); + return images; + }, + + _finish: function () { + this._pane.removeChild(this._box); + this._container.style.cursor = ''; + + L.DomUtil.enableTextSelection(); + + L.DomEvent + .off(document, 'mousemove', this._onMouseMove) + .off(document, 'mouseup', this._onMouseUp) + .off(document, 'keydown', this._onKeyDown); + }, + + // escape keybinding for getting rid of the selection box (alternative to mouse up). keep for now to see if it will become useful + // in deselecting images + _onKeyDown: function (e) { + if (e.keyCode === 27) { + this._finish(); + } + } +}); + +L.Map.addInitHook('addHandler', 'boxSelector', L.Map.BoxSelectHandle); \ No newline at end of file diff --git a/dist/leaflet.distortableimage.js.map b/dist/leaflet.distortableimage.js.map new file mode 100644 index 000000000..173f9193d --- /dev/null +++ b/dist/leaflet.distortableimage.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/util/DomUtil.js","../src/util/Map._newLayerPointToLatLng.js","../src/util/MatrixUtil.js","../src/edit/EditHandle.js","../src/edit/LockHandle.js","../src/edit/DistortHandle.js","../src/edit/RotateAndScaleHandle.js","../src/edit/RotateHandle.js","../src/edit/ScaleHandle.js","../src/DistortableImageOverlay.js","../src/edit/DistortableImage.EditToolbar.js","../src/edit/DistortableImage.Edit.js","../src/edit/BoxSelectHandle.js"],"names":[],"mappings":"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","file":"leaflet.distortableimage.js","sourcesContent":["L.DomUtil = L.extend(L.DomUtil, {\n\tgetMatrixString: function(m) {\n\t\tvar is3d = L.Browser.webkit3d || L.Browser.gecko3d || L.Browser.ie3d,\n\n\t\t\t/* \n\t\t * Since matrix3d takes a 4*4 matrix, we add in an empty row and column, which act as the identity on the z-axis.\n\t\t * See:\n\t\t * http://franklinta.com/2014/09/08/computing-css-matrix3d-transforms/\n\t\t * https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function#M.C3.B6bius'_homogeneous_coordinates_in_projective_geometry\n\t\t */\n\t\t\tmatrix = [\n\t\t\t\tm[0], m[3], 0, m[6],\n\t\t\t\tm[1], m[4], 0, m[7],\n\t\t\t\t 0, 0, 1, 0,\n\t\t\t\tm[2], m[5], 0, m[8]\n\t\t\t],\n\n\t\t\tstr = is3d ? 'matrix3d(' + matrix.join(',') + ')' : '';\n\n\t\tif (!is3d) {\n\t\t\tconsole.log('Your browser must support 3D CSS transforms in order to use DistortableImageOverlay.');\n\t\t}\n\n\t\treturn str;\n\t},\n\n\tgetRotateString: function(angle, units) {\n\t\tvar is3d = L.Browser.webkit3d || L.Browser.gecko3d || L.Browser.ie3d,\n\t\t\topen = 'rotate' + (is3d ? '3d' : '') + '(',\n\t\t\trotateString = (is3d ? '0, 0, 1, ' : '') + angle + units;\n\t\t\t\n\t\treturn open + rotateString + ')';\n\t}\n});\n","L.Map.include({\n\t_newLayerPointToLatLng: function(point, newZoom, newCenter) {\n\t\tvar topLeft = L.Map.prototype._getNewTopLeftPoint.call(this, newCenter, newZoom)\n\t\t\t\t.add(L.Map.prototype._getMapPanePos.call(this));\n\t\treturn this.unproject(point.add(topLeft), newZoom);\n\t}\n});","L.MatrixUtil = {\n\n\t// Compute the adjugate of m\n\tadj: function(m) { \n\t\treturn [\n\t\t\tm[4]*m[8]-m[5]*m[7], m[2]*m[7]-m[1]*m[8], m[1]*m[5]-m[2]*m[4],\n\t\t\tm[5]*m[6]-m[3]*m[8], m[0]*m[8]-m[2]*m[6], m[2]*m[3]-m[0]*m[5],\n\t\t\tm[3]*m[7]-m[4]*m[6], m[1]*m[6]-m[0]*m[7], m[0]*m[4]-m[1]*m[3]\n\t\t];\n\t},\n\n\t// multiply two 3*3 matrices\n\tmultmm: function(a, b) { \n\t\tvar c = [],\n\t\t\ti;\n\n\t\tfor (i = 0; i < 3; i++) {\n\t\t\tfor (var j = 0; j < 3; j++) {\n\t\t\t\tvar cij = 0;\n\t\t\t\tfor (var k = 0; k < 3; k++) {\n\t\t\t\t\tcij += a[3*i + k]*b[3*k + j];\n\t\t\t\t}\n\t\t\t\tc[3*i + j] = cij;\n\t\t\t}\n\t\t}\n\t\treturn c;\n\t},\n\n\t// multiply a 3*3 matrix and a 3-vector\n\tmultmv: function(m, v) { \n\t\treturn [\n\t\t\tm[0]*v[0] + m[1]*v[1] + m[2]*v[2],\n\t\t\tm[3]*v[0] + m[4]*v[1] + m[5]*v[2],\n\t\t\tm[6]*v[0] + m[7]*v[1] + m[8]*v[2]\n\t\t];\n\t},\n\n\t// multiply a scalar and a 3*3 matrix\n\tmultsm: function(s, m) {\n\t\tvar matrix = [];\n\n\t\tfor (var i = 0, l = m.length; i < l; i++) {\n\t\t\tmatrix.push(s*m[i]);\n\t\t}\n\n\t\treturn matrix;\n\t},\n\n\tbasisToPoints: function(x1, y1, x2, y2, x3, y3, x4, y4) {\n\t\tvar m = [\n\t\t\t\tx1, x2, x3,\n\t\t\t\ty1, y2, y3,\n\t\t\t\t1, 1, 1\n\t\t\t],\n\t\t\tv = L.MatrixUtil.multmv(L.MatrixUtil.adj(m), [x4, y4, 1]);\n\n\t\treturn L.MatrixUtil.multmm(m, [\n\t\t\tv[0], 0, 0,\n\t\t\t0, v[1], 0,\n\t\t\t0, 0, v[2]\n\t\t]);\n\t},\n\n\n\tproject: function(m, x, y) {\n\t\tvar v = L.MatrixUtil.multmv(m, [x, y, 1]);\n\t\treturn [v[0]/v[2], v[1]/v[2]];\n\t},\n\n\tgeneral2DProjection: function(\n\tx1s, y1s, x1d, y1d,\n\tx2s, y2s, x2d, y2d,\n\tx3s, y3s, x3d, y3d,\n\tx4s, y4s, x4d, y4d\n\t) {\n\t\tvar s = L.MatrixUtil.basisToPoints(x1s, y1s, x2s, y2s, x3s, y3s, x4s, y4s),\n\t\t\td = L.MatrixUtil.basisToPoints(x1d, y1d, x2d, y2d, x3d, y3d, x4d, y4d),\n\t\t\tm = L.MatrixUtil.multmm(d, L.MatrixUtil.adj(s));\n\n\t\t/* \n\t\t *\tNormalize to the unique matrix with m[8] == 1. \n\t\t * \tSee: http://franklinta.com/2014/09/08/computing-css-matrix3d-transforms/\n\t\t */\n\t\treturn L.MatrixUtil.multsm(1/m[8], m);\n\t}\n};","L.EditHandle = L.Marker.extend({\n\tinitialize: function(overlay, corner, options) {\n\t\tvar markerOptions,\n\t\t\tlatlng = overlay._corners[corner];\n\n\t\tL.setOptions(this, options);\n\n\t\tthis._handled = overlay;\n\t\tthis._corner = corner;\n\n\t\tmarkerOptions = {\n\t\t\tdraggable: true,\n\t\t\tzIndexOffset: 10\n\t\t};\n\n\t\tif (options && options.hasOwnProperty('draggable')) {\n\t\t\tmarkerOptions.draggable = options.draggable;\n\t\t}\n\n\t\tL.Marker.prototype.initialize.call(this, latlng, markerOptions);\n\t},\n\n\tonAdd: function(map) {\n\t\tL.Marker.prototype.onAdd.call(this, map);\n\t\tthis._bindListeners();\n\n\t\tthis.updateHandle();\n\t},\n\n\tonRemove: function(map) {\n\t\tthis._unbindListeners();\n\t\tL.Marker.prototype.onRemove.call(this, map);\n\t},\n\n\t_onHandleDragStart: function() {\n\t\tthis._handled.fire('editstart');\n\t},\n\n\t_onHandleDragEnd: function() {\n\t\tthis._fireEdit();\n\t},\n\n\t_fireEdit: function() {\n\t\tthis._handled.edited = true;\n\t\tthis._handled.fire('edit');\n\t},\n\n\t_bindListeners: function() {\n\t\tthis.on({\n\t\t\t'dragstart': this._onHandleDragStart,\n\t\t\t'drag': this._onHandleDrag,\n\t\t\t'dragend': this._onHandleDragEnd\n\t\t}, this);\n\n\t\tthis._handled._map.on('zoomend', this.updateHandle, this);\n\n\t\tthis._handled.on('update', this.updateHandle, this);\n\t},\n\n\t_unbindListeners: function() {\n\t\tthis.off({\n\t\t\t'dragstart': this._onHandleDragStart,\n\t\t\t'drag': this._onHandleDrag,\n\t\t\t'dragend': this._onHandleDragEnd\n\t\t}, this);\n\n\t\tthis._handled._map.off('zoomend', this.updateHandle, this);\n\t\tthis._handled.off('update', this.updateHandle, this);\n\t}\n});\n","L.LockHandle = L.EditHandle.extend({\n\toptions: {\n\t\tTYPE: 'lock',\n\t\ticon: new L.Icon({ \n\t\t\ticonUrl: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAD8SURBVO3BPU7CYAAA0AdfjIcQlRCQBG7C3gk2uIPG2RC3Dk16Gz0FTO1WZs/gwGCMP/2+xsSl7+n1er1Iz9LtRQjaPeMeO+TinLDCJV78YqjdA04YodKuxhUaPGoRxMmxwRQZSt87Yo4KExGCeAUyLLFB4bMacxywEClIU2KDKXbInTUYo8JCgoFuGoxQO5uiwY1EA91VmDqrcKeDoX8WdNNgjApvmGGLXKIgXY0xGkxQYItrrFFIEKQ5Yo4KEx9yrDFDhlKkIF6NOQ5Y+KpAhiXWKEQI4pxwiwoLPyuxwQw75FoE7fZYocFEuwI7jHCBV39gL92TXq/Xi/AOcmczZmaIMScAAAAASUVORK5CYII=',\n\t\t\ticonSize: [32, 32],\n\t\t\ticonAnchor: [16, 16]}\n\t\t)\n\t},\n\n\t/* cannot be dragged */\n\t_onHandleDrag: function() {\n\t},\n\n\tupdateHandle: function() {\n\t\tthis.setLatLng(this._handled._corners[this._corner]);\n\t}\n\n});\n","L.DistortHandle = L.EditHandle.extend({\n\toptions: {\n\t\tTYPE: 'distort',\n\t\ticon: new L.Icon({\n\t\t\ticonUrl: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAChSURBVO3BIU4DURgGwNkvL2B6AkQTLBqP4QCoSm7DDXoBLBZHDbfgICAIZjEV3YTn9uVHdMZZtcnCfI13bIzxg0emg6Nm6QVbYz3jylEsXRrvwommb49X67jFkz80fR9Mb1YxTzqiWBSLYlEsikWxKBbFolgUi2JRLIpFsSgWxaJY03fHHOu40dH07bAzWCx9Ge/TiWbpHgdsjPGNB2f/yS+7xRCyiiZPJQAAAABJRU5ErkJggg==',\n\t\t\ticonSize: [32, 32],\n\t\t\ticonAnchor: [16, 16]}\n\t\t)\n\t},\n\n\tupdateHandle: function() {\n\t\tthis.setLatLng(this._handled._corners[this._corner]);\n\t},\n\n\t_onHandleDrag: function() {\n\t\tthis._handled._updateCorner(this._corner, this.getLatLng());\n\n\t\tthis._handled.fire('update');\n\t}\n});\n","L.RotateAndScaleHandle = L.EditHandle.extend({\n\toptions: {\n\t\tTYPE: 'rotate',\n\t\ticon: new L.Icon({\n\t\t\ticonUrl: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAHiSURBVMXBa3HbShgA0PMp/1sCCo8oCEpgTaCXgIXAJiDzyCJoAUTm4UVQAns1Y8+snWnTvJyeE16hkjDgDrfoNTMKcpC9UPiLSo8JyetkjEHxjPCMyoS199kFoz8Iv1HpMaN3qWDCHoegOKkkRwnJpRmroHgiPFEZ8IBekzEGxQtUEhKSS/fB7Ew4U+lxcGkVZG9QWWPSFAxBcdK59KApuA+yNwp2uEdx1GN25sZJZULSfAtm77SlbNjju6MvG75u+WHRWVR6rDVjMPsgwYyVZl3pLTpHkyYHOx8syMiayaJzlDTZ9YyaZNFVkiYH2ZUEBcVJJXVImuz6Js3Qofe59pq7DoOTILu+g+a288mCouk7/1iH4qTS+2QdDppbV1ZJmrnDXnPnc5UOs2Z0fUmTuyBr+krvSioJyUmQO0dZM7mepMkWnaNRkyrJB6uskTSjxY3Fll8bvmJwlDb83FJ8gMqAB80uyBY3Trb82PAfvjj6vuHnluIdKgMeNXOwctK5NKBoHitrb1RJeHRp5Ux4ojLg0aWMHGQvUOkxIWkKVsHsTPiNSo8HDC5lZIsgO6n0uMUdRvQuFQxB8UR4RmXC2vvsgtEfhL+o9JiQvE7GGBTPCK9QSUjoMWgKDthjDrIX+h/k0I7gth6N5gAAAABJRU5ErkJggg==',\n\t\t\ticonSize: [32, 32],\n\t\t\ticonAnchor: [16, 16]}\n\t\t)\n\t},\n\n\t_onHandleDrag: function() {\n\t\tvar overlay = this._handled,\n\t\t\tformerLatLng = this._handled._corners[this._corner],\n\t\t\tnewLatLng = this.getLatLng(),\n\n\t\t\tangle = this._calculateAngle(formerLatLng, newLatLng),\n\t\t\tscale = this._calculateScalingFactor(formerLatLng, newLatLng);\n\n\t\toverlay.editing._rotateBy(angle);\n\t\toverlay.editing._scaleBy(scale);\n\n\t\t/* \n\t\t checks whether the \"edgeMinWidth\" property is set and tracks the minimum edge length;\n\t\t this enables preventing scaling to zero, but we might also add an overall scale limit\n\t\t*/\t\t\n\t\tif (this._handled.options.hasOwnProperty('edgeMinWidth')){\n\t\t\tvar edgeMinWidth = this._handled.options.edgeMinWidth,\n\t\t\t w = L.latLng(overlay._corners[0]).distanceTo(overlay._corners[1]),\n\t\t\t h = L.latLng(overlay._corners[1]).distanceTo(overlay._corners[2]);\n\t\t\tif ((w > edgeMinWidth && h > edgeMinWidth) || scale > 1) {\n\t\t\t\toverlay.editing._scaleBy(scale);\n\t\t\t}\n\t\t} else {\n\t\t\toverlay.editing._scaleBy(scale);\n\t\t}\n\n\t\toverlay.fire('update');\n\t},\n\n\tupdateHandle: function() {\n\t\tthis.setLatLng(this._handled._corners[this._corner]);\n\t},\n\n\t/* Takes two latlngs and calculates the angle between them. */\n\t_calculateAngle: function(latlngA, latlngB) {\n\t\tvar map = this._handled._map,\n\n\t\t\tcenterPoint = map.latLngToLayerPoint(this._handled.getCenter()),\n\t\t\tformerPoint = map.latLngToLayerPoint(latlngA),\n\t\t\tnewPoint = map.latLngToLayerPoint(latlngB),\n\n\t\t\tinitialAngle = Math.atan2(centerPoint.y - formerPoint.y, centerPoint.x - formerPoint.x),\n\t\t\tnewAngle = Math.atan2(centerPoint.y - newPoint.y, centerPoint.x - newPoint.x);\n\n\t\treturn newAngle - initialAngle;\n\t},\n\n\t/* Takes two latlngs and calculates the scaling difference. */\n\t_calculateScalingFactor: function(latlngA, latlngB) {\n\t\tvar map = this._handled._map,\n\n\t\t\tcenterPoint = map.latLngToLayerPoint(this._handled.getCenter()),\n\t\t\tformerPoint = map.latLngToLayerPoint(latlngA),\n\t\t\tnewPoint = map.latLngToLayerPoint(latlngB),\n\n\t\t\tformerRadiusSquared = this._d2(centerPoint, formerPoint),\n\t\t\tnewRadiusSquared = this._d2(centerPoint, newPoint);\n\n\t\treturn Math.sqrt(newRadiusSquared / formerRadiusSquared);\n\t},\n\n\t/* Distance between two points in cartesian space, squared (distance formula). */\n\t_d2: function(a, b) {\n\t\tvar dx = a.x - b.x,\n\t\t\tdy = a.y - b.y;\n\n\t\treturn Math.pow(dx, 2) + Math.pow(dy, 2);\n\t}\n});\n","L.RotateHandle = L.EditHandle.extend({\n\toptions: {\n\t\tTYPE: 'rotate',\n\t\ticon: new L.Icon({\n\t\t\ticonUrl: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAHiSURBVMXBa3HbShgA0PMp/1sCCo8oCEpgTaCXgIXAJiDzyCJoAUTm4UVQAns1Y8+snWnTvJyeE16hkjDgDrfoNTMKcpC9UPiLSo8JyetkjEHxjPCMyoS199kFoz8Iv1HpMaN3qWDCHoegOKkkRwnJpRmroHgiPFEZ8IBekzEGxQtUEhKSS/fB7Ew4U+lxcGkVZG9QWWPSFAxBcdK59KApuA+yNwp2uEdx1GN25sZJZULSfAtm77SlbNjju6MvG75u+WHRWVR6rDVjMPsgwYyVZl3pLTpHkyYHOx8syMiayaJzlDTZ9YyaZNFVkiYH2ZUEBcVJJXVImuz6Js3Qofe59pq7DoOTILu+g+a288mCouk7/1iH4qTS+2QdDppbV1ZJmrnDXnPnc5UOs2Z0fUmTuyBr+krvSioJyUmQO0dZM7mepMkWnaNRkyrJB6uskTSjxY3Fll8bvmJwlDb83FJ8gMqAB80uyBY3Trb82PAfvjj6vuHnluIdKgMeNXOwctK5NKBoHitrb1RJeHRp5Ux4ojLg0aWMHGQvUOkxIWkKVsHsTPiNSo8HDC5lZIsgO6n0uMUdRvQuFQxB8UR4RmXC2vvsgtEfhL+o9JiQvE7GGBTPCK9QSUjoMWgKDthjDrIX+h/k0I7gth6N5gAAAABJRU5ErkJggg==',\n\t\t\ticonSize: [32, 32],\n\t\t\ticonAnchor: [16, 16]}\n\t\t)\n\t},\n\n\t_onHandleDrag: function() {\n\t\tvar overlay = this._handled,\n\t\t\tformerLatLng = this._handled._corners[this._corner],\n\t\t\tnewLatLng = this.getLatLng(),\n\n\t\t\tangle = this._calculateAngle(formerLatLng, newLatLng);\n\n\t\toverlay.editing._rotateBy(angle);\n\n\t\toverlay.fire('update');\n\t},\n\n\tupdateHandle: function() {\n\t\tthis.setLatLng(this._handled._corners[this._corner]);\n\t},\n\n\t/* Takes two latlngs and calculates the angle between them. */\n\t_calculateAngle: function(latlngA, latlngB) {\n\t\tvar map = this._handled._map,\n\n\t\t\tcenterPoint = map.latLngToLayerPoint(this._handled.getCenter()),\n\t\t\tformerPoint = map.latLngToLayerPoint(latlngA),\n\t\t\tnewPoint = map.latLngToLayerPoint(latlngB),\n\n\t\t\tinitialAngle = Math.atan2(centerPoint.y - formerPoint.y, centerPoint.x - formerPoint.x),\n\t\t\tnewAngle = Math.atan2(centerPoint.y - newPoint.y, centerPoint.x - newPoint.x);\n\n\t\treturn newAngle - initialAngle;\n\t},\n\n\t/* Takes two latlngs and calculates the scaling difference. */\n\t_calculateScalingFactor: function(latlngA, latlngB) {\n\t\tvar map = this._handled._map,\n\n\t\t\tcenterPoint = map.latLngToLayerPoint(this._handled.getCenter()),\n\t\t\tformerPoint = map.latLngToLayerPoint(latlngA),\n\t\t\tnewPoint = map.latLngToLayerPoint(latlngB),\n\n\t\t\tformerRadiusSquared = this._d2(centerPoint, formerPoint),\n\t\t\tnewRadiusSquared = this._d2(centerPoint, newPoint);\n\n\t\treturn Math.sqrt(newRadiusSquared / formerRadiusSquared);\n\t},\n\n\t/* Distance between two points in cartesian space, squared (distance formula). */\n\t_d2: function(a, b) {\n\t\tvar dx = a.x - b.x,\n\t\t\tdy = a.y - b.y;\n\n\t\treturn Math.pow(dx, 2) + Math.pow(dy, 2);\n\t}\n});\n","L.ScaleHandle = L.EditHandle.extend({\n\toptions: {\n\t\tTYPE: 'rotate',\n\t\ticon: new L.Icon({\n\t\t\ticonUrl:'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIHdpZHRoPSI0NTkiIGhlaWdodD0iNDY0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCA1MTIgNTEyIiB4bWw6c3BhY2U9InByZXNlcnZlIiBzdHlsZT0iIj48cmVjdCBpZD0iYmFja2dyb3VuZHJlY3QiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHg9IjAiIHk9IjAiIGZpbGw9Im5vbmUiIHN0cm9rZT0ibm9uZSIgY2xhc3M9IiIgc3R5bGU9IiIvPjxnIGNsYXNzPSJjdXJyZW50TGF5ZXIiIHN0eWxlPSIiPjx0aXRsZT5MYXllciAxPC90aXRsZT48cGF0aCBkPSJNNDU5LjA0OTE1OTUzMDQ3MTM0LDg2LjkyNjIzNDUxMjU1MDAyIFYwIGgtODUuNzE0NTczMzU2MzEyMDkgdjI3LjA0MzcxNzQwMzkwNDQ1MiBIODUuNzE0NTczMzU2MzEyMDMgVjAgSDAgdjg2LjkyNjIzNDUxMjU1MDAyIGgyNS43MTQzNzIwMDY4OTM2MjYgdjI4OS43NTQxMTUwNDE4MzM0IEgwIHY4Ni45MjYyMzQ1MTI1NTAwMiBoODUuNzE0NTczMzU2MzEyMDkgdi0yNy4wNDM3MTc0MDM5MDQ0NTIgaDI4NS43MTUyNDQ1MjEwNDAzIHYyNy4wNDM3MTc0MDM5MDQ0NTIgaDg1LjcxNDU3MzM1NjMxMjA5IHYtODYuOTI2MjM0NTEyNTUwMDIgaC0yMy44MDk2MDM3MTAwODY2OSBWODYuOTI2MjM0NTEyNTUwMDIgSDQ1OS4wNDkxNTk1MzA0NzEzNCB6TTM4NC43NjMxOTU5NTUwMDA5LDEyLjU1NjAxMTY1MTgxMjc4MSBoNjEuOTA0OTY5NjQ2MjI1Mzk2IHY2Mi43ODAwNTgyNTkwNjM5MSBoLTYxLjkwNDk2OTY0NjIyNTM5NiBWMTIuNTU2MDExNjUxODEyNzgxIHpNMTIuMzgwOTkzOTI5MjQ1MDUsMTIuNTU2MDExNjUxODEyNzgxIGg2MS45MDQ5Njk2NDYyMjUzOTYgdjYyLjc4MDA1ODI1OTA2MzkxIEgxMi4zODA5OTM5MjkyNDUwNSBWMTIuNTU2MDExNjUxODEyNzgxIHpNNzQuMjg1OTYzNTc1NDcwNTMsNDUxLjA1MDU3MjQxNTEyMDY2IEgxMi4zODA5OTM5MjkyNDUwNSB2LTYyLjc4MDA1ODI1OTA2MzkxIGg2MS45MDQ5Njk2NDYyMjUzOTYgVjQ1MS4wNTA1NzI0MTUxMjA2NiB6TTQ0NS43MTU3ODE0NTI4MjI3NCw0NTEuMDUwNTcyNDE1MTIwNjYgaC02Mi44NTczNTM3OTQ2Mjg4NjQgdi02Mi43ODAwNTgyNTkwNjM5MSBoNjIuODU3MzUzNzk0NjI4ODY0IFY0NTEuMDUwNTcyNDE1MTIwNjYgek00MDcuNjIwNDE1NTE2Njg0MjYsMzc2LjY4MDM0OTU1NDM4MzQ0IGgtMzYuMTkwNTk3NjM5MzMxNzcgdjMyLjgzODc5OTcwNDc0MTEyIEg4NS43MTQ1NzMzNTYzMTIwMyB2LTMyLjgzODc5OTcwNDc0MTEyIEg0OS41MjM5NzU3MTY5ODAzMiBWODYuOTI2MjM0NTEyNTUwMDIgaDM2LjE5MDU5NzYzOTMzMTc3IFY1MC4yMjQwNDY2MDcyNTExMjUgaDI4Ny42MjAwMTI4MTc4NDcyIHYzNi43MDIxODc5MDUyOTg5IGgzNC4yODU4MjkzNDI1MjQ4MzUgVjM3Ni42ODAzNDk1NTQzODM0NCB6IiBpZD0ic3ZnXzIiIGNsYXNzPSIiIGZpbGw9IiMxYTFhZWIiIGZpbGwtb3BhY2l0eT0iMSIvPjwvZz48L3N2Zz4=',\n\t\t\ticonSize: [32, 32],\n\t\t\ticonAnchor: [16, 16]}\n\t\t)\n\t},\n\n\t_onHandleDrag: function() {\n\t\tvar overlay = this._handled,\n\t\t\tformerLatLng = this._handled._corners[this._corner],\n\t\t\tnewLatLng = this.getLatLng(),\n\n\t\t\tscale = this._calculateScalingFactor(formerLatLng, newLatLng);\n\n\t\toverlay.editing._scaleBy(scale);\n\n\t\toverlay.fire('update');\n\t},\n\n\tupdateHandle: function() {\n\t\tthis.setLatLng(this._handled._corners[this._corner]);\n\t},\n\n\t/* Takes two latlngs and calculates the angle between them. */\n\t_calculateAngle: function(latlngA, latlngB) {\n\t\tvar map = this._handled._map,\n\n\t\t\tcenterPoint = map.latLngToLayerPoint(this._handled.getCenter()),\n\t\t\tformerPoint = map.latLngToLayerPoint(latlngA),\n\t\t\tnewPoint = map.latLngToLayerPoint(latlngB),\n\n\t\t\tinitialAngle = Math.atan2(centerPoint.y - formerPoint.y, centerPoint.x - formerPoint.x),\n\t\t\tnewAngle = Math.atan2(centerPoint.y - newPoint.y, centerPoint.x - newPoint.x);\n\n\t\treturn newAngle - initialAngle;\n\t},\n\n\t/* Takes two latlngs and calculates the scaling difference. */\n\t_calculateScalingFactor: function(latlngA, latlngB) {\n\t\tvar map = this._handled._map,\n\n\t\t\tcenterPoint = map.latLngToLayerPoint(this._handled.getCenter()),\n\t\t\tformerPoint = map.latLngToLayerPoint(latlngA),\n\t\t\tnewPoint = map.latLngToLayerPoint(latlngB),\n\n\t\t\tformerRadiusSquared = this._d2(centerPoint, formerPoint),\n\t\t\tnewRadiusSquared = this._d2(centerPoint, newPoint);\n\n\t\treturn Math.sqrt(newRadiusSquared / formerRadiusSquared);\n\t},\n\n\t/* Distance between two points in cartesian space, squared (distance formula). */\n\t_d2: function(a, b) {\n\t\tvar dx = a.x - b.x,\n\t\t\tdy = a.y - b.y;\n\n\t\treturn Math.pow(dx, 2) + Math.pow(dy, 2);\n\t}\n});\n","L.DistortableImageOverlay = L.ImageOverlay.extend({\n\tinclude: L.Mixin.Events,\n\n\toptions: {\n\t\talt: '',\n\t\theight: 200,\n\t\tcrossOrigin: true\n\t},\n\n\tinitialize: function(url, options) {\n\t\tthis._url = url;\n\t\tthis._rotation = this.options.rotation;\n\n\t\tL.setOptions(this, options);\n\t},\n\n\tonAdd: function(map) {\n\t\t/* Copied from L.ImageOverlay */\n\t\tthis._map = map;\n\n\t\tif (!this._image) { this._initImage(); }\n\t\tif (!this._events) { this._initEvents(); }\n\n\t\tmap._panes.overlayPane.appendChild(this._image);\n\n\t\tmap.on('viewreset', this._reset, this);\n\t\t/* End copied from L.ImageOverlay */\n\n\t\t/* Use provided corners if available */\n\t\tif (this.options.corners) { \n\t\t\tthis._corners = this.options.corners; \n\t\t\tif (map.options.zoomAnimation && L.Browser.any3d) {\n\t\t\t\tmap.on('zoomanim', this._animateZoom, this);\n\t\t\t}\n\n\t\t\t/* This reset happens before image load; it allows \n\t\t\t * us to place the image on the map earlier with \n\t\t\t * \"guessed\" dimensions. */\n\t\t\tthis._reset();\n\t\t}\n\n\t\t/* Have to wait for the image to load because \n\t\t * we need to access its width and height. */\n\t\tL.DomEvent.on(this._image, 'load', function() {\n\t\t\tthis._initImageDimensions();\n\t\t\tthis._reset();\n\t\t\t/* Initialize default corners if not already set */\n\t\t\tif (!this._corners) { \n\t\t\t\tif (map.options.zoomAnimation && L.Browser.any3d) {\n\t\t\t\t\tmap.on('zoomanim', this._animateZoom, this);\n\t\t\t\t}\n\t\t\t}\n\t\t}, this);\t\t\n\n\t\tthis.fire('add');\t\n\t},\n\n\tonRemove: function(map) {\n\t\tthis.fire('remove');\n\n\t\tL.ImageOverlay.prototype.onRemove.call(this, map);\n\t},\n\n\t_initImage: function () {\n\t\tL.ImageOverlay.prototype._initImage.call(this);\n\n\t\tL.extend(this._image, {\n\t\t\talt: this.options.alt\n\t\t});\n\t},\n\n\t_initImageDimensions: function() {\n\t\tvar map = this._map,\n\n\t\t\toriginalImageWidth = L.DomUtil.getStyle(this._image, 'width'),\n\t\t\toriginalImageHeight = L.DomUtil.getStyle(this._image, 'height'),\n\n\t\t\taspectRatio = parseInt(originalImageWidth) / parseInt(originalImageHeight),\n\n\t\t\timageHeight = this.options.height,\n\t\t\timageWidth = parseInt(aspectRatio*imageHeight),\n\n\t\t\tcenter = map.latLngToContainerPoint(map.getCenter()),\n\t\t\toffset = new L.Point(imageWidth, imageHeight).divideBy(2);\n\n\t\tif (this.options.corners) { this._corners = this.options.corners; }\n\t\telse {\n\t\t\tthis._corners = [\n\t\t\t\tmap.containerPointToLatLng(center.subtract(offset)),\n\t\t\t\tmap.containerPointToLatLng(center.add(new L.Point(offset.x, - offset.y))),\n\t\t\t\tmap.containerPointToLatLng(center.add(new L.Point(- offset.x, offset.y))),\n\t\t\t\tmap.containerPointToLatLng(center.add(offset))\n\t\t\t];\n\t\t}\n\t},\n\n \t_initEvents: function() {\n \t\tthis._events = [ 'click' ];\n\n \t\tfor (var i = 0, l = this._events.length; i < l; i++) {\n\t \t\tL.DomEvent.on(this._image, this._events[i], this._fireMouseEvent, this);\n \t\t}\n \t},\n\n \t/* See src/layer/vector/Path.SVG.js in the Leaflet source. */\n \t_fireMouseEvent: function(event) {\n \t\tif (!this.hasEventListeners(event.type)) { return; }\n\n\t\tvar map = this._map,\n\t\t\tcontainerPoint = map.mouseEventToContainerPoint(event),\n\t\t\tlayerPoint = map.containerPointToLayerPoint(containerPoint),\n\t\t\tlatlng = map.layerPointToLatLng(layerPoint);\n\n\t\tthis.fire(event.type, {\n\t\t\tlatlng: latlng,\n\t\t\tlayerPoint: layerPoint,\n\t\t\tcontainerPoint: containerPoint,\n\t\t\toriginalEvent: event\n\t\t});\n \t},\n\n\t_updateCorner: function(corner, latlng) {\n\t\tthis._corners[corner] = latlng;\n\t\tthis._reset();\n\t},\n\n\n\t/* Copied from Leaflet v0.7 https://github.com/Leaflet/Leaflet/blob/66282f14bcb180ec87d9818d9f3c9f75afd01b30/src/dom/DomUtil.js#L189-L199 */\n\t/* since L.DomUtil.getTranslateString() is deprecated in Leaflet v1.0 */\n\t_getTranslateString: function (point) {\n\t\t// on WebKit browsers (Chrome/Safari/iOS Safari/Android) using translate3d instead of translate\n\t\t// makes animation smoother as it ensures HW accel is used. Firefox 13 doesn't care\n\t\t// (same speed either way), Opera 12 doesn't support translate3d\n\n\t\tvar is3d = L.Browser.webkit3d,\n\t\t open = 'translate' + (is3d ? '3d' : '') + '(',\n\t\t close = (is3d ? ',0' : '') + ')';\n\n\t\treturn open + point.x + 'px,' + point.y + 'px' + close;\n\t},\n\n\t_reset: function() {\n\t\tvar map = this._map,\n\t\t\timage = this._image,\n\t\t\tlatLngToLayerPoint = L.bind(map.latLngToLayerPoint, map),\n\n\t\t\ttransformMatrix = this._calculateProjectiveTransform(latLngToLayerPoint),\n\t\t\ttopLeft = latLngToLayerPoint(this._corners[0]),\n\n\t\t\twarp = L.DomUtil.getMatrixString(transformMatrix),\n\t\t\ttranslation = this._getTranslateString(topLeft);\n\n\t\t/* See L.DomUtil.setPosition. Mainly for the purposes of L.Draggable. */\n\t\timage._leaflet_pos = topLeft;\n\n\t\timage.style[L.DomUtil.TRANSFORM] = [translation, warp].join(' ');\n\n\t\t/* Set origin to the upper-left corner rather than the center of the image, which is the default. */\n\t\timage.style[L.DomUtil.TRANSFORM + '-origin'] = \"0 0 0\";\n\t},\n\n\t/*\n\t * Calculates the transform string that will be correct *at the end* of zooming.\n\t * Leaflet then generates a CSS3 animation between the current transform and \n\t *\t\t future transform which makes the transition appear smooth.\n\t */\n\t_animateZoom: function(event) {\n\t\tvar map = this._map,\n\t\t\timage = this._image,\n\t\t\tlatLngToNewLayerPoint = function(latlng) {\n\t\t\t\treturn map._latLngToNewLayerPoint(latlng, event.zoom, event.center);\n\t\t\t},\n\t\n\t\t\ttransformMatrix = this._calculateProjectiveTransform(latLngToNewLayerPoint),\n\t\t\ttopLeft = latLngToNewLayerPoint(this._corners[0]),\n\t\n\t\t\twarp = L.DomUtil.getMatrixString(transformMatrix),\n\t\t\ttranslation = this._getTranslateString(topLeft);\n\t\n\t\t/* See L.DomUtil.setPosition. Mainly for the purposes of L.Draggable. */\n\t\timage._leaflet_pos = topLeft;\n\t\n\t\tif (!L.Browser.gecko) {\n\t\t\timage.style[L.DomUtil.TRANSFORM] = [translation, warp].join(' ');\n\t\t}\n\t},\n\n\tgetCorners: function() {\n\t\treturn this._corners;\n\t},\n\n\t/*\n\t * Calculates the centroid of the image.\n\t *\t\t See http://stackoverflow.com/questions/6149175/logical-question-given-corners-find-center-of-quadrilateral\n\t */\n\tgetCenter: function(ll2c, c2ll) {\n\t\tvar map = this._map,\n\t\t\tlatLngToCartesian = ll2c ? ll2c : map.latLngToLayerPoint,\n\t\t\tcartesianToLatLng = c2ll ? c2ll: map.layerPointToLatLng,\n\t\t\tnw = latLngToCartesian.call(map, this._corners[0]),\n\t\t\tne = latLngToCartesian.call(map, this._corners[1]),\n\t\t\tse = latLngToCartesian.call(map, this._corners[2]),\n\t\t\tsw = latLngToCartesian.call(map, this._corners[3]),\n\n\t\t\tnmid = nw.add(ne.subtract(nw).divideBy(2)),\n\t\t\tsmid = sw.add(se.subtract(sw).divideBy(2));\n\n\t\treturn cartesianToLatLng.call(map, nmid.add(smid.subtract(nmid).divideBy(2)));\n\t},\n\n\t_calculateProjectiveTransform: function(latLngToCartesian) {\n\t\t/* Setting reasonable but made-up image defaults \n\t\t * allow us to place images on the map before \n\t\t * they've finished downloading. */\n\t\tvar offset = latLngToCartesian(this._corners[0]),\n\t\t\tw = this._image.offsetWidth || 500, \n\t\t\th = this._image.offsetHeight || 375,\n\t\t\tc = [],\n\t\t\tj;\n\t\t/* Convert corners to container points (i.e. cartesian coordinates). */\n\t\tfor (j = 0; j < this._corners.length; j++) {\n\t\t\tc.push(latLngToCartesian(this._corners[j])._subtract(offset));\n\t\t}\n\t\t\n\t\t/*\n\t\t * This matrix describes the action of the CSS transform on each corner of the image.\n\t\t * It maps from the coordinate system centered at the upper left corner of the image\n\t\t *\t\t to the region bounded by the latlngs in this._corners.\n\t\t * For example:\n\t\t *\t\t 0, 0, c[0].x, c[0].y\n\t\t *\t\t says that the upper-left corner of the image maps to the first latlng in this._corners.\n\t\t */\n\t\treturn L.MatrixUtil.general2DProjection(\n\t\t\t0, 0, c[0].x, c[0].y,\n\t\t\tw, 0, c[1].x, c[1].y,\n\t\t\t0, h, c[2].x, c[2].y,\n\t\t\tw, h, c[3].x, c[3].y\n\t\t);\n\t}\n});\n","L.DistortableImage = L.DistortableImage || {};\n\nvar EditOverlayAction = LeafletToolbar.ToolbarAction.extend({\n\t\tinitialize: function(map, overlay, options) {\n\t\t\tthis._overlay = overlay;\n\t\t\tthis._map = map;\n\n\t\t\tLeafletToolbar.ToolbarAction.prototype.initialize.call(this, options);\n\t\t}\n\t}),\n\n\tToggleTransparency = EditOverlayAction.extend({\n\t\toptions: { toolbarIcon: { \n\t\t\thtml: '',\n\t\t\ttooltip: 'Toggle Image Transparency',\n\t\t\ttitle: 'Toggle Image Transparency'\t\n\t\t}},\n\n\t\taddHooks: function() {\n\t\t\tvar editing = this._overlay.editing;\n\n\t\t\tediting._toggleTransparency();\n\t\t\tthis.disable();\n\t\t}\n\t}),\n\n\tToggleOutline = EditOverlayAction.extend({\n\t\toptions: { toolbarIcon: { \n\t\t\thtml: '',\n\t\t\ttooltip: 'Toggle Image Outline',\n\t\t\ttitle: 'Toggle Image Outline'\n\t\t}},\n\n\t\taddHooks: function() {\n\t\t\tvar editing = this._overlay.editing;\n\n\t\t\tediting._toggleOutline();\n\t\t\tthis.disable();\n\t\t}\n\t}),\n\n\tRemoveOverlay = EditOverlayAction.extend({\n\t\toptions: { toolbarIcon: { \n\t\t\thtml: '',\n\t\t\ttooltip: 'Delete image',\n\t\t\ttitle: 'Delete image'\n\t\t}},\n\n\t\taddHooks: function() {\n\t\t\tvar map = this._map;\n\n\t\t\tmap.removeLayer(this._overlay);\n\t\t\tthis._overlay.fire('delete');\n\t\t\tthis.disable();\n\t\t}\n\t}),\n\n\tToggleEditable = EditOverlayAction.extend({\n\t\toptions: { toolbarIcon: {\n\t\t\thtml: '',\n\t\t\ttooltip: 'Lock / Unlock editing',\n\t\t\ttitle: 'Lock / Unlock editing'\t\t\t\n\t\t}},\n\n\t\taddHooks: function() {\n\t\t\tvar editing = this._overlay.editing;\n\n\t\t\tediting._toggleLock();\n\t\t\tthis.disable();\n\t\t}\n\t}),\n\n\tToggleRotateDistort = EditOverlayAction.extend({\n\t\tinitialize: function(map, overlay, options) {\n\t\t\tvar icon = overlay.editing._mode === 'rotate' ? 'image' : 'rotate-left';\n\n\t\t\toptions = options || {};\n\t\t\toptions.toolbarIcon = {\n\t\t\t\thtml: '',\n\t\t\t\ttooltip: 'Rotate',\n\t\t\t\ttitle: 'Rotate'\t\n\t\t\t};\n\n\t\t\tEditOverlayAction.prototype.initialize.call(this, map, overlay, options);\n\t\t},\n\n\t\taddHooks: function() {\n\t\t\tvar editing = this._overlay.editing;\n\n\t\t\tediting._toggleRotateDistort();\n\t\t\tthis.disable();\n\t\t}\n\t}),\n\n\n\tToggleExport = EditOverlayAction.extend({\n\t\toptions: {\n\t\t\ttoolbarIcon: {\n\t\t\t\thtml: '',\n\t\t\t\ttooltip: 'Export Image',\n\t\t\t\ttitle: 'Export Image'\n\t\t\t}\n\t\t},\n\t\t\n\t\taddHooks: function ()\n\t\t{\n\t\t\tvar editing = this._overlay.editing;\n\n\t\t\tediting._toggleExport();\n\t\t\tthis.disable(); \n\t\t}\n\t});\n\nL.DistortableImage.EditToolbar = LeafletToolbar.Popup.extend({\n\toptions: {\n\t\tactions: [\n\t\t\tToggleTransparency,\n\t\t\tRemoveOverlay,\n\t\t\tToggleOutline,\n\t\t\tToggleEditable,\n\t\t\tToggleRotateDistort,\n\t\t\tToggleExport\n\t\t]\n\t}\n});\n","L.DistortableImage = L.DistortableImage || {};\n\nL.DistortableImage.Edit = L.Handler.extend({\n\toptions: {\n\t\topacity: 0.7,\n\t\toutline: '1px solid red',\n\t\tkeymap: {\n\t\t\t68: '_toggleRotateDistort', // d\n\t\t\t69: '_toggleIsolate', // e\n\t\t\t73: '_toggleIsolate', // i\n\t\t\t76: '_toggleLock', // l\n\t\t\t79: '_toggleOutline', // o\n\t\t\t82: '_toggleRotateDistort', // r\n 84: '_toggleTransparency', // t\n 46: \"_removeOverlay\", // delete windows / delete + fn mac\n 8: \t\"_removeOverlay\" // backspace windows / delete mac\n\t\t}\n\t},\n\n\tinitialize: function(overlay) {\n\t\tthis._overlay = overlay;\n\n\t\t/* Interaction modes. */\n\t\tthis._mode = this._overlay.options.mode || 'distort';\n\t\tthis._transparent = false;\n\t\tthis._outlined = false;\n\t},\n\n\t/* Run on image seletion. */\n\taddHooks: function() {\n\t\tvar overlay = this._overlay,\n\t\t\tmap = overlay._map,\n\t\t\ti;\n\n\t\t\t/* bring the selected image into view */\n\t\t\toverlay.bringToFront();\n\n\t\tthis._lockHandles = new L.LayerGroup();\n\t\tfor (i = 0; i < 4; i++) {\n\t\t\tthis._lockHandles.addLayer(new L.LockHandle(overlay, i, { draggable: false }));\n\t\t}\n\n\t\tthis._distortHandles = new L.LayerGroup();\n\t\tfor (i = 0; i < 4; i++) {\n\t\t\tthis._distortHandles.addLayer(new L.DistortHandle(overlay, i));\n\t\t}\n\n\t\tthis._rotateHandles = new L.LayerGroup();\n\t\tfor (i = 0; i < 4; i++) {\n\t\t\tthis._rotateHandles.addLayer(new L.RotateHandle(overlay, i));\n\t\t}\n\n\t\tthis._handles = {\n\t\t\t'lock':\t\t this._lockHandles,\n\t\t\t'distort': this._distortHandles,\n\t\t\t'rotate':\tthis._rotateHandles\n\t\t};\n\n\t\tif (this._mode === 'lock') {\n\t\t\tmap.addLayer(this._lockHandles);\n\t\t} else {\n\t\t\tthis._mode = 'distort';\n\t\t\tmap.addLayer(this._distortHandles);\n\t\t\tthis._enableDragging();\n\t\t}\n\n\t\t//overlay.on('click', this._showToolbar, this);\n\t\tL.DomEvent.on(overlay._image, 'click', this._showToolbar, this);\n\n\t\t/* Enable hotkeys. */\n\t\tL.DomEvent.on(window, 'keydown', this._onKeyDown, this);\n\n\t\toverlay.fire('select');\n\n\t},\n\n\t/* Run on image deseletion. */\n\tremoveHooks: function() {\n\t\tvar overlay = this._overlay,\n\t\t\tmap = overlay._map;\n\n\t\t// L.DomEvent.off(window, 'keydown', this._onKeyDown, this);\n\n\t\tL.DomEvent.off(overlay._image, 'click', this._showToolbar, this);\n\n\t\t// First, check if dragging exists;\n\t\t// it may be off due to locking\n\t\tif (this.dragging) { this.dragging.disable(); }\n\t\tdelete this.dragging;\n\n\t\tmap.removeLayer(this._handles[this._mode]);\n\n \t\t/* Disable hotkeys. */\n\t\tL.DomEvent.off(window, 'keydown', this._onKeyDown, this);\n\n\t\toverlay.fire('deselect');\n },\n\n confirmDelete: function () {\n return window.confirm(\"Are you sure you want to delete?\");\n },\n\n\n\t_rotateBy: function(angle) {\n\t\tvar overlay = this._overlay,\n\t\t\tmap = overlay._map,\n\t\t\tcenter = map.latLngToLayerPoint(overlay.getCenter()),\n\t\t\ti, p, q;\n\n\t\tfor (i = 0; i < 4; i++) {\n\t\t\tp = map.latLngToLayerPoint(overlay._corners[i]).subtract(center);\n\t\t\tq = new L.Point(\n\t\t\t\tMath.cos(angle)*p.x - Math.sin(angle)*p.y,\n\t\t\t\tMath.sin(angle)*p.x + Math.cos(angle)*p.y\n\t\t\t);\n\t\t\toverlay._corners[i] = map.layerPointToLatLng(q.add(center));\n\t\t}\n\n\t\toverlay._reset();\n\t},\n\n\t_scaleBy: function(scale) {\n\t\tvar overlay = this._overlay,\n\t\t\tmap = overlay._map,\n\t\t\tcenter = map.latLngToLayerPoint(overlay.getCenter()),\n\t\t\ti, p;\n\n\t\tfor (i = 0; i < 4; i++) {\n\t\t\tp = map.latLngToLayerPoint(overlay._corners[i])\n\t\t\t\t.subtract(center)\n\t\t\t\t.multiplyBy(scale)\n\t\t\t\t.add(center);\n\t\t\toverlay._corners[i] = map.layerPointToLatLng(p);\n\t\t}\n\n\t\toverlay._reset();\n\t},\n\n\t_enableDragging: function() {\n\t\tvar overlay = this._overlay,\n\t\t\tmap = overlay._map;\n\n\t\tthis.dragging = new L.Draggable(overlay._image);\n\t\tthis.dragging.enable();\n\n\t\t/* Hide toolbars while dragging; click will re-show it */\n\t\tthis.dragging.on('dragstart', this._hideToolbar, this);\n\n\t\t/*\n\t\t * Adjust default behavior of L.Draggable.\n\t\t * By default, L.Draggable overwrites the CSS3 distort transform\n\t\t * that we want when it calls L.DomUtil.setPosition.\n\t\t */\n\t\tthis.dragging._updatePosition = function() {\n\t\t\tvar delta = this._newPos.subtract(map.latLngToLayerPoint(overlay._corners[0])),\n\t\t\t\tcurrentPoint, i;\n\n\t\t\tthis.fire('predrag');\n\n\t\t\tfor (i = 0; i < 4; i++) {\n\t\t\t\tcurrentPoint = map.latLngToLayerPoint(overlay._corners[i]);\n\t\t\t\toverlay._corners[i] = map.layerPointToLatLng(currentPoint.add(delta));\n\t\t\t}\n\t\t\toverlay._reset();\n\t\t\toverlay.fire('update');\n\n\t\t\tthis.fire('drag');\n\t\t};\n\t},\n\n\t_onKeyDown: function(event) {\n\t\tvar keymap = this.options.keymap,\n\t\t\thandlerName = keymap[event.which];\n\n\t\tif (handlerName !== undefined && this._overlay.options.suppressToolbar !== true) {\n\t\t\tthis[handlerName].call(this);\n\t\t}\n\t},\n\n\t_toggleRotateDistort: function() {\n\t\tvar map = this._overlay._map;\n\n\t\tmap.removeLayer(this._handles[this._mode]);\n\n\t\t/* Switch mode. */\n\t\tif (this._mode === 'rotate') { this._mode = 'distort'; }\n\t\telse { this._mode = 'rotate'; }\n\n\t\tmap.addLayer(this._handles[this._mode]);\n\t},\n\n\t_toggleTransparency: function() {\n\t\tvar image = this._overlay._image,\n\t\t\topacity;\n\n\t\tthis._transparent = !this._transparent;\n\t\topacity = this._transparent ? this.options.opacity : 1;\n\n\t\tL.DomUtil.setOpacity(image, opacity);\n\t\timage.setAttribute('opacity', opacity);\n\t},\n\n\t_toggleOutline: function() {\n\t\tvar image = this._overlay._image,\n\t\t\topacity, outline;\n\n\t\tthis._outlined = !this._outlined;\n\t\topacity = this._outlined ? this.options.opacity / 2 : 1;\n\t\toutline = this._outlined ? this.options.outline : 'none';\n\n\t\tL.DomUtil.setOpacity(image, opacity);\n\t\timage.setAttribute('opacity', opacity);\n\n\t\timage.style.outline = outline;\n\t},\n\n\t_toggleLock: function() {\n\t\tvar map = this._overlay._map;\n\n\t\tmap.removeLayer(this._handles[this._mode]);\n\t\t/* Switch mode. */\n\t\tif (this._mode === 'lock') {\n\t\t\tthis._mode = 'distort';\n\t\t\tthis._enableDragging();\n\t\t} else {\n\t\t\tthis._mode = 'lock';\n\t\t\tif (this.dragging) { this.dragging.disable(); }\n\t\t\tdelete this.dragging;\n\t\t}\n\n\t\tmap.addLayer(this._handles[this._mode]);\n\t},\n\n\t_hideToolbar: function() {\n\t\tvar map = this._overlay._map;\n\t\tif (this.toolbar) {\n\t\t\tmap.removeLayer(this.toolbar);\n\t\t\tthis.toolbar = false;\n\t\t}\n\t},\n\n\t_showToolbar: function(event) {\n\t\tvar overlay = this._overlay,\n target = event.target,\n\t\t\tmap = overlay._map;\n\n\t\t/* Ensure that there is only ever one toolbar attached to each image. */\n\t\tthis._hideToolbar();\n\t\tvar point;\n\t\tif (event.containerPoint) { point = event.containerPoint; }\n\t\telse { point = target._leaflet_pos; }\n\t\tvar raised_point = map.containerPointToLatLng(new L.Point(point.x,point.y-20));\n\t\traised_point.lng = overlay.getCenter().lng;\n\t\tif (this._overlay.options.suppressToolbar !== true) {\n\t\tthis.toolbar = new L.DistortableImage.EditToolbar(raised_point).addTo(map, overlay);\n\t\toverlay.fire('toolbar:created');\n\t\t}\n\n\t\tL.DomEvent.stopPropagation(event);\n },\n\n _removeOverlay: function () {\n var overlay = this._overlay;\n if (this._mode !== \"lock\") {\n var choice = this.confirmDelete();\n if (choice) {\n overlay._map.removeLayer(overlay);\n overlay.fire('delete');\n this.disable();\n }\n }\n },\n\n\t// Based on https://github.com/publiclab/mapknitter/blob/8d94132c81b3040ae0d0b4627e685ff75275b416/app/assets/javascripts/mapknitter/Map.js#L47-L82\n\t_toggleExport: function (){\n\t\tvar map = this._overlay._map;\n\t\tvar overlay = this._overlay;\n\n\t\t// make a new image\n\t\tvar downloadable = new Image();\n\n\t\tdownloadable.id = downloadable.id || \"tempId12345\";\n\t\t$('body').append(downloadable);\n\n\t\tdownloadable.onload = function onLoadDownloadableImage() {\n\n\t\t\tvar height = downloadable.height,\n\t\t\t\twidth = downloadable.width,\n\t\t\t\tnw = map.latLngToLayerPoint(overlay._corners[0]),\n\t\t\t\tne = map.latLngToLayerPoint(overlay._corners[1]),\n\t\t\t\tsw = map.latLngToLayerPoint(overlay._corners[2]),\n\t\t\t\tse = map.latLngToLayerPoint(overlay._corners[3]);\n\n\t\t\t// I think this is to move the image to the upper left corner,\n\t\t\t// jywarren: i think we may need these or the image goes off the edge of the canvas\n // jywarren: but these seem to break the distortion math...\n\n\t\t\t// jywarren: i think it should be rejiggered so it\n\t\t\t// finds the most negative values of x and y and then\n\t\t\t// adds those to all coordinates\n\n\t\t\t//nw.x -= nw.x;\n\t\t\t//ne.x -= nw.x;\n\t\t\t//se.x -= nw.x;\n\t\t\t//sw.x -= nw.x;\n\n\t\t\t//nw.y -= nw.y;\n\t\t\t//ne.y -= nw.y;\n\t\t\t//se.y -= nw.y;\n\t\t\t//sw.y -= nw.y;\n\n\t\t\t// run once warping is complete\n \t\t\tdownloadable.onload = function() {\n\t\t\t\t$(downloadable).remove();\n\t\t\t};\n\n\t\t\tif (window && window.hasOwnProperty('warpWebGl')) {\n\t\t\t\twarpWebGl(\n\t\t\t\t\tdownloadable.id,\n\t\t\t\t\t[0, 0, width, 0, width, height, 0, height],\n\t\t\t\t\t[nw.x, nw.y, ne.x, ne.y, se.x, se.y, sw.x, sw.y],\n\t\t\t\t\ttrue // trigger download\n\t\t\t\t);\n\t\t\t}\n\n\t\t};\n\n\t\tdownloadable.src = overlay.options.fullResolutionSrc || overlay._image.src;\n\n\t},\n\n\ttoggleIsolate: function() {\n\t\t// this.isolated = !this.isolated;\n\t\t// if (this.isolated) {\n\t\t// \t$.each($L.images,function(i,img) {\n\t\t// \t\timg.hidden = false;\n\t\t// \t\timg.setOpacity(1);\n\t\t// \t});\n\t\t// } else {\n\t\t// \t$.each($L.images,function(i,img) {\n\t\t// \t\timg.hidden = true;\n\t\t// \t\timg.setOpacity(0);\n\t\t// \t});\n\t\t// }\n\t\t// this.hidden = false;\n\t\t// this.setOpacity(1);\n\t}\n\n});\n\nL.DistortableImageOverlay.addInitHook(function() {\n\tthis.editing = new L.DistortableImage.Edit(this);\n\n\tif (this.options.editable) {\n\t\tL.DomEvent.on(this._image, 'load', this.editing.enable, this.editing);\n\t}\n\n\tthis.on('remove', function () {\n\t\tif (this.editing) { this.editing.disable(); }\n\t});\n});\n","L.Map.mergeOptions({ boxSelector: true, boxZoom: false });\n\nL.Map.BoxSelectHandle = L.Map.BoxZoom.extend({\n\n addHooks: function () {\n L.DomEvent.on(this._container, 'mousedown', this._onMouseDown, this);\n },\n\n removeHooks: function () {\n L.DomEvent.off(this._container, 'mousedown', this._onMouseDown);\n },\n\n _onMouseDown: function (e) {\n if (!e.shiftKey || ((e.which !== 1) && (e.button !== 1))) { return false; }\n\n L.DomUtil.disableTextSelection();\n\n this._startLayerPoint = this._map.mouseEventToLayerPoint(e);\n\n this._box = L.DomUtil.create('div', 'leaflet-zoom-box', this._pane);\n L.DomUtil.setPosition(this._box, this._startLayerPoint);\n\n this._container.style.cursor = 'crosshair';\n\n L.DomEvent\n .on(document, 'mousemove', this._onMouseMove, this)\n .on(document, 'mouseup', this._onMouseUp, this)\n .on(document, 'keydown', this._onKeyDown, this)\n .preventDefault(e);\n\n this._map.fire('boxzoomstart');\n },\n \n _onMouseMove: function (e) {\n var startPoint = this._startLayerPoint,\n box = this._box,\n\n layerPoint = this._map.mouseEventToLayerPoint(e),\n offset = layerPoint.subtract(startPoint),\n\n newPos = new L.Point(\n Math.min(layerPoint.x, startPoint.x),\n Math.min(layerPoint.y, startPoint.y));\n\n L.DomUtil.setPosition(box, newPos);\n\n box.style.width = (Math.max(0, Math.abs(offset.x) - 4)) + 'px';\n box.style.height = (Math.max(0, Math.abs(offset.y) - 4)) + 'px';\n },\n\n _onMouseUp: function (e) {\n // window.e = e;\n var map = this._map,\n layerPoint = map.mouseEventToLayerPoint(e);\n\n if (this._startLayerPoint.equals(layerPoint)) { return; }\n\n // var bounds = new L.LatLngBounds(\n // map.layerPointToLatLng(this._startLayerPoint),\n // map.layerPointToLatLng(layerPoint));\n\n map.fire('boxzoomend', {\n // boxBounds: bounds\n });\n\n let contents = $(this._pane).children();\n let images = contents.filter('img');\n // window.images = images;\n\n this._finish();\n\n return images;\n },\n\n _finish: function () {\n this._pane.removeChild(this._box);\n this._container.style.cursor = '';\n\n L.DomUtil.enableTextSelection();\n\n L.DomEvent\n .off(document, 'mousemove', this._onMouseMove)\n .off(document, 'mouseup', this._onMouseUp)\n .off(document, 'keydown', this._onKeyDown);\n },\n\n // escape keybinding for getting rid of the selection box (alternative to mouse up). keep for now to see if it will become useful\n // in deselecting images\n _onKeyDown: function (e) {\n if (e.keyCode === 27) {\n this._finish();\n }\n }\n});\n\nL.Map.addInitHook('addHandler', 'boxSelector', L.Map.BoxSelectHandle);\n"]} \ No newline at end of file diff --git a/src/edit/BoxSelectHandle.js b/src/edit/BoxSelectHandle.js new file mode 100644 index 000000000..dcd15d8c2 --- /dev/null +++ b/src/edit/BoxSelectHandle.js @@ -0,0 +1,96 @@ +L.Map.mergeOptions({ boxSelector: true, boxZoom: false }); + +L.Map.BoxSelectHandle = L.Map.BoxZoom.extend({ + + addHooks: function () { + L.DomEvent.on(this._container, 'mousedown', this._onMouseDown, this); + }, + + removeHooks: function () { + L.DomEvent.off(this._container, 'mousedown', this._onMouseDown); + }, + + _onMouseDown: function (e) { + if (!e.shiftKey || ((e.which !== 1) && (e.button !== 1))) { return false; } + + L.DomUtil.disableTextSelection(); + + this._startLayerPoint = this._map.mouseEventToLayerPoint(e); + + this._box = L.DomUtil.create('div', 'leaflet-zoom-box', this._pane); + L.DomUtil.setPosition(this._box, this._startLayerPoint); + + this._container.style.cursor = 'crosshair'; + + L.DomEvent + .on(document, 'mousemove', this._onMouseMove, this) + .on(document, 'mouseup', this._onMouseUp, this) + .on(document, 'keydown', this._onKeyDown, this) + .preventDefault(e); + + this._map.fire('boxzoomstart'); + }, + + _onMouseMove: function (e) { + var startPoint = this._startLayerPoint, + box = this._box, + + layerPoint = this._map.mouseEventToLayerPoint(e), + offset = layerPoint.subtract(startPoint), + + newPos = new L.Point( + Math.min(layerPoint.x, startPoint.x), + Math.min(layerPoint.y, startPoint.y)); + + L.DomUtil.setPosition(box, newPos); + + box.style.width = (Math.max(0, Math.abs(offset.x) - 4)) + 'px'; + box.style.height = (Math.max(0, Math.abs(offset.y) - 4)) + 'px'; + }, + + _onMouseUp: function (e) { + // window.e = e; + var map = this._map, + layerPoint = map.mouseEventToLayerPoint(e); + + if (this._startLayerPoint.equals(layerPoint)) { return; } + + // var bounds = new L.LatLngBounds( + // map.layerPointToLatLng(this._startLayerPoint), + // map.layerPointToLatLng(layerPoint)); + + map.fire('boxzoomend', { + // boxBounds: bounds + }); + + let contents = $(this._pane).children(); + let images = contents.filter('img'); + window.images = images; + + this._finish(); + console.log(images); + return images; + }, + + _finish: function () { + this._pane.removeChild(this._box); + this._container.style.cursor = ''; + + L.DomUtil.enableTextSelection(); + + L.DomEvent + .off(document, 'mousemove', this._onMouseMove) + .off(document, 'mouseup', this._onMouseUp) + .off(document, 'keydown', this._onKeyDown); + }, + + // escape keybinding for getting rid of the selection box (alternative to mouse up). keep for now to see if it will become useful + // in deselecting images + _onKeyDown: function (e) { + if (e.keyCode === 27) { + this._finish(); + } + } +}); + +L.Map.addInitHook('addHandler', 'boxSelector', L.Map.BoxSelectHandle); \ No newline at end of file diff --git a/src/edit/DistortableImage.Edit.js b/src/edit/DistortableImage.Edit.js index 4f06a4785..2ce550929 100644 --- a/src/edit/DistortableImage.Edit.js +++ b/src/edit/DistortableImage.Edit.js @@ -5,19 +5,19 @@ L.DistortableImage.Edit = L.Handler.extend({ opacity: 0.7, outline: '1px solid red', keymap: { + 8: "_removeOverlay", // backspace windows / delete mac + 46: "_removeOverlay", // delete windows / delete + fn mac + 20: '_toggleRotate', // CAPS 68: '_toggleRotateDistort', // d 69: '_toggleIsolate', // e 73: '_toggleIsolate', // i + 74: '_sendUp', // j + 75: '_sendDown', // k 76: '_toggleLock', // l 79: '_toggleOutline', // o 82: '_toggleRotateDistort', // r - 74: '_sendUp', // j - 75: '_sendDown', // k - 46: "_removeOverlay", // delete windows / delete + fn mac - 8: "_removeOverlay", // backspace windows / delete mac 83: '_toggleScale', // s 84: '_toggleTransparency', // t - 20: '_toggleRotate' // CAPS } }, From 624484b3e1aa49a6e78efc1304e70a7d06965b22 Mon Sep 17 00:00:00 2001 From: sashadev-sky Date: Tue, 26 Feb 2019 06:31:55 -0500 Subject: [PATCH 03/63] clean up code --- dist/leaflet.distortableimage.js | 4 ++-- src/edit/BoxSelectHandle.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index cf6842740..86a60acfb 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -1424,10 +1424,10 @@ L.Map.BoxSelectHandle = L.Map.BoxZoom.extend({ let contents = $(this._pane).children(); let images = contents.filter('img'); - window.images = images; + // window.images = images; this._finish(); - console.log(images); + return images; }, diff --git a/src/edit/BoxSelectHandle.js b/src/edit/BoxSelectHandle.js index dcd15d8c2..73633510f 100644 --- a/src/edit/BoxSelectHandle.js +++ b/src/edit/BoxSelectHandle.js @@ -65,10 +65,10 @@ L.Map.BoxSelectHandle = L.Map.BoxZoom.extend({ let contents = $(this._pane).children(); let images = contents.filter('img'); - window.images = images; + // window.images = images; this._finish(); - console.log(images); + return images; }, From 519ea8f2a48281ed604f3dac1a7887033942eed2 Mon Sep 17 00:00:00 2001 From: sashadev-sky Date: Sat, 9 Mar 2019 00:59:20 -0500 Subject: [PATCH 04/63] fix removeChild error --- dist/leaflet.distortableimage.js | 41 +++++++++++++++++++++++----- dist/leaflet.distortableimage.js.map | 2 +- src/edit/BoxSelectHandle.js | 38 ++++++++++++++++++++++---- 3 files changed, 67 insertions(+), 14 deletions(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index 86a60acfb..fdf6c9cdb 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -1361,21 +1361,37 @@ L.Map.mergeOptions({ boxSelector: true, boxZoom: false }); L.Map.BoxSelectHandle = L.Map.BoxZoom.extend({ + initialize: function (map) { + this._map = map; + this._container = map._container; + this._pane = map._panes.overlayPane; + // this._resetStateTimeout = 0; + // map.on('unload', this._destroy, this); + }, + addHooks: function () { L.DomEvent.on(this._container, 'mousedown', this._onMouseDown, this); }, removeHooks: function () { - L.DomEvent.off(this._container, 'mousedown', this._onMouseDown); + L.DomEvent.off(this._container, 'mousedown', this._onMouseDown, this); }, + // _destroy: function () { + // L.DomUtil.remove(this._pane); + // delete this._pane; + // }, + _onMouseDown: function (e) { if (!e.shiftKey || ((e.which !== 1) && (e.button !== 1))) { return false; } L.DomUtil.disableTextSelection(); + L.DomUtil.disableImageDrag(); this._startLayerPoint = this._map.mouseEventToLayerPoint(e); + // this._startLayerPoint = this._map.mouseEventToLayerPoint(e); + this._box = L.DomUtil.create('div', 'leaflet-zoom-box', this._pane); L.DomUtil.setPosition(this._box, this._startLayerPoint); @@ -1408,15 +1424,22 @@ L.Map.BoxSelectHandle = L.Map.BoxZoom.extend({ }, _onMouseUp: function (e) { + if (!$(this._pane).children('.leaflet-zoom-box').length) { return false; } // window.e = e; var map = this._map, layerPoint = map.mouseEventToLayerPoint(e); if (this._startLayerPoint.equals(layerPoint)) { return; } - // var bounds = new L.LatLngBounds( - // map.layerPointToLatLng(this._startLayerPoint), - // map.layerPointToLatLng(layerPoint)); + var bounds = new L.LatLngBounds( + map.layerPointToLatLng(this._startLayerPoint), + map.layerPointToLatLng(layerPoint)); + + window.bounds = bounds; + window.box = this._box; + window.pane = this._pane; + window.map = map; + window.container = this._container; map.fire('boxzoomend', { // boxBounds: bounds @@ -1427,15 +1450,18 @@ L.Map.BoxSelectHandle = L.Map.BoxZoom.extend({ // window.images = images; this._finish(); - + console.log(images); return images; }, _finish: function () { - this._pane.removeChild(this._box); + // if (!this._box) { return false; } + // this._pane.removeChild(this._box); + $(this._box).remove(); this._container.style.cursor = ''; L.DomUtil.enableTextSelection(); + L.DomUtil.enableImageDrag(); L.DomEvent .off(document, 'mousemove', this._onMouseMove) @@ -1452,4 +1478,5 @@ L.Map.BoxSelectHandle = L.Map.BoxZoom.extend({ } }); -L.Map.addInitHook('addHandler', 'boxSelector', L.Map.BoxSelectHandle); \ No newline at end of file +L.Map.addInitHook('addHandler', 'boxSelector', L.Map.BoxSelectHandle); +//# sourceMappingURL=leaflet.distortableimage.js.map \ No newline at end of file diff --git a/dist/leaflet.distortableimage.js.map b/dist/leaflet.distortableimage.js.map index 173f9193d..e54b6d1fe 100644 --- a/dist/leaflet.distortableimage.js.map +++ b/dist/leaflet.distortableimage.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/util/DomUtil.js","../src/util/Map._newLayerPointToLatLng.js","../src/util/MatrixUtil.js","../src/edit/EditHandle.js","../src/edit/LockHandle.js","../src/edit/DistortHandle.js","../src/edit/RotateAndScaleHandle.js","../src/edit/RotateHandle.js","../src/edit/ScaleHandle.js","../src/DistortableImageOverlay.js","../src/edit/DistortableImage.EditToolbar.js","../src/edit/DistortableImage.Edit.js","../src/edit/BoxSelectHandle.js"],"names":[],"mappings":"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","file":"leaflet.distortableimage.js","sourcesContent":["L.DomUtil = L.extend(L.DomUtil, {\n\tgetMatrixString: function(m) {\n\t\tvar is3d = L.Browser.webkit3d || L.Browser.gecko3d || L.Browser.ie3d,\n\n\t\t\t/* \n\t\t * Since matrix3d takes a 4*4 matrix, we add in an empty row and column, which act as the identity on the z-axis.\n\t\t * See:\n\t\t * http://franklinta.com/2014/09/08/computing-css-matrix3d-transforms/\n\t\t * https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function#M.C3.B6bius'_homogeneous_coordinates_in_projective_geometry\n\t\t */\n\t\t\tmatrix = [\n\t\t\t\tm[0], m[3], 0, m[6],\n\t\t\t\tm[1], m[4], 0, m[7],\n\t\t\t\t 0, 0, 1, 0,\n\t\t\t\tm[2], m[5], 0, m[8]\n\t\t\t],\n\n\t\t\tstr = is3d ? 'matrix3d(' + matrix.join(',') + ')' : '';\n\n\t\tif (!is3d) {\n\t\t\tconsole.log('Your browser must support 3D CSS transforms in order to use DistortableImageOverlay.');\n\t\t}\n\n\t\treturn str;\n\t},\n\n\tgetRotateString: function(angle, units) {\n\t\tvar is3d = L.Browser.webkit3d || L.Browser.gecko3d || L.Browser.ie3d,\n\t\t\topen = 'rotate' + (is3d ? '3d' : '') + '(',\n\t\t\trotateString = (is3d ? '0, 0, 1, ' : '') + angle + units;\n\t\t\t\n\t\treturn open + rotateString + ')';\n\t}\n});\n","L.Map.include({\n\t_newLayerPointToLatLng: function(point, newZoom, newCenter) {\n\t\tvar topLeft = L.Map.prototype._getNewTopLeftPoint.call(this, newCenter, newZoom)\n\t\t\t\t.add(L.Map.prototype._getMapPanePos.call(this));\n\t\treturn this.unproject(point.add(topLeft), newZoom);\n\t}\n});","L.MatrixUtil = {\n\n\t// Compute the adjugate of m\n\tadj: function(m) { \n\t\treturn [\n\t\t\tm[4]*m[8]-m[5]*m[7], m[2]*m[7]-m[1]*m[8], m[1]*m[5]-m[2]*m[4],\n\t\t\tm[5]*m[6]-m[3]*m[8], m[0]*m[8]-m[2]*m[6], m[2]*m[3]-m[0]*m[5],\n\t\t\tm[3]*m[7]-m[4]*m[6], m[1]*m[6]-m[0]*m[7], m[0]*m[4]-m[1]*m[3]\n\t\t];\n\t},\n\n\t// multiply two 3*3 matrices\n\tmultmm: function(a, b) { \n\t\tvar c = [],\n\t\t\ti;\n\n\t\tfor (i = 0; i < 3; i++) {\n\t\t\tfor (var j = 0; j < 3; j++) {\n\t\t\t\tvar cij = 0;\n\t\t\t\tfor (var k = 0; k < 3; k++) {\n\t\t\t\t\tcij += a[3*i + k]*b[3*k + j];\n\t\t\t\t}\n\t\t\t\tc[3*i + j] = cij;\n\t\t\t}\n\t\t}\n\t\treturn c;\n\t},\n\n\t// multiply a 3*3 matrix and a 3-vector\n\tmultmv: function(m, v) { \n\t\treturn [\n\t\t\tm[0]*v[0] + m[1]*v[1] + m[2]*v[2],\n\t\t\tm[3]*v[0] + m[4]*v[1] + m[5]*v[2],\n\t\t\tm[6]*v[0] + m[7]*v[1] + m[8]*v[2]\n\t\t];\n\t},\n\n\t// multiply a scalar and a 3*3 matrix\n\tmultsm: function(s, m) {\n\t\tvar matrix = [];\n\n\t\tfor (var i = 0, l = m.length; i < l; i++) {\n\t\t\tmatrix.push(s*m[i]);\n\t\t}\n\n\t\treturn matrix;\n\t},\n\n\tbasisToPoints: function(x1, y1, x2, y2, x3, y3, x4, y4) {\n\t\tvar m = [\n\t\t\t\tx1, x2, x3,\n\t\t\t\ty1, y2, y3,\n\t\t\t\t1, 1, 1\n\t\t\t],\n\t\t\tv = L.MatrixUtil.multmv(L.MatrixUtil.adj(m), [x4, y4, 1]);\n\n\t\treturn L.MatrixUtil.multmm(m, [\n\t\t\tv[0], 0, 0,\n\t\t\t0, v[1], 0,\n\t\t\t0, 0, v[2]\n\t\t]);\n\t},\n\n\n\tproject: function(m, x, y) {\n\t\tvar v = L.MatrixUtil.multmv(m, [x, y, 1]);\n\t\treturn [v[0]/v[2], v[1]/v[2]];\n\t},\n\n\tgeneral2DProjection: function(\n\tx1s, y1s, x1d, y1d,\n\tx2s, y2s, x2d, y2d,\n\tx3s, y3s, x3d, y3d,\n\tx4s, y4s, x4d, y4d\n\t) {\n\t\tvar s = L.MatrixUtil.basisToPoints(x1s, y1s, x2s, y2s, x3s, y3s, x4s, y4s),\n\t\t\td = L.MatrixUtil.basisToPoints(x1d, y1d, x2d, y2d, x3d, y3d, x4d, y4d),\n\t\t\tm = L.MatrixUtil.multmm(d, L.MatrixUtil.adj(s));\n\n\t\t/* \n\t\t *\tNormalize to the unique matrix with m[8] == 1. \n\t\t * \tSee: http://franklinta.com/2014/09/08/computing-css-matrix3d-transforms/\n\t\t */\n\t\treturn L.MatrixUtil.multsm(1/m[8], m);\n\t}\n};","L.EditHandle = L.Marker.extend({\n\tinitialize: function(overlay, corner, options) {\n\t\tvar markerOptions,\n\t\t\tlatlng = overlay._corners[corner];\n\n\t\tL.setOptions(this, options);\n\n\t\tthis._handled = overlay;\n\t\tthis._corner = corner;\n\n\t\tmarkerOptions = {\n\t\t\tdraggable: true,\n\t\t\tzIndexOffset: 10\n\t\t};\n\n\t\tif (options && options.hasOwnProperty('draggable')) {\n\t\t\tmarkerOptions.draggable = options.draggable;\n\t\t}\n\n\t\tL.Marker.prototype.initialize.call(this, latlng, markerOptions);\n\t},\n\n\tonAdd: function(map) {\n\t\tL.Marker.prototype.onAdd.call(this, map);\n\t\tthis._bindListeners();\n\n\t\tthis.updateHandle();\n\t},\n\n\tonRemove: function(map) {\n\t\tthis._unbindListeners();\n\t\tL.Marker.prototype.onRemove.call(this, map);\n\t},\n\n\t_onHandleDragStart: function() {\n\t\tthis._handled.fire('editstart');\n\t},\n\n\t_onHandleDragEnd: function() {\n\t\tthis._fireEdit();\n\t},\n\n\t_fireEdit: function() {\n\t\tthis._handled.edited = true;\n\t\tthis._handled.fire('edit');\n\t},\n\n\t_bindListeners: function() {\n\t\tthis.on({\n\t\t\t'dragstart': this._onHandleDragStart,\n\t\t\t'drag': this._onHandleDrag,\n\t\t\t'dragend': this._onHandleDragEnd\n\t\t}, this);\n\n\t\tthis._handled._map.on('zoomend', this.updateHandle, this);\n\n\t\tthis._handled.on('update', this.updateHandle, this);\n\t},\n\n\t_unbindListeners: function() {\n\t\tthis.off({\n\t\t\t'dragstart': this._onHandleDragStart,\n\t\t\t'drag': this._onHandleDrag,\n\t\t\t'dragend': this._onHandleDragEnd\n\t\t}, this);\n\n\t\tthis._handled._map.off('zoomend', this.updateHandle, this);\n\t\tthis._handled.off('update', this.updateHandle, this);\n\t}\n});\n","L.LockHandle = L.EditHandle.extend({\n\toptions: {\n\t\tTYPE: 'lock',\n\t\ticon: new L.Icon({ \n\t\t\ticonUrl: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAD8SURBVO3BPU7CYAAA0AdfjIcQlRCQBG7C3gk2uIPG2RC3Dk16Gz0FTO1WZs/gwGCMP/2+xsSl7+n1er1Iz9LtRQjaPeMeO+TinLDCJV78YqjdA04YodKuxhUaPGoRxMmxwRQZSt87Yo4KExGCeAUyLLFB4bMacxywEClIU2KDKXbInTUYo8JCgoFuGoxQO5uiwY1EA91VmDqrcKeDoX8WdNNgjApvmGGLXKIgXY0xGkxQYItrrFFIEKQ5Yo4KEx9yrDFDhlKkIF6NOQ5Y+KpAhiXWKEQI4pxwiwoLPyuxwQw75FoE7fZYocFEuwI7jHCBV39gL92TXq/Xi/AOcmczZmaIMScAAAAASUVORK5CYII=',\n\t\t\ticonSize: [32, 32],\n\t\t\ticonAnchor: [16, 16]}\n\t\t)\n\t},\n\n\t/* cannot be dragged */\n\t_onHandleDrag: function() {\n\t},\n\n\tupdateHandle: function() {\n\t\tthis.setLatLng(this._handled._corners[this._corner]);\n\t}\n\n});\n","L.DistortHandle = L.EditHandle.extend({\n\toptions: {\n\t\tTYPE: 'distort',\n\t\ticon: new L.Icon({\n\t\t\ticonUrl: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAChSURBVO3BIU4DURgGwNkvL2B6AkQTLBqP4QCoSm7DDXoBLBZHDbfgICAIZjEV3YTn9uVHdMZZtcnCfI13bIzxg0emg6Nm6QVbYz3jylEsXRrvwommb49X67jFkz80fR9Mb1YxTzqiWBSLYlEsikWxKBbFolgUi2JRLIpFsSgWxaJY03fHHOu40dH07bAzWCx9Ge/TiWbpHgdsjPGNB2f/yS+7xRCyiiZPJQAAAABJRU5ErkJggg==',\n\t\t\ticonSize: [32, 32],\n\t\t\ticonAnchor: [16, 16]}\n\t\t)\n\t},\n\n\tupdateHandle: function() {\n\t\tthis.setLatLng(this._handled._corners[this._corner]);\n\t},\n\n\t_onHandleDrag: function() {\n\t\tthis._handled._updateCorner(this._corner, this.getLatLng());\n\n\t\tthis._handled.fire('update');\n\t}\n});\n","L.RotateAndScaleHandle = L.EditHandle.extend({\n\toptions: {\n\t\tTYPE: 'rotate',\n\t\ticon: new L.Icon({\n\t\t\ticonUrl: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAHiSURBVMXBa3HbShgA0PMp/1sCCo8oCEpgTaCXgIXAJiDzyCJoAUTm4UVQAns1Y8+snWnTvJyeE16hkjDgDrfoNTMKcpC9UPiLSo8JyetkjEHxjPCMyoS199kFoz8Iv1HpMaN3qWDCHoegOKkkRwnJpRmroHgiPFEZ8IBekzEGxQtUEhKSS/fB7Ew4U+lxcGkVZG9QWWPSFAxBcdK59KApuA+yNwp2uEdx1GN25sZJZULSfAtm77SlbNjju6MvG75u+WHRWVR6rDVjMPsgwYyVZl3pLTpHkyYHOx8syMiayaJzlDTZ9YyaZNFVkiYH2ZUEBcVJJXVImuz6Js3Qofe59pq7DoOTILu+g+a288mCouk7/1iH4qTS+2QdDppbV1ZJmrnDXnPnc5UOs2Z0fUmTuyBr+krvSioJyUmQO0dZM7mepMkWnaNRkyrJB6uskTSjxY3Fll8bvmJwlDb83FJ8gMqAB80uyBY3Trb82PAfvjj6vuHnluIdKgMeNXOwctK5NKBoHitrb1RJeHRp5Ux4ojLg0aWMHGQvUOkxIWkKVsHsTPiNSo8HDC5lZIsgO6n0uMUdRvQuFQxB8UR4RmXC2vvsgtEfhL+o9JiQvE7GGBTPCK9QSUjoMWgKDthjDrIX+h/k0I7gth6N5gAAAABJRU5ErkJggg==',\n\t\t\ticonSize: [32, 32],\n\t\t\ticonAnchor: [16, 16]}\n\t\t)\n\t},\n\n\t_onHandleDrag: function() {\n\t\tvar overlay = this._handled,\n\t\t\tformerLatLng = this._handled._corners[this._corner],\n\t\t\tnewLatLng = this.getLatLng(),\n\n\t\t\tangle = this._calculateAngle(formerLatLng, newLatLng),\n\t\t\tscale = this._calculateScalingFactor(formerLatLng, newLatLng);\n\n\t\toverlay.editing._rotateBy(angle);\n\t\toverlay.editing._scaleBy(scale);\n\n\t\t/* \n\t\t checks whether the \"edgeMinWidth\" property is set and tracks the minimum edge length;\n\t\t this enables preventing scaling to zero, but we might also add an overall scale limit\n\t\t*/\t\t\n\t\tif (this._handled.options.hasOwnProperty('edgeMinWidth')){\n\t\t\tvar edgeMinWidth = this._handled.options.edgeMinWidth,\n\t\t\t w = L.latLng(overlay._corners[0]).distanceTo(overlay._corners[1]),\n\t\t\t h = L.latLng(overlay._corners[1]).distanceTo(overlay._corners[2]);\n\t\t\tif ((w > edgeMinWidth && h > edgeMinWidth) || scale > 1) {\n\t\t\t\toverlay.editing._scaleBy(scale);\n\t\t\t}\n\t\t} else {\n\t\t\toverlay.editing._scaleBy(scale);\n\t\t}\n\n\t\toverlay.fire('update');\n\t},\n\n\tupdateHandle: function() {\n\t\tthis.setLatLng(this._handled._corners[this._corner]);\n\t},\n\n\t/* Takes two latlngs and calculates the angle between them. */\n\t_calculateAngle: function(latlngA, latlngB) {\n\t\tvar map = this._handled._map,\n\n\t\t\tcenterPoint = map.latLngToLayerPoint(this._handled.getCenter()),\n\t\t\tformerPoint = map.latLngToLayerPoint(latlngA),\n\t\t\tnewPoint = map.latLngToLayerPoint(latlngB),\n\n\t\t\tinitialAngle = Math.atan2(centerPoint.y - formerPoint.y, centerPoint.x - formerPoint.x),\n\t\t\tnewAngle = Math.atan2(centerPoint.y - newPoint.y, centerPoint.x - newPoint.x);\n\n\t\treturn newAngle - initialAngle;\n\t},\n\n\t/* Takes two latlngs and calculates the scaling difference. */\n\t_calculateScalingFactor: function(latlngA, latlngB) {\n\t\tvar map = this._handled._map,\n\n\t\t\tcenterPoint = map.latLngToLayerPoint(this._handled.getCenter()),\n\t\t\tformerPoint = map.latLngToLayerPoint(latlngA),\n\t\t\tnewPoint = map.latLngToLayerPoint(latlngB),\n\n\t\t\tformerRadiusSquared = this._d2(centerPoint, formerPoint),\n\t\t\tnewRadiusSquared = this._d2(centerPoint, newPoint);\n\n\t\treturn Math.sqrt(newRadiusSquared / formerRadiusSquared);\n\t},\n\n\t/* Distance between two points in cartesian space, squared (distance formula). */\n\t_d2: function(a, b) {\n\t\tvar dx = a.x - b.x,\n\t\t\tdy = a.y - b.y;\n\n\t\treturn Math.pow(dx, 2) + Math.pow(dy, 2);\n\t}\n});\n","L.RotateHandle = L.EditHandle.extend({\n\toptions: {\n\t\tTYPE: 'rotate',\n\t\ticon: new L.Icon({\n\t\t\ticonUrl: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAHiSURBVMXBa3HbShgA0PMp/1sCCo8oCEpgTaCXgIXAJiDzyCJoAUTm4UVQAns1Y8+snWnTvJyeE16hkjDgDrfoNTMKcpC9UPiLSo8JyetkjEHxjPCMyoS199kFoz8Iv1HpMaN3qWDCHoegOKkkRwnJpRmroHgiPFEZ8IBekzEGxQtUEhKSS/fB7Ew4U+lxcGkVZG9QWWPSFAxBcdK59KApuA+yNwp2uEdx1GN25sZJZULSfAtm77SlbNjju6MvG75u+WHRWVR6rDVjMPsgwYyVZl3pLTpHkyYHOx8syMiayaJzlDTZ9YyaZNFVkiYH2ZUEBcVJJXVImuz6Js3Qofe59pq7DoOTILu+g+a288mCouk7/1iH4qTS+2QdDppbV1ZJmrnDXnPnc5UOs2Z0fUmTuyBr+krvSioJyUmQO0dZM7mepMkWnaNRkyrJB6uskTSjxY3Fll8bvmJwlDb83FJ8gMqAB80uyBY3Trb82PAfvjj6vuHnluIdKgMeNXOwctK5NKBoHitrb1RJeHRp5Ux4ojLg0aWMHGQvUOkxIWkKVsHsTPiNSo8HDC5lZIsgO6n0uMUdRvQuFQxB8UR4RmXC2vvsgtEfhL+o9JiQvE7GGBTPCK9QSUjoMWgKDthjDrIX+h/k0I7gth6N5gAAAABJRU5ErkJggg==',\n\t\t\ticonSize: [32, 32],\n\t\t\ticonAnchor: [16, 16]}\n\t\t)\n\t},\n\n\t_onHandleDrag: function() {\n\t\tvar overlay = this._handled,\n\t\t\tformerLatLng = this._handled._corners[this._corner],\n\t\t\tnewLatLng = this.getLatLng(),\n\n\t\t\tangle = this._calculateAngle(formerLatLng, newLatLng);\n\n\t\toverlay.editing._rotateBy(angle);\n\n\t\toverlay.fire('update');\n\t},\n\n\tupdateHandle: function() {\n\t\tthis.setLatLng(this._handled._corners[this._corner]);\n\t},\n\n\t/* Takes two latlngs and calculates the angle between them. */\n\t_calculateAngle: function(latlngA, latlngB) {\n\t\tvar map = this._handled._map,\n\n\t\t\tcenterPoint = map.latLngToLayerPoint(this._handled.getCenter()),\n\t\t\tformerPoint = map.latLngToLayerPoint(latlngA),\n\t\t\tnewPoint = map.latLngToLayerPoint(latlngB),\n\n\t\t\tinitialAngle = Math.atan2(centerPoint.y - formerPoint.y, centerPoint.x - formerPoint.x),\n\t\t\tnewAngle = Math.atan2(centerPoint.y - newPoint.y, centerPoint.x - newPoint.x);\n\n\t\treturn newAngle - initialAngle;\n\t},\n\n\t/* Takes two latlngs and calculates the scaling difference. */\n\t_calculateScalingFactor: function(latlngA, latlngB) {\n\t\tvar map = this._handled._map,\n\n\t\t\tcenterPoint = map.latLngToLayerPoint(this._handled.getCenter()),\n\t\t\tformerPoint = map.latLngToLayerPoint(latlngA),\n\t\t\tnewPoint = map.latLngToLayerPoint(latlngB),\n\n\t\t\tformerRadiusSquared = this._d2(centerPoint, formerPoint),\n\t\t\tnewRadiusSquared = this._d2(centerPoint, newPoint);\n\n\t\treturn Math.sqrt(newRadiusSquared / formerRadiusSquared);\n\t},\n\n\t/* Distance between two points in cartesian space, squared (distance formula). */\n\t_d2: function(a, b) {\n\t\tvar dx = a.x - b.x,\n\t\t\tdy = a.y - b.y;\n\n\t\treturn Math.pow(dx, 2) + Math.pow(dy, 2);\n\t}\n});\n","L.ScaleHandle = L.EditHandle.extend({\n\toptions: {\n\t\tTYPE: 'rotate',\n\t\ticon: new L.Icon({\n\t\t\ticonUrl:'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIHdpZHRoPSI0NTkiIGhlaWdodD0iNDY0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCA1MTIgNTEyIiB4bWw6c3BhY2U9InByZXNlcnZlIiBzdHlsZT0iIj48cmVjdCBpZD0iYmFja2dyb3VuZHJlY3QiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHg9IjAiIHk9IjAiIGZpbGw9Im5vbmUiIHN0cm9rZT0ibm9uZSIgY2xhc3M9IiIgc3R5bGU9IiIvPjxnIGNsYXNzPSJjdXJyZW50TGF5ZXIiIHN0eWxlPSIiPjx0aXRsZT5MYXllciAxPC90aXRsZT48cGF0aCBkPSJNNDU5LjA0OTE1OTUzMDQ3MTM0LDg2LjkyNjIzNDUxMjU1MDAyIFYwIGgtODUuNzE0NTczMzU2MzEyMDkgdjI3LjA0MzcxNzQwMzkwNDQ1MiBIODUuNzE0NTczMzU2MzEyMDMgVjAgSDAgdjg2LjkyNjIzNDUxMjU1MDAyIGgyNS43MTQzNzIwMDY4OTM2MjYgdjI4OS43NTQxMTUwNDE4MzM0IEgwIHY4Ni45MjYyMzQ1MTI1NTAwMiBoODUuNzE0NTczMzU2MzEyMDkgdi0yNy4wNDM3MTc0MDM5MDQ0NTIgaDI4NS43MTUyNDQ1MjEwNDAzIHYyNy4wNDM3MTc0MDM5MDQ0NTIgaDg1LjcxNDU3MzM1NjMxMjA5IHYtODYuOTI2MjM0NTEyNTUwMDIgaC0yMy44MDk2MDM3MTAwODY2OSBWODYuOTI2MjM0NTEyNTUwMDIgSDQ1OS4wNDkxNTk1MzA0NzEzNCB6TTM4NC43NjMxOTU5NTUwMDA5LDEyLjU1NjAxMTY1MTgxMjc4MSBoNjEuOTA0OTY5NjQ2MjI1Mzk2IHY2Mi43ODAwNTgyNTkwNjM5MSBoLTYxLjkwNDk2OTY0NjIyNTM5NiBWMTIuNTU2MDExNjUxODEyNzgxIHpNMTIuMzgwOTkzOTI5MjQ1MDUsMTIuNTU2MDExNjUxODEyNzgxIGg2MS45MDQ5Njk2NDYyMjUzOTYgdjYyLjc4MDA1ODI1OTA2MzkxIEgxMi4zODA5OTM5MjkyNDUwNSBWMTIuNTU2MDExNjUxODEyNzgxIHpNNzQuMjg1OTYzNTc1NDcwNTMsNDUxLjA1MDU3MjQxNTEyMDY2IEgxMi4zODA5OTM5MjkyNDUwNSB2LTYyLjc4MDA1ODI1OTA2MzkxIGg2MS45MDQ5Njk2NDYyMjUzOTYgVjQ1MS4wNTA1NzI0MTUxMjA2NiB6TTQ0NS43MTU3ODE0NTI4MjI3NCw0NTEuMDUwNTcyNDE1MTIwNjYgaC02Mi44NTczNTM3OTQ2Mjg4NjQgdi02Mi43ODAwNTgyNTkwNjM5MSBoNjIuODU3MzUzNzk0NjI4ODY0IFY0NTEuMDUwNTcyNDE1MTIwNjYgek00MDcuNjIwNDE1NTE2Njg0MjYsMzc2LjY4MDM0OTU1NDM4MzQ0IGgtMzYuMTkwNTk3NjM5MzMxNzcgdjMyLjgzODc5OTcwNDc0MTEyIEg4NS43MTQ1NzMzNTYzMTIwMyB2LTMyLjgzODc5OTcwNDc0MTEyIEg0OS41MjM5NzU3MTY5ODAzMiBWODYuOTI2MjM0NTEyNTUwMDIgaDM2LjE5MDU5NzYzOTMzMTc3IFY1MC4yMjQwNDY2MDcyNTExMjUgaDI4Ny42MjAwMTI4MTc4NDcyIHYzNi43MDIxODc5MDUyOTg5IGgzNC4yODU4MjkzNDI1MjQ4MzUgVjM3Ni42ODAzNDk1NTQzODM0NCB6IiBpZD0ic3ZnXzIiIGNsYXNzPSIiIGZpbGw9IiMxYTFhZWIiIGZpbGwtb3BhY2l0eT0iMSIvPjwvZz48L3N2Zz4=',\n\t\t\ticonSize: [32, 32],\n\t\t\ticonAnchor: [16, 16]}\n\t\t)\n\t},\n\n\t_onHandleDrag: function() {\n\t\tvar overlay = this._handled,\n\t\t\tformerLatLng = this._handled._corners[this._corner],\n\t\t\tnewLatLng = this.getLatLng(),\n\n\t\t\tscale = this._calculateScalingFactor(formerLatLng, newLatLng);\n\n\t\toverlay.editing._scaleBy(scale);\n\n\t\toverlay.fire('update');\n\t},\n\n\tupdateHandle: function() {\n\t\tthis.setLatLng(this._handled._corners[this._corner]);\n\t},\n\n\t/* Takes two latlngs and calculates the angle between them. */\n\t_calculateAngle: function(latlngA, latlngB) {\n\t\tvar map = this._handled._map,\n\n\t\t\tcenterPoint = map.latLngToLayerPoint(this._handled.getCenter()),\n\t\t\tformerPoint = map.latLngToLayerPoint(latlngA),\n\t\t\tnewPoint = map.latLngToLayerPoint(latlngB),\n\n\t\t\tinitialAngle = Math.atan2(centerPoint.y - formerPoint.y, centerPoint.x - formerPoint.x),\n\t\t\tnewAngle = Math.atan2(centerPoint.y - newPoint.y, centerPoint.x - newPoint.x);\n\n\t\treturn newAngle - initialAngle;\n\t},\n\n\t/* Takes two latlngs and calculates the scaling difference. */\n\t_calculateScalingFactor: function(latlngA, latlngB) {\n\t\tvar map = this._handled._map,\n\n\t\t\tcenterPoint = map.latLngToLayerPoint(this._handled.getCenter()),\n\t\t\tformerPoint = map.latLngToLayerPoint(latlngA),\n\t\t\tnewPoint = map.latLngToLayerPoint(latlngB),\n\n\t\t\tformerRadiusSquared = this._d2(centerPoint, formerPoint),\n\t\t\tnewRadiusSquared = this._d2(centerPoint, newPoint);\n\n\t\treturn Math.sqrt(newRadiusSquared / formerRadiusSquared);\n\t},\n\n\t/* Distance between two points in cartesian space, squared (distance formula). */\n\t_d2: function(a, b) {\n\t\tvar dx = a.x - b.x,\n\t\t\tdy = a.y - b.y;\n\n\t\treturn Math.pow(dx, 2) + Math.pow(dy, 2);\n\t}\n});\n","L.DistortableImageOverlay = L.ImageOverlay.extend({\n\tinclude: L.Mixin.Events,\n\n\toptions: {\n\t\talt: '',\n\t\theight: 200,\n\t\tcrossOrigin: true\n\t},\n\n\tinitialize: function(url, options) {\n\t\tthis._url = url;\n\t\tthis._rotation = this.options.rotation;\n\n\t\tL.setOptions(this, options);\n\t},\n\n\tonAdd: function(map) {\n\t\t/* Copied from L.ImageOverlay */\n\t\tthis._map = map;\n\n\t\tif (!this._image) { this._initImage(); }\n\t\tif (!this._events) { this._initEvents(); }\n\n\t\tmap._panes.overlayPane.appendChild(this._image);\n\n\t\tmap.on('viewreset', this._reset, this);\n\t\t/* End copied from L.ImageOverlay */\n\n\t\t/* Use provided corners if available */\n\t\tif (this.options.corners) { \n\t\t\tthis._corners = this.options.corners; \n\t\t\tif (map.options.zoomAnimation && L.Browser.any3d) {\n\t\t\t\tmap.on('zoomanim', this._animateZoom, this);\n\t\t\t}\n\n\t\t\t/* This reset happens before image load; it allows \n\t\t\t * us to place the image on the map earlier with \n\t\t\t * \"guessed\" dimensions. */\n\t\t\tthis._reset();\n\t\t}\n\n\t\t/* Have to wait for the image to load because \n\t\t * we need to access its width and height. */\n\t\tL.DomEvent.on(this._image, 'load', function() {\n\t\t\tthis._initImageDimensions();\n\t\t\tthis._reset();\n\t\t\t/* Initialize default corners if not already set */\n\t\t\tif (!this._corners) { \n\t\t\t\tif (map.options.zoomAnimation && L.Browser.any3d) {\n\t\t\t\t\tmap.on('zoomanim', this._animateZoom, this);\n\t\t\t\t}\n\t\t\t}\n\t\t}, this);\t\t\n\n\t\tthis.fire('add');\t\n\t},\n\n\tonRemove: function(map) {\n\t\tthis.fire('remove');\n\n\t\tL.ImageOverlay.prototype.onRemove.call(this, map);\n\t},\n\n\t_initImage: function () {\n\t\tL.ImageOverlay.prototype._initImage.call(this);\n\n\t\tL.extend(this._image, {\n\t\t\talt: this.options.alt\n\t\t});\n\t},\n\n\t_initImageDimensions: function() {\n\t\tvar map = this._map,\n\n\t\t\toriginalImageWidth = L.DomUtil.getStyle(this._image, 'width'),\n\t\t\toriginalImageHeight = L.DomUtil.getStyle(this._image, 'height'),\n\n\t\t\taspectRatio = parseInt(originalImageWidth) / parseInt(originalImageHeight),\n\n\t\t\timageHeight = this.options.height,\n\t\t\timageWidth = parseInt(aspectRatio*imageHeight),\n\n\t\t\tcenter = map.latLngToContainerPoint(map.getCenter()),\n\t\t\toffset = new L.Point(imageWidth, imageHeight).divideBy(2);\n\n\t\tif (this.options.corners) { this._corners = this.options.corners; }\n\t\telse {\n\t\t\tthis._corners = [\n\t\t\t\tmap.containerPointToLatLng(center.subtract(offset)),\n\t\t\t\tmap.containerPointToLatLng(center.add(new L.Point(offset.x, - offset.y))),\n\t\t\t\tmap.containerPointToLatLng(center.add(new L.Point(- offset.x, offset.y))),\n\t\t\t\tmap.containerPointToLatLng(center.add(offset))\n\t\t\t];\n\t\t}\n\t},\n\n \t_initEvents: function() {\n \t\tthis._events = [ 'click' ];\n\n \t\tfor (var i = 0, l = this._events.length; i < l; i++) {\n\t \t\tL.DomEvent.on(this._image, this._events[i], this._fireMouseEvent, this);\n \t\t}\n \t},\n\n \t/* See src/layer/vector/Path.SVG.js in the Leaflet source. */\n \t_fireMouseEvent: function(event) {\n \t\tif (!this.hasEventListeners(event.type)) { return; }\n\n\t\tvar map = this._map,\n\t\t\tcontainerPoint = map.mouseEventToContainerPoint(event),\n\t\t\tlayerPoint = map.containerPointToLayerPoint(containerPoint),\n\t\t\tlatlng = map.layerPointToLatLng(layerPoint);\n\n\t\tthis.fire(event.type, {\n\t\t\tlatlng: latlng,\n\t\t\tlayerPoint: layerPoint,\n\t\t\tcontainerPoint: containerPoint,\n\t\t\toriginalEvent: event\n\t\t});\n \t},\n\n\t_updateCorner: function(corner, latlng) {\n\t\tthis._corners[corner] = latlng;\n\t\tthis._reset();\n\t},\n\n\n\t/* Copied from Leaflet v0.7 https://github.com/Leaflet/Leaflet/blob/66282f14bcb180ec87d9818d9f3c9f75afd01b30/src/dom/DomUtil.js#L189-L199 */\n\t/* since L.DomUtil.getTranslateString() is deprecated in Leaflet v1.0 */\n\t_getTranslateString: function (point) {\n\t\t// on WebKit browsers (Chrome/Safari/iOS Safari/Android) using translate3d instead of translate\n\t\t// makes animation smoother as it ensures HW accel is used. Firefox 13 doesn't care\n\t\t// (same speed either way), Opera 12 doesn't support translate3d\n\n\t\tvar is3d = L.Browser.webkit3d,\n\t\t open = 'translate' + (is3d ? '3d' : '') + '(',\n\t\t close = (is3d ? ',0' : '') + ')';\n\n\t\treturn open + point.x + 'px,' + point.y + 'px' + close;\n\t},\n\n\t_reset: function() {\n\t\tvar map = this._map,\n\t\t\timage = this._image,\n\t\t\tlatLngToLayerPoint = L.bind(map.latLngToLayerPoint, map),\n\n\t\t\ttransformMatrix = this._calculateProjectiveTransform(latLngToLayerPoint),\n\t\t\ttopLeft = latLngToLayerPoint(this._corners[0]),\n\n\t\t\twarp = L.DomUtil.getMatrixString(transformMatrix),\n\t\t\ttranslation = this._getTranslateString(topLeft);\n\n\t\t/* See L.DomUtil.setPosition. Mainly for the purposes of L.Draggable. */\n\t\timage._leaflet_pos = topLeft;\n\n\t\timage.style[L.DomUtil.TRANSFORM] = [translation, warp].join(' ');\n\n\t\t/* Set origin to the upper-left corner rather than the center of the image, which is the default. */\n\t\timage.style[L.DomUtil.TRANSFORM + '-origin'] = \"0 0 0\";\n\t},\n\n\t/*\n\t * Calculates the transform string that will be correct *at the end* of zooming.\n\t * Leaflet then generates a CSS3 animation between the current transform and \n\t *\t\t future transform which makes the transition appear smooth.\n\t */\n\t_animateZoom: function(event) {\n\t\tvar map = this._map,\n\t\t\timage = this._image,\n\t\t\tlatLngToNewLayerPoint = function(latlng) {\n\t\t\t\treturn map._latLngToNewLayerPoint(latlng, event.zoom, event.center);\n\t\t\t},\n\t\n\t\t\ttransformMatrix = this._calculateProjectiveTransform(latLngToNewLayerPoint),\n\t\t\ttopLeft = latLngToNewLayerPoint(this._corners[0]),\n\t\n\t\t\twarp = L.DomUtil.getMatrixString(transformMatrix),\n\t\t\ttranslation = this._getTranslateString(topLeft);\n\t\n\t\t/* See L.DomUtil.setPosition. Mainly for the purposes of L.Draggable. */\n\t\timage._leaflet_pos = topLeft;\n\t\n\t\tif (!L.Browser.gecko) {\n\t\t\timage.style[L.DomUtil.TRANSFORM] = [translation, warp].join(' ');\n\t\t}\n\t},\n\n\tgetCorners: function() {\n\t\treturn this._corners;\n\t},\n\n\t/*\n\t * Calculates the centroid of the image.\n\t *\t\t See http://stackoverflow.com/questions/6149175/logical-question-given-corners-find-center-of-quadrilateral\n\t */\n\tgetCenter: function(ll2c, c2ll) {\n\t\tvar map = this._map,\n\t\t\tlatLngToCartesian = ll2c ? ll2c : map.latLngToLayerPoint,\n\t\t\tcartesianToLatLng = c2ll ? c2ll: map.layerPointToLatLng,\n\t\t\tnw = latLngToCartesian.call(map, this._corners[0]),\n\t\t\tne = latLngToCartesian.call(map, this._corners[1]),\n\t\t\tse = latLngToCartesian.call(map, this._corners[2]),\n\t\t\tsw = latLngToCartesian.call(map, this._corners[3]),\n\n\t\t\tnmid = nw.add(ne.subtract(nw).divideBy(2)),\n\t\t\tsmid = sw.add(se.subtract(sw).divideBy(2));\n\n\t\treturn cartesianToLatLng.call(map, nmid.add(smid.subtract(nmid).divideBy(2)));\n\t},\n\n\t_calculateProjectiveTransform: function(latLngToCartesian) {\n\t\t/* Setting reasonable but made-up image defaults \n\t\t * allow us to place images on the map before \n\t\t * they've finished downloading. */\n\t\tvar offset = latLngToCartesian(this._corners[0]),\n\t\t\tw = this._image.offsetWidth || 500, \n\t\t\th = this._image.offsetHeight || 375,\n\t\t\tc = [],\n\t\t\tj;\n\t\t/* Convert corners to container points (i.e. cartesian coordinates). */\n\t\tfor (j = 0; j < this._corners.length; j++) {\n\t\t\tc.push(latLngToCartesian(this._corners[j])._subtract(offset));\n\t\t}\n\t\t\n\t\t/*\n\t\t * This matrix describes the action of the CSS transform on each corner of the image.\n\t\t * It maps from the coordinate system centered at the upper left corner of the image\n\t\t *\t\t to the region bounded by the latlngs in this._corners.\n\t\t * For example:\n\t\t *\t\t 0, 0, c[0].x, c[0].y\n\t\t *\t\t says that the upper-left corner of the image maps to the first latlng in this._corners.\n\t\t */\n\t\treturn L.MatrixUtil.general2DProjection(\n\t\t\t0, 0, c[0].x, c[0].y,\n\t\t\tw, 0, c[1].x, c[1].y,\n\t\t\t0, h, c[2].x, c[2].y,\n\t\t\tw, h, c[3].x, c[3].y\n\t\t);\n\t}\n});\n","L.DistortableImage = L.DistortableImage || {};\n\nvar EditOverlayAction = LeafletToolbar.ToolbarAction.extend({\n\t\tinitialize: function(map, overlay, options) {\n\t\t\tthis._overlay = overlay;\n\t\t\tthis._map = map;\n\n\t\t\tLeafletToolbar.ToolbarAction.prototype.initialize.call(this, options);\n\t\t}\n\t}),\n\n\tToggleTransparency = EditOverlayAction.extend({\n\t\toptions: { toolbarIcon: { \n\t\t\thtml: '',\n\t\t\ttooltip: 'Toggle Image Transparency',\n\t\t\ttitle: 'Toggle Image Transparency'\t\n\t\t}},\n\n\t\taddHooks: function() {\n\t\t\tvar editing = this._overlay.editing;\n\n\t\t\tediting._toggleTransparency();\n\t\t\tthis.disable();\n\t\t}\n\t}),\n\n\tToggleOutline = EditOverlayAction.extend({\n\t\toptions: { toolbarIcon: { \n\t\t\thtml: '',\n\t\t\ttooltip: 'Toggle Image Outline',\n\t\t\ttitle: 'Toggle Image Outline'\n\t\t}},\n\n\t\taddHooks: function() {\n\t\t\tvar editing = this._overlay.editing;\n\n\t\t\tediting._toggleOutline();\n\t\t\tthis.disable();\n\t\t}\n\t}),\n\n\tRemoveOverlay = EditOverlayAction.extend({\n\t\toptions: { toolbarIcon: { \n\t\t\thtml: '',\n\t\t\ttooltip: 'Delete image',\n\t\t\ttitle: 'Delete image'\n\t\t}},\n\n\t\taddHooks: function() {\n\t\t\tvar map = this._map;\n\n\t\t\tmap.removeLayer(this._overlay);\n\t\t\tthis._overlay.fire('delete');\n\t\t\tthis.disable();\n\t\t}\n\t}),\n\n\tToggleEditable = EditOverlayAction.extend({\n\t\toptions: { toolbarIcon: {\n\t\t\thtml: '',\n\t\t\ttooltip: 'Lock / Unlock editing',\n\t\t\ttitle: 'Lock / Unlock editing'\t\t\t\n\t\t}},\n\n\t\taddHooks: function() {\n\t\t\tvar editing = this._overlay.editing;\n\n\t\t\tediting._toggleLock();\n\t\t\tthis.disable();\n\t\t}\n\t}),\n\n\tToggleRotateDistort = EditOverlayAction.extend({\n\t\tinitialize: function(map, overlay, options) {\n\t\t\tvar icon = overlay.editing._mode === 'rotate' ? 'image' : 'rotate-left';\n\n\t\t\toptions = options || {};\n\t\t\toptions.toolbarIcon = {\n\t\t\t\thtml: '',\n\t\t\t\ttooltip: 'Rotate',\n\t\t\t\ttitle: 'Rotate'\t\n\t\t\t};\n\n\t\t\tEditOverlayAction.prototype.initialize.call(this, map, overlay, options);\n\t\t},\n\n\t\taddHooks: function() {\n\t\t\tvar editing = this._overlay.editing;\n\n\t\t\tediting._toggleRotateDistort();\n\t\t\tthis.disable();\n\t\t}\n\t}),\n\n\n\tToggleExport = EditOverlayAction.extend({\n\t\toptions: {\n\t\t\ttoolbarIcon: {\n\t\t\t\thtml: '',\n\t\t\t\ttooltip: 'Export Image',\n\t\t\t\ttitle: 'Export Image'\n\t\t\t}\n\t\t},\n\t\t\n\t\taddHooks: function ()\n\t\t{\n\t\t\tvar editing = this._overlay.editing;\n\n\t\t\tediting._toggleExport();\n\t\t\tthis.disable(); \n\t\t}\n\t});\n\nL.DistortableImage.EditToolbar = LeafletToolbar.Popup.extend({\n\toptions: {\n\t\tactions: [\n\t\t\tToggleTransparency,\n\t\t\tRemoveOverlay,\n\t\t\tToggleOutline,\n\t\t\tToggleEditable,\n\t\t\tToggleRotateDistort,\n\t\t\tToggleExport\n\t\t]\n\t}\n});\n","L.DistortableImage = L.DistortableImage || {};\n\nL.DistortableImage.Edit = L.Handler.extend({\n\toptions: {\n\t\topacity: 0.7,\n\t\toutline: '1px solid red',\n\t\tkeymap: {\n\t\t\t68: '_toggleRotateDistort', // d\n\t\t\t69: '_toggleIsolate', // e\n\t\t\t73: '_toggleIsolate', // i\n\t\t\t76: '_toggleLock', // l\n\t\t\t79: '_toggleOutline', // o\n\t\t\t82: '_toggleRotateDistort', // r\n 84: '_toggleTransparency', // t\n 46: \"_removeOverlay\", // delete windows / delete + fn mac\n 8: \t\"_removeOverlay\" // backspace windows / delete mac\n\t\t}\n\t},\n\n\tinitialize: function(overlay) {\n\t\tthis._overlay = overlay;\n\n\t\t/* Interaction modes. */\n\t\tthis._mode = this._overlay.options.mode || 'distort';\n\t\tthis._transparent = false;\n\t\tthis._outlined = false;\n\t},\n\n\t/* Run on image seletion. */\n\taddHooks: function() {\n\t\tvar overlay = this._overlay,\n\t\t\tmap = overlay._map,\n\t\t\ti;\n\n\t\t\t/* bring the selected image into view */\n\t\t\toverlay.bringToFront();\n\n\t\tthis._lockHandles = new L.LayerGroup();\n\t\tfor (i = 0; i < 4; i++) {\n\t\t\tthis._lockHandles.addLayer(new L.LockHandle(overlay, i, { draggable: false }));\n\t\t}\n\n\t\tthis._distortHandles = new L.LayerGroup();\n\t\tfor (i = 0; i < 4; i++) {\n\t\t\tthis._distortHandles.addLayer(new L.DistortHandle(overlay, i));\n\t\t}\n\n\t\tthis._rotateHandles = new L.LayerGroup();\n\t\tfor (i = 0; i < 4; i++) {\n\t\t\tthis._rotateHandles.addLayer(new L.RotateHandle(overlay, i));\n\t\t}\n\n\t\tthis._handles = {\n\t\t\t'lock':\t\t this._lockHandles,\n\t\t\t'distort': this._distortHandles,\n\t\t\t'rotate':\tthis._rotateHandles\n\t\t};\n\n\t\tif (this._mode === 'lock') {\n\t\t\tmap.addLayer(this._lockHandles);\n\t\t} else {\n\t\t\tthis._mode = 'distort';\n\t\t\tmap.addLayer(this._distortHandles);\n\t\t\tthis._enableDragging();\n\t\t}\n\n\t\t//overlay.on('click', this._showToolbar, this);\n\t\tL.DomEvent.on(overlay._image, 'click', this._showToolbar, this);\n\n\t\t/* Enable hotkeys. */\n\t\tL.DomEvent.on(window, 'keydown', this._onKeyDown, this);\n\n\t\toverlay.fire('select');\n\n\t},\n\n\t/* Run on image deseletion. */\n\tremoveHooks: function() {\n\t\tvar overlay = this._overlay,\n\t\t\tmap = overlay._map;\n\n\t\t// L.DomEvent.off(window, 'keydown', this._onKeyDown, this);\n\n\t\tL.DomEvent.off(overlay._image, 'click', this._showToolbar, this);\n\n\t\t// First, check if dragging exists;\n\t\t// it may be off due to locking\n\t\tif (this.dragging) { this.dragging.disable(); }\n\t\tdelete this.dragging;\n\n\t\tmap.removeLayer(this._handles[this._mode]);\n\n \t\t/* Disable hotkeys. */\n\t\tL.DomEvent.off(window, 'keydown', this._onKeyDown, this);\n\n\t\toverlay.fire('deselect');\n },\n\n confirmDelete: function () {\n return window.confirm(\"Are you sure you want to delete?\");\n },\n\n\n\t_rotateBy: function(angle) {\n\t\tvar overlay = this._overlay,\n\t\t\tmap = overlay._map,\n\t\t\tcenter = map.latLngToLayerPoint(overlay.getCenter()),\n\t\t\ti, p, q;\n\n\t\tfor (i = 0; i < 4; i++) {\n\t\t\tp = map.latLngToLayerPoint(overlay._corners[i]).subtract(center);\n\t\t\tq = new L.Point(\n\t\t\t\tMath.cos(angle)*p.x - Math.sin(angle)*p.y,\n\t\t\t\tMath.sin(angle)*p.x + Math.cos(angle)*p.y\n\t\t\t);\n\t\t\toverlay._corners[i] = map.layerPointToLatLng(q.add(center));\n\t\t}\n\n\t\toverlay._reset();\n\t},\n\n\t_scaleBy: function(scale) {\n\t\tvar overlay = this._overlay,\n\t\t\tmap = overlay._map,\n\t\t\tcenter = map.latLngToLayerPoint(overlay.getCenter()),\n\t\t\ti, p;\n\n\t\tfor (i = 0; i < 4; i++) {\n\t\t\tp = map.latLngToLayerPoint(overlay._corners[i])\n\t\t\t\t.subtract(center)\n\t\t\t\t.multiplyBy(scale)\n\t\t\t\t.add(center);\n\t\t\toverlay._corners[i] = map.layerPointToLatLng(p);\n\t\t}\n\n\t\toverlay._reset();\n\t},\n\n\t_enableDragging: function() {\n\t\tvar overlay = this._overlay,\n\t\t\tmap = overlay._map;\n\n\t\tthis.dragging = new L.Draggable(overlay._image);\n\t\tthis.dragging.enable();\n\n\t\t/* Hide toolbars while dragging; click will re-show it */\n\t\tthis.dragging.on('dragstart', this._hideToolbar, this);\n\n\t\t/*\n\t\t * Adjust default behavior of L.Draggable.\n\t\t * By default, L.Draggable overwrites the CSS3 distort transform\n\t\t * that we want when it calls L.DomUtil.setPosition.\n\t\t */\n\t\tthis.dragging._updatePosition = function() {\n\t\t\tvar delta = this._newPos.subtract(map.latLngToLayerPoint(overlay._corners[0])),\n\t\t\t\tcurrentPoint, i;\n\n\t\t\tthis.fire('predrag');\n\n\t\t\tfor (i = 0; i < 4; i++) {\n\t\t\t\tcurrentPoint = map.latLngToLayerPoint(overlay._corners[i]);\n\t\t\t\toverlay._corners[i] = map.layerPointToLatLng(currentPoint.add(delta));\n\t\t\t}\n\t\t\toverlay._reset();\n\t\t\toverlay.fire('update');\n\n\t\t\tthis.fire('drag');\n\t\t};\n\t},\n\n\t_onKeyDown: function(event) {\n\t\tvar keymap = this.options.keymap,\n\t\t\thandlerName = keymap[event.which];\n\n\t\tif (handlerName !== undefined && this._overlay.options.suppressToolbar !== true) {\n\t\t\tthis[handlerName].call(this);\n\t\t}\n\t},\n\n\t_toggleRotateDistort: function() {\n\t\tvar map = this._overlay._map;\n\n\t\tmap.removeLayer(this._handles[this._mode]);\n\n\t\t/* Switch mode. */\n\t\tif (this._mode === 'rotate') { this._mode = 'distort'; }\n\t\telse { this._mode = 'rotate'; }\n\n\t\tmap.addLayer(this._handles[this._mode]);\n\t},\n\n\t_toggleTransparency: function() {\n\t\tvar image = this._overlay._image,\n\t\t\topacity;\n\n\t\tthis._transparent = !this._transparent;\n\t\topacity = this._transparent ? this.options.opacity : 1;\n\n\t\tL.DomUtil.setOpacity(image, opacity);\n\t\timage.setAttribute('opacity', opacity);\n\t},\n\n\t_toggleOutline: function() {\n\t\tvar image = this._overlay._image,\n\t\t\topacity, outline;\n\n\t\tthis._outlined = !this._outlined;\n\t\topacity = this._outlined ? this.options.opacity / 2 : 1;\n\t\toutline = this._outlined ? this.options.outline : 'none';\n\n\t\tL.DomUtil.setOpacity(image, opacity);\n\t\timage.setAttribute('opacity', opacity);\n\n\t\timage.style.outline = outline;\n\t},\n\n\t_toggleLock: function() {\n\t\tvar map = this._overlay._map;\n\n\t\tmap.removeLayer(this._handles[this._mode]);\n\t\t/* Switch mode. */\n\t\tif (this._mode === 'lock') {\n\t\t\tthis._mode = 'distort';\n\t\t\tthis._enableDragging();\n\t\t} else {\n\t\t\tthis._mode = 'lock';\n\t\t\tif (this.dragging) { this.dragging.disable(); }\n\t\t\tdelete this.dragging;\n\t\t}\n\n\t\tmap.addLayer(this._handles[this._mode]);\n\t},\n\n\t_hideToolbar: function() {\n\t\tvar map = this._overlay._map;\n\t\tif (this.toolbar) {\n\t\t\tmap.removeLayer(this.toolbar);\n\t\t\tthis.toolbar = false;\n\t\t}\n\t},\n\n\t_showToolbar: function(event) {\n\t\tvar overlay = this._overlay,\n target = event.target,\n\t\t\tmap = overlay._map;\n\n\t\t/* Ensure that there is only ever one toolbar attached to each image. */\n\t\tthis._hideToolbar();\n\t\tvar point;\n\t\tif (event.containerPoint) { point = event.containerPoint; }\n\t\telse { point = target._leaflet_pos; }\n\t\tvar raised_point = map.containerPointToLatLng(new L.Point(point.x,point.y-20));\n\t\traised_point.lng = overlay.getCenter().lng;\n\t\tif (this._overlay.options.suppressToolbar !== true) {\n\t\tthis.toolbar = new L.DistortableImage.EditToolbar(raised_point).addTo(map, overlay);\n\t\toverlay.fire('toolbar:created');\n\t\t}\n\n\t\tL.DomEvent.stopPropagation(event);\n },\n\n _removeOverlay: function () {\n var overlay = this._overlay;\n if (this._mode !== \"lock\") {\n var choice = this.confirmDelete();\n if (choice) {\n overlay._map.removeLayer(overlay);\n overlay.fire('delete');\n this.disable();\n }\n }\n },\n\n\t// Based on https://github.com/publiclab/mapknitter/blob/8d94132c81b3040ae0d0b4627e685ff75275b416/app/assets/javascripts/mapknitter/Map.js#L47-L82\n\t_toggleExport: function (){\n\t\tvar map = this._overlay._map;\n\t\tvar overlay = this._overlay;\n\n\t\t// make a new image\n\t\tvar downloadable = new Image();\n\n\t\tdownloadable.id = downloadable.id || \"tempId12345\";\n\t\t$('body').append(downloadable);\n\n\t\tdownloadable.onload = function onLoadDownloadableImage() {\n\n\t\t\tvar height = downloadable.height,\n\t\t\t\twidth = downloadable.width,\n\t\t\t\tnw = map.latLngToLayerPoint(overlay._corners[0]),\n\t\t\t\tne = map.latLngToLayerPoint(overlay._corners[1]),\n\t\t\t\tsw = map.latLngToLayerPoint(overlay._corners[2]),\n\t\t\t\tse = map.latLngToLayerPoint(overlay._corners[3]);\n\n\t\t\t// I think this is to move the image to the upper left corner,\n\t\t\t// jywarren: i think we may need these or the image goes off the edge of the canvas\n // jywarren: but these seem to break the distortion math...\n\n\t\t\t// jywarren: i think it should be rejiggered so it\n\t\t\t// finds the most negative values of x and y and then\n\t\t\t// adds those to all coordinates\n\n\t\t\t//nw.x -= nw.x;\n\t\t\t//ne.x -= nw.x;\n\t\t\t//se.x -= nw.x;\n\t\t\t//sw.x -= nw.x;\n\n\t\t\t//nw.y -= nw.y;\n\t\t\t//ne.y -= nw.y;\n\t\t\t//se.y -= nw.y;\n\t\t\t//sw.y -= nw.y;\n\n\t\t\t// run once warping is complete\n \t\t\tdownloadable.onload = function() {\n\t\t\t\t$(downloadable).remove();\n\t\t\t};\n\n\t\t\tif (window && window.hasOwnProperty('warpWebGl')) {\n\t\t\t\twarpWebGl(\n\t\t\t\t\tdownloadable.id,\n\t\t\t\t\t[0, 0, width, 0, width, height, 0, height],\n\t\t\t\t\t[nw.x, nw.y, ne.x, ne.y, se.x, se.y, sw.x, sw.y],\n\t\t\t\t\ttrue // trigger download\n\t\t\t\t);\n\t\t\t}\n\n\t\t};\n\n\t\tdownloadable.src = overlay.options.fullResolutionSrc || overlay._image.src;\n\n\t},\n\n\ttoggleIsolate: function() {\n\t\t// this.isolated = !this.isolated;\n\t\t// if (this.isolated) {\n\t\t// \t$.each($L.images,function(i,img) {\n\t\t// \t\timg.hidden = false;\n\t\t// \t\timg.setOpacity(1);\n\t\t// \t});\n\t\t// } else {\n\t\t// \t$.each($L.images,function(i,img) {\n\t\t// \t\timg.hidden = true;\n\t\t// \t\timg.setOpacity(0);\n\t\t// \t});\n\t\t// }\n\t\t// this.hidden = false;\n\t\t// this.setOpacity(1);\n\t}\n\n});\n\nL.DistortableImageOverlay.addInitHook(function() {\n\tthis.editing = new L.DistortableImage.Edit(this);\n\n\tif (this.options.editable) {\n\t\tL.DomEvent.on(this._image, 'load', this.editing.enable, this.editing);\n\t}\n\n\tthis.on('remove', function () {\n\t\tif (this.editing) { this.editing.disable(); }\n\t});\n});\n","L.Map.mergeOptions({ boxSelector: true, boxZoom: false });\n\nL.Map.BoxSelectHandle = L.Map.BoxZoom.extend({\n\n addHooks: function () {\n L.DomEvent.on(this._container, 'mousedown', this._onMouseDown, this);\n },\n\n removeHooks: function () {\n L.DomEvent.off(this._container, 'mousedown', this._onMouseDown);\n },\n\n _onMouseDown: function (e) {\n if (!e.shiftKey || ((e.which !== 1) && (e.button !== 1))) { return false; }\n\n L.DomUtil.disableTextSelection();\n\n this._startLayerPoint = this._map.mouseEventToLayerPoint(e);\n\n this._box = L.DomUtil.create('div', 'leaflet-zoom-box', this._pane);\n L.DomUtil.setPosition(this._box, this._startLayerPoint);\n\n this._container.style.cursor = 'crosshair';\n\n L.DomEvent\n .on(document, 'mousemove', this._onMouseMove, this)\n .on(document, 'mouseup', this._onMouseUp, this)\n .on(document, 'keydown', this._onKeyDown, this)\n .preventDefault(e);\n\n this._map.fire('boxzoomstart');\n },\n \n _onMouseMove: function (e) {\n var startPoint = this._startLayerPoint,\n box = this._box,\n\n layerPoint = this._map.mouseEventToLayerPoint(e),\n offset = layerPoint.subtract(startPoint),\n\n newPos = new L.Point(\n Math.min(layerPoint.x, startPoint.x),\n Math.min(layerPoint.y, startPoint.y));\n\n L.DomUtil.setPosition(box, newPos);\n\n box.style.width = (Math.max(0, Math.abs(offset.x) - 4)) + 'px';\n box.style.height = (Math.max(0, Math.abs(offset.y) - 4)) + 'px';\n },\n\n _onMouseUp: function (e) {\n // window.e = e;\n var map = this._map,\n layerPoint = map.mouseEventToLayerPoint(e);\n\n if (this._startLayerPoint.equals(layerPoint)) { return; }\n\n // var bounds = new L.LatLngBounds(\n // map.layerPointToLatLng(this._startLayerPoint),\n // map.layerPointToLatLng(layerPoint));\n\n map.fire('boxzoomend', {\n // boxBounds: bounds\n });\n\n let contents = $(this._pane).children();\n let images = contents.filter('img');\n // window.images = images;\n\n this._finish();\n\n return images;\n },\n\n _finish: function () {\n this._pane.removeChild(this._box);\n this._container.style.cursor = '';\n\n L.DomUtil.enableTextSelection();\n\n L.DomEvent\n .off(document, 'mousemove', this._onMouseMove)\n .off(document, 'mouseup', this._onMouseUp)\n .off(document, 'keydown', this._onKeyDown);\n },\n\n // escape keybinding for getting rid of the selection box (alternative to mouse up). keep for now to see if it will become useful\n // in deselecting images\n _onKeyDown: function (e) {\n if (e.keyCode === 27) {\n this._finish();\n }\n }\n});\n\nL.Map.addInitHook('addHandler', 'boxSelector', L.Map.BoxSelectHandle);\n"]} \ No newline at end of file +{"version":3,"sources":["../src/util/DomUtil.js","../src/util/Map._newLayerPointToLatLng.js","../src/util/MatrixUtil.js","../src/edit/EditHandle.js","../src/edit/LockHandle.js","../src/edit/DistortHandle.js","../src/edit/RotateAndScaleHandle.js","../src/edit/RotateHandle.js","../src/edit/ScaleHandle.js","../src/DistortableImageOverlay.js","../src/edit/DistortableImage.EditToolbar.js","../src/edit/DistortableImage.Edit.js","../src/edit/BoxSelectHandle.js"],"names":[],"mappings":"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","file":"leaflet.distortableimage.js","sourcesContent":["L.DomUtil = L.extend(L.DomUtil, {\n\tgetMatrixString: function(m) {\n\t\tvar is3d = L.Browser.webkit3d || L.Browser.gecko3d || L.Browser.ie3d,\n\n\t\t\t/* \n\t\t * Since matrix3d takes a 4*4 matrix, we add in an empty row and column, which act as the identity on the z-axis.\n\t\t * See:\n\t\t * http://franklinta.com/2014/09/08/computing-css-matrix3d-transforms/\n\t\t * https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function#M.C3.B6bius'_homogeneous_coordinates_in_projective_geometry\n\t\t */\n\t\t\tmatrix = [\n\t\t\t\tm[0], m[3], 0, m[6],\n\t\t\t\tm[1], m[4], 0, m[7],\n\t\t\t\t 0, 0, 1, 0,\n\t\t\t\tm[2], m[5], 0, m[8]\n\t\t\t],\n\n\t\t\tstr = is3d ? 'matrix3d(' + matrix.join(',') + ')' : '';\n\n\t\tif (!is3d) {\n\t\t\tconsole.log('Your browser must support 3D CSS transforms in order to use DistortableImageOverlay.');\n\t\t}\n\n\t\treturn str;\n\t},\n\n\tgetRotateString: function(angle, units) {\n\t\tvar is3d = L.Browser.webkit3d || L.Browser.gecko3d || L.Browser.ie3d,\n\t\t\topen = 'rotate' + (is3d ? '3d' : '') + '(',\n\t\t\trotateString = (is3d ? '0, 0, 1, ' : '') + angle + units;\n\t\t\t\n\t\treturn open + rotateString + ')';\n\t}\n});\n","L.Map.include({\n\t_newLayerPointToLatLng: function(point, newZoom, newCenter) {\n\t\tvar topLeft = L.Map.prototype._getNewTopLeftPoint.call(this, newCenter, newZoom)\n\t\t\t\t.add(L.Map.prototype._getMapPanePos.call(this));\n\t\treturn this.unproject(point.add(topLeft), newZoom);\n\t}\n});","L.MatrixUtil = {\n\n\t// Compute the adjugate of m\n\tadj: function(m) { \n\t\treturn [\n\t\t\tm[4]*m[8]-m[5]*m[7], m[2]*m[7]-m[1]*m[8], m[1]*m[5]-m[2]*m[4],\n\t\t\tm[5]*m[6]-m[3]*m[8], m[0]*m[8]-m[2]*m[6], m[2]*m[3]-m[0]*m[5],\n\t\t\tm[3]*m[7]-m[4]*m[6], m[1]*m[6]-m[0]*m[7], m[0]*m[4]-m[1]*m[3]\n\t\t];\n\t},\n\n\t// multiply two 3*3 matrices\n\tmultmm: function(a, b) { \n\t\tvar c = [],\n\t\t\ti;\n\n\t\tfor (i = 0; i < 3; i++) {\n\t\t\tfor (var j = 0; j < 3; j++) {\n\t\t\t\tvar cij = 0;\n\t\t\t\tfor (var k = 0; k < 3; k++) {\n\t\t\t\t\tcij += a[3*i + k]*b[3*k + j];\n\t\t\t\t}\n\t\t\t\tc[3*i + j] = cij;\n\t\t\t}\n\t\t}\n\t\treturn c;\n\t},\n\n\t// multiply a 3*3 matrix and a 3-vector\n\tmultmv: function(m, v) { \n\t\treturn [\n\t\t\tm[0]*v[0] + m[1]*v[1] + m[2]*v[2],\n\t\t\tm[3]*v[0] + m[4]*v[1] + m[5]*v[2],\n\t\t\tm[6]*v[0] + m[7]*v[1] + m[8]*v[2]\n\t\t];\n\t},\n\n\t// multiply a scalar and a 3*3 matrix\n\tmultsm: function(s, m) {\n\t\tvar matrix = [];\n\n\t\tfor (var i = 0, l = m.length; i < l; i++) {\n\t\t\tmatrix.push(s*m[i]);\n\t\t}\n\n\t\treturn matrix;\n\t},\n\n\tbasisToPoints: function(x1, y1, x2, y2, x3, y3, x4, y4) {\n\t\tvar m = [\n\t\t\t\tx1, x2, x3,\n\t\t\t\ty1, y2, y3,\n\t\t\t\t1, 1, 1\n\t\t\t],\n\t\t\tv = L.MatrixUtil.multmv(L.MatrixUtil.adj(m), [x4, y4, 1]);\n\n\t\treturn L.MatrixUtil.multmm(m, [\n\t\t\tv[0], 0, 0,\n\t\t\t0, v[1], 0,\n\t\t\t0, 0, v[2]\n\t\t]);\n\t},\n\n\n\tproject: function(m, x, y) {\n\t\tvar v = L.MatrixUtil.multmv(m, [x, y, 1]);\n\t\treturn [v[0]/v[2], v[1]/v[2]];\n\t},\n\n\tgeneral2DProjection: function(\n\tx1s, y1s, x1d, y1d,\n\tx2s, y2s, x2d, y2d,\n\tx3s, y3s, x3d, y3d,\n\tx4s, y4s, x4d, y4d\n\t) {\n\t\tvar s = L.MatrixUtil.basisToPoints(x1s, y1s, x2s, y2s, x3s, y3s, x4s, y4s),\n\t\t\td = L.MatrixUtil.basisToPoints(x1d, y1d, x2d, y2d, x3d, y3d, x4d, y4d),\n\t\t\tm = L.MatrixUtil.multmm(d, L.MatrixUtil.adj(s));\n\n\t\t/* \n\t\t *\tNormalize to the unique matrix with m[8] == 1. \n\t\t * \tSee: http://franklinta.com/2014/09/08/computing-css-matrix3d-transforms/\n\t\t */\n\t\treturn L.MatrixUtil.multsm(1/m[8], m);\n\t}\n};","L.EditHandle = L.Marker.extend({\n\tinitialize: function(overlay, corner, options) {\n\t\tvar markerOptions,\n\t\t\tlatlng = overlay._corners[corner];\n\n\t\tL.setOptions(this, options);\n\n\t\tthis._handled = overlay;\n\t\tthis._corner = corner;\n\n\t\tmarkerOptions = {\n\t\t\tdraggable: true,\n\t\t\tzIndexOffset: 10\n\t\t};\n\n\t\tif (options && options.hasOwnProperty('draggable')) {\n\t\t\tmarkerOptions.draggable = options.draggable;\n\t\t}\n\n\t\tL.Marker.prototype.initialize.call(this, latlng, markerOptions);\n\t},\n\n\tonAdd: function(map) {\n\t\tL.Marker.prototype.onAdd.call(this, map);\n\t\tthis._bindListeners();\n\n\t\tthis.updateHandle();\n\t},\n\n\tonRemove: function(map) {\n\t\tthis._unbindListeners();\n\t\tL.Marker.prototype.onRemove.call(this, map);\n\t},\n\n\t_onHandleDragStart: function() {\n\t\tthis._handled.fire('editstart');\n\t},\n\n\t_onHandleDragEnd: function() {\n\t\tthis._fireEdit();\n\t},\n\n\t_fireEdit: function() {\n\t\tthis._handled.edited = true;\n\t\tthis._handled.fire('edit');\n\t},\n\n\t_bindListeners: function() {\n\t\tthis.on({\n\t\t\t'dragstart': this._onHandleDragStart,\n\t\t\t'drag': this._onHandleDrag,\n\t\t\t'dragend': this._onHandleDragEnd\n\t\t}, this);\n\n\t\tthis._handled._map.on('zoomend', this.updateHandle, this);\n\n\t\tthis._handled.on('update', this.updateHandle, this);\n\t},\n\n\t_unbindListeners: function() {\n\t\tthis.off({\n\t\t\t'dragstart': this._onHandleDragStart,\n\t\t\t'drag': this._onHandleDrag,\n\t\t\t'dragend': this._onHandleDragEnd\n\t\t}, this);\n\n\t\tthis._handled._map.off('zoomend', this.updateHandle, this);\n\t\tthis._handled.off('update', this.updateHandle, this);\n\t}\n});\n","L.LockHandle = L.EditHandle.extend({\n\toptions: {\n\t\tTYPE: 'lock',\n\t\ticon: new L.Icon({ \n\t\t\ticonUrl: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAD8SURBVO3BPU7CYAAA0AdfjIcQlRCQBG7C3gk2uIPG2RC3Dk16Gz0FTO1WZs/gwGCMP/2+xsSl7+n1er1Iz9LtRQjaPeMeO+TinLDCJV78YqjdA04YodKuxhUaPGoRxMmxwRQZSt87Yo4KExGCeAUyLLFB4bMacxywEClIU2KDKXbInTUYo8JCgoFuGoxQO5uiwY1EA91VmDqrcKeDoX8WdNNgjApvmGGLXKIgXY0xGkxQYItrrFFIEKQ5Yo4KEx9yrDFDhlKkIF6NOQ5Y+KpAhiXWKEQI4pxwiwoLPyuxwQw75FoE7fZYocFEuwI7jHCBV39gL92TXq/Xi/AOcmczZmaIMScAAAAASUVORK5CYII=',\n\t\t\ticonSize: [32, 32],\n\t\t\ticonAnchor: [16, 16]}\n\t\t)\n\t},\n\n\t/* cannot be dragged */\n\t_onHandleDrag: function() {\n\t},\n\n\tupdateHandle: function() {\n\t\tthis.setLatLng(this._handled._corners[this._corner]);\n\t}\n\n});\n","L.DistortHandle = L.EditHandle.extend({\n\toptions: {\n\t\tTYPE: 'distort',\n\t\ticon: new L.Icon({\n\t\t\ticonUrl: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAChSURBVO3BIU4DURgGwNkvL2B6AkQTLBqP4QCoSm7DDXoBLBZHDbfgICAIZjEV3YTn9uVHdMZZtcnCfI13bIzxg0emg6Nm6QVbYz3jylEsXRrvwommb49X67jFkz80fR9Mb1YxTzqiWBSLYlEsikWxKBbFolgUi2JRLIpFsSgWxaJY03fHHOu40dH07bAzWCx9Ge/TiWbpHgdsjPGNB2f/yS+7xRCyiiZPJQAAAABJRU5ErkJggg==',\n\t\t\ticonSize: [32, 32],\n\t\t\ticonAnchor: [16, 16]}\n\t\t)\n\t},\n\n\tupdateHandle: function() {\n\t\tthis.setLatLng(this._handled._corners[this._corner]);\n\t},\n\n\t_onHandleDrag: function() {\n\t\tthis._handled._updateCorner(this._corner, this.getLatLng());\n\n\t\tthis._handled.fire('update');\n\t}\n});\n","L.RotateAndScaleHandle = L.EditHandle.extend({\n\toptions: {\n\t\tTYPE: 'rotate',\n\t\ticon: new L.Icon({\n\t\t\ticonUrl: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAHiSURBVMXBa3HbShgA0PMp/1sCCo8oCEpgTaCXgIXAJiDzyCJoAUTm4UVQAns1Y8+snWnTvJyeE16hkjDgDrfoNTMKcpC9UPiLSo8JyetkjEHxjPCMyoS199kFoz8Iv1HpMaN3qWDCHoegOKkkRwnJpRmroHgiPFEZ8IBekzEGxQtUEhKSS/fB7Ew4U+lxcGkVZG9QWWPSFAxBcdK59KApuA+yNwp2uEdx1GN25sZJZULSfAtm77SlbNjju6MvG75u+WHRWVR6rDVjMPsgwYyVZl3pLTpHkyYHOx8syMiayaJzlDTZ9YyaZNFVkiYH2ZUEBcVJJXVImuz6Js3Qofe59pq7DoOTILu+g+a288mCouk7/1iH4qTS+2QdDppbV1ZJmrnDXnPnc5UOs2Z0fUmTuyBr+krvSioJyUmQO0dZM7mepMkWnaNRkyrJB6uskTSjxY3Fll8bvmJwlDb83FJ8gMqAB80uyBY3Trb82PAfvjj6vuHnluIdKgMeNXOwctK5NKBoHitrb1RJeHRp5Ux4ojLg0aWMHGQvUOkxIWkKVsHsTPiNSo8HDC5lZIsgO6n0uMUdRvQuFQxB8UR4RmXC2vvsgtEfhL+o9JiQvE7GGBTPCK9QSUjoMWgKDthjDrIX+h/k0I7gth6N5gAAAABJRU5ErkJggg==',\n\t\t\ticonSize: [32, 32],\n\t\t\ticonAnchor: [16, 16]}\n\t\t)\n\t},\n\n\t_onHandleDrag: function() {\n\t\tvar overlay = this._handled,\n\t\t\tformerLatLng = this._handled._corners[this._corner],\n\t\t\tnewLatLng = this.getLatLng(),\n\n\t\t\tangle = this._calculateAngle(formerLatLng, newLatLng),\n\t\t\tscale = this._calculateScalingFactor(formerLatLng, newLatLng);\n\n\t\toverlay.editing._rotateBy(angle);\n\t\toverlay.editing._scaleBy(scale);\n\n\t\t/* \n\t\t checks whether the \"edgeMinWidth\" property is set and tracks the minimum edge length;\n\t\t this enables preventing scaling to zero, but we might also add an overall scale limit\n\t\t*/\t\t\n\t\tif (this._handled.options.hasOwnProperty('edgeMinWidth')){\n\t\t\tvar edgeMinWidth = this._handled.options.edgeMinWidth,\n\t\t\t w = L.latLng(overlay._corners[0]).distanceTo(overlay._corners[1]),\n\t\t\t h = L.latLng(overlay._corners[1]).distanceTo(overlay._corners[2]);\n\t\t\tif ((w > edgeMinWidth && h > edgeMinWidth) || scale > 1) {\n\t\t\t\toverlay.editing._scaleBy(scale);\n\t\t\t}\n\t\t} else {\n\t\t\toverlay.editing._scaleBy(scale);\n\t\t}\n\n\t\toverlay.fire('update');\n\t},\n\n\tupdateHandle: function() {\n\t\tthis.setLatLng(this._handled._corners[this._corner]);\n\t},\n\n\t/* Takes two latlngs and calculates the angle between them. */\n\t_calculateAngle: function(latlngA, latlngB) {\n\t\tvar map = this._handled._map,\n\n\t\t\tcenterPoint = map.latLngToLayerPoint(this._handled.getCenter()),\n\t\t\tformerPoint = map.latLngToLayerPoint(latlngA),\n\t\t\tnewPoint = map.latLngToLayerPoint(latlngB),\n\n\t\t\tinitialAngle = Math.atan2(centerPoint.y - formerPoint.y, centerPoint.x - formerPoint.x),\n\t\t\tnewAngle = Math.atan2(centerPoint.y - newPoint.y, centerPoint.x - newPoint.x);\n\n\t\treturn newAngle - initialAngle;\n\t},\n\n\t/* Takes two latlngs and calculates the scaling difference. */\n\t_calculateScalingFactor: function(latlngA, latlngB) {\n\t\tvar map = this._handled._map,\n\n\t\t\tcenterPoint = map.latLngToLayerPoint(this._handled.getCenter()),\n\t\t\tformerPoint = map.latLngToLayerPoint(latlngA),\n\t\t\tnewPoint = map.latLngToLayerPoint(latlngB),\n\n\t\t\tformerRadiusSquared = this._d2(centerPoint, formerPoint),\n\t\t\tnewRadiusSquared = this._d2(centerPoint, newPoint);\n\n\t\treturn Math.sqrt(newRadiusSquared / formerRadiusSquared);\n\t},\n\n\t/* Distance between two points in cartesian space, squared (distance formula). */\n\t_d2: function(a, b) {\n\t\tvar dx = a.x - b.x,\n\t\t\tdy = a.y - b.y;\n\n\t\treturn Math.pow(dx, 2) + Math.pow(dy, 2);\n\t}\n});\n","L.RotateHandle = L.EditHandle.extend({\n\toptions: {\n\t\tTYPE: 'rotate',\n\t\ticon: new L.Icon({\n\t\t\ticonUrl: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAHiSURBVMXBa3HbShgA0PMp/1sCCo8oCEpgTaCXgIXAJiDzyCJoAUTm4UVQAns1Y8+snWnTvJyeE16hkjDgDrfoNTMKcpC9UPiLSo8JyetkjEHxjPCMyoS199kFoz8Iv1HpMaN3qWDCHoegOKkkRwnJpRmroHgiPFEZ8IBekzEGxQtUEhKSS/fB7Ew4U+lxcGkVZG9QWWPSFAxBcdK59KApuA+yNwp2uEdx1GN25sZJZULSfAtm77SlbNjju6MvG75u+WHRWVR6rDVjMPsgwYyVZl3pLTpHkyYHOx8syMiayaJzlDTZ9YyaZNFVkiYH2ZUEBcVJJXVImuz6Js3Qofe59pq7DoOTILu+g+a288mCouk7/1iH4qTS+2QdDppbV1ZJmrnDXnPnc5UOs2Z0fUmTuyBr+krvSioJyUmQO0dZM7mepMkWnaNRkyrJB6uskTSjxY3Fll8bvmJwlDb83FJ8gMqAB80uyBY3Trb82PAfvjj6vuHnluIdKgMeNXOwctK5NKBoHitrb1RJeHRp5Ux4ojLg0aWMHGQvUOkxIWkKVsHsTPiNSo8HDC5lZIsgO6n0uMUdRvQuFQxB8UR4RmXC2vvsgtEfhL+o9JiQvE7GGBTPCK9QSUjoMWgKDthjDrIX+h/k0I7gth6N5gAAAABJRU5ErkJggg==',\n\t\t\ticonSize: [32, 32],\n\t\t\ticonAnchor: [16, 16]}\n\t\t)\n\t},\n\n\t_onHandleDrag: function() {\n\t\tvar overlay = this._handled,\n\t\t\tformerLatLng = this._handled._corners[this._corner],\n\t\t\tnewLatLng = this.getLatLng(),\n\n\t\t\tangle = this._calculateAngle(formerLatLng, newLatLng);\n\n\t\toverlay.editing._rotateBy(angle);\n\n\t\toverlay.fire('update');\n\t},\n\n\tupdateHandle: function() {\n\t\tthis.setLatLng(this._handled._corners[this._corner]);\n\t},\n\n\t/* Takes two latlngs and calculates the angle between them. */\n\t_calculateAngle: function(latlngA, latlngB) {\n\t\tvar map = this._handled._map,\n\n\t\t\tcenterPoint = map.latLngToLayerPoint(this._handled.getCenter()),\n\t\t\tformerPoint = map.latLngToLayerPoint(latlngA),\n\t\t\tnewPoint = map.latLngToLayerPoint(latlngB),\n\n\t\t\tinitialAngle = Math.atan2(centerPoint.y - formerPoint.y, centerPoint.x - formerPoint.x),\n\t\t\tnewAngle = Math.atan2(centerPoint.y - newPoint.y, centerPoint.x - newPoint.x);\n\n\t\treturn newAngle - initialAngle;\n\t},\n\n\t/* Takes two latlngs and calculates the scaling difference. */\n\t_calculateScalingFactor: function(latlngA, latlngB) {\n\t\tvar map = this._handled._map,\n\n\t\t\tcenterPoint = map.latLngToLayerPoint(this._handled.getCenter()),\n\t\t\tformerPoint = map.latLngToLayerPoint(latlngA),\n\t\t\tnewPoint = map.latLngToLayerPoint(latlngB),\n\n\t\t\tformerRadiusSquared = this._d2(centerPoint, formerPoint),\n\t\t\tnewRadiusSquared = this._d2(centerPoint, newPoint);\n\n\t\treturn Math.sqrt(newRadiusSquared / formerRadiusSquared);\n\t},\n\n\t/* Distance between two points in cartesian space, squared (distance formula). */\n\t_d2: function(a, b) {\n\t\tvar dx = a.x - b.x,\n\t\t\tdy = a.y - b.y;\n\n\t\treturn Math.pow(dx, 2) + Math.pow(dy, 2);\n\t}\n});\n","L.ScaleHandle = L.EditHandle.extend({\n\toptions: {\n\t\tTYPE: 'rotate',\n\t\ticon: new L.Icon({\n\t\t\ticonUrl:'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIHdpZHRoPSI0NTkiIGhlaWdodD0iNDY0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCA1MTIgNTEyIiB4bWw6c3BhY2U9InByZXNlcnZlIiBzdHlsZT0iIj48cmVjdCBpZD0iYmFja2dyb3VuZHJlY3QiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHg9IjAiIHk9IjAiIGZpbGw9Im5vbmUiIHN0cm9rZT0ibm9uZSIgY2xhc3M9IiIgc3R5bGU9IiIvPjxnIGNsYXNzPSJjdXJyZW50TGF5ZXIiIHN0eWxlPSIiPjx0aXRsZT5MYXllciAxPC90aXRsZT48cGF0aCBkPSJNNDU5LjA0OTE1OTUzMDQ3MTM0LDg2LjkyNjIzNDUxMjU1MDAyIFYwIGgtODUuNzE0NTczMzU2MzEyMDkgdjI3LjA0MzcxNzQwMzkwNDQ1MiBIODUuNzE0NTczMzU2MzEyMDMgVjAgSDAgdjg2LjkyNjIzNDUxMjU1MDAyIGgyNS43MTQzNzIwMDY4OTM2MjYgdjI4OS43NTQxMTUwNDE4MzM0IEgwIHY4Ni45MjYyMzQ1MTI1NTAwMiBoODUuNzE0NTczMzU2MzEyMDkgdi0yNy4wNDM3MTc0MDM5MDQ0NTIgaDI4NS43MTUyNDQ1MjEwNDAzIHYyNy4wNDM3MTc0MDM5MDQ0NTIgaDg1LjcxNDU3MzM1NjMxMjA5IHYtODYuOTI2MjM0NTEyNTUwMDIgaC0yMy44MDk2MDM3MTAwODY2OSBWODYuOTI2MjM0NTEyNTUwMDIgSDQ1OS4wNDkxNTk1MzA0NzEzNCB6TTM4NC43NjMxOTU5NTUwMDA5LDEyLjU1NjAxMTY1MTgxMjc4MSBoNjEuOTA0OTY5NjQ2MjI1Mzk2IHY2Mi43ODAwNTgyNTkwNjM5MSBoLTYxLjkwNDk2OTY0NjIyNTM5NiBWMTIuNTU2MDExNjUxODEyNzgxIHpNMTIuMzgwOTkzOTI5MjQ1MDUsMTIuNTU2MDExNjUxODEyNzgxIGg2MS45MDQ5Njk2NDYyMjUzOTYgdjYyLjc4MDA1ODI1OTA2MzkxIEgxMi4zODA5OTM5MjkyNDUwNSBWMTIuNTU2MDExNjUxODEyNzgxIHpNNzQuMjg1OTYzNTc1NDcwNTMsNDUxLjA1MDU3MjQxNTEyMDY2IEgxMi4zODA5OTM5MjkyNDUwNSB2LTYyLjc4MDA1ODI1OTA2MzkxIGg2MS45MDQ5Njk2NDYyMjUzOTYgVjQ1MS4wNTA1NzI0MTUxMjA2NiB6TTQ0NS43MTU3ODE0NTI4MjI3NCw0NTEuMDUwNTcyNDE1MTIwNjYgaC02Mi44NTczNTM3OTQ2Mjg4NjQgdi02Mi43ODAwNTgyNTkwNjM5MSBoNjIuODU3MzUzNzk0NjI4ODY0IFY0NTEuMDUwNTcyNDE1MTIwNjYgek00MDcuNjIwNDE1NTE2Njg0MjYsMzc2LjY4MDM0OTU1NDM4MzQ0IGgtMzYuMTkwNTk3NjM5MzMxNzcgdjMyLjgzODc5OTcwNDc0MTEyIEg4NS43MTQ1NzMzNTYzMTIwMyB2LTMyLjgzODc5OTcwNDc0MTEyIEg0OS41MjM5NzU3MTY5ODAzMiBWODYuOTI2MjM0NTEyNTUwMDIgaDM2LjE5MDU5NzYzOTMzMTc3IFY1MC4yMjQwNDY2MDcyNTExMjUgaDI4Ny42MjAwMTI4MTc4NDcyIHYzNi43MDIxODc5MDUyOTg5IGgzNC4yODU4MjkzNDI1MjQ4MzUgVjM3Ni42ODAzNDk1NTQzODM0NCB6IiBpZD0ic3ZnXzIiIGNsYXNzPSIiIGZpbGw9IiMxYTFhZWIiIGZpbGwtb3BhY2l0eT0iMSIvPjwvZz48L3N2Zz4=',\n\t\t\ticonSize: [32, 32],\n\t\t\ticonAnchor: [16, 16]}\n\t\t)\n\t},\n\n\t_onHandleDrag: function() {\n\t\tvar overlay = this._handled,\n\t\t\tformerLatLng = this._handled._corners[this._corner],\n\t\t\tnewLatLng = this.getLatLng(),\n\n\t\t\tscale = this._calculateScalingFactor(formerLatLng, newLatLng);\n\n\t\toverlay.editing._scaleBy(scale);\n\n\t\toverlay.fire('update');\n\t},\n\n\tupdateHandle: function() {\n\t\tthis.setLatLng(this._handled._corners[this._corner]);\n\t},\n\n\t/* Takes two latlngs and calculates the angle between them. */\n\t_calculateAngle: function(latlngA, latlngB) {\n\t\tvar map = this._handled._map,\n\n\t\t\tcenterPoint = map.latLngToLayerPoint(this._handled.getCenter()),\n\t\t\tformerPoint = map.latLngToLayerPoint(latlngA),\n\t\t\tnewPoint = map.latLngToLayerPoint(latlngB),\n\n\t\t\tinitialAngle = Math.atan2(centerPoint.y - formerPoint.y, centerPoint.x - formerPoint.x),\n\t\t\tnewAngle = Math.atan2(centerPoint.y - newPoint.y, centerPoint.x - newPoint.x);\n\n\t\treturn newAngle - initialAngle;\n\t},\n\n\t/* Takes two latlngs and calculates the scaling difference. */\n\t_calculateScalingFactor: function(latlngA, latlngB) {\n\t\tvar map = this._handled._map,\n\n\t\t\tcenterPoint = map.latLngToLayerPoint(this._handled.getCenter()),\n\t\t\tformerPoint = map.latLngToLayerPoint(latlngA),\n\t\t\tnewPoint = map.latLngToLayerPoint(latlngB),\n\n\t\t\tformerRadiusSquared = this._d2(centerPoint, formerPoint),\n\t\t\tnewRadiusSquared = this._d2(centerPoint, newPoint);\n\n\t\treturn Math.sqrt(newRadiusSquared / formerRadiusSquared);\n\t},\n\n\t/* Distance between two points in cartesian space, squared (distance formula). */\n\t_d2: function(a, b) {\n\t\tvar dx = a.x - b.x,\n\t\t\tdy = a.y - b.y;\n\n\t\treturn Math.pow(dx, 2) + Math.pow(dy, 2);\n\t}\n});\n","L.DistortableImageOverlay = L.ImageOverlay.extend({\n\tinclude: L.Mixin.Events,\n\n\toptions: {\n\t\talt: '',\n\t\theight: 200,\n\t\tcrossOrigin: true\n\t},\n\n\tinitialize: function(url, options) {\n\t\t\tthis._toolArray = L.DistortableImage.EditToolbarDefaults;\n\t\t\tthis._url = url;\n\t\t\tthis._rotation = this.options.rotation;\n\n\t\t\tL.setOptions(this, options);\n\t},\n\n\tonAdd: function(map) {\n\t\t/* Copied from L.ImageOverlay */\n\t\tthis._map = map;\n\n\t\tif (!this._image) { this._initImage(); }\n\t\tif (!this._events) { this._initEvents(); }\n\n\t\tmap._panes.overlayPane.appendChild(this._image);\n\n\t\tmap.on('viewreset', this._reset, this);\n\t\t/* End copied from L.ImageOverlay */\n\n\t\t/* Use provided corners if available */\n\t\tif (this.options.corners) {\n\t\t\tthis._corners = this.options.corners;\n\t\t\tif (map.options.zoomAnimation && L.Browser.any3d) {\n\t\t\t\tmap.on('zoomanim', this._animateZoom, this);\n\t\t\t}\n\n\t\t\t/* This reset happens before image load; it allows\n\t\t\t * us to place the image on the map earlier with\n\t\t\t * \"guessed\" dimensions. */\n\t\t\tthis._reset();\n\t\t}\n\n\t\t/* Have to wait for the image to load because\n\t\t * we need to access its width and height. */\n\t\tL.DomEvent.on(this._image, 'load', function() {\n\t\t\tthis._initImageDimensions();\n\t\t\tthis._reset();\n\t\t\t/* Initialize default corners if not already set */\n\t\t\tif (!this._corners) {\n\t\t\t\tif (map.options.zoomAnimation && L.Browser.any3d) {\n\t\t\t\t\tmap.on('zoomanim', this._animateZoom, this);\n\t\t\t\t}\n\t\t\t}\n\t\t}, this);\n\n\t\tthis.fire('add');\n\t},\n\n\tonRemove: function(map) {\n\t\tthis.fire('remove');\n\n\t\tL.ImageOverlay.prototype.onRemove.call(this, map);\n\t},\n\n\t_initImage: function () {\n\t\tL.ImageOverlay.prototype._initImage.call(this);\n\n\t\tL.extend(this._image, {\n\t\t\talt: this.options.alt\n\t\t});\n\t},\n\n\t_addTool: function(tool) {\n\t\tthis._toolArray.push(tool);\n\t\tL.DistortableImage.EditToolbar = LeafletToolbar.Popup.extend({\n\t\t\toptions: {\n\t\t\t\tactions: this._toolArray\n\t\t\t}\n\t\t});\n\t},\n\n\t_initImageDimensions: function() {\n\t\tvar map = this._map,\n\n\t\t\toriginalImageWidth = L.DomUtil.getStyle(this._image, 'width'),\n\t\t\toriginalImageHeight = L.DomUtil.getStyle(this._image, 'height'),\n\n\t\t\taspectRatio = parseInt(originalImageWidth) / parseInt(originalImageHeight),\n\n\t\t\timageHeight = this.options.height,\n\t\t\timageWidth = parseInt(aspectRatio*imageHeight),\n\n\t\t\tcenter = map.latLngToContainerPoint(map.getCenter()),\n\t\t\toffset = new L.Point(imageWidth, imageHeight).divideBy(2);\n\n\t\tif (this.options.corners) { this._corners = this.options.corners; }\n\t\telse {\n\t\t\tthis._corners = [\n\t\t\t\tmap.containerPointToLatLng(center.subtract(offset)),\n\t\t\t\tmap.containerPointToLatLng(center.add(new L.Point(offset.x, - offset.y))),\n\t\t\t\tmap.containerPointToLatLng(center.add(new L.Point(- offset.x, offset.y))),\n\t\t\t\tmap.containerPointToLatLng(center.add(offset))\n\t\t\t];\n\t\t}\n\t},\n\n \t_initEvents: function() {\n \t\tthis._events = [ 'click' ];\n\n \t\tfor (var i = 0, l = this._events.length; i < l; i++) {\n\t \t\tL.DomEvent.on(this._image, this._events[i], this._fireMouseEvent, this);\n \t\t}\n \t},\n\n \t/* See src/layer/vector/Path.SVG.js in the Leaflet source. */\n \t_fireMouseEvent: function(event) {\n \t\tif (!this.hasEventListeners(event.type)) { return; }\n\n\t\tvar map = this._map,\n\t\t\tcontainerPoint = map.mouseEventToContainerPoint(event),\n\t\t\tlayerPoint = map.containerPointToLayerPoint(containerPoint),\n\t\t\tlatlng = map.layerPointToLatLng(layerPoint);\n\n\t\tthis.fire(event.type, {\n\t\t\tlatlng: latlng,\n\t\t\tlayerPoint: layerPoint,\n\t\t\tcontainerPoint: containerPoint,\n\t\t\toriginalEvent: event\n\t\t});\n \t},\n\n\t_updateCorner: function(corner, latlng) {\n\t\tthis._corners[corner] = latlng;\n\t\tthis._reset();\n\t},\n\n\n\t/* Copied from Leaflet v0.7 https://github.com/Leaflet/Leaflet/blob/66282f14bcb180ec87d9818d9f3c9f75afd01b30/src/dom/DomUtil.js#L189-L199 */\n\t/* since L.DomUtil.getTranslateString() is deprecated in Leaflet v1.0 */\n\t_getTranslateString: function (point) {\n\t\t// on WebKit browsers (Chrome/Safari/iOS Safari/Android) using translate3d instead of translate\n\t\t// makes animation smoother as it ensures HW accel is used. Firefox 13 doesn't care\n\t\t// (same speed either way), Opera 12 doesn't support translate3d\n\n\t\tvar is3d = L.Browser.webkit3d,\n\t\t open = 'translate' + (is3d ? '3d' : '') + '(',\n\t\t close = (is3d ? ',0' : '') + ')';\n\n\t\treturn open + point.x + 'px,' + point.y + 'px' + close;\n\t},\n\n\t_reset: function() {\n\t\tvar map = this._map,\n\t\t\timage = this._image,\n\t\t\tlatLngToLayerPoint = L.bind(map.latLngToLayerPoint, map),\n\n\t\t\ttransformMatrix = this._calculateProjectiveTransform(latLngToLayerPoint),\n\t\t\ttopLeft = latLngToLayerPoint(this._corners[0]),\n\n\t\t\twarp = L.DomUtil.getMatrixString(transformMatrix),\n\t\t\ttranslation = this._getTranslateString(topLeft);\n\n\t\t/* See L.DomUtil.setPosition. Mainly for the purposes of L.Draggable. */\n\t\timage._leaflet_pos = topLeft;\n\n\t\timage.style[L.DomUtil.TRANSFORM] = [translation, warp].join(' ');\n\n\t\t/* Set origin to the upper-left corner rather than the center of the image, which is the default. */\n\t\timage.style[L.DomUtil.TRANSFORM + '-origin'] = \"0 0 0\";\n\t},\n\n\t/*\n\t * Calculates the transform string that will be correct *at the end* of zooming.\n\t * Leaflet then generates a CSS3 animation between the current transform and\n\t *\t\t future transform which makes the transition appear smooth.\n\t */\n\t_animateZoom: function(event) {\n\t\tvar map = this._map,\n\t\t\timage = this._image,\n\t\t\tlatLngToNewLayerPoint = function(latlng) {\n\t\t\t\treturn map._latLngToNewLayerPoint(latlng, event.zoom, event.center);\n\t\t\t},\n\n\t\t\ttransformMatrix = this._calculateProjectiveTransform(latLngToNewLayerPoint),\n\t\t\ttopLeft = latLngToNewLayerPoint(this._corners[0]),\n\n\t\t\twarp = L.DomUtil.getMatrixString(transformMatrix),\n\t\t\ttranslation = this._getTranslateString(topLeft);\n\n\t\t/* See L.DomUtil.setPosition. Mainly for the purposes of L.Draggable. */\n\t\timage._leaflet_pos = topLeft;\n\n\t\tif (!L.Browser.gecko) {\n\t\t\timage.style[L.DomUtil.TRANSFORM] = [translation, warp].join(' ');\n\t\t}\n\t},\n\n\tgetCorners: function() {\n\t\treturn this._corners;\n\t},\n\n\t/*\n\t * Calculates the centroid of the image.\n\t *\t\t See http://stackoverflow.com/questions/6149175/logical-question-given-corners-find-center-of-quadrilateral\n\t */\n\tgetCenter: function(ll2c, c2ll) {\n\t\tvar map = this._map,\n\t\t\tlatLngToCartesian = ll2c ? ll2c : map.latLngToLayerPoint,\n\t\t\tcartesianToLatLng = c2ll ? c2ll: map.layerPointToLatLng,\n\t\t\tnw = latLngToCartesian.call(map, this._corners[0]),\n\t\t\tne = latLngToCartesian.call(map, this._corners[1]),\n\t\t\tse = latLngToCartesian.call(map, this._corners[2]),\n\t\t\tsw = latLngToCartesian.call(map, this._corners[3]),\n\n\t\t\tnmid = nw.add(ne.subtract(nw).divideBy(2)),\n\t\t\tsmid = sw.add(se.subtract(sw).divideBy(2));\n\n\t\treturn cartesianToLatLng.call(map, nmid.add(smid.subtract(nmid).divideBy(2)));\n\t},\n\n\t_calculateProjectiveTransform: function(latLngToCartesian) {\n\t\t/* Setting reasonable but made-up image defaults\n\t\t * allow us to place images on the map before\n\t\t * they've finished downloading. */\n\t\tvar offset = latLngToCartesian(this._corners[0]),\n\t\t\tw = this._image.offsetWidth || 500,\n\t\t\th = this._image.offsetHeight || 375,\n\t\t\tc = [],\n\t\t\tj;\n\t\t/* Convert corners to container points (i.e. cartesian coordinates). */\n\t\tfor (j = 0; j < this._corners.length; j++) {\n\t\t\tc.push(latLngToCartesian(this._corners[j])._subtract(offset));\n\t\t}\n\n\t\t/*\n\t\t * This matrix describes the action of the CSS transform on each corner of the image.\n\t\t * It maps from the coordinate system centered at the upper left corner of the image\n\t\t *\t\t to the region bounded by the latlngs in this._corners.\n\t\t * For example:\n\t\t *\t\t 0, 0, c[0].x, c[0].y\n\t\t *\t\t says that the upper-left corner of the image maps to the first latlng in this._corners.\n\t\t */\n\t\treturn L.MatrixUtil.general2DProjection(\n\t\t\t0, 0, c[0].x, c[0].y,\n\t\t\tw, 0, c[1].x, c[1].y,\n\t\t\t0, h, c[2].x, c[2].y,\n\t\t\tw, h, c[3].x, c[3].y\n\t\t);\n\t}\n});\n","L.DistortableImage = L.DistortableImage || {};\n\nvar EditOverlayAction = LeafletToolbar.ToolbarAction.extend({\n\t\tinitialize: function(map, overlay, options) {\n\t\t\tthis._overlay = overlay;\n\t\t\tthis._map = map;\n\n\t\t\tLeafletToolbar.ToolbarAction.prototype.initialize.call(this, options);\n\t\t}\n\t}),\n\n\tToggleTransparency = EditOverlayAction.extend({\n\t\toptions: { toolbarIcon: {\n\t\t\thtml: '',\n\t\t\ttooltip: 'Toggle Image Transparency',\n\t\t\ttitle: 'Toggle Image Transparency'\n\t\t}},\n\n\t\taddHooks: function() {\n\t\t\tvar editing = this._overlay.editing;\n\n\t\t\tediting._toggleTransparency();\n\t\t\tthis.disable();\n\t\t}\n\t}),\n\n\tToggleOutline = EditOverlayAction.extend({\n\t\toptions: { toolbarIcon: {\n\t\t\thtml: '',\n\t\t\ttooltip: 'Toggle Image Outline',\n\t\t\ttitle: 'Toggle Image Outline'\n\t\t}},\n\n\t\taddHooks: function() {\n\t\t\tvar editing = this._overlay.editing;\n\n\t\t\tediting._toggleOutline();\n\t\t\tthis.disable();\n\t\t}\n\t}),\n\n\tRemoveOverlay = EditOverlayAction.extend({\n\t\toptions: { toolbarIcon: {\n\t\t\thtml: '',\n\t\t\ttooltip: 'Delete image',\n\t\t\ttitle: 'Delete image'\n\t\t}},\n\n\t\taddHooks: function() {\n\t\t\tvar map = this._map;\n\n\t\t\tmap.removeLayer(this._overlay);\n\t\t\tthis._overlay.fire('delete');\n\t\t\tthis.disable();\n\t\t}\n\t}),\n\n\tToggleEditable = EditOverlayAction.extend({\n\t\toptions: { toolbarIcon: {\n\t\t\thtml: '',\n\t\t\ttooltip: 'Lock / Unlock editing',\n\t\t\ttitle: 'Lock / Unlock editing'\n\t\t}},\n\n\t\taddHooks: function() {\n\t\t\tvar editing = this._overlay.editing;\n\n\t\t\tediting._toggleLock();\n\t\t\tthis.disable();\n\t\t}\n\t}),\n\n\tToggleRotateDistort = EditOverlayAction.extend({\n\t\tinitialize: function(map, overlay, options) {\n\t\t\tvar icon = overlay.editing._mode === 'rotate' ? 'image' : 'rotate-left';\n\n\t\t\toptions = options || {};\n\t\t\toptions.toolbarIcon = {\n\t\t\t\thtml: '',\n\t\t\t\ttooltip: 'Rotate',\n\t\t\t\ttitle: 'Rotate'\n\t\t\t};\n\n\t\t\tEditOverlayAction.prototype.initialize.call(this, map, overlay, options);\n\t\t},\n\n\t\taddHooks: function() {\n\t\t\tvar editing = this._overlay.editing;\n\n\t\t\tediting._toggleRotateDistort();\n\t\t\tthis.disable();\n\t\t}\n\t}),\n\n\n\tToggleExport = EditOverlayAction.extend({\n\t\toptions: {\n\t\t\ttoolbarIcon: {\n\t\t\t\thtml: '',\n\t\t\t\ttooltip: 'Export Image',\n\t\t\t\ttitle: 'Export Image'\n\t\t\t}\n\t\t},\n\n\t\taddHooks: function ()\n\t\t{\n\t\t\tvar editing = this._overlay.editing;\n\n\t\t\tediting._toggleExport();\n\t\t\tthis.disable();\n\t\t}\n\t}),\n\n\tToggleOrder = EditOverlayAction.extend({\n\t\toptions: {\n\t\t\ttoolbarIcon: {\n\t\t\t\thtml: '',\n\t\t\t\ttooltip: 'Change order',\n\t\t\t\ttitle: 'Toggle order'\n\t\t\t}\n\t\t},\n\n\t\taddHooks: function ()\n\t\t{\n\t\t\tvar editing = this._overlay.editing;\n\n\t\t\tediting._toggleOrder();\n\t\t\tthis.disable();\n\t\t}\n\t});\n\nL.DistortableImage.EditToolbar = LeafletToolbar.Popup.extend({\n\toptions: {\n\t\tactions: [\n\t\t\tToggleTransparency,\n\t\t\tRemoveOverlay,\n\t\t\tToggleOutline,\n\t\t\tToggleEditable,\n\t\t\tToggleRotateDistort,\n\t\t\tToggleExport,\n\t\t\tToggleOrder\n\t\t]\n\t}\n});\n","L.DistortableImage = L.DistortableImage || {};\n\nL.DistortableImage.Edit = L.Handler.extend({\n\toptions: {\n\t\topacity: 0.7,\n\t\toutline: '1px solid red',\n\t\tkeymap: {\n\t\t\t8: \"_removeOverlay\", // backspace windows / delete mac\n\t\t\t46: \"_removeOverlay\", // delete windows / delete + fn mac\n\t\t\t20: '_toggleRotate', // CAPS\n\t\t\t68: '_toggleRotateDistort', // d\n\t\t\t69: '_toggleIsolate', // e\n\t\t\t73: '_toggleIsolate', // i\n\t\t\t74: '_sendUp', // j\n\t\t\t75: '_sendDown', // k\n\t\t\t76: '_toggleLock', // l\n\t\t\t79: '_toggleOutline', // o\n\t\t\t82: '_toggleRotateDistort', // r\n\t\t\t83: '_toggleScale', // s\n\t\t\t84: '_toggleTransparency', // t\n\t\t}\n\t},\n\n\tinitialize: function(overlay) {\n\t\tthis._overlay = overlay;\n\t\tthis._toggledImage = false;\n\n\t\t/* Interaction modes. */\n\t\tthis._mode = this._overlay.options.mode || 'distort';\n\t\tthis._transparent = false;\n\t\tthis._outlined = false;\n\t},\n\n\t/* Run on image seletion. */\n\taddHooks: function() {\n\t\tvar overlay = this._overlay,\n\t\t\tmap = overlay._map,\n\t\t\ti;\n\n\t\tthis._lockHandles = new L.LayerGroup();\n\t\tfor (i = 0; i < 4; i++) {\n\t\t\tthis._lockHandles.addLayer(new L.LockHandle(overlay, i, { draggable: false }));\n\t\t}\n\n\t\tthis._distortHandles = new L.LayerGroup();\n\t\tfor (i = 0; i < 4; i++) {\n\t\t\tthis._distortHandles.addLayer(new L.DistortHandle(overlay, i));\n\t\t}\n\n\t\tthis._rotateHandles = new L.LayerGroup(); // handle includes rotate AND scale\n\t\tfor (i = 0; i < 4; i++) {\n\t\t\tthis._rotateHandles.addLayer(new L.RotateAndScaleHandle(overlay, i));\n\t\t}\n\n\t\tthis._scaleHandles = new L.LayerGroup();\n\t\tfor (i = 0; i < 4; i++) {\n\t\t\tthis._scaleHandles.addLayer(new L.ScaleHandle(overlay, i));\n\t\t}\n\n\t\tthis.__rotateHandles = new L.LayerGroup(); // individual rotate\n\t\tfor (i = 0; i < 4; i++) {\n\t\t\tthis.__rotateHandles.addLayer(new L.RotateHandle(overlay, i));\n\t\t}\n\n\t\tthis._handles = {\n\t\t\t'lock':\t\t this._lockHandles,\n\t\t\t'distort': this._distortHandles,\n\t\t\t'rotate':\tthis._rotateHandles,\n\t\t\t'scale': this._scaleHandles,\n\t\t\t'rotateStandalone': this.__rotateHandles\n\t\t};\n\n if (this._mode === 'lock') {\n\t\t\tmap.addLayer(this._lockHandles);\n\t\t} else {\n\t\t\tthis._mode = 'distort';\n\t\t\tmap.addLayer(this._distortHandles);\n\t\t\tthis._enableDragging();\n\t\t}\n\n\t\t//overlay.on('click', this._showToolbar, this);\n\t\tL.DomEvent.on(overlay._image, 'click', this._showToolbar, this);\n\n\t\t/* Enable hotkeys. */\n\t\tL.DomEvent.on(window, 'keydown', this._onKeyDown, this);\n\n\t\toverlay.fire('select');\n\n\t},\n\n\t/* Run on image deseletion. */\n\tremoveHooks: function() {\n\t\tvar overlay = this._overlay,\n\t\t\tmap = overlay._map;\n\n\t\t// L.DomEvent.off(window, 'keydown', this._onKeyDown, this);\n\n\t\tL.DomEvent.off(overlay._image, 'click', this._showToolbar, this);\n\n\t\t// First, check if dragging exists;\n\t\t// it may be off due to locking\n\t\tif (this.dragging) { this.dragging.disable(); }\n\t\tdelete this.dragging;\n\n\t\tmap.removeLayer(this._handles[this._mode]);\n\n \t\t/* Disable hotkeys. */\n\t\tL.DomEvent.off(window, 'keydown', this._onKeyDown, this);\n\n\t\toverlay.fire('deselect');\n },\n\n confirmDelete: function () {\n return window.confirm(\"Are you sure you want to delete?\");\n },\n\n\n\t_rotateBy: function(angle) {\n\t\tvar overlay = this._overlay,\n\t\t\tmap = overlay._map,\n\t\t\tcenter = map.latLngToLayerPoint(overlay.getCenter()),\n\t\t\ti, p, q;\n\n\t\tfor (i = 0; i < 4; i++) {\n\t\t\tp = map.latLngToLayerPoint(overlay._corners[i]).subtract(center);\n\t\t\tq = new L.Point(\n\t\t\t\tMath.cos(angle)*p.x - Math.sin(angle)*p.y,\n\t\t\t\tMath.sin(angle)*p.x + Math.cos(angle)*p.y\n\t\t\t);\n\t\t\toverlay._corners[i] = map.layerPointToLatLng(q.add(center));\n\t\t}\n\n\t\toverlay._reset();\n\t},\n\n\t_scaleBy: function(scale) {\n\t\tvar overlay = this._overlay,\n\t\t\tmap = overlay._map,\n\t\t\tcenter = map.latLngToLayerPoint(overlay.getCenter()),\n\t\t\ti, p;\n\n\t\tfor (i = 0; i < 4; i++) {\n\t\t\tp = map.latLngToLayerPoint(overlay._corners[i])\n\t\t\t\t.subtract(center)\n\t\t\t\t.multiplyBy(scale)\n\t\t\t\t.add(center);\n\t\t\toverlay._corners[i] = map.layerPointToLatLng(p);\n\t\t}\n\n\t\toverlay._reset();\n\t},\n\n\t_enableDragging: function() {\n\t\tvar overlay = this._overlay,\n\t\t\tmap = overlay._map;\n\n\t\tthis.dragging = new L.Draggable(overlay._image);\n\t\tthis.dragging.enable();\n\n\t\t/* Hide toolbars while dragging; click will re-show it */\n\t\tthis.dragging.on('dragstart', this._hideToolbar, this);\n\n\t\t/*\n\t\t * Adjust default behavior of L.Draggable.\n\t\t * By default, L.Draggable overwrites the CSS3 distort transform\n\t\t * that we want when it calls L.DomUtil.setPosition.\n\t\t */\n\t\tthis.dragging._updatePosition = function() {\n\t\t\tvar delta = this._newPos.subtract(map.latLngToLayerPoint(overlay._corners[0])),\n\t\t\t\tcurrentPoint, i;\n\n\t\t\tthis.fire('predrag');\n\n\t\t\tfor (i = 0; i < 4; i++) {\n\t\t\t\tcurrentPoint = map.latLngToLayerPoint(overlay._corners[i]);\n\t\t\t\toverlay._corners[i] = map.layerPointToLatLng(currentPoint.add(delta));\n\t\t\t}\n\t\t\toverlay._reset();\n\t\t\toverlay.fire('update');\n\n\t\t\tthis.fire('drag');\n\t\t};\n\t},\n\n\t_onKeyDown: function(event) {\n\t\tvar keymap = this.options.keymap,\n\t\t\thandlerName = keymap[event.which];\n\n\t\tif (handlerName !== undefined && this._overlay.options.suppressToolbar !== true) {\n\t\t\tthis[handlerName].call(this);\n\t\t}\n\t},\n\n\t_toggleRotateDistort: function() {\n\t\tvar map = this._overlay._map;\n\n\t\tmap.removeLayer(this._handles[this._mode]);\n\n\t\t/* Switch mode. */\n\t\tif (this._mode === 'rotate') { this._mode = 'distort'; }\n\t\telse { this._mode = 'rotate'; }\n\n\t\tmap.addLayer(this._handles[this._mode]);\n\t},\n\n\t_toggleScale: function() {\n\t\tvar map = this._overlay._map;\n\n\t\tmap.removeLayer(this._handles[this._mode]);\n\n\t\tthis._mode = 'scale';\n\n\t\tmap.addLayer(this._handles[this._mode]);\n\t},\n\n\t_toggleRotate: function() {\n\t\tvar map = this._overlay._map;\n\n\t\tmap.removeLayer(this._handles[this._mode]);\n\n\t\tthis._mode = 'rotateStandalone';\n\n\t\tmap.addLayer(this._handles[this._mode]);\n\t},\n\n\t_toggleTransparency: function() {\n\t\tvar image = this._overlay._image,\n\t\t\topacity;\n\n\t\tthis._transparent = !this._transparent;\n\t\topacity = this._transparent ? this.options.opacity : 1;\n\n\t\tL.DomUtil.setOpacity(image, opacity);\n\t\timage.setAttribute('opacity', opacity);\n\t},\n\n\t_toggleOutline: function() {\n\t\tvar image = this._overlay._image,\n\t\t\topacity, outline;\n\n\t\tthis._outlined = !this._outlined;\n\t\topacity = this._outlined ? this.options.opacity / 2 : 1;\n\t\toutline = this._outlined ? this.options.outline : 'none';\n\n\t\tL.DomUtil.setOpacity(image, opacity);\n\t\timage.setAttribute('opacity', opacity);\n\n\t\timage.style.outline = outline;\n\t},\n\n\t_sendUp: function() {\n\t\tthis._overlay.bringToFront();\n\t},\n\n\t_sendDown: function() {\n\t\tthis._overlay.bringToBack();\n\t},\n\n\t_toggleLock: function() {\n\t\tvar map = this._overlay._map;\n\n\t\tmap.removeLayer(this._handles[this._mode]);\n\t\t/* Switch mode. */\n\t\tif (this._mode === 'lock') {\n\t\t\tthis._mode = 'distort';\n\t\t\tthis._enableDragging();\n\t\t} else {\n\t\t\tthis._mode = 'lock';\n\t\t\tif (this.dragging) { this.dragging.disable(); }\n\t\t\tdelete this.dragging;\n\t\t}\n\n\t\tmap.addLayer(this._handles[this._mode]);\n\t},\n\n\t_hideToolbar: function() {\n\t\tvar map = this._overlay._map;\n\t\tif (this.toolbar) {\n\t\t\tmap.removeLayer(this.toolbar);\n\t\t\tthis.toolbar = false;\n\t\t}\n\t},\n\n\t_showToolbar: function(event) {\n\t\tvar overlay = this._overlay,\n target = event.target,\n\t\t\tmap = overlay._map;\n\n\t\t/* Ensure that there is only ever one toolbar attached to each image. */\n\t\tthis._hideToolbar();\n\t\tvar point;\n\t\tif (event.containerPoint) { point = event.containerPoint; }\n\t\telse { point = target._leaflet_pos; }\n\t\tvar raised_point = map.containerPointToLatLng(new L.Point(point.x,point.y-20));\n\t\traised_point.lng = overlay.getCenter().lng;\n\t\tif (this._overlay.options.suppressToolbar !== true) {\n\t\tthis.toolbar = new L.DistortableImage.EditToolbar(raised_point).addTo(map, overlay);\n\t\toverlay.fire('toolbar:created');\n\t\t}\n\n\t\tL.DomEvent.stopPropagation(event);\n },\n\n _removeOverlay: function () {\n var overlay = this._overlay;\n if (this._mode !== \"lock\") {\n var choice = this.confirmDelete();\n if (choice) {\n overlay._map.removeLayer(overlay);\n overlay.fire('delete');\n this.disable();\n }\n }\n },\n\n\t_toggleOrder: function () {\n\tif (this._toggledImage) {\n\t\tthis._overlay.bringToFront();\n\t\tthis._toggledImage = false;\n\t\t}\n\telse {\n\t\tthis._overlay.bringToBack();\n\t\tthis._toggledImage = true;\n\t\t}\n\t},\n\n\t// Based on https://github.com/publiclab/mapknitter/blob/8d94132c81b3040ae0d0b4627e685ff75275b416/app/assets/javascripts/mapknitter/Map.js#L47-L82\n\t_toggleExport: function (){\n\t\tvar map = this._overlay._map;\n\t\tvar overlay = this._overlay;\n\n\t\t// make a new image\n\t\tvar downloadable = new Image();\n\n\t\tdownloadable.id = downloadable.id || \"tempId12345\";\n\t\t$('body').append(downloadable);\n\n\t\tdownloadable.onload = function onLoadDownloadableImage() {\n\n\t\t\tvar height = downloadable.height,\n\t\t\t\twidth = downloadable.width,\n\t\t\t\tnw = map.latLngToLayerPoint(overlay._corners[0]),\n\t\t\t\tne = map.latLngToLayerPoint(overlay._corners[1]),\n\t\t\t\tsw = map.latLngToLayerPoint(overlay._corners[2]),\n\t\t\t\tse = map.latLngToLayerPoint(overlay._corners[3]);\n\n\t\t\t// I think this is to move the image to the upper left corner,\n\t\t\t// jywarren: i think we may need these or the image goes off the edge of the canvas\n // jywarren: but these seem to break the distortion math...\n\n\t\t\t// jywarren: i think it should be rejiggered so it\n\t\t\t// finds the most negative values of x and y and then\n\t\t\t// adds those to all coordinates\n\n\t\t\t//nw.x -= nw.x;\n\t\t\t//ne.x -= nw.x;\n\t\t\t//se.x -= nw.x;\n\t\t\t//sw.x -= nw.x;\n\n\t\t\t//nw.y -= nw.y;\n\t\t\t//ne.y -= nw.y;\n\t\t\t//se.y -= nw.y;\n\t\t\t//sw.y -= nw.y;\n\n\t\t\t// run once warping is complete\n \t\t\tdownloadable.onload = function() {\n\t\t\t\t$(downloadable).remove();\n\t\t\t};\n\n\t\t\tif (window && window.hasOwnProperty('warpWebGl')) {\n\t\t\t\twarpWebGl(\n\t\t\t\t\tdownloadable.id,\n\t\t\t\t\t[0, 0, width, 0, width, height, 0, height],\n\t\t\t\t\t[nw.x, nw.y, ne.x, ne.y, se.x, se.y, sw.x, sw.y],\n\t\t\t\t\ttrue // trigger download\n\t\t\t\t);\n\t\t\t}\n\n\t\t};\n\n\t\tdownloadable.src = overlay.options.fullResolutionSrc || overlay._image.src;\n\n\t},\n\n\ttoggleIsolate: function() {\n\t\t// this.isolated = !this.isolated;\n\t\t// if (this.isolated) {\n\t\t// \t$.each($L.images,function(i,img) {\n\t\t// \t\timg.hidden = false;\n\t\t// \t\timg.setOpacity(1);\n\t\t// \t});\n\t\t// } else {\n\t\t// \t$.each($L.images,function(i,img) {\n\t\t// \t\timg.hidden = true;\n\t\t// \t\timg.setOpacity(0);\n\t\t// \t});\n\t\t// }\n\t\t// this.hidden = false;\n\t\t// this.setOpacity(1);\n\t}\n\n});\n\nL.DistortableImageOverlay.addInitHook(function() {\n\tthis.editing = new L.DistortableImage.Edit(this);\n\n\tif (this.options.editable) {\n\t\tL.DomEvent.on(this._image, 'load', this.editing.enable, this.editing);\n\t}\n\n\tthis.on('remove', function () {\n\t\tif (this.editing) { this.editing.disable(); }\n\t});\n});\n","L.Map.mergeOptions({ boxSelector: true, boxZoom: false });\n\nL.Map.BoxSelectHandle = L.Map.BoxZoom.extend({\n\n initialize: function (map) {\n this._map = map;\n this._container = map._container;\n this._pane = map._panes.overlayPane;\n // this._resetStateTimeout = 0;\n // map.on('unload', this._destroy, this);\n },\n\n addHooks: function () {\n L.DomEvent.on(this._container, 'mousedown', this._onMouseDown, this);\n },\n\n removeHooks: function () {\n L.DomEvent.off(this._container, 'mousedown', this._onMouseDown, this);\n },\n\n // _destroy: function () {\n // L.DomUtil.remove(this._pane);\n // delete this._pane;\n // },\n\n _onMouseDown: function (e) {\n if (!e.shiftKey || ((e.which !== 1) && (e.button !== 1))) { return false; }\n\n L.DomUtil.disableTextSelection();\n L.DomUtil.disableImageDrag();\n\n this._startLayerPoint = this._map.mouseEventToLayerPoint(e);\n\n // this._startLayerPoint = this._map.mouseEventToLayerPoint(e);\n\n this._box = L.DomUtil.create('div', 'leaflet-zoom-box', this._pane);\n L.DomUtil.setPosition(this._box, this._startLayerPoint);\n\n this._container.style.cursor = 'crosshair';\n\n L.DomEvent\n .on(document, 'mousemove', this._onMouseMove, this)\n .on(document, 'mouseup', this._onMouseUp, this)\n .on(document, 'keydown', this._onKeyDown, this)\n .preventDefault(e);\n\n this._map.fire('boxzoomstart');\n },\n\n _onMouseMove: function (e) {\n var startPoint = this._startLayerPoint,\n box = this._box,\n\n layerPoint = this._map.mouseEventToLayerPoint(e),\n offset = layerPoint.subtract(startPoint),\n\n newPos = new L.Point(\n Math.min(layerPoint.x, startPoint.x),\n Math.min(layerPoint.y, startPoint.y));\n\n L.DomUtil.setPosition(box, newPos);\n\n box.style.width = (Math.max(0, Math.abs(offset.x) - 4)) + 'px';\n box.style.height = (Math.max(0, Math.abs(offset.y) - 4)) + 'px';\n },\n\n _onMouseUp: function (e) {\n if (!$(this._pane).children('.leaflet-zoom-box').length) { return false; }\n // window.e = e;\n var map = this._map,\n layerPoint = map.mouseEventToLayerPoint(e);\n\n if (this._startLayerPoint.equals(layerPoint)) { return; }\n\n var bounds = new L.LatLngBounds(\n map.layerPointToLatLng(this._startLayerPoint),\n map.layerPointToLatLng(layerPoint));\n\n window.bounds = bounds;\n window.box = this._box;\n window.pane = this._pane;\n window.map = map;\n window.container = this._container;\n\n map.fire('boxzoomend', {\n // boxBounds: bounds\n });\n\n let contents = $(this._pane).children();\n let images = contents.filter('img');\n // window.images = images;\n\n this._finish();\n console.log(images);\n return images;\n },\n\n _finish: function () {\n // if (!this._box) { return false; }\n // this._pane.removeChild(this._box);\n $(this._box).remove();\n this._container.style.cursor = '';\n\n L.DomUtil.enableTextSelection();\n L.DomUtil.enableImageDrag();\n\n L.DomEvent\n .off(document, 'mousemove', this._onMouseMove)\n .off(document, 'mouseup', this._onMouseUp)\n .off(document, 'keydown', this._onKeyDown);\n },\n\n // escape keybinding for getting rid of the selection box (alternative to mouse up). keep for now to see if it will become useful\n // in deselecting images\n _onKeyDown: function (e) {\n if (e.keyCode === 27) {\n this._finish();\n }\n }\n});\n\nL.Map.addInitHook('addHandler', 'boxSelector', L.Map.BoxSelectHandle);"]} \ No newline at end of file diff --git a/src/edit/BoxSelectHandle.js b/src/edit/BoxSelectHandle.js index 73633510f..c7cc0addc 100644 --- a/src/edit/BoxSelectHandle.js +++ b/src/edit/BoxSelectHandle.js @@ -2,21 +2,37 @@ L.Map.mergeOptions({ boxSelector: true, boxZoom: false }); L.Map.BoxSelectHandle = L.Map.BoxZoom.extend({ + initialize: function (map) { + this._map = map; + this._container = map._container; + this._pane = map._panes.overlayPane; + // this._resetStateTimeout = 0; + // map.on('unload', this._destroy, this); + }, + addHooks: function () { L.DomEvent.on(this._container, 'mousedown', this._onMouseDown, this); }, removeHooks: function () { - L.DomEvent.off(this._container, 'mousedown', this._onMouseDown); + L.DomEvent.off(this._container, 'mousedown', this._onMouseDown, this); }, + // _destroy: function () { + // L.DomUtil.remove(this._pane); + // delete this._pane; + // }, + _onMouseDown: function (e) { if (!e.shiftKey || ((e.which !== 1) && (e.button !== 1))) { return false; } L.DomUtil.disableTextSelection(); + L.DomUtil.disableImageDrag(); this._startLayerPoint = this._map.mouseEventToLayerPoint(e); + // this._startLayerPoint = this._map.mouseEventToLayerPoint(e); + this._box = L.DomUtil.create('div', 'leaflet-zoom-box', this._pane); L.DomUtil.setPosition(this._box, this._startLayerPoint); @@ -49,15 +65,22 @@ L.Map.BoxSelectHandle = L.Map.BoxZoom.extend({ }, _onMouseUp: function (e) { + if (!$(this._pane).children('.leaflet-zoom-box').length) { return false; } // window.e = e; var map = this._map, layerPoint = map.mouseEventToLayerPoint(e); if (this._startLayerPoint.equals(layerPoint)) { return; } - // var bounds = new L.LatLngBounds( - // map.layerPointToLatLng(this._startLayerPoint), - // map.layerPointToLatLng(layerPoint)); + var bounds = new L.LatLngBounds( + map.layerPointToLatLng(this._startLayerPoint), + map.layerPointToLatLng(layerPoint)); + + window.bounds = bounds; + window.box = this._box; + window.pane = this._pane; + window.map = map; + window.container = this._container; map.fire('boxzoomend', { // boxBounds: bounds @@ -68,15 +91,18 @@ L.Map.BoxSelectHandle = L.Map.BoxZoom.extend({ // window.images = images; this._finish(); - + console.log(images); return images; }, _finish: function () { - this._pane.removeChild(this._box); + // if (!this._box) { return false; } + // this._pane.removeChild(this._box); + $(this._box).remove(); this._container.style.cursor = ''; L.DomUtil.enableTextSelection(); + L.DomUtil.enableImageDrag(); L.DomEvent .off(document, 'mousemove', this._onMouseMove) From 2bde31d59ee0349208f863cb751fe8ce59ceb604 Mon Sep 17 00:00:00 2001 From: sashadev-sky Date: Mon, 11 Mar 2019 22:36:24 -0400 Subject: [PATCH 05/63] add to container --- dist/leaflet.distortableimage.js | 58 +++++++++++++++++++++------- dist/leaflet.distortableimage.js.map | 2 +- examples/select.html | 7 +++- src/DistortableImageOverlay.js | 22 +++++++++++ src/edit/BoxSelectHandle.js | 34 +++++++++------- 5 files changed, 93 insertions(+), 30 deletions(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index fdf6c9cdb..ad66275c9 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -551,11 +551,19 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ /* Copied from L.ImageOverlay */ this._map = map; + // this._div = $(this._pane).append($("
")); if (!this._image) { this._initImage(); } if (!this._events) { this._initEvents(); } map._panes.overlayPane.appendChild(this._image); + if (!this._divNode) { + this._divNode = document.createElement("div"); + // this._divNode = divNode; + this._divNode.setAttribute("id", "holding"); + map._panes.overlayPane.appendChild(this._divNode); + } + map.on('viewreset', this._reset, this); /* End copied from L.ImageOverlay */ @@ -602,6 +610,20 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ }); }, + setAnchors: function (anchors) { + this._anchors = []; + this._bounds = L.latLngBounds(anchors); + for (var i = 0, len = anchors.length; i < len; i++) { + var yx = anchors[i]; + this._anchors.push(L.latLng(yx)); + } + + if (this._map) { + this._reset(); + } + }, + + _addTool: function(tool) { this._toolArray.push(tool); L.DistortableImage.EditToolbar = LeafletToolbar.Popup.extend({ @@ -1256,7 +1278,7 @@ L.DistortableImage.Edit = L.Handler.extend({ } } }, - + // compare this to using overlay zIndex _toggleOrder: function () { if (this._toggledImage) { this._overlay.bringToFront(); @@ -1365,8 +1387,6 @@ L.Map.BoxSelectHandle = L.Map.BoxZoom.extend({ this._map = map; this._container = map._container; this._pane = map._panes.overlayPane; - // this._resetStateTimeout = 0; - // map.on('unload', this._destroy, this); }, addHooks: function () { @@ -1377,11 +1397,6 @@ L.Map.BoxSelectHandle = L.Map.BoxZoom.extend({ L.DomEvent.off(this._container, 'mousedown', this._onMouseDown, this); }, - // _destroy: function () { - // L.DomUtil.remove(this._pane); - // delete this._pane; - // }, - _onMouseDown: function (e) { if (!e.shiftKey || ((e.which !== 1) && (e.button !== 1))) { return false; } @@ -1390,8 +1405,6 @@ L.Map.BoxSelectHandle = L.Map.BoxZoom.extend({ this._startLayerPoint = this._map.mouseEventToLayerPoint(e); - // this._startLayerPoint = this._map.mouseEventToLayerPoint(e); - this._box = L.DomUtil.create('div', 'leaflet-zoom-box', this._pane); L.DomUtil.setPosition(this._box, this._startLayerPoint); @@ -1436,6 +1449,7 @@ L.Map.BoxSelectHandle = L.Map.BoxZoom.extend({ map.layerPointToLatLng(layerPoint)); window.bounds = bounds; + // window.div = this._div; window.box = this._box; window.pane = this._pane; window.map = map; @@ -1445,18 +1459,22 @@ L.Map.BoxSelectHandle = L.Map.BoxZoom.extend({ // boxBounds: bounds }); + + let contents = $(this._pane).children(); let images = contents.filter('img'); - // window.images = images; this._finish(); + + this._attach(images); + console.log(images); return images; }, _finish: function () { // if (!this._box) { return false; } - // this._pane.removeChild(this._box); + // this._pane.removeChild(this._box);[] $(this._box).remove(); this._container.style.cursor = ''; @@ -1469,13 +1487,25 @@ L.Map.BoxSelectHandle = L.Map.BoxZoom.extend({ .off(document, 'keydown', this._onKeyDown); }, + _attach: function(images) { + if ($('#holding')) { + this._imagesDiv = $('#holding'); + $(images).appendTo(this._imagesDiv); + window.imagesDiv = this._imagesDiv; + } + }, + // escape keybinding for getting rid of the selection box (alternative to mouse up). keep for now to see if it will become useful // in deselecting images _onKeyDown: function (e) { if (e.keyCode === 27) { - this._finish(); + if ($(this._pane).children('.leaflet-zoom-box').length) { + $(this._box).remove(); + } + // this._finish(); } - } + }, + }); L.Map.addInitHook('addHandler', 'boxSelector', L.Map.BoxSelectHandle); diff --git a/dist/leaflet.distortableimage.js.map b/dist/leaflet.distortableimage.js.map index e54b6d1fe..bef0e6403 100644 --- a/dist/leaflet.distortableimage.js.map +++ b/dist/leaflet.distortableimage.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/util/DomUtil.js","../src/util/Map._newLayerPointToLatLng.js","../src/util/MatrixUtil.js","../src/edit/EditHandle.js","../src/edit/LockHandle.js","../src/edit/DistortHandle.js","../src/edit/RotateAndScaleHandle.js","../src/edit/RotateHandle.js","../src/edit/ScaleHandle.js","../src/DistortableImageOverlay.js","../src/edit/DistortableImage.EditToolbar.js","../src/edit/DistortableImage.Edit.js","../src/edit/BoxSelectHandle.js"],"names":[],"mappings":"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","file":"leaflet.distortableimage.js","sourcesContent":["L.DomUtil = L.extend(L.DomUtil, {\n\tgetMatrixString: function(m) {\n\t\tvar is3d = L.Browser.webkit3d || L.Browser.gecko3d || L.Browser.ie3d,\n\n\t\t\t/* \n\t\t * Since matrix3d takes a 4*4 matrix, we add in an empty row and column, which act as the identity on the z-axis.\n\t\t * See:\n\t\t * http://franklinta.com/2014/09/08/computing-css-matrix3d-transforms/\n\t\t * https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function#M.C3.B6bius'_homogeneous_coordinates_in_projective_geometry\n\t\t */\n\t\t\tmatrix = [\n\t\t\t\tm[0], m[3], 0, m[6],\n\t\t\t\tm[1], m[4], 0, m[7],\n\t\t\t\t 0, 0, 1, 0,\n\t\t\t\tm[2], m[5], 0, m[8]\n\t\t\t],\n\n\t\t\tstr = is3d ? 'matrix3d(' + matrix.join(',') + ')' : '';\n\n\t\tif (!is3d) {\n\t\t\tconsole.log('Your browser must support 3D CSS transforms in order to use DistortableImageOverlay.');\n\t\t}\n\n\t\treturn str;\n\t},\n\n\tgetRotateString: function(angle, units) {\n\t\tvar is3d = L.Browser.webkit3d || L.Browser.gecko3d || L.Browser.ie3d,\n\t\t\topen = 'rotate' + (is3d ? '3d' : '') + '(',\n\t\t\trotateString = (is3d ? '0, 0, 1, ' : '') + angle + units;\n\t\t\t\n\t\treturn open + rotateString + ')';\n\t}\n});\n","L.Map.include({\n\t_newLayerPointToLatLng: function(point, newZoom, newCenter) {\n\t\tvar topLeft = L.Map.prototype._getNewTopLeftPoint.call(this, newCenter, newZoom)\n\t\t\t\t.add(L.Map.prototype._getMapPanePos.call(this));\n\t\treturn this.unproject(point.add(topLeft), newZoom);\n\t}\n});","L.MatrixUtil = {\n\n\t// Compute the adjugate of m\n\tadj: function(m) { \n\t\treturn [\n\t\t\tm[4]*m[8]-m[5]*m[7], m[2]*m[7]-m[1]*m[8], m[1]*m[5]-m[2]*m[4],\n\t\t\tm[5]*m[6]-m[3]*m[8], m[0]*m[8]-m[2]*m[6], m[2]*m[3]-m[0]*m[5],\n\t\t\tm[3]*m[7]-m[4]*m[6], m[1]*m[6]-m[0]*m[7], m[0]*m[4]-m[1]*m[3]\n\t\t];\n\t},\n\n\t// multiply two 3*3 matrices\n\tmultmm: function(a, b) { \n\t\tvar c = [],\n\t\t\ti;\n\n\t\tfor (i = 0; i < 3; i++) {\n\t\t\tfor (var j = 0; j < 3; j++) {\n\t\t\t\tvar cij = 0;\n\t\t\t\tfor (var k = 0; k < 3; k++) {\n\t\t\t\t\tcij += a[3*i + k]*b[3*k + j];\n\t\t\t\t}\n\t\t\t\tc[3*i + j] = cij;\n\t\t\t}\n\t\t}\n\t\treturn c;\n\t},\n\n\t// multiply a 3*3 matrix and a 3-vector\n\tmultmv: function(m, v) { \n\t\treturn [\n\t\t\tm[0]*v[0] + m[1]*v[1] + m[2]*v[2],\n\t\t\tm[3]*v[0] + m[4]*v[1] + m[5]*v[2],\n\t\t\tm[6]*v[0] + m[7]*v[1] + m[8]*v[2]\n\t\t];\n\t},\n\n\t// multiply a scalar and a 3*3 matrix\n\tmultsm: function(s, m) {\n\t\tvar matrix = [];\n\n\t\tfor (var i = 0, l = m.length; i < l; i++) {\n\t\t\tmatrix.push(s*m[i]);\n\t\t}\n\n\t\treturn matrix;\n\t},\n\n\tbasisToPoints: function(x1, y1, x2, y2, x3, y3, x4, y4) {\n\t\tvar m = [\n\t\t\t\tx1, x2, x3,\n\t\t\t\ty1, y2, y3,\n\t\t\t\t1, 1, 1\n\t\t\t],\n\t\t\tv = L.MatrixUtil.multmv(L.MatrixUtil.adj(m), [x4, y4, 1]);\n\n\t\treturn L.MatrixUtil.multmm(m, [\n\t\t\tv[0], 0, 0,\n\t\t\t0, v[1], 0,\n\t\t\t0, 0, v[2]\n\t\t]);\n\t},\n\n\n\tproject: function(m, x, y) {\n\t\tvar v = L.MatrixUtil.multmv(m, [x, y, 1]);\n\t\treturn [v[0]/v[2], v[1]/v[2]];\n\t},\n\n\tgeneral2DProjection: function(\n\tx1s, y1s, x1d, y1d,\n\tx2s, y2s, x2d, y2d,\n\tx3s, y3s, x3d, y3d,\n\tx4s, y4s, x4d, y4d\n\t) {\n\t\tvar s = L.MatrixUtil.basisToPoints(x1s, y1s, x2s, y2s, x3s, y3s, x4s, y4s),\n\t\t\td = L.MatrixUtil.basisToPoints(x1d, y1d, x2d, y2d, x3d, y3d, x4d, y4d),\n\t\t\tm = L.MatrixUtil.multmm(d, L.MatrixUtil.adj(s));\n\n\t\t/* \n\t\t *\tNormalize to the unique matrix with m[8] == 1. \n\t\t * \tSee: http://franklinta.com/2014/09/08/computing-css-matrix3d-transforms/\n\t\t */\n\t\treturn L.MatrixUtil.multsm(1/m[8], m);\n\t}\n};","L.EditHandle = L.Marker.extend({\n\tinitialize: function(overlay, corner, options) {\n\t\tvar markerOptions,\n\t\t\tlatlng = overlay._corners[corner];\n\n\t\tL.setOptions(this, options);\n\n\t\tthis._handled = overlay;\n\t\tthis._corner = corner;\n\n\t\tmarkerOptions = {\n\t\t\tdraggable: true,\n\t\t\tzIndexOffset: 10\n\t\t};\n\n\t\tif (options && options.hasOwnProperty('draggable')) {\n\t\t\tmarkerOptions.draggable = options.draggable;\n\t\t}\n\n\t\tL.Marker.prototype.initialize.call(this, latlng, markerOptions);\n\t},\n\n\tonAdd: function(map) {\n\t\tL.Marker.prototype.onAdd.call(this, map);\n\t\tthis._bindListeners();\n\n\t\tthis.updateHandle();\n\t},\n\n\tonRemove: function(map) {\n\t\tthis._unbindListeners();\n\t\tL.Marker.prototype.onRemove.call(this, map);\n\t},\n\n\t_onHandleDragStart: function() {\n\t\tthis._handled.fire('editstart');\n\t},\n\n\t_onHandleDragEnd: function() {\n\t\tthis._fireEdit();\n\t},\n\n\t_fireEdit: function() {\n\t\tthis._handled.edited = true;\n\t\tthis._handled.fire('edit');\n\t},\n\n\t_bindListeners: function() {\n\t\tthis.on({\n\t\t\t'dragstart': this._onHandleDragStart,\n\t\t\t'drag': this._onHandleDrag,\n\t\t\t'dragend': this._onHandleDragEnd\n\t\t}, this);\n\n\t\tthis._handled._map.on('zoomend', this.updateHandle, this);\n\n\t\tthis._handled.on('update', this.updateHandle, this);\n\t},\n\n\t_unbindListeners: function() {\n\t\tthis.off({\n\t\t\t'dragstart': this._onHandleDragStart,\n\t\t\t'drag': this._onHandleDrag,\n\t\t\t'dragend': this._onHandleDragEnd\n\t\t}, this);\n\n\t\tthis._handled._map.off('zoomend', this.updateHandle, this);\n\t\tthis._handled.off('update', this.updateHandle, this);\n\t}\n});\n","L.LockHandle = L.EditHandle.extend({\n\toptions: {\n\t\tTYPE: 'lock',\n\t\ticon: new L.Icon({ \n\t\t\ticonUrl: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAD8SURBVO3BPU7CYAAA0AdfjIcQlRCQBG7C3gk2uIPG2RC3Dk16Gz0FTO1WZs/gwGCMP/2+xsSl7+n1er1Iz9LtRQjaPeMeO+TinLDCJV78YqjdA04YodKuxhUaPGoRxMmxwRQZSt87Yo4KExGCeAUyLLFB4bMacxywEClIU2KDKXbInTUYo8JCgoFuGoxQO5uiwY1EA91VmDqrcKeDoX8WdNNgjApvmGGLXKIgXY0xGkxQYItrrFFIEKQ5Yo4KEx9yrDFDhlKkIF6NOQ5Y+KpAhiXWKEQI4pxwiwoLPyuxwQw75FoE7fZYocFEuwI7jHCBV39gL92TXq/Xi/AOcmczZmaIMScAAAAASUVORK5CYII=',\n\t\t\ticonSize: [32, 32],\n\t\t\ticonAnchor: [16, 16]}\n\t\t)\n\t},\n\n\t/* cannot be dragged */\n\t_onHandleDrag: function() {\n\t},\n\n\tupdateHandle: function() {\n\t\tthis.setLatLng(this._handled._corners[this._corner]);\n\t}\n\n});\n","L.DistortHandle = L.EditHandle.extend({\n\toptions: {\n\t\tTYPE: 'distort',\n\t\ticon: new L.Icon({\n\t\t\ticonUrl: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAChSURBVO3BIU4DURgGwNkvL2B6AkQTLBqP4QCoSm7DDXoBLBZHDbfgICAIZjEV3YTn9uVHdMZZtcnCfI13bIzxg0emg6Nm6QVbYz3jylEsXRrvwommb49X67jFkz80fR9Mb1YxTzqiWBSLYlEsikWxKBbFolgUi2JRLIpFsSgWxaJY03fHHOu40dH07bAzWCx9Ge/TiWbpHgdsjPGNB2f/yS+7xRCyiiZPJQAAAABJRU5ErkJggg==',\n\t\t\ticonSize: [32, 32],\n\t\t\ticonAnchor: [16, 16]}\n\t\t)\n\t},\n\n\tupdateHandle: function() {\n\t\tthis.setLatLng(this._handled._corners[this._corner]);\n\t},\n\n\t_onHandleDrag: function() {\n\t\tthis._handled._updateCorner(this._corner, this.getLatLng());\n\n\t\tthis._handled.fire('update');\n\t}\n});\n","L.RotateAndScaleHandle = L.EditHandle.extend({\n\toptions: {\n\t\tTYPE: 'rotate',\n\t\ticon: new L.Icon({\n\t\t\ticonUrl: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAHiSURBVMXBa3HbShgA0PMp/1sCCo8oCEpgTaCXgIXAJiDzyCJoAUTm4UVQAns1Y8+snWnTvJyeE16hkjDgDrfoNTMKcpC9UPiLSo8JyetkjEHxjPCMyoS199kFoz8Iv1HpMaN3qWDCHoegOKkkRwnJpRmroHgiPFEZ8IBekzEGxQtUEhKSS/fB7Ew4U+lxcGkVZG9QWWPSFAxBcdK59KApuA+yNwp2uEdx1GN25sZJZULSfAtm77SlbNjju6MvG75u+WHRWVR6rDVjMPsgwYyVZl3pLTpHkyYHOx8syMiayaJzlDTZ9YyaZNFVkiYH2ZUEBcVJJXVImuz6Js3Qofe59pq7DoOTILu+g+a288mCouk7/1iH4qTS+2QdDppbV1ZJmrnDXnPnc5UOs2Z0fUmTuyBr+krvSioJyUmQO0dZM7mepMkWnaNRkyrJB6uskTSjxY3Fll8bvmJwlDb83FJ8gMqAB80uyBY3Trb82PAfvjj6vuHnluIdKgMeNXOwctK5NKBoHitrb1RJeHRp5Ux4ojLg0aWMHGQvUOkxIWkKVsHsTPiNSo8HDC5lZIsgO6n0uMUdRvQuFQxB8UR4RmXC2vvsgtEfhL+o9JiQvE7GGBTPCK9QSUjoMWgKDthjDrIX+h/k0I7gth6N5gAAAABJRU5ErkJggg==',\n\t\t\ticonSize: [32, 32],\n\t\t\ticonAnchor: [16, 16]}\n\t\t)\n\t},\n\n\t_onHandleDrag: function() {\n\t\tvar overlay = this._handled,\n\t\t\tformerLatLng = this._handled._corners[this._corner],\n\t\t\tnewLatLng = this.getLatLng(),\n\n\t\t\tangle = this._calculateAngle(formerLatLng, newLatLng),\n\t\t\tscale = this._calculateScalingFactor(formerLatLng, newLatLng);\n\n\t\toverlay.editing._rotateBy(angle);\n\t\toverlay.editing._scaleBy(scale);\n\n\t\t/* \n\t\t checks whether the \"edgeMinWidth\" property is set and tracks the minimum edge length;\n\t\t this enables preventing scaling to zero, but we might also add an overall scale limit\n\t\t*/\t\t\n\t\tif (this._handled.options.hasOwnProperty('edgeMinWidth')){\n\t\t\tvar edgeMinWidth = this._handled.options.edgeMinWidth,\n\t\t\t w = L.latLng(overlay._corners[0]).distanceTo(overlay._corners[1]),\n\t\t\t h = L.latLng(overlay._corners[1]).distanceTo(overlay._corners[2]);\n\t\t\tif ((w > edgeMinWidth && h > edgeMinWidth) || scale > 1) {\n\t\t\t\toverlay.editing._scaleBy(scale);\n\t\t\t}\n\t\t} else {\n\t\t\toverlay.editing._scaleBy(scale);\n\t\t}\n\n\t\toverlay.fire('update');\n\t},\n\n\tupdateHandle: function() {\n\t\tthis.setLatLng(this._handled._corners[this._corner]);\n\t},\n\n\t/* Takes two latlngs and calculates the angle between them. */\n\t_calculateAngle: function(latlngA, latlngB) {\n\t\tvar map = this._handled._map,\n\n\t\t\tcenterPoint = map.latLngToLayerPoint(this._handled.getCenter()),\n\t\t\tformerPoint = map.latLngToLayerPoint(latlngA),\n\t\t\tnewPoint = map.latLngToLayerPoint(latlngB),\n\n\t\t\tinitialAngle = Math.atan2(centerPoint.y - formerPoint.y, centerPoint.x - formerPoint.x),\n\t\t\tnewAngle = Math.atan2(centerPoint.y - newPoint.y, centerPoint.x - newPoint.x);\n\n\t\treturn newAngle - initialAngle;\n\t},\n\n\t/* Takes two latlngs and calculates the scaling difference. */\n\t_calculateScalingFactor: function(latlngA, latlngB) {\n\t\tvar map = this._handled._map,\n\n\t\t\tcenterPoint = map.latLngToLayerPoint(this._handled.getCenter()),\n\t\t\tformerPoint = map.latLngToLayerPoint(latlngA),\n\t\t\tnewPoint = map.latLngToLayerPoint(latlngB),\n\n\t\t\tformerRadiusSquared = this._d2(centerPoint, formerPoint),\n\t\t\tnewRadiusSquared = this._d2(centerPoint, newPoint);\n\n\t\treturn Math.sqrt(newRadiusSquared / formerRadiusSquared);\n\t},\n\n\t/* Distance between two points in cartesian space, squared (distance formula). */\n\t_d2: function(a, b) {\n\t\tvar dx = a.x - b.x,\n\t\t\tdy = a.y - b.y;\n\n\t\treturn Math.pow(dx, 2) + Math.pow(dy, 2);\n\t}\n});\n","L.RotateHandle = L.EditHandle.extend({\n\toptions: {\n\t\tTYPE: 'rotate',\n\t\ticon: new L.Icon({\n\t\t\ticonUrl: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAHiSURBVMXBa3HbShgA0PMp/1sCCo8oCEpgTaCXgIXAJiDzyCJoAUTm4UVQAns1Y8+snWnTvJyeE16hkjDgDrfoNTMKcpC9UPiLSo8JyetkjEHxjPCMyoS199kFoz8Iv1HpMaN3qWDCHoegOKkkRwnJpRmroHgiPFEZ8IBekzEGxQtUEhKSS/fB7Ew4U+lxcGkVZG9QWWPSFAxBcdK59KApuA+yNwp2uEdx1GN25sZJZULSfAtm77SlbNjju6MvG75u+WHRWVR6rDVjMPsgwYyVZl3pLTpHkyYHOx8syMiayaJzlDTZ9YyaZNFVkiYH2ZUEBcVJJXVImuz6Js3Qofe59pq7DoOTILu+g+a288mCouk7/1iH4qTS+2QdDppbV1ZJmrnDXnPnc5UOs2Z0fUmTuyBr+krvSioJyUmQO0dZM7mepMkWnaNRkyrJB6uskTSjxY3Fll8bvmJwlDb83FJ8gMqAB80uyBY3Trb82PAfvjj6vuHnluIdKgMeNXOwctK5NKBoHitrb1RJeHRp5Ux4ojLg0aWMHGQvUOkxIWkKVsHsTPiNSo8HDC5lZIsgO6n0uMUdRvQuFQxB8UR4RmXC2vvsgtEfhL+o9JiQvE7GGBTPCK9QSUjoMWgKDthjDrIX+h/k0I7gth6N5gAAAABJRU5ErkJggg==',\n\t\t\ticonSize: [32, 32],\n\t\t\ticonAnchor: [16, 16]}\n\t\t)\n\t},\n\n\t_onHandleDrag: function() {\n\t\tvar overlay = this._handled,\n\t\t\tformerLatLng = this._handled._corners[this._corner],\n\t\t\tnewLatLng = this.getLatLng(),\n\n\t\t\tangle = this._calculateAngle(formerLatLng, newLatLng);\n\n\t\toverlay.editing._rotateBy(angle);\n\n\t\toverlay.fire('update');\n\t},\n\n\tupdateHandle: function() {\n\t\tthis.setLatLng(this._handled._corners[this._corner]);\n\t},\n\n\t/* Takes two latlngs and calculates the angle between them. */\n\t_calculateAngle: function(latlngA, latlngB) {\n\t\tvar map = this._handled._map,\n\n\t\t\tcenterPoint = map.latLngToLayerPoint(this._handled.getCenter()),\n\t\t\tformerPoint = map.latLngToLayerPoint(latlngA),\n\t\t\tnewPoint = map.latLngToLayerPoint(latlngB),\n\n\t\t\tinitialAngle = Math.atan2(centerPoint.y - formerPoint.y, centerPoint.x - formerPoint.x),\n\t\t\tnewAngle = Math.atan2(centerPoint.y - newPoint.y, centerPoint.x - newPoint.x);\n\n\t\treturn newAngle - initialAngle;\n\t},\n\n\t/* Takes two latlngs and calculates the scaling difference. */\n\t_calculateScalingFactor: function(latlngA, latlngB) {\n\t\tvar map = this._handled._map,\n\n\t\t\tcenterPoint = map.latLngToLayerPoint(this._handled.getCenter()),\n\t\t\tformerPoint = map.latLngToLayerPoint(latlngA),\n\t\t\tnewPoint = map.latLngToLayerPoint(latlngB),\n\n\t\t\tformerRadiusSquared = this._d2(centerPoint, formerPoint),\n\t\t\tnewRadiusSquared = this._d2(centerPoint, newPoint);\n\n\t\treturn Math.sqrt(newRadiusSquared / formerRadiusSquared);\n\t},\n\n\t/* Distance between two points in cartesian space, squared (distance formula). */\n\t_d2: function(a, b) {\n\t\tvar dx = a.x - b.x,\n\t\t\tdy = a.y - b.y;\n\n\t\treturn Math.pow(dx, 2) + Math.pow(dy, 2);\n\t}\n});\n","L.ScaleHandle = L.EditHandle.extend({\n\toptions: {\n\t\tTYPE: 'rotate',\n\t\ticon: new L.Icon({\n\t\t\ticonUrl:'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIHdpZHRoPSI0NTkiIGhlaWdodD0iNDY0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCA1MTIgNTEyIiB4bWw6c3BhY2U9InByZXNlcnZlIiBzdHlsZT0iIj48cmVjdCBpZD0iYmFja2dyb3VuZHJlY3QiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHg9IjAiIHk9IjAiIGZpbGw9Im5vbmUiIHN0cm9rZT0ibm9uZSIgY2xhc3M9IiIgc3R5bGU9IiIvPjxnIGNsYXNzPSJjdXJyZW50TGF5ZXIiIHN0eWxlPSIiPjx0aXRsZT5MYXllciAxPC90aXRsZT48cGF0aCBkPSJNNDU5LjA0OTE1OTUzMDQ3MTM0LDg2LjkyNjIzNDUxMjU1MDAyIFYwIGgtODUuNzE0NTczMzU2MzEyMDkgdjI3LjA0MzcxNzQwMzkwNDQ1MiBIODUuNzE0NTczMzU2MzEyMDMgVjAgSDAgdjg2LjkyNjIzNDUxMjU1MDAyIGgyNS43MTQzNzIwMDY4OTM2MjYgdjI4OS43NTQxMTUwNDE4MzM0IEgwIHY4Ni45MjYyMzQ1MTI1NTAwMiBoODUuNzE0NTczMzU2MzEyMDkgdi0yNy4wNDM3MTc0MDM5MDQ0NTIgaDI4NS43MTUyNDQ1MjEwNDAzIHYyNy4wNDM3MTc0MDM5MDQ0NTIgaDg1LjcxNDU3MzM1NjMxMjA5IHYtODYuOTI2MjM0NTEyNTUwMDIgaC0yMy44MDk2MDM3MTAwODY2OSBWODYuOTI2MjM0NTEyNTUwMDIgSDQ1OS4wNDkxNTk1MzA0NzEzNCB6TTM4NC43NjMxOTU5NTUwMDA5LDEyLjU1NjAxMTY1MTgxMjc4MSBoNjEuOTA0OTY5NjQ2MjI1Mzk2IHY2Mi43ODAwNTgyNTkwNjM5MSBoLTYxLjkwNDk2OTY0NjIyNTM5NiBWMTIuNTU2MDExNjUxODEyNzgxIHpNMTIuMzgwOTkzOTI5MjQ1MDUsMTIuNTU2MDExNjUxODEyNzgxIGg2MS45MDQ5Njk2NDYyMjUzOTYgdjYyLjc4MDA1ODI1OTA2MzkxIEgxMi4zODA5OTM5MjkyNDUwNSBWMTIuNTU2MDExNjUxODEyNzgxIHpNNzQuMjg1OTYzNTc1NDcwNTMsNDUxLjA1MDU3MjQxNTEyMDY2IEgxMi4zODA5OTM5MjkyNDUwNSB2LTYyLjc4MDA1ODI1OTA2MzkxIGg2MS45MDQ5Njk2NDYyMjUzOTYgVjQ1MS4wNTA1NzI0MTUxMjA2NiB6TTQ0NS43MTU3ODE0NTI4MjI3NCw0NTEuMDUwNTcyNDE1MTIwNjYgaC02Mi44NTczNTM3OTQ2Mjg4NjQgdi02Mi43ODAwNTgyNTkwNjM5MSBoNjIuODU3MzUzNzk0NjI4ODY0IFY0NTEuMDUwNTcyNDE1MTIwNjYgek00MDcuNjIwNDE1NTE2Njg0MjYsMzc2LjY4MDM0OTU1NDM4MzQ0IGgtMzYuMTkwNTk3NjM5MzMxNzcgdjMyLjgzODc5OTcwNDc0MTEyIEg4NS43MTQ1NzMzNTYzMTIwMyB2LTMyLjgzODc5OTcwNDc0MTEyIEg0OS41MjM5NzU3MTY5ODAzMiBWODYuOTI2MjM0NTEyNTUwMDIgaDM2LjE5MDU5NzYzOTMzMTc3IFY1MC4yMjQwNDY2MDcyNTExMjUgaDI4Ny42MjAwMTI4MTc4NDcyIHYzNi43MDIxODc5MDUyOTg5IGgzNC4yODU4MjkzNDI1MjQ4MzUgVjM3Ni42ODAzNDk1NTQzODM0NCB6IiBpZD0ic3ZnXzIiIGNsYXNzPSIiIGZpbGw9IiMxYTFhZWIiIGZpbGwtb3BhY2l0eT0iMSIvPjwvZz48L3N2Zz4=',\n\t\t\ticonSize: [32, 32],\n\t\t\ticonAnchor: [16, 16]}\n\t\t)\n\t},\n\n\t_onHandleDrag: function() {\n\t\tvar overlay = this._handled,\n\t\t\tformerLatLng = this._handled._corners[this._corner],\n\t\t\tnewLatLng = this.getLatLng(),\n\n\t\t\tscale = this._calculateScalingFactor(formerLatLng, newLatLng);\n\n\t\toverlay.editing._scaleBy(scale);\n\n\t\toverlay.fire('update');\n\t},\n\n\tupdateHandle: function() {\n\t\tthis.setLatLng(this._handled._corners[this._corner]);\n\t},\n\n\t/* Takes two latlngs and calculates the angle between them. */\n\t_calculateAngle: function(latlngA, latlngB) {\n\t\tvar map = this._handled._map,\n\n\t\t\tcenterPoint = map.latLngToLayerPoint(this._handled.getCenter()),\n\t\t\tformerPoint = map.latLngToLayerPoint(latlngA),\n\t\t\tnewPoint = map.latLngToLayerPoint(latlngB),\n\n\t\t\tinitialAngle = Math.atan2(centerPoint.y - formerPoint.y, centerPoint.x - formerPoint.x),\n\t\t\tnewAngle = Math.atan2(centerPoint.y - newPoint.y, centerPoint.x - newPoint.x);\n\n\t\treturn newAngle - initialAngle;\n\t},\n\n\t/* Takes two latlngs and calculates the scaling difference. */\n\t_calculateScalingFactor: function(latlngA, latlngB) {\n\t\tvar map = this._handled._map,\n\n\t\t\tcenterPoint = map.latLngToLayerPoint(this._handled.getCenter()),\n\t\t\tformerPoint = map.latLngToLayerPoint(latlngA),\n\t\t\tnewPoint = map.latLngToLayerPoint(latlngB),\n\n\t\t\tformerRadiusSquared = this._d2(centerPoint, formerPoint),\n\t\t\tnewRadiusSquared = this._d2(centerPoint, newPoint);\n\n\t\treturn Math.sqrt(newRadiusSquared / formerRadiusSquared);\n\t},\n\n\t/* Distance between two points in cartesian space, squared (distance formula). */\n\t_d2: function(a, b) {\n\t\tvar dx = a.x - b.x,\n\t\t\tdy = a.y - b.y;\n\n\t\treturn Math.pow(dx, 2) + Math.pow(dy, 2);\n\t}\n});\n","L.DistortableImageOverlay = L.ImageOverlay.extend({\n\tinclude: L.Mixin.Events,\n\n\toptions: {\n\t\talt: '',\n\t\theight: 200,\n\t\tcrossOrigin: true\n\t},\n\n\tinitialize: function(url, options) {\n\t\t\tthis._toolArray = L.DistortableImage.EditToolbarDefaults;\n\t\t\tthis._url = url;\n\t\t\tthis._rotation = this.options.rotation;\n\n\t\t\tL.setOptions(this, options);\n\t},\n\n\tonAdd: function(map) {\n\t\t/* Copied from L.ImageOverlay */\n\t\tthis._map = map;\n\n\t\tif (!this._image) { this._initImage(); }\n\t\tif (!this._events) { this._initEvents(); }\n\n\t\tmap._panes.overlayPane.appendChild(this._image);\n\n\t\tmap.on('viewreset', this._reset, this);\n\t\t/* End copied from L.ImageOverlay */\n\n\t\t/* Use provided corners if available */\n\t\tif (this.options.corners) {\n\t\t\tthis._corners = this.options.corners;\n\t\t\tif (map.options.zoomAnimation && L.Browser.any3d) {\n\t\t\t\tmap.on('zoomanim', this._animateZoom, this);\n\t\t\t}\n\n\t\t\t/* This reset happens before image load; it allows\n\t\t\t * us to place the image on the map earlier with\n\t\t\t * \"guessed\" dimensions. */\n\t\t\tthis._reset();\n\t\t}\n\n\t\t/* Have to wait for the image to load because\n\t\t * we need to access its width and height. */\n\t\tL.DomEvent.on(this._image, 'load', function() {\n\t\t\tthis._initImageDimensions();\n\t\t\tthis._reset();\n\t\t\t/* Initialize default corners if not already set */\n\t\t\tif (!this._corners) {\n\t\t\t\tif (map.options.zoomAnimation && L.Browser.any3d) {\n\t\t\t\t\tmap.on('zoomanim', this._animateZoom, this);\n\t\t\t\t}\n\t\t\t}\n\t\t}, this);\n\n\t\tthis.fire('add');\n\t},\n\n\tonRemove: function(map) {\n\t\tthis.fire('remove');\n\n\t\tL.ImageOverlay.prototype.onRemove.call(this, map);\n\t},\n\n\t_initImage: function () {\n\t\tL.ImageOverlay.prototype._initImage.call(this);\n\n\t\tL.extend(this._image, {\n\t\t\talt: this.options.alt\n\t\t});\n\t},\n\n\t_addTool: function(tool) {\n\t\tthis._toolArray.push(tool);\n\t\tL.DistortableImage.EditToolbar = LeafletToolbar.Popup.extend({\n\t\t\toptions: {\n\t\t\t\tactions: this._toolArray\n\t\t\t}\n\t\t});\n\t},\n\n\t_initImageDimensions: function() {\n\t\tvar map = this._map,\n\n\t\t\toriginalImageWidth = L.DomUtil.getStyle(this._image, 'width'),\n\t\t\toriginalImageHeight = L.DomUtil.getStyle(this._image, 'height'),\n\n\t\t\taspectRatio = parseInt(originalImageWidth) / parseInt(originalImageHeight),\n\n\t\t\timageHeight = this.options.height,\n\t\t\timageWidth = parseInt(aspectRatio*imageHeight),\n\n\t\t\tcenter = map.latLngToContainerPoint(map.getCenter()),\n\t\t\toffset = new L.Point(imageWidth, imageHeight).divideBy(2);\n\n\t\tif (this.options.corners) { this._corners = this.options.corners; }\n\t\telse {\n\t\t\tthis._corners = [\n\t\t\t\tmap.containerPointToLatLng(center.subtract(offset)),\n\t\t\t\tmap.containerPointToLatLng(center.add(new L.Point(offset.x, - offset.y))),\n\t\t\t\tmap.containerPointToLatLng(center.add(new L.Point(- offset.x, offset.y))),\n\t\t\t\tmap.containerPointToLatLng(center.add(offset))\n\t\t\t];\n\t\t}\n\t},\n\n \t_initEvents: function() {\n \t\tthis._events = [ 'click' ];\n\n \t\tfor (var i = 0, l = this._events.length; i < l; i++) {\n\t \t\tL.DomEvent.on(this._image, this._events[i], this._fireMouseEvent, this);\n \t\t}\n \t},\n\n \t/* See src/layer/vector/Path.SVG.js in the Leaflet source. */\n \t_fireMouseEvent: function(event) {\n \t\tif (!this.hasEventListeners(event.type)) { return; }\n\n\t\tvar map = this._map,\n\t\t\tcontainerPoint = map.mouseEventToContainerPoint(event),\n\t\t\tlayerPoint = map.containerPointToLayerPoint(containerPoint),\n\t\t\tlatlng = map.layerPointToLatLng(layerPoint);\n\n\t\tthis.fire(event.type, {\n\t\t\tlatlng: latlng,\n\t\t\tlayerPoint: layerPoint,\n\t\t\tcontainerPoint: containerPoint,\n\t\t\toriginalEvent: event\n\t\t});\n \t},\n\n\t_updateCorner: function(corner, latlng) {\n\t\tthis._corners[corner] = latlng;\n\t\tthis._reset();\n\t},\n\n\n\t/* Copied from Leaflet v0.7 https://github.com/Leaflet/Leaflet/blob/66282f14bcb180ec87d9818d9f3c9f75afd01b30/src/dom/DomUtil.js#L189-L199 */\n\t/* since L.DomUtil.getTranslateString() is deprecated in Leaflet v1.0 */\n\t_getTranslateString: function (point) {\n\t\t// on WebKit browsers (Chrome/Safari/iOS Safari/Android) using translate3d instead of translate\n\t\t// makes animation smoother as it ensures HW accel is used. Firefox 13 doesn't care\n\t\t// (same speed either way), Opera 12 doesn't support translate3d\n\n\t\tvar is3d = L.Browser.webkit3d,\n\t\t open = 'translate' + (is3d ? '3d' : '') + '(',\n\t\t close = (is3d ? ',0' : '') + ')';\n\n\t\treturn open + point.x + 'px,' + point.y + 'px' + close;\n\t},\n\n\t_reset: function() {\n\t\tvar map = this._map,\n\t\t\timage = this._image,\n\t\t\tlatLngToLayerPoint = L.bind(map.latLngToLayerPoint, map),\n\n\t\t\ttransformMatrix = this._calculateProjectiveTransform(latLngToLayerPoint),\n\t\t\ttopLeft = latLngToLayerPoint(this._corners[0]),\n\n\t\t\twarp = L.DomUtil.getMatrixString(transformMatrix),\n\t\t\ttranslation = this._getTranslateString(topLeft);\n\n\t\t/* See L.DomUtil.setPosition. Mainly for the purposes of L.Draggable. */\n\t\timage._leaflet_pos = topLeft;\n\n\t\timage.style[L.DomUtil.TRANSFORM] = [translation, warp].join(' ');\n\n\t\t/* Set origin to the upper-left corner rather than the center of the image, which is the default. */\n\t\timage.style[L.DomUtil.TRANSFORM + '-origin'] = \"0 0 0\";\n\t},\n\n\t/*\n\t * Calculates the transform string that will be correct *at the end* of zooming.\n\t * Leaflet then generates a CSS3 animation between the current transform and\n\t *\t\t future transform which makes the transition appear smooth.\n\t */\n\t_animateZoom: function(event) {\n\t\tvar map = this._map,\n\t\t\timage = this._image,\n\t\t\tlatLngToNewLayerPoint = function(latlng) {\n\t\t\t\treturn map._latLngToNewLayerPoint(latlng, event.zoom, event.center);\n\t\t\t},\n\n\t\t\ttransformMatrix = this._calculateProjectiveTransform(latLngToNewLayerPoint),\n\t\t\ttopLeft = latLngToNewLayerPoint(this._corners[0]),\n\n\t\t\twarp = L.DomUtil.getMatrixString(transformMatrix),\n\t\t\ttranslation = this._getTranslateString(topLeft);\n\n\t\t/* See L.DomUtil.setPosition. Mainly for the purposes of L.Draggable. */\n\t\timage._leaflet_pos = topLeft;\n\n\t\tif (!L.Browser.gecko) {\n\t\t\timage.style[L.DomUtil.TRANSFORM] = [translation, warp].join(' ');\n\t\t}\n\t},\n\n\tgetCorners: function() {\n\t\treturn this._corners;\n\t},\n\n\t/*\n\t * Calculates the centroid of the image.\n\t *\t\t See http://stackoverflow.com/questions/6149175/logical-question-given-corners-find-center-of-quadrilateral\n\t */\n\tgetCenter: function(ll2c, c2ll) {\n\t\tvar map = this._map,\n\t\t\tlatLngToCartesian = ll2c ? ll2c : map.latLngToLayerPoint,\n\t\t\tcartesianToLatLng = c2ll ? c2ll: map.layerPointToLatLng,\n\t\t\tnw = latLngToCartesian.call(map, this._corners[0]),\n\t\t\tne = latLngToCartesian.call(map, this._corners[1]),\n\t\t\tse = latLngToCartesian.call(map, this._corners[2]),\n\t\t\tsw = latLngToCartesian.call(map, this._corners[3]),\n\n\t\t\tnmid = nw.add(ne.subtract(nw).divideBy(2)),\n\t\t\tsmid = sw.add(se.subtract(sw).divideBy(2));\n\n\t\treturn cartesianToLatLng.call(map, nmid.add(smid.subtract(nmid).divideBy(2)));\n\t},\n\n\t_calculateProjectiveTransform: function(latLngToCartesian) {\n\t\t/* Setting reasonable but made-up image defaults\n\t\t * allow us to place images on the map before\n\t\t * they've finished downloading. */\n\t\tvar offset = latLngToCartesian(this._corners[0]),\n\t\t\tw = this._image.offsetWidth || 500,\n\t\t\th = this._image.offsetHeight || 375,\n\t\t\tc = [],\n\t\t\tj;\n\t\t/* Convert corners to container points (i.e. cartesian coordinates). */\n\t\tfor (j = 0; j < this._corners.length; j++) {\n\t\t\tc.push(latLngToCartesian(this._corners[j])._subtract(offset));\n\t\t}\n\n\t\t/*\n\t\t * This matrix describes the action of the CSS transform on each corner of the image.\n\t\t * It maps from the coordinate system centered at the upper left corner of the image\n\t\t *\t\t to the region bounded by the latlngs in this._corners.\n\t\t * For example:\n\t\t *\t\t 0, 0, c[0].x, c[0].y\n\t\t *\t\t says that the upper-left corner of the image maps to the first latlng in this._corners.\n\t\t */\n\t\treturn L.MatrixUtil.general2DProjection(\n\t\t\t0, 0, c[0].x, c[0].y,\n\t\t\tw, 0, c[1].x, c[1].y,\n\t\t\t0, h, c[2].x, c[2].y,\n\t\t\tw, h, c[3].x, c[3].y\n\t\t);\n\t}\n});\n","L.DistortableImage = L.DistortableImage || {};\n\nvar EditOverlayAction = LeafletToolbar.ToolbarAction.extend({\n\t\tinitialize: function(map, overlay, options) {\n\t\t\tthis._overlay = overlay;\n\t\t\tthis._map = map;\n\n\t\t\tLeafletToolbar.ToolbarAction.prototype.initialize.call(this, options);\n\t\t}\n\t}),\n\n\tToggleTransparency = EditOverlayAction.extend({\n\t\toptions: { toolbarIcon: {\n\t\t\thtml: '',\n\t\t\ttooltip: 'Toggle Image Transparency',\n\t\t\ttitle: 'Toggle Image Transparency'\n\t\t}},\n\n\t\taddHooks: function() {\n\t\t\tvar editing = this._overlay.editing;\n\n\t\t\tediting._toggleTransparency();\n\t\t\tthis.disable();\n\t\t}\n\t}),\n\n\tToggleOutline = EditOverlayAction.extend({\n\t\toptions: { toolbarIcon: {\n\t\t\thtml: '',\n\t\t\ttooltip: 'Toggle Image Outline',\n\t\t\ttitle: 'Toggle Image Outline'\n\t\t}},\n\n\t\taddHooks: function() {\n\t\t\tvar editing = this._overlay.editing;\n\n\t\t\tediting._toggleOutline();\n\t\t\tthis.disable();\n\t\t}\n\t}),\n\n\tRemoveOverlay = EditOverlayAction.extend({\n\t\toptions: { toolbarIcon: {\n\t\t\thtml: '',\n\t\t\ttooltip: 'Delete image',\n\t\t\ttitle: 'Delete image'\n\t\t}},\n\n\t\taddHooks: function() {\n\t\t\tvar map = this._map;\n\n\t\t\tmap.removeLayer(this._overlay);\n\t\t\tthis._overlay.fire('delete');\n\t\t\tthis.disable();\n\t\t}\n\t}),\n\n\tToggleEditable = EditOverlayAction.extend({\n\t\toptions: { toolbarIcon: {\n\t\t\thtml: '',\n\t\t\ttooltip: 'Lock / Unlock editing',\n\t\t\ttitle: 'Lock / Unlock editing'\n\t\t}},\n\n\t\taddHooks: function() {\n\t\t\tvar editing = this._overlay.editing;\n\n\t\t\tediting._toggleLock();\n\t\t\tthis.disable();\n\t\t}\n\t}),\n\n\tToggleRotateDistort = EditOverlayAction.extend({\n\t\tinitialize: function(map, overlay, options) {\n\t\t\tvar icon = overlay.editing._mode === 'rotate' ? 'image' : 'rotate-left';\n\n\t\t\toptions = options || {};\n\t\t\toptions.toolbarIcon = {\n\t\t\t\thtml: '',\n\t\t\t\ttooltip: 'Rotate',\n\t\t\t\ttitle: 'Rotate'\n\t\t\t};\n\n\t\t\tEditOverlayAction.prototype.initialize.call(this, map, overlay, options);\n\t\t},\n\n\t\taddHooks: function() {\n\t\t\tvar editing = this._overlay.editing;\n\n\t\t\tediting._toggleRotateDistort();\n\t\t\tthis.disable();\n\t\t}\n\t}),\n\n\n\tToggleExport = EditOverlayAction.extend({\n\t\toptions: {\n\t\t\ttoolbarIcon: {\n\t\t\t\thtml: '',\n\t\t\t\ttooltip: 'Export Image',\n\t\t\t\ttitle: 'Export Image'\n\t\t\t}\n\t\t},\n\n\t\taddHooks: function ()\n\t\t{\n\t\t\tvar editing = this._overlay.editing;\n\n\t\t\tediting._toggleExport();\n\t\t\tthis.disable();\n\t\t}\n\t}),\n\n\tToggleOrder = EditOverlayAction.extend({\n\t\toptions: {\n\t\t\ttoolbarIcon: {\n\t\t\t\thtml: '',\n\t\t\t\ttooltip: 'Change order',\n\t\t\t\ttitle: 'Toggle order'\n\t\t\t}\n\t\t},\n\n\t\taddHooks: function ()\n\t\t{\n\t\t\tvar editing = this._overlay.editing;\n\n\t\t\tediting._toggleOrder();\n\t\t\tthis.disable();\n\t\t}\n\t});\n\nL.DistortableImage.EditToolbar = LeafletToolbar.Popup.extend({\n\toptions: {\n\t\tactions: [\n\t\t\tToggleTransparency,\n\t\t\tRemoveOverlay,\n\t\t\tToggleOutline,\n\t\t\tToggleEditable,\n\t\t\tToggleRotateDistort,\n\t\t\tToggleExport,\n\t\t\tToggleOrder\n\t\t]\n\t}\n});\n","L.DistortableImage = L.DistortableImage || {};\n\nL.DistortableImage.Edit = L.Handler.extend({\n\toptions: {\n\t\topacity: 0.7,\n\t\toutline: '1px solid red',\n\t\tkeymap: {\n\t\t\t8: \"_removeOverlay\", // backspace windows / delete mac\n\t\t\t46: \"_removeOverlay\", // delete windows / delete + fn mac\n\t\t\t20: '_toggleRotate', // CAPS\n\t\t\t68: '_toggleRotateDistort', // d\n\t\t\t69: '_toggleIsolate', // e\n\t\t\t73: '_toggleIsolate', // i\n\t\t\t74: '_sendUp', // j\n\t\t\t75: '_sendDown', // k\n\t\t\t76: '_toggleLock', // l\n\t\t\t79: '_toggleOutline', // o\n\t\t\t82: '_toggleRotateDistort', // r\n\t\t\t83: '_toggleScale', // s\n\t\t\t84: '_toggleTransparency', // t\n\t\t}\n\t},\n\n\tinitialize: function(overlay) {\n\t\tthis._overlay = overlay;\n\t\tthis._toggledImage = false;\n\n\t\t/* Interaction modes. */\n\t\tthis._mode = this._overlay.options.mode || 'distort';\n\t\tthis._transparent = false;\n\t\tthis._outlined = false;\n\t},\n\n\t/* Run on image seletion. */\n\taddHooks: function() {\n\t\tvar overlay = this._overlay,\n\t\t\tmap = overlay._map,\n\t\t\ti;\n\n\t\tthis._lockHandles = new L.LayerGroup();\n\t\tfor (i = 0; i < 4; i++) {\n\t\t\tthis._lockHandles.addLayer(new L.LockHandle(overlay, i, { draggable: false }));\n\t\t}\n\n\t\tthis._distortHandles = new L.LayerGroup();\n\t\tfor (i = 0; i < 4; i++) {\n\t\t\tthis._distortHandles.addLayer(new L.DistortHandle(overlay, i));\n\t\t}\n\n\t\tthis._rotateHandles = new L.LayerGroup(); // handle includes rotate AND scale\n\t\tfor (i = 0; i < 4; i++) {\n\t\t\tthis._rotateHandles.addLayer(new L.RotateAndScaleHandle(overlay, i));\n\t\t}\n\n\t\tthis._scaleHandles = new L.LayerGroup();\n\t\tfor (i = 0; i < 4; i++) {\n\t\t\tthis._scaleHandles.addLayer(new L.ScaleHandle(overlay, i));\n\t\t}\n\n\t\tthis.__rotateHandles = new L.LayerGroup(); // individual rotate\n\t\tfor (i = 0; i < 4; i++) {\n\t\t\tthis.__rotateHandles.addLayer(new L.RotateHandle(overlay, i));\n\t\t}\n\n\t\tthis._handles = {\n\t\t\t'lock':\t\t this._lockHandles,\n\t\t\t'distort': this._distortHandles,\n\t\t\t'rotate':\tthis._rotateHandles,\n\t\t\t'scale': this._scaleHandles,\n\t\t\t'rotateStandalone': this.__rotateHandles\n\t\t};\n\n if (this._mode === 'lock') {\n\t\t\tmap.addLayer(this._lockHandles);\n\t\t} else {\n\t\t\tthis._mode = 'distort';\n\t\t\tmap.addLayer(this._distortHandles);\n\t\t\tthis._enableDragging();\n\t\t}\n\n\t\t//overlay.on('click', this._showToolbar, this);\n\t\tL.DomEvent.on(overlay._image, 'click', this._showToolbar, this);\n\n\t\t/* Enable hotkeys. */\n\t\tL.DomEvent.on(window, 'keydown', this._onKeyDown, this);\n\n\t\toverlay.fire('select');\n\n\t},\n\n\t/* Run on image deseletion. */\n\tremoveHooks: function() {\n\t\tvar overlay = this._overlay,\n\t\t\tmap = overlay._map;\n\n\t\t// L.DomEvent.off(window, 'keydown', this._onKeyDown, this);\n\n\t\tL.DomEvent.off(overlay._image, 'click', this._showToolbar, this);\n\n\t\t// First, check if dragging exists;\n\t\t// it may be off due to locking\n\t\tif (this.dragging) { this.dragging.disable(); }\n\t\tdelete this.dragging;\n\n\t\tmap.removeLayer(this._handles[this._mode]);\n\n \t\t/* Disable hotkeys. */\n\t\tL.DomEvent.off(window, 'keydown', this._onKeyDown, this);\n\n\t\toverlay.fire('deselect');\n },\n\n confirmDelete: function () {\n return window.confirm(\"Are you sure you want to delete?\");\n },\n\n\n\t_rotateBy: function(angle) {\n\t\tvar overlay = this._overlay,\n\t\t\tmap = overlay._map,\n\t\t\tcenter = map.latLngToLayerPoint(overlay.getCenter()),\n\t\t\ti, p, q;\n\n\t\tfor (i = 0; i < 4; i++) {\n\t\t\tp = map.latLngToLayerPoint(overlay._corners[i]).subtract(center);\n\t\t\tq = new L.Point(\n\t\t\t\tMath.cos(angle)*p.x - Math.sin(angle)*p.y,\n\t\t\t\tMath.sin(angle)*p.x + Math.cos(angle)*p.y\n\t\t\t);\n\t\t\toverlay._corners[i] = map.layerPointToLatLng(q.add(center));\n\t\t}\n\n\t\toverlay._reset();\n\t},\n\n\t_scaleBy: function(scale) {\n\t\tvar overlay = this._overlay,\n\t\t\tmap = overlay._map,\n\t\t\tcenter = map.latLngToLayerPoint(overlay.getCenter()),\n\t\t\ti, p;\n\n\t\tfor (i = 0; i < 4; i++) {\n\t\t\tp = map.latLngToLayerPoint(overlay._corners[i])\n\t\t\t\t.subtract(center)\n\t\t\t\t.multiplyBy(scale)\n\t\t\t\t.add(center);\n\t\t\toverlay._corners[i] = map.layerPointToLatLng(p);\n\t\t}\n\n\t\toverlay._reset();\n\t},\n\n\t_enableDragging: function() {\n\t\tvar overlay = this._overlay,\n\t\t\tmap = overlay._map;\n\n\t\tthis.dragging = new L.Draggable(overlay._image);\n\t\tthis.dragging.enable();\n\n\t\t/* Hide toolbars while dragging; click will re-show it */\n\t\tthis.dragging.on('dragstart', this._hideToolbar, this);\n\n\t\t/*\n\t\t * Adjust default behavior of L.Draggable.\n\t\t * By default, L.Draggable overwrites the CSS3 distort transform\n\t\t * that we want when it calls L.DomUtil.setPosition.\n\t\t */\n\t\tthis.dragging._updatePosition = function() {\n\t\t\tvar delta = this._newPos.subtract(map.latLngToLayerPoint(overlay._corners[0])),\n\t\t\t\tcurrentPoint, i;\n\n\t\t\tthis.fire('predrag');\n\n\t\t\tfor (i = 0; i < 4; i++) {\n\t\t\t\tcurrentPoint = map.latLngToLayerPoint(overlay._corners[i]);\n\t\t\t\toverlay._corners[i] = map.layerPointToLatLng(currentPoint.add(delta));\n\t\t\t}\n\t\t\toverlay._reset();\n\t\t\toverlay.fire('update');\n\n\t\t\tthis.fire('drag');\n\t\t};\n\t},\n\n\t_onKeyDown: function(event) {\n\t\tvar keymap = this.options.keymap,\n\t\t\thandlerName = keymap[event.which];\n\n\t\tif (handlerName !== undefined && this._overlay.options.suppressToolbar !== true) {\n\t\t\tthis[handlerName].call(this);\n\t\t}\n\t},\n\n\t_toggleRotateDistort: function() {\n\t\tvar map = this._overlay._map;\n\n\t\tmap.removeLayer(this._handles[this._mode]);\n\n\t\t/* Switch mode. */\n\t\tif (this._mode === 'rotate') { this._mode = 'distort'; }\n\t\telse { this._mode = 'rotate'; }\n\n\t\tmap.addLayer(this._handles[this._mode]);\n\t},\n\n\t_toggleScale: function() {\n\t\tvar map = this._overlay._map;\n\n\t\tmap.removeLayer(this._handles[this._mode]);\n\n\t\tthis._mode = 'scale';\n\n\t\tmap.addLayer(this._handles[this._mode]);\n\t},\n\n\t_toggleRotate: function() {\n\t\tvar map = this._overlay._map;\n\n\t\tmap.removeLayer(this._handles[this._mode]);\n\n\t\tthis._mode = 'rotateStandalone';\n\n\t\tmap.addLayer(this._handles[this._mode]);\n\t},\n\n\t_toggleTransparency: function() {\n\t\tvar image = this._overlay._image,\n\t\t\topacity;\n\n\t\tthis._transparent = !this._transparent;\n\t\topacity = this._transparent ? this.options.opacity : 1;\n\n\t\tL.DomUtil.setOpacity(image, opacity);\n\t\timage.setAttribute('opacity', opacity);\n\t},\n\n\t_toggleOutline: function() {\n\t\tvar image = this._overlay._image,\n\t\t\topacity, outline;\n\n\t\tthis._outlined = !this._outlined;\n\t\topacity = this._outlined ? this.options.opacity / 2 : 1;\n\t\toutline = this._outlined ? this.options.outline : 'none';\n\n\t\tL.DomUtil.setOpacity(image, opacity);\n\t\timage.setAttribute('opacity', opacity);\n\n\t\timage.style.outline = outline;\n\t},\n\n\t_sendUp: function() {\n\t\tthis._overlay.bringToFront();\n\t},\n\n\t_sendDown: function() {\n\t\tthis._overlay.bringToBack();\n\t},\n\n\t_toggleLock: function() {\n\t\tvar map = this._overlay._map;\n\n\t\tmap.removeLayer(this._handles[this._mode]);\n\t\t/* Switch mode. */\n\t\tif (this._mode === 'lock') {\n\t\t\tthis._mode = 'distort';\n\t\t\tthis._enableDragging();\n\t\t} else {\n\t\t\tthis._mode = 'lock';\n\t\t\tif (this.dragging) { this.dragging.disable(); }\n\t\t\tdelete this.dragging;\n\t\t}\n\n\t\tmap.addLayer(this._handles[this._mode]);\n\t},\n\n\t_hideToolbar: function() {\n\t\tvar map = this._overlay._map;\n\t\tif (this.toolbar) {\n\t\t\tmap.removeLayer(this.toolbar);\n\t\t\tthis.toolbar = false;\n\t\t}\n\t},\n\n\t_showToolbar: function(event) {\n\t\tvar overlay = this._overlay,\n target = event.target,\n\t\t\tmap = overlay._map;\n\n\t\t/* Ensure that there is only ever one toolbar attached to each image. */\n\t\tthis._hideToolbar();\n\t\tvar point;\n\t\tif (event.containerPoint) { point = event.containerPoint; }\n\t\telse { point = target._leaflet_pos; }\n\t\tvar raised_point = map.containerPointToLatLng(new L.Point(point.x,point.y-20));\n\t\traised_point.lng = overlay.getCenter().lng;\n\t\tif (this._overlay.options.suppressToolbar !== true) {\n\t\tthis.toolbar = new L.DistortableImage.EditToolbar(raised_point).addTo(map, overlay);\n\t\toverlay.fire('toolbar:created');\n\t\t}\n\n\t\tL.DomEvent.stopPropagation(event);\n },\n\n _removeOverlay: function () {\n var overlay = this._overlay;\n if (this._mode !== \"lock\") {\n var choice = this.confirmDelete();\n if (choice) {\n overlay._map.removeLayer(overlay);\n overlay.fire('delete');\n this.disable();\n }\n }\n },\n\n\t_toggleOrder: function () {\n\tif (this._toggledImage) {\n\t\tthis._overlay.bringToFront();\n\t\tthis._toggledImage = false;\n\t\t}\n\telse {\n\t\tthis._overlay.bringToBack();\n\t\tthis._toggledImage = true;\n\t\t}\n\t},\n\n\t// Based on https://github.com/publiclab/mapknitter/blob/8d94132c81b3040ae0d0b4627e685ff75275b416/app/assets/javascripts/mapknitter/Map.js#L47-L82\n\t_toggleExport: function (){\n\t\tvar map = this._overlay._map;\n\t\tvar overlay = this._overlay;\n\n\t\t// make a new image\n\t\tvar downloadable = new Image();\n\n\t\tdownloadable.id = downloadable.id || \"tempId12345\";\n\t\t$('body').append(downloadable);\n\n\t\tdownloadable.onload = function onLoadDownloadableImage() {\n\n\t\t\tvar height = downloadable.height,\n\t\t\t\twidth = downloadable.width,\n\t\t\t\tnw = map.latLngToLayerPoint(overlay._corners[0]),\n\t\t\t\tne = map.latLngToLayerPoint(overlay._corners[1]),\n\t\t\t\tsw = map.latLngToLayerPoint(overlay._corners[2]),\n\t\t\t\tse = map.latLngToLayerPoint(overlay._corners[3]);\n\n\t\t\t// I think this is to move the image to the upper left corner,\n\t\t\t// jywarren: i think we may need these or the image goes off the edge of the canvas\n // jywarren: but these seem to break the distortion math...\n\n\t\t\t// jywarren: i think it should be rejiggered so it\n\t\t\t// finds the most negative values of x and y and then\n\t\t\t// adds those to all coordinates\n\n\t\t\t//nw.x -= nw.x;\n\t\t\t//ne.x -= nw.x;\n\t\t\t//se.x -= nw.x;\n\t\t\t//sw.x -= nw.x;\n\n\t\t\t//nw.y -= nw.y;\n\t\t\t//ne.y -= nw.y;\n\t\t\t//se.y -= nw.y;\n\t\t\t//sw.y -= nw.y;\n\n\t\t\t// run once warping is complete\n \t\t\tdownloadable.onload = function() {\n\t\t\t\t$(downloadable).remove();\n\t\t\t};\n\n\t\t\tif (window && window.hasOwnProperty('warpWebGl')) {\n\t\t\t\twarpWebGl(\n\t\t\t\t\tdownloadable.id,\n\t\t\t\t\t[0, 0, width, 0, width, height, 0, height],\n\t\t\t\t\t[nw.x, nw.y, ne.x, ne.y, se.x, se.y, sw.x, sw.y],\n\t\t\t\t\ttrue // trigger download\n\t\t\t\t);\n\t\t\t}\n\n\t\t};\n\n\t\tdownloadable.src = overlay.options.fullResolutionSrc || overlay._image.src;\n\n\t},\n\n\ttoggleIsolate: function() {\n\t\t// this.isolated = !this.isolated;\n\t\t// if (this.isolated) {\n\t\t// \t$.each($L.images,function(i,img) {\n\t\t// \t\timg.hidden = false;\n\t\t// \t\timg.setOpacity(1);\n\t\t// \t});\n\t\t// } else {\n\t\t// \t$.each($L.images,function(i,img) {\n\t\t// \t\timg.hidden = true;\n\t\t// \t\timg.setOpacity(0);\n\t\t// \t});\n\t\t// }\n\t\t// this.hidden = false;\n\t\t// this.setOpacity(1);\n\t}\n\n});\n\nL.DistortableImageOverlay.addInitHook(function() {\n\tthis.editing = new L.DistortableImage.Edit(this);\n\n\tif (this.options.editable) {\n\t\tL.DomEvent.on(this._image, 'load', this.editing.enable, this.editing);\n\t}\n\n\tthis.on('remove', function () {\n\t\tif (this.editing) { this.editing.disable(); }\n\t});\n});\n","L.Map.mergeOptions({ boxSelector: true, boxZoom: false });\n\nL.Map.BoxSelectHandle = L.Map.BoxZoom.extend({\n\n initialize: function (map) {\n this._map = map;\n this._container = map._container;\n this._pane = map._panes.overlayPane;\n // this._resetStateTimeout = 0;\n // map.on('unload', this._destroy, this);\n },\n\n addHooks: function () {\n L.DomEvent.on(this._container, 'mousedown', this._onMouseDown, this);\n },\n\n removeHooks: function () {\n L.DomEvent.off(this._container, 'mousedown', this._onMouseDown, this);\n },\n\n // _destroy: function () {\n // L.DomUtil.remove(this._pane);\n // delete this._pane;\n // },\n\n _onMouseDown: function (e) {\n if (!e.shiftKey || ((e.which !== 1) && (e.button !== 1))) { return false; }\n\n L.DomUtil.disableTextSelection();\n L.DomUtil.disableImageDrag();\n\n this._startLayerPoint = this._map.mouseEventToLayerPoint(e);\n\n // this._startLayerPoint = this._map.mouseEventToLayerPoint(e);\n\n this._box = L.DomUtil.create('div', 'leaflet-zoom-box', this._pane);\n L.DomUtil.setPosition(this._box, this._startLayerPoint);\n\n this._container.style.cursor = 'crosshair';\n\n L.DomEvent\n .on(document, 'mousemove', this._onMouseMove, this)\n .on(document, 'mouseup', this._onMouseUp, this)\n .on(document, 'keydown', this._onKeyDown, this)\n .preventDefault(e);\n\n this._map.fire('boxzoomstart');\n },\n\n _onMouseMove: function (e) {\n var startPoint = this._startLayerPoint,\n box = this._box,\n\n layerPoint = this._map.mouseEventToLayerPoint(e),\n offset = layerPoint.subtract(startPoint),\n\n newPos = new L.Point(\n Math.min(layerPoint.x, startPoint.x),\n Math.min(layerPoint.y, startPoint.y));\n\n L.DomUtil.setPosition(box, newPos);\n\n box.style.width = (Math.max(0, Math.abs(offset.x) - 4)) + 'px';\n box.style.height = (Math.max(0, Math.abs(offset.y) - 4)) + 'px';\n },\n\n _onMouseUp: function (e) {\n if (!$(this._pane).children('.leaflet-zoom-box').length) { return false; }\n // window.e = e;\n var map = this._map,\n layerPoint = map.mouseEventToLayerPoint(e);\n\n if (this._startLayerPoint.equals(layerPoint)) { return; }\n\n var bounds = new L.LatLngBounds(\n map.layerPointToLatLng(this._startLayerPoint),\n map.layerPointToLatLng(layerPoint));\n\n window.bounds = bounds;\n window.box = this._box;\n window.pane = this._pane;\n window.map = map;\n window.container = this._container;\n\n map.fire('boxzoomend', {\n // boxBounds: bounds\n });\n\n let contents = $(this._pane).children();\n let images = contents.filter('img');\n // window.images = images;\n\n this._finish();\n console.log(images);\n return images;\n },\n\n _finish: function () {\n // if (!this._box) { return false; }\n // this._pane.removeChild(this._box);\n $(this._box).remove();\n this._container.style.cursor = '';\n\n L.DomUtil.enableTextSelection();\n L.DomUtil.enableImageDrag();\n\n L.DomEvent\n .off(document, 'mousemove', this._onMouseMove)\n .off(document, 'mouseup', this._onMouseUp)\n .off(document, 'keydown', this._onKeyDown);\n },\n\n // escape keybinding for getting rid of the selection box (alternative to mouse up). keep for now to see if it will become useful\n // in deselecting images\n _onKeyDown: function (e) {\n if (e.keyCode === 27) {\n this._finish();\n }\n }\n});\n\nL.Map.addInitHook('addHandler', 'boxSelector', L.Map.BoxSelectHandle);"]} \ No newline at end of file +{"version":3,"sources":["../src/util/DomUtil.js","../src/util/Map._newLayerPointToLatLng.js","../src/util/MatrixUtil.js","../src/edit/EditHandle.js","../src/edit/LockHandle.js","../src/edit/DistortHandle.js","../src/edit/RotateAndScaleHandle.js","../src/edit/RotateHandle.js","../src/edit/ScaleHandle.js","../src/DistortableImageOverlay.js","../src/edit/DistortableImage.EditToolbar.js","../src/edit/DistortableImage.Edit.js","../src/edit/BoxSelectHandle.js"],"names":[],"mappings":"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","file":"leaflet.distortableimage.js","sourcesContent":["L.DomUtil = L.extend(L.DomUtil, {\n\tgetMatrixString: function(m) {\n\t\tvar is3d = L.Browser.webkit3d || L.Browser.gecko3d || L.Browser.ie3d,\n\n\t\t\t/* \n\t\t * Since matrix3d takes a 4*4 matrix, we add in an empty row and column, which act as the identity on the z-axis.\n\t\t * See:\n\t\t * http://franklinta.com/2014/09/08/computing-css-matrix3d-transforms/\n\t\t * https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function#M.C3.B6bius'_homogeneous_coordinates_in_projective_geometry\n\t\t */\n\t\t\tmatrix = [\n\t\t\t\tm[0], m[3], 0, m[6],\n\t\t\t\tm[1], m[4], 0, m[7],\n\t\t\t\t 0, 0, 1, 0,\n\t\t\t\tm[2], m[5], 0, m[8]\n\t\t\t],\n\n\t\t\tstr = is3d ? 'matrix3d(' + matrix.join(',') + ')' : '';\n\n\t\tif (!is3d) {\n\t\t\tconsole.log('Your browser must support 3D CSS transforms in order to use DistortableImageOverlay.');\n\t\t}\n\n\t\treturn str;\n\t},\n\n\tgetRotateString: function(angle, units) {\n\t\tvar is3d = L.Browser.webkit3d || L.Browser.gecko3d || L.Browser.ie3d,\n\t\t\topen = 'rotate' + (is3d ? '3d' : '') + '(',\n\t\t\trotateString = (is3d ? '0, 0, 1, ' : '') + angle + units;\n\t\t\t\n\t\treturn open + rotateString + ')';\n\t}\n});\n","L.Map.include({\n\t_newLayerPointToLatLng: function(point, newZoom, newCenter) {\n\t\tvar topLeft = L.Map.prototype._getNewTopLeftPoint.call(this, newCenter, newZoom)\n\t\t\t\t.add(L.Map.prototype._getMapPanePos.call(this));\n\t\treturn this.unproject(point.add(topLeft), newZoom);\n\t}\n});","L.MatrixUtil = {\n\n\t// Compute the adjugate of m\n\tadj: function(m) { \n\t\treturn [\n\t\t\tm[4]*m[8]-m[5]*m[7], m[2]*m[7]-m[1]*m[8], m[1]*m[5]-m[2]*m[4],\n\t\t\tm[5]*m[6]-m[3]*m[8], m[0]*m[8]-m[2]*m[6], m[2]*m[3]-m[0]*m[5],\n\t\t\tm[3]*m[7]-m[4]*m[6], m[1]*m[6]-m[0]*m[7], m[0]*m[4]-m[1]*m[3]\n\t\t];\n\t},\n\n\t// multiply two 3*3 matrices\n\tmultmm: function(a, b) { \n\t\tvar c = [],\n\t\t\ti;\n\n\t\tfor (i = 0; i < 3; i++) {\n\t\t\tfor (var j = 0; j < 3; j++) {\n\t\t\t\tvar cij = 0;\n\t\t\t\tfor (var k = 0; k < 3; k++) {\n\t\t\t\t\tcij += a[3*i + k]*b[3*k + j];\n\t\t\t\t}\n\t\t\t\tc[3*i + j] = cij;\n\t\t\t}\n\t\t}\n\t\treturn c;\n\t},\n\n\t// multiply a 3*3 matrix and a 3-vector\n\tmultmv: function(m, v) { \n\t\treturn [\n\t\t\tm[0]*v[0] + m[1]*v[1] + m[2]*v[2],\n\t\t\tm[3]*v[0] + m[4]*v[1] + m[5]*v[2],\n\t\t\tm[6]*v[0] + m[7]*v[1] + m[8]*v[2]\n\t\t];\n\t},\n\n\t// multiply a scalar and a 3*3 matrix\n\tmultsm: function(s, m) {\n\t\tvar matrix = [];\n\n\t\tfor (var i = 0, l = m.length; i < l; i++) {\n\t\t\tmatrix.push(s*m[i]);\n\t\t}\n\n\t\treturn matrix;\n\t},\n\n\tbasisToPoints: function(x1, y1, x2, y2, x3, y3, x4, y4) {\n\t\tvar m = [\n\t\t\t\tx1, x2, x3,\n\t\t\t\ty1, y2, y3,\n\t\t\t\t1, 1, 1\n\t\t\t],\n\t\t\tv = L.MatrixUtil.multmv(L.MatrixUtil.adj(m), [x4, y4, 1]);\n\n\t\treturn L.MatrixUtil.multmm(m, [\n\t\t\tv[0], 0, 0,\n\t\t\t0, v[1], 0,\n\t\t\t0, 0, v[2]\n\t\t]);\n\t},\n\n\n\tproject: function(m, x, y) {\n\t\tvar v = L.MatrixUtil.multmv(m, [x, y, 1]);\n\t\treturn [v[0]/v[2], v[1]/v[2]];\n\t},\n\n\tgeneral2DProjection: function(\n\tx1s, y1s, x1d, y1d,\n\tx2s, y2s, x2d, y2d,\n\tx3s, y3s, x3d, y3d,\n\tx4s, y4s, x4d, y4d\n\t) {\n\t\tvar s = L.MatrixUtil.basisToPoints(x1s, y1s, x2s, y2s, x3s, y3s, x4s, y4s),\n\t\t\td = L.MatrixUtil.basisToPoints(x1d, y1d, x2d, y2d, x3d, y3d, x4d, y4d),\n\t\t\tm = L.MatrixUtil.multmm(d, L.MatrixUtil.adj(s));\n\n\t\t/* \n\t\t *\tNormalize to the unique matrix with m[8] == 1. \n\t\t * \tSee: http://franklinta.com/2014/09/08/computing-css-matrix3d-transforms/\n\t\t */\n\t\treturn L.MatrixUtil.multsm(1/m[8], m);\n\t}\n};","L.EditHandle = L.Marker.extend({\n\tinitialize: function(overlay, corner, options) {\n\t\tvar markerOptions,\n\t\t\tlatlng = overlay._corners[corner];\n\n\t\tL.setOptions(this, options);\n\n\t\tthis._handled = overlay;\n\t\tthis._corner = corner;\n\n\t\tmarkerOptions = {\n\t\t\tdraggable: true,\n\t\t\tzIndexOffset: 10\n\t\t};\n\n\t\tif (options && options.hasOwnProperty('draggable')) {\n\t\t\tmarkerOptions.draggable = options.draggable;\n\t\t}\n\n\t\tL.Marker.prototype.initialize.call(this, latlng, markerOptions);\n\t},\n\n\tonAdd: function(map) {\n\t\tL.Marker.prototype.onAdd.call(this, map);\n\t\tthis._bindListeners();\n\n\t\tthis.updateHandle();\n\t},\n\n\tonRemove: function(map) {\n\t\tthis._unbindListeners();\n\t\tL.Marker.prototype.onRemove.call(this, map);\n\t},\n\n\t_onHandleDragStart: function() {\n\t\tthis._handled.fire('editstart');\n\t},\n\n\t_onHandleDragEnd: function() {\n\t\tthis._fireEdit();\n\t},\n\n\t_fireEdit: function() {\n\t\tthis._handled.edited = true;\n\t\tthis._handled.fire('edit');\n\t},\n\n\t_bindListeners: function() {\n\t\tthis.on({\n\t\t\t'dragstart': this._onHandleDragStart,\n\t\t\t'drag': this._onHandleDrag,\n\t\t\t'dragend': this._onHandleDragEnd\n\t\t}, this);\n\n\t\tthis._handled._map.on('zoomend', this.updateHandle, this);\n\n\t\tthis._handled.on('update', this.updateHandle, this);\n\t},\n\n\t_unbindListeners: function() {\n\t\tthis.off({\n\t\t\t'dragstart': this._onHandleDragStart,\n\t\t\t'drag': this._onHandleDrag,\n\t\t\t'dragend': this._onHandleDragEnd\n\t\t}, this);\n\n\t\tthis._handled._map.off('zoomend', this.updateHandle, this);\n\t\tthis._handled.off('update', this.updateHandle, this);\n\t}\n});\n","L.LockHandle = L.EditHandle.extend({\n\toptions: {\n\t\tTYPE: 'lock',\n\t\ticon: new L.Icon({ \n\t\t\ticonUrl: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAD8SURBVO3BPU7CYAAA0AdfjIcQlRCQBG7C3gk2uIPG2RC3Dk16Gz0FTO1WZs/gwGCMP/2+xsSl7+n1er1Iz9LtRQjaPeMeO+TinLDCJV78YqjdA04YodKuxhUaPGoRxMmxwRQZSt87Yo4KExGCeAUyLLFB4bMacxywEClIU2KDKXbInTUYo8JCgoFuGoxQO5uiwY1EA91VmDqrcKeDoX8WdNNgjApvmGGLXKIgXY0xGkxQYItrrFFIEKQ5Yo4KEx9yrDFDhlKkIF6NOQ5Y+KpAhiXWKEQI4pxwiwoLPyuxwQw75FoE7fZYocFEuwI7jHCBV39gL92TXq/Xi/AOcmczZmaIMScAAAAASUVORK5CYII=',\n\t\t\ticonSize: [32, 32],\n\t\t\ticonAnchor: [16, 16]}\n\t\t)\n\t},\n\n\t/* cannot be dragged */\n\t_onHandleDrag: function() {\n\t},\n\n\tupdateHandle: function() {\n\t\tthis.setLatLng(this._handled._corners[this._corner]);\n\t}\n\n});\n","L.DistortHandle = L.EditHandle.extend({\n\toptions: {\n\t\tTYPE: 'distort',\n\t\ticon: new L.Icon({\n\t\t\ticonUrl: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAChSURBVO3BIU4DURgGwNkvL2B6AkQTLBqP4QCoSm7DDXoBLBZHDbfgICAIZjEV3YTn9uVHdMZZtcnCfI13bIzxg0emg6Nm6QVbYz3jylEsXRrvwommb49X67jFkz80fR9Mb1YxTzqiWBSLYlEsikWxKBbFolgUi2JRLIpFsSgWxaJY03fHHOu40dH07bAzWCx9Ge/TiWbpHgdsjPGNB2f/yS+7xRCyiiZPJQAAAABJRU5ErkJggg==',\n\t\t\ticonSize: [32, 32],\n\t\t\ticonAnchor: [16, 16]}\n\t\t)\n\t},\n\n\tupdateHandle: function() {\n\t\tthis.setLatLng(this._handled._corners[this._corner]);\n\t},\n\n\t_onHandleDrag: function() {\n\t\tthis._handled._updateCorner(this._corner, this.getLatLng());\n\n\t\tthis._handled.fire('update');\n\t}\n});\n","L.RotateAndScaleHandle = L.EditHandle.extend({\n\toptions: {\n\t\tTYPE: 'rotate',\n\t\ticon: new L.Icon({\n\t\t\ticonUrl: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAHiSURBVMXBa3HbShgA0PMp/1sCCo8oCEpgTaCXgIXAJiDzyCJoAUTm4UVQAns1Y8+snWnTvJyeE16hkjDgDrfoNTMKcpC9UPiLSo8JyetkjEHxjPCMyoS199kFoz8Iv1HpMaN3qWDCHoegOKkkRwnJpRmroHgiPFEZ8IBekzEGxQtUEhKSS/fB7Ew4U+lxcGkVZG9QWWPSFAxBcdK59KApuA+yNwp2uEdx1GN25sZJZULSfAtm77SlbNjju6MvG75u+WHRWVR6rDVjMPsgwYyVZl3pLTpHkyYHOx8syMiayaJzlDTZ9YyaZNFVkiYH2ZUEBcVJJXVImuz6Js3Qofe59pq7DoOTILu+g+a288mCouk7/1iH4qTS+2QdDppbV1ZJmrnDXnPnc5UOs2Z0fUmTuyBr+krvSioJyUmQO0dZM7mepMkWnaNRkyrJB6uskTSjxY3Fll8bvmJwlDb83FJ8gMqAB80uyBY3Trb82PAfvjj6vuHnluIdKgMeNXOwctK5NKBoHitrb1RJeHRp5Ux4ojLg0aWMHGQvUOkxIWkKVsHsTPiNSo8HDC5lZIsgO6n0uMUdRvQuFQxB8UR4RmXC2vvsgtEfhL+o9JiQvE7GGBTPCK9QSUjoMWgKDthjDrIX+h/k0I7gth6N5gAAAABJRU5ErkJggg==',\n\t\t\ticonSize: [32, 32],\n\t\t\ticonAnchor: [16, 16]}\n\t\t)\n\t},\n\n\t_onHandleDrag: function() {\n\t\tvar overlay = this._handled,\n\t\t\tformerLatLng = this._handled._corners[this._corner],\n\t\t\tnewLatLng = this.getLatLng(),\n\n\t\t\tangle = this._calculateAngle(formerLatLng, newLatLng),\n\t\t\tscale = this._calculateScalingFactor(formerLatLng, newLatLng);\n\n\t\toverlay.editing._rotateBy(angle);\n\t\toverlay.editing._scaleBy(scale);\n\n\t\t/* \n\t\t checks whether the \"edgeMinWidth\" property is set and tracks the minimum edge length;\n\t\t this enables preventing scaling to zero, but we might also add an overall scale limit\n\t\t*/\t\t\n\t\tif (this._handled.options.hasOwnProperty('edgeMinWidth')){\n\t\t\tvar edgeMinWidth = this._handled.options.edgeMinWidth,\n\t\t\t w = L.latLng(overlay._corners[0]).distanceTo(overlay._corners[1]),\n\t\t\t h = L.latLng(overlay._corners[1]).distanceTo(overlay._corners[2]);\n\t\t\tif ((w > edgeMinWidth && h > edgeMinWidth) || scale > 1) {\n\t\t\t\toverlay.editing._scaleBy(scale);\n\t\t\t}\n\t\t} else {\n\t\t\toverlay.editing._scaleBy(scale);\n\t\t}\n\n\t\toverlay.fire('update');\n\t},\n\n\tupdateHandle: function() {\n\t\tthis.setLatLng(this._handled._corners[this._corner]);\n\t},\n\n\t/* Takes two latlngs and calculates the angle between them. */\n\t_calculateAngle: function(latlngA, latlngB) {\n\t\tvar map = this._handled._map,\n\n\t\t\tcenterPoint = map.latLngToLayerPoint(this._handled.getCenter()),\n\t\t\tformerPoint = map.latLngToLayerPoint(latlngA),\n\t\t\tnewPoint = map.latLngToLayerPoint(latlngB),\n\n\t\t\tinitialAngle = Math.atan2(centerPoint.y - formerPoint.y, centerPoint.x - formerPoint.x),\n\t\t\tnewAngle = Math.atan2(centerPoint.y - newPoint.y, centerPoint.x - newPoint.x);\n\n\t\treturn newAngle - initialAngle;\n\t},\n\n\t/* Takes two latlngs and calculates the scaling difference. */\n\t_calculateScalingFactor: function(latlngA, latlngB) {\n\t\tvar map = this._handled._map,\n\n\t\t\tcenterPoint = map.latLngToLayerPoint(this._handled.getCenter()),\n\t\t\tformerPoint = map.latLngToLayerPoint(latlngA),\n\t\t\tnewPoint = map.latLngToLayerPoint(latlngB),\n\n\t\t\tformerRadiusSquared = this._d2(centerPoint, formerPoint),\n\t\t\tnewRadiusSquared = this._d2(centerPoint, newPoint);\n\n\t\treturn Math.sqrt(newRadiusSquared / formerRadiusSquared);\n\t},\n\n\t/* Distance between two points in cartesian space, squared (distance formula). */\n\t_d2: function(a, b) {\n\t\tvar dx = a.x - b.x,\n\t\t\tdy = a.y - b.y;\n\n\t\treturn Math.pow(dx, 2) + Math.pow(dy, 2);\n\t}\n});\n","L.RotateHandle = L.EditHandle.extend({\n\toptions: {\n\t\tTYPE: 'rotate',\n\t\ticon: new L.Icon({\n\t\t\ticonUrl: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAHiSURBVMXBa3HbShgA0PMp/1sCCo8oCEpgTaCXgIXAJiDzyCJoAUTm4UVQAns1Y8+snWnTvJyeE16hkjDgDrfoNTMKcpC9UPiLSo8JyetkjEHxjPCMyoS199kFoz8Iv1HpMaN3qWDCHoegOKkkRwnJpRmroHgiPFEZ8IBekzEGxQtUEhKSS/fB7Ew4U+lxcGkVZG9QWWPSFAxBcdK59KApuA+yNwp2uEdx1GN25sZJZULSfAtm77SlbNjju6MvG75u+WHRWVR6rDVjMPsgwYyVZl3pLTpHkyYHOx8syMiayaJzlDTZ9YyaZNFVkiYH2ZUEBcVJJXVImuz6Js3Qofe59pq7DoOTILu+g+a288mCouk7/1iH4qTS+2QdDppbV1ZJmrnDXnPnc5UOs2Z0fUmTuyBr+krvSioJyUmQO0dZM7mepMkWnaNRkyrJB6uskTSjxY3Fll8bvmJwlDb83FJ8gMqAB80uyBY3Trb82PAfvjj6vuHnluIdKgMeNXOwctK5NKBoHitrb1RJeHRp5Ux4ojLg0aWMHGQvUOkxIWkKVsHsTPiNSo8HDC5lZIsgO6n0uMUdRvQuFQxB8UR4RmXC2vvsgtEfhL+o9JiQvE7GGBTPCK9QSUjoMWgKDthjDrIX+h/k0I7gth6N5gAAAABJRU5ErkJggg==',\n\t\t\ticonSize: [32, 32],\n\t\t\ticonAnchor: [16, 16]}\n\t\t)\n\t},\n\n\t_onHandleDrag: function() {\n\t\tvar overlay = this._handled,\n\t\t\tformerLatLng = this._handled._corners[this._corner],\n\t\t\tnewLatLng = this.getLatLng(),\n\n\t\t\tangle = this._calculateAngle(formerLatLng, newLatLng);\n\n\t\toverlay.editing._rotateBy(angle);\n\n\t\toverlay.fire('update');\n\t},\n\n\tupdateHandle: function() {\n\t\tthis.setLatLng(this._handled._corners[this._corner]);\n\t},\n\n\t/* Takes two latlngs and calculates the angle between them. */\n\t_calculateAngle: function(latlngA, latlngB) {\n\t\tvar map = this._handled._map,\n\n\t\t\tcenterPoint = map.latLngToLayerPoint(this._handled.getCenter()),\n\t\t\tformerPoint = map.latLngToLayerPoint(latlngA),\n\t\t\tnewPoint = map.latLngToLayerPoint(latlngB),\n\n\t\t\tinitialAngle = Math.atan2(centerPoint.y - formerPoint.y, centerPoint.x - formerPoint.x),\n\t\t\tnewAngle = Math.atan2(centerPoint.y - newPoint.y, centerPoint.x - newPoint.x);\n\n\t\treturn newAngle - initialAngle;\n\t},\n\n\t/* Takes two latlngs and calculates the scaling difference. */\n\t_calculateScalingFactor: function(latlngA, latlngB) {\n\t\tvar map = this._handled._map,\n\n\t\t\tcenterPoint = map.latLngToLayerPoint(this._handled.getCenter()),\n\t\t\tformerPoint = map.latLngToLayerPoint(latlngA),\n\t\t\tnewPoint = map.latLngToLayerPoint(latlngB),\n\n\t\t\tformerRadiusSquared = this._d2(centerPoint, formerPoint),\n\t\t\tnewRadiusSquared = this._d2(centerPoint, newPoint);\n\n\t\treturn Math.sqrt(newRadiusSquared / formerRadiusSquared);\n\t},\n\n\t/* Distance between two points in cartesian space, squared (distance formula). */\n\t_d2: function(a, b) {\n\t\tvar dx = a.x - b.x,\n\t\t\tdy = a.y - b.y;\n\n\t\treturn Math.pow(dx, 2) + Math.pow(dy, 2);\n\t}\n});\n","L.ScaleHandle = L.EditHandle.extend({\n\toptions: {\n\t\tTYPE: 'rotate',\n\t\ticon: new L.Icon({\n\t\t\ticonUrl:'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIHdpZHRoPSI0NTkiIGhlaWdodD0iNDY0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCA1MTIgNTEyIiB4bWw6c3BhY2U9InByZXNlcnZlIiBzdHlsZT0iIj48cmVjdCBpZD0iYmFja2dyb3VuZHJlY3QiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHg9IjAiIHk9IjAiIGZpbGw9Im5vbmUiIHN0cm9rZT0ibm9uZSIgY2xhc3M9IiIgc3R5bGU9IiIvPjxnIGNsYXNzPSJjdXJyZW50TGF5ZXIiIHN0eWxlPSIiPjx0aXRsZT5MYXllciAxPC90aXRsZT48cGF0aCBkPSJNNDU5LjA0OTE1OTUzMDQ3MTM0LDg2LjkyNjIzNDUxMjU1MDAyIFYwIGgtODUuNzE0NTczMzU2MzEyMDkgdjI3LjA0MzcxNzQwMzkwNDQ1MiBIODUuNzE0NTczMzU2MzEyMDMgVjAgSDAgdjg2LjkyNjIzNDUxMjU1MDAyIGgyNS43MTQzNzIwMDY4OTM2MjYgdjI4OS43NTQxMTUwNDE4MzM0IEgwIHY4Ni45MjYyMzQ1MTI1NTAwMiBoODUuNzE0NTczMzU2MzEyMDkgdi0yNy4wNDM3MTc0MDM5MDQ0NTIgaDI4NS43MTUyNDQ1MjEwNDAzIHYyNy4wNDM3MTc0MDM5MDQ0NTIgaDg1LjcxNDU3MzM1NjMxMjA5IHYtODYuOTI2MjM0NTEyNTUwMDIgaC0yMy44MDk2MDM3MTAwODY2OSBWODYuOTI2MjM0NTEyNTUwMDIgSDQ1OS4wNDkxNTk1MzA0NzEzNCB6TTM4NC43NjMxOTU5NTUwMDA5LDEyLjU1NjAxMTY1MTgxMjc4MSBoNjEuOTA0OTY5NjQ2MjI1Mzk2IHY2Mi43ODAwNTgyNTkwNjM5MSBoLTYxLjkwNDk2OTY0NjIyNTM5NiBWMTIuNTU2MDExNjUxODEyNzgxIHpNMTIuMzgwOTkzOTI5MjQ1MDUsMTIuNTU2MDExNjUxODEyNzgxIGg2MS45MDQ5Njk2NDYyMjUzOTYgdjYyLjc4MDA1ODI1OTA2MzkxIEgxMi4zODA5OTM5MjkyNDUwNSBWMTIuNTU2MDExNjUxODEyNzgxIHpNNzQuMjg1OTYzNTc1NDcwNTMsNDUxLjA1MDU3MjQxNTEyMDY2IEgxMi4zODA5OTM5MjkyNDUwNSB2LTYyLjc4MDA1ODI1OTA2MzkxIGg2MS45MDQ5Njk2NDYyMjUzOTYgVjQ1MS4wNTA1NzI0MTUxMjA2NiB6TTQ0NS43MTU3ODE0NTI4MjI3NCw0NTEuMDUwNTcyNDE1MTIwNjYgaC02Mi44NTczNTM3OTQ2Mjg4NjQgdi02Mi43ODAwNTgyNTkwNjM5MSBoNjIuODU3MzUzNzk0NjI4ODY0IFY0NTEuMDUwNTcyNDE1MTIwNjYgek00MDcuNjIwNDE1NTE2Njg0MjYsMzc2LjY4MDM0OTU1NDM4MzQ0IGgtMzYuMTkwNTk3NjM5MzMxNzcgdjMyLjgzODc5OTcwNDc0MTEyIEg4NS43MTQ1NzMzNTYzMTIwMyB2LTMyLjgzODc5OTcwNDc0MTEyIEg0OS41MjM5NzU3MTY5ODAzMiBWODYuOTI2MjM0NTEyNTUwMDIgaDM2LjE5MDU5NzYzOTMzMTc3IFY1MC4yMjQwNDY2MDcyNTExMjUgaDI4Ny42MjAwMTI4MTc4NDcyIHYzNi43MDIxODc5MDUyOTg5IGgzNC4yODU4MjkzNDI1MjQ4MzUgVjM3Ni42ODAzNDk1NTQzODM0NCB6IiBpZD0ic3ZnXzIiIGNsYXNzPSIiIGZpbGw9IiMxYTFhZWIiIGZpbGwtb3BhY2l0eT0iMSIvPjwvZz48L3N2Zz4=',\n\t\t\ticonSize: [32, 32],\n\t\t\ticonAnchor: [16, 16]}\n\t\t)\n\t},\n\n\t_onHandleDrag: function() {\n\t\tvar overlay = this._handled,\n\t\t\tformerLatLng = this._handled._corners[this._corner],\n\t\t\tnewLatLng = this.getLatLng(),\n\n\t\t\tscale = this._calculateScalingFactor(formerLatLng, newLatLng);\n\n\t\toverlay.editing._scaleBy(scale);\n\n\t\toverlay.fire('update');\n\t},\n\n\tupdateHandle: function() {\n\t\tthis.setLatLng(this._handled._corners[this._corner]);\n\t},\n\n\t/* Takes two latlngs and calculates the angle between them. */\n\t_calculateAngle: function(latlngA, latlngB) {\n\t\tvar map = this._handled._map,\n\n\t\t\tcenterPoint = map.latLngToLayerPoint(this._handled.getCenter()),\n\t\t\tformerPoint = map.latLngToLayerPoint(latlngA),\n\t\t\tnewPoint = map.latLngToLayerPoint(latlngB),\n\n\t\t\tinitialAngle = Math.atan2(centerPoint.y - formerPoint.y, centerPoint.x - formerPoint.x),\n\t\t\tnewAngle = Math.atan2(centerPoint.y - newPoint.y, centerPoint.x - newPoint.x);\n\n\t\treturn newAngle - initialAngle;\n\t},\n\n\t/* Takes two latlngs and calculates the scaling difference. */\n\t_calculateScalingFactor: function(latlngA, latlngB) {\n\t\tvar map = this._handled._map,\n\n\t\t\tcenterPoint = map.latLngToLayerPoint(this._handled.getCenter()),\n\t\t\tformerPoint = map.latLngToLayerPoint(latlngA),\n\t\t\tnewPoint = map.latLngToLayerPoint(latlngB),\n\n\t\t\tformerRadiusSquared = this._d2(centerPoint, formerPoint),\n\t\t\tnewRadiusSquared = this._d2(centerPoint, newPoint);\n\n\t\treturn Math.sqrt(newRadiusSquared / formerRadiusSquared);\n\t},\n\n\t/* Distance between two points in cartesian space, squared (distance formula). */\n\t_d2: function(a, b) {\n\t\tvar dx = a.x - b.x,\n\t\t\tdy = a.y - b.y;\n\n\t\treturn Math.pow(dx, 2) + Math.pow(dy, 2);\n\t}\n});\n","L.DistortableImageOverlay = L.ImageOverlay.extend({\n\tinclude: L.Mixin.Events,\n\n\toptions: {\n\t\talt: '',\n\t\theight: 200,\n\t\tcrossOrigin: true\n\t},\n\n\tinitialize: function(url, options) {\n\t\t\tthis._toolArray = L.DistortableImage.EditToolbarDefaults;\n\t\t\tthis._url = url;\n\t\t\tthis._rotation = this.options.rotation;\n\n\t\t\tL.setOptions(this, options);\n\t},\n\n\tonAdd: function(map) {\n\t\t/* Copied from L.ImageOverlay */\n\t\tthis._map = map;\n\n\t\t// this._div = $(this._pane).append($(\"
\"));\n\t\tif (!this._image) { this._initImage(); }\n\t\tif (!this._events) { this._initEvents(); }\n\n\t\tmap._panes.overlayPane.appendChild(this._image);\n\n\t\tif (!this._divNode) { \n\t\t\tthis._divNode = document.createElement(\"div\");\n\t\t\t// this._divNode = divNode;\n\t\t\tthis._divNode.setAttribute(\"id\", \"holding\");\n\t\t\tmap._panes.overlayPane.appendChild(this._divNode); \n\t\t}\n\n\t\tmap.on('viewreset', this._reset, this);\n\t\t/* End copied from L.ImageOverlay */\n\n\t\t/* Use provided corners if available */\n\t\tif (this.options.corners) {\n\t\t\tthis._corners = this.options.corners;\n\t\t\tif (map.options.zoomAnimation && L.Browser.any3d) {\n\t\t\t\tmap.on('zoomanim', this._animateZoom, this);\n\t\t\t}\n\n\t\t\t/* This reset happens before image load; it allows\n\t\t\t * us to place the image on the map earlier with\n\t\t\t * \"guessed\" dimensions. */\n\t\t\tthis._reset();\n\t\t}\n\n\t\t/* Have to wait for the image to load because\n\t\t * we need to access its width and height. */\n\t\tL.DomEvent.on(this._image, 'load', function() {\n\t\t\tthis._initImageDimensions();\n\t\t\tthis._reset();\n\t\t\t/* Initialize default corners if not already set */\n\t\t\tif (!this._corners) {\n\t\t\t\tif (map.options.zoomAnimation && L.Browser.any3d) {\n\t\t\t\t\tmap.on('zoomanim', this._animateZoom, this);\n\t\t\t\t}\n\t\t\t}\n\t\t}, this);\n\n\t\tthis.fire('add');\n\t},\n\n\tonRemove: function(map) {\n\t\tthis.fire('remove');\n\n\t\tL.ImageOverlay.prototype.onRemove.call(this, map);\n\t},\n\n\t_initImage: function () {\n\t\tL.ImageOverlay.prototype._initImage.call(this);\n\n\t\tL.extend(this._image, {\n\t\t\talt: this.options.alt\n\t\t});\n\t},\n\n\tsetAnchors: function (anchors) {\n\t\tthis._anchors = [];\n\t\tthis._bounds = L.latLngBounds(anchors);\n\t\tfor (var i = 0, len = anchors.length; i < len; i++) {\n\t\t\tvar yx = anchors[i];\n\t\t\tthis._anchors.push(L.latLng(yx));\n\t\t}\n\n\t\tif (this._map) {\n\t\t\tthis._reset();\n\t\t}\n\t},\n\n\n\t_addTool: function(tool) {\n\t\tthis._toolArray.push(tool);\n\t\tL.DistortableImage.EditToolbar = LeafletToolbar.Popup.extend({\n\t\t\toptions: {\n\t\t\t\tactions: this._toolArray\n\t\t\t}\n\t\t});\n\t},\n\n\t_initImageDimensions: function() {\n\t\tvar map = this._map,\n\n\t\t\toriginalImageWidth = L.DomUtil.getStyle(this._image, 'width'),\n\t\t\toriginalImageHeight = L.DomUtil.getStyle(this._image, 'height'),\n\n\t\t\taspectRatio = parseInt(originalImageWidth) / parseInt(originalImageHeight),\n\n\t\t\timageHeight = this.options.height,\n\t\t\timageWidth = parseInt(aspectRatio*imageHeight),\n\n\t\t\tcenter = map.latLngToContainerPoint(map.getCenter()),\n\t\t\toffset = new L.Point(imageWidth, imageHeight).divideBy(2);\n\n\t\tif (this.options.corners) { this._corners = this.options.corners; }\n\t\telse {\n\t\t\tthis._corners = [\n\t\t\t\tmap.containerPointToLatLng(center.subtract(offset)),\n\t\t\t\tmap.containerPointToLatLng(center.add(new L.Point(offset.x, - offset.y))),\n\t\t\t\tmap.containerPointToLatLng(center.add(new L.Point(- offset.x, offset.y))),\n\t\t\t\tmap.containerPointToLatLng(center.add(offset))\n\t\t\t];\n\t\t}\n\t},\n\n \t_initEvents: function() {\n \t\tthis._events = [ 'click' ];\n\n \t\tfor (var i = 0, l = this._events.length; i < l; i++) {\n\t \t\tL.DomEvent.on(this._image, this._events[i], this._fireMouseEvent, this);\n \t\t}\n \t},\n\n \t/* See src/layer/vector/Path.SVG.js in the Leaflet source. */\n \t_fireMouseEvent: function(event) {\n \t\tif (!this.hasEventListeners(event.type)) { return; }\n\n\t\tvar map = this._map,\n\t\t\tcontainerPoint = map.mouseEventToContainerPoint(event),\n\t\t\tlayerPoint = map.containerPointToLayerPoint(containerPoint),\n\t\t\tlatlng = map.layerPointToLatLng(layerPoint);\n\n\t\tthis.fire(event.type, {\n\t\t\tlatlng: latlng,\n\t\t\tlayerPoint: layerPoint,\n\t\t\tcontainerPoint: containerPoint,\n\t\t\toriginalEvent: event\n\t\t});\n \t},\n\n\t_updateCorner: function(corner, latlng) {\n\t\tthis._corners[corner] = latlng;\n\t\tthis._reset();\n\t},\n\n\n\t/* Copied from Leaflet v0.7 https://github.com/Leaflet/Leaflet/blob/66282f14bcb180ec87d9818d9f3c9f75afd01b30/src/dom/DomUtil.js#L189-L199 */\n\t/* since L.DomUtil.getTranslateString() is deprecated in Leaflet v1.0 */\n\t_getTranslateString: function (point) {\n\t\t// on WebKit browsers (Chrome/Safari/iOS Safari/Android) using translate3d instead of translate\n\t\t// makes animation smoother as it ensures HW accel is used. Firefox 13 doesn't care\n\t\t// (same speed either way), Opera 12 doesn't support translate3d\n\n\t\tvar is3d = L.Browser.webkit3d,\n\t\t open = 'translate' + (is3d ? '3d' : '') + '(',\n\t\t close = (is3d ? ',0' : '') + ')';\n\n\t\treturn open + point.x + 'px,' + point.y + 'px' + close;\n\t},\n\n\t_reset: function() {\n\t\tvar map = this._map,\n\t\t\timage = this._image,\n\t\t\tlatLngToLayerPoint = L.bind(map.latLngToLayerPoint, map),\n\n\t\t\ttransformMatrix = this._calculateProjectiveTransform(latLngToLayerPoint),\n\t\t\ttopLeft = latLngToLayerPoint(this._corners[0]),\n\n\t\t\twarp = L.DomUtil.getMatrixString(transformMatrix),\n\t\t\ttranslation = this._getTranslateString(topLeft);\n\n\t\t/* See L.DomUtil.setPosition. Mainly for the purposes of L.Draggable. */\n\t\timage._leaflet_pos = topLeft;\n\n\t\timage.style[L.DomUtil.TRANSFORM] = [translation, warp].join(' ');\n\n\t\t/* Set origin to the upper-left corner rather than the center of the image, which is the default. */\n\t\timage.style[L.DomUtil.TRANSFORM + '-origin'] = \"0 0 0\";\n\t},\n\n\t/*\n\t * Calculates the transform string that will be correct *at the end* of zooming.\n\t * Leaflet then generates a CSS3 animation between the current transform and\n\t *\t\t future transform which makes the transition appear smooth.\n\t */\n\t_animateZoom: function(event) {\n\t\tvar map = this._map,\n\t\t\timage = this._image,\n\t\t\tlatLngToNewLayerPoint = function(latlng) {\n\t\t\t\treturn map._latLngToNewLayerPoint(latlng, event.zoom, event.center);\n\t\t\t},\n\n\t\t\ttransformMatrix = this._calculateProjectiveTransform(latLngToNewLayerPoint),\n\t\t\ttopLeft = latLngToNewLayerPoint(this._corners[0]),\n\n\t\t\twarp = L.DomUtil.getMatrixString(transformMatrix),\n\t\t\ttranslation = this._getTranslateString(topLeft);\n\n\t\t/* See L.DomUtil.setPosition. Mainly for the purposes of L.Draggable. */\n\t\timage._leaflet_pos = topLeft;\n\n\t\tif (!L.Browser.gecko) {\n\t\t\timage.style[L.DomUtil.TRANSFORM] = [translation, warp].join(' ');\n\t\t}\n\t},\n\n\tgetCorners: function() {\n\t\treturn this._corners;\n\t},\n\n\t/*\n\t * Calculates the centroid of the image.\n\t *\t\t See http://stackoverflow.com/questions/6149175/logical-question-given-corners-find-center-of-quadrilateral\n\t */\n\tgetCenter: function(ll2c, c2ll) {\n\t\tvar map = this._map,\n\t\t\tlatLngToCartesian = ll2c ? ll2c : map.latLngToLayerPoint,\n\t\t\tcartesianToLatLng = c2ll ? c2ll: map.layerPointToLatLng,\n\t\t\tnw = latLngToCartesian.call(map, this._corners[0]),\n\t\t\tne = latLngToCartesian.call(map, this._corners[1]),\n\t\t\tse = latLngToCartesian.call(map, this._corners[2]),\n\t\t\tsw = latLngToCartesian.call(map, this._corners[3]),\n\n\t\t\tnmid = nw.add(ne.subtract(nw).divideBy(2)),\n\t\t\tsmid = sw.add(se.subtract(sw).divideBy(2));\n\n\t\treturn cartesianToLatLng.call(map, nmid.add(smid.subtract(nmid).divideBy(2)));\n\t},\n\n\t_calculateProjectiveTransform: function(latLngToCartesian) {\n\t\t/* Setting reasonable but made-up image defaults\n\t\t * allow us to place images on the map before\n\t\t * they've finished downloading. */\n\t\tvar offset = latLngToCartesian(this._corners[0]),\n\t\t\tw = this._image.offsetWidth || 500,\n\t\t\th = this._image.offsetHeight || 375,\n\t\t\tc = [],\n\t\t\tj;\n\t\t/* Convert corners to container points (i.e. cartesian coordinates). */\n\t\tfor (j = 0; j < this._corners.length; j++) {\n\t\t\tc.push(latLngToCartesian(this._corners[j])._subtract(offset));\n\t\t}\n\n\t\t/*\n\t\t * This matrix describes the action of the CSS transform on each corner of the image.\n\t\t * It maps from the coordinate system centered at the upper left corner of the image\n\t\t *\t\t to the region bounded by the latlngs in this._corners.\n\t\t * For example:\n\t\t *\t\t 0, 0, c[0].x, c[0].y\n\t\t *\t\t says that the upper-left corner of the image maps to the first latlng in this._corners.\n\t\t */\n\t\treturn L.MatrixUtil.general2DProjection(\n\t\t\t0, 0, c[0].x, c[0].y,\n\t\t\tw, 0, c[1].x, c[1].y,\n\t\t\t0, h, c[2].x, c[2].y,\n\t\t\tw, h, c[3].x, c[3].y\n\t\t);\n\t}\n});\n","L.DistortableImage = L.DistortableImage || {};\n\nvar EditOverlayAction = LeafletToolbar.ToolbarAction.extend({\n\t\tinitialize: function(map, overlay, options) {\n\t\t\tthis._overlay = overlay;\n\t\t\tthis._map = map;\n\n\t\t\tLeafletToolbar.ToolbarAction.prototype.initialize.call(this, options);\n\t\t}\n\t}),\n\n\tToggleTransparency = EditOverlayAction.extend({\n\t\toptions: { toolbarIcon: {\n\t\t\thtml: '',\n\t\t\ttooltip: 'Toggle Image Transparency',\n\t\t\ttitle: 'Toggle Image Transparency'\n\t\t}},\n\n\t\taddHooks: function() {\n\t\t\tvar editing = this._overlay.editing;\n\n\t\t\tediting._toggleTransparency();\n\t\t\tthis.disable();\n\t\t}\n\t}),\n\n\tToggleOutline = EditOverlayAction.extend({\n\t\toptions: { toolbarIcon: {\n\t\t\thtml: '',\n\t\t\ttooltip: 'Toggle Image Outline',\n\t\t\ttitle: 'Toggle Image Outline'\n\t\t}},\n\n\t\taddHooks: function() {\n\t\t\tvar editing = this._overlay.editing;\n\n\t\t\tediting._toggleOutline();\n\t\t\tthis.disable();\n\t\t}\n\t}),\n\n\tRemoveOverlay = EditOverlayAction.extend({\n\t\toptions: { toolbarIcon: {\n\t\t\thtml: '',\n\t\t\ttooltip: 'Delete image',\n\t\t\ttitle: 'Delete image'\n\t\t}},\n\n\t\taddHooks: function() {\n\t\t\tvar map = this._map;\n\n\t\t\tmap.removeLayer(this._overlay);\n\t\t\tthis._overlay.fire('delete');\n\t\t\tthis.disable();\n\t\t}\n\t}),\n\n\tToggleEditable = EditOverlayAction.extend({\n\t\toptions: { toolbarIcon: {\n\t\t\thtml: '',\n\t\t\ttooltip: 'Lock / Unlock editing',\n\t\t\ttitle: 'Lock / Unlock editing'\n\t\t}},\n\n\t\taddHooks: function() {\n\t\t\tvar editing = this._overlay.editing;\n\n\t\t\tediting._toggleLock();\n\t\t\tthis.disable();\n\t\t}\n\t}),\n\n\tToggleRotateDistort = EditOverlayAction.extend({\n\t\tinitialize: function(map, overlay, options) {\n\t\t\tvar icon = overlay.editing._mode === 'rotate' ? 'image' : 'rotate-left';\n\n\t\t\toptions = options || {};\n\t\t\toptions.toolbarIcon = {\n\t\t\t\thtml: '',\n\t\t\t\ttooltip: 'Rotate',\n\t\t\t\ttitle: 'Rotate'\n\t\t\t};\n\n\t\t\tEditOverlayAction.prototype.initialize.call(this, map, overlay, options);\n\t\t},\n\n\t\taddHooks: function() {\n\t\t\tvar editing = this._overlay.editing;\n\n\t\t\tediting._toggleRotateDistort();\n\t\t\tthis.disable();\n\t\t}\n\t}),\n\n\n\tToggleExport = EditOverlayAction.extend({\n\t\toptions: {\n\t\t\ttoolbarIcon: {\n\t\t\t\thtml: '',\n\t\t\t\ttooltip: 'Export Image',\n\t\t\t\ttitle: 'Export Image'\n\t\t\t}\n\t\t},\n\n\t\taddHooks: function ()\n\t\t{\n\t\t\tvar editing = this._overlay.editing;\n\n\t\t\tediting._toggleExport();\n\t\t\tthis.disable();\n\t\t}\n\t}),\n\n\tToggleOrder = EditOverlayAction.extend({\n\t\toptions: {\n\t\t\ttoolbarIcon: {\n\t\t\t\thtml: '',\n\t\t\t\ttooltip: 'Change order',\n\t\t\t\ttitle: 'Toggle order'\n\t\t\t}\n\t\t},\n\n\t\taddHooks: function ()\n\t\t{\n\t\t\tvar editing = this._overlay.editing;\n\n\t\t\tediting._toggleOrder();\n\t\t\tthis.disable();\n\t\t}\n\t});\n\nL.DistortableImage.EditToolbar = LeafletToolbar.Popup.extend({\n\toptions: {\n\t\tactions: [\n\t\t\tToggleTransparency,\n\t\t\tRemoveOverlay,\n\t\t\tToggleOutline,\n\t\t\tToggleEditable,\n\t\t\tToggleRotateDistort,\n\t\t\tToggleExport,\n\t\t\tToggleOrder\n\t\t]\n\t}\n});\n","L.DistortableImage = L.DistortableImage || {};\n\nL.DistortableImage.Edit = L.Handler.extend({\n\toptions: {\n\t\topacity: 0.7,\n\t\toutline: '1px solid red',\n\t\tkeymap: {\n\t\t\t8: \"_removeOverlay\", // backspace windows / delete mac\n\t\t\t46: \"_removeOverlay\", // delete windows / delete + fn mac\n\t\t\t20: '_toggleRotate', // CAPS\n\t\t\t68: '_toggleRotateDistort', // d\n\t\t\t69: '_toggleIsolate', // e\n\t\t\t73: '_toggleIsolate', // i\n\t\t\t74: '_sendUp', // j\n\t\t\t75: '_sendDown', // k\n\t\t\t76: '_toggleLock', // l\n\t\t\t79: '_toggleOutline', // o\n\t\t\t82: '_toggleRotateDistort', // r\n\t\t\t83: '_toggleScale', // s\n\t\t\t84: '_toggleTransparency', // t\n\t\t}\n\t},\n\n\tinitialize: function(overlay) {\n\t\tthis._overlay = overlay;\n\t\tthis._toggledImage = false;\n\n\t\t/* Interaction modes. */\n\t\tthis._mode = this._overlay.options.mode || 'distort';\n\t\tthis._transparent = false;\n\t\tthis._outlined = false;\n\t},\n\n\t/* Run on image seletion. */\n\taddHooks: function() {\n\t\tvar overlay = this._overlay,\n\t\t\tmap = overlay._map,\n\t\t\ti;\n\n\t\tthis._lockHandles = new L.LayerGroup();\n\t\tfor (i = 0; i < 4; i++) {\n\t\t\tthis._lockHandles.addLayer(new L.LockHandle(overlay, i, { draggable: false }));\n\t\t}\n\n\t\tthis._distortHandles = new L.LayerGroup();\n\t\tfor (i = 0; i < 4; i++) {\n\t\t\tthis._distortHandles.addLayer(new L.DistortHandle(overlay, i));\n\t\t}\n\n\t\tthis._rotateHandles = new L.LayerGroup(); // handle includes rotate AND scale\n\t\tfor (i = 0; i < 4; i++) {\n\t\t\tthis._rotateHandles.addLayer(new L.RotateAndScaleHandle(overlay, i));\n\t\t}\n\n\t\tthis._scaleHandles = new L.LayerGroup();\n\t\tfor (i = 0; i < 4; i++) {\n\t\t\tthis._scaleHandles.addLayer(new L.ScaleHandle(overlay, i));\n\t\t}\n\n\t\tthis.__rotateHandles = new L.LayerGroup(); // individual rotate\n\t\tfor (i = 0; i < 4; i++) {\n\t\t\tthis.__rotateHandles.addLayer(new L.RotateHandle(overlay, i));\n\t\t}\n\n\t\tthis._handles = {\n\t\t\t'lock':\t\t this._lockHandles,\n\t\t\t'distort': this._distortHandles,\n\t\t\t'rotate':\tthis._rotateHandles,\n\t\t\t'scale': this._scaleHandles,\n\t\t\t'rotateStandalone': this.__rotateHandles\n\t\t};\n\n if (this._mode === 'lock') {\n\t\t\tmap.addLayer(this._lockHandles);\n\t\t} else {\n\t\t\tthis._mode = 'distort';\n\t\t\tmap.addLayer(this._distortHandles);\n\t\t\tthis._enableDragging();\n\t\t}\n\n\t\t//overlay.on('click', this._showToolbar, this);\n\t\tL.DomEvent.on(overlay._image, 'click', this._showToolbar, this);\n\n\t\t/* Enable hotkeys. */\n\t\tL.DomEvent.on(window, 'keydown', this._onKeyDown, this);\n\n\t\toverlay.fire('select');\n\n\t},\n\n\t/* Run on image deseletion. */\n\tremoveHooks: function() {\n\t\tvar overlay = this._overlay,\n\t\t\tmap = overlay._map;\n\n\t\t// L.DomEvent.off(window, 'keydown', this._onKeyDown, this);\n\n\t\tL.DomEvent.off(overlay._image, 'click', this._showToolbar, this);\n\n\t\t// First, check if dragging exists;\n\t\t// it may be off due to locking\n\t\tif (this.dragging) { this.dragging.disable(); }\n\t\tdelete this.dragging;\n\n\t\tmap.removeLayer(this._handles[this._mode]);\n\n \t\t/* Disable hotkeys. */\n\t\tL.DomEvent.off(window, 'keydown', this._onKeyDown, this);\n\n\t\toverlay.fire('deselect');\n },\n\n confirmDelete: function () {\n return window.confirm(\"Are you sure you want to delete?\");\n },\n\n\n\t_rotateBy: function(angle) {\n\t\tvar overlay = this._overlay,\n\t\t\tmap = overlay._map,\n\t\t\tcenter = map.latLngToLayerPoint(overlay.getCenter()),\n\t\t\ti, p, q;\n\n\t\tfor (i = 0; i < 4; i++) {\n\t\t\tp = map.latLngToLayerPoint(overlay._corners[i]).subtract(center);\n\t\t\tq = new L.Point(\n\t\t\t\tMath.cos(angle)*p.x - Math.sin(angle)*p.y,\n\t\t\t\tMath.sin(angle)*p.x + Math.cos(angle)*p.y\n\t\t\t);\n\t\t\toverlay._corners[i] = map.layerPointToLatLng(q.add(center));\n\t\t}\n\n\t\toverlay._reset();\n\t},\n\n\t_scaleBy: function(scale) {\n\t\tvar overlay = this._overlay,\n\t\t\tmap = overlay._map,\n\t\t\tcenter = map.latLngToLayerPoint(overlay.getCenter()),\n\t\t\ti, p;\n\n\t\tfor (i = 0; i < 4; i++) {\n\t\t\tp = map.latLngToLayerPoint(overlay._corners[i])\n\t\t\t\t.subtract(center)\n\t\t\t\t.multiplyBy(scale)\n\t\t\t\t.add(center);\n\t\t\toverlay._corners[i] = map.layerPointToLatLng(p);\n\t\t}\n\n\t\toverlay._reset();\n\t},\n\n\t_enableDragging: function() {\n\t\tvar overlay = this._overlay,\n\t\t\tmap = overlay._map;\n\n\t\tthis.dragging = new L.Draggable(overlay._image);\n\t\tthis.dragging.enable();\n\n\t\t/* Hide toolbars while dragging; click will re-show it */\n\t\tthis.dragging.on('dragstart', this._hideToolbar, this);\n\n\t\t/*\n\t\t * Adjust default behavior of L.Draggable.\n\t\t * By default, L.Draggable overwrites the CSS3 distort transform\n\t\t * that we want when it calls L.DomUtil.setPosition.\n\t\t */\n\t\tthis.dragging._updatePosition = function() {\n\t\t\tvar delta = this._newPos.subtract(map.latLngToLayerPoint(overlay._corners[0])),\n\t\t\t\tcurrentPoint, i;\n\n\t\t\tthis.fire('predrag');\n\n\t\t\tfor (i = 0; i < 4; i++) {\n\t\t\t\tcurrentPoint = map.latLngToLayerPoint(overlay._corners[i]);\n\t\t\t\toverlay._corners[i] = map.layerPointToLatLng(currentPoint.add(delta));\n\t\t\t}\n\t\t\toverlay._reset();\n\t\t\toverlay.fire('update');\n\n\t\t\tthis.fire('drag');\n\t\t};\n\t},\n\n\t_onKeyDown: function(event) {\n\t\tvar keymap = this.options.keymap,\n\t\t\thandlerName = keymap[event.which];\n\n\t\tif (handlerName !== undefined && this._overlay.options.suppressToolbar !== true) {\n\t\t\tthis[handlerName].call(this);\n\t\t}\n\t},\n\n\t_toggleRotateDistort: function() {\n\t\tvar map = this._overlay._map;\n\n\t\tmap.removeLayer(this._handles[this._mode]);\n\n\t\t/* Switch mode. */\n\t\tif (this._mode === 'rotate') { this._mode = 'distort'; }\n\t\telse { this._mode = 'rotate'; }\n\n\t\tmap.addLayer(this._handles[this._mode]);\n\t},\n\n\t_toggleScale: function() {\n\t\tvar map = this._overlay._map;\n\n\t\tmap.removeLayer(this._handles[this._mode]);\n\n\t\tthis._mode = 'scale';\n\n\t\tmap.addLayer(this._handles[this._mode]);\n\t},\n\n\t_toggleRotate: function() {\n\t\tvar map = this._overlay._map;\n\n\t\tmap.removeLayer(this._handles[this._mode]);\n\n\t\tthis._mode = 'rotateStandalone';\n\n\t\tmap.addLayer(this._handles[this._mode]);\n\t},\n\n\t_toggleTransparency: function() {\n\t\tvar image = this._overlay._image,\n\t\t\topacity;\n\n\t\tthis._transparent = !this._transparent;\n\t\topacity = this._transparent ? this.options.opacity : 1;\n\n\t\tL.DomUtil.setOpacity(image, opacity);\n\t\timage.setAttribute('opacity', opacity);\n\t},\n\n\t_toggleOutline: function() {\n\t\tvar image = this._overlay._image,\n\t\t\topacity, outline;\n\n\t\tthis._outlined = !this._outlined;\n\t\topacity = this._outlined ? this.options.opacity / 2 : 1;\n\t\toutline = this._outlined ? this.options.outline : 'none';\n\n\t\tL.DomUtil.setOpacity(image, opacity);\n\t\timage.setAttribute('opacity', opacity);\n\n\t\timage.style.outline = outline;\n\t},\n\n\t_sendUp: function() {\n\t\tthis._overlay.bringToFront();\n\t},\n\n\t_sendDown: function() {\n\t\tthis._overlay.bringToBack();\n\t},\n\n\t_toggleLock: function() {\n\t\tvar map = this._overlay._map;\n\n\t\tmap.removeLayer(this._handles[this._mode]);\n\t\t/* Switch mode. */\n\t\tif (this._mode === 'lock') {\n\t\t\tthis._mode = 'distort';\n\t\t\tthis._enableDragging();\n\t\t} else {\n\t\t\tthis._mode = 'lock';\n\t\t\tif (this.dragging) { this.dragging.disable(); }\n\t\t\tdelete this.dragging;\n\t\t}\n\n\t\tmap.addLayer(this._handles[this._mode]);\n\t},\n\n\t_hideToolbar: function() {\n\t\tvar map = this._overlay._map;\n\t\tif (this.toolbar) {\n\t\t\tmap.removeLayer(this.toolbar);\n\t\t\tthis.toolbar = false;\n\t\t}\n\t},\n\n\t_showToolbar: function(event) {\n\t\tvar overlay = this._overlay,\n target = event.target,\n\t\t\tmap = overlay._map;\n\n\t\t/* Ensure that there is only ever one toolbar attached to each image. */\n\t\tthis._hideToolbar();\n\t\tvar point;\n\t\tif (event.containerPoint) { point = event.containerPoint; }\n\t\telse { point = target._leaflet_pos; }\n\t\tvar raised_point = map.containerPointToLatLng(new L.Point(point.x,point.y-20));\n\t\traised_point.lng = overlay.getCenter().lng;\n\t\tif (this._overlay.options.suppressToolbar !== true) {\n\t\tthis.toolbar = new L.DistortableImage.EditToolbar(raised_point).addTo(map, overlay);\n\t\toverlay.fire('toolbar:created');\n\t\t}\n\n\t\tL.DomEvent.stopPropagation(event);\n },\n\n _removeOverlay: function () {\n var overlay = this._overlay;\n if (this._mode !== \"lock\") {\n var choice = this.confirmDelete();\n if (choice) {\n overlay._map.removeLayer(overlay);\n overlay.fire('delete');\n this.disable();\n }\n }\n },\n\t// compare this to using overlay zIndex\n\t_toggleOrder: function () {\n\tif (this._toggledImage) {\n\t\tthis._overlay.bringToFront();\n\t\tthis._toggledImage = false;\n\t\t}\n\telse {\n\t\tthis._overlay.bringToBack();\n\t\tthis._toggledImage = true;\n\t\t}\n\t},\n\n\t// Based on https://github.com/publiclab/mapknitter/blob/8d94132c81b3040ae0d0b4627e685ff75275b416/app/assets/javascripts/mapknitter/Map.js#L47-L82\n\t_toggleExport: function (){\n\t\tvar map = this._overlay._map;\n\t\tvar overlay = this._overlay;\n\n\t\t// make a new image\n\t\tvar downloadable = new Image();\n\n\t\tdownloadable.id = downloadable.id || \"tempId12345\";\n\t\t$('body').append(downloadable);\n\n\t\tdownloadable.onload = function onLoadDownloadableImage() {\n\n\t\t\tvar height = downloadable.height,\n\t\t\t\twidth = downloadable.width,\n\t\t\t\tnw = map.latLngToLayerPoint(overlay._corners[0]),\n\t\t\t\tne = map.latLngToLayerPoint(overlay._corners[1]),\n\t\t\t\tsw = map.latLngToLayerPoint(overlay._corners[2]),\n\t\t\t\tse = map.latLngToLayerPoint(overlay._corners[3]);\n\n\t\t\t// I think this is to move the image to the upper left corner,\n\t\t\t// jywarren: i think we may need these or the image goes off the edge of the canvas\n // jywarren: but these seem to break the distortion math...\n\n\t\t\t// jywarren: i think it should be rejiggered so it\n\t\t\t// finds the most negative values of x and y and then\n\t\t\t// adds those to all coordinates\n\n\t\t\t//nw.x -= nw.x;\n\t\t\t//ne.x -= nw.x;\n\t\t\t//se.x -= nw.x;\n\t\t\t//sw.x -= nw.x;\n\n\t\t\t//nw.y -= nw.y;\n\t\t\t//ne.y -= nw.y;\n\t\t\t//se.y -= nw.y;\n\t\t\t//sw.y -= nw.y;\n\n\t\t\t// run once warping is complete\n \t\t\tdownloadable.onload = function() {\n\t\t\t\t$(downloadable).remove();\n\t\t\t};\n\n\t\t\tif (window && window.hasOwnProperty('warpWebGl')) {\n\t\t\t\twarpWebGl(\n\t\t\t\t\tdownloadable.id,\n\t\t\t\t\t[0, 0, width, 0, width, height, 0, height],\n\t\t\t\t\t[nw.x, nw.y, ne.x, ne.y, se.x, se.y, sw.x, sw.y],\n\t\t\t\t\ttrue // trigger download\n\t\t\t\t);\n\t\t\t}\n\n\t\t};\n\n\t\tdownloadable.src = overlay.options.fullResolutionSrc || overlay._image.src;\n\n\t},\n\n\ttoggleIsolate: function() {\n\t\t// this.isolated = !this.isolated;\n\t\t// if (this.isolated) {\n\t\t// \t$.each($L.images,function(i,img) {\n\t\t// \t\timg.hidden = false;\n\t\t// \t\timg.setOpacity(1);\n\t\t// \t});\n\t\t// } else {\n\t\t// \t$.each($L.images,function(i,img) {\n\t\t// \t\timg.hidden = true;\n\t\t// \t\timg.setOpacity(0);\n\t\t// \t});\n\t\t// }\n\t\t// this.hidden = false;\n\t\t// this.setOpacity(1);\n\t}\n\n});\n\nL.DistortableImageOverlay.addInitHook(function() {\n\tthis.editing = new L.DistortableImage.Edit(this);\n\n\tif (this.options.editable) {\n\t\tL.DomEvent.on(this._image, 'load', this.editing.enable, this.editing);\n\t}\n\n\tthis.on('remove', function () {\n\t\tif (this.editing) { this.editing.disable(); }\n\t});\n});\n","L.Map.mergeOptions({ boxSelector: true, boxZoom: false });\n\nL.Map.BoxSelectHandle = L.Map.BoxZoom.extend({\n\n initialize: function (map) {\n this._map = map;\n this._container = map._container;\n this._pane = map._panes.overlayPane;\n },\n\n addHooks: function () {\n L.DomEvent.on(this._container, 'mousedown', this._onMouseDown, this);\n },\n\n removeHooks: function () {\n L.DomEvent.off(this._container, 'mousedown', this._onMouseDown, this);\n },\n\n _onMouseDown: function (e) {\n if (!e.shiftKey || ((e.which !== 1) && (e.button !== 1))) { return false; }\n\n L.DomUtil.disableTextSelection();\n L.DomUtil.disableImageDrag();\n\n this._startLayerPoint = this._map.mouseEventToLayerPoint(e);\n\n this._box = L.DomUtil.create('div', 'leaflet-zoom-box', this._pane);\n L.DomUtil.setPosition(this._box, this._startLayerPoint);\n\n this._container.style.cursor = 'crosshair';\n\n L.DomEvent\n .on(document, 'mousemove', this._onMouseMove, this)\n .on(document, 'mouseup', this._onMouseUp, this)\n .on(document, 'keydown', this._onKeyDown, this)\n .preventDefault(e);\n\n this._map.fire('boxzoomstart');\n },\n\n _onMouseMove: function (e) {\n var startPoint = this._startLayerPoint,\n box = this._box,\n\n layerPoint = this._map.mouseEventToLayerPoint(e),\n offset = layerPoint.subtract(startPoint),\n\n newPos = new L.Point(\n Math.min(layerPoint.x, startPoint.x),\n Math.min(layerPoint.y, startPoint.y));\n\n L.DomUtil.setPosition(box, newPos);\n\n box.style.width = (Math.max(0, Math.abs(offset.x) - 4)) + 'px';\n box.style.height = (Math.max(0, Math.abs(offset.y) - 4)) + 'px';\n },\n\n _onMouseUp: function (e) {\n if (!$(this._pane).children('.leaflet-zoom-box').length) { return false; }\n // window.e = e;\n var map = this._map,\n layerPoint = map.mouseEventToLayerPoint(e);\n\n if (this._startLayerPoint.equals(layerPoint)) { return; }\n\n var bounds = new L.LatLngBounds(\n map.layerPointToLatLng(this._startLayerPoint),\n map.layerPointToLatLng(layerPoint));\n\n window.bounds = bounds;\n // window.div = this._div;\n window.box = this._box;\n window.pane = this._pane;\n window.map = map;\n window.container = this._container;\n\n map.fire('boxzoomend', {\n // boxBounds: bounds\n });\n\n\n\n let contents = $(this._pane).children();\n let images = contents.filter('img');\n\n this._finish();\n\n this._attach(images);\n\n console.log(images);\n return images;\n },\n\n _finish: function () {\n // if (!this._box) { return false; }\n // this._pane.removeChild(this._box);[]\n $(this._box).remove();\n this._container.style.cursor = '';\n\n L.DomUtil.enableTextSelection();\n L.DomUtil.enableImageDrag();\n\n L.DomEvent\n .off(document, 'mousemove', this._onMouseMove)\n .off(document, 'mouseup', this._onMouseUp)\n .off(document, 'keydown', this._onKeyDown);\n },\n\n _attach: function(images) {\n if ($('#holding')) {\n this._imagesDiv = $('#holding');\n $(images).appendTo(this._imagesDiv);\n window.imagesDiv = this._imagesDiv;\n }\n },\n\n // escape keybinding for getting rid of the selection box (alternative to mouse up). keep for now to see if it will become useful\n // in deselecting images\n _onKeyDown: function (e) {\n if (e.keyCode === 27) {\n if ($(this._pane).children('.leaflet-zoom-box').length) {\n $(this._box).remove();\n }\n // this._finish();\n }\n },\n\n});\n\nL.Map.addInitHook('addHandler', 'boxSelector', L.Map.BoxSelectHandle);"]} \ No newline at end of file diff --git a/examples/select.html b/examples/select.html index 0c1fa6929..9dd043d48 100644 --- a/examples/select.html +++ b/examples/select.html @@ -50,7 +50,7 @@ img = this if (img._leaflet_id != images[i]._leaflet_id) { /* Deselect (disable) other images */ - images[i].editing.disable() + // images[i].editing.disable() /* Ensure that other toolbars are removed */ if (images[i].editing.toolbar) { map.removeLayer(images[i].editing.toolbar); @@ -89,7 +89,8 @@ ] } ).addTo(map); - images.push(img) + images.push(img); + L.DomEvent.on(img._image, 'load', img.editing.enable, img.editing); L.DomEvent.on(img._image, 'click', select, img); @@ -110,4 +111,6 @@ })(); + + diff --git a/src/DistortableImageOverlay.js b/src/DistortableImageOverlay.js index 515cc23bb..2530303a9 100644 --- a/src/DistortableImageOverlay.js +++ b/src/DistortableImageOverlay.js @@ -19,11 +19,19 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ /* Copied from L.ImageOverlay */ this._map = map; + // this._div = $(this._pane).append($("
")); if (!this._image) { this._initImage(); } if (!this._events) { this._initEvents(); } map._panes.overlayPane.appendChild(this._image); + if (!this._divNode) { + this._divNode = document.createElement("div"); + // this._divNode = divNode; + this._divNode.setAttribute("id", "holding"); + map._panes.overlayPane.appendChild(this._divNode); + } + map.on('viewreset', this._reset, this); /* End copied from L.ImageOverlay */ @@ -70,6 +78,20 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ }); }, + setAnchors: function (anchors) { + this._anchors = []; + this._bounds = L.latLngBounds(anchors); + for (var i = 0, len = anchors.length; i < len; i++) { + var yx = anchors[i]; + this._anchors.push(L.latLng(yx)); + } + + if (this._map) { + this._reset(); + } + }, + + _addTool: function(tool) { this._toolArray.push(tool); L.DistortableImage.EditToolbar = LeafletToolbar.Popup.extend({ diff --git a/src/edit/BoxSelectHandle.js b/src/edit/BoxSelectHandle.js index c7cc0addc..685065c6d 100644 --- a/src/edit/BoxSelectHandle.js +++ b/src/edit/BoxSelectHandle.js @@ -6,8 +6,6 @@ L.Map.BoxSelectHandle = L.Map.BoxZoom.extend({ this._map = map; this._container = map._container; this._pane = map._panes.overlayPane; - // this._resetStateTimeout = 0; - // map.on('unload', this._destroy, this); }, addHooks: function () { @@ -18,11 +16,6 @@ L.Map.BoxSelectHandle = L.Map.BoxZoom.extend({ L.DomEvent.off(this._container, 'mousedown', this._onMouseDown, this); }, - // _destroy: function () { - // L.DomUtil.remove(this._pane); - // delete this._pane; - // }, - _onMouseDown: function (e) { if (!e.shiftKey || ((e.which !== 1) && (e.button !== 1))) { return false; } @@ -31,8 +24,6 @@ L.Map.BoxSelectHandle = L.Map.BoxZoom.extend({ this._startLayerPoint = this._map.mouseEventToLayerPoint(e); - // this._startLayerPoint = this._map.mouseEventToLayerPoint(e); - this._box = L.DomUtil.create('div', 'leaflet-zoom-box', this._pane); L.DomUtil.setPosition(this._box, this._startLayerPoint); @@ -77,6 +68,7 @@ L.Map.BoxSelectHandle = L.Map.BoxZoom.extend({ map.layerPointToLatLng(layerPoint)); window.bounds = bounds; + // window.div = this._div; window.box = this._box; window.pane = this._pane; window.map = map; @@ -86,18 +78,22 @@ L.Map.BoxSelectHandle = L.Map.BoxZoom.extend({ // boxBounds: bounds }); + + let contents = $(this._pane).children(); let images = contents.filter('img'); - // window.images = images; this._finish(); + + this._attach(images); + console.log(images); return images; }, _finish: function () { // if (!this._box) { return false; } - // this._pane.removeChild(this._box); + // this._pane.removeChild(this._box);[] $(this._box).remove(); this._container.style.cursor = ''; @@ -110,13 +106,25 @@ L.Map.BoxSelectHandle = L.Map.BoxZoom.extend({ .off(document, 'keydown', this._onKeyDown); }, + _attach: function(images) { + if ($('#holding')) { + this._imagesDiv = $('#holding'); + $(images).appendTo(this._imagesDiv); + window.imagesDiv = this._imagesDiv; + } + }, + // escape keybinding for getting rid of the selection box (alternative to mouse up). keep for now to see if it will become useful // in deselecting images _onKeyDown: function (e) { if (e.keyCode === 27) { - this._finish(); + if ($(this._pane).children('.leaflet-zoom-box').length) { + $(this._box).remove(); + } + // this._finish(); } - } + }, + }); L.Map.addInitHook('addHandler', 'boxSelector', L.Map.BoxSelectHandle); \ No newline at end of file From 39c56253224ca294d928993c58311b991aa96511 Mon Sep 17 00:00:00 2001 From: sashadev-sky Date: Wed, 13 Mar 2019 08:08:45 -0400 Subject: [PATCH 06/63] Move multiple markers --- dist/leaflet.distortableimage.js | 20 ++--- dist/leaflet.distortableimage.js.map | 2 +- examples/select.html | 115 ++++++++++++++++++++++++++- src/DistortableImageOverlay.js | 14 ---- src/edit/DistortableImage.Edit.js | 8 +- 5 files changed, 123 insertions(+), 36 deletions(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index ad66275c9..727b48ec1 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -610,20 +610,6 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ }); }, - setAnchors: function (anchors) { - this._anchors = []; - this._bounds = L.latLngBounds(anchors); - for (var i = 0, len = anchors.length; i < len; i++) { - var yx = anchors[i]; - this._anchors.push(L.latLng(yx)); - } - - if (this._map) { - this._reset(); - } - }, - - _addTool: function(tool) { this._toolArray.push(tool); L.DistortableImage.EditToolbar = LeafletToolbar.Popup.extend({ @@ -1124,7 +1110,10 @@ L.DistortableImage.Edit = L.Handler.extend({ this.dragging.enable(); /* Hide toolbars while dragging; click will re-show it */ - this.dragging.on('dragstart', this._hideToolbar, this); + this.dragging.on('dragstart', function () { + overlay.fire('dragstart'); + this._hideToolbar(); + }, this); /* * Adjust default behavior of L.Draggable. @@ -1143,6 +1132,7 @@ L.DistortableImage.Edit = L.Handler.extend({ } overlay._reset(); overlay.fire('update'); + overlay.fire('drag'); this.fire('drag'); }; diff --git a/dist/leaflet.distortableimage.js.map b/dist/leaflet.distortableimage.js.map index bef0e6403..f60d538bc 100644 --- a/dist/leaflet.distortableimage.js.map +++ b/dist/leaflet.distortableimage.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/util/DomUtil.js","../src/util/Map._newLayerPointToLatLng.js","../src/util/MatrixUtil.js","../src/edit/EditHandle.js","../src/edit/LockHandle.js","../src/edit/DistortHandle.js","../src/edit/RotateAndScaleHandle.js","../src/edit/RotateHandle.js","../src/edit/ScaleHandle.js","../src/DistortableImageOverlay.js","../src/edit/DistortableImage.EditToolbar.js","../src/edit/DistortableImage.Edit.js","../src/edit/BoxSelectHandle.js"],"names":[],"mappings":"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","file":"leaflet.distortableimage.js","sourcesContent":["L.DomUtil = L.extend(L.DomUtil, {\n\tgetMatrixString: function(m) {\n\t\tvar is3d = L.Browser.webkit3d || L.Browser.gecko3d || L.Browser.ie3d,\n\n\t\t\t/* \n\t\t * Since matrix3d takes a 4*4 matrix, we add in an empty row and column, which act as the identity on the z-axis.\n\t\t * See:\n\t\t * http://franklinta.com/2014/09/08/computing-css-matrix3d-transforms/\n\t\t * https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function#M.C3.B6bius'_homogeneous_coordinates_in_projective_geometry\n\t\t */\n\t\t\tmatrix = [\n\t\t\t\tm[0], m[3], 0, m[6],\n\t\t\t\tm[1], m[4], 0, m[7],\n\t\t\t\t 0, 0, 1, 0,\n\t\t\t\tm[2], m[5], 0, m[8]\n\t\t\t],\n\n\t\t\tstr = is3d ? 'matrix3d(' + matrix.join(',') + ')' : '';\n\n\t\tif (!is3d) {\n\t\t\tconsole.log('Your browser must support 3D CSS transforms in order to use DistortableImageOverlay.');\n\t\t}\n\n\t\treturn str;\n\t},\n\n\tgetRotateString: function(angle, units) {\n\t\tvar is3d = L.Browser.webkit3d || L.Browser.gecko3d || L.Browser.ie3d,\n\t\t\topen = 'rotate' + (is3d ? '3d' : '') + '(',\n\t\t\trotateString = (is3d ? '0, 0, 1, ' : '') + angle + units;\n\t\t\t\n\t\treturn open + rotateString + ')';\n\t}\n});\n","L.Map.include({\n\t_newLayerPointToLatLng: function(point, newZoom, newCenter) {\n\t\tvar topLeft = L.Map.prototype._getNewTopLeftPoint.call(this, newCenter, newZoom)\n\t\t\t\t.add(L.Map.prototype._getMapPanePos.call(this));\n\t\treturn this.unproject(point.add(topLeft), newZoom);\n\t}\n});","L.MatrixUtil = {\n\n\t// Compute the adjugate of m\n\tadj: function(m) { \n\t\treturn [\n\t\t\tm[4]*m[8]-m[5]*m[7], m[2]*m[7]-m[1]*m[8], m[1]*m[5]-m[2]*m[4],\n\t\t\tm[5]*m[6]-m[3]*m[8], m[0]*m[8]-m[2]*m[6], m[2]*m[3]-m[0]*m[5],\n\t\t\tm[3]*m[7]-m[4]*m[6], m[1]*m[6]-m[0]*m[7], m[0]*m[4]-m[1]*m[3]\n\t\t];\n\t},\n\n\t// multiply two 3*3 matrices\n\tmultmm: function(a, b) { \n\t\tvar c = [],\n\t\t\ti;\n\n\t\tfor (i = 0; i < 3; i++) {\n\t\t\tfor (var j = 0; j < 3; j++) {\n\t\t\t\tvar cij = 0;\n\t\t\t\tfor (var k = 0; k < 3; k++) {\n\t\t\t\t\tcij += a[3*i + k]*b[3*k + j];\n\t\t\t\t}\n\t\t\t\tc[3*i + j] = cij;\n\t\t\t}\n\t\t}\n\t\treturn c;\n\t},\n\n\t// multiply a 3*3 matrix and a 3-vector\n\tmultmv: function(m, v) { \n\t\treturn [\n\t\t\tm[0]*v[0] + m[1]*v[1] + m[2]*v[2],\n\t\t\tm[3]*v[0] + m[4]*v[1] + m[5]*v[2],\n\t\t\tm[6]*v[0] + m[7]*v[1] + m[8]*v[2]\n\t\t];\n\t},\n\n\t// multiply a scalar and a 3*3 matrix\n\tmultsm: function(s, m) {\n\t\tvar matrix = [];\n\n\t\tfor (var i = 0, l = m.length; i < l; i++) {\n\t\t\tmatrix.push(s*m[i]);\n\t\t}\n\n\t\treturn matrix;\n\t},\n\n\tbasisToPoints: function(x1, y1, x2, y2, x3, y3, x4, y4) {\n\t\tvar m = [\n\t\t\t\tx1, x2, x3,\n\t\t\t\ty1, y2, y3,\n\t\t\t\t1, 1, 1\n\t\t\t],\n\t\t\tv = L.MatrixUtil.multmv(L.MatrixUtil.adj(m), [x4, y4, 1]);\n\n\t\treturn L.MatrixUtil.multmm(m, [\n\t\t\tv[0], 0, 0,\n\t\t\t0, v[1], 0,\n\t\t\t0, 0, v[2]\n\t\t]);\n\t},\n\n\n\tproject: function(m, x, y) {\n\t\tvar v = L.MatrixUtil.multmv(m, [x, y, 1]);\n\t\treturn [v[0]/v[2], v[1]/v[2]];\n\t},\n\n\tgeneral2DProjection: function(\n\tx1s, y1s, x1d, y1d,\n\tx2s, y2s, x2d, y2d,\n\tx3s, y3s, x3d, y3d,\n\tx4s, y4s, x4d, y4d\n\t) {\n\t\tvar s = L.MatrixUtil.basisToPoints(x1s, y1s, x2s, y2s, x3s, y3s, x4s, y4s),\n\t\t\td = L.MatrixUtil.basisToPoints(x1d, y1d, x2d, y2d, x3d, y3d, x4d, y4d),\n\t\t\tm = L.MatrixUtil.multmm(d, L.MatrixUtil.adj(s));\n\n\t\t/* \n\t\t *\tNormalize to the unique matrix with m[8] == 1. \n\t\t * \tSee: http://franklinta.com/2014/09/08/computing-css-matrix3d-transforms/\n\t\t */\n\t\treturn L.MatrixUtil.multsm(1/m[8], m);\n\t}\n};","L.EditHandle = L.Marker.extend({\n\tinitialize: function(overlay, corner, options) {\n\t\tvar markerOptions,\n\t\t\tlatlng = overlay._corners[corner];\n\n\t\tL.setOptions(this, options);\n\n\t\tthis._handled = overlay;\n\t\tthis._corner = corner;\n\n\t\tmarkerOptions = {\n\t\t\tdraggable: true,\n\t\t\tzIndexOffset: 10\n\t\t};\n\n\t\tif (options && options.hasOwnProperty('draggable')) {\n\t\t\tmarkerOptions.draggable = options.draggable;\n\t\t}\n\n\t\tL.Marker.prototype.initialize.call(this, latlng, markerOptions);\n\t},\n\n\tonAdd: function(map) {\n\t\tL.Marker.prototype.onAdd.call(this, map);\n\t\tthis._bindListeners();\n\n\t\tthis.updateHandle();\n\t},\n\n\tonRemove: function(map) {\n\t\tthis._unbindListeners();\n\t\tL.Marker.prototype.onRemove.call(this, map);\n\t},\n\n\t_onHandleDragStart: function() {\n\t\tthis._handled.fire('editstart');\n\t},\n\n\t_onHandleDragEnd: function() {\n\t\tthis._fireEdit();\n\t},\n\n\t_fireEdit: function() {\n\t\tthis._handled.edited = true;\n\t\tthis._handled.fire('edit');\n\t},\n\n\t_bindListeners: function() {\n\t\tthis.on({\n\t\t\t'dragstart': this._onHandleDragStart,\n\t\t\t'drag': this._onHandleDrag,\n\t\t\t'dragend': this._onHandleDragEnd\n\t\t}, this);\n\n\t\tthis._handled._map.on('zoomend', this.updateHandle, this);\n\n\t\tthis._handled.on('update', this.updateHandle, this);\n\t},\n\n\t_unbindListeners: function() {\n\t\tthis.off({\n\t\t\t'dragstart': this._onHandleDragStart,\n\t\t\t'drag': this._onHandleDrag,\n\t\t\t'dragend': this._onHandleDragEnd\n\t\t}, this);\n\n\t\tthis._handled._map.off('zoomend', this.updateHandle, this);\n\t\tthis._handled.off('update', this.updateHandle, this);\n\t}\n});\n","L.LockHandle = L.EditHandle.extend({\n\toptions: {\n\t\tTYPE: 'lock',\n\t\ticon: new L.Icon({ \n\t\t\ticonUrl: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAD8SURBVO3BPU7CYAAA0AdfjIcQlRCQBG7C3gk2uIPG2RC3Dk16Gz0FTO1WZs/gwGCMP/2+xsSl7+n1er1Iz9LtRQjaPeMeO+TinLDCJV78YqjdA04YodKuxhUaPGoRxMmxwRQZSt87Yo4KExGCeAUyLLFB4bMacxywEClIU2KDKXbInTUYo8JCgoFuGoxQO5uiwY1EA91VmDqrcKeDoX8WdNNgjApvmGGLXKIgXY0xGkxQYItrrFFIEKQ5Yo4KEx9yrDFDhlKkIF6NOQ5Y+KpAhiXWKEQI4pxwiwoLPyuxwQw75FoE7fZYocFEuwI7jHCBV39gL92TXq/Xi/AOcmczZmaIMScAAAAASUVORK5CYII=',\n\t\t\ticonSize: [32, 32],\n\t\t\ticonAnchor: [16, 16]}\n\t\t)\n\t},\n\n\t/* cannot be dragged */\n\t_onHandleDrag: function() {\n\t},\n\n\tupdateHandle: function() {\n\t\tthis.setLatLng(this._handled._corners[this._corner]);\n\t}\n\n});\n","L.DistortHandle = L.EditHandle.extend({\n\toptions: {\n\t\tTYPE: 'distort',\n\t\ticon: new L.Icon({\n\t\t\ticonUrl: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAChSURBVO3BIU4DURgGwNkvL2B6AkQTLBqP4QCoSm7DDXoBLBZHDbfgICAIZjEV3YTn9uVHdMZZtcnCfI13bIzxg0emg6Nm6QVbYz3jylEsXRrvwommb49X67jFkz80fR9Mb1YxTzqiWBSLYlEsikWxKBbFolgUi2JRLIpFsSgWxaJY03fHHOu40dH07bAzWCx9Ge/TiWbpHgdsjPGNB2f/yS+7xRCyiiZPJQAAAABJRU5ErkJggg==',\n\t\t\ticonSize: [32, 32],\n\t\t\ticonAnchor: [16, 16]}\n\t\t)\n\t},\n\n\tupdateHandle: function() {\n\t\tthis.setLatLng(this._handled._corners[this._corner]);\n\t},\n\n\t_onHandleDrag: function() {\n\t\tthis._handled._updateCorner(this._corner, this.getLatLng());\n\n\t\tthis._handled.fire('update');\n\t}\n});\n","L.RotateAndScaleHandle = L.EditHandle.extend({\n\toptions: {\n\t\tTYPE: 'rotate',\n\t\ticon: new L.Icon({\n\t\t\ticonUrl: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAHiSURBVMXBa3HbShgA0PMp/1sCCo8oCEpgTaCXgIXAJiDzyCJoAUTm4UVQAns1Y8+snWnTvJyeE16hkjDgDrfoNTMKcpC9UPiLSo8JyetkjEHxjPCMyoS199kFoz8Iv1HpMaN3qWDCHoegOKkkRwnJpRmroHgiPFEZ8IBekzEGxQtUEhKSS/fB7Ew4U+lxcGkVZG9QWWPSFAxBcdK59KApuA+yNwp2uEdx1GN25sZJZULSfAtm77SlbNjju6MvG75u+WHRWVR6rDVjMPsgwYyVZl3pLTpHkyYHOx8syMiayaJzlDTZ9YyaZNFVkiYH2ZUEBcVJJXVImuz6Js3Qofe59pq7DoOTILu+g+a288mCouk7/1iH4qTS+2QdDppbV1ZJmrnDXnPnc5UOs2Z0fUmTuyBr+krvSioJyUmQO0dZM7mepMkWnaNRkyrJB6uskTSjxY3Fll8bvmJwlDb83FJ8gMqAB80uyBY3Trb82PAfvjj6vuHnluIdKgMeNXOwctK5NKBoHitrb1RJeHRp5Ux4ojLg0aWMHGQvUOkxIWkKVsHsTPiNSo8HDC5lZIsgO6n0uMUdRvQuFQxB8UR4RmXC2vvsgtEfhL+o9JiQvE7GGBTPCK9QSUjoMWgKDthjDrIX+h/k0I7gth6N5gAAAABJRU5ErkJggg==',\n\t\t\ticonSize: [32, 32],\n\t\t\ticonAnchor: [16, 16]}\n\t\t)\n\t},\n\n\t_onHandleDrag: function() {\n\t\tvar overlay = this._handled,\n\t\t\tformerLatLng = this._handled._corners[this._corner],\n\t\t\tnewLatLng = this.getLatLng(),\n\n\t\t\tangle = this._calculateAngle(formerLatLng, newLatLng),\n\t\t\tscale = this._calculateScalingFactor(formerLatLng, newLatLng);\n\n\t\toverlay.editing._rotateBy(angle);\n\t\toverlay.editing._scaleBy(scale);\n\n\t\t/* \n\t\t checks whether the \"edgeMinWidth\" property is set and tracks the minimum edge length;\n\t\t this enables preventing scaling to zero, but we might also add an overall scale limit\n\t\t*/\t\t\n\t\tif (this._handled.options.hasOwnProperty('edgeMinWidth')){\n\t\t\tvar edgeMinWidth = this._handled.options.edgeMinWidth,\n\t\t\t w = L.latLng(overlay._corners[0]).distanceTo(overlay._corners[1]),\n\t\t\t h = L.latLng(overlay._corners[1]).distanceTo(overlay._corners[2]);\n\t\t\tif ((w > edgeMinWidth && h > edgeMinWidth) || scale > 1) {\n\t\t\t\toverlay.editing._scaleBy(scale);\n\t\t\t}\n\t\t} else {\n\t\t\toverlay.editing._scaleBy(scale);\n\t\t}\n\n\t\toverlay.fire('update');\n\t},\n\n\tupdateHandle: function() {\n\t\tthis.setLatLng(this._handled._corners[this._corner]);\n\t},\n\n\t/* Takes two latlngs and calculates the angle between them. */\n\t_calculateAngle: function(latlngA, latlngB) {\n\t\tvar map = this._handled._map,\n\n\t\t\tcenterPoint = map.latLngToLayerPoint(this._handled.getCenter()),\n\t\t\tformerPoint = map.latLngToLayerPoint(latlngA),\n\t\t\tnewPoint = map.latLngToLayerPoint(latlngB),\n\n\t\t\tinitialAngle = Math.atan2(centerPoint.y - formerPoint.y, centerPoint.x - formerPoint.x),\n\t\t\tnewAngle = Math.atan2(centerPoint.y - newPoint.y, centerPoint.x - newPoint.x);\n\n\t\treturn newAngle - initialAngle;\n\t},\n\n\t/* Takes two latlngs and calculates the scaling difference. */\n\t_calculateScalingFactor: function(latlngA, latlngB) {\n\t\tvar map = this._handled._map,\n\n\t\t\tcenterPoint = map.latLngToLayerPoint(this._handled.getCenter()),\n\t\t\tformerPoint = map.latLngToLayerPoint(latlngA),\n\t\t\tnewPoint = map.latLngToLayerPoint(latlngB),\n\n\t\t\tformerRadiusSquared = this._d2(centerPoint, formerPoint),\n\t\t\tnewRadiusSquared = this._d2(centerPoint, newPoint);\n\n\t\treturn Math.sqrt(newRadiusSquared / formerRadiusSquared);\n\t},\n\n\t/* Distance between two points in cartesian space, squared (distance formula). */\n\t_d2: function(a, b) {\n\t\tvar dx = a.x - b.x,\n\t\t\tdy = a.y - b.y;\n\n\t\treturn Math.pow(dx, 2) + Math.pow(dy, 2);\n\t}\n});\n","L.RotateHandle = L.EditHandle.extend({\n\toptions: {\n\t\tTYPE: 'rotate',\n\t\ticon: new L.Icon({\n\t\t\ticonUrl: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAHiSURBVMXBa3HbShgA0PMp/1sCCo8oCEpgTaCXgIXAJiDzyCJoAUTm4UVQAns1Y8+snWnTvJyeE16hkjDgDrfoNTMKcpC9UPiLSo8JyetkjEHxjPCMyoS199kFoz8Iv1HpMaN3qWDCHoegOKkkRwnJpRmroHgiPFEZ8IBekzEGxQtUEhKSS/fB7Ew4U+lxcGkVZG9QWWPSFAxBcdK59KApuA+yNwp2uEdx1GN25sZJZULSfAtm77SlbNjju6MvG75u+WHRWVR6rDVjMPsgwYyVZl3pLTpHkyYHOx8syMiayaJzlDTZ9YyaZNFVkiYH2ZUEBcVJJXVImuz6Js3Qofe59pq7DoOTILu+g+a288mCouk7/1iH4qTS+2QdDppbV1ZJmrnDXnPnc5UOs2Z0fUmTuyBr+krvSioJyUmQO0dZM7mepMkWnaNRkyrJB6uskTSjxY3Fll8bvmJwlDb83FJ8gMqAB80uyBY3Trb82PAfvjj6vuHnluIdKgMeNXOwctK5NKBoHitrb1RJeHRp5Ux4ojLg0aWMHGQvUOkxIWkKVsHsTPiNSo8HDC5lZIsgO6n0uMUdRvQuFQxB8UR4RmXC2vvsgtEfhL+o9JiQvE7GGBTPCK9QSUjoMWgKDthjDrIX+h/k0I7gth6N5gAAAABJRU5ErkJggg==',\n\t\t\ticonSize: [32, 32],\n\t\t\ticonAnchor: [16, 16]}\n\t\t)\n\t},\n\n\t_onHandleDrag: function() {\n\t\tvar overlay = this._handled,\n\t\t\tformerLatLng = this._handled._corners[this._corner],\n\t\t\tnewLatLng = this.getLatLng(),\n\n\t\t\tangle = this._calculateAngle(formerLatLng, newLatLng);\n\n\t\toverlay.editing._rotateBy(angle);\n\n\t\toverlay.fire('update');\n\t},\n\n\tupdateHandle: function() {\n\t\tthis.setLatLng(this._handled._corners[this._corner]);\n\t},\n\n\t/* Takes two latlngs and calculates the angle between them. */\n\t_calculateAngle: function(latlngA, latlngB) {\n\t\tvar map = this._handled._map,\n\n\t\t\tcenterPoint = map.latLngToLayerPoint(this._handled.getCenter()),\n\t\t\tformerPoint = map.latLngToLayerPoint(latlngA),\n\t\t\tnewPoint = map.latLngToLayerPoint(latlngB),\n\n\t\t\tinitialAngle = Math.atan2(centerPoint.y - formerPoint.y, centerPoint.x - formerPoint.x),\n\t\t\tnewAngle = Math.atan2(centerPoint.y - newPoint.y, centerPoint.x - newPoint.x);\n\n\t\treturn newAngle - initialAngle;\n\t},\n\n\t/* Takes two latlngs and calculates the scaling difference. */\n\t_calculateScalingFactor: function(latlngA, latlngB) {\n\t\tvar map = this._handled._map,\n\n\t\t\tcenterPoint = map.latLngToLayerPoint(this._handled.getCenter()),\n\t\t\tformerPoint = map.latLngToLayerPoint(latlngA),\n\t\t\tnewPoint = map.latLngToLayerPoint(latlngB),\n\n\t\t\tformerRadiusSquared = this._d2(centerPoint, formerPoint),\n\t\t\tnewRadiusSquared = this._d2(centerPoint, newPoint);\n\n\t\treturn Math.sqrt(newRadiusSquared / formerRadiusSquared);\n\t},\n\n\t/* Distance between two points in cartesian space, squared (distance formula). */\n\t_d2: function(a, b) {\n\t\tvar dx = a.x - b.x,\n\t\t\tdy = a.y - b.y;\n\n\t\treturn Math.pow(dx, 2) + Math.pow(dy, 2);\n\t}\n});\n","L.ScaleHandle = L.EditHandle.extend({\n\toptions: {\n\t\tTYPE: 'rotate',\n\t\ticon: new L.Icon({\n\t\t\ticonUrl:'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIHdpZHRoPSI0NTkiIGhlaWdodD0iNDY0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCA1MTIgNTEyIiB4bWw6c3BhY2U9InByZXNlcnZlIiBzdHlsZT0iIj48cmVjdCBpZD0iYmFja2dyb3VuZHJlY3QiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHg9IjAiIHk9IjAiIGZpbGw9Im5vbmUiIHN0cm9rZT0ibm9uZSIgY2xhc3M9IiIgc3R5bGU9IiIvPjxnIGNsYXNzPSJjdXJyZW50TGF5ZXIiIHN0eWxlPSIiPjx0aXRsZT5MYXllciAxPC90aXRsZT48cGF0aCBkPSJNNDU5LjA0OTE1OTUzMDQ3MTM0LDg2LjkyNjIzNDUxMjU1MDAyIFYwIGgtODUuNzE0NTczMzU2MzEyMDkgdjI3LjA0MzcxNzQwMzkwNDQ1MiBIODUuNzE0NTczMzU2MzEyMDMgVjAgSDAgdjg2LjkyNjIzNDUxMjU1MDAyIGgyNS43MTQzNzIwMDY4OTM2MjYgdjI4OS43NTQxMTUwNDE4MzM0IEgwIHY4Ni45MjYyMzQ1MTI1NTAwMiBoODUuNzE0NTczMzU2MzEyMDkgdi0yNy4wNDM3MTc0MDM5MDQ0NTIgaDI4NS43MTUyNDQ1MjEwNDAzIHYyNy4wNDM3MTc0MDM5MDQ0NTIgaDg1LjcxNDU3MzM1NjMxMjA5IHYtODYuOTI2MjM0NTEyNTUwMDIgaC0yMy44MDk2MDM3MTAwODY2OSBWODYuOTI2MjM0NTEyNTUwMDIgSDQ1OS4wNDkxNTk1MzA0NzEzNCB6TTM4NC43NjMxOTU5NTUwMDA5LDEyLjU1NjAxMTY1MTgxMjc4MSBoNjEuOTA0OTY5NjQ2MjI1Mzk2IHY2Mi43ODAwNTgyNTkwNjM5MSBoLTYxLjkwNDk2OTY0NjIyNTM5NiBWMTIuNTU2MDExNjUxODEyNzgxIHpNMTIuMzgwOTkzOTI5MjQ1MDUsMTIuNTU2MDExNjUxODEyNzgxIGg2MS45MDQ5Njk2NDYyMjUzOTYgdjYyLjc4MDA1ODI1OTA2MzkxIEgxMi4zODA5OTM5MjkyNDUwNSBWMTIuNTU2MDExNjUxODEyNzgxIHpNNzQuMjg1OTYzNTc1NDcwNTMsNDUxLjA1MDU3MjQxNTEyMDY2IEgxMi4zODA5OTM5MjkyNDUwNSB2LTYyLjc4MDA1ODI1OTA2MzkxIGg2MS45MDQ5Njk2NDYyMjUzOTYgVjQ1MS4wNTA1NzI0MTUxMjA2NiB6TTQ0NS43MTU3ODE0NTI4MjI3NCw0NTEuMDUwNTcyNDE1MTIwNjYgaC02Mi44NTczNTM3OTQ2Mjg4NjQgdi02Mi43ODAwNTgyNTkwNjM5MSBoNjIuODU3MzUzNzk0NjI4ODY0IFY0NTEuMDUwNTcyNDE1MTIwNjYgek00MDcuNjIwNDE1NTE2Njg0MjYsMzc2LjY4MDM0OTU1NDM4MzQ0IGgtMzYuMTkwNTk3NjM5MzMxNzcgdjMyLjgzODc5OTcwNDc0MTEyIEg4NS43MTQ1NzMzNTYzMTIwMyB2LTMyLjgzODc5OTcwNDc0MTEyIEg0OS41MjM5NzU3MTY5ODAzMiBWODYuOTI2MjM0NTEyNTUwMDIgaDM2LjE5MDU5NzYzOTMzMTc3IFY1MC4yMjQwNDY2MDcyNTExMjUgaDI4Ny42MjAwMTI4MTc4NDcyIHYzNi43MDIxODc5MDUyOTg5IGgzNC4yODU4MjkzNDI1MjQ4MzUgVjM3Ni42ODAzNDk1NTQzODM0NCB6IiBpZD0ic3ZnXzIiIGNsYXNzPSIiIGZpbGw9IiMxYTFhZWIiIGZpbGwtb3BhY2l0eT0iMSIvPjwvZz48L3N2Zz4=',\n\t\t\ticonSize: [32, 32],\n\t\t\ticonAnchor: [16, 16]}\n\t\t)\n\t},\n\n\t_onHandleDrag: function() {\n\t\tvar overlay = this._handled,\n\t\t\tformerLatLng = this._handled._corners[this._corner],\n\t\t\tnewLatLng = this.getLatLng(),\n\n\t\t\tscale = this._calculateScalingFactor(formerLatLng, newLatLng);\n\n\t\toverlay.editing._scaleBy(scale);\n\n\t\toverlay.fire('update');\n\t},\n\n\tupdateHandle: function() {\n\t\tthis.setLatLng(this._handled._corners[this._corner]);\n\t},\n\n\t/* Takes two latlngs and calculates the angle between them. */\n\t_calculateAngle: function(latlngA, latlngB) {\n\t\tvar map = this._handled._map,\n\n\t\t\tcenterPoint = map.latLngToLayerPoint(this._handled.getCenter()),\n\t\t\tformerPoint = map.latLngToLayerPoint(latlngA),\n\t\t\tnewPoint = map.latLngToLayerPoint(latlngB),\n\n\t\t\tinitialAngle = Math.atan2(centerPoint.y - formerPoint.y, centerPoint.x - formerPoint.x),\n\t\t\tnewAngle = Math.atan2(centerPoint.y - newPoint.y, centerPoint.x - newPoint.x);\n\n\t\treturn newAngle - initialAngle;\n\t},\n\n\t/* Takes two latlngs and calculates the scaling difference. */\n\t_calculateScalingFactor: function(latlngA, latlngB) {\n\t\tvar map = this._handled._map,\n\n\t\t\tcenterPoint = map.latLngToLayerPoint(this._handled.getCenter()),\n\t\t\tformerPoint = map.latLngToLayerPoint(latlngA),\n\t\t\tnewPoint = map.latLngToLayerPoint(latlngB),\n\n\t\t\tformerRadiusSquared = this._d2(centerPoint, formerPoint),\n\t\t\tnewRadiusSquared = this._d2(centerPoint, newPoint);\n\n\t\treturn Math.sqrt(newRadiusSquared / formerRadiusSquared);\n\t},\n\n\t/* Distance between two points in cartesian space, squared (distance formula). */\n\t_d2: function(a, b) {\n\t\tvar dx = a.x - b.x,\n\t\t\tdy = a.y - b.y;\n\n\t\treturn Math.pow(dx, 2) + Math.pow(dy, 2);\n\t}\n});\n","L.DistortableImageOverlay = L.ImageOverlay.extend({\n\tinclude: L.Mixin.Events,\n\n\toptions: {\n\t\talt: '',\n\t\theight: 200,\n\t\tcrossOrigin: true\n\t},\n\n\tinitialize: function(url, options) {\n\t\t\tthis._toolArray = L.DistortableImage.EditToolbarDefaults;\n\t\t\tthis._url = url;\n\t\t\tthis._rotation = this.options.rotation;\n\n\t\t\tL.setOptions(this, options);\n\t},\n\n\tonAdd: function(map) {\n\t\t/* Copied from L.ImageOverlay */\n\t\tthis._map = map;\n\n\t\t// this._div = $(this._pane).append($(\"
\"));\n\t\tif (!this._image) { this._initImage(); }\n\t\tif (!this._events) { this._initEvents(); }\n\n\t\tmap._panes.overlayPane.appendChild(this._image);\n\n\t\tif (!this._divNode) { \n\t\t\tthis._divNode = document.createElement(\"div\");\n\t\t\t// this._divNode = divNode;\n\t\t\tthis._divNode.setAttribute(\"id\", \"holding\");\n\t\t\tmap._panes.overlayPane.appendChild(this._divNode); \n\t\t}\n\n\t\tmap.on('viewreset', this._reset, this);\n\t\t/* End copied from L.ImageOverlay */\n\n\t\t/* Use provided corners if available */\n\t\tif (this.options.corners) {\n\t\t\tthis._corners = this.options.corners;\n\t\t\tif (map.options.zoomAnimation && L.Browser.any3d) {\n\t\t\t\tmap.on('zoomanim', this._animateZoom, this);\n\t\t\t}\n\n\t\t\t/* This reset happens before image load; it allows\n\t\t\t * us to place the image on the map earlier with\n\t\t\t * \"guessed\" dimensions. */\n\t\t\tthis._reset();\n\t\t}\n\n\t\t/* Have to wait for the image to load because\n\t\t * we need to access its width and height. */\n\t\tL.DomEvent.on(this._image, 'load', function() {\n\t\t\tthis._initImageDimensions();\n\t\t\tthis._reset();\n\t\t\t/* Initialize default corners if not already set */\n\t\t\tif (!this._corners) {\n\t\t\t\tif (map.options.zoomAnimation && L.Browser.any3d) {\n\t\t\t\t\tmap.on('zoomanim', this._animateZoom, this);\n\t\t\t\t}\n\t\t\t}\n\t\t}, this);\n\n\t\tthis.fire('add');\n\t},\n\n\tonRemove: function(map) {\n\t\tthis.fire('remove');\n\n\t\tL.ImageOverlay.prototype.onRemove.call(this, map);\n\t},\n\n\t_initImage: function () {\n\t\tL.ImageOverlay.prototype._initImage.call(this);\n\n\t\tL.extend(this._image, {\n\t\t\talt: this.options.alt\n\t\t});\n\t},\n\n\tsetAnchors: function (anchors) {\n\t\tthis._anchors = [];\n\t\tthis._bounds = L.latLngBounds(anchors);\n\t\tfor (var i = 0, len = anchors.length; i < len; i++) {\n\t\t\tvar yx = anchors[i];\n\t\t\tthis._anchors.push(L.latLng(yx));\n\t\t}\n\n\t\tif (this._map) {\n\t\t\tthis._reset();\n\t\t}\n\t},\n\n\n\t_addTool: function(tool) {\n\t\tthis._toolArray.push(tool);\n\t\tL.DistortableImage.EditToolbar = LeafletToolbar.Popup.extend({\n\t\t\toptions: {\n\t\t\t\tactions: this._toolArray\n\t\t\t}\n\t\t});\n\t},\n\n\t_initImageDimensions: function() {\n\t\tvar map = this._map,\n\n\t\t\toriginalImageWidth = L.DomUtil.getStyle(this._image, 'width'),\n\t\t\toriginalImageHeight = L.DomUtil.getStyle(this._image, 'height'),\n\n\t\t\taspectRatio = parseInt(originalImageWidth) / parseInt(originalImageHeight),\n\n\t\t\timageHeight = this.options.height,\n\t\t\timageWidth = parseInt(aspectRatio*imageHeight),\n\n\t\t\tcenter = map.latLngToContainerPoint(map.getCenter()),\n\t\t\toffset = new L.Point(imageWidth, imageHeight).divideBy(2);\n\n\t\tif (this.options.corners) { this._corners = this.options.corners; }\n\t\telse {\n\t\t\tthis._corners = [\n\t\t\t\tmap.containerPointToLatLng(center.subtract(offset)),\n\t\t\t\tmap.containerPointToLatLng(center.add(new L.Point(offset.x, - offset.y))),\n\t\t\t\tmap.containerPointToLatLng(center.add(new L.Point(- offset.x, offset.y))),\n\t\t\t\tmap.containerPointToLatLng(center.add(offset))\n\t\t\t];\n\t\t}\n\t},\n\n \t_initEvents: function() {\n \t\tthis._events = [ 'click' ];\n\n \t\tfor (var i = 0, l = this._events.length; i < l; i++) {\n\t \t\tL.DomEvent.on(this._image, this._events[i], this._fireMouseEvent, this);\n \t\t}\n \t},\n\n \t/* See src/layer/vector/Path.SVG.js in the Leaflet source. */\n \t_fireMouseEvent: function(event) {\n \t\tif (!this.hasEventListeners(event.type)) { return; }\n\n\t\tvar map = this._map,\n\t\t\tcontainerPoint = map.mouseEventToContainerPoint(event),\n\t\t\tlayerPoint = map.containerPointToLayerPoint(containerPoint),\n\t\t\tlatlng = map.layerPointToLatLng(layerPoint);\n\n\t\tthis.fire(event.type, {\n\t\t\tlatlng: latlng,\n\t\t\tlayerPoint: layerPoint,\n\t\t\tcontainerPoint: containerPoint,\n\t\t\toriginalEvent: event\n\t\t});\n \t},\n\n\t_updateCorner: function(corner, latlng) {\n\t\tthis._corners[corner] = latlng;\n\t\tthis._reset();\n\t},\n\n\n\t/* Copied from Leaflet v0.7 https://github.com/Leaflet/Leaflet/blob/66282f14bcb180ec87d9818d9f3c9f75afd01b30/src/dom/DomUtil.js#L189-L199 */\n\t/* since L.DomUtil.getTranslateString() is deprecated in Leaflet v1.0 */\n\t_getTranslateString: function (point) {\n\t\t// on WebKit browsers (Chrome/Safari/iOS Safari/Android) using translate3d instead of translate\n\t\t// makes animation smoother as it ensures HW accel is used. Firefox 13 doesn't care\n\t\t// (same speed either way), Opera 12 doesn't support translate3d\n\n\t\tvar is3d = L.Browser.webkit3d,\n\t\t open = 'translate' + (is3d ? '3d' : '') + '(',\n\t\t close = (is3d ? ',0' : '') + ')';\n\n\t\treturn open + point.x + 'px,' + point.y + 'px' + close;\n\t},\n\n\t_reset: function() {\n\t\tvar map = this._map,\n\t\t\timage = this._image,\n\t\t\tlatLngToLayerPoint = L.bind(map.latLngToLayerPoint, map),\n\n\t\t\ttransformMatrix = this._calculateProjectiveTransform(latLngToLayerPoint),\n\t\t\ttopLeft = latLngToLayerPoint(this._corners[0]),\n\n\t\t\twarp = L.DomUtil.getMatrixString(transformMatrix),\n\t\t\ttranslation = this._getTranslateString(topLeft);\n\n\t\t/* See L.DomUtil.setPosition. Mainly for the purposes of L.Draggable. */\n\t\timage._leaflet_pos = topLeft;\n\n\t\timage.style[L.DomUtil.TRANSFORM] = [translation, warp].join(' ');\n\n\t\t/* Set origin to the upper-left corner rather than the center of the image, which is the default. */\n\t\timage.style[L.DomUtil.TRANSFORM + '-origin'] = \"0 0 0\";\n\t},\n\n\t/*\n\t * Calculates the transform string that will be correct *at the end* of zooming.\n\t * Leaflet then generates a CSS3 animation between the current transform and\n\t *\t\t future transform which makes the transition appear smooth.\n\t */\n\t_animateZoom: function(event) {\n\t\tvar map = this._map,\n\t\t\timage = this._image,\n\t\t\tlatLngToNewLayerPoint = function(latlng) {\n\t\t\t\treturn map._latLngToNewLayerPoint(latlng, event.zoom, event.center);\n\t\t\t},\n\n\t\t\ttransformMatrix = this._calculateProjectiveTransform(latLngToNewLayerPoint),\n\t\t\ttopLeft = latLngToNewLayerPoint(this._corners[0]),\n\n\t\t\twarp = L.DomUtil.getMatrixString(transformMatrix),\n\t\t\ttranslation = this._getTranslateString(topLeft);\n\n\t\t/* See L.DomUtil.setPosition. Mainly for the purposes of L.Draggable. */\n\t\timage._leaflet_pos = topLeft;\n\n\t\tif (!L.Browser.gecko) {\n\t\t\timage.style[L.DomUtil.TRANSFORM] = [translation, warp].join(' ');\n\t\t}\n\t},\n\n\tgetCorners: function() {\n\t\treturn this._corners;\n\t},\n\n\t/*\n\t * Calculates the centroid of the image.\n\t *\t\t See http://stackoverflow.com/questions/6149175/logical-question-given-corners-find-center-of-quadrilateral\n\t */\n\tgetCenter: function(ll2c, c2ll) {\n\t\tvar map = this._map,\n\t\t\tlatLngToCartesian = ll2c ? ll2c : map.latLngToLayerPoint,\n\t\t\tcartesianToLatLng = c2ll ? c2ll: map.layerPointToLatLng,\n\t\t\tnw = latLngToCartesian.call(map, this._corners[0]),\n\t\t\tne = latLngToCartesian.call(map, this._corners[1]),\n\t\t\tse = latLngToCartesian.call(map, this._corners[2]),\n\t\t\tsw = latLngToCartesian.call(map, this._corners[3]),\n\n\t\t\tnmid = nw.add(ne.subtract(nw).divideBy(2)),\n\t\t\tsmid = sw.add(se.subtract(sw).divideBy(2));\n\n\t\treturn cartesianToLatLng.call(map, nmid.add(smid.subtract(nmid).divideBy(2)));\n\t},\n\n\t_calculateProjectiveTransform: function(latLngToCartesian) {\n\t\t/* Setting reasonable but made-up image defaults\n\t\t * allow us to place images on the map before\n\t\t * they've finished downloading. */\n\t\tvar offset = latLngToCartesian(this._corners[0]),\n\t\t\tw = this._image.offsetWidth || 500,\n\t\t\th = this._image.offsetHeight || 375,\n\t\t\tc = [],\n\t\t\tj;\n\t\t/* Convert corners to container points (i.e. cartesian coordinates). */\n\t\tfor (j = 0; j < this._corners.length; j++) {\n\t\t\tc.push(latLngToCartesian(this._corners[j])._subtract(offset));\n\t\t}\n\n\t\t/*\n\t\t * This matrix describes the action of the CSS transform on each corner of the image.\n\t\t * It maps from the coordinate system centered at the upper left corner of the image\n\t\t *\t\t to the region bounded by the latlngs in this._corners.\n\t\t * For example:\n\t\t *\t\t 0, 0, c[0].x, c[0].y\n\t\t *\t\t says that the upper-left corner of the image maps to the first latlng in this._corners.\n\t\t */\n\t\treturn L.MatrixUtil.general2DProjection(\n\t\t\t0, 0, c[0].x, c[0].y,\n\t\t\tw, 0, c[1].x, c[1].y,\n\t\t\t0, h, c[2].x, c[2].y,\n\t\t\tw, h, c[3].x, c[3].y\n\t\t);\n\t}\n});\n","L.DistortableImage = L.DistortableImage || {};\n\nvar EditOverlayAction = LeafletToolbar.ToolbarAction.extend({\n\t\tinitialize: function(map, overlay, options) {\n\t\t\tthis._overlay = overlay;\n\t\t\tthis._map = map;\n\n\t\t\tLeafletToolbar.ToolbarAction.prototype.initialize.call(this, options);\n\t\t}\n\t}),\n\n\tToggleTransparency = EditOverlayAction.extend({\n\t\toptions: { toolbarIcon: {\n\t\t\thtml: '',\n\t\t\ttooltip: 'Toggle Image Transparency',\n\t\t\ttitle: 'Toggle Image Transparency'\n\t\t}},\n\n\t\taddHooks: function() {\n\t\t\tvar editing = this._overlay.editing;\n\n\t\t\tediting._toggleTransparency();\n\t\t\tthis.disable();\n\t\t}\n\t}),\n\n\tToggleOutline = EditOverlayAction.extend({\n\t\toptions: { toolbarIcon: {\n\t\t\thtml: '',\n\t\t\ttooltip: 'Toggle Image Outline',\n\t\t\ttitle: 'Toggle Image Outline'\n\t\t}},\n\n\t\taddHooks: function() {\n\t\t\tvar editing = this._overlay.editing;\n\n\t\t\tediting._toggleOutline();\n\t\t\tthis.disable();\n\t\t}\n\t}),\n\n\tRemoveOverlay = EditOverlayAction.extend({\n\t\toptions: { toolbarIcon: {\n\t\t\thtml: '',\n\t\t\ttooltip: 'Delete image',\n\t\t\ttitle: 'Delete image'\n\t\t}},\n\n\t\taddHooks: function() {\n\t\t\tvar map = this._map;\n\n\t\t\tmap.removeLayer(this._overlay);\n\t\t\tthis._overlay.fire('delete');\n\t\t\tthis.disable();\n\t\t}\n\t}),\n\n\tToggleEditable = EditOverlayAction.extend({\n\t\toptions: { toolbarIcon: {\n\t\t\thtml: '',\n\t\t\ttooltip: 'Lock / Unlock editing',\n\t\t\ttitle: 'Lock / Unlock editing'\n\t\t}},\n\n\t\taddHooks: function() {\n\t\t\tvar editing = this._overlay.editing;\n\n\t\t\tediting._toggleLock();\n\t\t\tthis.disable();\n\t\t}\n\t}),\n\n\tToggleRotateDistort = EditOverlayAction.extend({\n\t\tinitialize: function(map, overlay, options) {\n\t\t\tvar icon = overlay.editing._mode === 'rotate' ? 'image' : 'rotate-left';\n\n\t\t\toptions = options || {};\n\t\t\toptions.toolbarIcon = {\n\t\t\t\thtml: '',\n\t\t\t\ttooltip: 'Rotate',\n\t\t\t\ttitle: 'Rotate'\n\t\t\t};\n\n\t\t\tEditOverlayAction.prototype.initialize.call(this, map, overlay, options);\n\t\t},\n\n\t\taddHooks: function() {\n\t\t\tvar editing = this._overlay.editing;\n\n\t\t\tediting._toggleRotateDistort();\n\t\t\tthis.disable();\n\t\t}\n\t}),\n\n\n\tToggleExport = EditOverlayAction.extend({\n\t\toptions: {\n\t\t\ttoolbarIcon: {\n\t\t\t\thtml: '',\n\t\t\t\ttooltip: 'Export Image',\n\t\t\t\ttitle: 'Export Image'\n\t\t\t}\n\t\t},\n\n\t\taddHooks: function ()\n\t\t{\n\t\t\tvar editing = this._overlay.editing;\n\n\t\t\tediting._toggleExport();\n\t\t\tthis.disable();\n\t\t}\n\t}),\n\n\tToggleOrder = EditOverlayAction.extend({\n\t\toptions: {\n\t\t\ttoolbarIcon: {\n\t\t\t\thtml: '',\n\t\t\t\ttooltip: 'Change order',\n\t\t\t\ttitle: 'Toggle order'\n\t\t\t}\n\t\t},\n\n\t\taddHooks: function ()\n\t\t{\n\t\t\tvar editing = this._overlay.editing;\n\n\t\t\tediting._toggleOrder();\n\t\t\tthis.disable();\n\t\t}\n\t});\n\nL.DistortableImage.EditToolbar = LeafletToolbar.Popup.extend({\n\toptions: {\n\t\tactions: [\n\t\t\tToggleTransparency,\n\t\t\tRemoveOverlay,\n\t\t\tToggleOutline,\n\t\t\tToggleEditable,\n\t\t\tToggleRotateDistort,\n\t\t\tToggleExport,\n\t\t\tToggleOrder\n\t\t]\n\t}\n});\n","L.DistortableImage = L.DistortableImage || {};\n\nL.DistortableImage.Edit = L.Handler.extend({\n\toptions: {\n\t\topacity: 0.7,\n\t\toutline: '1px solid red',\n\t\tkeymap: {\n\t\t\t8: \"_removeOverlay\", // backspace windows / delete mac\n\t\t\t46: \"_removeOverlay\", // delete windows / delete + fn mac\n\t\t\t20: '_toggleRotate', // CAPS\n\t\t\t68: '_toggleRotateDistort', // d\n\t\t\t69: '_toggleIsolate', // e\n\t\t\t73: '_toggleIsolate', // i\n\t\t\t74: '_sendUp', // j\n\t\t\t75: '_sendDown', // k\n\t\t\t76: '_toggleLock', // l\n\t\t\t79: '_toggleOutline', // o\n\t\t\t82: '_toggleRotateDistort', // r\n\t\t\t83: '_toggleScale', // s\n\t\t\t84: '_toggleTransparency', // t\n\t\t}\n\t},\n\n\tinitialize: function(overlay) {\n\t\tthis._overlay = overlay;\n\t\tthis._toggledImage = false;\n\n\t\t/* Interaction modes. */\n\t\tthis._mode = this._overlay.options.mode || 'distort';\n\t\tthis._transparent = false;\n\t\tthis._outlined = false;\n\t},\n\n\t/* Run on image seletion. */\n\taddHooks: function() {\n\t\tvar overlay = this._overlay,\n\t\t\tmap = overlay._map,\n\t\t\ti;\n\n\t\tthis._lockHandles = new L.LayerGroup();\n\t\tfor (i = 0; i < 4; i++) {\n\t\t\tthis._lockHandles.addLayer(new L.LockHandle(overlay, i, { draggable: false }));\n\t\t}\n\n\t\tthis._distortHandles = new L.LayerGroup();\n\t\tfor (i = 0; i < 4; i++) {\n\t\t\tthis._distortHandles.addLayer(new L.DistortHandle(overlay, i));\n\t\t}\n\n\t\tthis._rotateHandles = new L.LayerGroup(); // handle includes rotate AND scale\n\t\tfor (i = 0; i < 4; i++) {\n\t\t\tthis._rotateHandles.addLayer(new L.RotateAndScaleHandle(overlay, i));\n\t\t}\n\n\t\tthis._scaleHandles = new L.LayerGroup();\n\t\tfor (i = 0; i < 4; i++) {\n\t\t\tthis._scaleHandles.addLayer(new L.ScaleHandle(overlay, i));\n\t\t}\n\n\t\tthis.__rotateHandles = new L.LayerGroup(); // individual rotate\n\t\tfor (i = 0; i < 4; i++) {\n\t\t\tthis.__rotateHandles.addLayer(new L.RotateHandle(overlay, i));\n\t\t}\n\n\t\tthis._handles = {\n\t\t\t'lock':\t\t this._lockHandles,\n\t\t\t'distort': this._distortHandles,\n\t\t\t'rotate':\tthis._rotateHandles,\n\t\t\t'scale': this._scaleHandles,\n\t\t\t'rotateStandalone': this.__rotateHandles\n\t\t};\n\n if (this._mode === 'lock') {\n\t\t\tmap.addLayer(this._lockHandles);\n\t\t} else {\n\t\t\tthis._mode = 'distort';\n\t\t\tmap.addLayer(this._distortHandles);\n\t\t\tthis._enableDragging();\n\t\t}\n\n\t\t//overlay.on('click', this._showToolbar, this);\n\t\tL.DomEvent.on(overlay._image, 'click', this._showToolbar, this);\n\n\t\t/* Enable hotkeys. */\n\t\tL.DomEvent.on(window, 'keydown', this._onKeyDown, this);\n\n\t\toverlay.fire('select');\n\n\t},\n\n\t/* Run on image deseletion. */\n\tremoveHooks: function() {\n\t\tvar overlay = this._overlay,\n\t\t\tmap = overlay._map;\n\n\t\t// L.DomEvent.off(window, 'keydown', this._onKeyDown, this);\n\n\t\tL.DomEvent.off(overlay._image, 'click', this._showToolbar, this);\n\n\t\t// First, check if dragging exists;\n\t\t// it may be off due to locking\n\t\tif (this.dragging) { this.dragging.disable(); }\n\t\tdelete this.dragging;\n\n\t\tmap.removeLayer(this._handles[this._mode]);\n\n \t\t/* Disable hotkeys. */\n\t\tL.DomEvent.off(window, 'keydown', this._onKeyDown, this);\n\n\t\toverlay.fire('deselect');\n },\n\n confirmDelete: function () {\n return window.confirm(\"Are you sure you want to delete?\");\n },\n\n\n\t_rotateBy: function(angle) {\n\t\tvar overlay = this._overlay,\n\t\t\tmap = overlay._map,\n\t\t\tcenter = map.latLngToLayerPoint(overlay.getCenter()),\n\t\t\ti, p, q;\n\n\t\tfor (i = 0; i < 4; i++) {\n\t\t\tp = map.latLngToLayerPoint(overlay._corners[i]).subtract(center);\n\t\t\tq = new L.Point(\n\t\t\t\tMath.cos(angle)*p.x - Math.sin(angle)*p.y,\n\t\t\t\tMath.sin(angle)*p.x + Math.cos(angle)*p.y\n\t\t\t);\n\t\t\toverlay._corners[i] = map.layerPointToLatLng(q.add(center));\n\t\t}\n\n\t\toverlay._reset();\n\t},\n\n\t_scaleBy: function(scale) {\n\t\tvar overlay = this._overlay,\n\t\t\tmap = overlay._map,\n\t\t\tcenter = map.latLngToLayerPoint(overlay.getCenter()),\n\t\t\ti, p;\n\n\t\tfor (i = 0; i < 4; i++) {\n\t\t\tp = map.latLngToLayerPoint(overlay._corners[i])\n\t\t\t\t.subtract(center)\n\t\t\t\t.multiplyBy(scale)\n\t\t\t\t.add(center);\n\t\t\toverlay._corners[i] = map.layerPointToLatLng(p);\n\t\t}\n\n\t\toverlay._reset();\n\t},\n\n\t_enableDragging: function() {\n\t\tvar overlay = this._overlay,\n\t\t\tmap = overlay._map;\n\n\t\tthis.dragging = new L.Draggable(overlay._image);\n\t\tthis.dragging.enable();\n\n\t\t/* Hide toolbars while dragging; click will re-show it */\n\t\tthis.dragging.on('dragstart', this._hideToolbar, this);\n\n\t\t/*\n\t\t * Adjust default behavior of L.Draggable.\n\t\t * By default, L.Draggable overwrites the CSS3 distort transform\n\t\t * that we want when it calls L.DomUtil.setPosition.\n\t\t */\n\t\tthis.dragging._updatePosition = function() {\n\t\t\tvar delta = this._newPos.subtract(map.latLngToLayerPoint(overlay._corners[0])),\n\t\t\t\tcurrentPoint, i;\n\n\t\t\tthis.fire('predrag');\n\n\t\t\tfor (i = 0; i < 4; i++) {\n\t\t\t\tcurrentPoint = map.latLngToLayerPoint(overlay._corners[i]);\n\t\t\t\toverlay._corners[i] = map.layerPointToLatLng(currentPoint.add(delta));\n\t\t\t}\n\t\t\toverlay._reset();\n\t\t\toverlay.fire('update');\n\n\t\t\tthis.fire('drag');\n\t\t};\n\t},\n\n\t_onKeyDown: function(event) {\n\t\tvar keymap = this.options.keymap,\n\t\t\thandlerName = keymap[event.which];\n\n\t\tif (handlerName !== undefined && this._overlay.options.suppressToolbar !== true) {\n\t\t\tthis[handlerName].call(this);\n\t\t}\n\t},\n\n\t_toggleRotateDistort: function() {\n\t\tvar map = this._overlay._map;\n\n\t\tmap.removeLayer(this._handles[this._mode]);\n\n\t\t/* Switch mode. */\n\t\tif (this._mode === 'rotate') { this._mode = 'distort'; }\n\t\telse { this._mode = 'rotate'; }\n\n\t\tmap.addLayer(this._handles[this._mode]);\n\t},\n\n\t_toggleScale: function() {\n\t\tvar map = this._overlay._map;\n\n\t\tmap.removeLayer(this._handles[this._mode]);\n\n\t\tthis._mode = 'scale';\n\n\t\tmap.addLayer(this._handles[this._mode]);\n\t},\n\n\t_toggleRotate: function() {\n\t\tvar map = this._overlay._map;\n\n\t\tmap.removeLayer(this._handles[this._mode]);\n\n\t\tthis._mode = 'rotateStandalone';\n\n\t\tmap.addLayer(this._handles[this._mode]);\n\t},\n\n\t_toggleTransparency: function() {\n\t\tvar image = this._overlay._image,\n\t\t\topacity;\n\n\t\tthis._transparent = !this._transparent;\n\t\topacity = this._transparent ? this.options.opacity : 1;\n\n\t\tL.DomUtil.setOpacity(image, opacity);\n\t\timage.setAttribute('opacity', opacity);\n\t},\n\n\t_toggleOutline: function() {\n\t\tvar image = this._overlay._image,\n\t\t\topacity, outline;\n\n\t\tthis._outlined = !this._outlined;\n\t\topacity = this._outlined ? this.options.opacity / 2 : 1;\n\t\toutline = this._outlined ? this.options.outline : 'none';\n\n\t\tL.DomUtil.setOpacity(image, opacity);\n\t\timage.setAttribute('opacity', opacity);\n\n\t\timage.style.outline = outline;\n\t},\n\n\t_sendUp: function() {\n\t\tthis._overlay.bringToFront();\n\t},\n\n\t_sendDown: function() {\n\t\tthis._overlay.bringToBack();\n\t},\n\n\t_toggleLock: function() {\n\t\tvar map = this._overlay._map;\n\n\t\tmap.removeLayer(this._handles[this._mode]);\n\t\t/* Switch mode. */\n\t\tif (this._mode === 'lock') {\n\t\t\tthis._mode = 'distort';\n\t\t\tthis._enableDragging();\n\t\t} else {\n\t\t\tthis._mode = 'lock';\n\t\t\tif (this.dragging) { this.dragging.disable(); }\n\t\t\tdelete this.dragging;\n\t\t}\n\n\t\tmap.addLayer(this._handles[this._mode]);\n\t},\n\n\t_hideToolbar: function() {\n\t\tvar map = this._overlay._map;\n\t\tif (this.toolbar) {\n\t\t\tmap.removeLayer(this.toolbar);\n\t\t\tthis.toolbar = false;\n\t\t}\n\t},\n\n\t_showToolbar: function(event) {\n\t\tvar overlay = this._overlay,\n target = event.target,\n\t\t\tmap = overlay._map;\n\n\t\t/* Ensure that there is only ever one toolbar attached to each image. */\n\t\tthis._hideToolbar();\n\t\tvar point;\n\t\tif (event.containerPoint) { point = event.containerPoint; }\n\t\telse { point = target._leaflet_pos; }\n\t\tvar raised_point = map.containerPointToLatLng(new L.Point(point.x,point.y-20));\n\t\traised_point.lng = overlay.getCenter().lng;\n\t\tif (this._overlay.options.suppressToolbar !== true) {\n\t\tthis.toolbar = new L.DistortableImage.EditToolbar(raised_point).addTo(map, overlay);\n\t\toverlay.fire('toolbar:created');\n\t\t}\n\n\t\tL.DomEvent.stopPropagation(event);\n },\n\n _removeOverlay: function () {\n var overlay = this._overlay;\n if (this._mode !== \"lock\") {\n var choice = this.confirmDelete();\n if (choice) {\n overlay._map.removeLayer(overlay);\n overlay.fire('delete');\n this.disable();\n }\n }\n },\n\t// compare this to using overlay zIndex\n\t_toggleOrder: function () {\n\tif (this._toggledImage) {\n\t\tthis._overlay.bringToFront();\n\t\tthis._toggledImage = false;\n\t\t}\n\telse {\n\t\tthis._overlay.bringToBack();\n\t\tthis._toggledImage = true;\n\t\t}\n\t},\n\n\t// Based on https://github.com/publiclab/mapknitter/blob/8d94132c81b3040ae0d0b4627e685ff75275b416/app/assets/javascripts/mapknitter/Map.js#L47-L82\n\t_toggleExport: function (){\n\t\tvar map = this._overlay._map;\n\t\tvar overlay = this._overlay;\n\n\t\t// make a new image\n\t\tvar downloadable = new Image();\n\n\t\tdownloadable.id = downloadable.id || \"tempId12345\";\n\t\t$('body').append(downloadable);\n\n\t\tdownloadable.onload = function onLoadDownloadableImage() {\n\n\t\t\tvar height = downloadable.height,\n\t\t\t\twidth = downloadable.width,\n\t\t\t\tnw = map.latLngToLayerPoint(overlay._corners[0]),\n\t\t\t\tne = map.latLngToLayerPoint(overlay._corners[1]),\n\t\t\t\tsw = map.latLngToLayerPoint(overlay._corners[2]),\n\t\t\t\tse = map.latLngToLayerPoint(overlay._corners[3]);\n\n\t\t\t// I think this is to move the image to the upper left corner,\n\t\t\t// jywarren: i think we may need these or the image goes off the edge of the canvas\n // jywarren: but these seem to break the distortion math...\n\n\t\t\t// jywarren: i think it should be rejiggered so it\n\t\t\t// finds the most negative values of x and y and then\n\t\t\t// adds those to all coordinates\n\n\t\t\t//nw.x -= nw.x;\n\t\t\t//ne.x -= nw.x;\n\t\t\t//se.x -= nw.x;\n\t\t\t//sw.x -= nw.x;\n\n\t\t\t//nw.y -= nw.y;\n\t\t\t//ne.y -= nw.y;\n\t\t\t//se.y -= nw.y;\n\t\t\t//sw.y -= nw.y;\n\n\t\t\t// run once warping is complete\n \t\t\tdownloadable.onload = function() {\n\t\t\t\t$(downloadable).remove();\n\t\t\t};\n\n\t\t\tif (window && window.hasOwnProperty('warpWebGl')) {\n\t\t\t\twarpWebGl(\n\t\t\t\t\tdownloadable.id,\n\t\t\t\t\t[0, 0, width, 0, width, height, 0, height],\n\t\t\t\t\t[nw.x, nw.y, ne.x, ne.y, se.x, se.y, sw.x, sw.y],\n\t\t\t\t\ttrue // trigger download\n\t\t\t\t);\n\t\t\t}\n\n\t\t};\n\n\t\tdownloadable.src = overlay.options.fullResolutionSrc || overlay._image.src;\n\n\t},\n\n\ttoggleIsolate: function() {\n\t\t// this.isolated = !this.isolated;\n\t\t// if (this.isolated) {\n\t\t// \t$.each($L.images,function(i,img) {\n\t\t// \t\timg.hidden = false;\n\t\t// \t\timg.setOpacity(1);\n\t\t// \t});\n\t\t// } else {\n\t\t// \t$.each($L.images,function(i,img) {\n\t\t// \t\timg.hidden = true;\n\t\t// \t\timg.setOpacity(0);\n\t\t// \t});\n\t\t// }\n\t\t// this.hidden = false;\n\t\t// this.setOpacity(1);\n\t}\n\n});\n\nL.DistortableImageOverlay.addInitHook(function() {\n\tthis.editing = new L.DistortableImage.Edit(this);\n\n\tif (this.options.editable) {\n\t\tL.DomEvent.on(this._image, 'load', this.editing.enable, this.editing);\n\t}\n\n\tthis.on('remove', function () {\n\t\tif (this.editing) { this.editing.disable(); }\n\t});\n});\n","L.Map.mergeOptions({ boxSelector: true, boxZoom: false });\n\nL.Map.BoxSelectHandle = L.Map.BoxZoom.extend({\n\n initialize: function (map) {\n this._map = map;\n this._container = map._container;\n this._pane = map._panes.overlayPane;\n },\n\n addHooks: function () {\n L.DomEvent.on(this._container, 'mousedown', this._onMouseDown, this);\n },\n\n removeHooks: function () {\n L.DomEvent.off(this._container, 'mousedown', this._onMouseDown, this);\n },\n\n _onMouseDown: function (e) {\n if (!e.shiftKey || ((e.which !== 1) && (e.button !== 1))) { return false; }\n\n L.DomUtil.disableTextSelection();\n L.DomUtil.disableImageDrag();\n\n this._startLayerPoint = this._map.mouseEventToLayerPoint(e);\n\n this._box = L.DomUtil.create('div', 'leaflet-zoom-box', this._pane);\n L.DomUtil.setPosition(this._box, this._startLayerPoint);\n\n this._container.style.cursor = 'crosshair';\n\n L.DomEvent\n .on(document, 'mousemove', this._onMouseMove, this)\n .on(document, 'mouseup', this._onMouseUp, this)\n .on(document, 'keydown', this._onKeyDown, this)\n .preventDefault(e);\n\n this._map.fire('boxzoomstart');\n },\n\n _onMouseMove: function (e) {\n var startPoint = this._startLayerPoint,\n box = this._box,\n\n layerPoint = this._map.mouseEventToLayerPoint(e),\n offset = layerPoint.subtract(startPoint),\n\n newPos = new L.Point(\n Math.min(layerPoint.x, startPoint.x),\n Math.min(layerPoint.y, startPoint.y));\n\n L.DomUtil.setPosition(box, newPos);\n\n box.style.width = (Math.max(0, Math.abs(offset.x) - 4)) + 'px';\n box.style.height = (Math.max(0, Math.abs(offset.y) - 4)) + 'px';\n },\n\n _onMouseUp: function (e) {\n if (!$(this._pane).children('.leaflet-zoom-box').length) { return false; }\n // window.e = e;\n var map = this._map,\n layerPoint = map.mouseEventToLayerPoint(e);\n\n if (this._startLayerPoint.equals(layerPoint)) { return; }\n\n var bounds = new L.LatLngBounds(\n map.layerPointToLatLng(this._startLayerPoint),\n map.layerPointToLatLng(layerPoint));\n\n window.bounds = bounds;\n // window.div = this._div;\n window.box = this._box;\n window.pane = this._pane;\n window.map = map;\n window.container = this._container;\n\n map.fire('boxzoomend', {\n // boxBounds: bounds\n });\n\n\n\n let contents = $(this._pane).children();\n let images = contents.filter('img');\n\n this._finish();\n\n this._attach(images);\n\n console.log(images);\n return images;\n },\n\n _finish: function () {\n // if (!this._box) { return false; }\n // this._pane.removeChild(this._box);[]\n $(this._box).remove();\n this._container.style.cursor = '';\n\n L.DomUtil.enableTextSelection();\n L.DomUtil.enableImageDrag();\n\n L.DomEvent\n .off(document, 'mousemove', this._onMouseMove)\n .off(document, 'mouseup', this._onMouseUp)\n .off(document, 'keydown', this._onKeyDown);\n },\n\n _attach: function(images) {\n if ($('#holding')) {\n this._imagesDiv = $('#holding');\n $(images).appendTo(this._imagesDiv);\n window.imagesDiv = this._imagesDiv;\n }\n },\n\n // escape keybinding for getting rid of the selection box (alternative to mouse up). keep for now to see if it will become useful\n // in deselecting images\n _onKeyDown: function (e) {\n if (e.keyCode === 27) {\n if ($(this._pane).children('.leaflet-zoom-box').length) {\n $(this._box).remove();\n }\n // this._finish();\n }\n },\n\n});\n\nL.Map.addInitHook('addHandler', 'boxSelector', L.Map.BoxSelectHandle);"]} \ No newline at end of file +{"version":3,"sources":["../src/util/DomUtil.js","../src/util/Map._newLayerPointToLatLng.js","../src/util/MatrixUtil.js","../src/edit/EditHandle.js","../src/edit/LockHandle.js","../src/edit/DistortHandle.js","../src/edit/RotateAndScaleHandle.js","../src/edit/RotateHandle.js","../src/edit/ScaleHandle.js","../src/DistortableImageOverlay.js","../src/edit/DistortableImage.EditToolbar.js","../src/edit/DistortableImage.Edit.js","../src/edit/BoxSelectHandle.js"],"names":[],"mappings":"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","file":"leaflet.distortableimage.js","sourcesContent":["L.DomUtil = L.extend(L.DomUtil, {\n\tgetMatrixString: function(m) {\n\t\tvar is3d = L.Browser.webkit3d || L.Browser.gecko3d || L.Browser.ie3d,\n\n\t\t\t/* \n\t\t * Since matrix3d takes a 4*4 matrix, we add in an empty row and column, which act as the identity on the z-axis.\n\t\t * See:\n\t\t * http://franklinta.com/2014/09/08/computing-css-matrix3d-transforms/\n\t\t * https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function#M.C3.B6bius'_homogeneous_coordinates_in_projective_geometry\n\t\t */\n\t\t\tmatrix = [\n\t\t\t\tm[0], m[3], 0, m[6],\n\t\t\t\tm[1], m[4], 0, m[7],\n\t\t\t\t 0, 0, 1, 0,\n\t\t\t\tm[2], m[5], 0, m[8]\n\t\t\t],\n\n\t\t\tstr = is3d ? 'matrix3d(' + matrix.join(',') + ')' : '';\n\n\t\tif (!is3d) {\n\t\t\tconsole.log('Your browser must support 3D CSS transforms in order to use DistortableImageOverlay.');\n\t\t}\n\n\t\treturn str;\n\t},\n\n\tgetRotateString: function(angle, units) {\n\t\tvar is3d = L.Browser.webkit3d || L.Browser.gecko3d || L.Browser.ie3d,\n\t\t\topen = 'rotate' + (is3d ? '3d' : '') + '(',\n\t\t\trotateString = (is3d ? '0, 0, 1, ' : '') + angle + units;\n\t\t\t\n\t\treturn open + rotateString + ')';\n\t}\n});\n","L.Map.include({\n\t_newLayerPointToLatLng: function(point, newZoom, newCenter) {\n\t\tvar topLeft = L.Map.prototype._getNewTopLeftPoint.call(this, newCenter, newZoom)\n\t\t\t\t.add(L.Map.prototype._getMapPanePos.call(this));\n\t\treturn this.unproject(point.add(topLeft), newZoom);\n\t}\n});","L.MatrixUtil = {\n\n\t// Compute the adjugate of m\n\tadj: function(m) { \n\t\treturn [\n\t\t\tm[4]*m[8]-m[5]*m[7], m[2]*m[7]-m[1]*m[8], m[1]*m[5]-m[2]*m[4],\n\t\t\tm[5]*m[6]-m[3]*m[8], m[0]*m[8]-m[2]*m[6], m[2]*m[3]-m[0]*m[5],\n\t\t\tm[3]*m[7]-m[4]*m[6], m[1]*m[6]-m[0]*m[7], m[0]*m[4]-m[1]*m[3]\n\t\t];\n\t},\n\n\t// multiply two 3*3 matrices\n\tmultmm: function(a, b) { \n\t\tvar c = [],\n\t\t\ti;\n\n\t\tfor (i = 0; i < 3; i++) {\n\t\t\tfor (var j = 0; j < 3; j++) {\n\t\t\t\tvar cij = 0;\n\t\t\t\tfor (var k = 0; k < 3; k++) {\n\t\t\t\t\tcij += a[3*i + k]*b[3*k + j];\n\t\t\t\t}\n\t\t\t\tc[3*i + j] = cij;\n\t\t\t}\n\t\t}\n\t\treturn c;\n\t},\n\n\t// multiply a 3*3 matrix and a 3-vector\n\tmultmv: function(m, v) { \n\t\treturn [\n\t\t\tm[0]*v[0] + m[1]*v[1] + m[2]*v[2],\n\t\t\tm[3]*v[0] + m[4]*v[1] + m[5]*v[2],\n\t\t\tm[6]*v[0] + m[7]*v[1] + m[8]*v[2]\n\t\t];\n\t},\n\n\t// multiply a scalar and a 3*3 matrix\n\tmultsm: function(s, m) {\n\t\tvar matrix = [];\n\n\t\tfor (var i = 0, l = m.length; i < l; i++) {\n\t\t\tmatrix.push(s*m[i]);\n\t\t}\n\n\t\treturn matrix;\n\t},\n\n\tbasisToPoints: function(x1, y1, x2, y2, x3, y3, x4, y4) {\n\t\tvar m = [\n\t\t\t\tx1, x2, x3,\n\t\t\t\ty1, y2, y3,\n\t\t\t\t1, 1, 1\n\t\t\t],\n\t\t\tv = L.MatrixUtil.multmv(L.MatrixUtil.adj(m), [x4, y4, 1]);\n\n\t\treturn L.MatrixUtil.multmm(m, [\n\t\t\tv[0], 0, 0,\n\t\t\t0, v[1], 0,\n\t\t\t0, 0, v[2]\n\t\t]);\n\t},\n\n\n\tproject: function(m, x, y) {\n\t\tvar v = L.MatrixUtil.multmv(m, [x, y, 1]);\n\t\treturn [v[0]/v[2], v[1]/v[2]];\n\t},\n\n\tgeneral2DProjection: function(\n\tx1s, y1s, x1d, y1d,\n\tx2s, y2s, x2d, y2d,\n\tx3s, y3s, x3d, y3d,\n\tx4s, y4s, x4d, y4d\n\t) {\n\t\tvar s = L.MatrixUtil.basisToPoints(x1s, y1s, x2s, y2s, x3s, y3s, x4s, y4s),\n\t\t\td = L.MatrixUtil.basisToPoints(x1d, y1d, x2d, y2d, x3d, y3d, x4d, y4d),\n\t\t\tm = L.MatrixUtil.multmm(d, L.MatrixUtil.adj(s));\n\n\t\t/* \n\t\t *\tNormalize to the unique matrix with m[8] == 1. \n\t\t * \tSee: http://franklinta.com/2014/09/08/computing-css-matrix3d-transforms/\n\t\t */\n\t\treturn L.MatrixUtil.multsm(1/m[8], m);\n\t}\n};","L.EditHandle = L.Marker.extend({\n\tinitialize: function(overlay, corner, options) {\n\t\tvar markerOptions,\n\t\t\tlatlng = overlay._corners[corner];\n\n\t\tL.setOptions(this, options);\n\n\t\tthis._handled = overlay;\n\t\tthis._corner = corner;\n\n\t\tmarkerOptions = {\n\t\t\tdraggable: true,\n\t\t\tzIndexOffset: 10\n\t\t};\n\n\t\tif (options && options.hasOwnProperty('draggable')) {\n\t\t\tmarkerOptions.draggable = options.draggable;\n\t\t}\n\n\t\tL.Marker.prototype.initialize.call(this, latlng, markerOptions);\n\t},\n\n\tonAdd: function(map) {\n\t\tL.Marker.prototype.onAdd.call(this, map);\n\t\tthis._bindListeners();\n\n\t\tthis.updateHandle();\n\t},\n\n\tonRemove: function(map) {\n\t\tthis._unbindListeners();\n\t\tL.Marker.prototype.onRemove.call(this, map);\n\t},\n\n\t_onHandleDragStart: function() {\n\t\tthis._handled.fire('editstart');\n\t},\n\n\t_onHandleDragEnd: function() {\n\t\tthis._fireEdit();\n\t},\n\n\t_fireEdit: function() {\n\t\tthis._handled.edited = true;\n\t\tthis._handled.fire('edit');\n\t},\n\n\t_bindListeners: function() {\n\t\tthis.on({\n\t\t\t'dragstart': this._onHandleDragStart,\n\t\t\t'drag': this._onHandleDrag,\n\t\t\t'dragend': this._onHandleDragEnd\n\t\t}, this);\n\n\t\tthis._handled._map.on('zoomend', this.updateHandle, this);\n\n\t\tthis._handled.on('update', this.updateHandle, this);\n\t},\n\n\t_unbindListeners: function() {\n\t\tthis.off({\n\t\t\t'dragstart': this._onHandleDragStart,\n\t\t\t'drag': this._onHandleDrag,\n\t\t\t'dragend': this._onHandleDragEnd\n\t\t}, this);\n\n\t\tthis._handled._map.off('zoomend', this.updateHandle, this);\n\t\tthis._handled.off('update', this.updateHandle, this);\n\t}\n});\n","L.LockHandle = L.EditHandle.extend({\n\toptions: {\n\t\tTYPE: 'lock',\n\t\ticon: new L.Icon({ \n\t\t\ticonUrl: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAD8SURBVO3BPU7CYAAA0AdfjIcQlRCQBG7C3gk2uIPG2RC3Dk16Gz0FTO1WZs/gwGCMP/2+xsSl7+n1er1Iz9LtRQjaPeMeO+TinLDCJV78YqjdA04YodKuxhUaPGoRxMmxwRQZSt87Yo4KExGCeAUyLLFB4bMacxywEClIU2KDKXbInTUYo8JCgoFuGoxQO5uiwY1EA91VmDqrcKeDoX8WdNNgjApvmGGLXKIgXY0xGkxQYItrrFFIEKQ5Yo4KEx9yrDFDhlKkIF6NOQ5Y+KpAhiXWKEQI4pxwiwoLPyuxwQw75FoE7fZYocFEuwI7jHCBV39gL92TXq/Xi/AOcmczZmaIMScAAAAASUVORK5CYII=',\n\t\t\ticonSize: [32, 32],\n\t\t\ticonAnchor: [16, 16]}\n\t\t)\n\t},\n\n\t/* cannot be dragged */\n\t_onHandleDrag: function() {\n\t},\n\n\tupdateHandle: function() {\n\t\tthis.setLatLng(this._handled._corners[this._corner]);\n\t}\n\n});\n","L.DistortHandle = L.EditHandle.extend({\n\toptions: {\n\t\tTYPE: 'distort',\n\t\ticon: new L.Icon({\n\t\t\ticonUrl: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAChSURBVO3BIU4DURgGwNkvL2B6AkQTLBqP4QCoSm7DDXoBLBZHDbfgICAIZjEV3YTn9uVHdMZZtcnCfI13bIzxg0emg6Nm6QVbYz3jylEsXRrvwommb49X67jFkz80fR9Mb1YxTzqiWBSLYlEsikWxKBbFolgUi2JRLIpFsSgWxaJY03fHHOu40dH07bAzWCx9Ge/TiWbpHgdsjPGNB2f/yS+7xRCyiiZPJQAAAABJRU5ErkJggg==',\n\t\t\ticonSize: [32, 32],\n\t\t\ticonAnchor: [16, 16]}\n\t\t)\n\t},\n\n\tupdateHandle: function() {\n\t\tthis.setLatLng(this._handled._corners[this._corner]);\n\t},\n\n\t_onHandleDrag: function() {\n\t\tthis._handled._updateCorner(this._corner, this.getLatLng());\n\n\t\tthis._handled.fire('update');\n\t}\n});\n","L.RotateAndScaleHandle = L.EditHandle.extend({\n\toptions: {\n\t\tTYPE: 'rotate',\n\t\ticon: new L.Icon({\n\t\t\ticonUrl: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAHiSURBVMXBa3HbShgA0PMp/1sCCo8oCEpgTaCXgIXAJiDzyCJoAUTm4UVQAns1Y8+snWnTvJyeE16hkjDgDrfoNTMKcpC9UPiLSo8JyetkjEHxjPCMyoS199kFoz8Iv1HpMaN3qWDCHoegOKkkRwnJpRmroHgiPFEZ8IBekzEGxQtUEhKSS/fB7Ew4U+lxcGkVZG9QWWPSFAxBcdK59KApuA+yNwp2uEdx1GN25sZJZULSfAtm77SlbNjju6MvG75u+WHRWVR6rDVjMPsgwYyVZl3pLTpHkyYHOx8syMiayaJzlDTZ9YyaZNFVkiYH2ZUEBcVJJXVImuz6Js3Qofe59pq7DoOTILu+g+a288mCouk7/1iH4qTS+2QdDppbV1ZJmrnDXnPnc5UOs2Z0fUmTuyBr+krvSioJyUmQO0dZM7mepMkWnaNRkyrJB6uskTSjxY3Fll8bvmJwlDb83FJ8gMqAB80uyBY3Trb82PAfvjj6vuHnluIdKgMeNXOwctK5NKBoHitrb1RJeHRp5Ux4ojLg0aWMHGQvUOkxIWkKVsHsTPiNSo8HDC5lZIsgO6n0uMUdRvQuFQxB8UR4RmXC2vvsgtEfhL+o9JiQvE7GGBTPCK9QSUjoMWgKDthjDrIX+h/k0I7gth6N5gAAAABJRU5ErkJggg==',\n\t\t\ticonSize: [32, 32],\n\t\t\ticonAnchor: [16, 16]}\n\t\t)\n\t},\n\n\t_onHandleDrag: function() {\n\t\tvar overlay = this._handled,\n\t\t\tformerLatLng = this._handled._corners[this._corner],\n\t\t\tnewLatLng = this.getLatLng(),\n\n\t\t\tangle = this._calculateAngle(formerLatLng, newLatLng),\n\t\t\tscale = this._calculateScalingFactor(formerLatLng, newLatLng);\n\n\t\toverlay.editing._rotateBy(angle);\n\t\toverlay.editing._scaleBy(scale);\n\n\t\t/* \n\t\t checks whether the \"edgeMinWidth\" property is set and tracks the minimum edge length;\n\t\t this enables preventing scaling to zero, but we might also add an overall scale limit\n\t\t*/\t\t\n\t\tif (this._handled.options.hasOwnProperty('edgeMinWidth')){\n\t\t\tvar edgeMinWidth = this._handled.options.edgeMinWidth,\n\t\t\t w = L.latLng(overlay._corners[0]).distanceTo(overlay._corners[1]),\n\t\t\t h = L.latLng(overlay._corners[1]).distanceTo(overlay._corners[2]);\n\t\t\tif ((w > edgeMinWidth && h > edgeMinWidth) || scale > 1) {\n\t\t\t\toverlay.editing._scaleBy(scale);\n\t\t\t}\n\t\t} else {\n\t\t\toverlay.editing._scaleBy(scale);\n\t\t}\n\n\t\toverlay.fire('update');\n\t},\n\n\tupdateHandle: function() {\n\t\tthis.setLatLng(this._handled._corners[this._corner]);\n\t},\n\n\t/* Takes two latlngs and calculates the angle between them. */\n\t_calculateAngle: function(latlngA, latlngB) {\n\t\tvar map = this._handled._map,\n\n\t\t\tcenterPoint = map.latLngToLayerPoint(this._handled.getCenter()),\n\t\t\tformerPoint = map.latLngToLayerPoint(latlngA),\n\t\t\tnewPoint = map.latLngToLayerPoint(latlngB),\n\n\t\t\tinitialAngle = Math.atan2(centerPoint.y - formerPoint.y, centerPoint.x - formerPoint.x),\n\t\t\tnewAngle = Math.atan2(centerPoint.y - newPoint.y, centerPoint.x - newPoint.x);\n\n\t\treturn newAngle - initialAngle;\n\t},\n\n\t/* Takes two latlngs and calculates the scaling difference. */\n\t_calculateScalingFactor: function(latlngA, latlngB) {\n\t\tvar map = this._handled._map,\n\n\t\t\tcenterPoint = map.latLngToLayerPoint(this._handled.getCenter()),\n\t\t\tformerPoint = map.latLngToLayerPoint(latlngA),\n\t\t\tnewPoint = map.latLngToLayerPoint(latlngB),\n\n\t\t\tformerRadiusSquared = this._d2(centerPoint, formerPoint),\n\t\t\tnewRadiusSquared = this._d2(centerPoint, newPoint);\n\n\t\treturn Math.sqrt(newRadiusSquared / formerRadiusSquared);\n\t},\n\n\t/* Distance between two points in cartesian space, squared (distance formula). */\n\t_d2: function(a, b) {\n\t\tvar dx = a.x - b.x,\n\t\t\tdy = a.y - b.y;\n\n\t\treturn Math.pow(dx, 2) + Math.pow(dy, 2);\n\t}\n});\n","L.RotateHandle = L.EditHandle.extend({\n\toptions: {\n\t\tTYPE: 'rotate',\n\t\ticon: new L.Icon({\n\t\t\ticonUrl: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAHiSURBVMXBa3HbShgA0PMp/1sCCo8oCEpgTaCXgIXAJiDzyCJoAUTm4UVQAns1Y8+snWnTvJyeE16hkjDgDrfoNTMKcpC9UPiLSo8JyetkjEHxjPCMyoS199kFoz8Iv1HpMaN3qWDCHoegOKkkRwnJpRmroHgiPFEZ8IBekzEGxQtUEhKSS/fB7Ew4U+lxcGkVZG9QWWPSFAxBcdK59KApuA+yNwp2uEdx1GN25sZJZULSfAtm77SlbNjju6MvG75u+WHRWVR6rDVjMPsgwYyVZl3pLTpHkyYHOx8syMiayaJzlDTZ9YyaZNFVkiYH2ZUEBcVJJXVImuz6Js3Qofe59pq7DoOTILu+g+a288mCouk7/1iH4qTS+2QdDppbV1ZJmrnDXnPnc5UOs2Z0fUmTuyBr+krvSioJyUmQO0dZM7mepMkWnaNRkyrJB6uskTSjxY3Fll8bvmJwlDb83FJ8gMqAB80uyBY3Trb82PAfvjj6vuHnluIdKgMeNXOwctK5NKBoHitrb1RJeHRp5Ux4ojLg0aWMHGQvUOkxIWkKVsHsTPiNSo8HDC5lZIsgO6n0uMUdRvQuFQxB8UR4RmXC2vvsgtEfhL+o9JiQvE7GGBTPCK9QSUjoMWgKDthjDrIX+h/k0I7gth6N5gAAAABJRU5ErkJggg==',\n\t\t\ticonSize: [32, 32],\n\t\t\ticonAnchor: [16, 16]}\n\t\t)\n\t},\n\n\t_onHandleDrag: function() {\n\t\tvar overlay = this._handled,\n\t\t\tformerLatLng = this._handled._corners[this._corner],\n\t\t\tnewLatLng = this.getLatLng(),\n\n\t\t\tangle = this._calculateAngle(formerLatLng, newLatLng);\n\n\t\toverlay.editing._rotateBy(angle);\n\n\t\toverlay.fire('update');\n\t},\n\n\tupdateHandle: function() {\n\t\tthis.setLatLng(this._handled._corners[this._corner]);\n\t},\n\n\t/* Takes two latlngs and calculates the angle between them. */\n\t_calculateAngle: function(latlngA, latlngB) {\n\t\tvar map = this._handled._map,\n\n\t\t\tcenterPoint = map.latLngToLayerPoint(this._handled.getCenter()),\n\t\t\tformerPoint = map.latLngToLayerPoint(latlngA),\n\t\t\tnewPoint = map.latLngToLayerPoint(latlngB),\n\n\t\t\tinitialAngle = Math.atan2(centerPoint.y - formerPoint.y, centerPoint.x - formerPoint.x),\n\t\t\tnewAngle = Math.atan2(centerPoint.y - newPoint.y, centerPoint.x - newPoint.x);\n\n\t\treturn newAngle - initialAngle;\n\t},\n\n\t/* Takes two latlngs and calculates the scaling difference. */\n\t_calculateScalingFactor: function(latlngA, latlngB) {\n\t\tvar map = this._handled._map,\n\n\t\t\tcenterPoint = map.latLngToLayerPoint(this._handled.getCenter()),\n\t\t\tformerPoint = map.latLngToLayerPoint(latlngA),\n\t\t\tnewPoint = map.latLngToLayerPoint(latlngB),\n\n\t\t\tformerRadiusSquared = this._d2(centerPoint, formerPoint),\n\t\t\tnewRadiusSquared = this._d2(centerPoint, newPoint);\n\n\t\treturn Math.sqrt(newRadiusSquared / formerRadiusSquared);\n\t},\n\n\t/* Distance between two points in cartesian space, squared (distance formula). */\n\t_d2: function(a, b) {\n\t\tvar dx = a.x - b.x,\n\t\t\tdy = a.y - b.y;\n\n\t\treturn Math.pow(dx, 2) + Math.pow(dy, 2);\n\t}\n});\n","L.ScaleHandle = L.EditHandle.extend({\n\toptions: {\n\t\tTYPE: 'rotate',\n\t\ticon: new L.Icon({\n\t\t\ticonUrl:'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIHdpZHRoPSI0NTkiIGhlaWdodD0iNDY0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCA1MTIgNTEyIiB4bWw6c3BhY2U9InByZXNlcnZlIiBzdHlsZT0iIj48cmVjdCBpZD0iYmFja2dyb3VuZHJlY3QiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHg9IjAiIHk9IjAiIGZpbGw9Im5vbmUiIHN0cm9rZT0ibm9uZSIgY2xhc3M9IiIgc3R5bGU9IiIvPjxnIGNsYXNzPSJjdXJyZW50TGF5ZXIiIHN0eWxlPSIiPjx0aXRsZT5MYXllciAxPC90aXRsZT48cGF0aCBkPSJNNDU5LjA0OTE1OTUzMDQ3MTM0LDg2LjkyNjIzNDUxMjU1MDAyIFYwIGgtODUuNzE0NTczMzU2MzEyMDkgdjI3LjA0MzcxNzQwMzkwNDQ1MiBIODUuNzE0NTczMzU2MzEyMDMgVjAgSDAgdjg2LjkyNjIzNDUxMjU1MDAyIGgyNS43MTQzNzIwMDY4OTM2MjYgdjI4OS43NTQxMTUwNDE4MzM0IEgwIHY4Ni45MjYyMzQ1MTI1NTAwMiBoODUuNzE0NTczMzU2MzEyMDkgdi0yNy4wNDM3MTc0MDM5MDQ0NTIgaDI4NS43MTUyNDQ1MjEwNDAzIHYyNy4wNDM3MTc0MDM5MDQ0NTIgaDg1LjcxNDU3MzM1NjMxMjA5IHYtODYuOTI2MjM0NTEyNTUwMDIgaC0yMy44MDk2MDM3MTAwODY2OSBWODYuOTI2MjM0NTEyNTUwMDIgSDQ1OS4wNDkxNTk1MzA0NzEzNCB6TTM4NC43NjMxOTU5NTUwMDA5LDEyLjU1NjAxMTY1MTgxMjc4MSBoNjEuOTA0OTY5NjQ2MjI1Mzk2IHY2Mi43ODAwNTgyNTkwNjM5MSBoLTYxLjkwNDk2OTY0NjIyNTM5NiBWMTIuNTU2MDExNjUxODEyNzgxIHpNMTIuMzgwOTkzOTI5MjQ1MDUsMTIuNTU2MDExNjUxODEyNzgxIGg2MS45MDQ5Njk2NDYyMjUzOTYgdjYyLjc4MDA1ODI1OTA2MzkxIEgxMi4zODA5OTM5MjkyNDUwNSBWMTIuNTU2MDExNjUxODEyNzgxIHpNNzQuMjg1OTYzNTc1NDcwNTMsNDUxLjA1MDU3MjQxNTEyMDY2IEgxMi4zODA5OTM5MjkyNDUwNSB2LTYyLjc4MDA1ODI1OTA2MzkxIGg2MS45MDQ5Njk2NDYyMjUzOTYgVjQ1MS4wNTA1NzI0MTUxMjA2NiB6TTQ0NS43MTU3ODE0NTI4MjI3NCw0NTEuMDUwNTcyNDE1MTIwNjYgaC02Mi44NTczNTM3OTQ2Mjg4NjQgdi02Mi43ODAwNTgyNTkwNjM5MSBoNjIuODU3MzUzNzk0NjI4ODY0IFY0NTEuMDUwNTcyNDE1MTIwNjYgek00MDcuNjIwNDE1NTE2Njg0MjYsMzc2LjY4MDM0OTU1NDM4MzQ0IGgtMzYuMTkwNTk3NjM5MzMxNzcgdjMyLjgzODc5OTcwNDc0MTEyIEg4NS43MTQ1NzMzNTYzMTIwMyB2LTMyLjgzODc5OTcwNDc0MTEyIEg0OS41MjM5NzU3MTY5ODAzMiBWODYuOTI2MjM0NTEyNTUwMDIgaDM2LjE5MDU5NzYzOTMzMTc3IFY1MC4yMjQwNDY2MDcyNTExMjUgaDI4Ny42MjAwMTI4MTc4NDcyIHYzNi43MDIxODc5MDUyOTg5IGgzNC4yODU4MjkzNDI1MjQ4MzUgVjM3Ni42ODAzNDk1NTQzODM0NCB6IiBpZD0ic3ZnXzIiIGNsYXNzPSIiIGZpbGw9IiMxYTFhZWIiIGZpbGwtb3BhY2l0eT0iMSIvPjwvZz48L3N2Zz4=',\n\t\t\ticonSize: [32, 32],\n\t\t\ticonAnchor: [16, 16]}\n\t\t)\n\t},\n\n\t_onHandleDrag: function() {\n\t\tvar overlay = this._handled,\n\t\t\tformerLatLng = this._handled._corners[this._corner],\n\t\t\tnewLatLng = this.getLatLng(),\n\n\t\t\tscale = this._calculateScalingFactor(formerLatLng, newLatLng);\n\n\t\toverlay.editing._scaleBy(scale);\n\n\t\toverlay.fire('update');\n\t},\n\n\tupdateHandle: function() {\n\t\tthis.setLatLng(this._handled._corners[this._corner]);\n\t},\n\n\t/* Takes two latlngs and calculates the angle between them. */\n\t_calculateAngle: function(latlngA, latlngB) {\n\t\tvar map = this._handled._map,\n\n\t\t\tcenterPoint = map.latLngToLayerPoint(this._handled.getCenter()),\n\t\t\tformerPoint = map.latLngToLayerPoint(latlngA),\n\t\t\tnewPoint = map.latLngToLayerPoint(latlngB),\n\n\t\t\tinitialAngle = Math.atan2(centerPoint.y - formerPoint.y, centerPoint.x - formerPoint.x),\n\t\t\tnewAngle = Math.atan2(centerPoint.y - newPoint.y, centerPoint.x - newPoint.x);\n\n\t\treturn newAngle - initialAngle;\n\t},\n\n\t/* Takes two latlngs and calculates the scaling difference. */\n\t_calculateScalingFactor: function(latlngA, latlngB) {\n\t\tvar map = this._handled._map,\n\n\t\t\tcenterPoint = map.latLngToLayerPoint(this._handled.getCenter()),\n\t\t\tformerPoint = map.latLngToLayerPoint(latlngA),\n\t\t\tnewPoint = map.latLngToLayerPoint(latlngB),\n\n\t\t\tformerRadiusSquared = this._d2(centerPoint, formerPoint),\n\t\t\tnewRadiusSquared = this._d2(centerPoint, newPoint);\n\n\t\treturn Math.sqrt(newRadiusSquared / formerRadiusSquared);\n\t},\n\n\t/* Distance between two points in cartesian space, squared (distance formula). */\n\t_d2: function(a, b) {\n\t\tvar dx = a.x - b.x,\n\t\t\tdy = a.y - b.y;\n\n\t\treturn Math.pow(dx, 2) + Math.pow(dy, 2);\n\t}\n});\n","L.DistortableImageOverlay = L.ImageOverlay.extend({\n\tinclude: L.Mixin.Events,\n\n\toptions: {\n\t\talt: '',\n\t\theight: 200,\n\t\tcrossOrigin: true\n\t},\n\n\tinitialize: function(url, options) {\n\t\t\tthis._toolArray = L.DistortableImage.EditToolbarDefaults;\n\t\t\tthis._url = url;\n\t\t\tthis._rotation = this.options.rotation;\n\n\t\t\tL.setOptions(this, options);\n\t},\n\n\tonAdd: function(map) {\n\t\t/* Copied from L.ImageOverlay */\n\t\tthis._map = map;\n\n\t\t// this._div = $(this._pane).append($(\"
\"));\n\t\tif (!this._image) { this._initImage(); }\n\t\tif (!this._events) { this._initEvents(); }\n\n\t\tmap._panes.overlayPane.appendChild(this._image);\n\n\t\tif (!this._divNode) { \n\t\t\tthis._divNode = document.createElement(\"div\");\n\t\t\t// this._divNode = divNode;\n\t\t\tthis._divNode.setAttribute(\"id\", \"holding\");\n\t\t\tmap._panes.overlayPane.appendChild(this._divNode); \n\t\t}\n\n\t\tmap.on('viewreset', this._reset, this);\n\t\t/* End copied from L.ImageOverlay */\n\n\t\t/* Use provided corners if available */\n\t\tif (this.options.corners) {\n\t\t\tthis._corners = this.options.corners;\n\t\t\tif (map.options.zoomAnimation && L.Browser.any3d) {\n\t\t\t\tmap.on('zoomanim', this._animateZoom, this);\n\t\t\t}\n\n\t\t\t/* This reset happens before image load; it allows\n\t\t\t * us to place the image on the map earlier with\n\t\t\t * \"guessed\" dimensions. */\n\t\t\tthis._reset();\n\t\t}\n\n\t\t/* Have to wait for the image to load because\n\t\t * we need to access its width and height. */\n\t\tL.DomEvent.on(this._image, 'load', function() {\n\t\t\tthis._initImageDimensions();\n\t\t\tthis._reset();\n\t\t\t/* Initialize default corners if not already set */\n\t\t\tif (!this._corners) {\n\t\t\t\tif (map.options.zoomAnimation && L.Browser.any3d) {\n\t\t\t\t\tmap.on('zoomanim', this._animateZoom, this);\n\t\t\t\t}\n\t\t\t}\n\t\t}, this);\n\n\t\tthis.fire('add');\n\t},\n\n\tonRemove: function(map) {\n\t\tthis.fire('remove');\n\n\t\tL.ImageOverlay.prototype.onRemove.call(this, map);\n\t},\n\n\t_initImage: function () {\n\t\tL.ImageOverlay.prototype._initImage.call(this);\n\n\t\tL.extend(this._image, {\n\t\t\talt: this.options.alt\n\t\t});\n\t},\n\n\t_addTool: function(tool) {\n\t\tthis._toolArray.push(tool);\n\t\tL.DistortableImage.EditToolbar = LeafletToolbar.Popup.extend({\n\t\t\toptions: {\n\t\t\t\tactions: this._toolArray\n\t\t\t}\n\t\t});\n\t},\n\n\t_initImageDimensions: function() {\n\t\tvar map = this._map,\n\n\t\t\toriginalImageWidth = L.DomUtil.getStyle(this._image, 'width'),\n\t\t\toriginalImageHeight = L.DomUtil.getStyle(this._image, 'height'),\n\n\t\t\taspectRatio = parseInt(originalImageWidth) / parseInt(originalImageHeight),\n\n\t\t\timageHeight = this.options.height,\n\t\t\timageWidth = parseInt(aspectRatio*imageHeight),\n\n\t\t\tcenter = map.latLngToContainerPoint(map.getCenter()),\n\t\t\toffset = new L.Point(imageWidth, imageHeight).divideBy(2);\n\n\t\tif (this.options.corners) { this._corners = this.options.corners; }\n\t\telse {\n\t\t\tthis._corners = [\n\t\t\t\tmap.containerPointToLatLng(center.subtract(offset)),\n\t\t\t\tmap.containerPointToLatLng(center.add(new L.Point(offset.x, - offset.y))),\n\t\t\t\tmap.containerPointToLatLng(center.add(new L.Point(- offset.x, offset.y))),\n\t\t\t\tmap.containerPointToLatLng(center.add(offset))\n\t\t\t];\n\t\t}\n\t},\n\n \t_initEvents: function() {\n \t\tthis._events = [ 'click' ];\n\n \t\tfor (var i = 0, l = this._events.length; i < l; i++) {\n\t \t\tL.DomEvent.on(this._image, this._events[i], this._fireMouseEvent, this);\n \t\t}\n \t},\n\n \t/* See src/layer/vector/Path.SVG.js in the Leaflet source. */\n \t_fireMouseEvent: function(event) {\n \t\tif (!this.hasEventListeners(event.type)) { return; }\n\n\t\tvar map = this._map,\n\t\t\tcontainerPoint = map.mouseEventToContainerPoint(event),\n\t\t\tlayerPoint = map.containerPointToLayerPoint(containerPoint),\n\t\t\tlatlng = map.layerPointToLatLng(layerPoint);\n\n\t\tthis.fire(event.type, {\n\t\t\tlatlng: latlng,\n\t\t\tlayerPoint: layerPoint,\n\t\t\tcontainerPoint: containerPoint,\n\t\t\toriginalEvent: event\n\t\t});\n \t},\n\n\t_updateCorner: function(corner, latlng) {\n\t\tthis._corners[corner] = latlng;\n\t\tthis._reset();\n\t},\n\n\n\t/* Copied from Leaflet v0.7 https://github.com/Leaflet/Leaflet/blob/66282f14bcb180ec87d9818d9f3c9f75afd01b30/src/dom/DomUtil.js#L189-L199 */\n\t/* since L.DomUtil.getTranslateString() is deprecated in Leaflet v1.0 */\n\t_getTranslateString: function (point) {\n\t\t// on WebKit browsers (Chrome/Safari/iOS Safari/Android) using translate3d instead of translate\n\t\t// makes animation smoother as it ensures HW accel is used. Firefox 13 doesn't care\n\t\t// (same speed either way), Opera 12 doesn't support translate3d\n\n\t\tvar is3d = L.Browser.webkit3d,\n\t\t open = 'translate' + (is3d ? '3d' : '') + '(',\n\t\t close = (is3d ? ',0' : '') + ')';\n\n\t\treturn open + point.x + 'px,' + point.y + 'px' + close;\n\t},\n\n\t_reset: function() {\n\t\tvar map = this._map,\n\t\t\timage = this._image,\n\t\t\tlatLngToLayerPoint = L.bind(map.latLngToLayerPoint, map),\n\n\t\t\ttransformMatrix = this._calculateProjectiveTransform(latLngToLayerPoint),\n\t\t\ttopLeft = latLngToLayerPoint(this._corners[0]),\n\n\t\t\twarp = L.DomUtil.getMatrixString(transformMatrix),\n\t\t\ttranslation = this._getTranslateString(topLeft);\n\n\t\t/* See L.DomUtil.setPosition. Mainly for the purposes of L.Draggable. */\n\t\timage._leaflet_pos = topLeft;\n\n\t\timage.style[L.DomUtil.TRANSFORM] = [translation, warp].join(' ');\n\n\t\t/* Set origin to the upper-left corner rather than the center of the image, which is the default. */\n\t\timage.style[L.DomUtil.TRANSFORM + '-origin'] = \"0 0 0\";\n\t},\n\n\t/*\n\t * Calculates the transform string that will be correct *at the end* of zooming.\n\t * Leaflet then generates a CSS3 animation between the current transform and\n\t *\t\t future transform which makes the transition appear smooth.\n\t */\n\t_animateZoom: function(event) {\n\t\tvar map = this._map,\n\t\t\timage = this._image,\n\t\t\tlatLngToNewLayerPoint = function(latlng) {\n\t\t\t\treturn map._latLngToNewLayerPoint(latlng, event.zoom, event.center);\n\t\t\t},\n\n\t\t\ttransformMatrix = this._calculateProjectiveTransform(latLngToNewLayerPoint),\n\t\t\ttopLeft = latLngToNewLayerPoint(this._corners[0]),\n\n\t\t\twarp = L.DomUtil.getMatrixString(transformMatrix),\n\t\t\ttranslation = this._getTranslateString(topLeft);\n\n\t\t/* See L.DomUtil.setPosition. Mainly for the purposes of L.Draggable. */\n\t\timage._leaflet_pos = topLeft;\n\n\t\tif (!L.Browser.gecko) {\n\t\t\timage.style[L.DomUtil.TRANSFORM] = [translation, warp].join(' ');\n\t\t}\n\t},\n\n\tgetCorners: function() {\n\t\treturn this._corners;\n\t},\n\n\t/*\n\t * Calculates the centroid of the image.\n\t *\t\t See http://stackoverflow.com/questions/6149175/logical-question-given-corners-find-center-of-quadrilateral\n\t */\n\tgetCenter: function(ll2c, c2ll) {\n\t\tvar map = this._map,\n\t\t\tlatLngToCartesian = ll2c ? ll2c : map.latLngToLayerPoint,\n\t\t\tcartesianToLatLng = c2ll ? c2ll: map.layerPointToLatLng,\n\t\t\tnw = latLngToCartesian.call(map, this._corners[0]),\n\t\t\tne = latLngToCartesian.call(map, this._corners[1]),\n\t\t\tse = latLngToCartesian.call(map, this._corners[2]),\n\t\t\tsw = latLngToCartesian.call(map, this._corners[3]),\n\n\t\t\tnmid = nw.add(ne.subtract(nw).divideBy(2)),\n\t\t\tsmid = sw.add(se.subtract(sw).divideBy(2));\n\n\t\treturn cartesianToLatLng.call(map, nmid.add(smid.subtract(nmid).divideBy(2)));\n\t},\n\n\t_calculateProjectiveTransform: function(latLngToCartesian) {\n\t\t/* Setting reasonable but made-up image defaults\n\t\t * allow us to place images on the map before\n\t\t * they've finished downloading. */\n\t\tvar offset = latLngToCartesian(this._corners[0]),\n\t\t\tw = this._image.offsetWidth || 500,\n\t\t\th = this._image.offsetHeight || 375,\n\t\t\tc = [],\n\t\t\tj;\n\t\t/* Convert corners to container points (i.e. cartesian coordinates). */\n\t\tfor (j = 0; j < this._corners.length; j++) {\n\t\t\tc.push(latLngToCartesian(this._corners[j])._subtract(offset));\n\t\t}\n\n\t\t/*\n\t\t * This matrix describes the action of the CSS transform on each corner of the image.\n\t\t * It maps from the coordinate system centered at the upper left corner of the image\n\t\t *\t\t to the region bounded by the latlngs in this._corners.\n\t\t * For example:\n\t\t *\t\t 0, 0, c[0].x, c[0].y\n\t\t *\t\t says that the upper-left corner of the image maps to the first latlng in this._corners.\n\t\t */\n\t\treturn L.MatrixUtil.general2DProjection(\n\t\t\t0, 0, c[0].x, c[0].y,\n\t\t\tw, 0, c[1].x, c[1].y,\n\t\t\t0, h, c[2].x, c[2].y,\n\t\t\tw, h, c[3].x, c[3].y\n\t\t);\n\t}\n});\n","L.DistortableImage = L.DistortableImage || {};\n\nvar EditOverlayAction = LeafletToolbar.ToolbarAction.extend({\n\t\tinitialize: function(map, overlay, options) {\n\t\t\tthis._overlay = overlay;\n\t\t\tthis._map = map;\n\n\t\t\tLeafletToolbar.ToolbarAction.prototype.initialize.call(this, options);\n\t\t}\n\t}),\n\n\tToggleTransparency = EditOverlayAction.extend({\n\t\toptions: { toolbarIcon: {\n\t\t\thtml: '',\n\t\t\ttooltip: 'Toggle Image Transparency',\n\t\t\ttitle: 'Toggle Image Transparency'\n\t\t}},\n\n\t\taddHooks: function() {\n\t\t\tvar editing = this._overlay.editing;\n\n\t\t\tediting._toggleTransparency();\n\t\t\tthis.disable();\n\t\t}\n\t}),\n\n\tToggleOutline = EditOverlayAction.extend({\n\t\toptions: { toolbarIcon: {\n\t\t\thtml: '',\n\t\t\ttooltip: 'Toggle Image Outline',\n\t\t\ttitle: 'Toggle Image Outline'\n\t\t}},\n\n\t\taddHooks: function() {\n\t\t\tvar editing = this._overlay.editing;\n\n\t\t\tediting._toggleOutline();\n\t\t\tthis.disable();\n\t\t}\n\t}),\n\n\tRemoveOverlay = EditOverlayAction.extend({\n\t\toptions: { toolbarIcon: {\n\t\t\thtml: '',\n\t\t\ttooltip: 'Delete image',\n\t\t\ttitle: 'Delete image'\n\t\t}},\n\n\t\taddHooks: function() {\n\t\t\tvar map = this._map;\n\n\t\t\tmap.removeLayer(this._overlay);\n\t\t\tthis._overlay.fire('delete');\n\t\t\tthis.disable();\n\t\t}\n\t}),\n\n\tToggleEditable = EditOverlayAction.extend({\n\t\toptions: { toolbarIcon: {\n\t\t\thtml: '',\n\t\t\ttooltip: 'Lock / Unlock editing',\n\t\t\ttitle: 'Lock / Unlock editing'\n\t\t}},\n\n\t\taddHooks: function() {\n\t\t\tvar editing = this._overlay.editing;\n\n\t\t\tediting._toggleLock();\n\t\t\tthis.disable();\n\t\t}\n\t}),\n\n\tToggleRotateDistort = EditOverlayAction.extend({\n\t\tinitialize: function(map, overlay, options) {\n\t\t\tvar icon = overlay.editing._mode === 'rotate' ? 'image' : 'rotate-left';\n\n\t\t\toptions = options || {};\n\t\t\toptions.toolbarIcon = {\n\t\t\t\thtml: '',\n\t\t\t\ttooltip: 'Rotate',\n\t\t\t\ttitle: 'Rotate'\n\t\t\t};\n\n\t\t\tEditOverlayAction.prototype.initialize.call(this, map, overlay, options);\n\t\t},\n\n\t\taddHooks: function() {\n\t\t\tvar editing = this._overlay.editing;\n\n\t\t\tediting._toggleRotateDistort();\n\t\t\tthis.disable();\n\t\t}\n\t}),\n\n\n\tToggleExport = EditOverlayAction.extend({\n\t\toptions: {\n\t\t\ttoolbarIcon: {\n\t\t\t\thtml: '',\n\t\t\t\ttooltip: 'Export Image',\n\t\t\t\ttitle: 'Export Image'\n\t\t\t}\n\t\t},\n\n\t\taddHooks: function ()\n\t\t{\n\t\t\tvar editing = this._overlay.editing;\n\n\t\t\tediting._toggleExport();\n\t\t\tthis.disable();\n\t\t}\n\t}),\n\n\tToggleOrder = EditOverlayAction.extend({\n\t\toptions: {\n\t\t\ttoolbarIcon: {\n\t\t\t\thtml: '',\n\t\t\t\ttooltip: 'Change order',\n\t\t\t\ttitle: 'Toggle order'\n\t\t\t}\n\t\t},\n\n\t\taddHooks: function ()\n\t\t{\n\t\t\tvar editing = this._overlay.editing;\n\n\t\t\tediting._toggleOrder();\n\t\t\tthis.disable();\n\t\t}\n\t});\n\nL.DistortableImage.EditToolbar = LeafletToolbar.Popup.extend({\n\toptions: {\n\t\tactions: [\n\t\t\tToggleTransparency,\n\t\t\tRemoveOverlay,\n\t\t\tToggleOutline,\n\t\t\tToggleEditable,\n\t\t\tToggleRotateDistort,\n\t\t\tToggleExport,\n\t\t\tToggleOrder\n\t\t]\n\t}\n});\n","L.DistortableImage = L.DistortableImage || {};\n\nL.DistortableImage.Edit = L.Handler.extend({\n\toptions: {\n\t\topacity: 0.7,\n\t\toutline: '1px solid red',\n\t\tkeymap: {\n\t\t\t8: \"_removeOverlay\", // backspace windows / delete mac\n\t\t\t46: \"_removeOverlay\", // delete windows / delete + fn mac\n\t\t\t20: '_toggleRotate', // CAPS\n\t\t\t68: '_toggleRotateDistort', // d\n\t\t\t69: '_toggleIsolate', // e\n\t\t\t73: '_toggleIsolate', // i\n\t\t\t74: '_sendUp', // j\n\t\t\t75: '_sendDown', // k\n\t\t\t76: '_toggleLock', // l\n\t\t\t79: '_toggleOutline', // o\n\t\t\t82: '_toggleRotateDistort', // r\n\t\t\t83: '_toggleScale', // s\n\t\t\t84: '_toggleTransparency', // t\n\t\t}\n\t},\n\n\tinitialize: function(overlay) {\n\t\tthis._overlay = overlay;\n\t\tthis._toggledImage = false;\n\n\t\t/* Interaction modes. */\n\t\tthis._mode = this._overlay.options.mode || 'distort';\n\t\tthis._transparent = false;\n\t\tthis._outlined = false;\n\t},\n\n\t/* Run on image seletion. */\n\taddHooks: function() {\n\t\tvar overlay = this._overlay,\n\t\t\tmap = overlay._map,\n\t\t\ti;\n\n\t\tthis._lockHandles = new L.LayerGroup();\n\t\tfor (i = 0; i < 4; i++) {\n\t\t\tthis._lockHandles.addLayer(new L.LockHandle(overlay, i, { draggable: false }));\n\t\t}\n\n\t\tthis._distortHandles = new L.LayerGroup();\n\t\tfor (i = 0; i < 4; i++) {\n\t\t\tthis._distortHandles.addLayer(new L.DistortHandle(overlay, i));\n\t\t}\n\n\t\tthis._rotateHandles = new L.LayerGroup(); // handle includes rotate AND scale\n\t\tfor (i = 0; i < 4; i++) {\n\t\t\tthis._rotateHandles.addLayer(new L.RotateAndScaleHandle(overlay, i));\n\t\t}\n\n\t\tthis._scaleHandles = new L.LayerGroup();\n\t\tfor (i = 0; i < 4; i++) {\n\t\t\tthis._scaleHandles.addLayer(new L.ScaleHandle(overlay, i));\n\t\t}\n\n\t\tthis.__rotateHandles = new L.LayerGroup(); // individual rotate\n\t\tfor (i = 0; i < 4; i++) {\n\t\t\tthis.__rotateHandles.addLayer(new L.RotateHandle(overlay, i));\n\t\t}\n\n\t\tthis._handles = {\n\t\t\t'lock':\t\t this._lockHandles,\n\t\t\t'distort': this._distortHandles,\n\t\t\t'rotate':\tthis._rotateHandles,\n\t\t\t'scale': this._scaleHandles,\n\t\t\t'rotateStandalone': this.__rotateHandles\n\t\t};\n\n if (this._mode === 'lock') {\n\t\t\tmap.addLayer(this._lockHandles);\n\t\t} else {\n\t\t\tthis._mode = 'distort';\n\t\t\tmap.addLayer(this._distortHandles);\n\t\t\tthis._enableDragging();\n\t\t}\n\n\t\t//overlay.on('click', this._showToolbar, this);\n\t\tL.DomEvent.on(overlay._image, 'click', this._showToolbar, this);\n\n\t\t/* Enable hotkeys. */\n\t\tL.DomEvent.on(window, 'keydown', this._onKeyDown, this);\n\n\t\toverlay.fire('select');\n\n\t},\n\n\t/* Run on image deseletion. */\n\tremoveHooks: function() {\n\t\tvar overlay = this._overlay,\n\t\t\tmap = overlay._map;\n\n\t\t// L.DomEvent.off(window, 'keydown', this._onKeyDown, this);\n\n\t\tL.DomEvent.off(overlay._image, 'click', this._showToolbar, this);\n\n\t\t// First, check if dragging exists;\n\t\t// it may be off due to locking\n\t\tif (this.dragging) { this.dragging.disable(); }\n\t\tdelete this.dragging;\n\n\t\tmap.removeLayer(this._handles[this._mode]);\n\n \t\t/* Disable hotkeys. */\n\t\tL.DomEvent.off(window, 'keydown', this._onKeyDown, this);\n\n\t\toverlay.fire('deselect');\n },\n\n confirmDelete: function () {\n return window.confirm(\"Are you sure you want to delete?\");\n },\n\n\n\t_rotateBy: function(angle) {\n\t\tvar overlay = this._overlay,\n\t\t\tmap = overlay._map,\n\t\t\tcenter = map.latLngToLayerPoint(overlay.getCenter()),\n\t\t\ti, p, q;\n\n\t\tfor (i = 0; i < 4; i++) {\n\t\t\tp = map.latLngToLayerPoint(overlay._corners[i]).subtract(center);\n\t\t\tq = new L.Point(\n\t\t\t\tMath.cos(angle)*p.x - Math.sin(angle)*p.y,\n\t\t\t\tMath.sin(angle)*p.x + Math.cos(angle)*p.y\n\t\t\t);\n\t\t\toverlay._corners[i] = map.layerPointToLatLng(q.add(center));\n\t\t}\n\n\t\toverlay._reset();\n\t},\n\n\t_scaleBy: function(scale) {\n\t\tvar overlay = this._overlay,\n\t\t\tmap = overlay._map,\n\t\t\tcenter = map.latLngToLayerPoint(overlay.getCenter()),\n\t\t\ti, p;\n\n\t\tfor (i = 0; i < 4; i++) {\n\t\t\tp = map.latLngToLayerPoint(overlay._corners[i])\n\t\t\t\t.subtract(center)\n\t\t\t\t.multiplyBy(scale)\n\t\t\t\t.add(center);\n\t\t\toverlay._corners[i] = map.layerPointToLatLng(p);\n\t\t}\n\n\t\toverlay._reset();\n\t},\n\n\t_enableDragging: function() {\n\t\tvar overlay = this._overlay,\n\t\t\tmap = overlay._map;\n\n\t\tthis.dragging = new L.Draggable(overlay._image);\n\t\tthis.dragging.enable();\n\n\t\t/* Hide toolbars while dragging; click will re-show it */\n\t\tthis.dragging.on('dragstart', function () {\n\t\t\toverlay.fire('dragstart');\n\t\t\tthis._hideToolbar();\n\t\t}, this);\n\n\t\t/*\n\t\t * Adjust default behavior of L.Draggable.\n\t\t * By default, L.Draggable overwrites the CSS3 distort transform\n\t\t * that we want when it calls L.DomUtil.setPosition.\n\t\t */\n\t\tthis.dragging._updatePosition = function() {\n\t\t\tvar delta = this._newPos.subtract(map.latLngToLayerPoint(overlay._corners[0])),\n\t\t\t\tcurrentPoint, i;\n\n\t\t\tthis.fire('predrag');\n\n\t\t\tfor (i = 0; i < 4; i++) {\n\t\t\t\tcurrentPoint = map.latLngToLayerPoint(overlay._corners[i]);\n\t\t\t\toverlay._corners[i] = map.layerPointToLatLng(currentPoint.add(delta));\n\t\t\t}\n\t\t\toverlay._reset();\n\t\t\toverlay.fire('update');\n\t\t\toverlay.fire('drag');\n\n\t\t\tthis.fire('drag');\n\t\t};\n\t},\n\n\t_onKeyDown: function(event) {\n\t\tvar keymap = this.options.keymap,\n\t\t\thandlerName = keymap[event.which];\n\n\t\tif (handlerName !== undefined && this._overlay.options.suppressToolbar !== true) {\n\t\t\tthis[handlerName].call(this);\n\t\t}\n\t},\n\n\t_toggleRotateDistort: function() {\n\t\tvar map = this._overlay._map;\n\n\t\tmap.removeLayer(this._handles[this._mode]);\n\n\t\t/* Switch mode. */\n\t\tif (this._mode === 'rotate') { this._mode = 'distort'; }\n\t\telse { this._mode = 'rotate'; }\n\n\t\tmap.addLayer(this._handles[this._mode]);\n\t},\n\n\t_toggleScale: function() {\n\t\tvar map = this._overlay._map;\n\n\t\tmap.removeLayer(this._handles[this._mode]);\n\n\t\tthis._mode = 'scale';\n\n\t\tmap.addLayer(this._handles[this._mode]);\n\t},\n\n\t_toggleRotate: function() {\n\t\tvar map = this._overlay._map;\n\n\t\tmap.removeLayer(this._handles[this._mode]);\n\n\t\tthis._mode = 'rotateStandalone';\n\n\t\tmap.addLayer(this._handles[this._mode]);\n\t},\n\n\t_toggleTransparency: function() {\n\t\tvar image = this._overlay._image,\n\t\t\topacity;\n\n\t\tthis._transparent = !this._transparent;\n\t\topacity = this._transparent ? this.options.opacity : 1;\n\n\t\tL.DomUtil.setOpacity(image, opacity);\n\t\timage.setAttribute('opacity', opacity);\n\t},\n\n\t_toggleOutline: function() {\n\t\tvar image = this._overlay._image,\n\t\t\topacity, outline;\n\n\t\tthis._outlined = !this._outlined;\n\t\topacity = this._outlined ? this.options.opacity / 2 : 1;\n\t\toutline = this._outlined ? this.options.outline : 'none';\n\n\t\tL.DomUtil.setOpacity(image, opacity);\n\t\timage.setAttribute('opacity', opacity);\n\n\t\timage.style.outline = outline;\n\t},\n\n\t_sendUp: function() {\n\t\tthis._overlay.bringToFront();\n\t},\n\n\t_sendDown: function() {\n\t\tthis._overlay.bringToBack();\n\t},\n\n\t_toggleLock: function() {\n\t\tvar map = this._overlay._map;\n\n\t\tmap.removeLayer(this._handles[this._mode]);\n\t\t/* Switch mode. */\n\t\tif (this._mode === 'lock') {\n\t\t\tthis._mode = 'distort';\n\t\t\tthis._enableDragging();\n\t\t} else {\n\t\t\tthis._mode = 'lock';\n\t\t\tif (this.dragging) { this.dragging.disable(); }\n\t\t\tdelete this.dragging;\n\t\t}\n\n\t\tmap.addLayer(this._handles[this._mode]);\n\t},\n\n\t_hideToolbar: function() {\n\t\tvar map = this._overlay._map;\n\t\tif (this.toolbar) {\n\t\t\tmap.removeLayer(this.toolbar);\n\t\t\tthis.toolbar = false;\n\t\t}\n\t},\n\n\t_showToolbar: function(event) {\n\t\tvar overlay = this._overlay,\n target = event.target,\n\t\t\tmap = overlay._map;\n\n\t\t/* Ensure that there is only ever one toolbar attached to each image. */\n\t\tthis._hideToolbar();\n\t\tvar point;\n\t\tif (event.containerPoint) { point = event.containerPoint; }\n\t\telse { point = target._leaflet_pos; }\n\t\tvar raised_point = map.containerPointToLatLng(new L.Point(point.x,point.y-20));\n\t\traised_point.lng = overlay.getCenter().lng;\n\t\tif (this._overlay.options.suppressToolbar !== true) {\n\t\tthis.toolbar = new L.DistortableImage.EditToolbar(raised_point).addTo(map, overlay);\n\t\toverlay.fire('toolbar:created');\n\t\t}\n\n\t\tL.DomEvent.stopPropagation(event);\n },\n\n _removeOverlay: function () {\n var overlay = this._overlay;\n if (this._mode !== \"lock\") {\n var choice = this.confirmDelete();\n if (choice) {\n overlay._map.removeLayer(overlay);\n overlay.fire('delete');\n this.disable();\n }\n }\n },\n\t// compare this to using overlay zIndex\n\t_toggleOrder: function () {\n\tif (this._toggledImage) {\n\t\tthis._overlay.bringToFront();\n\t\tthis._toggledImage = false;\n\t\t}\n\telse {\n\t\tthis._overlay.bringToBack();\n\t\tthis._toggledImage = true;\n\t\t}\n\t},\n\n\t// Based on https://github.com/publiclab/mapknitter/blob/8d94132c81b3040ae0d0b4627e685ff75275b416/app/assets/javascripts/mapknitter/Map.js#L47-L82\n\t_toggleExport: function (){\n\t\tvar map = this._overlay._map;\n\t\tvar overlay = this._overlay;\n\n\t\t// make a new image\n\t\tvar downloadable = new Image();\n\n\t\tdownloadable.id = downloadable.id || \"tempId12345\";\n\t\t$('body').append(downloadable);\n\n\t\tdownloadable.onload = function onLoadDownloadableImage() {\n\n\t\t\tvar height = downloadable.height,\n\t\t\t\twidth = downloadable.width,\n\t\t\t\tnw = map.latLngToLayerPoint(overlay._corners[0]),\n\t\t\t\tne = map.latLngToLayerPoint(overlay._corners[1]),\n\t\t\t\tsw = map.latLngToLayerPoint(overlay._corners[2]),\n\t\t\t\tse = map.latLngToLayerPoint(overlay._corners[3]);\n\n\t\t\t// I think this is to move the image to the upper left corner,\n\t\t\t// jywarren: i think we may need these or the image goes off the edge of the canvas\n // jywarren: but these seem to break the distortion math...\n\n\t\t\t// jywarren: i think it should be rejiggered so it\n\t\t\t// finds the most negative values of x and y and then\n\t\t\t// adds those to all coordinates\n\n\t\t\t//nw.x -= nw.x;\n\t\t\t//ne.x -= nw.x;\n\t\t\t//se.x -= nw.x;\n\t\t\t//sw.x -= nw.x;\n\n\t\t\t//nw.y -= nw.y;\n\t\t\t//ne.y -= nw.y;\n\t\t\t//se.y -= nw.y;\n\t\t\t//sw.y -= nw.y;\n\n\t\t\t// run once warping is complete\n \t\t\tdownloadable.onload = function() {\n\t\t\t\t$(downloadable).remove();\n\t\t\t};\n\n\t\t\tif (window && window.hasOwnProperty('warpWebGl')) {\n\t\t\t\twarpWebGl(\n\t\t\t\t\tdownloadable.id,\n\t\t\t\t\t[0, 0, width, 0, width, height, 0, height],\n\t\t\t\t\t[nw.x, nw.y, ne.x, ne.y, se.x, se.y, sw.x, sw.y],\n\t\t\t\t\ttrue // trigger download\n\t\t\t\t);\n\t\t\t}\n\n\t\t};\n\n\t\tdownloadable.src = overlay.options.fullResolutionSrc || overlay._image.src;\n\n\t},\n\n\ttoggleIsolate: function() {\n\t\t// this.isolated = !this.isolated;\n\t\t// if (this.isolated) {\n\t\t// \t$.each($L.images,function(i,img) {\n\t\t// \t\timg.hidden = false;\n\t\t// \t\timg.setOpacity(1);\n\t\t// \t});\n\t\t// } else {\n\t\t// \t$.each($L.images,function(i,img) {\n\t\t// \t\timg.hidden = true;\n\t\t// \t\timg.setOpacity(0);\n\t\t// \t});\n\t\t// }\n\t\t// this.hidden = false;\n\t\t// this.setOpacity(1);\n\t}\n\n});\n\nL.DistortableImageOverlay.addInitHook(function() {\n\tthis.editing = new L.DistortableImage.Edit(this);\n\n\tif (this.options.editable) {\n\t\tL.DomEvent.on(this._image, 'load', this.editing.enable, this.editing);\n\t}\n\n\tthis.on('remove', function () {\n\t\tif (this.editing) { this.editing.disable(); }\n\t});\n});\n","L.Map.mergeOptions({ boxSelector: true, boxZoom: false });\n\nL.Map.BoxSelectHandle = L.Map.BoxZoom.extend({\n\n initialize: function (map) {\n this._map = map;\n this._container = map._container;\n this._pane = map._panes.overlayPane;\n },\n\n addHooks: function () {\n L.DomEvent.on(this._container, 'mousedown', this._onMouseDown, this);\n },\n\n removeHooks: function () {\n L.DomEvent.off(this._container, 'mousedown', this._onMouseDown, this);\n },\n\n _onMouseDown: function (e) {\n if (!e.shiftKey || ((e.which !== 1) && (e.button !== 1))) { return false; }\n\n L.DomUtil.disableTextSelection();\n L.DomUtil.disableImageDrag();\n\n this._startLayerPoint = this._map.mouseEventToLayerPoint(e);\n\n this._box = L.DomUtil.create('div', 'leaflet-zoom-box', this._pane);\n L.DomUtil.setPosition(this._box, this._startLayerPoint);\n\n this._container.style.cursor = 'crosshair';\n\n L.DomEvent\n .on(document, 'mousemove', this._onMouseMove, this)\n .on(document, 'mouseup', this._onMouseUp, this)\n .on(document, 'keydown', this._onKeyDown, this)\n .preventDefault(e);\n\n this._map.fire('boxzoomstart');\n },\n\n _onMouseMove: function (e) {\n var startPoint = this._startLayerPoint,\n box = this._box,\n\n layerPoint = this._map.mouseEventToLayerPoint(e),\n offset = layerPoint.subtract(startPoint),\n\n newPos = new L.Point(\n Math.min(layerPoint.x, startPoint.x),\n Math.min(layerPoint.y, startPoint.y));\n\n L.DomUtil.setPosition(box, newPos);\n\n box.style.width = (Math.max(0, Math.abs(offset.x) - 4)) + 'px';\n box.style.height = (Math.max(0, Math.abs(offset.y) - 4)) + 'px';\n },\n\n _onMouseUp: function (e) {\n if (!$(this._pane).children('.leaflet-zoom-box').length) { return false; }\n // window.e = e;\n var map = this._map,\n layerPoint = map.mouseEventToLayerPoint(e);\n\n if (this._startLayerPoint.equals(layerPoint)) { return; }\n\n var bounds = new L.LatLngBounds(\n map.layerPointToLatLng(this._startLayerPoint),\n map.layerPointToLatLng(layerPoint));\n\n window.bounds = bounds;\n // window.div = this._div;\n window.box = this._box;\n window.pane = this._pane;\n window.map = map;\n window.container = this._container;\n\n map.fire('boxzoomend', {\n // boxBounds: bounds\n });\n\n\n\n let contents = $(this._pane).children();\n let images = contents.filter('img');\n\n this._finish();\n\n this._attach(images);\n\n console.log(images);\n return images;\n },\n\n _finish: function () {\n // if (!this._box) { return false; }\n // this._pane.removeChild(this._box);[]\n $(this._box).remove();\n this._container.style.cursor = '';\n\n L.DomUtil.enableTextSelection();\n L.DomUtil.enableImageDrag();\n\n L.DomEvent\n .off(document, 'mousemove', this._onMouseMove)\n .off(document, 'mouseup', this._onMouseUp)\n .off(document, 'keydown', this._onKeyDown);\n },\n\n _attach: function(images) {\n if ($('#holding')) {\n this._imagesDiv = $('#holding');\n $(images).appendTo(this._imagesDiv);\n window.imagesDiv = this._imagesDiv;\n }\n },\n\n // escape keybinding for getting rid of the selection box (alternative to mouse up). keep for now to see if it will become useful\n // in deselecting images\n _onKeyDown: function (e) {\n if (e.keyCode === 27) {\n if ($(this._pane).children('.leaflet-zoom-box').length) {\n $(this._box).remove();\n }\n // this._finish();\n }\n },\n\n});\n\nL.Map.addInitHook('addHandler', 'boxSelector', L.Map.BoxSelectHandle);"]} \ No newline at end of file diff --git a/examples/select.html b/examples/select.html index 9dd043d48..97b338241 100644 --- a/examples/select.html +++ b/examples/select.html @@ -19,6 +19,11 @@ + @@ -76,10 +81,10 @@ } ).addTo(map); images.push(img) - L.DomEvent.on(img._image, 'click', select, img); + // L.DomEvent.on(img._image, 'click', select, img); // create a second image - img = new L.DistortableImageOverlay( + img2 = new L.DistortableImageOverlay( 'example.png', { corners: [ new L.latLng(51.51,-0.10), @@ -89,11 +94,113 @@ ] } ).addTo(map); - images.push(img); + images.push(img2); + + window.img = img; + window.img2 = img2; + + // L.DomEvent.on(img._image, 'load', img.editing.enable, img.editing); + // L.DomEvent.on(img2._image, 'load', img2.editing.enable, img2.editing); + // L.DomEvent.on(img2._image, 'click', select, img2); + + map.on('click', function () { + $('.selected').removeClass('selected'); + }); + + // L.DomEvent.on(img, 'drag', function (e) { + // console.log(e); + // }); + + // img.on('drag, dragend', function (e) { + // console.log(e); + // }) + + L.DomEvent.on(img._image, 'mousedown', function (e) { + if (e.metaKey || e.ctrlKey) + $(e.target).toggleClass('selected'); + }); + + L.DomEvent.on(img2._image, 'mousedown', function (e) { + if (e.metaKey || e.ctrlKey) + $(e.target).toggleClass('selected'); + }); + + // img2 is on the left (or initially bottom) img is on the right + + let obj = {}; + let objC = {}; + let obj2 = {}; + let objD = {}; + + obj.initVal = 0; + obj.initVal1 = 0; + obj.initVal2 = 0; + obj.initVal3 = 0; + + obj2.initVal = 0; + obj2.initVal1 = 0; + obj2.initVal2 = 0; + obj2.initVal3 = 0; + + + L.DomEvent.on(img, 'dragstart', function (e) { + //console.log('dragstart initial lat: ', img._corners[0].lat); + let i = 0 + for (let k in obj) { + obj[k] = map.latLngToLayerPoint(img.getCorners()[i]); + obj2[k] = map.latLngToLayerPoint(img2.getCorners()[i]); + i += 1; + } + console.log('Initial: ', obj); + window.obj = obj; + + }); + + L.DomEvent.on(img, 'drag', function (e) { + //console.log('dragging changing lat: ', img._corners[0].lat); + objC.changes = obj.initVal.x - map.latLngToLayerPoint(img.getCorners()[0]).x; + objC.changes1 = obj.initVal.y - map.latLngToLayerPoint(img.getCorners()[0]).y; + + objC.changes2 = obj.initVal1.x - map.latLngToLayerPoint(img.getCorners()[1]).x; + objC.changes3 = obj.initVal1.y - map.latLngToLayerPoint(img.getCorners()[1]).y; + + objC.changes4 = obj.initVal2.x - map.latLngToLayerPoint(img.getCorners()[2]).x; + objC.changes5 = obj.initVal2.y - map.latLngToLayerPoint(img.getCorners()[2]).y; + + objC.changes6 = obj.initVal3.x - map.latLngToLayerPoint(img.getCorners()[3]).x; + objC.changes7 = obj.initVal3.y - map.latLngToLayerPoint(img.getCorners()[3]).y; + + window.objC = objC; + console.log('Changes: ', objC); + + + objD.newVal = L.point([obj2.initVal.x - objC.changes, obj2.initVal.y - objC.changes1]); + objD.newVal1 = L.point([obj2.initVal1.x - objC.changes2, obj2.initVal1.y - objC.changes3]); + objD.newVal2 = L.point([obj2.initVal2.x - objC.changes4, obj2.initVal2.y - objC.changes5]); + objD.newVal3 = L.point([obj2.initVal3.x - objC.changes6, obj2.initVal3.y - objC.changes7]); + + let i = 0; + for (let k in objD) { + img2.getCorners()[i].lat = map.layerPointToLatLng(objD[k]).lat; + img2.getCorners()[i].lng = map.layerPointToLatLng(objD[k]).lng; + i += 1; + } + + console.log('New: ', obj2); + window.obj2 = obj2; + + img2.fire('update'); + map.fire('update'); + + // map.invalidateSize(); + // map.getCenter(); + // map.setZoom(13); + // map.fire('reset') + }); L.DomEvent.on(img._image, 'load', img.editing.enable, img.editing); - L.DomEvent.on(img._image, 'click', select, img); + L.DomEvent.on(img2._image, 'load', img2.editing.enable, img2.editing); // this doesn't work -- it triggers when clicking toolbar // can we stopPropagation of toolbar clicks? is that impolite. diff --git a/src/DistortableImageOverlay.js b/src/DistortableImageOverlay.js index 2530303a9..c17c80e2b 100644 --- a/src/DistortableImageOverlay.js +++ b/src/DistortableImageOverlay.js @@ -78,20 +78,6 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ }); }, - setAnchors: function (anchors) { - this._anchors = []; - this._bounds = L.latLngBounds(anchors); - for (var i = 0, len = anchors.length; i < len; i++) { - var yx = anchors[i]; - this._anchors.push(L.latLng(yx)); - } - - if (this._map) { - this._reset(); - } - }, - - _addTool: function(tool) { this._toolArray.push(tool); L.DistortableImage.EditToolbar = LeafletToolbar.Popup.extend({ diff --git a/src/edit/DistortableImage.Edit.js b/src/edit/DistortableImage.Edit.js index 2ce550929..7740b5836 100644 --- a/src/edit/DistortableImage.Edit.js +++ b/src/edit/DistortableImage.Edit.js @@ -158,7 +158,10 @@ L.DistortableImage.Edit = L.Handler.extend({ this.dragging.enable(); /* Hide toolbars while dragging; click will re-show it */ - this.dragging.on('dragstart', this._hideToolbar, this); + this.dragging.on('dragstart', function () { + overlay.fire('dragstart'); + this._hideToolbar(); + }, this); /* * Adjust default behavior of L.Draggable. @@ -177,6 +180,7 @@ L.DistortableImage.Edit = L.Handler.extend({ } overlay._reset(); overlay.fire('update'); + overlay.fire('drag'); this.fire('drag'); }; @@ -312,7 +316,7 @@ L.DistortableImage.Edit = L.Handler.extend({ } } }, - + // compare this to using overlay zIndex _toggleOrder: function () { if (this._toggledImage) { this._overlay.bringToFront(); From 6a988994d8c9cff7d33efd7a1853401d17251e8c Mon Sep 17 00:00:00 2001 From: sashadev-sky Date: Fri, 15 Mar 2019 00:13:03 -0400 Subject: [PATCH 07/63] Move multiple images --- examples/select.html | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/examples/select.html b/examples/select.html index 97b338241..32bd9daa1 100644 --- a/examples/select.html +++ b/examples/select.html @@ -100,6 +100,24 @@ window.img = img; window.img2 = img2; + // var bounds2 = new L.LatLngBounds(new L.LatLng(51.40, -0.10), new L.LatLng(51.55, -0.15)); + // var div = document.createElement("div"); + // div.id = "fooo"; + // div.style.background = "rgba(255,255,255,0.5)"; + // div.innerHTML = "

This is a div element

in an element overlay"; + // layer2 = L.elementOverlay( + // div, { + // corners: [ + // new L.latLng(51.40, -0.10), + // new L.latLng(51.40, -0.15), + // new L.latLng(51.47, -0.11), + // new L.latLng(51.47, -0.16) + // ], + // } + // ).addTo(map); + // images.push(layer2); + // window.layer2 = layer2; + // L.DomEvent.on(img._image, 'load', img.editing.enable, img.editing); // L.DomEvent.on(img2._image, 'load', img2.editing.enable, img2.editing); // L.DomEvent.on(img2._image, 'click', select, img2); @@ -108,14 +126,6 @@ $('.selected').removeClass('selected'); }); - // L.DomEvent.on(img, 'drag', function (e) { - // console.log(e); - // }); - - // img.on('drag, dragend', function (e) { - // console.log(e); - // }) - L.DomEvent.on(img._image, 'mousedown', function (e) { if (e.metaKey || e.ctrlKey) $(e.target).toggleClass('selected'); @@ -190,17 +200,16 @@ console.log('New: ', obj2); window.obj2 = obj2; + img2._reset(); + img2.fire('update'); map.fire('update'); - - // map.invalidateSize(); - // map.getCenter(); - // map.setZoom(13); - // map.fire('reset') + }); L.DomEvent.on(img._image, 'load', img.editing.enable, img.editing); L.DomEvent.on(img2._image, 'load', img2.editing.enable, img2.editing); + // L.DomEvent.on(layer2._image, 'load', layer2.editing.enable, layer2.editing); // this doesn't work -- it triggers when clicking toolbar // can we stopPropagation of toolbar clicks? is that impolite. From 6134d8e6838d931759f2929c382dd23969761d0a Mon Sep 17 00:00:00 2001 From: sashadev-sky Date: Sat, 16 Mar 2019 03:32:16 -0400 Subject: [PATCH 08/63] Begin migrating code into a class --- examples/select.html | 133 +++++++++++++++--------------- src/edit/DistortableImage.Edit.js | 69 +++++++++++++++- 2 files changed, 135 insertions(+), 67 deletions(-) diff --git a/examples/select.html b/examples/select.html index 32bd9daa1..0fc7a941d 100644 --- a/examples/select.html +++ b/examples/select.html @@ -122,90 +122,91 @@ // L.DomEvent.on(img2._image, 'load', img2.editing.enable, img2.editing); // L.DomEvent.on(img2._image, 'click', select, img2); - map.on('click', function () { - $('.selected').removeClass('selected'); - }); + // map.on('click', function () { + // $('.selected').removeClass('selected'); + // }); - L.DomEvent.on(img._image, 'mousedown', function (e) { - if (e.metaKey || e.ctrlKey) - $(e.target).toggleClass('selected'); - }); + // L.DomEvent.on(img._image, 'mousedown', function (e) { + // if (e.metaKey || e.ctrlKey) + // $(e.target).toggleClass('selected'); + // }); - L.DomEvent.on(img2._image, 'mousedown', function (e) { - if (e.metaKey || e.ctrlKey) - $(e.target).toggleClass('selected'); - }); + // L.DomEvent.on(img2._image, 'mousedown', function (e) { + // if (e.metaKey || e.ctrlKey) + // $(e.target).toggleClass('selected'); + // }); // img2 is on the left (or initially bottom) img is on the right - let obj = {}; - let objC = {}; - let obj2 = {}; - let objD = {}; + // let obj = {}; + // let objC = {}; + // let obj2 = {}; + // let objD = {}; - obj.initVal = 0; - obj.initVal1 = 0; - obj.initVal2 = 0; - obj.initVal3 = 0; - - obj2.initVal = 0; - obj2.initVal1 = 0; - obj2.initVal2 = 0; - obj2.initVal3 = 0; - - - L.DomEvent.on(img, 'dragstart', function (e) { - //console.log('dragstart initial lat: ', img._corners[0].lat); - let i = 0 - for (let k in obj) { - obj[k] = map.latLngToLayerPoint(img.getCorners()[i]); - obj2[k] = map.latLngToLayerPoint(img2.getCorners()[i]); - i += 1; - } - console.log('Initial: ', obj); - window.obj = obj; + // obj.initVal = 0; + // obj.initVal1 = 0; + // obj.initVal2 = 0; + // obj.initVal3 = 0; + + // obj2.initVal = 0; + // obj2.initVal1 = 0; + // obj2.initVal2 = 0; + // obj2.initVal3 = 0; + + + // L.DomEvent.on(img, 'dragstart', function (e) { + // //this.initialCorner = + // //console.log('dragstart initial lat: ', img._corners[0].lat); + // let i = 0 + // for (let k in obj) { + // obj[k] = map.latLngToLayerPoint(img.getCorners()[i]); + // obj2[k] = map.latLngToLayerPoint(img2.getCorners()[i]); + // i += 1; + // } + // console.log('Initial: ', obj); + // window.obj = obj; - }); + // }); - L.DomEvent.on(img, 'drag', function (e) { - //console.log('dragging changing lat: ', img._corners[0].lat); - objC.changes = obj.initVal.x - map.latLngToLayerPoint(img.getCorners()[0]).x; - objC.changes1 = obj.initVal.y - map.latLngToLayerPoint(img.getCorners()[0]).y; + // L.DomEvent.on(img, 'drag', function (e) { + // //console.log('dragging changing lat: ', img._corners[0].lat); + // objC.changes = obj.initVal.x - map.latLngToLayerPoint(img.getCorners()[0]).x; + // objC.changes1 = obj.initVal.y - map.latLngToLayerPoint(img.getCorners()[0]).y; - objC.changes2 = obj.initVal1.x - map.latLngToLayerPoint(img.getCorners()[1]).x; - objC.changes3 = obj.initVal1.y - map.latLngToLayerPoint(img.getCorners()[1]).y; + // objC.changes2 = obj.initVal1.x - map.latLngToLayerPoint(img.getCorners()[1]).x; + // objC.changes3 = obj.initVal1.y - map.latLngToLayerPoint(img.getCorners()[1]).y; - objC.changes4 = obj.initVal2.x - map.latLngToLayerPoint(img.getCorners()[2]).x; - objC.changes5 = obj.initVal2.y - map.latLngToLayerPoint(img.getCorners()[2]).y; + // objC.changes4 = obj.initVal2.x - map.latLngToLayerPoint(img.getCorners()[2]).x; + // objC.changes5 = obj.initVal2.y - map.latLngToLayerPoint(img.getCorners()[2]).y; - objC.changes6 = obj.initVal3.x - map.latLngToLayerPoint(img.getCorners()[3]).x; - objC.changes7 = obj.initVal3.y - map.latLngToLayerPoint(img.getCorners()[3]).y; + // objC.changes6 = obj.initVal3.x - map.latLngToLayerPoint(img.getCorners()[3]).x; + // objC.changes7 = obj.initVal3.y - map.latLngToLayerPoint(img.getCorners()[3]).y; - window.objC = objC; - console.log('Changes: ', objC); + // window.objC = objC; + // console.log('Changes: ', objC); - objD.newVal = L.point([obj2.initVal.x - objC.changes, obj2.initVal.y - objC.changes1]); - objD.newVal1 = L.point([obj2.initVal1.x - objC.changes2, obj2.initVal1.y - objC.changes3]); - objD.newVal2 = L.point([obj2.initVal2.x - objC.changes4, obj2.initVal2.y - objC.changes5]); - objD.newVal3 = L.point([obj2.initVal3.x - objC.changes6, obj2.initVal3.y - objC.changes7]); - - let i = 0; - for (let k in objD) { - img2.getCorners()[i].lat = map.layerPointToLatLng(objD[k]).lat; - img2.getCorners()[i].lng = map.layerPointToLatLng(objD[k]).lng; - i += 1; - } + // objD.newVal = L.point([obj2.initVal.x - objC.changes, obj2.initVal.y - objC.changes1]); + // objD.newVal1 = L.point([obj2.initVal1.x - objC.changes2, obj2.initVal1.y - objC.changes3]); + // objD.newVal2 = L.point([obj2.initVal2.x - objC.changes4, obj2.initVal2.y - objC.changes5]); + // objD.newVal3 = L.point([obj2.initVal3.x - objC.changes6, obj2.initVal3.y - objC.changes7]); - console.log('New: ', obj2); - window.obj2 = obj2; + // let i = 0; + // for (let k in objD) { + // img2.getCorners()[i].lat = map.layerPointToLatLng(objD[k]).lat; + // img2.getCorners()[i].lng = map.layerPointToLatLng(objD[k]).lng; + // i += 1; + // } - img2._reset(); + // console.log('New: ', obj2); + // window.obj2 = obj2; - img2.fire('update'); - map.fire('update'); + // img2._reset(); + + // img2.fire('update'); + // map.fire('update'); - }); + // }); L.DomEvent.on(img._image, 'load', img.editing.enable, img.editing); L.DomEvent.on(img2._image, 'load', img2.editing.enable, img2.editing); diff --git a/src/edit/DistortableImage.Edit.js b/src/edit/DistortableImage.Edit.js index 7740b5836..017dc4daa 100644 --- a/src/edit/DistortableImage.Edit.js +++ b/src/edit/DistortableImage.Edit.js @@ -78,9 +78,17 @@ L.DistortableImage.Edit = L.Handler.extend({ this._enableDragging(); } + L.DomEvent.on(map, 'click', this._removeSelections, this); + + L.DomEvent.on(overlay, 'dragstart', this._dragStartMultiple, this); + + L.DomEvent.on(overlay, 'drag', this._dragMultiple, this); + //overlay.on('click', this._showToolbar, this); L.DomEvent.on(overlay._image, 'click', this._showToolbar, this); + L.DomEvent.on(overlay._image, 'mousedown', this._showSelected, this); + /* Enable hotkeys. */ L.DomEvent.on(window, 'keydown', this._onKeyDown, this); @@ -150,6 +158,55 @@ L.DistortableImage.Edit = L.Handler.extend({ overlay._reset(); }, + // drag events for multiple images are separated out from enableDragging initialization -- two different concepts + _dragStartMultiple: function(e) { + var overlay = this._overlay; + console.log(this,e,overlay); + // pass by value + overlay._initialCorners = JSON.parse(JSON.stringify(overlay.getCorners())); + // window.initial = this._initialCorners; + //this.initialCorner = + //console.log('dragstart initial lat: ', img._corners[0].lat); + // window.e = e; + // var overlay = this._overlay, + // map = overlay._map; + + // var obj = {}; + // // let objC = {}; + // var obj2 = {}; + // // let objD = {}; + + // obj.initVal = 0; + // obj.initVal1 = 0; + // obj.initVal2 = 0; + // obj.initVal3 = 0; + + // obj2.initVal = 0; + // obj2.initVal1 = 0; + // obj2.initVal2 = 0; + // obj2.initVal3 = 0; + + // var imgCollection = $(map.getPane('overlayPane').children).filter('img'); + + // var img = imgCollection[1]; + + // var img2 = imgCollection[2]; + + // var i = 0; + // for (var k in obj) { + // obj[k] = map.latLngToLayerPoint(img.getCorners()[i]); + // obj2[k] = map.latLngToLayerPoint(img2.getCorners()[i]); + // i += 1; + // } + // console.log('Initial: ', obj); + // window.obj = obj; + + }, + + _dragMultiple: function() { + + }, + _enableDragging: function() { var overlay = this._overlay, map = overlay._map; @@ -303,7 +360,17 @@ L.DistortableImage.Edit = L.Handler.extend({ } L.DomEvent.stopPropagation(event); - }, + }, + + _showSelected: function(event) { + if (event.metaKey || event.ctrlKey) { + $(event.target).toggleClass('selected'); + } + }, + + _removeSelections: function() { + $('.selected').removeClass('selected'); + }, _removeOverlay: function () { var overlay = this._overlay; From 9a47c71b358f81e193747d1608bf63c591b6387d Mon Sep 17 00:00:00 2001 From: sashadev-sky Date: Sat, 16 Mar 2019 17:46:25 -0400 Subject: [PATCH 09/63] continue code migration --- dist/leaflet.distortableimage.js | 105 ++++++++++++++++++++++++++++- src/edit/DistortableImage.Edit.js | 108 ++++++++++++++++++------------ 2 files changed, 169 insertions(+), 44 deletions(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index 727b48ec1..c9a9a0d30 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -1030,9 +1030,17 @@ L.DistortableImage.Edit = L.Handler.extend({ this._enableDragging(); } + L.DomEvent.on(map, 'click', this._removeSelections, this); + + L.DomEvent.on(overlay, 'dragstart', this._dragStartMultiple, this); + + L.DomEvent.on(overlay, 'drag', this._dragMultiple, this); + //overlay.on('click', this._showToolbar, this); L.DomEvent.on(overlay._image, 'click', this._showToolbar, this); + L.DomEvent.on(overlay._image, 'mousedown', this._showSelected, this); + /* Enable hotkeys. */ L.DomEvent.on(window, 'keydown', this._onKeyDown, this); @@ -1102,6 +1110,81 @@ L.DistortableImage.Edit = L.Handler.extend({ overlay._reset(); }, + // drag events for multiple images are separated out from enableDragging initialization -- two different concepts + _dragStartMultiple: function() { + var overlay = this._overlay, + map = overlay._map; + + // pass by value alternative for future code refactoring possibility + // overlay._initialCorners = JSON.parse(JSON.stringify(overlay.getCorners())); + + var obj = {}; + obj.initVal = 0; + obj.initVal1 = 0; + obj.initVal2 = 0; + obj.initVal3 = 0; + + var i = 0; + for (var k in obj) { + obj[k] = map.latLngToLayerPoint(overlay.getCorners()[i]); + i += 1; + } + + overlay._initialCornerPoints = obj; + + // TMRW: SAVE CHANGES AS CHANGES VALUES IN IMAGE. + overlay._cornerPointChanges = {}; + }, + + _dragMultiple: function() { + var overlay = this._overlay, + map = overlay._map; + + var obj2 = {}; + + obj2.initVal = 0; + obj2.initVal1 = 0; + obj2.initVal2 = 0; + obj2.initVal3 = 0; + + var i = 0; + for (var k in obj2) { + obj2[k] = map.latLngToLayerPoint(overlay.getCorners()[i]); + i += 1; + } + + overlay._currentCornerPoints = obj2; + + // this.calculateCornerChanges(objC); + + // objC.changes = obj.initVal.x - map.latLngToLayerPoint(img.getCorners()[0]).x; + // objC.changes1 = obj.initVal.y - map.latLngToLayerPoint(img.getCorners()[0]).y; + + // objC.changes2 = obj.initVal1.x - map.latLngToLayerPoint(img.getCorners()[1]).x; + // objC.changes3 = obj.initVal1.y - map.latLngToLayerPoint(img.getCorners()[1]).y; + + // objC.changes4 = obj.initVal2.x - map.latLngToLayerPoint(img.getCorners()[2]).x; + // objC.changes5 = obj.initVal2.y - map.latLngToLayerPoint(img.getCorners()[2]).y; + + // objC.changes6 = obj.initVal3.x - map.latLngToLayerPoint(img.getCorners()[3]).x; + // objC.changes7 = obj.initVal3.y - map.latLngToLayerPoint(img.getCorners()[3]).y; + }, + + calculateCornerChanges: function() { + + // objC.changes = obj.initVal.x - map.latLngToLayerPoint(img.getCorners()[0]).x; + // objC.changes1 = obj.initVal.y - map.latLngToLayerPoint(img.getCorners()[0]).y; + + // objC.changes2 = obj.initVal1.x - map.latLngToLayerPoint(img.getCorners()[1]).x; + // objC.changes3 = obj.initVal1.y - map.latLngToLayerPoint(img.getCorners()[1]).y; + + // objC.changes4 = obj.initVal2.x - map.latLngToLayerPoint(img.getCorners()[2]).x; + // objC.changes5 = obj.initVal2.y - map.latLngToLayerPoint(img.getCorners()[2]).y; + + // objC.changes6 = obj.initVal3.x - map.latLngToLayerPoint(img.getCorners()[3]).x; + // objC.changes7 = obj.initVal3.y - map.latLngToLayerPoint(img.getCorners()[3]).y; + }, + _enableDragging: function() { var overlay = this._overlay, map = overlay._map; @@ -1255,7 +1338,17 @@ L.DistortableImage.Edit = L.Handler.extend({ } L.DomEvent.stopPropagation(event); - }, + }, + + _showSelected: function(event) { + if (event.metaKey || event.ctrlKey) { + $(event.target).toggleClass('selected'); + } + }, + + _removeSelections: function() { + $('.selected').removeClass('selected'); + }, _removeOverlay: function () { var overlay = this._overlay; @@ -1369,6 +1462,13 @@ L.DistortableImageOverlay.addInitHook(function() { }); }); + +// L.DistortableImages.Edit = L.DistortableImage.Edit.extend({ +// // initialize: function (overlay) { +// // L.DistortableImage.Edit.prototype.initialize.call(this, latlng, markerOptions); +// // } + +// }); L.Map.mergeOptions({ boxSelector: true, boxZoom: false }); L.Map.BoxSelectHandle = L.Map.BoxZoom.extend({ @@ -1498,5 +1598,4 @@ L.Map.BoxSelectHandle = L.Map.BoxZoom.extend({ }); -L.Map.addInitHook('addHandler', 'boxSelector', L.Map.BoxSelectHandle); -//# sourceMappingURL=leaflet.distortableimage.js.map \ No newline at end of file +L.Map.addInitHook('addHandler', 'boxSelector', L.Map.BoxSelectHandle); \ No newline at end of file diff --git a/src/edit/DistortableImage.Edit.js b/src/edit/DistortableImage.Edit.js index 017dc4daa..4ed43fe6c 100644 --- a/src/edit/DistortableImage.Edit.js +++ b/src/edit/DistortableImage.Edit.js @@ -159,52 +159,78 @@ L.DistortableImage.Edit = L.Handler.extend({ }, // drag events for multiple images are separated out from enableDragging initialization -- two different concepts - _dragStartMultiple: function(e) { - var overlay = this._overlay; - console.log(this,e,overlay); - // pass by value - overlay._initialCorners = JSON.parse(JSON.stringify(overlay.getCorners())); - // window.initial = this._initialCorners; - //this.initialCorner = - //console.log('dragstart initial lat: ', img._corners[0].lat); - // window.e = e; - // var overlay = this._overlay, - // map = overlay._map; - - // var obj = {}; - // // let objC = {}; - // var obj2 = {}; - // // let objD = {}; - - // obj.initVal = 0; - // obj.initVal1 = 0; - // obj.initVal2 = 0; - // obj.initVal3 = 0; - - // obj2.initVal = 0; - // obj2.initVal1 = 0; - // obj2.initVal2 = 0; - // obj2.initVal3 = 0; - - // var imgCollection = $(map.getPane('overlayPane').children).filter('img'); - - // var img = imgCollection[1]; - - // var img2 = imgCollection[2]; - - // var i = 0; - // for (var k in obj) { - // obj[k] = map.latLngToLayerPoint(img.getCorners()[i]); - // obj2[k] = map.latLngToLayerPoint(img2.getCorners()[i]); - // i += 1; - // } - // console.log('Initial: ', obj); - // window.obj = obj; + _dragStartMultiple: function() { + var overlay = this._overlay, + map = overlay._map; + // pass by value alternative for future code refactoring possibility + // overlay._initialCorners = JSON.parse(JSON.stringify(overlay.getCorners())); + + var obj = {}; + obj.initVal = 0; + obj.initVal1 = 0; + obj.initVal2 = 0; + obj.initVal3 = 0; + + var i = 0; + for (var k in obj) { + obj[k] = map.latLngToLayerPoint(overlay.getCorners()[i]); + i += 1; + } + + overlay._initialCornerPoints = obj; + + // TMRW: SAVE CHANGES AS CHANGES VALUES IN IMAGE. + overlay._cornerPointChanges = {}; }, _dragMultiple: function() { + var overlay = this._overlay, + map = overlay._map; + + var obj2 = {}; + + obj2.initVal = 0; + obj2.initVal1 = 0; + obj2.initVal2 = 0; + obj2.initVal3 = 0; + + var i = 0; + for (var k in obj2) { + obj2[k] = map.latLngToLayerPoint(overlay.getCorners()[i]); + i += 1; + } + + overlay._currentCornerPoints = obj2; + + // this.calculateCornerChanges(objC); + + // objC.changes = obj.initVal.x - map.latLngToLayerPoint(img.getCorners()[0]).x; + // objC.changes1 = obj.initVal.y - map.latLngToLayerPoint(img.getCorners()[0]).y; + + // objC.changes2 = obj.initVal1.x - map.latLngToLayerPoint(img.getCorners()[1]).x; + // objC.changes3 = obj.initVal1.y - map.latLngToLayerPoint(img.getCorners()[1]).y; + + // objC.changes4 = obj.initVal2.x - map.latLngToLayerPoint(img.getCorners()[2]).x; + // objC.changes5 = obj.initVal2.y - map.latLngToLayerPoint(img.getCorners()[2]).y; + + // objC.changes6 = obj.initVal3.x - map.latLngToLayerPoint(img.getCorners()[3]).x; + // objC.changes7 = obj.initVal3.y - map.latLngToLayerPoint(img.getCorners()[3]).y; + }, + + calculateCornerChanges: function() { + + // objC.changes = obj.initVal.x - map.latLngToLayerPoint(img.getCorners()[0]).x; + // objC.changes1 = obj.initVal.y - map.latLngToLayerPoint(img.getCorners()[0]).y; + + // objC.changes2 = obj.initVal1.x - map.latLngToLayerPoint(img.getCorners()[1]).x; + // objC.changes3 = obj.initVal1.y - map.latLngToLayerPoint(img.getCorners()[1]).y; + + // objC.changes4 = obj.initVal2.x - map.latLngToLayerPoint(img.getCorners()[2]).x; + // objC.changes5 = obj.initVal2.y - map.latLngToLayerPoint(img.getCorners()[2]).y; + // objC.changes6 = obj.initVal3.x - map.latLngToLayerPoint(img.getCorners()[3]).x; + // objC.changes7 = obj.initVal3.y - map.latLngToLayerPoint(img.getCorners()[3]).y; }, _enableDragging: function() { From 8b5a4f105817585d60134bd0274f4b0577b653b3 Mon Sep 17 00:00:00 2001 From: sashadev-sky Date: Mon, 18 Mar 2019 00:21:42 -0400 Subject: [PATCH 10/63] move multiple images through layer group --- examples/select.html | 3 + src/edit/DistortableImage.Edit.js | 111 ++++++++++++++++++++---------- 2 files changed, 77 insertions(+), 37 deletions(-) diff --git a/examples/select.html b/examples/select.html index 0fc7a941d..80a62078b 100644 --- a/examples/select.html +++ b/examples/select.html @@ -95,6 +95,9 @@ } ).addTo(map); + var imagesLayerGroup = L.layerGroup([img, img2]).addTo(map); + window.imagesLayerGroup = imagesLayerGroup; + images.push(img2); window.img = img; diff --git a/src/edit/DistortableImage.Edit.js b/src/edit/DistortableImage.Edit.js index 4ed43fe6c..9d6e84b4d 100644 --- a/src/edit/DistortableImage.Edit.js +++ b/src/edit/DistortableImage.Edit.js @@ -166,71 +166,108 @@ L.DistortableImage.Edit = L.Handler.extend({ // pass by value alternative for future code refactoring possibility // overlay._initialCorners = JSON.parse(JSON.stringify(overlay.getCorners())); - var obj = {}; - obj.initVal = 0; - obj.initVal1 = 0; - obj.initVal2 = 0; - obj.initVal3 = 0; + // var obj = {}; + // var marker = L.marker([35.10418, -106.62987]).bindPopup("I am a Marker"); + // var polyline = L.polyline([[35.10418, -106.62987], [35.19738, -106.875], [35.07946, -106.80634]], { color: 'red', weight: 8 }).bindPopup("I am a Polyline"); + // var pointsLayerGroup = L.layerGroup([marker, polyline]).addTo(map); + // this.pointsLayerGroup = L.layerGroup().addTo(map); + // window.pointsLayerGroup = this.pointsLayerGroup; + // window.points2LayerGroup = points2LayerGroup; + overlay._initialCornerPoints = {}; + + window.obj = {}; + + window.obj.initVal = 0; + window.obj.initVal1 = 0; + window.obj.initVal2 = 0; + window.obj.initVal3 = 0; var i = 0; - for (var k in obj) { - obj[k] = map.latLngToLayerPoint(overlay.getCorners()[i]); + for (var k in window.obj) { + window.obj[k] = map.latLngToLayerPoint(window.img.getCorners()[i]); + overlay._initialCornerPoints[k] = map.latLngToLayerPoint(overlay.getCorners()[i]); i += 1; } - overlay._initialCornerPoints = obj; - - // TMRW: SAVE CHANGES AS CHANGES VALUES IN IMAGE. overlay._cornerPointChanges = {}; + }, _dragMultiple: function() { var overlay = this._overlay, map = overlay._map; - var obj2 = {}; - - obj2.initVal = 0; - obj2.initVal1 = 0; - obj2.initVal2 = 0; - obj2.initVal3 = 0; + overlay._currentCornerPoints = {}; var i = 0; - for (var k in obj2) { - obj2[k] = map.latLngToLayerPoint(overlay.getCorners()[i]); + for (var k in window.obj) { + overlay._currentCornerPoints[k] = map.latLngToLayerPoint(overlay.getCorners()[i]); i += 1; } - overlay._currentCornerPoints = obj2; + // this.pointsLayerGroup.addLayer(overlay); - // this.calculateCornerChanges(objC); + this.calcCornerChanges(overlay); - // objC.changes = obj.initVal.x - map.latLngToLayerPoint(img.getCorners()[0]).x; - // objC.changes1 = obj.initVal.y - map.latLngToLayerPoint(img.getCorners()[0]).y; + var objD = this.calcNewCorners(overlay); - // objC.changes2 = obj.initVal1.x - map.latLngToLayerPoint(img.getCorners()[1]).x; - // objC.changes3 = obj.initVal1.y - map.latLngToLayerPoint(img.getCorners()[1]).y; + this.updateCorners(objD, overlay); + }, - // objC.changes4 = obj.initVal2.x - map.latLngToLayerPoint(img.getCorners()[2]).x; - // objC.changes5 = obj.initVal2.y - map.latLngToLayerPoint(img.getCorners()[2]).y; + calcCornerChanges: function(overlay) { + overlay._cornerPointChanges.changes = overlay._initialCornerPoints.initVal.x - overlay._currentCornerPoints.initVal.x; + overlay._cornerPointChanges.changes1 = overlay._initialCornerPoints.initVal.y - overlay._currentCornerPoints.initVal.y; - // objC.changes6 = obj.initVal3.x - map.latLngToLayerPoint(img.getCorners()[3]).x; - // objC.changes7 = obj.initVal3.y - map.latLngToLayerPoint(img.getCorners()[3]).y; + overlay._cornerPointChanges.changes2 = overlay._initialCornerPoints.initVal1.x - overlay._currentCornerPoints.initVal1.x; + overlay._cornerPointChanges.changes3 = overlay._initialCornerPoints.initVal1.y - overlay._currentCornerPoints.initVal1.y; + + overlay._cornerPointChanges.changes4 = overlay._initialCornerPoints.initVal2.x - overlay._currentCornerPoints.initVal2.x; + overlay._cornerPointChanges.changes5 = overlay._initialCornerPoints.initVal2.y - overlay._currentCornerPoints.initVal2.y; + + overlay._cornerPointChanges.changes6 = overlay._initialCornerPoints.initVal3.x - overlay._currentCornerPoints.initVal3.x; + overlay._cornerPointChanges.changes7 = overlay._initialCornerPoints.initVal3.y - overlay._currentCornerPoints.initVal3.y; }, - calculateCornerChanges: function() { + calcNewCorners: function(overlay) { + var objD = {}; + objD.newVal = L.point([window.obj.initVal.x - overlay._cornerPointChanges.changes, window.obj.initVal.y - overlay._cornerPointChanges.changes1]); + objD.newVal1 = L.point([window.obj.initVal1.x - overlay._cornerPointChanges.changes2, window.obj.initVal1.y - overlay._cornerPointChanges.changes3]); + objD.newVal2 = L.point([window.obj.initVal2.x - overlay._cornerPointChanges.changes4, window.obj.initVal2.y - overlay._cornerPointChanges.changes5]); + objD.newVal3 = L.point([window.obj.initVal3.x - overlay._cornerPointChanges.changes6, window.obj.initVal3.y - overlay._cornerPointChanges.changes7]); + + return objD; + }, - // objC.changes = obj.initVal.x - map.latLngToLayerPoint(img.getCorners()[0]).x; - // objC.changes1 = obj.initVal.y - map.latLngToLayerPoint(img.getCorners()[0]).y; + updateCorners: function(objD, overlay) { + window.objD = objD; + window.overlay = overlay; + var imgAry = this.getImages(); + var i = 0; + for (var k in objD) { + imgAry[0].getCorners()[i].lat = overlay._map.layerPointToLatLng(objD[k]).lat; + imgAry[0].getCorners()[i].lng = overlay._map.layerPointToLatLng(objD[k]).lng; + i += 1; + } + + window.img._reset(); + + window.img.fire('update'); + }, - // objC.changes2 = obj.initVal1.x - map.latLngToLayerPoint(img.getCorners()[1]).x; - // objC.changes3 = obj.initVal1.y - map.latLngToLayerPoint(img.getCorners()[1]).y; + getImages: function() { + // this._overlay._map.getPane('overlayPane').children(); + var image_array = []; - // objC.changes4 = obj.initVal2.x - map.latLngToLayerPoint(img.getCorners()[2]).x; - // objC.changes5 = obj.initVal2.y - map.latLngToLayerPoint(img.getCorners()[2]).y; + window.imagesLayerGroup.eachLayer(function (layer) { + image_array.push(layer); + }); - // objC.changes6 = obj.initVal3.x - map.latLngToLayerPoint(img.getCorners()[3]).x; - // objC.changes7 = obj.initVal3.y - map.latLngToLayerPoint(img.getCorners()[3]).y; + return image_array; + // this._polyline = L.polyline(polyline_array); + // this._overlay._map.eachLayer(function (layer) { + // if layer + // console.log(layer.name); + // }); }, _enableDragging: function() { From cb98bd24d5830bb76bbf051695d4d07221a61b77 Mon Sep 17 00:00:00 2001 From: sashadev-sky Date: Mon, 18 Mar 2019 01:07:29 -0400 Subject: [PATCH 11/63] use available _updateCorner method --- dist/leaflet.distortableimage.js | 118 ++++++++++++++++++++---------- src/DistortableImageOverlay.js | 3 +- src/edit/DistortableImage.Edit.js | 28 ++++--- 3 files changed, 98 insertions(+), 51 deletions(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index c9a9a0d30..d48168992 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -674,7 +674,6 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ this._reset(); }, - /* Copied from Leaflet v0.7 https://github.com/Leaflet/Leaflet/blob/66282f14bcb180ec87d9818d9f3c9f75afd01b30/src/dom/DomUtil.js#L189-L199 */ /* since L.DomUtil.getTranslateString() is deprecated in Leaflet v1.0 */ _getTranslateString: function (point) { @@ -789,6 +788,8 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ } }); + + L.DistortableImage = L.DistortableImage || {}; var EditOverlayAction = LeafletToolbar.ToolbarAction.extend({ @@ -1118,71 +1119,112 @@ L.DistortableImage.Edit = L.Handler.extend({ // pass by value alternative for future code refactoring possibility // overlay._initialCorners = JSON.parse(JSON.stringify(overlay.getCorners())); - var obj = {}; - obj.initVal = 0; - obj.initVal1 = 0; - obj.initVal2 = 0; - obj.initVal3 = 0; + // var obj = {}; + // var marker = L.marker([35.10418, -106.62987]).bindPopup("I am a Marker"); + // var polyline = L.polyline([[35.10418, -106.62987], [35.19738, -106.875], [35.07946, -106.80634]], { color: 'red', weight: 8 }).bindPopup("I am a Polyline"); + // var pointsLayerGroup = L.layerGroup([marker, polyline]).addTo(map); + // this.pointsLayerGroup = L.layerGroup().addTo(map); + // window.pointsLayerGroup = this.pointsLayerGroup; + // window.points2LayerGroup = points2LayerGroup; + overlay._initialCornerPoints = {}; + + window.obj = {}; + + window.obj.initVal = 0; + window.obj.initVal1 = 0; + window.obj.initVal2 = 0; + window.obj.initVal3 = 0; var i = 0; - for (var k in obj) { - obj[k] = map.latLngToLayerPoint(overlay.getCorners()[i]); + for (var k in window.obj) { + window.obj[k] = map.latLngToLayerPoint(window.img.getCorners()[i]); + overlay._initialCornerPoints[k] = map.latLngToLayerPoint(overlay.getCorners()[i]); i += 1; } - overlay._initialCornerPoints = obj; - - // TMRW: SAVE CHANGES AS CHANGES VALUES IN IMAGE. overlay._cornerPointChanges = {}; + }, _dragMultiple: function() { var overlay = this._overlay, map = overlay._map; - var obj2 = {}; - - obj2.initVal = 0; - obj2.initVal1 = 0; - obj2.initVal2 = 0; - obj2.initVal3 = 0; + overlay._currentCornerPoints = {}; var i = 0; - for (var k in obj2) { - obj2[k] = map.latLngToLayerPoint(overlay.getCorners()[i]); + for (var k in window.obj) { + overlay._currentCornerPoints[k] = map.latLngToLayerPoint(overlay.getCorners()[i]); i += 1; } - overlay._currentCornerPoints = obj2; + // this.pointsLayerGroup.addLayer(overlay); + + this.calcCornerChanges(overlay); + + var objD = this.calcNewCorners(overlay); + + this._updateCorners(objD, overlay); + }, - // this.calculateCornerChanges(objC); + calcCornerChanges: function(overlay) { + overlay._cornerPointChanges.changes = overlay._initialCornerPoints.initVal.x - overlay._currentCornerPoints.initVal.x; + overlay._cornerPointChanges.changes1 = overlay._initialCornerPoints.initVal.y - overlay._currentCornerPoints.initVal.y; - // objC.changes = obj.initVal.x - map.latLngToLayerPoint(img.getCorners()[0]).x; - // objC.changes1 = obj.initVal.y - map.latLngToLayerPoint(img.getCorners()[0]).y; + overlay._cornerPointChanges.changes2 = overlay._initialCornerPoints.initVal1.x - overlay._currentCornerPoints.initVal1.x; + overlay._cornerPointChanges.changes3 = overlay._initialCornerPoints.initVal1.y - overlay._currentCornerPoints.initVal1.y; - // objC.changes2 = obj.initVal1.x - map.latLngToLayerPoint(img.getCorners()[1]).x; - // objC.changes3 = obj.initVal1.y - map.latLngToLayerPoint(img.getCorners()[1]).y; + overlay._cornerPointChanges.changes4 = overlay._initialCornerPoints.initVal2.x - overlay._currentCornerPoints.initVal2.x; + overlay._cornerPointChanges.changes5 = overlay._initialCornerPoints.initVal2.y - overlay._currentCornerPoints.initVal2.y; - // objC.changes4 = obj.initVal2.x - map.latLngToLayerPoint(img.getCorners()[2]).x; - // objC.changes5 = obj.initVal2.y - map.latLngToLayerPoint(img.getCorners()[2]).y; + overlay._cornerPointChanges.changes6 = overlay._initialCornerPoints.initVal3.x - overlay._currentCornerPoints.initVal3.x; + overlay._cornerPointChanges.changes7 = overlay._initialCornerPoints.initVal3.y - overlay._currentCornerPoints.initVal3.y; + }, - // objC.changes6 = obj.initVal3.x - map.latLngToLayerPoint(img.getCorners()[3]).x; - // objC.changes7 = obj.initVal3.y - map.latLngToLayerPoint(img.getCorners()[3]).y; + calcNewCorners: function(overlay) { + var objD = {}; + objD.newVal = [window.obj.initVal.x - overlay._cornerPointChanges.changes, window.obj.initVal.y - overlay._cornerPointChanges.changes1]; + objD.newVal1 = [window.obj.initVal1.x - overlay._cornerPointChanges.changes2, window.obj.initVal1.y - overlay._cornerPointChanges.changes3]; + objD.newVal2 = [window.obj.initVal2.x - overlay._cornerPointChanges.changes4, window.obj.initVal2.y - overlay._cornerPointChanges.changes5]; + objD.newVal3 = [window.obj.initVal3.x - overlay._cornerPointChanges.changes6, window.obj.initVal3.y - overlay._cornerPointChanges.changes7]; + + return objD; }, - calculateCornerChanges: function() { + // TODO: move to overlay class + _updateCorners: function(objD, overlay) { + window.overlay = overlay; + var imgAry = this.getImages(); + var i = 0; + for (var k in objD) { + imgAry[0]._updateCorner(i, overlay._map.layerPointToLatLng(objD[k])); + i += 1; + } - // objC.changes = obj.initVal.x - map.latLngToLayerPoint(img.getCorners()[0]).x; - // objC.changes1 = obj.initVal.y - map.latLngToLayerPoint(img.getCorners()[0]).y; + imgAry[0].fire('update'); + }, + + // cannot use the DistortableImageOverlay update corner method for this + // _updateImageCorner: function(img, corner, latlng) { - // objC.changes2 = obj.initVal1.x - map.latLngToLayerPoint(img.getCorners()[1]).x; - // objC.changes3 = obj.initVal1.y - map.latLngToLayerPoint(img.getCorners()[1]).y; + // imgAry[0].getCorners()[i].lat = overlay._map.layerPointToLatLng(objD[k]).lat; + // imgAry[0].getCorners()[i].lng = overlay._map.layerPointToLatLng(objD[k]).lng; + // }, - // objC.changes4 = obj.initVal2.x - map.latLngToLayerPoint(img.getCorners()[2]).x; - // objC.changes5 = obj.initVal2.y - map.latLngToLayerPoint(img.getCorners()[2]).y; + getImages: function() { + // this._overlay._map.getPane('overlayPane').children(); + var image_array = []; + + window.imagesLayerGroup.eachLayer(function (layer) { + image_array.push(layer); + }); - // objC.changes6 = obj.initVal3.x - map.latLngToLayerPoint(img.getCorners()[3]).x; - // objC.changes7 = obj.initVal3.y - map.latLngToLayerPoint(img.getCorners()[3]).y; + return image_array; + // this._polyline = L.polyline(polyline_array); + // this._overlay._map.eachLayer(function (layer) { + // if layer + // console.log(layer.name); + // }); }, _enableDragging: function() { diff --git a/src/DistortableImageOverlay.js b/src/DistortableImageOverlay.js index c17c80e2b..d330238ee 100644 --- a/src/DistortableImageOverlay.js +++ b/src/DistortableImageOverlay.js @@ -142,7 +142,6 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ this._reset(); }, - /* Copied from Leaflet v0.7 https://github.com/Leaflet/Leaflet/blob/66282f14bcb180ec87d9818d9f3c9f75afd01b30/src/dom/DomUtil.js#L189-L199 */ /* since L.DomUtil.getTranslateString() is deprecated in Leaflet v1.0 */ _getTranslateString: function (point) { @@ -256,3 +255,5 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ ); } }); + + diff --git a/src/edit/DistortableImage.Edit.js b/src/edit/DistortableImage.Edit.js index 9d6e84b4d..5b6a07c05 100644 --- a/src/edit/DistortableImage.Edit.js +++ b/src/edit/DistortableImage.Edit.js @@ -211,7 +211,7 @@ L.DistortableImage.Edit = L.Handler.extend({ var objD = this.calcNewCorners(overlay); - this.updateCorners(objD, overlay); + this._updateCorners(objD, overlay); }, calcCornerChanges: function(overlay) { @@ -230,30 +230,34 @@ L.DistortableImage.Edit = L.Handler.extend({ calcNewCorners: function(overlay) { var objD = {}; - objD.newVal = L.point([window.obj.initVal.x - overlay._cornerPointChanges.changes, window.obj.initVal.y - overlay._cornerPointChanges.changes1]); - objD.newVal1 = L.point([window.obj.initVal1.x - overlay._cornerPointChanges.changes2, window.obj.initVal1.y - overlay._cornerPointChanges.changes3]); - objD.newVal2 = L.point([window.obj.initVal2.x - overlay._cornerPointChanges.changes4, window.obj.initVal2.y - overlay._cornerPointChanges.changes5]); - objD.newVal3 = L.point([window.obj.initVal3.x - overlay._cornerPointChanges.changes6, window.obj.initVal3.y - overlay._cornerPointChanges.changes7]); + objD.newVal = [window.obj.initVal.x - overlay._cornerPointChanges.changes, window.obj.initVal.y - overlay._cornerPointChanges.changes1]; + objD.newVal1 = [window.obj.initVal1.x - overlay._cornerPointChanges.changes2, window.obj.initVal1.y - overlay._cornerPointChanges.changes3]; + objD.newVal2 = [window.obj.initVal2.x - overlay._cornerPointChanges.changes4, window.obj.initVal2.y - overlay._cornerPointChanges.changes5]; + objD.newVal3 = [window.obj.initVal3.x - overlay._cornerPointChanges.changes6, window.obj.initVal3.y - overlay._cornerPointChanges.changes7]; return objD; }, - updateCorners: function(objD, overlay) { - window.objD = objD; + // TODO: move to overlay class + _updateCorners: function(objD, overlay) { window.overlay = overlay; var imgAry = this.getImages(); var i = 0; for (var k in objD) { - imgAry[0].getCorners()[i].lat = overlay._map.layerPointToLatLng(objD[k]).lat; - imgAry[0].getCorners()[i].lng = overlay._map.layerPointToLatLng(objD[k]).lng; + imgAry[0]._updateCorner(i, overlay._map.layerPointToLatLng(objD[k])); i += 1; } - window.img._reset(); - - window.img.fire('update'); + imgAry[0].fire('update'); }, + // cannot use the DistortableImageOverlay update corner method for this + // _updateImageCorner: function(img, corner, latlng) { + + // imgAry[0].getCorners()[i].lat = overlay._map.layerPointToLatLng(objD[k]).lat; + // imgAry[0].getCorners()[i].lng = overlay._map.layerPointToLatLng(objD[k]).lng; + // }, + getImages: function() { // this._overlay._map.getPane('overlayPane').children(); var image_array = []; From 310675751959e8800937e12298dc5608ece6756a Mon Sep 17 00:00:00 2001 From: sashadev-sky Date: Mon, 18 Mar 2019 01:17:11 -0400 Subject: [PATCH 12/63] remove test code --- dist/leaflet.distortableimage.js | 31 +++++++------------------------ src/edit/DistortableImage.Edit.js | 31 +++++++------------------------ 2 files changed, 14 insertions(+), 48 deletions(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index d48168992..614083537 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -1115,17 +1115,7 @@ L.DistortableImage.Edit = L.Handler.extend({ _dragStartMultiple: function() { var overlay = this._overlay, map = overlay._map; - - // pass by value alternative for future code refactoring possibility - // overlay._initialCorners = JSON.parse(JSON.stringify(overlay.getCorners())); - - // var obj = {}; - // var marker = L.marker([35.10418, -106.62987]).bindPopup("I am a Marker"); - // var polyline = L.polyline([[35.10418, -106.62987], [35.19738, -106.875], [35.07946, -106.80634]], { color: 'red', weight: 8 }).bindPopup("I am a Polyline"); - // var pointsLayerGroup = L.layerGroup([marker, polyline]).addTo(map); - // this.pointsLayerGroup = L.layerGroup().addTo(map); - // window.pointsLayerGroup = this.pointsLayerGroup; - // window.points2LayerGroup = points2LayerGroup; + overlay._initialCornerPoints = {}; window.obj = {}; @@ -1158,8 +1148,6 @@ L.DistortableImage.Edit = L.Handler.extend({ i += 1; } - // this.pointsLayerGroup.addLayer(overlay); - this.calcCornerChanges(overlay); var objD = this.calcNewCorners(overlay); @@ -1192,27 +1180,22 @@ L.DistortableImage.Edit = L.Handler.extend({ }, // TODO: move to overlay class - _updateCorners: function(objD, overlay) { - window.overlay = overlay; + _updateCorners: function(objD) { + var overlay = this._overlay, + map = overlay._map; + // window.overlay = overlay; var imgAry = this.getImages(); var i = 0; for (var k in objD) { - imgAry[0]._updateCorner(i, overlay._map.layerPointToLatLng(objD[k])); + imgAry[0]._updateCorner(i, map.layerPointToLatLng(objD[k])); i += 1; } imgAry[0].fire('update'); }, - // cannot use the DistortableImageOverlay update corner method for this - // _updateImageCorner: function(img, corner, latlng) { - - // imgAry[0].getCorners()[i].lat = overlay._map.layerPointToLatLng(objD[k]).lat; - // imgAry[0].getCorners()[i].lng = overlay._map.layerPointToLatLng(objD[k]).lng; - // }, - getImages: function() { - // this._overlay._map.getPane('overlayPane').children(); + var image_array = []; window.imagesLayerGroup.eachLayer(function (layer) { diff --git a/src/edit/DistortableImage.Edit.js b/src/edit/DistortableImage.Edit.js index 5b6a07c05..611876506 100644 --- a/src/edit/DistortableImage.Edit.js +++ b/src/edit/DistortableImage.Edit.js @@ -162,17 +162,7 @@ L.DistortableImage.Edit = L.Handler.extend({ _dragStartMultiple: function() { var overlay = this._overlay, map = overlay._map; - - // pass by value alternative for future code refactoring possibility - // overlay._initialCorners = JSON.parse(JSON.stringify(overlay.getCorners())); - - // var obj = {}; - // var marker = L.marker([35.10418, -106.62987]).bindPopup("I am a Marker"); - // var polyline = L.polyline([[35.10418, -106.62987], [35.19738, -106.875], [35.07946, -106.80634]], { color: 'red', weight: 8 }).bindPopup("I am a Polyline"); - // var pointsLayerGroup = L.layerGroup([marker, polyline]).addTo(map); - // this.pointsLayerGroup = L.layerGroup().addTo(map); - // window.pointsLayerGroup = this.pointsLayerGroup; - // window.points2LayerGroup = points2LayerGroup; + overlay._initialCornerPoints = {}; window.obj = {}; @@ -205,8 +195,6 @@ L.DistortableImage.Edit = L.Handler.extend({ i += 1; } - // this.pointsLayerGroup.addLayer(overlay); - this.calcCornerChanges(overlay); var objD = this.calcNewCorners(overlay); @@ -239,27 +227,22 @@ L.DistortableImage.Edit = L.Handler.extend({ }, // TODO: move to overlay class - _updateCorners: function(objD, overlay) { - window.overlay = overlay; + _updateCorners: function(objD) { + var overlay = this._overlay, + map = overlay._map; + // window.overlay = overlay; var imgAry = this.getImages(); var i = 0; for (var k in objD) { - imgAry[0]._updateCorner(i, overlay._map.layerPointToLatLng(objD[k])); + imgAry[0]._updateCorner(i, map.layerPointToLatLng(objD[k])); i += 1; } imgAry[0].fire('update'); }, - // cannot use the DistortableImageOverlay update corner method for this - // _updateImageCorner: function(img, corner, latlng) { - - // imgAry[0].getCorners()[i].lat = overlay._map.layerPointToLatLng(objD[k]).lat; - // imgAry[0].getCorners()[i].lng = overlay._map.layerPointToLatLng(objD[k]).lng; - // }, - getImages: function() { - // this._overlay._map.getPane('overlayPane').children(); + var image_array = []; window.imagesLayerGroup.eachLayer(function (layer) { From e68ffb74b65082f26d6dde5a38d4bdb081d7916e Mon Sep 17 00:00:00 2001 From: sashadev-sky Date: Mon, 18 Mar 2019 02:44:21 -0400 Subject: [PATCH 13/63] refactor out utility functions --- dist/leaflet.distortableimage.js | 71 +++++++++++++++++-------------- src/DistortableImageOverlay.js | 24 ++++++++++- src/edit/DistortableImage.Edit.js | 47 ++++++++------------ 3 files changed, 80 insertions(+), 62 deletions(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index 614083537..c3f57b939 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -554,7 +554,7 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ // this._div = $(this._pane).append($("
")); if (!this._image) { this._initImage(); } if (!this._events) { this._initEvents(); } - + // TODO: delete div child map._panes.overlayPane.appendChild(this._image); if (!this._divNode) { @@ -674,6 +674,28 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ this._reset(); }, + // fires a reset after all corner positions are updated instead of after each one (above). Use for translating + _updateCorners: function (latlngObj) { + var i = 0; + for (var k in latlngObj) { + this._corners[i] = latlngObj[k]; + i += 1; + } + + this._reset(); + }, + + _updateCornersFromPoints: function (pointsObj) { + var map = this._map; + var i = 0; + for (var k in pointsObj) { + this._corners[i] = map.layerPointToLatLng(pointsObj[k]); + i += 1; + } + + this._reset(); + }, + /* Copied from Leaflet v0.7 https://github.com/Leaflet/Leaflet/blob/66282f14bcb180ec87d9818d9f3c9f75afd01b30/src/dom/DomUtil.js#L189-L199 */ /* since L.DomUtil.getTranslateString() is deprecated in Leaflet v1.0 */ _getTranslateString: function (point) { @@ -1115,8 +1137,8 @@ L.DistortableImage.Edit = L.Handler.extend({ _dragStartMultiple: function() { var overlay = this._overlay, map = overlay._map; - - overlay._initialCornerPoints = {}; + + overlay._startCornerPoints = {}; window.obj = {}; @@ -1128,11 +1150,11 @@ L.DistortableImage.Edit = L.Handler.extend({ var i = 0; for (var k in window.obj) { window.obj[k] = map.latLngToLayerPoint(window.img.getCorners()[i]); - overlay._initialCornerPoints[k] = map.latLngToLayerPoint(overlay.getCorners()[i]); + overlay._startCornerPoints[k] = map.latLngToLayerPoint(overlay.getCorners()[i]); i += 1; } - overlay._cornerPointChanges = {}; + overlay._cornerPointDelta = {}; }, @@ -1148,48 +1170,34 @@ L.DistortableImage.Edit = L.Handler.extend({ i += 1; } - this.calcCornerChanges(overlay); + this.calcCornerDelta(overlay); var objD = this.calcNewCorners(overlay); - this._updateCorners(objD, overlay); + this._updateCorners(objD); }, - calcCornerChanges: function(overlay) { - overlay._cornerPointChanges.changes = overlay._initialCornerPoints.initVal.x - overlay._currentCornerPoints.initVal.x; - overlay._cornerPointChanges.changes1 = overlay._initialCornerPoints.initVal.y - overlay._currentCornerPoints.initVal.y; - - overlay._cornerPointChanges.changes2 = overlay._initialCornerPoints.initVal1.x - overlay._currentCornerPoints.initVal1.x; - overlay._cornerPointChanges.changes3 = overlay._initialCornerPoints.initVal1.y - overlay._currentCornerPoints.initVal1.y; - - overlay._cornerPointChanges.changes4 = overlay._initialCornerPoints.initVal2.x - overlay._currentCornerPoints.initVal2.x; - overlay._cornerPointChanges.changes5 = overlay._initialCornerPoints.initVal2.y - overlay._currentCornerPoints.initVal2.y; - - overlay._cornerPointChanges.changes6 = overlay._initialCornerPoints.initVal3.x - overlay._currentCornerPoints.initVal3.x; - overlay._cornerPointChanges.changes7 = overlay._initialCornerPoints.initVal3.y - overlay._currentCornerPoints.initVal3.y; + calcCornerDelta: function(overlay) { + overlay._cornerPointDelta = overlay._startCornerPoints.initVal.subtract(overlay._currentCornerPoints.initVal); }, calcNewCorners: function(overlay) { var objD = {}; - objD.newVal = [window.obj.initVal.x - overlay._cornerPointChanges.changes, window.obj.initVal.y - overlay._cornerPointChanges.changes1]; - objD.newVal1 = [window.obj.initVal1.x - overlay._cornerPointChanges.changes2, window.obj.initVal1.y - overlay._cornerPointChanges.changes3]; - objD.newVal2 = [window.obj.initVal2.x - overlay._cornerPointChanges.changes4, window.obj.initVal2.y - overlay._cornerPointChanges.changes5]; - objD.newVal3 = [window.obj.initVal3.x - overlay._cornerPointChanges.changes6, window.obj.initVal3.y - overlay._cornerPointChanges.changes7]; + // TODO: consider refactoring with transformation + // var transformation = new L.Transformation(1, -overlay._currentPointDelta.x, 1, ) + objD.newVal = window.obj.initVal.subtract(overlay._cornerPointDelta); + objD.newVal1 = window.obj.initVal1.subtract(overlay._cornerPointDelta); + objD.newVal2 = window.obj.initVal2.subtract(overlay._cornerPointDelta); + objD.newVal3 = window.obj.initVal3.subtract(overlay._cornerPointDelta); return objD; }, // TODO: move to overlay class _updateCorners: function(objD) { - var overlay = this._overlay, - map = overlay._map; - // window.overlay = overlay; var imgAry = this.getImages(); - var i = 0; - for (var k in objD) { - imgAry[0]._updateCorner(i, map.layerPointToLatLng(objD[k])); - i += 1; - } + + imgAry[0]._updateCornersFromPoints(objD); imgAry[0].fire('update'); }, @@ -1203,6 +1211,7 @@ L.DistortableImage.Edit = L.Handler.extend({ }); return image_array; + // TODO: polyline for selection so that it doesn't get distorted // this._polyline = L.polyline(polyline_array); // this._overlay._map.eachLayer(function (layer) { // if layer diff --git a/src/DistortableImageOverlay.js b/src/DistortableImageOverlay.js index d330238ee..b47b97a51 100644 --- a/src/DistortableImageOverlay.js +++ b/src/DistortableImageOverlay.js @@ -22,7 +22,7 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ // this._div = $(this._pane).append($("
")); if (!this._image) { this._initImage(); } if (!this._events) { this._initEvents(); } - + // TODO: delete div child map._panes.overlayPane.appendChild(this._image); if (!this._divNode) { @@ -142,6 +142,28 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ this._reset(); }, + // fires a reset after all corner positions are updated instead of after each one (above). Use for translating + _updateCorners: function (latlngObj) { + var i = 0; + for (var k in latlngObj) { + this._corners[i] = latlngObj[k]; + i += 1; + } + + this._reset(); + }, + + _updateCornersFromPoints: function (pointsObj) { + var map = this._map; + var i = 0; + for (var k in pointsObj) { + this._corners[i] = map.layerPointToLatLng(pointsObj[k]); + i += 1; + } + + this._reset(); + }, + /* Copied from Leaflet v0.7 https://github.com/Leaflet/Leaflet/blob/66282f14bcb180ec87d9818d9f3c9f75afd01b30/src/dom/DomUtil.js#L189-L199 */ /* since L.DomUtil.getTranslateString() is deprecated in Leaflet v1.0 */ _getTranslateString: function (point) { diff --git a/src/edit/DistortableImage.Edit.js b/src/edit/DistortableImage.Edit.js index 611876506..937a4219a 100644 --- a/src/edit/DistortableImage.Edit.js +++ b/src/edit/DistortableImage.Edit.js @@ -162,8 +162,8 @@ L.DistortableImage.Edit = L.Handler.extend({ _dragStartMultiple: function() { var overlay = this._overlay, map = overlay._map; - - overlay._initialCornerPoints = {}; + + overlay._startCornerPoints = {}; window.obj = {}; @@ -175,11 +175,11 @@ L.DistortableImage.Edit = L.Handler.extend({ var i = 0; for (var k in window.obj) { window.obj[k] = map.latLngToLayerPoint(window.img.getCorners()[i]); - overlay._initialCornerPoints[k] = map.latLngToLayerPoint(overlay.getCorners()[i]); + overlay._startCornerPoints[k] = map.latLngToLayerPoint(overlay.getCorners()[i]); i += 1; } - overlay._cornerPointChanges = {}; + overlay._cornerPointDelta = {}; }, @@ -195,48 +195,34 @@ L.DistortableImage.Edit = L.Handler.extend({ i += 1; } - this.calcCornerChanges(overlay); + this.calcCornerDelta(overlay); var objD = this.calcNewCorners(overlay); - this._updateCorners(objD, overlay); + this._updateCorners(objD); }, - calcCornerChanges: function(overlay) { - overlay._cornerPointChanges.changes = overlay._initialCornerPoints.initVal.x - overlay._currentCornerPoints.initVal.x; - overlay._cornerPointChanges.changes1 = overlay._initialCornerPoints.initVal.y - overlay._currentCornerPoints.initVal.y; - - overlay._cornerPointChanges.changes2 = overlay._initialCornerPoints.initVal1.x - overlay._currentCornerPoints.initVal1.x; - overlay._cornerPointChanges.changes3 = overlay._initialCornerPoints.initVal1.y - overlay._currentCornerPoints.initVal1.y; - - overlay._cornerPointChanges.changes4 = overlay._initialCornerPoints.initVal2.x - overlay._currentCornerPoints.initVal2.x; - overlay._cornerPointChanges.changes5 = overlay._initialCornerPoints.initVal2.y - overlay._currentCornerPoints.initVal2.y; - - overlay._cornerPointChanges.changes6 = overlay._initialCornerPoints.initVal3.x - overlay._currentCornerPoints.initVal3.x; - overlay._cornerPointChanges.changes7 = overlay._initialCornerPoints.initVal3.y - overlay._currentCornerPoints.initVal3.y; + calcCornerDelta: function(overlay) { + overlay._cornerPointDelta = overlay._startCornerPoints.initVal.subtract(overlay._currentCornerPoints.initVal); }, calcNewCorners: function(overlay) { var objD = {}; - objD.newVal = [window.obj.initVal.x - overlay._cornerPointChanges.changes, window.obj.initVal.y - overlay._cornerPointChanges.changes1]; - objD.newVal1 = [window.obj.initVal1.x - overlay._cornerPointChanges.changes2, window.obj.initVal1.y - overlay._cornerPointChanges.changes3]; - objD.newVal2 = [window.obj.initVal2.x - overlay._cornerPointChanges.changes4, window.obj.initVal2.y - overlay._cornerPointChanges.changes5]; - objD.newVal3 = [window.obj.initVal3.x - overlay._cornerPointChanges.changes6, window.obj.initVal3.y - overlay._cornerPointChanges.changes7]; + // TODO: consider refactoring with transformation + // var transformation = new L.Transformation(1, -overlay._currentPointDelta.x, 1, ) + objD.newVal = window.obj.initVal.subtract(overlay._cornerPointDelta); + objD.newVal1 = window.obj.initVal1.subtract(overlay._cornerPointDelta); + objD.newVal2 = window.obj.initVal2.subtract(overlay._cornerPointDelta); + objD.newVal3 = window.obj.initVal3.subtract(overlay._cornerPointDelta); return objD; }, // TODO: move to overlay class _updateCorners: function(objD) { - var overlay = this._overlay, - map = overlay._map; - // window.overlay = overlay; var imgAry = this.getImages(); - var i = 0; - for (var k in objD) { - imgAry[0]._updateCorner(i, map.layerPointToLatLng(objD[k])); - i += 1; - } + + imgAry[0]._updateCornersFromPoints(objD); imgAry[0].fire('update'); }, @@ -250,6 +236,7 @@ L.DistortableImage.Edit = L.Handler.extend({ }); return image_array; + // TODO: polyline for selection so that it doesn't get distorted // this._polyline = L.polyline(polyline_array); // this._overlay._map.eachLayer(function (layer) { // if layer From 47ca7198d125b5db1dd9efc072d746a95e6f3d14 Mon Sep 17 00:00:00 2001 From: sashadev-sky Date: Mon, 18 Mar 2019 06:02:45 -0400 Subject: [PATCH 14/63] Feature Group Implementation --- dist/leaflet.distortableimage.js | 62 +++++++++++++++++++++---------- examples/select.html | 24 +----------- src/edit/DistortableImage.Edit.js | 62 +++++++++++++++++++++---------- 3 files changed, 88 insertions(+), 60 deletions(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index c3f57b939..87b05c780 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -1062,7 +1062,7 @@ L.DistortableImage.Edit = L.Handler.extend({ //overlay.on('click', this._showToolbar, this); L.DomEvent.on(overlay._image, 'click', this._showToolbar, this); - L.DomEvent.on(overlay._image, 'mousedown', this._showSelected, this); + L.DomEvent.on(overlay._image, 'mousedown', this._toggleSelections, this); /* Enable hotkeys. */ L.DomEvent.on(window, 'keydown', this._onKeyDown, this); @@ -1073,6 +1073,7 @@ L.DistortableImage.Edit = L.Handler.extend({ /* Run on image deselection. */ removeHooks: function() { + var overlay = this._overlay, map = overlay._map; @@ -1135,6 +1136,8 @@ L.DistortableImage.Edit = L.Handler.extend({ // drag events for multiple images are separated out from enableDragging initialization -- two different concepts _dragStartMultiple: function() { + if (!L.DomUtil.hasClass(this._overlay._image, 'selected')) { return; } + if (this._getImages().length <= 1) { return; } var overlay = this._overlay, map = overlay._map; @@ -1159,6 +1162,8 @@ L.DistortableImage.Edit = L.Handler.extend({ }, _dragMultiple: function() { + if (!L.DomUtil.hasClass(this._overlay._image, 'selected')) { return; } + if (this._getImages().length <= 1) { return; } var overlay = this._overlay, map = overlay._map; @@ -1170,43 +1175,42 @@ L.DistortableImage.Edit = L.Handler.extend({ i += 1; } - this.calcCornerDelta(overlay); + var cornerPointDelta = this.calcCornerDelta(overlay); - var objD = this.calcNewCorners(overlay); + var objD = this.calcNewCorners(cornerPointDelta); this._updateCorners(objD); }, calcCornerDelta: function(overlay) { - overlay._cornerPointDelta = overlay._startCornerPoints.initVal.subtract(overlay._currentCornerPoints.initVal); + return overlay._startCornerPoints.initVal.subtract(overlay._currentCornerPoints.initVal); }, - calcNewCorners: function(overlay) { + calcNewCorners: function(cornerPointDelta) { var objD = {}; - // TODO: consider refactoring with transformation - // var transformation = new L.Transformation(1, -overlay._currentPointDelta.x, 1, ) - objD.newVal = window.obj.initVal.subtract(overlay._cornerPointDelta); - objD.newVal1 = window.obj.initVal1.subtract(overlay._cornerPointDelta); - objD.newVal2 = window.obj.initVal2.subtract(overlay._cornerPointDelta); - objD.newVal3 = window.obj.initVal3.subtract(overlay._cornerPointDelta); + var transformation = new L.Transformation(1, -cornerPointDelta.x, 1, -cornerPointDelta.y); + objD.newVal = transformation.transform(window.obj.initVal); + objD.newVal1 = transformation.transform(window.obj.initVal1); + objD.newVal2 = transformation.transform(window.obj.initVal2); + objD.newVal3 = transformation.transform(window.obj.initVal3); return objD; }, // TODO: move to overlay class _updateCorners: function(objD) { - var imgAry = this.getImages(); + var imgAry = this._getImages(); imgAry[0]._updateCornersFromPoints(objD); imgAry[0].fire('update'); }, - getImages: function() { + _getImages: function() { var image_array = []; - window.imagesLayerGroup.eachLayer(function (layer) { + window.imagesFeatureGroup.eachLayer(function (layer) { image_array.push(layer); }); @@ -1353,10 +1357,11 @@ L.DistortableImage.Edit = L.Handler.extend({ this.toolbar = false; } }, - + + // TODO: toolbar for multiple image selection _showToolbar: function(event) { var overlay = this._overlay, - target = event.target, + target = event.target, map = overlay._map; /* Ensure that there is only ever one toolbar attached to each image. */ @@ -1373,15 +1378,34 @@ L.DistortableImage.Edit = L.Handler.extend({ L.DomEvent.stopPropagation(event); }, - - _showSelected: function(event) { + + _toggleSelections: function(event) { + var overlay = this._overlay, + target = event.target, + // image = overlay._image, + map = overlay._map; + if (event.metaKey || event.ctrlKey) { - $(event.target).toggleClass('selected'); + $(target).toggleClass('selected'); } + + if (L.DomUtil.hasClass(target, 'selected') && !window.imagesFeatureGroup.hasLayer) { + window.imagesFeatureGroup.addLayer(overlay); + } else { + window.imagesFeatureGroup.removeLayer(overlay); + window.overlay = overlay; + overlay.addTo(map); + overlay.editing.enable(); + overlay._reset(); + overlay.fire('update'); + // this.fire('update'); + } + }, _removeSelections: function() { $('.selected').removeClass('selected'); + this._hideToolbar(); }, _removeOverlay: function () { diff --git a/examples/select.html b/examples/select.html index 80a62078b..cfbbe1e56 100644 --- a/examples/select.html +++ b/examples/select.html @@ -95,34 +95,14 @@ } ).addTo(map); - var imagesLayerGroup = L.layerGroup([img, img2]).addTo(map); - window.imagesLayerGroup = imagesLayerGroup; + var imagesFeatureGroup = L.featureGroup().addTo(map); + window.imagesFeatureGroup = imagesFeatureGroup; images.push(img2); window.img = img; window.img2 = img2; - // var bounds2 = new L.LatLngBounds(new L.LatLng(51.40, -0.10), new L.LatLng(51.55, -0.15)); - // var div = document.createElement("div"); - // div.id = "fooo"; - // div.style.background = "rgba(255,255,255,0.5)"; - // div.innerHTML = "

This is a div element

in an element overlay"; - // layer2 = L.elementOverlay( - // div, { - // corners: [ - // new L.latLng(51.40, -0.10), - // new L.latLng(51.40, -0.15), - // new L.latLng(51.47, -0.11), - // new L.latLng(51.47, -0.16) - // ], - // } - // ).addTo(map); - // images.push(layer2); - // window.layer2 = layer2; - - // L.DomEvent.on(img._image, 'load', img.editing.enable, img.editing); - // L.DomEvent.on(img2._image, 'load', img2.editing.enable, img2.editing); // L.DomEvent.on(img2._image, 'click', select, img2); // map.on('click', function () { diff --git a/src/edit/DistortableImage.Edit.js b/src/edit/DistortableImage.Edit.js index 937a4219a..35c060303 100644 --- a/src/edit/DistortableImage.Edit.js +++ b/src/edit/DistortableImage.Edit.js @@ -87,7 +87,7 @@ L.DistortableImage.Edit = L.Handler.extend({ //overlay.on('click', this._showToolbar, this); L.DomEvent.on(overlay._image, 'click', this._showToolbar, this); - L.DomEvent.on(overlay._image, 'mousedown', this._showSelected, this); + L.DomEvent.on(overlay._image, 'mousedown', this._toggleSelections, this); /* Enable hotkeys. */ L.DomEvent.on(window, 'keydown', this._onKeyDown, this); @@ -98,6 +98,7 @@ L.DistortableImage.Edit = L.Handler.extend({ /* Run on image deselection. */ removeHooks: function() { + var overlay = this._overlay, map = overlay._map; @@ -160,6 +161,8 @@ L.DistortableImage.Edit = L.Handler.extend({ // drag events for multiple images are separated out from enableDragging initialization -- two different concepts _dragStartMultiple: function() { + if (!L.DomUtil.hasClass(this._overlay._image, 'selected')) { return; } + if (this._getImages().length <= 1) { return; } var overlay = this._overlay, map = overlay._map; @@ -184,6 +187,8 @@ L.DistortableImage.Edit = L.Handler.extend({ }, _dragMultiple: function() { + if (!L.DomUtil.hasClass(this._overlay._image, 'selected')) { return; } + if (this._getImages().length <= 1) { return; } var overlay = this._overlay, map = overlay._map; @@ -195,43 +200,42 @@ L.DistortableImage.Edit = L.Handler.extend({ i += 1; } - this.calcCornerDelta(overlay); + var cornerPointDelta = this.calcCornerDelta(overlay); - var objD = this.calcNewCorners(overlay); + var objD = this.calcNewCorners(cornerPointDelta); this._updateCorners(objD); }, calcCornerDelta: function(overlay) { - overlay._cornerPointDelta = overlay._startCornerPoints.initVal.subtract(overlay._currentCornerPoints.initVal); + return overlay._startCornerPoints.initVal.subtract(overlay._currentCornerPoints.initVal); }, - calcNewCorners: function(overlay) { + calcNewCorners: function(cornerPointDelta) { var objD = {}; - // TODO: consider refactoring with transformation - // var transformation = new L.Transformation(1, -overlay._currentPointDelta.x, 1, ) - objD.newVal = window.obj.initVal.subtract(overlay._cornerPointDelta); - objD.newVal1 = window.obj.initVal1.subtract(overlay._cornerPointDelta); - objD.newVal2 = window.obj.initVal2.subtract(overlay._cornerPointDelta); - objD.newVal3 = window.obj.initVal3.subtract(overlay._cornerPointDelta); + var transformation = new L.Transformation(1, -cornerPointDelta.x, 1, -cornerPointDelta.y); + objD.newVal = transformation.transform(window.obj.initVal); + objD.newVal1 = transformation.transform(window.obj.initVal1); + objD.newVal2 = transformation.transform(window.obj.initVal2); + objD.newVal3 = transformation.transform(window.obj.initVal3); return objD; }, // TODO: move to overlay class _updateCorners: function(objD) { - var imgAry = this.getImages(); + var imgAry = this._getImages(); imgAry[0]._updateCornersFromPoints(objD); imgAry[0].fire('update'); }, - getImages: function() { + _getImages: function() { var image_array = []; - window.imagesLayerGroup.eachLayer(function (layer) { + window.imagesFeatureGroup.eachLayer(function (layer) { image_array.push(layer); }); @@ -378,10 +382,11 @@ L.DistortableImage.Edit = L.Handler.extend({ this.toolbar = false; } }, - + + // TODO: toolbar for multiple image selection _showToolbar: function(event) { var overlay = this._overlay, - target = event.target, + target = event.target, map = overlay._map; /* Ensure that there is only ever one toolbar attached to each image. */ @@ -398,15 +403,34 @@ L.DistortableImage.Edit = L.Handler.extend({ L.DomEvent.stopPropagation(event); }, - - _showSelected: function(event) { + + _toggleSelections: function(event) { + var overlay = this._overlay, + target = event.target, + // image = overlay._image, + map = overlay._map; + if (event.metaKey || event.ctrlKey) { - $(event.target).toggleClass('selected'); + $(target).toggleClass('selected'); } + + if (L.DomUtil.hasClass(target, 'selected') && !window.imagesFeatureGroup.hasLayer) { + window.imagesFeatureGroup.addLayer(overlay); + } else { + window.imagesFeatureGroup.removeLayer(overlay); + window.overlay = overlay; + overlay.addTo(map); + overlay.editing.enable(); + overlay._reset(); + overlay.fire('update'); + // this.fire('update'); + } + }, _removeSelections: function() { $('.selected').removeClass('selected'); + this._hideToolbar(); }, _removeOverlay: function () { From 4e57a0f8f4065e75758c28df1d571d3448a58605 Mon Sep 17 00:00:00 2001 From: sashadev-sky Date: Mon, 18 Mar 2019 06:04:28 -0400 Subject: [PATCH 15/63] Commit dist file --- dist/leaflet.distortableimage.js | 7 ------- 1 file changed, 7 deletions(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index 87b05c780..d780d4879 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -1520,13 +1520,6 @@ L.DistortableImageOverlay.addInitHook(function() { }); }); - -// L.DistortableImages.Edit = L.DistortableImage.Edit.extend({ -// // initialize: function (overlay) { -// // L.DistortableImage.Edit.prototype.initialize.call(this, latlng, markerOptions); -// // } - -// }); L.Map.mergeOptions({ boxSelector: true, boxZoom: false }); L.Map.BoxSelectHandle = L.Map.BoxZoom.extend({ From 5d3e3ce618d6b477f39853288261cf72784e5c2a Mon Sep 17 00:00:00 2001 From: sashadev-sky Date: Mon, 18 Mar 2019 06:10:21 -0400 Subject: [PATCH 16/63] remove migrated code --- examples/select.html | 86 -------------------------------------------- 1 file changed, 86 deletions(-) diff --git a/examples/select.html b/examples/select.html index cfbbe1e56..cc15a0e1a 100644 --- a/examples/select.html +++ b/examples/select.html @@ -105,92 +105,6 @@ // L.DomEvent.on(img2._image, 'click', select, img2); - // map.on('click', function () { - // $('.selected').removeClass('selected'); - // }); - - // L.DomEvent.on(img._image, 'mousedown', function (e) { - // if (e.metaKey || e.ctrlKey) - // $(e.target).toggleClass('selected'); - // }); - - // L.DomEvent.on(img2._image, 'mousedown', function (e) { - // if (e.metaKey || e.ctrlKey) - // $(e.target).toggleClass('selected'); - // }); - - // img2 is on the left (or initially bottom) img is on the right - - // let obj = {}; - // let objC = {}; - // let obj2 = {}; - // let objD = {}; - - // obj.initVal = 0; - // obj.initVal1 = 0; - // obj.initVal2 = 0; - // obj.initVal3 = 0; - - // obj2.initVal = 0; - // obj2.initVal1 = 0; - // obj2.initVal2 = 0; - // obj2.initVal3 = 0; - - - // L.DomEvent.on(img, 'dragstart', function (e) { - // //this.initialCorner = - // //console.log('dragstart initial lat: ', img._corners[0].lat); - // let i = 0 - // for (let k in obj) { - // obj[k] = map.latLngToLayerPoint(img.getCorners()[i]); - // obj2[k] = map.latLngToLayerPoint(img2.getCorners()[i]); - // i += 1; - // } - // console.log('Initial: ', obj); - // window.obj = obj; - - // }); - - // L.DomEvent.on(img, 'drag', function (e) { - // //console.log('dragging changing lat: ', img._corners[0].lat); - // objC.changes = obj.initVal.x - map.latLngToLayerPoint(img.getCorners()[0]).x; - // objC.changes1 = obj.initVal.y - map.latLngToLayerPoint(img.getCorners()[0]).y; - - // objC.changes2 = obj.initVal1.x - map.latLngToLayerPoint(img.getCorners()[1]).x; - // objC.changes3 = obj.initVal1.y - map.latLngToLayerPoint(img.getCorners()[1]).y; - - // objC.changes4 = obj.initVal2.x - map.latLngToLayerPoint(img.getCorners()[2]).x; - // objC.changes5 = obj.initVal2.y - map.latLngToLayerPoint(img.getCorners()[2]).y; - - // objC.changes6 = obj.initVal3.x - map.latLngToLayerPoint(img.getCorners()[3]).x; - // objC.changes7 = obj.initVal3.y - map.latLngToLayerPoint(img.getCorners()[3]).y; - - // window.objC = objC; - // console.log('Changes: ', objC); - - - // objD.newVal = L.point([obj2.initVal.x - objC.changes, obj2.initVal.y - objC.changes1]); - // objD.newVal1 = L.point([obj2.initVal1.x - objC.changes2, obj2.initVal1.y - objC.changes3]); - // objD.newVal2 = L.point([obj2.initVal2.x - objC.changes4, obj2.initVal2.y - objC.changes5]); - // objD.newVal3 = L.point([obj2.initVal3.x - objC.changes6, obj2.initVal3.y - objC.changes7]); - - // let i = 0; - // for (let k in objD) { - // img2.getCorners()[i].lat = map.layerPointToLatLng(objD[k]).lat; - // img2.getCorners()[i].lng = map.layerPointToLatLng(objD[k]).lng; - // i += 1; - // } - - // console.log('New: ', obj2); - // window.obj2 = obj2; - - // img2._reset(); - - // img2.fire('update'); - // map.fire('update'); - - // }); - L.DomEvent.on(img._image, 'load', img.editing.enable, img.editing); L.DomEvent.on(img2._image, 'load', img2.editing.enable, img2.editing); // L.DomEvent.on(layer2._image, 'load', layer2.editing.enable, layer2.editing); From c4505a1d9568c0ddb6efdbe35aa4b1c8914d8cb6 Mon Sep 17 00:00:00 2001 From: sashadev-sky Date: Mon, 18 Mar 2019 06:24:07 -0400 Subject: [PATCH 17/63] Use getLayers instead of eachLayer --- dist/leaflet.distortableimage.js | 20 ++++++-------------- src/edit/DistortableImage.Edit.js | 20 ++++++-------------- 2 files changed, 12 insertions(+), 28 deletions(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index d780d4879..f6d0262d0 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -1197,7 +1197,7 @@ L.DistortableImage.Edit = L.Handler.extend({ return objD; }, - // TODO: move to overlay class + // TODO: rename so not the same overlay class method _updateCorners: function(objD) { var imgAry = this._getImages(); @@ -1208,13 +1208,8 @@ L.DistortableImage.Edit = L.Handler.extend({ _getImages: function() { - var image_array = []; - - window.imagesFeatureGroup.eachLayer(function (layer) { - image_array.push(layer); - }); - - return image_array; + return window.imagesFeatureGroup.getLayers(); + // TODO: polyline for selection so that it doesn't get distorted // this._polyline = L.polyline(polyline_array); // this._overlay._map.eachLayer(function (layer) { @@ -1382,25 +1377,22 @@ L.DistortableImage.Edit = L.Handler.extend({ _toggleSelections: function(event) { var overlay = this._overlay, target = event.target, - // image = overlay._image, map = overlay._map; if (event.metaKey || event.ctrlKey) { $(target).toggleClass('selected'); } - if (L.DomUtil.hasClass(target, 'selected') && !window.imagesFeatureGroup.hasLayer) { + if (L.DomUtil.hasClass(target, 'selected')) { window.imagesFeatureGroup.addLayer(overlay); } else { window.imagesFeatureGroup.removeLayer(overlay); window.overlay = overlay; overlay.addTo(map); overlay.editing.enable(); - overlay._reset(); - overlay.fire('update'); - // this.fire('update'); + // overlay._reset(); + // overlay.fire('update'); } - }, _removeSelections: function() { diff --git a/src/edit/DistortableImage.Edit.js b/src/edit/DistortableImage.Edit.js index 35c060303..d7d25d31b 100644 --- a/src/edit/DistortableImage.Edit.js +++ b/src/edit/DistortableImage.Edit.js @@ -222,7 +222,7 @@ L.DistortableImage.Edit = L.Handler.extend({ return objD; }, - // TODO: move to overlay class + // TODO: rename so not the same overlay class method _updateCorners: function(objD) { var imgAry = this._getImages(); @@ -233,13 +233,8 @@ L.DistortableImage.Edit = L.Handler.extend({ _getImages: function() { - var image_array = []; - - window.imagesFeatureGroup.eachLayer(function (layer) { - image_array.push(layer); - }); - - return image_array; + return window.imagesFeatureGroup.getLayers(); + // TODO: polyline for selection so that it doesn't get distorted // this._polyline = L.polyline(polyline_array); // this._overlay._map.eachLayer(function (layer) { @@ -407,25 +402,22 @@ L.DistortableImage.Edit = L.Handler.extend({ _toggleSelections: function(event) { var overlay = this._overlay, target = event.target, - // image = overlay._image, map = overlay._map; if (event.metaKey || event.ctrlKey) { $(target).toggleClass('selected'); } - if (L.DomUtil.hasClass(target, 'selected') && !window.imagesFeatureGroup.hasLayer) { + if (L.DomUtil.hasClass(target, 'selected')) { window.imagesFeatureGroup.addLayer(overlay); } else { window.imagesFeatureGroup.removeLayer(overlay); window.overlay = overlay; overlay.addTo(map); overlay.editing.enable(); - overlay._reset(); - overlay.fire('update'); - // this.fire('update'); + // overlay._reset(); + // overlay.fire('update'); } - }, _removeSelections: function() { From 13440704cd72dcd45871cd09d2db2b36c30979aa Mon Sep 17 00:00:00 2001 From: sashadev-sky Date: Mon, 18 Mar 2019 07:33:29 -0400 Subject: [PATCH 18/63] Deselect all images on map click --- dist/leaflet.distortableimage.js | 45 ++++++++++++++++++++----------- examples/select.html | 13 --------- src/DistortableImageOverlay.js | 15 ++++++----- src/edit/DistortableImage.Edit.js | 30 ++++++++++++++------- 4 files changed, 58 insertions(+), 45 deletions(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index f6d0262d0..4a40e996b 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -554,15 +554,16 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ // this._div = $(this._pane).append($("
")); if (!this._image) { this._initImage(); } if (!this._events) { this._initEvents(); } - // TODO: delete div child + map._panes.overlayPane.appendChild(this._image); - if (!this._divNode) { - this._divNode = document.createElement("div"); - // this._divNode = divNode; - this._divNode.setAttribute("id", "holding"); - map._panes.overlayPane.appendChild(this._divNode); - } + // TODO: remove completely + // if (!this._divNode) { + // this._divNode = document.createElement("div"); + // // this._divNode = divNode; + // this._divNode.setAttribute("id", "holding"); + // map._panes.overlayPane.appendChild(this._divNode); + // } map.on('viewreset', this._reset, this); /* End copied from L.ImageOverlay */ @@ -1136,11 +1137,12 @@ L.DistortableImage.Edit = L.Handler.extend({ // drag events for multiple images are separated out from enableDragging initialization -- two different concepts _dragStartMultiple: function() { - if (!L.DomUtil.hasClass(this._overlay._image, 'selected')) { return; } - if (this._getImages().length <= 1) { return; } var overlay = this._overlay, map = overlay._map; + if (!L.DomUtil.hasClass(overlay.getElement(), 'selected')) { return; } + if (this._getSelectedImages().length <= 1) { return; } + overlay._startCornerPoints = {}; window.obj = {}; @@ -1162,11 +1164,12 @@ L.DistortableImage.Edit = L.Handler.extend({ }, _dragMultiple: function() { - if (!L.DomUtil.hasClass(this._overlay._image, 'selected')) { return; } - if (this._getImages().length <= 1) { return; } var overlay = this._overlay, map = overlay._map; + if (!L.DomUtil.hasClass(overlay.getElement(), 'selected')) { return; } + if (this._getSelectedImages().length <= 1) { return; } + overlay._currentCornerPoints = {}; var i = 0; @@ -1199,14 +1202,14 @@ L.DistortableImage.Edit = L.Handler.extend({ // TODO: rename so not the same overlay class method _updateCorners: function(objD) { - var imgAry = this._getImages(); + var imgAry = this._getSelectedImages(); imgAry[0]._updateCornersFromPoints(objD); imgAry[0].fire('update'); }, - _getImages: function() { + _getSelectedImages: function() { return window.imagesFeatureGroup.getLayers(); @@ -1380,6 +1383,7 @@ L.DistortableImage.Edit = L.Handler.extend({ map = overlay._map; if (event.metaKey || event.ctrlKey) { + // TODO: make a toggleClass DOM Util method $(target).toggleClass('selected'); } @@ -1387,16 +1391,25 @@ L.DistortableImage.Edit = L.Handler.extend({ window.imagesFeatureGroup.addLayer(overlay); } else { window.imagesFeatureGroup.removeLayer(overlay); - window.overlay = overlay; + // window.overlay = overlay; overlay.addTo(map); overlay.editing.enable(); // overlay._reset(); // overlay.fire('update'); } }, - + // TODO: move this and similar collection methods into separate class? _removeSelections: function() { - $('.selected').removeClass('selected'); + var overlay = this._overlay, + map = overlay._map; + + window.imagesFeatureGroup.eachLayer(function(layer) { + L.DomUtil.removeClass(layer.getElement(), 'selected'); + window.imagesFeatureGroup.removeLayer(layer); + layer.addTo(map); + layer.editing.enable(); + }); + // $('.selected').removeClass('selected'); this._hideToolbar(); }, diff --git a/examples/select.html b/examples/select.html index cc15a0e1a..b253901f4 100644 --- a/examples/select.html +++ b/examples/select.html @@ -109,19 +109,6 @@ L.DomEvent.on(img2._image, 'load', img2.editing.enable, img2.editing); // L.DomEvent.on(layer2._image, 'load', layer2.editing.enable, layer2.editing); - // this doesn't work -- it triggers when clicking toolbar - // can we stopPropagation of toolbar clicks? is that impolite. - map.on('mousedown', function() { - for (var i in images) { - /* Deselect (disable) all images */ - //images[i].editing.disable() - /* Remove toolbars */ - if (images[i].editing.toolbar) { - //map.removeLayer(images[i].editing.toolbar); - } - } - }); - })(); diff --git a/src/DistortableImageOverlay.js b/src/DistortableImageOverlay.js index b47b97a51..7c6a09bb8 100644 --- a/src/DistortableImageOverlay.js +++ b/src/DistortableImageOverlay.js @@ -22,15 +22,16 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ // this._div = $(this._pane).append($("
")); if (!this._image) { this._initImage(); } if (!this._events) { this._initEvents(); } - // TODO: delete div child + map._panes.overlayPane.appendChild(this._image); - if (!this._divNode) { - this._divNode = document.createElement("div"); - // this._divNode = divNode; - this._divNode.setAttribute("id", "holding"); - map._panes.overlayPane.appendChild(this._divNode); - } + // TODO: remove completely + // if (!this._divNode) { + // this._divNode = document.createElement("div"); + // // this._divNode = divNode; + // this._divNode.setAttribute("id", "holding"); + // map._panes.overlayPane.appendChild(this._divNode); + // } map.on('viewreset', this._reset, this); /* End copied from L.ImageOverlay */ diff --git a/src/edit/DistortableImage.Edit.js b/src/edit/DistortableImage.Edit.js index d7d25d31b..c9a5fdfd7 100644 --- a/src/edit/DistortableImage.Edit.js +++ b/src/edit/DistortableImage.Edit.js @@ -161,11 +161,12 @@ L.DistortableImage.Edit = L.Handler.extend({ // drag events for multiple images are separated out from enableDragging initialization -- two different concepts _dragStartMultiple: function() { - if (!L.DomUtil.hasClass(this._overlay._image, 'selected')) { return; } - if (this._getImages().length <= 1) { return; } var overlay = this._overlay, map = overlay._map; + if (!L.DomUtil.hasClass(overlay.getElement(), 'selected')) { return; } + if (this._getSelectedImages().length <= 1) { return; } + overlay._startCornerPoints = {}; window.obj = {}; @@ -187,11 +188,12 @@ L.DistortableImage.Edit = L.Handler.extend({ }, _dragMultiple: function() { - if (!L.DomUtil.hasClass(this._overlay._image, 'selected')) { return; } - if (this._getImages().length <= 1) { return; } var overlay = this._overlay, map = overlay._map; + if (!L.DomUtil.hasClass(overlay.getElement(), 'selected')) { return; } + if (this._getSelectedImages().length <= 1) { return; } + overlay._currentCornerPoints = {}; var i = 0; @@ -224,14 +226,14 @@ L.DistortableImage.Edit = L.Handler.extend({ // TODO: rename so not the same overlay class method _updateCorners: function(objD) { - var imgAry = this._getImages(); + var imgAry = this._getSelectedImages(); imgAry[0]._updateCornersFromPoints(objD); imgAry[0].fire('update'); }, - _getImages: function() { + _getSelectedImages: function() { return window.imagesFeatureGroup.getLayers(); @@ -405,6 +407,7 @@ L.DistortableImage.Edit = L.Handler.extend({ map = overlay._map; if (event.metaKey || event.ctrlKey) { + // TODO: make a toggleClass DOM Util method $(target).toggleClass('selected'); } @@ -412,16 +415,25 @@ L.DistortableImage.Edit = L.Handler.extend({ window.imagesFeatureGroup.addLayer(overlay); } else { window.imagesFeatureGroup.removeLayer(overlay); - window.overlay = overlay; + // window.overlay = overlay; overlay.addTo(map); overlay.editing.enable(); // overlay._reset(); // overlay.fire('update'); } }, - + // TODO: move this and similar collection methods into separate class? _removeSelections: function() { - $('.selected').removeClass('selected'); + var overlay = this._overlay, + map = overlay._map; + + window.imagesFeatureGroup.eachLayer(function(layer) { + L.DomUtil.removeClass(layer.getElement(), 'selected'); + window.imagesFeatureGroup.removeLayer(layer); + layer.addTo(map); + layer.editing.enable(); + }); + // $('.selected').removeClass('selected'); this._hideToolbar(); }, From ab59ecea59ecb8cd9c5827e7d593953e80ba0a35 Mon Sep 17 00:00:00 2001 From: sashadev-sky Date: Mon, 18 Mar 2019 20:38:33 -0400 Subject: [PATCH 19/63] Remove hardcoding -- now works with any number of selected images --- dist/leaflet.distortableimage.js | 91 +++++++++++++++++-------------- src/edit/DistortableImage.Edit.js | 91 +++++++++++++++++-------------- 2 files changed, 102 insertions(+), 80 deletions(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index 4a40e996b..e0bf382d0 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -999,6 +999,7 @@ L.DistortableImage.Edit = L.Handler.extend({ initialize: function(overlay) { this._overlay = overlay; + this._overlay._dragStartPoints = { 0: 0, 1: 0, 2: 0, 3: 0 }; this._toggledImage = false; /* Interaction modes. */ @@ -1137,27 +1138,19 @@ L.DistortableImage.Edit = L.Handler.extend({ // drag events for multiple images are separated out from enableDragging initialization -- two different concepts _dragStartMultiple: function() { - var overlay = this._overlay, - map = overlay._map; + var overlay = this._overlay; if (!L.DomUtil.hasClass(overlay.getElement(), 'selected')) { return; } if (this._getSelectedImages().length <= 1) { return; } - overlay._startCornerPoints = {}; - - window.obj = {}; - - window.obj.initVal = 0; - window.obj.initVal1 = 0; - window.obj.initVal2 = 0; - window.obj.initVal3 = 0; - - var i = 0; - for (var k in window.obj) { - window.obj[k] = map.latLngToLayerPoint(window.img.getCorners()[i]); - overlay._startCornerPoints[k] = map.latLngToLayerPoint(overlay.getCorners()[i]); - i += 1; - } + window.overlay = overlay; + + var i; + window.imagesFeatureGroup.eachLayer(function (layer) { + for (i = 0; i < 4; i++) { + layer._dragStartPoints[i] = layer._map.latLngToLayerPoint(layer.getCorners()[i]); + } + }); overlay._cornerPointDelta = {}; @@ -1170,43 +1163,61 @@ L.DistortableImage.Edit = L.Handler.extend({ if (!L.DomUtil.hasClass(overlay.getElement(), 'selected')) { return; } if (this._getSelectedImages().length <= 1) { return; } - overlay._currentCornerPoints = {}; + overlay._dragPoints = {}; - var i = 0; - for (var k in window.obj) { - overlay._currentCornerPoints[k] = map.latLngToLayerPoint(overlay.getCorners()[i]); - i += 1; + var i; + for (i = 0; i < 4; i++) { + overlay._dragPoints[i] = map.latLngToLayerPoint(overlay.getCorners()[i]); } - var cornerPointDelta = this.calcCornerDelta(overlay); + var cornerPointDelta = this._calcCornerPointDelta(overlay); - var objD = this.calcNewCorners(cornerPointDelta); + window.cornerPointDelta = cornerPointDelta; - this._updateCorners(objD); + var layersToMove = this.calcNewCorners(cornerPointDelta); + + window.layersToMove = layersToMove; + + this._updateCorners(layersToMove); }, - calcCornerDelta: function(overlay) { - return overlay._startCornerPoints.initVal.subtract(overlay._currentCornerPoints.initVal); + _calcCornerPointDelta: function(overlay) { + return overlay._dragStartPoints[0].subtract(overlay._dragPoints[0]); }, calcNewCorners: function(cornerPointDelta) { - var objD = {}; - var transformation = new L.Transformation(1, -cornerPointDelta.x, 1, -cornerPointDelta.y); - objD.newVal = transformation.transform(window.obj.initVal); - objD.newVal1 = transformation.transform(window.obj.initVal1); - objD.newVal2 = transformation.transform(window.obj.initVal2); - objD.newVal3 = transformation.transform(window.obj.initVal3); + var overlay = this._overlay; - return objD; + var layersToMove = []; + var transformation = new L.Transformation(1, -cornerPointDelta.x, 1, -cornerPointDelta.y); + window.imagesFeatureGroup.eachLayer(function (layer) { + if (layer !== overlay) { + layer._objD = {}; + + layer._objD.newVal = transformation.transform(layer._dragStartPoints[0]); + layer._objD.newVal1 = transformation.transform(layer._dragStartPoints[1]); + layer._objD.newVal2 = transformation.transform(layer._dragStartPoints[2]); + layer._objD.newVal3 = transformation.transform(layer._dragStartPoints[3]); + + layersToMove.push(layer); + } + }); + + return layersToMove; }, - // TODO: rename so not the same overlay class method - _updateCorners: function(objD) { - var imgAry = this._getSelectedImages(); + // // TODO: rename so not the same overlay class method + _updateCorners: function(layersToMove) { - imgAry[0]._updateCornersFromPoints(objD); + // var imgAry = this._getSelectedImages(); + layersToMove.forEach(function(layer) { + layer._updateCornersFromPoints(layer._objD); + layer.fire('update'); + }); - imgAry[0].fire('update'); + // imgAry[0]._updateCornersFromPoints(objD); + + // imgAry[0].fire('update'); }, _getSelectedImages: function() { @@ -1386,7 +1397,7 @@ L.DistortableImage.Edit = L.Handler.extend({ // TODO: make a toggleClass DOM Util method $(target).toggleClass('selected'); } - + if (L.DomUtil.hasClass(target, 'selected')) { window.imagesFeatureGroup.addLayer(overlay); } else { diff --git a/src/edit/DistortableImage.Edit.js b/src/edit/DistortableImage.Edit.js index c9a5fdfd7..ccb4467c1 100644 --- a/src/edit/DistortableImage.Edit.js +++ b/src/edit/DistortableImage.Edit.js @@ -23,6 +23,7 @@ L.DistortableImage.Edit = L.Handler.extend({ initialize: function(overlay) { this._overlay = overlay; + this._overlay._dragStartPoints = { 0: 0, 1: 0, 2: 0, 3: 0 }; this._toggledImage = false; /* Interaction modes. */ @@ -161,27 +162,19 @@ L.DistortableImage.Edit = L.Handler.extend({ // drag events for multiple images are separated out from enableDragging initialization -- two different concepts _dragStartMultiple: function() { - var overlay = this._overlay, - map = overlay._map; + var overlay = this._overlay; if (!L.DomUtil.hasClass(overlay.getElement(), 'selected')) { return; } if (this._getSelectedImages().length <= 1) { return; } - overlay._startCornerPoints = {}; - - window.obj = {}; - - window.obj.initVal = 0; - window.obj.initVal1 = 0; - window.obj.initVal2 = 0; - window.obj.initVal3 = 0; - - var i = 0; - for (var k in window.obj) { - window.obj[k] = map.latLngToLayerPoint(window.img.getCorners()[i]); - overlay._startCornerPoints[k] = map.latLngToLayerPoint(overlay.getCorners()[i]); - i += 1; - } + window.overlay = overlay; + + var i; + window.imagesFeatureGroup.eachLayer(function (layer) { + for (i = 0; i < 4; i++) { + layer._dragStartPoints[i] = layer._map.latLngToLayerPoint(layer.getCorners()[i]); + } + }); overlay._cornerPointDelta = {}; @@ -194,43 +187,61 @@ L.DistortableImage.Edit = L.Handler.extend({ if (!L.DomUtil.hasClass(overlay.getElement(), 'selected')) { return; } if (this._getSelectedImages().length <= 1) { return; } - overlay._currentCornerPoints = {}; + overlay._dragPoints = {}; - var i = 0; - for (var k in window.obj) { - overlay._currentCornerPoints[k] = map.latLngToLayerPoint(overlay.getCorners()[i]); - i += 1; + var i; + for (i = 0; i < 4; i++) { + overlay._dragPoints[i] = map.latLngToLayerPoint(overlay.getCorners()[i]); } - var cornerPointDelta = this.calcCornerDelta(overlay); + var cornerPointDelta = this._calcCornerPointDelta(overlay); + + window.cornerPointDelta = cornerPointDelta; - var objD = this.calcNewCorners(cornerPointDelta); + var layersToMove = this.calcNewCorners(cornerPointDelta); - this._updateCorners(objD); + window.layersToMove = layersToMove; + + this._updateCorners(layersToMove); }, - calcCornerDelta: function(overlay) { - return overlay._startCornerPoints.initVal.subtract(overlay._currentCornerPoints.initVal); + _calcCornerPointDelta: function(overlay) { + return overlay._dragStartPoints[0].subtract(overlay._dragPoints[0]); }, calcNewCorners: function(cornerPointDelta) { - var objD = {}; - var transformation = new L.Transformation(1, -cornerPointDelta.x, 1, -cornerPointDelta.y); - objD.newVal = transformation.transform(window.obj.initVal); - objD.newVal1 = transformation.transform(window.obj.initVal1); - objD.newVal2 = transformation.transform(window.obj.initVal2); - objD.newVal3 = transformation.transform(window.obj.initVal3); + var overlay = this._overlay; - return objD; + var layersToMove = []; + var transformation = new L.Transformation(1, -cornerPointDelta.x, 1, -cornerPointDelta.y); + window.imagesFeatureGroup.eachLayer(function (layer) { + if (layer !== overlay) { + layer._objD = {}; + + layer._objD.newVal = transformation.transform(layer._dragStartPoints[0]); + layer._objD.newVal1 = transformation.transform(layer._dragStartPoints[1]); + layer._objD.newVal2 = transformation.transform(layer._dragStartPoints[2]); + layer._objD.newVal3 = transformation.transform(layer._dragStartPoints[3]); + + layersToMove.push(layer); + } + }); + + return layersToMove; }, - // TODO: rename so not the same overlay class method - _updateCorners: function(objD) { - var imgAry = this._getSelectedImages(); + // // TODO: rename so not the same overlay class method + _updateCorners: function(layersToMove) { + + // var imgAry = this._getSelectedImages(); + layersToMove.forEach(function(layer) { + layer._updateCornersFromPoints(layer._objD); + layer.fire('update'); + }); - imgAry[0]._updateCornersFromPoints(objD); + // imgAry[0]._updateCornersFromPoints(objD); - imgAry[0].fire('update'); + // imgAry[0].fire('update'); }, _getSelectedImages: function() { @@ -410,7 +421,7 @@ L.DistortableImage.Edit = L.Handler.extend({ // TODO: make a toggleClass DOM Util method $(target).toggleClass('selected'); } - + if (L.DomUtil.hasClass(target, 'selected')) { window.imagesFeatureGroup.addLayer(overlay); } else { From 9ed95588fd4ac094645e4bb4c02a52c14ac4a114 Mon Sep 17 00:00:00 2001 From: sashadev-sky Date: Mon, 18 Mar 2019 21:02:53 -0400 Subject: [PATCH 20/63] Begin migrating code to custom featureGroup class --- Gruntfile.js | 1 + dist/leaflet.distortableimage.js | 171 ++++++++++++++++++++++++------ examples/select.html | 2 +- src/DistortableCollection.js | 131 +++++++++++++++++++++++ src/edit/DistortableImage.Edit.js | 40 ++----- 5 files changed, 278 insertions(+), 67 deletions(-) create mode 100644 src/DistortableCollection.js diff --git a/Gruntfile.js b/Gruntfile.js index e5f6ce5f9..aff64f8fa 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -88,6 +88,7 @@ module.exports = function(grunt) { 'src/edit/RotateHandle.js', 'src/edit/ScaleHandle.js', 'src/DistortableImageOverlay.js', + 'src/DistortableCollection.js', 'src/edit/DistortableImage.EditToolbar.js', 'src/edit/DistortableImage.Edit.js', 'src/edit/BoxSelectHandle.js' diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index e0bf382d0..9cb29a274 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -813,6 +813,137 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ +L.DistortableCollection = L.FeatureGroup.extend({ + + // DistortableImage.Edit events are automatically propogated to the feature group + +// initialize: function () { + +// L.featureGroup.prototype.initialize.call(this); + +// }, + + _getSelectedImages: function () { + return this.getLayers(); + }, + + _updateCollectionFromPoints: function (layersToMove) { + layersToMove.forEach(function (layer) { + layer._updateCornersFromPoints(layer._objD); + layer.fire('update'); + }); + }, + + +// // drag events for multiple images are separated out from enableDragging initialization -- two different concepts +// _dragStartMultiple: function() { +// var overlay = this._overlay, +// map = overlay._map; + +// if (!L.DomUtil.hasClass(overlay.getElement(), 'selected')) { return; } +// if (window.imagesFeatureGroup._getSelectedImages().length <= 1) { return; } + +// overlay._startCornerPoints = {}; + +// window.obj = {}; + +// window.obj.initVal = 0; +// window.obj.initVal1 = 0; +// window.obj.initVal2 = 0; +// window.obj.initVal3 = 0; + +// var i = 0; +// for (var k in window.obj) { +// window.obj[k] = map.latLngToLayerPoint(window.img.getCorners()[i]); +// overlay._startCornerPoints[k] = map.latLngToLayerPoint(overlay.getCorners()[i]); +// i += 1; +// } + +// overlay._cornerPointDelta = {}; + +// }, + +// _dragMultiple: function () { +// var overlay = this._overlay, +// map = overlay._map; + +// if (!L.DomUtil.hasClass(overlay.getElement(), 'selected')) { return; } +// if (window.imagesFeatureGroup._getSelectedImages().length <= 1) { return; } + +// overlay._currentCornerPoints = {}; + +// var i = 0; +// for (var k in window.obj) { +// overlay._currentCornerPoints[k] = map.latLngToLayerPoint(overlay.getCorners()[i]); +// i += 1; +// } + +// var cornerPointDelta = this.calcCornerDelta(overlay); + +// var objD = this.calcNewCorners(cornerPointDelta); + +// this._updateCorners(objD); +// }, + +// calcCornerDelta: function (overlay) { +// return overlay._startCornerPoints.initVal.subtract(overlay._currentCornerPoints.initVal); +// }, + +// calcNewCorners: function (cornerPointDelta) { +// var objD = {}; +// var transformation = new L.Transformation(1, -cornerPointDelta.x, 1, -cornerPointDelta.y); +// objD.newVal = transformation.transform(window.obj.initVal); +// objD.newVal1 = transformation.transform(window.obj.initVal1); +// objD.newVal2 = transformation.transform(window.obj.initVal2); +// objD.newVal3 = transformation.transform(window.obj.initVal3); + +// return objD; +// }, + +// // TODO: rename so not the same overlay class method +// _updateCorners: function (objD) { + +// var imgAry = window.imagesFeatureGroup._getSelectedImages(); + +// imgAry[0]._updateCornersFromPoints(objD); + +// imgAry[0].fire('update'); +// }, + +// _getSelectedImages: function () { + +// return this.getLayers(); + +// // TODO: polyline for selection so that it doesn't get distorted +// // this._polyline = L.polyline(polyline_array); +// // this._overlay._map.eachLayer(function (layer) { +// // if layer +// // console.log(layer.name); +// // }); +// }, + +// _toggleSelections: function (event) { +// var overlay = this._overlay, +// target = event.target, +// map = overlay._map; + +// if (event.metaKey || event.ctrlKey) { +// // TODO: make a toggleClass DOM Util method +// $(target).toggleClass('selected'); +// } + +// if (L.DomUtil.hasClass(target, 'selected')) { +// window.imagesFeatureGroup.addLayer(overlay); +// } else { +// window.imagesFeatureGroup.removeLayer(overlay); +// // window.overlay = overlay; +// overlay.addTo(map); +// overlay.editing.enable(); +// // overlay._reset(); +// // overlay.fire('update'); +// } +// }, +}); L.DistortableImage = L.DistortableImage || {}; var EditOverlayAction = LeafletToolbar.ToolbarAction.extend({ @@ -1141,7 +1272,7 @@ L.DistortableImage.Edit = L.Handler.extend({ var overlay = this._overlay; if (!L.DomUtil.hasClass(overlay.getElement(), 'selected')) { return; } - if (this._getSelectedImages().length <= 1) { return; } + if (window.imagesFeatureGroup._getSelectedImages().length <= 1) { return; } window.overlay = overlay; @@ -1161,7 +1292,7 @@ L.DistortableImage.Edit = L.Handler.extend({ map = overlay._map; if (!L.DomUtil.hasClass(overlay.getElement(), 'selected')) { return; } - if (this._getSelectedImages().length <= 1) { return; } + if (window.imagesFeatureGroup._getSelectedImages().length <= 1) { return; } overlay._dragPoints = {}; @@ -1172,20 +1303,20 @@ L.DistortableImage.Edit = L.Handler.extend({ var cornerPointDelta = this._calcCornerPointDelta(overlay); - window.cornerPointDelta = cornerPointDelta; + // window.cornerPointDelta = cornerPointDelta; - var layersToMove = this.calcNewCorners(cornerPointDelta); + var layersToMove = this._calcNewCorners(cornerPointDelta); - window.layersToMove = layersToMove; + // window.layersToMove = layersToMove; - this._updateCorners(layersToMove); + window.imagesFeatureGroup._updateCollectionFromPoints(layersToMove); }, _calcCornerPointDelta: function(overlay) { return overlay._dragStartPoints[0].subtract(overlay._dragPoints[0]); }, - calcNewCorners: function(cornerPointDelta) { + _calcNewCorners: function(cornerPointDelta) { var overlay = this._overlay; var layersToMove = []; @@ -1206,32 +1337,6 @@ L.DistortableImage.Edit = L.Handler.extend({ return layersToMove; }, - // // TODO: rename so not the same overlay class method - _updateCorners: function(layersToMove) { - - // var imgAry = this._getSelectedImages(); - layersToMove.forEach(function(layer) { - layer._updateCornersFromPoints(layer._objD); - layer.fire('update'); - }); - - // imgAry[0]._updateCornersFromPoints(objD); - - // imgAry[0].fire('update'); - }, - - _getSelectedImages: function() { - - return window.imagesFeatureGroup.getLayers(); - - // TODO: polyline for selection so that it doesn't get distorted - // this._polyline = L.polyline(polyline_array); - // this._overlay._map.eachLayer(function (layer) { - // if layer - // console.log(layer.name); - // }); - }, - _enableDragging: function() { var overlay = this._overlay, map = overlay._map; diff --git a/examples/select.html b/examples/select.html index b253901f4..9f7ac2bf9 100644 --- a/examples/select.html +++ b/examples/select.html @@ -95,7 +95,7 @@ } ).addTo(map); - var imagesFeatureGroup = L.featureGroup().addTo(map); + var imagesFeatureGroup = new L.DistortableCollection().addTo(map); window.imagesFeatureGroup = imagesFeatureGroup; images.push(img2); diff --git a/src/DistortableCollection.js b/src/DistortableCollection.js new file mode 100644 index 000000000..f8e1dc764 --- /dev/null +++ b/src/DistortableCollection.js @@ -0,0 +1,131 @@ +L.DistortableCollection = L.FeatureGroup.extend({ + + // DistortableImage.Edit events are automatically propogated to the feature group + +// initialize: function () { + +// L.featureGroup.prototype.initialize.call(this); + +// }, + + _getSelectedImages: function () { + return this.getLayers(); + }, + + _updateCollectionFromPoints: function (layersToMove) { + layersToMove.forEach(function (layer) { + layer._updateCornersFromPoints(layer._objD); + layer.fire('update'); + }); + }, + + +// // drag events for multiple images are separated out from enableDragging initialization -- two different concepts +// _dragStartMultiple: function() { +// var overlay = this._overlay, +// map = overlay._map; + +// if (!L.DomUtil.hasClass(overlay.getElement(), 'selected')) { return; } +// if (window.imagesFeatureGroup._getSelectedImages().length <= 1) { return; } + +// overlay._startCornerPoints = {}; + +// window.obj = {}; + +// window.obj.initVal = 0; +// window.obj.initVal1 = 0; +// window.obj.initVal2 = 0; +// window.obj.initVal3 = 0; + +// var i = 0; +// for (var k in window.obj) { +// window.obj[k] = map.latLngToLayerPoint(window.img.getCorners()[i]); +// overlay._startCornerPoints[k] = map.latLngToLayerPoint(overlay.getCorners()[i]); +// i += 1; +// } + +// overlay._cornerPointDelta = {}; + +// }, + +// _dragMultiple: function () { +// var overlay = this._overlay, +// map = overlay._map; + +// if (!L.DomUtil.hasClass(overlay.getElement(), 'selected')) { return; } +// if (window.imagesFeatureGroup._getSelectedImages().length <= 1) { return; } + +// overlay._currentCornerPoints = {}; + +// var i = 0; +// for (var k in window.obj) { +// overlay._currentCornerPoints[k] = map.latLngToLayerPoint(overlay.getCorners()[i]); +// i += 1; +// } + +// var cornerPointDelta = this.calcCornerDelta(overlay); + +// var objD = this.calcNewCorners(cornerPointDelta); + +// this._updateCorners(objD); +// }, + +// calcCornerDelta: function (overlay) { +// return overlay._startCornerPoints.initVal.subtract(overlay._currentCornerPoints.initVal); +// }, + +// calcNewCorners: function (cornerPointDelta) { +// var objD = {}; +// var transformation = new L.Transformation(1, -cornerPointDelta.x, 1, -cornerPointDelta.y); +// objD.newVal = transformation.transform(window.obj.initVal); +// objD.newVal1 = transformation.transform(window.obj.initVal1); +// objD.newVal2 = transformation.transform(window.obj.initVal2); +// objD.newVal3 = transformation.transform(window.obj.initVal3); + +// return objD; +// }, + +// // TODO: rename so not the same overlay class method +// _updateCorners: function (objD) { + +// var imgAry = window.imagesFeatureGroup._getSelectedImages(); + +// imgAry[0]._updateCornersFromPoints(objD); + +// imgAry[0].fire('update'); +// }, + +// _getSelectedImages: function () { + +// return this.getLayers(); + +// // TODO: polyline for selection so that it doesn't get distorted +// // this._polyline = L.polyline(polyline_array); +// // this._overlay._map.eachLayer(function (layer) { +// // if layer +// // console.log(layer.name); +// // }); +// }, + +// _toggleSelections: function (event) { +// var overlay = this._overlay, +// target = event.target, +// map = overlay._map; + +// if (event.metaKey || event.ctrlKey) { +// // TODO: make a toggleClass DOM Util method +// $(target).toggleClass('selected'); +// } + +// if (L.DomUtil.hasClass(target, 'selected')) { +// window.imagesFeatureGroup.addLayer(overlay); +// } else { +// window.imagesFeatureGroup.removeLayer(overlay); +// // window.overlay = overlay; +// overlay.addTo(map); +// overlay.editing.enable(); +// // overlay._reset(); +// // overlay.fire('update'); +// } +// }, +}); \ No newline at end of file diff --git a/src/edit/DistortableImage.Edit.js b/src/edit/DistortableImage.Edit.js index ccb4467c1..ef9d610dd 100644 --- a/src/edit/DistortableImage.Edit.js +++ b/src/edit/DistortableImage.Edit.js @@ -165,7 +165,7 @@ L.DistortableImage.Edit = L.Handler.extend({ var overlay = this._overlay; if (!L.DomUtil.hasClass(overlay.getElement(), 'selected')) { return; } - if (this._getSelectedImages().length <= 1) { return; } + if (window.imagesFeatureGroup._getSelectedImages().length <= 1) { return; } window.overlay = overlay; @@ -185,7 +185,7 @@ L.DistortableImage.Edit = L.Handler.extend({ map = overlay._map; if (!L.DomUtil.hasClass(overlay.getElement(), 'selected')) { return; } - if (this._getSelectedImages().length <= 1) { return; } + if (window.imagesFeatureGroup._getSelectedImages().length <= 1) { return; } overlay._dragPoints = {}; @@ -196,20 +196,20 @@ L.DistortableImage.Edit = L.Handler.extend({ var cornerPointDelta = this._calcCornerPointDelta(overlay); - window.cornerPointDelta = cornerPointDelta; + // window.cornerPointDelta = cornerPointDelta; - var layersToMove = this.calcNewCorners(cornerPointDelta); + var layersToMove = this._calcNewCorners(cornerPointDelta); - window.layersToMove = layersToMove; + // window.layersToMove = layersToMove; - this._updateCorners(layersToMove); + window.imagesFeatureGroup._updateCollectionFromPoints(layersToMove); }, _calcCornerPointDelta: function(overlay) { return overlay._dragStartPoints[0].subtract(overlay._dragPoints[0]); }, - calcNewCorners: function(cornerPointDelta) { + _calcNewCorners: function(cornerPointDelta) { var overlay = this._overlay; var layersToMove = []; @@ -230,32 +230,6 @@ L.DistortableImage.Edit = L.Handler.extend({ return layersToMove; }, - // // TODO: rename so not the same overlay class method - _updateCorners: function(layersToMove) { - - // var imgAry = this._getSelectedImages(); - layersToMove.forEach(function(layer) { - layer._updateCornersFromPoints(layer._objD); - layer.fire('update'); - }); - - // imgAry[0]._updateCornersFromPoints(objD); - - // imgAry[0].fire('update'); - }, - - _getSelectedImages: function() { - - return window.imagesFeatureGroup.getLayers(); - - // TODO: polyline for selection so that it doesn't get distorted - // this._polyline = L.polyline(polyline_array); - // this._overlay._map.eachLayer(function (layer) { - // if layer - // console.log(layer.name); - // }); - }, - _enableDragging: function() { var overlay = this._overlay, map = overlay._map; From 45d4494c12ae6e88e5f145621dee2506dd76dc0f Mon Sep 17 00:00:00 2001 From: sashadev-sky Date: Mon, 18 Mar 2019 21:20:06 -0400 Subject: [PATCH 21/63] Hide multiple toolbars for multiple image drag --- dist/leaflet.distortableimage.js | 18 +++++++++++------- src/DistortableImageOverlay.js | 5 +++++ src/edit/DistortableImage.Edit.js | 13 ++++++------- 3 files changed, 22 insertions(+), 14 deletions(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index 9cb29a274..c9aaa01f8 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -780,6 +780,11 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ return cartesianToLatLng.call(map, nmid.add(smid.subtract(nmid).divideBy(2))); }, + // Use for translation calculations - for translation the delta for 1 corner applies to all 4 + _calcCornerPointDelta: function () { + return this._dragStartPoints[0].subtract(this._dragPoints[0]); + }, + _calculateProjectiveTransform: function(latLngToCartesian) { /* Setting reasonable but made-up image defaults * allow us to place images on the map before @@ -1274,11 +1279,12 @@ L.DistortableImage.Edit = L.Handler.extend({ if (!L.DomUtil.hasClass(overlay.getElement(), 'selected')) { return; } if (window.imagesFeatureGroup._getSelectedImages().length <= 1) { return; } - window.overlay = overlay; + // window.overlay = overlay; var i; window.imagesFeatureGroup.eachLayer(function (layer) { for (i = 0; i < 4; i++) { + if (layer !== overlay) { layer.editing._hideToolbar(); } layer._dragStartPoints[i] = layer._map.latLngToLayerPoint(layer.getCorners()[i]); } }); @@ -1301,9 +1307,7 @@ L.DistortableImage.Edit = L.Handler.extend({ overlay._dragPoints[i] = map.latLngToLayerPoint(overlay.getCorners()[i]); } - var cornerPointDelta = this._calcCornerPointDelta(overlay); - - // window.cornerPointDelta = cornerPointDelta; + var cornerPointDelta = overlay._calcCornerPointDelta(); var layersToMove = this._calcNewCorners(cornerPointDelta); @@ -1312,9 +1316,9 @@ L.DistortableImage.Edit = L.Handler.extend({ window.imagesFeatureGroup._updateCollectionFromPoints(layersToMove); }, - _calcCornerPointDelta: function(overlay) { - return overlay._dragStartPoints[0].subtract(overlay._dragPoints[0]); - }, + // _calcCornerPointDelta: function(overlay) { + // return overlay._dragStartPoints[0].subtract(overlay._dragPoints[0]); + // }, _calcNewCorners: function(cornerPointDelta) { var overlay = this._overlay; diff --git a/src/DistortableImageOverlay.js b/src/DistortableImageOverlay.js index 7c6a09bb8..687eae357 100644 --- a/src/DistortableImageOverlay.js +++ b/src/DistortableImageOverlay.js @@ -248,6 +248,11 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ return cartesianToLatLng.call(map, nmid.add(smid.subtract(nmid).divideBy(2))); }, + // Use for translation calculations - for translation the delta for 1 corner applies to all 4 + _calcCornerPointDelta: function () { + return this._dragStartPoints[0].subtract(this._dragPoints[0]); + }, + _calculateProjectiveTransform: function(latLngToCartesian) { /* Setting reasonable but made-up image defaults * allow us to place images on the map before diff --git a/src/edit/DistortableImage.Edit.js b/src/edit/DistortableImage.Edit.js index ef9d610dd..44cdd835b 100644 --- a/src/edit/DistortableImage.Edit.js +++ b/src/edit/DistortableImage.Edit.js @@ -167,11 +167,12 @@ L.DistortableImage.Edit = L.Handler.extend({ if (!L.DomUtil.hasClass(overlay.getElement(), 'selected')) { return; } if (window.imagesFeatureGroup._getSelectedImages().length <= 1) { return; } - window.overlay = overlay; + // window.overlay = overlay; var i; window.imagesFeatureGroup.eachLayer(function (layer) { for (i = 0; i < 4; i++) { + if (layer !== overlay) { layer.editing._hideToolbar(); } layer._dragStartPoints[i] = layer._map.latLngToLayerPoint(layer.getCorners()[i]); } }); @@ -194,9 +195,7 @@ L.DistortableImage.Edit = L.Handler.extend({ overlay._dragPoints[i] = map.latLngToLayerPoint(overlay.getCorners()[i]); } - var cornerPointDelta = this._calcCornerPointDelta(overlay); - - // window.cornerPointDelta = cornerPointDelta; + var cornerPointDelta = overlay._calcCornerPointDelta(); var layersToMove = this._calcNewCorners(cornerPointDelta); @@ -205,9 +204,9 @@ L.DistortableImage.Edit = L.Handler.extend({ window.imagesFeatureGroup._updateCollectionFromPoints(layersToMove); }, - _calcCornerPointDelta: function(overlay) { - return overlay._dragStartPoints[0].subtract(overlay._dragPoints[0]); - }, + // _calcCornerPointDelta: function(overlay) { + // return overlay._dragStartPoints[0].subtract(overlay._dragPoints[0]); + // }, _calcNewCorners: function(cornerPointDelta) { var overlay = this._overlay; From 6e2e4165823edb361d2fa26e91f37f23ee58cf9f Mon Sep 17 00:00:00 2001 From: sashadev-sky Date: Mon, 18 Mar 2019 22:26:19 -0400 Subject: [PATCH 22/63] Add DomUtil toggle method --- dist/leaflet.distortableimage.js | 174 ++++++++---------------------- src/DistortableCollection.js | 112 ++++--------------- src/edit/DistortableImage.Edit.js | 56 +++------- src/util/DomUtil.js | 6 ++ 4 files changed, 86 insertions(+), 262 deletions(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index c9aaa01f8..28aab5d1d 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -30,7 +30,13 @@ L.DomUtil = L.extend(L.DomUtil, { rotateString = (is3d ? '0, 0, 1, ' : '') + angle + units; return open + rotateString + ')'; + }, + + toggleClass: function(el, className) { + var c = className; + return this.hasClass(el, c) ? this.removeClass(el, c) : this.addClass(el, c); } + }); L.Map.include({ @@ -832,100 +838,34 @@ L.DistortableCollection = L.FeatureGroup.extend({ return this.getLayers(); }, - _updateCollectionFromPoints: function (layersToMove) { - layersToMove.forEach(function (layer) { - layer._updateCornersFromPoints(layer._objD); - layer.fire('update'); - }); - }, - - -// // drag events for multiple images are separated out from enableDragging initialization -- two different concepts -// _dragStartMultiple: function() { -// var overlay = this._overlay, -// map = overlay._map; - -// if (!L.DomUtil.hasClass(overlay.getElement(), 'selected')) { return; } -// if (window.imagesFeatureGroup._getSelectedImages().length <= 1) { return; } - -// overlay._startCornerPoints = {}; - -// window.obj = {}; - -// window.obj.initVal = 0; -// window.obj.initVal1 = 0; -// window.obj.initVal2 = 0; -// window.obj.initVal3 = 0; - -// var i = 0; -// for (var k in window.obj) { -// window.obj[k] = map.latLngToLayerPoint(window.img.getCorners()[i]); -// overlay._startCornerPoints[k] = map.latLngToLayerPoint(overlay.getCorners()[i]); -// i += 1; -// } - -// overlay._cornerPointDelta = {}; - -// }, - -// _dragMultiple: function () { -// var overlay = this._overlay, -// map = overlay._map; - -// if (!L.DomUtil.hasClass(overlay.getElement(), 'selected')) { return; } -// if (window.imagesFeatureGroup._getSelectedImages().length <= 1) { return; } - -// overlay._currentCornerPoints = {}; - -// var i = 0; -// for (var k in window.obj) { -// overlay._currentCornerPoints[k] = map.latLngToLayerPoint(overlay.getCorners()[i]); -// i += 1; -// } - -// var cornerPointDelta = this.calcCornerDelta(overlay); - -// var objD = this.calcNewCorners(cornerPointDelta); - -// this._updateCorners(objD); -// }, - -// calcCornerDelta: function (overlay) { -// return overlay._startCornerPoints.initVal.subtract(overlay._currentCornerPoints.initVal); -// }, - -// calcNewCorners: function (cornerPointDelta) { -// var objD = {}; -// var transformation = new L.Transformation(1, -cornerPointDelta.x, 1, -cornerPointDelta.y); -// objD.newVal = transformation.transform(window.obj.initVal); -// objD.newVal1 = transformation.transform(window.obj.initVal1); -// objD.newVal2 = transformation.transform(window.obj.initVal2); -// objD.newVal3 = transformation.transform(window.obj.initVal3); - -// return objD; -// }, - -// // TODO: rename so not the same overlay class method -// _updateCorners: function (objD) { - -// var imgAry = window.imagesFeatureGroup._getSelectedImages(); + _calcCollectionFromPoints: function (cornerPointDelta, overlay) { + var layersToMove = []; + var transformation = new L.Transformation(1, -cornerPointDelta.x, 1, -cornerPointDelta.y); + this.eachLayer(function (layer) { + if (layer !== overlay) { + layer._objD = {}; -// imgAry[0]._updateCornersFromPoints(objD); + layer._objD.newVal = transformation.transform(layer._dragStartPoints[0]); + layer._objD.newVal1 = transformation.transform(layer._dragStartPoints[1]); + layer._objD.newVal2 = transformation.transform(layer._dragStartPoints[2]); + layer._objD.newVal3 = transformation.transform(layer._dragStartPoints[3]); -// imgAry[0].fire('update'); -// }, + layersToMove.push(layer); + } + }); -// _getSelectedImages: function () { + return layersToMove; + }, -// return this.getLayers(); + _updateCollectionFromPoints: function (cornerPointDelta, overlay) { + + var layersToMove = this._calcCollectionFromPoints(cornerPointDelta, overlay); -// // TODO: polyline for selection so that it doesn't get distorted -// // this._polyline = L.polyline(polyline_array); -// // this._overlay._map.eachLayer(function (layer) { -// // if layer -// // console.log(layer.name); -// // }); -// }, + layersToMove.forEach(function (layer) { + layer._updateCornersFromPoints(layer._objD); + layer.fire('update'); + }); + }, // _toggleSelections: function (event) { // var overlay = this._overlay, @@ -1135,6 +1075,7 @@ L.DistortableImage.Edit = L.Handler.extend({ initialize: function(overlay) { this._overlay = overlay; + // TODO: consider renaming to ._cornersPoints for consistency with current code this._overlay._dragStartPoints = { 0: 0, 1: 0, 2: 0, 3: 0 }; this._toggledImage = false; @@ -1234,8 +1175,11 @@ L.DistortableImage.Edit = L.Handler.extend({ confirmDelete: function () { return window.confirm("Are you sure you want to delete?"); - }, - + }, + + isSelected: function(overlay) { + return L.DomUtil.hasClass(overlay.getElement(), 'selected'); + }, _rotateBy: function(angle) { var overlay = this._overlay, @@ -1274,14 +1218,12 @@ L.DistortableImage.Edit = L.Handler.extend({ // drag events for multiple images are separated out from enableDragging initialization -- two different concepts _dragStartMultiple: function() { - var overlay = this._overlay; + var overlay = this._overlay, + i; - if (!L.DomUtil.hasClass(overlay.getElement(), 'selected')) { return; } + if (!this.isSelected(overlay)) { return; } if (window.imagesFeatureGroup._getSelectedImages().length <= 1) { return; } - - // window.overlay = overlay; - var i; window.imagesFeatureGroup.eachLayer(function (layer) { for (i = 0; i < 4; i++) { if (layer !== overlay) { layer.editing._hideToolbar(); } @@ -1295,50 +1237,21 @@ L.DistortableImage.Edit = L.Handler.extend({ _dragMultiple: function() { var overlay = this._overlay, - map = overlay._map; + map = overlay._map, + i; - if (!L.DomUtil.hasClass(overlay.getElement(), 'selected')) { return; } + if (!this.isSelected(overlay)) { return; } if (window.imagesFeatureGroup._getSelectedImages().length <= 1) { return; } overlay._dragPoints = {}; - var i; for (i = 0; i < 4; i++) { overlay._dragPoints[i] = map.latLngToLayerPoint(overlay.getCorners()[i]); } var cornerPointDelta = overlay._calcCornerPointDelta(); - var layersToMove = this._calcNewCorners(cornerPointDelta); - - // window.layersToMove = layersToMove; - - window.imagesFeatureGroup._updateCollectionFromPoints(layersToMove); - }, - - // _calcCornerPointDelta: function(overlay) { - // return overlay._dragStartPoints[0].subtract(overlay._dragPoints[0]); - // }, - - _calcNewCorners: function(cornerPointDelta) { - var overlay = this._overlay; - - var layersToMove = []; - var transformation = new L.Transformation(1, -cornerPointDelta.x, 1, -cornerPointDelta.y); - window.imagesFeatureGroup.eachLayer(function (layer) { - if (layer !== overlay) { - layer._objD = {}; - - layer._objD.newVal = transformation.transform(layer._dragStartPoints[0]); - layer._objD.newVal1 = transformation.transform(layer._dragStartPoints[1]); - layer._objD.newVal2 = transformation.transform(layer._dragStartPoints[2]); - layer._objD.newVal3 = transformation.transform(layer._dragStartPoints[3]); - - layersToMove.push(layer); - } - }); - - return layersToMove; + window.imagesFeatureGroup._updateCollectionFromPoints(cornerPointDelta, overlay); }, _enableDragging: function() { @@ -1503,8 +1416,7 @@ L.DistortableImage.Edit = L.Handler.extend({ map = overlay._map; if (event.metaKey || event.ctrlKey) { - // TODO: make a toggleClass DOM Util method - $(target).toggleClass('selected'); + L.DomUtil.toggleClass(target, 'selected'); } if (L.DomUtil.hasClass(target, 'selected')) { diff --git a/src/DistortableCollection.js b/src/DistortableCollection.js index f8e1dc764..7f3cbc02d 100644 --- a/src/DistortableCollection.js +++ b/src/DistortableCollection.js @@ -12,101 +12,35 @@ L.DistortableCollection = L.FeatureGroup.extend({ return this.getLayers(); }, - _updateCollectionFromPoints: function (layersToMove) { + _calcCollectionFromPoints: function (cornerPointDelta, overlay) { + var layersToMove = []; + var transformation = new L.Transformation(1, -cornerPointDelta.x, 1, -cornerPointDelta.y); + this.eachLayer(function (layer) { + if (layer !== overlay) { + layer._objD = {}; + + layer._objD.newVal = transformation.transform(layer._dragStartPoints[0]); + layer._objD.newVal1 = transformation.transform(layer._dragStartPoints[1]); + layer._objD.newVal2 = transformation.transform(layer._dragStartPoints[2]); + layer._objD.newVal3 = transformation.transform(layer._dragStartPoints[3]); + + layersToMove.push(layer); + } + }); + + return layersToMove; + }, + + _updateCollectionFromPoints: function (cornerPointDelta, overlay) { + + var layersToMove = this._calcCollectionFromPoints(cornerPointDelta, overlay); + layersToMove.forEach(function (layer) { layer._updateCornersFromPoints(layer._objD); layer.fire('update'); }); }, - -// // drag events for multiple images are separated out from enableDragging initialization -- two different concepts -// _dragStartMultiple: function() { -// var overlay = this._overlay, -// map = overlay._map; - -// if (!L.DomUtil.hasClass(overlay.getElement(), 'selected')) { return; } -// if (window.imagesFeatureGroup._getSelectedImages().length <= 1) { return; } - -// overlay._startCornerPoints = {}; - -// window.obj = {}; - -// window.obj.initVal = 0; -// window.obj.initVal1 = 0; -// window.obj.initVal2 = 0; -// window.obj.initVal3 = 0; - -// var i = 0; -// for (var k in window.obj) { -// window.obj[k] = map.latLngToLayerPoint(window.img.getCorners()[i]); -// overlay._startCornerPoints[k] = map.latLngToLayerPoint(overlay.getCorners()[i]); -// i += 1; -// } - -// overlay._cornerPointDelta = {}; - -// }, - -// _dragMultiple: function () { -// var overlay = this._overlay, -// map = overlay._map; - -// if (!L.DomUtil.hasClass(overlay.getElement(), 'selected')) { return; } -// if (window.imagesFeatureGroup._getSelectedImages().length <= 1) { return; } - -// overlay._currentCornerPoints = {}; - -// var i = 0; -// for (var k in window.obj) { -// overlay._currentCornerPoints[k] = map.latLngToLayerPoint(overlay.getCorners()[i]); -// i += 1; -// } - -// var cornerPointDelta = this.calcCornerDelta(overlay); - -// var objD = this.calcNewCorners(cornerPointDelta); - -// this._updateCorners(objD); -// }, - -// calcCornerDelta: function (overlay) { -// return overlay._startCornerPoints.initVal.subtract(overlay._currentCornerPoints.initVal); -// }, - -// calcNewCorners: function (cornerPointDelta) { -// var objD = {}; -// var transformation = new L.Transformation(1, -cornerPointDelta.x, 1, -cornerPointDelta.y); -// objD.newVal = transformation.transform(window.obj.initVal); -// objD.newVal1 = transformation.transform(window.obj.initVal1); -// objD.newVal2 = transformation.transform(window.obj.initVal2); -// objD.newVal3 = transformation.transform(window.obj.initVal3); - -// return objD; -// }, - -// // TODO: rename so not the same overlay class method -// _updateCorners: function (objD) { - -// var imgAry = window.imagesFeatureGroup._getSelectedImages(); - -// imgAry[0]._updateCornersFromPoints(objD); - -// imgAry[0].fire('update'); -// }, - -// _getSelectedImages: function () { - -// return this.getLayers(); - -// // TODO: polyline for selection so that it doesn't get distorted -// // this._polyline = L.polyline(polyline_array); -// // this._overlay._map.eachLayer(function (layer) { -// // if layer -// // console.log(layer.name); -// // }); -// }, - // _toggleSelections: function (event) { // var overlay = this._overlay, // target = event.target, diff --git a/src/edit/DistortableImage.Edit.js b/src/edit/DistortableImage.Edit.js index 44cdd835b..e618cb4e8 100644 --- a/src/edit/DistortableImage.Edit.js +++ b/src/edit/DistortableImage.Edit.js @@ -23,6 +23,7 @@ L.DistortableImage.Edit = L.Handler.extend({ initialize: function(overlay) { this._overlay = overlay; + // TODO: consider renaming to ._cornersPoints for consistency with current code this._overlay._dragStartPoints = { 0: 0, 1: 0, 2: 0, 3: 0 }; this._toggledImage = false; @@ -122,8 +123,11 @@ L.DistortableImage.Edit = L.Handler.extend({ confirmDelete: function () { return window.confirm("Are you sure you want to delete?"); - }, - + }, + + isSelected: function(overlay) { + return L.DomUtil.hasClass(overlay.getElement(), 'selected'); + }, _rotateBy: function(angle) { var overlay = this._overlay, @@ -162,14 +166,12 @@ L.DistortableImage.Edit = L.Handler.extend({ // drag events for multiple images are separated out from enableDragging initialization -- two different concepts _dragStartMultiple: function() { - var overlay = this._overlay; + var overlay = this._overlay, + i; - if (!L.DomUtil.hasClass(overlay.getElement(), 'selected')) { return; } + if (!this.isSelected(overlay)) { return; } if (window.imagesFeatureGroup._getSelectedImages().length <= 1) { return; } - - // window.overlay = overlay; - var i; window.imagesFeatureGroup.eachLayer(function (layer) { for (i = 0; i < 4; i++) { if (layer !== overlay) { layer.editing._hideToolbar(); } @@ -183,50 +185,21 @@ L.DistortableImage.Edit = L.Handler.extend({ _dragMultiple: function() { var overlay = this._overlay, - map = overlay._map; + map = overlay._map, + i; - if (!L.DomUtil.hasClass(overlay.getElement(), 'selected')) { return; } + if (!this.isSelected(overlay)) { return; } if (window.imagesFeatureGroup._getSelectedImages().length <= 1) { return; } overlay._dragPoints = {}; - var i; for (i = 0; i < 4; i++) { overlay._dragPoints[i] = map.latLngToLayerPoint(overlay.getCorners()[i]); } var cornerPointDelta = overlay._calcCornerPointDelta(); - var layersToMove = this._calcNewCorners(cornerPointDelta); - - // window.layersToMove = layersToMove; - - window.imagesFeatureGroup._updateCollectionFromPoints(layersToMove); - }, - - // _calcCornerPointDelta: function(overlay) { - // return overlay._dragStartPoints[0].subtract(overlay._dragPoints[0]); - // }, - - _calcNewCorners: function(cornerPointDelta) { - var overlay = this._overlay; - - var layersToMove = []; - var transformation = new L.Transformation(1, -cornerPointDelta.x, 1, -cornerPointDelta.y); - window.imagesFeatureGroup.eachLayer(function (layer) { - if (layer !== overlay) { - layer._objD = {}; - - layer._objD.newVal = transformation.transform(layer._dragStartPoints[0]); - layer._objD.newVal1 = transformation.transform(layer._dragStartPoints[1]); - layer._objD.newVal2 = transformation.transform(layer._dragStartPoints[2]); - layer._objD.newVal3 = transformation.transform(layer._dragStartPoints[3]); - - layersToMove.push(layer); - } - }); - - return layersToMove; + window.imagesFeatureGroup._updateCollectionFromPoints(cornerPointDelta, overlay); }, _enableDragging: function() { @@ -391,8 +364,7 @@ L.DistortableImage.Edit = L.Handler.extend({ map = overlay._map; if (event.metaKey || event.ctrlKey) { - // TODO: make a toggleClass DOM Util method - $(target).toggleClass('selected'); + L.DomUtil.toggleClass(target, 'selected'); } if (L.DomUtil.hasClass(target, 'selected')) { diff --git a/src/util/DomUtil.js b/src/util/DomUtil.js index 8758b75c9..650898ca7 100644 --- a/src/util/DomUtil.js +++ b/src/util/DomUtil.js @@ -30,5 +30,11 @@ L.DomUtil = L.extend(L.DomUtil, { rotateString = (is3d ? '0, 0, 1, ' : '') + angle + units; return open + rotateString + ')'; + }, + + toggleClass: function(el, className) { + var c = className; + return this.hasClass(el, c) ? this.removeClass(el, c) : this.addClass(el, c); } + }); From 028000817287eaa150ee867f30a852d7abb615ac Mon Sep 17 00:00:00 2001 From: sashadev-sky Date: Mon, 18 Mar 2019 22:53:00 -0400 Subject: [PATCH 23/63] Prevent dragging if image is locked --- dist/leaflet.distortableimage.js | 12 ++++++------ src/DistortableCollection.js | 6 +++++- src/edit/DistortableImage.Edit.js | 6 +----- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index 28aab5d1d..551d130a9 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -838,11 +838,15 @@ L.DistortableCollection = L.FeatureGroup.extend({ return this.getLayers(); }, + /** + * images in 'lock' mode are included in this feature group collection for functionalities + * such as export, but are filtered out for editing / dragging here + */ _calcCollectionFromPoints: function (cornerPointDelta, overlay) { var layersToMove = []; var transformation = new L.Transformation(1, -cornerPointDelta.x, 1, -cornerPointDelta.y); this.eachLayer(function (layer) { - if (layer !== overlay) { + if (layer !== overlay && layer.editing._mode !== 'lock') { layer._objD = {}; layer._objD.newVal = transformation.transform(layer._dragStartPoints[0]); @@ -1152,12 +1156,9 @@ L.DistortableImage.Edit = L.Handler.extend({ /* Run on image deselection. */ removeHooks: function() { - var overlay = this._overlay, map = overlay._map; - // L.DomEvent.off(window, 'keydown', this._onKeyDown, this); - L.DomEvent.off(overlay._image, 'click', this._showToolbar, this); // First, check if dragging exists; @@ -1423,7 +1424,6 @@ L.DistortableImage.Edit = L.Handler.extend({ window.imagesFeatureGroup.addLayer(overlay); } else { window.imagesFeatureGroup.removeLayer(overlay); - // window.overlay = overlay; overlay.addTo(map); overlay.editing.enable(); // overlay._reset(); @@ -1441,7 +1441,7 @@ L.DistortableImage.Edit = L.Handler.extend({ layer.addTo(map); layer.editing.enable(); }); - // $('.selected').removeClass('selected'); + this._hideToolbar(); }, diff --git a/src/DistortableCollection.js b/src/DistortableCollection.js index 7f3cbc02d..3887f3f73 100644 --- a/src/DistortableCollection.js +++ b/src/DistortableCollection.js @@ -12,11 +12,15 @@ L.DistortableCollection = L.FeatureGroup.extend({ return this.getLayers(); }, + /** + * images in 'lock' mode are included in this feature group collection for functionalities + * such as export, but are filtered out for editing / dragging here + */ _calcCollectionFromPoints: function (cornerPointDelta, overlay) { var layersToMove = []; var transformation = new L.Transformation(1, -cornerPointDelta.x, 1, -cornerPointDelta.y); this.eachLayer(function (layer) { - if (layer !== overlay) { + if (layer !== overlay && layer.editing._mode !== 'lock') { layer._objD = {}; layer._objD.newVal = transformation.transform(layer._dragStartPoints[0]); diff --git a/src/edit/DistortableImage.Edit.js b/src/edit/DistortableImage.Edit.js index e618cb4e8..32ab835f7 100644 --- a/src/edit/DistortableImage.Edit.js +++ b/src/edit/DistortableImage.Edit.js @@ -100,12 +100,9 @@ L.DistortableImage.Edit = L.Handler.extend({ /* Run on image deselection. */ removeHooks: function() { - var overlay = this._overlay, map = overlay._map; - // L.DomEvent.off(window, 'keydown', this._onKeyDown, this); - L.DomEvent.off(overlay._image, 'click', this._showToolbar, this); // First, check if dragging exists; @@ -371,7 +368,6 @@ L.DistortableImage.Edit = L.Handler.extend({ window.imagesFeatureGroup.addLayer(overlay); } else { window.imagesFeatureGroup.removeLayer(overlay); - // window.overlay = overlay; overlay.addTo(map); overlay.editing.enable(); // overlay._reset(); @@ -389,7 +385,7 @@ L.DistortableImage.Edit = L.Handler.extend({ layer.addTo(map); layer.editing.enable(); }); - // $('.selected').removeClass('selected'); + this._hideToolbar(); }, From ff6111c88a703695e49713c0e18d052b6d6094b5 Mon Sep 17 00:00:00 2001 From: sashadev-sky Date: Tue, 19 Mar 2019 04:12:39 -0400 Subject: [PATCH 24/63] Remove all hardcoding --- dist/leaflet.distortableimage.js | 55 ++++++++++++++----------------- examples/select.html | 13 +++++--- src/DistortableCollection.js | 8 ----- src/DistortableImageOverlay.js | 16 ++++----- src/edit/DistortableImage.Edit.js | 32 ++++++++++-------- src/edit/LockHandle.js | 2 ++ 6 files changed, 61 insertions(+), 65 deletions(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index 551d130a9..2fa6cf228 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -304,7 +304,9 @@ L.LockHandle = L.EditHandle.extend({ }, updateHandle: function() { + window.this = this; this.setLatLng(this._handled._corners[this._corner]); + L.DomUtil.removeClass(this._handled.getElement(), 'selected'); } }); @@ -542,7 +544,8 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ options: { alt: '', height: 200, - crossOrigin: true + crossOrigin: true, + group: '' }, initialize: function(url, options) { @@ -557,20 +560,11 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ /* Copied from L.ImageOverlay */ this._map = map; - // this._div = $(this._pane).append($("
")); if (!this._image) { this._initImage(); } if (!this._events) { this._initEvents(); } map._panes.overlayPane.appendChild(this._image); - // TODO: remove completely - // if (!this._divNode) { - // this._divNode = document.createElement("div"); - // // this._divNode = divNode; - // this._divNode.setAttribute("id", "holding"); - // map._panes.overlayPane.appendChild(this._divNode); - // } - map.on('viewreset', this._reset, this); /* End copied from L.ImageOverlay */ @@ -581,6 +575,8 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ map.on('zoomanim', this._animateZoom, this); } + window.overlay = this; + /* This reset happens before image load; it allows * us to place the image on the map earlier with * "guessed" dimensions. */ @@ -824,15 +820,9 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ -L.DistortableCollection = L.FeatureGroup.extend({ - // DistortableImage.Edit events are automatically propogated to the feature group - -// initialize: function () { -// L.featureGroup.prototype.initialize.call(this); - -// }, +L.DistortableCollection = L.FeatureGroup.extend({ _getSelectedImages: function () { return this.getLayers(); @@ -1085,6 +1075,8 @@ L.DistortableImage.Edit = L.Handler.extend({ /* Interaction modes. */ this._mode = this._overlay.options.mode || 'distort'; + this._group = this._overlay.options.group; + window._group = this._group; this._transparent = false; this._outlined = false; }, @@ -1223,9 +1215,10 @@ L.DistortableImage.Edit = L.Handler.extend({ i; if (!this.isSelected(overlay)) { return; } - if (window.imagesFeatureGroup._getSelectedImages().length <= 1) { return; } + // if (!(this._group instanceof L.DistortableCollection)) { return; } + if (this._group._getSelectedImages().length <= 1) { return; } - window.imagesFeatureGroup.eachLayer(function (layer) { + this._group.eachLayer(function (layer) { for (i = 0; i < 4; i++) { if (layer !== overlay) { layer.editing._hideToolbar(); } layer._dragStartPoints[i] = layer._map.latLngToLayerPoint(layer.getCorners()[i]); @@ -1233,7 +1226,6 @@ L.DistortableImage.Edit = L.Handler.extend({ }); overlay._cornerPointDelta = {}; - }, _dragMultiple: function() { @@ -1242,7 +1234,7 @@ L.DistortableImage.Edit = L.Handler.extend({ i; if (!this.isSelected(overlay)) { return; } - if (window.imagesFeatureGroup._getSelectedImages().length <= 1) { return; } + if (this._group._getSelectedImages().length <= 1) { return; } overlay._dragPoints = {}; @@ -1252,7 +1244,7 @@ L.DistortableImage.Edit = L.Handler.extend({ var cornerPointDelta = overlay._calcCornerPointDelta(); - window.imagesFeatureGroup._updateCollectionFromPoints(cornerPointDelta, overlay); + this._group._updateCollectionFromPoints(cornerPointDelta, overlay); }, _enableDragging: function() { @@ -1413,31 +1405,35 @@ L.DistortableImage.Edit = L.Handler.extend({ _toggleSelections: function(event) { var overlay = this._overlay, + group = this._group, target = event.target, map = overlay._map; + if (!(group instanceof L.DistortableCollection) || this._mode === 'lock') { return; } + if (event.metaKey || event.ctrlKey) { L.DomUtil.toggleClass(target, 'selected'); } - + if (L.DomUtil.hasClass(target, 'selected')) { - window.imagesFeatureGroup.addLayer(overlay); + group.addLayer(overlay); } else { - window.imagesFeatureGroup.removeLayer(overlay); + group.removeLayer(overlay); overlay.addTo(map); overlay.editing.enable(); - // overlay._reset(); - // overlay.fire('update'); } }, // TODO: move this and similar collection methods into separate class? _removeSelections: function() { var overlay = this._overlay, + group = this._group, map = overlay._map; - window.imagesFeatureGroup.eachLayer(function(layer) { + if (!(group instanceof L.DistortableCollection) || this._mode === 'lock') { return; } + + group.eachLayer(function(layer) { L.DomUtil.removeClass(layer.getElement(), 'selected'); - window.imagesFeatureGroup.removeLayer(layer); + group.removeLayer(layer); layer.addTo(map); layer.editing.enable(); }); @@ -1556,7 +1552,6 @@ L.DistortableImageOverlay.addInitHook(function() { if (this.editing) { this.editing.disable(); } }); }); - L.Map.mergeOptions({ boxSelector: true, boxZoom: false }); L.Map.BoxSelectHandle = L.Map.BoxZoom.extend({ diff --git a/examples/select.html b/examples/select.html index 9f7ac2bf9..26d7bedbe 100644 --- a/examples/select.html +++ b/examples/select.html @@ -68,6 +68,9 @@ if (this.editing._mode != "lock") e.stopPropagation() } + var imagesFeatureGroup = new L.DistortableCollection().addTo(map); + // window.imagesFeatureGroup = imagesFeatureGroup; + // create an image img = new L.DistortableImageOverlay( 'example.png', { @@ -77,7 +80,8 @@ new L.latLng(51.50,-0.10), new L.latLng(51.50,-0.14) ], - mode: 'lock' + mode: 'lock', + group: imagesFeatureGroup } ).addTo(map); images.push(img) @@ -91,12 +95,13 @@ new L.latLng(51.51,-0.14), new L.latLng(51.49,-0.11), new L.latLng(51.49,-0.15) - ] + ], + group: imagesFeatureGroup } ).addTo(map); - var imagesFeatureGroup = new L.DistortableCollection().addTo(map); - window.imagesFeatureGroup = imagesFeatureGroup; + // var imagesFeatureGroup = new L.DistortableCollection().addTo(map); + // window.imagesFeatureGroup = imagesFeatureGroup; images.push(img2); diff --git a/src/DistortableCollection.js b/src/DistortableCollection.js index 3887f3f73..36f0eef21 100644 --- a/src/DistortableCollection.js +++ b/src/DistortableCollection.js @@ -1,13 +1,5 @@ L.DistortableCollection = L.FeatureGroup.extend({ - // DistortableImage.Edit events are automatically propogated to the feature group - -// initialize: function () { - -// L.featureGroup.prototype.initialize.call(this); - -// }, - _getSelectedImages: function () { return this.getLayers(); }, diff --git a/src/DistortableImageOverlay.js b/src/DistortableImageOverlay.js index 687eae357..29c954b56 100644 --- a/src/DistortableImageOverlay.js +++ b/src/DistortableImageOverlay.js @@ -4,7 +4,8 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ options: { alt: '', height: 200, - crossOrigin: true + crossOrigin: true, + group: '' }, initialize: function(url, options) { @@ -19,20 +20,11 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ /* Copied from L.ImageOverlay */ this._map = map; - // this._div = $(this._pane).append($("
")); if (!this._image) { this._initImage(); } if (!this._events) { this._initEvents(); } map._panes.overlayPane.appendChild(this._image); - // TODO: remove completely - // if (!this._divNode) { - // this._divNode = document.createElement("div"); - // // this._divNode = divNode; - // this._divNode.setAttribute("id", "holding"); - // map._panes.overlayPane.appendChild(this._divNode); - // } - map.on('viewreset', this._reset, this); /* End copied from L.ImageOverlay */ @@ -43,6 +35,8 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ map.on('zoomanim', this._animateZoom, this); } + window.overlay = this; + /* This reset happens before image load; it allows * us to place the image on the map earlier with * "guessed" dimensions. */ @@ -285,3 +279,5 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ }); + + diff --git a/src/edit/DistortableImage.Edit.js b/src/edit/DistortableImage.Edit.js index 32ab835f7..acb3cb8c5 100644 --- a/src/edit/DistortableImage.Edit.js +++ b/src/edit/DistortableImage.Edit.js @@ -29,6 +29,8 @@ L.DistortableImage.Edit = L.Handler.extend({ /* Interaction modes. */ this._mode = this._overlay.options.mode || 'distort'; + this._group = this._overlay.options.group; + window._group = this._group; this._transparent = false; this._outlined = false; }, @@ -167,9 +169,10 @@ L.DistortableImage.Edit = L.Handler.extend({ i; if (!this.isSelected(overlay)) { return; } - if (window.imagesFeatureGroup._getSelectedImages().length <= 1) { return; } + // if (!(this._group instanceof L.DistortableCollection)) { return; } + if (this._group._getSelectedImages().length <= 1) { return; } - window.imagesFeatureGroup.eachLayer(function (layer) { + this._group.eachLayer(function (layer) { for (i = 0; i < 4; i++) { if (layer !== overlay) { layer.editing._hideToolbar(); } layer._dragStartPoints[i] = layer._map.latLngToLayerPoint(layer.getCorners()[i]); @@ -177,7 +180,6 @@ L.DistortableImage.Edit = L.Handler.extend({ }); overlay._cornerPointDelta = {}; - }, _dragMultiple: function() { @@ -186,7 +188,7 @@ L.DistortableImage.Edit = L.Handler.extend({ i; if (!this.isSelected(overlay)) { return; } - if (window.imagesFeatureGroup._getSelectedImages().length <= 1) { return; } + if (this._group._getSelectedImages().length <= 1) { return; } overlay._dragPoints = {}; @@ -196,7 +198,7 @@ L.DistortableImage.Edit = L.Handler.extend({ var cornerPointDelta = overlay._calcCornerPointDelta(); - window.imagesFeatureGroup._updateCollectionFromPoints(cornerPointDelta, overlay); + this._group._updateCollectionFromPoints(cornerPointDelta, overlay); }, _enableDragging: function() { @@ -357,31 +359,35 @@ L.DistortableImage.Edit = L.Handler.extend({ _toggleSelections: function(event) { var overlay = this._overlay, + group = this._group, target = event.target, map = overlay._map; + if (!(group instanceof L.DistortableCollection) || this._mode === 'lock') { return; } + if (event.metaKey || event.ctrlKey) { L.DomUtil.toggleClass(target, 'selected'); } - + if (L.DomUtil.hasClass(target, 'selected')) { - window.imagesFeatureGroup.addLayer(overlay); + group.addLayer(overlay); } else { - window.imagesFeatureGroup.removeLayer(overlay); + group.removeLayer(overlay); overlay.addTo(map); overlay.editing.enable(); - // overlay._reset(); - // overlay.fire('update'); } }, // TODO: move this and similar collection methods into separate class? _removeSelections: function() { var overlay = this._overlay, + group = this._group, map = overlay._map; - window.imagesFeatureGroup.eachLayer(function(layer) { + if (!(group instanceof L.DistortableCollection) || this._mode === 'lock') { return; } + + group.eachLayer(function(layer) { L.DomUtil.removeClass(layer.getElement(), 'selected'); - window.imagesFeatureGroup.removeLayer(layer); + group.removeLayer(layer); layer.addTo(map); layer.editing.enable(); }); @@ -499,4 +505,4 @@ L.DistortableImageOverlay.addInitHook(function() { this.on('remove', function () { if (this.editing) { this.editing.disable(); } }); -}); +}); \ No newline at end of file diff --git a/src/edit/LockHandle.js b/src/edit/LockHandle.js index 66383d22c..cfbba719e 100644 --- a/src/edit/LockHandle.js +++ b/src/edit/LockHandle.js @@ -13,7 +13,9 @@ L.LockHandle = L.EditHandle.extend({ }, updateHandle: function() { + window.this = this; this.setLatLng(this._handled._corners[this._corner]); + L.DomUtil.removeClass(this._handled.getElement(), 'selected'); } }); From ed97ed9ae5fad1e2f7f693be1361880f497ca0bd Mon Sep 17 00:00:00 2001 From: sashadev-sky Date: Tue, 19 Mar 2019 06:09:40 -0400 Subject: [PATCH 25/63] Work on fixing bug with rotation and scale --- dist/leaflet.distortableimage.js | 31 +++++-------------------------- examples/select.html | 3 --- src/DistortableCollection.js | 23 +---------------------- src/edit/DistortableImage.Edit.js | 4 ++-- src/edit/LockHandle.js | 1 - src/edit/RotateAndScaleHandle.js | 3 ++- 6 files changed, 10 insertions(+), 55 deletions(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index 2fa6cf228..76b86cf78 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -304,7 +304,6 @@ L.LockHandle = L.EditHandle.extend({ }, updateHandle: function() { - window.this = this; this.setLatLng(this._handled._corners[this._corner]); L.DomUtil.removeClass(this._handled.getElement(), 'selected'); } @@ -350,8 +349,9 @@ L.RotateAndScaleHandle = L.EditHandle.extend({ angle = this._calculateAngle(formerLatLng, newLatLng), scale = this._calculateScalingFactor(formerLatLng, newLatLng); + overlay.editing._hideToolbar(); + overlay.editing._rotateBy(angle); - overlay.editing._scaleBy(scale); /* checks whether the "edgeMinWidth" property is set and tracks the minimum edge length; @@ -860,28 +860,7 @@ L.DistortableCollection = L.FeatureGroup.extend({ layer.fire('update'); }); }, - -// _toggleSelections: function (event) { -// var overlay = this._overlay, -// target = event.target, -// map = overlay._map; - -// if (event.metaKey || event.ctrlKey) { -// // TODO: make a toggleClass DOM Util method -// $(target).toggleClass('selected'); -// } - -// if (L.DomUtil.hasClass(target, 'selected')) { -// window.imagesFeatureGroup.addLayer(overlay); -// } else { -// window.imagesFeatureGroup.removeLayer(overlay); -// // window.overlay = overlay; -// overlay.addTo(map); -// overlay.editing.enable(); -// // overlay._reset(); -// // overlay.fire('update'); -// } -// }, + }); L.DistortableImage = L.DistortableImage || {}; @@ -1076,7 +1055,7 @@ L.DistortableImage.Edit = L.Handler.extend({ /* Interaction modes. */ this._mode = this._overlay.options.mode || 'distort'; this._group = this._overlay.options.group; - window._group = this._group; + // window._group = this._group; this._transparent = false; this._outlined = false; }, @@ -1423,7 +1402,7 @@ L.DistortableImage.Edit = L.Handler.extend({ overlay.editing.enable(); } }, - // TODO: move this and similar collection methods into separate class? + _removeSelections: function() { var overlay = this._overlay, group = this._group, diff --git a/examples/select.html b/examples/select.html index 26d7bedbe..f6ef75e74 100644 --- a/examples/select.html +++ b/examples/select.html @@ -100,9 +100,6 @@ } ).addTo(map); - // var imagesFeatureGroup = new L.DistortableCollection().addTo(map); - // window.imagesFeatureGroup = imagesFeatureGroup; - images.push(img2); window.img = img; diff --git a/src/DistortableCollection.js b/src/DistortableCollection.js index 36f0eef21..14bd4ac81 100644 --- a/src/DistortableCollection.js +++ b/src/DistortableCollection.js @@ -36,26 +36,5 @@ L.DistortableCollection = L.FeatureGroup.extend({ layer.fire('update'); }); }, - -// _toggleSelections: function (event) { -// var overlay = this._overlay, -// target = event.target, -// map = overlay._map; - -// if (event.metaKey || event.ctrlKey) { -// // TODO: make a toggleClass DOM Util method -// $(target).toggleClass('selected'); -// } - -// if (L.DomUtil.hasClass(target, 'selected')) { -// window.imagesFeatureGroup.addLayer(overlay); -// } else { -// window.imagesFeatureGroup.removeLayer(overlay); -// // window.overlay = overlay; -// overlay.addTo(map); -// overlay.editing.enable(); -// // overlay._reset(); -// // overlay.fire('update'); -// } -// }, + }); \ No newline at end of file diff --git a/src/edit/DistortableImage.Edit.js b/src/edit/DistortableImage.Edit.js index acb3cb8c5..e16914994 100644 --- a/src/edit/DistortableImage.Edit.js +++ b/src/edit/DistortableImage.Edit.js @@ -30,7 +30,7 @@ L.DistortableImage.Edit = L.Handler.extend({ /* Interaction modes. */ this._mode = this._overlay.options.mode || 'distort'; this._group = this._overlay.options.group; - window._group = this._group; + // window._group = this._group; this._transparent = false; this._outlined = false; }, @@ -377,7 +377,7 @@ L.DistortableImage.Edit = L.Handler.extend({ overlay.editing.enable(); } }, - // TODO: move this and similar collection methods into separate class? + _removeSelections: function() { var overlay = this._overlay, group = this._group, diff --git a/src/edit/LockHandle.js b/src/edit/LockHandle.js index cfbba719e..352e07c0f 100644 --- a/src/edit/LockHandle.js +++ b/src/edit/LockHandle.js @@ -13,7 +13,6 @@ L.LockHandle = L.EditHandle.extend({ }, updateHandle: function() { - window.this = this; this.setLatLng(this._handled._corners[this._corner]); L.DomUtil.removeClass(this._handled.getElement(), 'selected'); } diff --git a/src/edit/RotateAndScaleHandle.js b/src/edit/RotateAndScaleHandle.js index 20b5e0350..52cac50d3 100644 --- a/src/edit/RotateAndScaleHandle.js +++ b/src/edit/RotateAndScaleHandle.js @@ -16,8 +16,9 @@ L.RotateAndScaleHandle = L.EditHandle.extend({ angle = this._calculateAngle(formerLatLng, newLatLng), scale = this._calculateScalingFactor(formerLatLng, newLatLng); + overlay.editing._hideToolbar(); + overlay.editing._rotateBy(angle); - overlay.editing._scaleBy(scale); /* checks whether the "edgeMinWidth" property is set and tracks the minimum edge length; From 892a1092ec403cca2e67317e2276ede0083f36a7 Mon Sep 17 00:00:00 2001 From: sashadev-sky Date: Tue, 19 Mar 2019 10:55:39 -0400 Subject: [PATCH 26/63] Set edgeMinWidth and edgeMinHeight for scaling --- dist/leaflet.distortableimage.js | 21 +++++++++++++++------ examples/select.html | 10 ++++++++-- src/DistortableImageOverlay.js | 3 ++- src/edit/EditHandle.js | 4 ++++ src/edit/RotateAndScaleHandle.js | 9 ++++++--- src/edit/RotateHandle.js | 5 +++-- 6 files changed, 38 insertions(+), 14 deletions(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index 76b86cf78..b6f5677dd 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -219,6 +219,10 @@ L.EXIF = function getEXIFdata(img) { }; L.EditHandle = L.Marker.extend({ + options: { + edgeMinWidth: 500 + }, + initialize: function(overlay, corner, options) { var markerOptions, latlng = overlay._corners[corner]; @@ -357,6 +361,10 @@ L.RotateAndScaleHandle = L.EditHandle.extend({ checks whether the "edgeMinWidth" property is set and tracks the minimum edge length; this enables preventing scaling to zero, but we might also add an overall scale limit */ + + // window.scale = scale; + // window.handled = this._handled; + if (this._handled.options.hasOwnProperty('edgeMinWidth')){ var edgeMinWidth = this._handled.options.edgeMinWidth, w = L.latLng(overlay._corners[0]).distanceTo(overlay._corners[1]), @@ -364,11 +372,10 @@ L.RotateAndScaleHandle = L.EditHandle.extend({ if ((w > edgeMinWidth && h > edgeMinWidth) || scale > 1) { overlay.editing._scaleBy(scale); } - } else { - overlay.editing._scaleBy(scale); - } + } overlay.fire('update'); + }, updateHandle: function() { @@ -421,14 +428,15 @@ L.RotateHandle = L.EditHandle.extend({ iconAnchor: [16, 16]} ) }, - + _onHandleDrag: function() { var overlay = this._handled, formerLatLng = this._handled._corners[this._corner], newLatLng = this.getLatLng(), - angle = this._calculateAngle(formerLatLng, newLatLng); + overlay.editing._hideToolbar(); + overlay.editing._rotateBy(angle); overlay.fire('update'); @@ -545,7 +553,8 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ alt: '', height: 200, crossOrigin: true, - group: '' + group: '', + edgeMinWidth: 500 }, initialize: function(url, options) { diff --git a/examples/select.html b/examples/select.html index f6ef75e74..b898f7021 100644 --- a/examples/select.html +++ b/examples/select.html @@ -81,7 +81,10 @@ new L.latLng(51.50,-0.14) ], mode: 'lock', - group: imagesFeatureGroup + group: imagesFeatureGroup, + // HARDCODED: we should find the img w/h dynamically so that it fits the image each time. + edgeMinWidth: 521, + edgeMinHeight: 521, } ).addTo(map); images.push(img) @@ -96,7 +99,10 @@ new L.latLng(51.49,-0.11), new L.latLng(51.49,-0.15) ], - group: imagesFeatureGroup + group: imagesFeatureGroup, + // HARDCODED: we should find the img w/h dynamically so that it fits the image each time. + edgeMinWidth: 521, + edgeMinHeight: 521 } ).addTo(map); diff --git a/src/DistortableImageOverlay.js b/src/DistortableImageOverlay.js index 29c954b56..5a679bd5e 100644 --- a/src/DistortableImageOverlay.js +++ b/src/DistortableImageOverlay.js @@ -5,7 +5,8 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ alt: '', height: 200, crossOrigin: true, - group: '' + group: '', + edgeMinWidth: 500 }, initialize: function(url, options) { diff --git a/src/edit/EditHandle.js b/src/edit/EditHandle.js index 4d7dc03e5..47e4a4542 100644 --- a/src/edit/EditHandle.js +++ b/src/edit/EditHandle.js @@ -1,4 +1,8 @@ L.EditHandle = L.Marker.extend({ + options: { + edgeMinWidth: 500 + }, + initialize: function(overlay, corner, options) { var markerOptions, latlng = overlay._corners[corner]; diff --git a/src/edit/RotateAndScaleHandle.js b/src/edit/RotateAndScaleHandle.js index 52cac50d3..3279e1b8e 100644 --- a/src/edit/RotateAndScaleHandle.js +++ b/src/edit/RotateAndScaleHandle.js @@ -24,6 +24,10 @@ L.RotateAndScaleHandle = L.EditHandle.extend({ checks whether the "edgeMinWidth" property is set and tracks the minimum edge length; this enables preventing scaling to zero, but we might also add an overall scale limit */ + + // window.scale = scale; + // window.handled = this._handled; + if (this._handled.options.hasOwnProperty('edgeMinWidth')){ var edgeMinWidth = this._handled.options.edgeMinWidth, w = L.latLng(overlay._corners[0]).distanceTo(overlay._corners[1]), @@ -31,11 +35,10 @@ L.RotateAndScaleHandle = L.EditHandle.extend({ if ((w > edgeMinWidth && h > edgeMinWidth) || scale > 1) { overlay.editing._scaleBy(scale); } - } else { - overlay.editing._scaleBy(scale); - } + } overlay.fire('update'); + }, updateHandle: function() { diff --git a/src/edit/RotateHandle.js b/src/edit/RotateHandle.js index 3b6fde6e7..f3edafb29 100644 --- a/src/edit/RotateHandle.js +++ b/src/edit/RotateHandle.js @@ -7,14 +7,15 @@ L.RotateHandle = L.EditHandle.extend({ iconAnchor: [16, 16]} ) }, - + _onHandleDrag: function() { var overlay = this._handled, formerLatLng = this._handled._corners[this._corner], newLatLng = this.getLatLng(), - angle = this._calculateAngle(formerLatLng, newLatLng); + overlay.editing._hideToolbar(); + overlay.editing._rotateBy(angle); overlay.fire('update'); From 2b11ed5d35ac24969fb21301040d2c03b43758e8 Mon Sep 17 00:00:00 2001 From: sashadev-sky Date: Tue, 19 Mar 2019 11:08:31 -0400 Subject: [PATCH 27/63] Add removeHooks for new event listeners --- dist/leaflet.distortableimage.js | 8 ++++++++ src/edit/DistortableImage.Edit.js | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index b6f5677dd..44fefe4a8 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -1139,8 +1139,16 @@ L.DistortableImage.Edit = L.Handler.extend({ var overlay = this._overlay, map = overlay._map; + L.DomEvent.off(map, 'click', this._removeSelections, this); + + L.DomEvent.off(overlay, 'dragstart', this._dragStartMultiple, this); + + L.DomEvent.off(overlay, 'drag', this._dragMultiple, this); + L.DomEvent.off(overlay._image, 'click', this._showToolbar, this); + L.DomEvent.off(overlay._image, 'mousedown', this._toggleSelections, this); + // First, check if dragging exists; // it may be off due to locking if (this.dragging) { this.dragging.disable(); } diff --git a/src/edit/DistortableImage.Edit.js b/src/edit/DistortableImage.Edit.js index e16914994..3f4bd209b 100644 --- a/src/edit/DistortableImage.Edit.js +++ b/src/edit/DistortableImage.Edit.js @@ -105,8 +105,16 @@ L.DistortableImage.Edit = L.Handler.extend({ var overlay = this._overlay, map = overlay._map; + L.DomEvent.off(map, 'click', this._removeSelections, this); + + L.DomEvent.off(overlay, 'dragstart', this._dragStartMultiple, this); + + L.DomEvent.off(overlay, 'drag', this._dragMultiple, this); + L.DomEvent.off(overlay._image, 'click', this._showToolbar, this); + L.DomEvent.off(overlay._image, 'mousedown', this._toggleSelections, this); + // First, check if dragging exists; // it may be off due to locking if (this.dragging) { this.dragging.disable(); } From 1b5744330e61502489d27d466f2831d43b2f5ed6 Mon Sep 17 00:00:00 2001 From: sashadev-sky Date: Tue, 19 Mar 2019 12:22:10 -0400 Subject: [PATCH 28/63] Remove toolbar on image delete --- dist/leaflet.distortableimage.js | 10 ++++++---- examples/select.html | 30 +++++++----------------------- src/edit/DistortableImage.Edit.js | 7 ++++++- src/edit/EditHandle.js | 3 --- 4 files changed, 19 insertions(+), 31 deletions(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index 44fefe4a8..200725a82 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -219,9 +219,6 @@ L.EXIF = function getEXIFdata(img) { }; L.EditHandle = L.Marker.extend({ - options: { - edgeMinWidth: 500 - }, initialize: function(overlay, corner, options) { var markerOptions, @@ -1154,6 +1151,10 @@ L.DistortableImage.Edit = L.Handler.extend({ if (this.dragging) { this.dragging.disable(); } delete this.dragging; + if (this.toolbar) { this._hideToolbar(); } + + if (this.editing) { this.editing.disable(); } + map.removeLayer(this._handles[this._mode]); /* Disable hotkeys. */ @@ -1425,7 +1426,7 @@ L.DistortableImage.Edit = L.Handler.extend({ group = this._group, map = overlay._map; - if (!(group instanceof L.DistortableCollection) || this._mode === 'lock') { return; } + if (!(group instanceof L.DistortableCollection)) { return; } group.eachLayer(function(layer) { L.DomUtil.removeClass(layer.getElement(), 'selected'); @@ -1442,6 +1443,7 @@ L.DistortableImage.Edit = L.Handler.extend({ if (this._mode !== "lock") { var choice = this.confirmDelete(); if (choice) { + this._hideToolbar(); overlay._map.removeLayer(overlay); overlay.fire('delete'); this.disable(); diff --git a/examples/select.html b/examples/select.html index b898f7021..192335160 100644 --- a/examples/select.html +++ b/examples/select.html @@ -49,24 +49,12 @@ id: 'examples.map-i86knfo3' }).addTo(map); - images = [] - select = function(e){ - for (var i in images) { - img = this - if (img._leaflet_id != images[i]._leaflet_id) { + // images = [] + // for (var i in images) { + // img = this + // if (img._leaflet_id != images[i]._leaflet_id) { /* Deselect (disable) other images */ // images[i].editing.disable() - /* Ensure that other toolbars are removed */ - if (images[i].editing.toolbar) { - map.removeLayer(images[i].editing.toolbar); - } - } - } - /* Ensure this is enabled */ - this.editing.enable() - /* If it's locked, allow event to propagate on to map below */ - if (this.editing._mode != "lock") e.stopPropagation() - } var imagesFeatureGroup = new L.DistortableCollection().addTo(map); // window.imagesFeatureGroup = imagesFeatureGroup; @@ -84,10 +72,10 @@ group: imagesFeatureGroup, // HARDCODED: we should find the img w/h dynamically so that it fits the image each time. edgeMinWidth: 521, - edgeMinHeight: 521, + edgeMinHeight: 348, } ).addTo(map); - images.push(img) + // images.push(img) // L.DomEvent.on(img._image, 'click', select, img); // create a second image @@ -102,17 +90,13 @@ group: imagesFeatureGroup, // HARDCODED: we should find the img w/h dynamically so that it fits the image each time. edgeMinWidth: 521, - edgeMinHeight: 521 + edgeMinHeight: 348 } ).addTo(map); - images.push(img2); - window.img = img; window.img2 = img2; - // L.DomEvent.on(img2._image, 'click', select, img2); - L.DomEvent.on(img._image, 'load', img.editing.enable, img.editing); L.DomEvent.on(img2._image, 'load', img2.editing.enable, img2.editing); // L.DomEvent.on(layer2._image, 'load', layer2.editing.enable, layer2.editing); diff --git a/src/edit/DistortableImage.Edit.js b/src/edit/DistortableImage.Edit.js index 3f4bd209b..d88d5d988 100644 --- a/src/edit/DistortableImage.Edit.js +++ b/src/edit/DistortableImage.Edit.js @@ -120,6 +120,10 @@ L.DistortableImage.Edit = L.Handler.extend({ if (this.dragging) { this.dragging.disable(); } delete this.dragging; + if (this.toolbar) { this._hideToolbar(); } + + if (this.editing) { this.editing.disable(); } + map.removeLayer(this._handles[this._mode]); /* Disable hotkeys. */ @@ -391,7 +395,7 @@ L.DistortableImage.Edit = L.Handler.extend({ group = this._group, map = overlay._map; - if (!(group instanceof L.DistortableCollection) || this._mode === 'lock') { return; } + if (!(group instanceof L.DistortableCollection)) { return; } group.eachLayer(function(layer) { L.DomUtil.removeClass(layer.getElement(), 'selected'); @@ -408,6 +412,7 @@ L.DistortableImage.Edit = L.Handler.extend({ if (this._mode !== "lock") { var choice = this.confirmDelete(); if (choice) { + this._hideToolbar(); overlay._map.removeLayer(overlay); overlay.fire('delete'); this.disable(); diff --git a/src/edit/EditHandle.js b/src/edit/EditHandle.js index 47e4a4542..0f9bd1bf3 100644 --- a/src/edit/EditHandle.js +++ b/src/edit/EditHandle.js @@ -1,7 +1,4 @@ L.EditHandle = L.Marker.extend({ - options: { - edgeMinWidth: 500 - }, initialize: function(overlay, corner, options) { var markerOptions, From 4b89e72f151f7edbeea9d2f4652ac37ea32cf6a3 Mon Sep 17 00:00:00 2001 From: sashadev-sky Date: Wed, 20 Mar 2019 06:55:58 -0400 Subject: [PATCH 29/63] Attempt to encapsulate state in collection class --- dist/leaflet.distortableimage.js | 83 ++++++++++++++++++++------- examples/select.html | 93 ++++++++++++++++--------------- src/DistortableCollection.js | 45 +++++++++++++++ src/edit/DistortableImage.Edit.js | 44 +++++++-------- 4 files changed, 178 insertions(+), 87 deletions(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index 200725a82..eda9bd462 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -829,11 +829,56 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ L.DistortableCollection = L.FeatureGroup.extend({ + include: L.Mixin.Events, + + + // TODO: do feature groups only allow for click event groupings. do other events just not propogate + onAdd: function (map) { + L.FeatureGroup.prototype.onAdd.call(this, map); + + this._map = map; + this.eachLayer(function(layer) { + L.DomEvent.on(layer._image, 'mousedown', this._toggleSelections); + }, this); + + }, + + onRemove: function(map) { + window.mapp = map; + // this.eachLayer(function (layer) { + // layer.on(this, 'mousedown', this._toggleSelections); + // }); + // this.eachLayer(function (layer) { + // this.on('mousedown', this._toggleSelections); + // }); + // L.DomEvent.off(this, 'mousedown', this._toggleSelections); + // L.DomEvent.on(this, 'mousedown', this._toggleSelections); + }, _getSelectedImages: function () { return this.getLayers(); }, + _toggleSelections: function (event) { + window.prompt("you made it"); + window.ttarget = event; + // map = overlay._map; + + // if (!(group instanceof L.DistortableCollection) || this._mode === 'lock') { return; } + + // if (event.metaKey || event.ctrlKey) { + // L.DomUtil.toggleClass(target, 'selected'); + // } + + // if (L.DomUtil.hasClass(target, 'selected')) { + // group.addLayer(overlay); + // } else { + // group.removeLayer(overlay); + // overlay.addTo(map); + // overlay.editing.enable(); + // } + }, + /** * images in 'lock' mode are included in this feature group collection for functionalities * such as export, but are filtered out for editing / dragging here @@ -1122,7 +1167,7 @@ L.DistortableImage.Edit = L.Handler.extend({ //overlay.on('click', this._showToolbar, this); L.DomEvent.on(overlay._image, 'click', this._showToolbar, this); - L.DomEvent.on(overlay._image, 'mousedown', this._toggleSelections, this); + // L.DomEvent.on(overlay._image, 'mousedown', this._toggleSelections); /* Enable hotkeys. */ L.DomEvent.on(window, 'keydown', this._onKeyDown, this); @@ -1144,7 +1189,7 @@ L.DistortableImage.Edit = L.Handler.extend({ L.DomEvent.off(overlay._image, 'click', this._showToolbar, this); - L.DomEvent.off(overlay._image, 'mousedown', this._toggleSelections, this); + // L.DomEvent.off(overlay._image, 'mousedown', this._toggleSelections, this); // First, check if dragging exists; // it may be off due to locking @@ -1400,26 +1445,26 @@ L.DistortableImage.Edit = L.Handler.extend({ L.DomEvent.stopPropagation(event); }, - _toggleSelections: function(event) { - var overlay = this._overlay, - group = this._group, - target = event.target, - map = overlay._map; + // _toggleSelections: function(event) { + // var overlay = this._overlay, + // group = this._group, + // target = event.target, + // map = overlay._map; - if (!(group instanceof L.DistortableCollection) || this._mode === 'lock') { return; } + // if (this._mode === 'lock') { return; } - if (event.metaKey || event.ctrlKey) { - L.DomUtil.toggleClass(target, 'selected'); - } + // if (event.metaKey || event.ctrlKey) { + // L.DomUtil.toggleClass(target, 'selected'); + // } - if (L.DomUtil.hasClass(target, 'selected')) { - group.addLayer(overlay); - } else { - group.removeLayer(overlay); - overlay.addTo(map); - overlay.editing.enable(); - } - }, + // if (L.DomUtil.hasClass(target, 'selected')) { + // group.addLayer(overlay); + // } else { + // group.removeLayer(overlay); + // overlay.addTo(map); + // overlay.editing.enable(); + // } + // }, _removeSelections: function() { var overlay = this._overlay, diff --git a/examples/select.html b/examples/select.html index 192335160..084bc9b74 100644 --- a/examples/select.html +++ b/examples/select.html @@ -56,54 +56,55 @@ /* Deselect (disable) other images */ // images[i].editing.disable() - var imagesFeatureGroup = new L.DistortableCollection().addTo(map); + // var imagesFeatureGroup = new L.DistortableCollection().addTo(map); // window.imagesFeatureGroup = imagesFeatureGroup; - - // create an image - img = new L.DistortableImageOverlay( - 'example.png', { - corners: [ - new L.latLng(51.52,-0.10), - new L.latLng(51.52,-0.14), - new L.latLng(51.50,-0.10), - new L.latLng(51.50,-0.14) - ], - mode: 'lock', - group: imagesFeatureGroup, - // HARDCODED: we should find the img w/h dynamically so that it fits the image each time. - edgeMinWidth: 521, - edgeMinHeight: 348, - } - ).addTo(map); - // images.push(img) - // L.DomEvent.on(img._image, 'click', select, img); - - // create a second image - img2 = new L.DistortableImageOverlay( - 'example.png', { - corners: [ - new L.latLng(51.51,-0.10), - new L.latLng(51.51,-0.14), - new L.latLng(51.49,-0.11), - new L.latLng(51.49,-0.15) - ], - group: imagesFeatureGroup, - // HARDCODED: we should find the img w/h dynamically so that it fits the image each time. - edgeMinWidth: 521, - edgeMinHeight: 348 - } - ).addTo(map); - - window.img = img; - window.img2 = img2; - - L.DomEvent.on(img._image, 'load', img.editing.enable, img.editing); - L.DomEvent.on(img2._image, 'load', img2.editing.enable, img2.editing); - // L.DomEvent.on(layer2._image, 'load', layer2.editing.enable, layer2.editing); - + map.whenReady(function() { + img = new L.DistortableImageOverlay( + 'example.png', { + corners: [ + new L.latLng(51.52,-0.10), + new L.latLng(51.52,-0.14), + new L.latLng(51.50,-0.10), + new L.latLng(51.50,-0.14) + ], + mode: 'lock', + group: imagesFeatureGroup, + // HARDCODED: we should find the img w/h dynamically so that it fits the image each time. + edgeMinWidth: 521, + edgeMinHeight: 348, + }).addTo(map); + // images.push(img) + // L.DomEvent.on(img._image, 'click', select, img); + + // create a second image + img2 = new L.DistortableImageOverlay( + 'example.png', { + corners: [ + new L.latLng(51.51,-0.10), + new L.latLng(51.51,-0.14), + new L.latLng(51.49,-0.11), + new L.latLng(51.49,-0.15) + ], + group: imagesFeatureGroup, + // HARDCODED: we should find the img w/h dynamically so that it fits the image each time. (initImageDimensions?) + edgeMinWidth: 521, + edgeMinHeight: 348 + }).addTo(map); + + L.DomEvent.on(img._image, 'load', img.editing.enable, img.editing); + L.DomEvent.on(img2._image, 'load', img2.editing.enable, img2.editing); + + var imagesFeatureGroup = new L.DistortableCollection([img, img2]).addTo(map); + // window.imagesFeatureGroup = imagesFeatureGroup; + // imagesFeatureGroup.addLayer(img); + + window.img = img; + window.img2 = img2; + + // L.DomEvent.on(layer2._image, 'load', layer2.editing.enable, layer2.editing); + }, this); })(); - - + diff --git a/src/DistortableCollection.js b/src/DistortableCollection.js index 14bd4ac81..24845bd20 100644 --- a/src/DistortableCollection.js +++ b/src/DistortableCollection.js @@ -1,9 +1,54 @@ L.DistortableCollection = L.FeatureGroup.extend({ + include: L.Mixin.Events, + + + // TODO: do feature groups only allow for click event groupings. do other events just not propogate + onAdd: function (map) { + L.FeatureGroup.prototype.onAdd.call(this, map); + + this._map = map; + this.eachLayer(function(layer) { + L.DomEvent.on(layer._image, 'mousedown', this._toggleSelections); + }, this); + + }, + + onRemove: function(map) { + window.mapp = map; + // this.eachLayer(function (layer) { + // layer.on(this, 'mousedown', this._toggleSelections); + // }); + // this.eachLayer(function (layer) { + // this.on('mousedown', this._toggleSelections); + // }); + // L.DomEvent.off(this, 'mousedown', this._toggleSelections); + // L.DomEvent.on(this, 'mousedown', this._toggleSelections); + }, _getSelectedImages: function () { return this.getLayers(); }, + _toggleSelections: function (event) { + window.prompt("you made it"); + window.ttarget = event; + // map = overlay._map; + + // if (!(group instanceof L.DistortableCollection) || this._mode === 'lock') { return; } + + // if (event.metaKey || event.ctrlKey) { + // L.DomUtil.toggleClass(target, 'selected'); + // } + + // if (L.DomUtil.hasClass(target, 'selected')) { + // group.addLayer(overlay); + // } else { + // group.removeLayer(overlay); + // overlay.addTo(map); + // overlay.editing.enable(); + // } + }, + /** * images in 'lock' mode are included in this feature group collection for functionalities * such as export, but are filtered out for editing / dragging here diff --git a/src/edit/DistortableImage.Edit.js b/src/edit/DistortableImage.Edit.js index d88d5d988..cda4fd93f 100644 --- a/src/edit/DistortableImage.Edit.js +++ b/src/edit/DistortableImage.Edit.js @@ -91,7 +91,7 @@ L.DistortableImage.Edit = L.Handler.extend({ //overlay.on('click', this._showToolbar, this); L.DomEvent.on(overlay._image, 'click', this._showToolbar, this); - L.DomEvent.on(overlay._image, 'mousedown', this._toggleSelections, this); + // L.DomEvent.on(overlay._image, 'mousedown', this._toggleSelections); /* Enable hotkeys. */ L.DomEvent.on(window, 'keydown', this._onKeyDown, this); @@ -113,7 +113,7 @@ L.DistortableImage.Edit = L.Handler.extend({ L.DomEvent.off(overlay._image, 'click', this._showToolbar, this); - L.DomEvent.off(overlay._image, 'mousedown', this._toggleSelections, this); + // L.DomEvent.off(overlay._image, 'mousedown', this._toggleSelections, this); // First, check if dragging exists; // it may be off due to locking @@ -369,26 +369,26 @@ L.DistortableImage.Edit = L.Handler.extend({ L.DomEvent.stopPropagation(event); }, - _toggleSelections: function(event) { - var overlay = this._overlay, - group = this._group, - target = event.target, - map = overlay._map; - - if (!(group instanceof L.DistortableCollection) || this._mode === 'lock') { return; } - - if (event.metaKey || event.ctrlKey) { - L.DomUtil.toggleClass(target, 'selected'); - } - - if (L.DomUtil.hasClass(target, 'selected')) { - group.addLayer(overlay); - } else { - group.removeLayer(overlay); - overlay.addTo(map); - overlay.editing.enable(); - } - }, + // _toggleSelections: function(event) { + // var overlay = this._overlay, + // group = this._group, + // target = event.target, + // map = overlay._map; + + // if (this._mode === 'lock') { return; } + + // if (event.metaKey || event.ctrlKey) { + // L.DomUtil.toggleClass(target, 'selected'); + // } + + // if (L.DomUtil.hasClass(target, 'selected')) { + // group.addLayer(overlay); + // } else { + // group.removeLayer(overlay); + // overlay.addTo(map); + // overlay.editing.enable(); + // } + // }, _removeSelections: function() { var overlay = this._overlay, From 5a4776f46ca414ba3dcd0ff3b6a024c4fbe0abcb Mon Sep 17 00:00:00 2001 From: sashadev-sky Date: Wed, 20 Mar 2019 07:17:26 -0400 Subject: [PATCH 30/63] Todos --- dist/leaflet.distortableimage.js | 25 ++++++++++++------------- src/DistortableCollection.js | 25 ++++++++++++------------- 2 files changed, 24 insertions(+), 26 deletions(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index eda9bd462..7ee804d4a 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -831,6 +831,8 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ L.DistortableCollection = L.FeatureGroup.extend({ include: L.Mixin.Events, + // TODO: save all essential image properties in an easily iterable object locally + // TODO: do feature groups only allow for click event groupings. do other events just not propogate onAdd: function (map) { @@ -838,21 +840,16 @@ L.DistortableCollection = L.FeatureGroup.extend({ this._map = map; this.eachLayer(function(layer) { - L.DomEvent.on(layer._image, 'mousedown', this._toggleSelections); + L.DomEvent.on(layer._image, 'mousedown', this._toggleSelections, this); }, this); }, - onRemove: function(map) { - window.mapp = map; - // this.eachLayer(function (layer) { - // layer.on(this, 'mousedown', this._toggleSelections); - // }); - // this.eachLayer(function (layer) { - // this.on('mousedown', this._toggleSelections); - // }); - // L.DomEvent.off(this, 'mousedown', this._toggleSelections); - // L.DomEvent.on(this, 'mousedown', this._toggleSelections); + onRemove: function() { + // window.map = map; + this.eachLayer(function (layer) { + L.DomEvent.on(layer._image, 'mousedown', this._toggleSelections, this); + }, this); }, _getSelectedImages: function () { @@ -860,8 +857,10 @@ L.DistortableCollection = L.FeatureGroup.extend({ }, _toggleSelections: function (event) { - window.prompt("you made it"); - window.ttarget = event; + window.event = event; + var layer = event.layer; + window.layer = layer; + // map = overlay._map; // if (!(group instanceof L.DistortableCollection) || this._mode === 'lock') { return; } diff --git a/src/DistortableCollection.js b/src/DistortableCollection.js index 24845bd20..0a088be02 100644 --- a/src/DistortableCollection.js +++ b/src/DistortableCollection.js @@ -1,6 +1,8 @@ L.DistortableCollection = L.FeatureGroup.extend({ include: L.Mixin.Events, + // TODO: save all essential image properties in an easily iterable object locally + // TODO: do feature groups only allow for click event groupings. do other events just not propogate onAdd: function (map) { @@ -8,21 +10,16 @@ L.DistortableCollection = L.FeatureGroup.extend({ this._map = map; this.eachLayer(function(layer) { - L.DomEvent.on(layer._image, 'mousedown', this._toggleSelections); + L.DomEvent.on(layer._image, 'mousedown', this._toggleSelections, this); }, this); }, - onRemove: function(map) { - window.mapp = map; - // this.eachLayer(function (layer) { - // layer.on(this, 'mousedown', this._toggleSelections); - // }); - // this.eachLayer(function (layer) { - // this.on('mousedown', this._toggleSelections); - // }); - // L.DomEvent.off(this, 'mousedown', this._toggleSelections); - // L.DomEvent.on(this, 'mousedown', this._toggleSelections); + onRemove: function() { + // window.map = map; + this.eachLayer(function (layer) { + L.DomEvent.on(layer._image, 'mousedown', this._toggleSelections, this); + }, this); }, _getSelectedImages: function () { @@ -30,8 +27,10 @@ L.DistortableCollection = L.FeatureGroup.extend({ }, _toggleSelections: function (event) { - window.prompt("you made it"); - window.ttarget = event; + window.event = event; + var layer = event.layer; + window.layer = layer; + // map = overlay._map; // if (!(group instanceof L.DistortableCollection) || this._mode === 'lock') { return; } From 888c8ad2ab631da80084e27db9ebb16737e08720 Mon Sep 17 00:00:00 2001 From: sashadev-sky Date: Thu, 21 Mar 2019 21:53:56 -0400 Subject: [PATCH 31/63] encapsulate all logic into DistortableCollection class --- dist/leaflet.distortableimage.js | 265 ++++++++++++++++++++---------- src/DistortableCollection.js | 145 +++++++++++++--- src/DistortableImageOverlay.js | 24 +-- src/edit/DistortableImage.Edit.js | 96 +++++------ 4 files changed, 362 insertions(+), 168 deletions(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index 7ee804d4a..f7fc222c2 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -694,16 +694,16 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ this._reset(); }, - _updateCornersFromPoints: function (pointsObj) { - var map = this._map; - var i = 0; - for (var k in pointsObj) { - this._corners[i] = map.layerPointToLatLng(pointsObj[k]); - i += 1; - } + // _updateCornersFromPoints: function (pointsObj) { + // var map = this._map; + // var i = 0; + // for (var k in pointsObj) { + // this._corners[i] = map.layerPointToLatLng(pointsObj[k]); + // i += 1; + // } - this._reset(); - }, + // this._reset(); + // }, /* Copied from Leaflet v0.7 https://github.com/Leaflet/Leaflet/blob/66282f14bcb180ec87d9818d9f3c9f75afd01b30/src/dom/DomUtil.js#L189-L199 */ /* since L.DomUtil.getTranslateString() is deprecated in Leaflet v1.0 */ @@ -789,9 +789,9 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ }, // Use for translation calculations - for translation the delta for 1 corner applies to all 4 - _calcCornerPointDelta: function () { - return this._dragStartPoints[0].subtract(this._dragPoints[0]); - }, + // _calcCornerPointDelta: function (layer) { + // return layer._dragStartPoints[0].subtract(layer._dragPoints[0]); + // }, _calculateProjectiveTransform: function(latLngToCartesian) { /* Setting reasonable but made-up image defaults @@ -839,43 +839,128 @@ L.DistortableCollection = L.FeatureGroup.extend({ L.FeatureGroup.prototype.onAdd.call(this, map); this._map = map; - this.eachLayer(function(layer) { - L.DomEvent.on(layer._image, 'mousedown', this._toggleSelections, this); - }, this); - + this._members = {}; + + window._members = this._members; + + L.DomEvent.on(map, 'layeradd', this._getFeatureGroupId, this); + L.DomEvent.on(map, 'click', this._removeSelections, this); + + }, onRemove: function() { + var map = this._map; + L.DomEvent.off(map, 'layeradd', this._getFeatureGroupId, this); + L.DomEvent.off(map, 'click', this._removeSelections, this); // window.map = map; - this.eachLayer(function (layer) { - L.DomEvent.on(layer._image, 'mousedown', this._toggleSelections, this); - }, this); + // this.eachLayer(function (layer) { + // L.DomEvent.on(layer._image, 'mousedown', this._toggleSelections, this); + // }, this); }, _getSelectedImages: function () { return this.getLayers(); }, - _toggleSelections: function (event) { - window.event = event; + _getFeatureGroupId: function (event) { + window.eventy = event; var layer = event.layer; - window.layer = layer; + window.layery = layer; + + if (event.layer instanceof L.DistortableCollection) { + this._id = this.getLayerId(event.layer); + } + + this.eachLayer(function(layer) { + this._members[this.getLayerId(layer)] = { + layer: layer, + mode: layer.editing._mode, + image: layer._image + }; + }, this); + + for (var k in this._members) { + L.DomEvent.on(this._members[k].image, "mousedown", this._toggleSelections, this); + L.DomEvent.on(this._members[k].layer, "drag", this._dragMultiple, this); + L.DomEvent.on(this._members[k].layer, 'dragstart', this._dragStartMultiple, this); + // L.DomEvent.on(this._map, 'click', this._removeSelections, this); + } + }, + + _dragMultiple: function (event) { + var layer = event.target, + map = this._map, + i; + + // var layer = this, + // map = this._map, + // i; + + window.eventT = event; + + // if (!this.isSelected(overlay)) { return; } + // if (this._group._getSelectedImages().length <= 1) { return; } + + layer._dragPoints = {}; + + for (i = 0; i < 4; i++) { + layer._dragPoints[i] = map.latLngToLayerPoint(layer.getCorners()[i]); + } + + layer._cornerPointDelta = this._calcCornerPointDelta(layer); + + this._updateCollectionFromPoints(layer._cornerPointDelta, layer); + }, + + _dragStartMultiple: function (event) { + var overlay = event.target, + i; + + // if (!this.isSelected(overlay)) { return; } + // if (!(this._group instanceof L.DistortableCollection)) { return; } + // if (this._group._getSelectedImages().length <= 1) { return; } + + this.eachLayer(function (layer) { + for (i = 0; i < 4; i++) { + if (layer !== overlay) { layer.editing._hideToolbar(); } + layer._dragStartPoints[i] = layer._map.latLngToLayerPoint(layer.getCorners()[i]); + } + }); + + overlay._cornerPointDelta = {}; + }, - // map = overlay._map; + _calcCornerPointDelta: function (layer) { + return layer._dragStartPoints[0].subtract(layer._dragPoints[0]); + }, - // if (!(group instanceof L.DistortableCollection) || this._mode === 'lock') { return; } + _toggleSelections: function (event) { + var target = event.target, + members = this._members, + member; + + for (var k in members) { + if (members[k].image === target) { + member = members[k]; + break; + } + } - // if (event.metaKey || event.ctrlKey) { - // L.DomUtil.toggleClass(target, 'selected'); - // } + if (member) { + if (member.mode === 'lock') { return; } + } - // if (L.DomUtil.hasClass(target, 'selected')) { - // group.addLayer(overlay); - // } else { - // group.removeLayer(overlay); - // overlay.addTo(map); - // overlay.editing.enable(); - // } + if (event.metaKey || event.ctrlKey) { + L.DomUtil.toggleClass(target, 'selected'); + } + }, + + _removeSelections: function () { + this.eachLayer(function (layer) { + L.DomUtil.removeClass(layer.getElement(), 'selected'); + if (layer.editing.toolbar) { layer.editing._hideToolbar(); } + }); }, /** @@ -886,6 +971,7 @@ L.DistortableCollection = L.FeatureGroup.extend({ var layersToMove = []; var transformation = new L.Transformation(1, -cornerPointDelta.x, 1, -cornerPointDelta.y); this.eachLayer(function (layer) { + window.layerrr = layer; if (layer !== overlay && layer.editing._mode !== 'lock') { layer._objD = {}; @@ -901,14 +987,25 @@ L.DistortableCollection = L.FeatureGroup.extend({ return layersToMove; }, + _updateCornersFromPoints: function (layer) { + var map = this._map; + var i = 0; + for (var k in layer._objD) { + layer._corners[i] = map.layerPointToLatLng(layer._objD[k]); + i += 1; + } + + layer._reset(); + }, + _updateCollectionFromPoints: function (cornerPointDelta, overlay) { var layersToMove = this._calcCollectionFromPoints(cornerPointDelta, overlay); layersToMove.forEach(function (layer) { - layer._updateCornersFromPoints(layer._objD); + this._updateCornersFromPoints(layer); layer.fire('update'); - }); + }, this); }, }); @@ -1099,7 +1196,7 @@ L.DistortableImage.Edit = L.Handler.extend({ initialize: function(overlay) { this._overlay = overlay; // TODO: consider renaming to ._cornersPoints for consistency with current code - this._overlay._dragStartPoints = { 0: 0, 1: 0, 2: 0, 3: 0 }; + this._overlay._dragStartPoints = { 0: new L.point(0, 0), 1: new L.point(0, 0), 2: new L.point(0, 0), 3: new L.point(0, 0) }; this._toggledImage = false; /* Interaction modes. */ @@ -1157,11 +1254,11 @@ L.DistortableImage.Edit = L.Handler.extend({ this._enableDragging(); } - L.DomEvent.on(map, 'click', this._removeSelections, this); + // L.DomEvent.on(map, 'click', this._removeSelections, this); - L.DomEvent.on(overlay, 'dragstart', this._dragStartMultiple, this); + // L.DomEvent.on(overlay, 'dragstart', this._dragStartMultiple, this); - L.DomEvent.on(overlay, 'drag', this._dragMultiple, this); + // L.DomEvent.on(overlay, 'drag', this._dragMultiple, this); //overlay.on('click', this._showToolbar, this); L.DomEvent.on(overlay._image, 'click', this._showToolbar, this); @@ -1180,11 +1277,11 @@ L.DistortableImage.Edit = L.Handler.extend({ var overlay = this._overlay, map = overlay._map; - L.DomEvent.off(map, 'click', this._removeSelections, this); + // L.DomEvent.off(map, 'click', this._removeSelections, this); - L.DomEvent.off(overlay, 'dragstart', this._dragStartMultiple, this); + // L.DomEvent.off(overlay, 'dragstart', this._dragStartMultiple, this); - L.DomEvent.off(overlay, 'drag', this._dragMultiple, this); + // L.DomEvent.off(overlay, 'drag', this._dragMultiple, this); L.DomEvent.off(overlay._image, 'click', this._showToolbar, this); @@ -1251,42 +1348,42 @@ L.DistortableImage.Edit = L.Handler.extend({ }, // drag events for multiple images are separated out from enableDragging initialization -- two different concepts - _dragStartMultiple: function() { - var overlay = this._overlay, - i; + // _dragStartMultiple: function() { + // var overlay = this._overlay, + // i; - if (!this.isSelected(overlay)) { return; } - // if (!(this._group instanceof L.DistortableCollection)) { return; } - if (this._group._getSelectedImages().length <= 1) { return; } + // if (!this.isSelected(overlay)) { return; } + // // if (!(this._group instanceof L.DistortableCollection)) { return; } + // if (this._group._getSelectedImages().length <= 1) { return; } - this._group.eachLayer(function (layer) { - for (i = 0; i < 4; i++) { - if (layer !== overlay) { layer.editing._hideToolbar(); } - layer._dragStartPoints[i] = layer._map.latLngToLayerPoint(layer.getCorners()[i]); - } - }); - - overlay._cornerPointDelta = {}; - }, + // this._group.eachLayer(function (layer) { + // for (i = 0; i < 4; i++) { + // if (layer !== overlay) { layer.editing._hideToolbar(); } + // layer._dragStartPoints[i] = layer._map.latLngToLayerPoint(layer.getCorners()[i]); + // } + // }); + + // overlay._cornerPointDelta = {}; + // }, - _dragMultiple: function() { - var overlay = this._overlay, - map = overlay._map, - i; + // _dragMultiple: function() { + // var overlay = this._overlay, + // map = overlay._map, + // i; - if (!this.isSelected(overlay)) { return; } - if (this._group._getSelectedImages().length <= 1) { return; } + // if (!this.isSelected(overlay)) { return; } + // if (this._group._getSelectedImages().length <= 1) { return; } - overlay._dragPoints = {}; + // overlay._dragPoints = {}; - for (i = 0; i < 4; i++) { - overlay._dragPoints[i] = map.latLngToLayerPoint(overlay.getCorners()[i]); - } + // for (i = 0; i < 4; i++) { + // overlay._dragPoints[i] = map.latLngToLayerPoint(overlay.getCorners()[i]); + // } - var cornerPointDelta = overlay._calcCornerPointDelta(); + // var cornerPointDelta = overlay._calcCornerPointDelta(); - this._group._updateCollectionFromPoints(cornerPointDelta, overlay); - }, + // this._group._updateCollectionFromPoints(cornerPointDelta, overlay); + // }, _enableDragging: function() { var overlay = this._overlay, @@ -1465,22 +1562,22 @@ L.DistortableImage.Edit = L.Handler.extend({ // } // }, - _removeSelections: function() { - var overlay = this._overlay, - group = this._group, - map = overlay._map; + // _removeSelections: function() { + // var overlay = this._overlay, + // group = this._group, + // map = overlay._map; - if (!(group instanceof L.DistortableCollection)) { return; } + // if (!(group instanceof L.DistortableCollection)) { return; } - group.eachLayer(function(layer) { - L.DomUtil.removeClass(layer.getElement(), 'selected'); - group.removeLayer(layer); - layer.addTo(map); - layer.editing.enable(); - }); + // group.eachLayer(function(layer) { + // L.DomUtil.removeClass(layer.getElement(), 'selected'); + // group.removeLayer(layer); + // layer.addTo(map); + // layer.editing.enable(); + // }); - this._hideToolbar(); - }, + // this._hideToolbar(); + // }, _removeOverlay: function () { var overlay = this._overlay; diff --git a/src/DistortableCollection.js b/src/DistortableCollection.js index 0a088be02..9710efc33 100644 --- a/src/DistortableCollection.js +++ b/src/DistortableCollection.js @@ -9,43 +9,128 @@ L.DistortableCollection = L.FeatureGroup.extend({ L.FeatureGroup.prototype.onAdd.call(this, map); this._map = map; - this.eachLayer(function(layer) { - L.DomEvent.on(layer._image, 'mousedown', this._toggleSelections, this); - }, this); - + this._members = {}; + + window._members = this._members; + + L.DomEvent.on(map, 'layeradd', this._getFeatureGroupId, this); + L.DomEvent.on(map, 'click', this._removeSelections, this); + + }, onRemove: function() { + var map = this._map; + L.DomEvent.off(map, 'layeradd', this._getFeatureGroupId, this); + L.DomEvent.off(map, 'click', this._removeSelections, this); // window.map = map; - this.eachLayer(function (layer) { - L.DomEvent.on(layer._image, 'mousedown', this._toggleSelections, this); - }, this); + // this.eachLayer(function (layer) { + // L.DomEvent.on(layer._image, 'mousedown', this._toggleSelections, this); + // }, this); }, _getSelectedImages: function () { return this.getLayers(); }, - _toggleSelections: function (event) { - window.event = event; + _getFeatureGroupId: function (event) { + window.eventy = event; var layer = event.layer; - window.layer = layer; + window.layery = layer; + + if (event.layer instanceof L.DistortableCollection) { + this._id = this.getLayerId(event.layer); + } + + this.eachLayer(function(layer) { + this._members[this.getLayerId(layer)] = { + layer: layer, + mode: layer.editing._mode, + image: layer._image + }; + }, this); + + for (var k in this._members) { + L.DomEvent.on(this._members[k].image, "mousedown", this._toggleSelections, this); + L.DomEvent.on(this._members[k].layer, "drag", this._dragMultiple, this); + L.DomEvent.on(this._members[k].layer, 'dragstart', this._dragStartMultiple, this); + // L.DomEvent.on(this._map, 'click', this._removeSelections, this); + } + }, + + _dragMultiple: function (event) { + var layer = event.target, + map = this._map, + i; + + // var layer = this, + // map = this._map, + // i; + + window.eventT = event; - // map = overlay._map; + // if (!this.isSelected(overlay)) { return; } + // if (this._group._getSelectedImages().length <= 1) { return; } - // if (!(group instanceof L.DistortableCollection) || this._mode === 'lock') { return; } + layer._dragPoints = {}; - // if (event.metaKey || event.ctrlKey) { - // L.DomUtil.toggleClass(target, 'selected'); - // } + for (i = 0; i < 4; i++) { + layer._dragPoints[i] = map.latLngToLayerPoint(layer.getCorners()[i]); + } - // if (L.DomUtil.hasClass(target, 'selected')) { - // group.addLayer(overlay); - // } else { - // group.removeLayer(overlay); - // overlay.addTo(map); - // overlay.editing.enable(); - // } + layer._cornerPointDelta = this._calcCornerPointDelta(layer); + + this._updateCollectionFromPoints(layer._cornerPointDelta, layer); + }, + + _dragStartMultiple: function (event) { + var overlay = event.target, + i; + + // if (!this.isSelected(overlay)) { return; } + // if (!(this._group instanceof L.DistortableCollection)) { return; } + // if (this._group._getSelectedImages().length <= 1) { return; } + + this.eachLayer(function (layer) { + for (i = 0; i < 4; i++) { + if (layer !== overlay) { layer.editing._hideToolbar(); } + layer._dragStartPoints[i] = layer._map.latLngToLayerPoint(layer.getCorners()[i]); + } + }); + + overlay._cornerPointDelta = {}; + }, + + _calcCornerPointDelta: function (layer) { + return layer._dragStartPoints[0].subtract(layer._dragPoints[0]); + }, + + _toggleSelections: function (event) { + var target = event.target, + members = this._members, + member; + + for (var k in members) { + if (members[k].image === target) { + member = members[k]; + break; + } + } + + if (member) { + if (member.mode === 'lock') { return; } + } + + if (event.metaKey || event.ctrlKey) { + L.DomUtil.toggleClass(target, 'selected'); + } + }, + + _removeSelections: function () { + this.eachLayer(function (layer) { + L.DomUtil.removeClass(layer.getElement(), 'selected'); + if (layer.editing.toolbar) { layer.editing._hideToolbar(); } + }); }, /** @@ -56,6 +141,7 @@ L.DistortableCollection = L.FeatureGroup.extend({ var layersToMove = []; var transformation = new L.Transformation(1, -cornerPointDelta.x, 1, -cornerPointDelta.y); this.eachLayer(function (layer) { + window.layerrr = layer; if (layer !== overlay && layer.editing._mode !== 'lock') { layer._objD = {}; @@ -71,14 +157,25 @@ L.DistortableCollection = L.FeatureGroup.extend({ return layersToMove; }, + _updateCornersFromPoints: function (layer) { + var map = this._map; + var i = 0; + for (var k in layer._objD) { + layer._corners[i] = map.layerPointToLatLng(layer._objD[k]); + i += 1; + } + + layer._reset(); + }, + _updateCollectionFromPoints: function (cornerPointDelta, overlay) { var layersToMove = this._calcCollectionFromPoints(cornerPointDelta, overlay); layersToMove.forEach(function (layer) { - layer._updateCornersFromPoints(layer._objD); + this._updateCornersFromPoints(layer); layer.fire('update'); - }); + }, this); }, }); \ No newline at end of file diff --git a/src/DistortableImageOverlay.js b/src/DistortableImageOverlay.js index 5a679bd5e..69735f299 100644 --- a/src/DistortableImageOverlay.js +++ b/src/DistortableImageOverlay.js @@ -149,16 +149,16 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ this._reset(); }, - _updateCornersFromPoints: function (pointsObj) { - var map = this._map; - var i = 0; - for (var k in pointsObj) { - this._corners[i] = map.layerPointToLatLng(pointsObj[k]); - i += 1; - } + // _updateCornersFromPoints: function (pointsObj) { + // var map = this._map; + // var i = 0; + // for (var k in pointsObj) { + // this._corners[i] = map.layerPointToLatLng(pointsObj[k]); + // i += 1; + // } - this._reset(); - }, + // this._reset(); + // }, /* Copied from Leaflet v0.7 https://github.com/Leaflet/Leaflet/blob/66282f14bcb180ec87d9818d9f3c9f75afd01b30/src/dom/DomUtil.js#L189-L199 */ /* since L.DomUtil.getTranslateString() is deprecated in Leaflet v1.0 */ @@ -244,9 +244,9 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ }, // Use for translation calculations - for translation the delta for 1 corner applies to all 4 - _calcCornerPointDelta: function () { - return this._dragStartPoints[0].subtract(this._dragPoints[0]); - }, + // _calcCornerPointDelta: function (layer) { + // return layer._dragStartPoints[0].subtract(layer._dragPoints[0]); + // }, _calculateProjectiveTransform: function(latLngToCartesian) { /* Setting reasonable but made-up image defaults diff --git a/src/edit/DistortableImage.Edit.js b/src/edit/DistortableImage.Edit.js index cda4fd93f..6861d28c3 100644 --- a/src/edit/DistortableImage.Edit.js +++ b/src/edit/DistortableImage.Edit.js @@ -24,7 +24,7 @@ L.DistortableImage.Edit = L.Handler.extend({ initialize: function(overlay) { this._overlay = overlay; // TODO: consider renaming to ._cornersPoints for consistency with current code - this._overlay._dragStartPoints = { 0: 0, 1: 0, 2: 0, 3: 0 }; + this._overlay._dragStartPoints = { 0: new L.point(0, 0), 1: new L.point(0, 0), 2: new L.point(0, 0), 3: new L.point(0, 0) }; this._toggledImage = false; /* Interaction modes. */ @@ -82,11 +82,11 @@ L.DistortableImage.Edit = L.Handler.extend({ this._enableDragging(); } - L.DomEvent.on(map, 'click', this._removeSelections, this); + // L.DomEvent.on(map, 'click', this._removeSelections, this); - L.DomEvent.on(overlay, 'dragstart', this._dragStartMultiple, this); + // L.DomEvent.on(overlay, 'dragstart', this._dragStartMultiple, this); - L.DomEvent.on(overlay, 'drag', this._dragMultiple, this); + // L.DomEvent.on(overlay, 'drag', this._dragMultiple, this); //overlay.on('click', this._showToolbar, this); L.DomEvent.on(overlay._image, 'click', this._showToolbar, this); @@ -105,11 +105,11 @@ L.DistortableImage.Edit = L.Handler.extend({ var overlay = this._overlay, map = overlay._map; - L.DomEvent.off(map, 'click', this._removeSelections, this); + // L.DomEvent.off(map, 'click', this._removeSelections, this); - L.DomEvent.off(overlay, 'dragstart', this._dragStartMultiple, this); + // L.DomEvent.off(overlay, 'dragstart', this._dragStartMultiple, this); - L.DomEvent.off(overlay, 'drag', this._dragMultiple, this); + // L.DomEvent.off(overlay, 'drag', this._dragMultiple, this); L.DomEvent.off(overlay._image, 'click', this._showToolbar, this); @@ -176,42 +176,42 @@ L.DistortableImage.Edit = L.Handler.extend({ }, // drag events for multiple images are separated out from enableDragging initialization -- two different concepts - _dragStartMultiple: function() { - var overlay = this._overlay, - i; + // _dragStartMultiple: function() { + // var overlay = this._overlay, + // i; - if (!this.isSelected(overlay)) { return; } - // if (!(this._group instanceof L.DistortableCollection)) { return; } - if (this._group._getSelectedImages().length <= 1) { return; } + // if (!this.isSelected(overlay)) { return; } + // // if (!(this._group instanceof L.DistortableCollection)) { return; } + // if (this._group._getSelectedImages().length <= 1) { return; } - this._group.eachLayer(function (layer) { - for (i = 0; i < 4; i++) { - if (layer !== overlay) { layer.editing._hideToolbar(); } - layer._dragStartPoints[i] = layer._map.latLngToLayerPoint(layer.getCorners()[i]); - } - }); - - overlay._cornerPointDelta = {}; - }, + // this._group.eachLayer(function (layer) { + // for (i = 0; i < 4; i++) { + // if (layer !== overlay) { layer.editing._hideToolbar(); } + // layer._dragStartPoints[i] = layer._map.latLngToLayerPoint(layer.getCorners()[i]); + // } + // }); + + // overlay._cornerPointDelta = {}; + // }, - _dragMultiple: function() { - var overlay = this._overlay, - map = overlay._map, - i; + // _dragMultiple: function() { + // var overlay = this._overlay, + // map = overlay._map, + // i; - if (!this.isSelected(overlay)) { return; } - if (this._group._getSelectedImages().length <= 1) { return; } + // if (!this.isSelected(overlay)) { return; } + // if (this._group._getSelectedImages().length <= 1) { return; } - overlay._dragPoints = {}; + // overlay._dragPoints = {}; - for (i = 0; i < 4; i++) { - overlay._dragPoints[i] = map.latLngToLayerPoint(overlay.getCorners()[i]); - } + // for (i = 0; i < 4; i++) { + // overlay._dragPoints[i] = map.latLngToLayerPoint(overlay.getCorners()[i]); + // } - var cornerPointDelta = overlay._calcCornerPointDelta(); + // var cornerPointDelta = overlay._calcCornerPointDelta(); - this._group._updateCollectionFromPoints(cornerPointDelta, overlay); - }, + // this._group._updateCollectionFromPoints(cornerPointDelta, overlay); + // }, _enableDragging: function() { var overlay = this._overlay, @@ -390,22 +390,22 @@ L.DistortableImage.Edit = L.Handler.extend({ // } // }, - _removeSelections: function() { - var overlay = this._overlay, - group = this._group, - map = overlay._map; + // _removeSelections: function() { + // var overlay = this._overlay, + // group = this._group, + // map = overlay._map; - if (!(group instanceof L.DistortableCollection)) { return; } + // if (!(group instanceof L.DistortableCollection)) { return; } - group.eachLayer(function(layer) { - L.DomUtil.removeClass(layer.getElement(), 'selected'); - group.removeLayer(layer); - layer.addTo(map); - layer.editing.enable(); - }); + // group.eachLayer(function(layer) { + // L.DomUtil.removeClass(layer.getElement(), 'selected'); + // group.removeLayer(layer); + // layer.addTo(map); + // layer.editing.enable(); + // }); - this._hideToolbar(); - }, + // this._hideToolbar(); + // }, _removeOverlay: function () { var overlay = this._overlay; From 409239105c81d5997c8d66e93b68d48a108b4aac Mon Sep 17 00:00:00 2001 From: sashadev-sky Date: Thu, 21 Mar 2019 22:35:41 -0400 Subject: [PATCH 32/63] refactoring --- dist/leaflet.distortableimage.js | 194 +++++------------------------- examples/select.html | 32 ++++- src/DistortableCollection.js | 93 +++----------- src/edit/DistortableImage.Edit.js | 105 ++-------------- 4 files changed, 89 insertions(+), 335 deletions(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index f7fc222c2..8a0680284 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -831,76 +831,44 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ L.DistortableCollection = L.FeatureGroup.extend({ include: L.Mixin.Events, - // TODO: save all essential image properties in an easily iterable object locally - - - // TODO: do feature groups only allow for click event groupings. do other events just not propogate onAdd: function (map) { L.FeatureGroup.prototype.onAdd.call(this, map); this._map = map; - this._members = {}; - - window._members = this._members; - L.DomEvent.on(map, 'layeradd', this._getFeatureGroupId, this); L.DomEvent.on(map, 'click', this._removeSelections, this); - - - }, - onRemove: function() { - var map = this._map; - L.DomEvent.off(map, 'layeradd', this._getFeatureGroupId, this); - L.DomEvent.off(map, 'click', this._removeSelections, this); - // window.map = map; - // this.eachLayer(function (layer) { - // L.DomEvent.on(layer._image, 'mousedown', this._toggleSelections, this); - // }, this); + this.eachLayer(function (layer) { + L.DomEvent.on(layer, "drag", this._dragMultiple, this); + L.DomEvent.on(layer, 'dragstart', this._dragStartMultiple, this); + }, this); }, - _getSelectedImages: function () { - return this.getLayers(); + isSelected: function (overlay) { + return L.DomUtil.hasClass(overlay.getElement(), 'selected'); }, - _getFeatureGroupId: function (event) { - window.eventy = event; - var layer = event.layer; - window.layery = layer; + onRemove: function() { + var map = this._map; - if (event.layer instanceof L.DistortableCollection) { - this._id = this.getLayerId(event.layer); - } + L.DomEvent.off(map, 'click', this._removeSelections, this); - this.eachLayer(function(layer) { - this._members[this.getLayerId(layer)] = { - layer: layer, - mode: layer.editing._mode, - image: layer._image - }; + this.eachLayer(function (layer) { + L.DomEvent.off(layer, "drag", this._dragMultiple, this); + L.DomEvent.off(layer, 'dragstart', this._dragStartMultiple, this); }, this); + }, - for (var k in this._members) { - L.DomEvent.on(this._members[k].image, "mousedown", this._toggleSelections, this); - L.DomEvent.on(this._members[k].layer, "drag", this._dragMultiple, this); - L.DomEvent.on(this._members[k].layer, 'dragstart', this._dragStartMultiple, this); - // L.DomEvent.on(this._map, 'click', this._removeSelections, this); - } + _getSelectedImages: function () { + return this.getLayers(); }, _dragMultiple: function (event) { var layer = event.target, map = this._map, i; - - // var layer = this, - // map = this._map, - // i; - - window.eventT = event; - // if (!this.isSelected(overlay)) { return; } - // if (this._group._getSelectedImages().length <= 1) { return; } + if (!this.isSelected(layer)) {return;} layer._dragPoints = {}; @@ -917,9 +885,7 @@ L.DistortableCollection = L.FeatureGroup.extend({ var overlay = event.target, i; - // if (!this.isSelected(overlay)) { return; } - // if (!(this._group instanceof L.DistortableCollection)) { return; } - // if (this._group._getSelectedImages().length <= 1) { return; } + if (!this.isSelected(overlay)) { return; } this.eachLayer(function (layer) { for (i = 0; i < 4; i++) { @@ -935,27 +901,6 @@ L.DistortableCollection = L.FeatureGroup.extend({ return layer._dragStartPoints[0].subtract(layer._dragPoints[0]); }, - _toggleSelections: function (event) { - var target = event.target, - members = this._members, - member; - - for (var k in members) { - if (members[k].image === target) { - member = members[k]; - break; - } - } - - if (member) { - if (member.mode === 'lock') { return; } - } - - if (event.metaKey || event.ctrlKey) { - L.DomUtil.toggleClass(target, 'selected'); - } - }, - _removeSelections: function () { this.eachLayer(function (layer) { L.DomUtil.removeClass(layer.getElement(), 'selected'); @@ -972,7 +917,7 @@ L.DistortableCollection = L.FeatureGroup.extend({ var transformation = new L.Transformation(1, -cornerPointDelta.x, 1, -cornerPointDelta.y); this.eachLayer(function (layer) { window.layerrr = layer; - if (layer !== overlay && layer.editing._mode !== 'lock') { + if ((layer !== overlay && layer.editing._mode !== 'lock') && this.isSelected(layer)) { layer._objD = {}; layer._objD.newVal = transformation.transform(layer._dragStartPoints[0]); @@ -982,7 +927,7 @@ L.DistortableCollection = L.FeatureGroup.extend({ layersToMove.push(layer); } - }); + }, this); return layersToMove; }, @@ -1254,16 +1199,9 @@ L.DistortableImage.Edit = L.Handler.extend({ this._enableDragging(); } - // L.DomEvent.on(map, 'click', this._removeSelections, this); - - // L.DomEvent.on(overlay, 'dragstart', this._dragStartMultiple, this); - - // L.DomEvent.on(overlay, 'drag', this._dragMultiple, this); - - //overlay.on('click', this._showToolbar, this); L.DomEvent.on(overlay._image, 'click', this._showToolbar, this); - // L.DomEvent.on(overlay._image, 'mousedown', this._toggleSelections); + L.DomEvent.on(overlay._image, 'mousedown', this._toggleSelections, this); /* Enable hotkeys. */ L.DomEvent.on(window, 'keydown', this._onKeyDown, this); @@ -1277,15 +1215,9 @@ L.DistortableImage.Edit = L.Handler.extend({ var overlay = this._overlay, map = overlay._map; - // L.DomEvent.off(map, 'click', this._removeSelections, this); - - // L.DomEvent.off(overlay, 'dragstart', this._dragStartMultiple, this); - - // L.DomEvent.off(overlay, 'drag', this._dragMultiple, this); - L.DomEvent.off(overlay._image, 'click', this._showToolbar, this); - // L.DomEvent.off(overlay._image, 'mousedown', this._toggleSelections, this); + L.DomEvent.off(overlay._image, 'mousedown', this._toggleSelections, this); // First, check if dragging exists; // it may be off due to locking @@ -1307,10 +1239,6 @@ L.DistortableImage.Edit = L.Handler.extend({ confirmDelete: function () { return window.confirm("Are you sure you want to delete?"); }, - - isSelected: function(overlay) { - return L.DomUtil.hasClass(overlay.getElement(), 'selected'); - }, _rotateBy: function(angle) { var overlay = this._overlay, @@ -1347,44 +1275,6 @@ L.DistortableImage.Edit = L.Handler.extend({ overlay._reset(); }, - // drag events for multiple images are separated out from enableDragging initialization -- two different concepts - // _dragStartMultiple: function() { - // var overlay = this._overlay, - // i; - - // if (!this.isSelected(overlay)) { return; } - // // if (!(this._group instanceof L.DistortableCollection)) { return; } - // if (this._group._getSelectedImages().length <= 1) { return; } - - // this._group.eachLayer(function (layer) { - // for (i = 0; i < 4; i++) { - // if (layer !== overlay) { layer.editing._hideToolbar(); } - // layer._dragStartPoints[i] = layer._map.latLngToLayerPoint(layer.getCorners()[i]); - // } - // }); - - // overlay._cornerPointDelta = {}; - // }, - - // _dragMultiple: function() { - // var overlay = this._overlay, - // map = overlay._map, - // i; - - // if (!this.isSelected(overlay)) { return; } - // if (this._group._getSelectedImages().length <= 1) { return; } - - // overlay._dragPoints = {}; - - // for (i = 0; i < 4; i++) { - // overlay._dragPoints[i] = map.latLngToLayerPoint(overlay.getCorners()[i]); - // } - - // var cornerPointDelta = overlay._calcCornerPointDelta(); - - // this._group._updateCollectionFromPoints(cornerPointDelta, overlay); - // }, - _enableDragging: function() { var overlay = this._overlay, map = overlay._map; @@ -1541,43 +1431,15 @@ L.DistortableImage.Edit = L.Handler.extend({ L.DomEvent.stopPropagation(event); }, - // _toggleSelections: function(event) { - // var overlay = this._overlay, - // group = this._group, - // target = event.target, - // map = overlay._map; - - // if (this._mode === 'lock') { return; } - - // if (event.metaKey || event.ctrlKey) { - // L.DomUtil.toggleClass(target, 'selected'); - // } - - // if (L.DomUtil.hasClass(target, 'selected')) { - // group.addLayer(overlay); - // } else { - // group.removeLayer(overlay); - // overlay.addTo(map); - // overlay.editing.enable(); - // } - // }, - - // _removeSelections: function() { - // var overlay = this._overlay, - // group = this._group, - // map = overlay._map; + _toggleSelections: function(event) { + var target = event.target; - // if (!(group instanceof L.DistortableCollection)) { return; } + if (this._mode === 'lock') { return; } - // group.eachLayer(function(layer) { - // L.DomUtil.removeClass(layer.getElement(), 'selected'); - // group.removeLayer(layer); - // layer.addTo(map); - // layer.editing.enable(); - // }); - - // this._hideToolbar(); - // }, + if (event.metaKey || event.ctrlKey) { + L.DomUtil.toggleClass(target, 'selected'); + } + }, _removeOverlay: function () { var overlay = this._overlay; diff --git a/examples/select.html b/examples/select.html index 084bc9b74..410ca739b 100644 --- a/examples/select.html +++ b/examples/select.html @@ -91,10 +91,40 @@ edgeMinHeight: 348 }).addTo(map); + img3 = new L.DistortableImageOverlay( + 'example.png', { + corners: [ + new L.latLng(51.51,-0.10), + new L.latLng(51.51,-0.14), + new L.latLng(51.49,-0.11), + new L.latLng(51.49,-0.15) + ], + group: imagesFeatureGroup, + // HARDCODED: we should find the img w/h dynamically so that it fits the image each time. (initImageDimensions?) + edgeMinWidth: 521, + edgeMinHeight: 348 + }).addTo(map); + + img4 = new L.DistortableImageOverlay( + 'example.png', { + corners: [ + new L.latLng(51.51,-0.10), + new L.latLng(51.51,-0.14), + new L.latLng(51.49,-0.11), + new L.latLng(51.49,-0.15) + ], + group: imagesFeatureGroup, + // HARDCODED: we should find the img w/h dynamically so that it fits the image each time. (initImageDimensions?) + edgeMinWidth: 521, + edgeMinHeight: 348 + }).addTo(map); + L.DomEvent.on(img._image, 'load', img.editing.enable, img.editing); L.DomEvent.on(img2._image, 'load', img2.editing.enable, img2.editing); + L.DomEvent.on(img3._image, 'load', img3.editing.enable, img3.editing); + L.DomEvent.on(img4._image, 'load', img4.editing.enable, img4.editing); - var imagesFeatureGroup = new L.DistortableCollection([img, img2]).addTo(map); + var imagesFeatureGroup = new L.DistortableCollection([img, img2, img3, img4]).addTo(map); // window.imagesFeatureGroup = imagesFeatureGroup; // imagesFeatureGroup.addLayer(img); diff --git a/src/DistortableCollection.js b/src/DistortableCollection.js index 9710efc33..1d8779d28 100644 --- a/src/DistortableCollection.js +++ b/src/DistortableCollection.js @@ -1,76 +1,44 @@ L.DistortableCollection = L.FeatureGroup.extend({ include: L.Mixin.Events, - // TODO: save all essential image properties in an easily iterable object locally - - - // TODO: do feature groups only allow for click event groupings. do other events just not propogate onAdd: function (map) { L.FeatureGroup.prototype.onAdd.call(this, map); this._map = map; - this._members = {}; - - window._members = this._members; - L.DomEvent.on(map, 'layeradd', this._getFeatureGroupId, this); L.DomEvent.on(map, 'click', this._removeSelections, this); - - - }, - onRemove: function() { - var map = this._map; - L.DomEvent.off(map, 'layeradd', this._getFeatureGroupId, this); - L.DomEvent.off(map, 'click', this._removeSelections, this); - // window.map = map; - // this.eachLayer(function (layer) { - // L.DomEvent.on(layer._image, 'mousedown', this._toggleSelections, this); - // }, this); + this.eachLayer(function (layer) { + L.DomEvent.on(layer, "drag", this._dragMultiple, this); + L.DomEvent.on(layer, 'dragstart', this._dragStartMultiple, this); + }, this); }, - _getSelectedImages: function () { - return this.getLayers(); + isSelected: function (overlay) { + return L.DomUtil.hasClass(overlay.getElement(), 'selected'); }, - _getFeatureGroupId: function (event) { - window.eventy = event; - var layer = event.layer; - window.layery = layer; + onRemove: function() { + var map = this._map; - if (event.layer instanceof L.DistortableCollection) { - this._id = this.getLayerId(event.layer); - } + L.DomEvent.off(map, 'click', this._removeSelections, this); - this.eachLayer(function(layer) { - this._members[this.getLayerId(layer)] = { - layer: layer, - mode: layer.editing._mode, - image: layer._image - }; + this.eachLayer(function (layer) { + L.DomEvent.off(layer, "drag", this._dragMultiple, this); + L.DomEvent.off(layer, 'dragstart', this._dragStartMultiple, this); }, this); + }, - for (var k in this._members) { - L.DomEvent.on(this._members[k].image, "mousedown", this._toggleSelections, this); - L.DomEvent.on(this._members[k].layer, "drag", this._dragMultiple, this); - L.DomEvent.on(this._members[k].layer, 'dragstart', this._dragStartMultiple, this); - // L.DomEvent.on(this._map, 'click', this._removeSelections, this); - } + _getSelectedImages: function () { + return this.getLayers(); }, _dragMultiple: function (event) { var layer = event.target, map = this._map, i; - - // var layer = this, - // map = this._map, - // i; - window.eventT = event; - - // if (!this.isSelected(overlay)) { return; } - // if (this._group._getSelectedImages().length <= 1) { return; } + if (!this.isSelected(layer)) {return;} layer._dragPoints = {}; @@ -87,9 +55,7 @@ L.DistortableCollection = L.FeatureGroup.extend({ var overlay = event.target, i; - // if (!this.isSelected(overlay)) { return; } - // if (!(this._group instanceof L.DistortableCollection)) { return; } - // if (this._group._getSelectedImages().length <= 1) { return; } + if (!this.isSelected(overlay)) { return; } this.eachLayer(function (layer) { for (i = 0; i < 4; i++) { @@ -105,27 +71,6 @@ L.DistortableCollection = L.FeatureGroup.extend({ return layer._dragStartPoints[0].subtract(layer._dragPoints[0]); }, - _toggleSelections: function (event) { - var target = event.target, - members = this._members, - member; - - for (var k in members) { - if (members[k].image === target) { - member = members[k]; - break; - } - } - - if (member) { - if (member.mode === 'lock') { return; } - } - - if (event.metaKey || event.ctrlKey) { - L.DomUtil.toggleClass(target, 'selected'); - } - }, - _removeSelections: function () { this.eachLayer(function (layer) { L.DomUtil.removeClass(layer.getElement(), 'selected'); @@ -142,7 +87,7 @@ L.DistortableCollection = L.FeatureGroup.extend({ var transformation = new L.Transformation(1, -cornerPointDelta.x, 1, -cornerPointDelta.y); this.eachLayer(function (layer) { window.layerrr = layer; - if (layer !== overlay && layer.editing._mode !== 'lock') { + if ((layer !== overlay && layer.editing._mode !== 'lock') && this.isSelected(layer)) { layer._objD = {}; layer._objD.newVal = transformation.transform(layer._dragStartPoints[0]); @@ -152,7 +97,7 @@ L.DistortableCollection = L.FeatureGroup.extend({ layersToMove.push(layer); } - }); + }, this); return layersToMove; }, diff --git a/src/edit/DistortableImage.Edit.js b/src/edit/DistortableImage.Edit.js index 6861d28c3..e56211236 100644 --- a/src/edit/DistortableImage.Edit.js +++ b/src/edit/DistortableImage.Edit.js @@ -82,16 +82,9 @@ L.DistortableImage.Edit = L.Handler.extend({ this._enableDragging(); } - // L.DomEvent.on(map, 'click', this._removeSelections, this); - - // L.DomEvent.on(overlay, 'dragstart', this._dragStartMultiple, this); - - // L.DomEvent.on(overlay, 'drag', this._dragMultiple, this); - - //overlay.on('click', this._showToolbar, this); L.DomEvent.on(overlay._image, 'click', this._showToolbar, this); - // L.DomEvent.on(overlay._image, 'mousedown', this._toggleSelections); + L.DomEvent.on(overlay._image, 'mousedown', this._toggleSelections, this); /* Enable hotkeys. */ L.DomEvent.on(window, 'keydown', this._onKeyDown, this); @@ -105,15 +98,9 @@ L.DistortableImage.Edit = L.Handler.extend({ var overlay = this._overlay, map = overlay._map; - // L.DomEvent.off(map, 'click', this._removeSelections, this); - - // L.DomEvent.off(overlay, 'dragstart', this._dragStartMultiple, this); - - // L.DomEvent.off(overlay, 'drag', this._dragMultiple, this); - L.DomEvent.off(overlay._image, 'click', this._showToolbar, this); - // L.DomEvent.off(overlay._image, 'mousedown', this._toggleSelections, this); + L.DomEvent.off(overlay._image, 'mousedown', this._toggleSelections, this); // First, check if dragging exists; // it may be off due to locking @@ -135,10 +122,6 @@ L.DistortableImage.Edit = L.Handler.extend({ confirmDelete: function () { return window.confirm("Are you sure you want to delete?"); }, - - isSelected: function(overlay) { - return L.DomUtil.hasClass(overlay.getElement(), 'selected'); - }, _rotateBy: function(angle) { var overlay = this._overlay, @@ -175,44 +158,6 @@ L.DistortableImage.Edit = L.Handler.extend({ overlay._reset(); }, - // drag events for multiple images are separated out from enableDragging initialization -- two different concepts - // _dragStartMultiple: function() { - // var overlay = this._overlay, - // i; - - // if (!this.isSelected(overlay)) { return; } - // // if (!(this._group instanceof L.DistortableCollection)) { return; } - // if (this._group._getSelectedImages().length <= 1) { return; } - - // this._group.eachLayer(function (layer) { - // for (i = 0; i < 4; i++) { - // if (layer !== overlay) { layer.editing._hideToolbar(); } - // layer._dragStartPoints[i] = layer._map.latLngToLayerPoint(layer.getCorners()[i]); - // } - // }); - - // overlay._cornerPointDelta = {}; - // }, - - // _dragMultiple: function() { - // var overlay = this._overlay, - // map = overlay._map, - // i; - - // if (!this.isSelected(overlay)) { return; } - // if (this._group._getSelectedImages().length <= 1) { return; } - - // overlay._dragPoints = {}; - - // for (i = 0; i < 4; i++) { - // overlay._dragPoints[i] = map.latLngToLayerPoint(overlay.getCorners()[i]); - // } - - // var cornerPointDelta = overlay._calcCornerPointDelta(); - - // this._group._updateCollectionFromPoints(cornerPointDelta, overlay); - // }, - _enableDragging: function() { var overlay = this._overlay, map = overlay._map; @@ -369,43 +314,15 @@ L.DistortableImage.Edit = L.Handler.extend({ L.DomEvent.stopPropagation(event); }, - // _toggleSelections: function(event) { - // var overlay = this._overlay, - // group = this._group, - // target = event.target, - // map = overlay._map; - - // if (this._mode === 'lock') { return; } - - // if (event.metaKey || event.ctrlKey) { - // L.DomUtil.toggleClass(target, 'selected'); - // } - - // if (L.DomUtil.hasClass(target, 'selected')) { - // group.addLayer(overlay); - // } else { - // group.removeLayer(overlay); - // overlay.addTo(map); - // overlay.editing.enable(); - // } - // }, - - // _removeSelections: function() { - // var overlay = this._overlay, - // group = this._group, - // map = overlay._map; - - // if (!(group instanceof L.DistortableCollection)) { return; } - - // group.eachLayer(function(layer) { - // L.DomUtil.removeClass(layer.getElement(), 'selected'); - // group.removeLayer(layer); - // layer.addTo(map); - // layer.editing.enable(); - // }); - - // this._hideToolbar(); - // }, + _toggleSelections: function(event) { + var target = event.target; + + if (this._mode === 'lock') { return; } + + if (event.metaKey || event.ctrlKey) { + L.DomUtil.toggleClass(target, 'selected'); + } + }, _removeOverlay: function () { var overlay = this._overlay; From dab47a84a6c7de7443ad2435bb7264fdc0fd7001 Mon Sep 17 00:00:00 2001 From: sashadev-sky Date: Thu, 21 Mar 2019 22:49:22 -0400 Subject: [PATCH 33/63] refactor 2 --- dist/leaflet.distortableimage.js | 142 ++++++++++++++++-------------- examples/select.html | 15 ---- src/DistortableCollection.js | 131 +++++++++++++++------------ src/DistortableImageOverlay.js | 9 +- src/edit/DistortableImage.Edit.js | 2 - 5 files changed, 156 insertions(+), 143 deletions(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index 8a0680284..a0c5a8b33 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -550,7 +550,6 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ alt: '', height: 200, crossOrigin: true, - group: '', edgeMinWidth: 500 }, @@ -581,8 +580,6 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ map.on('zoomanim', this._animateZoom, this); } - window.overlay = this; - /* This reset happens before image load; it allows * us to place the image on the map earlier with * "guessed" dimensions. */ @@ -789,9 +786,9 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ }, // Use for translation calculations - for translation the delta for 1 corner applies to all 4 - // _calcCornerPointDelta: function (layer) { - // return layer._dragStartPoints[0].subtract(layer._dragPoints[0]); - // }, + _calcCornerPointDelta: function () { + return this._dragStartPoints[0].subtract(this._dragPoints[0]); + }, _calculateProjectiveTransform: function(latLngToCartesian) { /* Setting reasonable but made-up image defaults @@ -831,99 +828,117 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ L.DistortableCollection = L.FeatureGroup.extend({ include: L.Mixin.Events, - onAdd: function (map) { + onAdd: function(map) { L.FeatureGroup.prototype.onAdd.call(this, map); this._map = map; - L.DomEvent.on(map, 'click', this._removeSelections, this); + L.DomEvent.on(map, "click", this._removeSelections, this); - this.eachLayer(function (layer) { + this.eachLayer(function(layer) { L.DomEvent.on(layer, "drag", this._dragMultiple, this); - L.DomEvent.on(layer, 'dragstart', this._dragStartMultiple, this); + L.DomEvent.on(layer, "dragstart", this._dragStartMultiple, this); }, this); }, - isSelected: function (overlay) { - return L.DomUtil.hasClass(overlay.getElement(), 'selected'); + isSelected: function(overlay) { + return L.DomUtil.hasClass(overlay.getElement(), "selected"); }, onRemove: function() { var map = this._map; - L.DomEvent.off(map, 'click', this._removeSelections, this); + L.DomEvent.off(map, "click", this._removeSelections, this); - this.eachLayer(function (layer) { + this.eachLayer(function(layer) { L.DomEvent.off(layer, "drag", this._dragMultiple, this); - L.DomEvent.off(layer, 'dragstart', this._dragStartMultiple, this); + L.DomEvent.off(layer, "dragstart", this._dragStartMultiple, this); }, this); }, - _getSelectedImages: function () { + _getSelectedImages: function() { return this.getLayers(); }, - _dragMultiple: function (event) { - var layer = event.target, - map = this._map, + _dragStartMultiple: function(event) { + var overlay = event.target, i; - if (!this.isSelected(layer)) {return;} - - layer._dragPoints = {}; - - for (i = 0; i < 4; i++) { - layer._dragPoints[i] = map.latLngToLayerPoint(layer.getCorners()[i]); + if (!this.isSelected(overlay)) { + return; } - layer._cornerPointDelta = this._calcCornerPointDelta(layer); + this.eachLayer(function(layer) { + for (i = 0; i < 4; i++) { + if (layer !== overlay) { + layer.editing._hideToolbar(); + } + layer._dragStartPoints[i] = layer._map.latLngToLayerPoint( + layer.getCorners()[i] + ); + } + }); - this._updateCollectionFromPoints(layer._cornerPointDelta, layer); + overlay._cornerPointDelta = {}; }, - _dragStartMultiple: function (event) { + _dragMultiple: function(event) { var overlay = event.target, + map = this._map, i; - if (!this.isSelected(overlay)) { return; } + if (!this.isSelected(overlay)) { + return; + } + + overlay._dragPoints = {}; - this.eachLayer(function (layer) { - for (i = 0; i < 4; i++) { - if (layer !== overlay) { layer.editing._hideToolbar(); } - layer._dragStartPoints[i] = layer._map.latLngToLayerPoint(layer.getCorners()[i]); - } - }); + for (i = 0; i < 4; i++) { + overlay._dragPoints[i] = map.latLngToLayerPoint(overlay.getCorners()[i]); + } - overlay._cornerPointDelta = {}; - }, + overlay._cornerPointDelta = overlay._calcCornerPointDelta(); - _calcCornerPointDelta: function (layer) { - return layer._dragStartPoints[0].subtract(layer._dragPoints[0]); + this._updateCollectionFromPoints(overlay._cornerPointDelta, overlay); }, - _removeSelections: function () { - this.eachLayer(function (layer) { - L.DomUtil.removeClass(layer.getElement(), 'selected'); - if (layer.editing.toolbar) { layer.editing._hideToolbar(); } + _removeSelections: function() { + this.eachLayer(function(layer) { + L.DomUtil.removeClass(layer.getElement(), "selected"); + if (layer.editing.toolbar) { + layer.editing._hideToolbar(); + } }); }, /** - * images in 'lock' mode are included in this feature group collection for functionalities + * images in 'lock' mode are included in this feature group collection for functionalities * such as export, but are filtered out for editing / dragging here */ - _calcCollectionFromPoints: function (cornerPointDelta, overlay) { - var layersToMove = []; - var transformation = new L.Transformation(1, -cornerPointDelta.x, 1, -cornerPointDelta.y); - this.eachLayer(function (layer) { - window.layerrr = layer; - if ((layer !== overlay && layer.editing._mode !== 'lock') && this.isSelected(layer)) { + _calcCollectionFromPoints: function(cpd, overlay) { + var layersToMove = [], + transformation = new L.Transformation(1, -cpd.x, 1, -cpd.y); + + this.eachLayer(function(layer) { + if ( + layer !== overlay && + layer.editing._mode !== "lock" && + this.isSelected(layer) + ) { layer._objD = {}; - layer._objD.newVal = transformation.transform(layer._dragStartPoints[0]); - layer._objD.newVal1 = transformation.transform(layer._dragStartPoints[1]); - layer._objD.newVal2 = transformation.transform(layer._dragStartPoints[2]); - layer._objD.newVal3 = transformation.transform(layer._dragStartPoints[3]); + layer._objD.newVal = transformation.transform( + layer._dragStartPoints[0] + ); + layer._objD.newVal1 = transformation.transform( + layer._dragStartPoints[1] + ); + layer._objD.newVal2 = transformation.transform( + layer._dragStartPoints[2] + ); + layer._objD.newVal3 = transformation.transform( + layer._dragStartPoints[3] + ); layersToMove.push(layer); } @@ -932,7 +947,7 @@ L.DistortableCollection = L.FeatureGroup.extend({ return layersToMove; }, - _updateCornersFromPoints: function (layer) { + _updateCornersFromPoints: function(layer) { var map = this._map; var i = 0; for (var k in layer._objD) { @@ -943,16 +958,17 @@ L.DistortableCollection = L.FeatureGroup.extend({ layer._reset(); }, - _updateCollectionFromPoints: function (cornerPointDelta, overlay) { - - var layersToMove = this._calcCollectionFromPoints(cornerPointDelta, overlay); + _updateCollectionFromPoints: function(cornerPointDelta, overlay) { + var layersToMove = this._calcCollectionFromPoints( + cornerPointDelta, + overlay + ); - layersToMove.forEach(function (layer) { + layersToMove.forEach(function(layer) { this._updateCornersFromPoints(layer); - layer.fire('update'); + layer.fire("update"); }, this); - }, - + } }); L.DistortableImage = L.DistortableImage || {}; @@ -1146,8 +1162,6 @@ L.DistortableImage.Edit = L.Handler.extend({ /* Interaction modes. */ this._mode = this._overlay.options.mode || 'distort'; - this._group = this._overlay.options.group; - // window._group = this._group; this._transparent = false; this._outlined = false; }, diff --git a/examples/select.html b/examples/select.html index 410ca739b..3e1dbfeee 100644 --- a/examples/select.html +++ b/examples/select.html @@ -49,15 +49,6 @@ id: 'examples.map-i86knfo3' }).addTo(map); - // images = [] - // for (var i in images) { - // img = this - // if (img._leaflet_id != images[i]._leaflet_id) { - /* Deselect (disable) other images */ - // images[i].editing.disable() - - // var imagesFeatureGroup = new L.DistortableCollection().addTo(map); - // window.imagesFeatureGroup = imagesFeatureGroup; map.whenReady(function() { img = new L.DistortableImageOverlay( 'example.png', { @@ -68,7 +59,6 @@ new L.latLng(51.50,-0.14) ], mode: 'lock', - group: imagesFeatureGroup, // HARDCODED: we should find the img w/h dynamically so that it fits the image each time. edgeMinWidth: 521, edgeMinHeight: 348, @@ -85,7 +75,6 @@ new L.latLng(51.49,-0.11), new L.latLng(51.49,-0.15) ], - group: imagesFeatureGroup, // HARDCODED: we should find the img w/h dynamically so that it fits the image each time. (initImageDimensions?) edgeMinWidth: 521, edgeMinHeight: 348 @@ -99,7 +88,6 @@ new L.latLng(51.49,-0.11), new L.latLng(51.49,-0.15) ], - group: imagesFeatureGroup, // HARDCODED: we should find the img w/h dynamically so that it fits the image each time. (initImageDimensions?) edgeMinWidth: 521, edgeMinHeight: 348 @@ -113,7 +101,6 @@ new L.latLng(51.49,-0.11), new L.latLng(51.49,-0.15) ], - group: imagesFeatureGroup, // HARDCODED: we should find the img w/h dynamically so that it fits the image each time. (initImageDimensions?) edgeMinWidth: 521, edgeMinHeight: 348 @@ -125,8 +112,6 @@ L.DomEvent.on(img4._image, 'load', img4.editing.enable, img4.editing); var imagesFeatureGroup = new L.DistortableCollection([img, img2, img3, img4]).addTo(map); - // window.imagesFeatureGroup = imagesFeatureGroup; - // imagesFeatureGroup.addLayer(img); window.img = img; window.img2 = img2; diff --git a/src/DistortableCollection.js b/src/DistortableCollection.js index 1d8779d28..ac5a56e7d 100644 --- a/src/DistortableCollection.js +++ b/src/DistortableCollection.js @@ -1,99 +1,117 @@ L.DistortableCollection = L.FeatureGroup.extend({ include: L.Mixin.Events, - onAdd: function (map) { + onAdd: function(map) { L.FeatureGroup.prototype.onAdd.call(this, map); this._map = map; - L.DomEvent.on(map, 'click', this._removeSelections, this); + L.DomEvent.on(map, "click", this._removeSelections, this); - this.eachLayer(function (layer) { + this.eachLayer(function(layer) { L.DomEvent.on(layer, "drag", this._dragMultiple, this); - L.DomEvent.on(layer, 'dragstart', this._dragStartMultiple, this); + L.DomEvent.on(layer, "dragstart", this._dragStartMultiple, this); }, this); }, - isSelected: function (overlay) { - return L.DomUtil.hasClass(overlay.getElement(), 'selected'); + isSelected: function(overlay) { + return L.DomUtil.hasClass(overlay.getElement(), "selected"); }, onRemove: function() { var map = this._map; - L.DomEvent.off(map, 'click', this._removeSelections, this); + L.DomEvent.off(map, "click", this._removeSelections, this); - this.eachLayer(function (layer) { + this.eachLayer(function(layer) { L.DomEvent.off(layer, "drag", this._dragMultiple, this); - L.DomEvent.off(layer, 'dragstart', this._dragStartMultiple, this); + L.DomEvent.off(layer, "dragstart", this._dragStartMultiple, this); }, this); }, - _getSelectedImages: function () { + _getSelectedImages: function() { return this.getLayers(); }, - _dragMultiple: function (event) { - var layer = event.target, - map = this._map, + _dragStartMultiple: function(event) { + var overlay = event.target, i; - if (!this.isSelected(layer)) {return;} - - layer._dragPoints = {}; - - for (i = 0; i < 4; i++) { - layer._dragPoints[i] = map.latLngToLayerPoint(layer.getCorners()[i]); + if (!this.isSelected(overlay)) { + return; } - layer._cornerPointDelta = this._calcCornerPointDelta(layer); + this.eachLayer(function(layer) { + for (i = 0; i < 4; i++) { + if (layer !== overlay) { + layer.editing._hideToolbar(); + } + layer._dragStartPoints[i] = layer._map.latLngToLayerPoint( + layer.getCorners()[i] + ); + } + }); - this._updateCollectionFromPoints(layer._cornerPointDelta, layer); + overlay._cornerPointDelta = {}; }, - _dragStartMultiple: function (event) { + _dragMultiple: function(event) { var overlay = event.target, + map = this._map, i; - if (!this.isSelected(overlay)) { return; } + if (!this.isSelected(overlay)) { + return; + } - this.eachLayer(function (layer) { - for (i = 0; i < 4; i++) { - if (layer !== overlay) { layer.editing._hideToolbar(); } - layer._dragStartPoints[i] = layer._map.latLngToLayerPoint(layer.getCorners()[i]); - } - }); + overlay._dragPoints = {}; - overlay._cornerPointDelta = {}; - }, + for (i = 0; i < 4; i++) { + overlay._dragPoints[i] = map.latLngToLayerPoint(overlay.getCorners()[i]); + } + + overlay._cornerPointDelta = overlay._calcCornerPointDelta(); - _calcCornerPointDelta: function (layer) { - return layer._dragStartPoints[0].subtract(layer._dragPoints[0]); + this._updateCollectionFromPoints(overlay._cornerPointDelta, overlay); }, - _removeSelections: function () { - this.eachLayer(function (layer) { - L.DomUtil.removeClass(layer.getElement(), 'selected'); - if (layer.editing.toolbar) { layer.editing._hideToolbar(); } + _removeSelections: function() { + this.eachLayer(function(layer) { + L.DomUtil.removeClass(layer.getElement(), "selected"); + if (layer.editing.toolbar) { + layer.editing._hideToolbar(); + } }); }, /** - * images in 'lock' mode are included in this feature group collection for functionalities + * images in 'lock' mode are included in this feature group collection for functionalities * such as export, but are filtered out for editing / dragging here */ - _calcCollectionFromPoints: function (cornerPointDelta, overlay) { - var layersToMove = []; - var transformation = new L.Transformation(1, -cornerPointDelta.x, 1, -cornerPointDelta.y); - this.eachLayer(function (layer) { - window.layerrr = layer; - if ((layer !== overlay && layer.editing._mode !== 'lock') && this.isSelected(layer)) { + _calcCollectionFromPoints: function(cpd, overlay) { + var layersToMove = [], + transformation = new L.Transformation(1, -cpd.x, 1, -cpd.y); + + this.eachLayer(function(layer) { + if ( + layer !== overlay && + layer.editing._mode !== "lock" && + this.isSelected(layer) + ) { layer._objD = {}; - layer._objD.newVal = transformation.transform(layer._dragStartPoints[0]); - layer._objD.newVal1 = transformation.transform(layer._dragStartPoints[1]); - layer._objD.newVal2 = transformation.transform(layer._dragStartPoints[2]); - layer._objD.newVal3 = transformation.transform(layer._dragStartPoints[3]); + layer._objD.newVal = transformation.transform( + layer._dragStartPoints[0] + ); + layer._objD.newVal1 = transformation.transform( + layer._dragStartPoints[1] + ); + layer._objD.newVal2 = transformation.transform( + layer._dragStartPoints[2] + ); + layer._objD.newVal3 = transformation.transform( + layer._dragStartPoints[3] + ); layersToMove.push(layer); } @@ -102,7 +120,7 @@ L.DistortableCollection = L.FeatureGroup.extend({ return layersToMove; }, - _updateCornersFromPoints: function (layer) { + _updateCornersFromPoints: function(layer) { var map = this._map; var i = 0; for (var k in layer._objD) { @@ -113,14 +131,15 @@ L.DistortableCollection = L.FeatureGroup.extend({ layer._reset(); }, - _updateCollectionFromPoints: function (cornerPointDelta, overlay) { - - var layersToMove = this._calcCollectionFromPoints(cornerPointDelta, overlay); + _updateCollectionFromPoints: function(cornerPointDelta, overlay) { + var layersToMove = this._calcCollectionFromPoints( + cornerPointDelta, + overlay + ); - layersToMove.forEach(function (layer) { + layersToMove.forEach(function(layer) { this._updateCornersFromPoints(layer); - layer.fire('update'); + layer.fire("update"); }, this); - }, - + } }); \ No newline at end of file diff --git a/src/DistortableImageOverlay.js b/src/DistortableImageOverlay.js index 69735f299..d27d9c40c 100644 --- a/src/DistortableImageOverlay.js +++ b/src/DistortableImageOverlay.js @@ -5,7 +5,6 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ alt: '', height: 200, crossOrigin: true, - group: '', edgeMinWidth: 500 }, @@ -36,8 +35,6 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ map.on('zoomanim', this._animateZoom, this); } - window.overlay = this; - /* This reset happens before image load; it allows * us to place the image on the map earlier with * "guessed" dimensions. */ @@ -244,9 +241,9 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ }, // Use for translation calculations - for translation the delta for 1 corner applies to all 4 - // _calcCornerPointDelta: function (layer) { - // return layer._dragStartPoints[0].subtract(layer._dragPoints[0]); - // }, + _calcCornerPointDelta: function () { + return this._dragStartPoints[0].subtract(this._dragPoints[0]); + }, _calculateProjectiveTransform: function(latLngToCartesian) { /* Setting reasonable but made-up image defaults diff --git a/src/edit/DistortableImage.Edit.js b/src/edit/DistortableImage.Edit.js index e56211236..7e15b0075 100644 --- a/src/edit/DistortableImage.Edit.js +++ b/src/edit/DistortableImage.Edit.js @@ -29,8 +29,6 @@ L.DistortableImage.Edit = L.Handler.extend({ /* Interaction modes. */ this._mode = this._overlay.options.mode || 'distort'; - this._group = this._overlay.options.group; - // window._group = this._group; this._transparent = false; this._outlined = false; }, From 15cd875899845e8f2408fc37ed041bf768e8d089 Mon Sep 17 00:00:00 2001 From: sashadev-sky Date: Fri, 22 Mar 2019 19:14:19 -0400 Subject: [PATCH 34/63] Refactorings --- dist/leaflet.distortableimage.js | 70 +++++++++++-------------------- src/DistortableCollection.js | 51 +++++++--------------- src/DistortableImageOverlay.js | 20 ++++----- src/edit/DistortableImage.Edit.js | 1 - 4 files changed, 51 insertions(+), 91 deletions(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index a0c5a8b33..a63752c74 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -691,16 +691,16 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ this._reset(); }, - // _updateCornersFromPoints: function (pointsObj) { - // var map = this._map; - // var i = 0; - // for (var k in pointsObj) { - // this._corners[i] = map.layerPointToLatLng(pointsObj[k]); - // i += 1; - // } + _updateCornersFromPoints: function (pointsObj) { + var map = this._map; + var i = 0; + for (var k in pointsObj) { + this._corners[i] = map.layerPointToLatLng(pointsObj[k]); + i += 1; + } - // this._reset(); - // }, + this._reset(); + }, /* Copied from Leaflet v0.7 https://github.com/Leaflet/Leaflet/blob/66282f14bcb180ec87d9818d9f3c9f75afd01b30/src/dom/DomUtil.js#L189-L199 */ /* since L.DomUtil.getTranslateString() is deprecated in Leaflet v1.0 */ @@ -864,9 +864,7 @@ L.DistortableCollection = L.FeatureGroup.extend({ var overlay = event.target, i; - if (!this.isSelected(overlay)) { - return; - } + if (!this.isSelected(overlay)) { return; } this.eachLayer(function(layer) { for (i = 0; i < 4; i++) { @@ -878,8 +876,6 @@ L.DistortableCollection = L.FeatureGroup.extend({ ); } }); - - overlay._cornerPointDelta = {}; }, _dragMultiple: function(event) { @@ -897,9 +893,9 @@ L.DistortableCollection = L.FeatureGroup.extend({ overlay._dragPoints[i] = map.latLngToLayerPoint(overlay.getCorners()[i]); } - overlay._cornerPointDelta = overlay._calcCornerPointDelta(); + var cornerPointDelta = overlay._calcCornerPointDelta(); - this._updateCollectionFromPoints(overlay._cornerPointDelta, overlay); + this._updateCollectionFromPoints(cornerPointDelta, overlay); }, _removeSelections: function() { @@ -917,7 +913,7 @@ L.DistortableCollection = L.FeatureGroup.extend({ */ _calcCollectionFromPoints: function(cpd, overlay) { var layersToMove = [], - transformation = new L.Transformation(1, -cpd.x, 1, -cpd.y); + p = new L.Transformation(1, -cpd.x, 1, -cpd.y); this.eachLayer(function(layer) { if ( @@ -925,20 +921,13 @@ L.DistortableCollection = L.FeatureGroup.extend({ layer.editing._mode !== "lock" && this.isSelected(layer) ) { - layer._objD = {}; - layer._objD.newVal = transformation.transform( - layer._dragStartPoints[0] - ); - layer._objD.newVal1 = transformation.transform( - layer._dragStartPoints[1] - ); - layer._objD.newVal2 = transformation.transform( - layer._dragStartPoints[2] - ); - layer._objD.newVal3 = transformation.transform( - layer._dragStartPoints[3] - ); + layer._cpd = {}; + + layer._cpd.val0 = p.transform(layer._dragStartPoints[0]); + layer._cpd.val1 = p.transform(layer._dragStartPoints[1]); + layer._cpd.val2 = p.transform(layer._dragStartPoints[2]); + layer._cpd.val3 = p.transform(layer._dragStartPoints[3]); layersToMove.push(layer); } @@ -947,25 +936,17 @@ L.DistortableCollection = L.FeatureGroup.extend({ return layersToMove; }, - _updateCornersFromPoints: function(layer) { - var map = this._map; - var i = 0; - for (var k in layer._objD) { - layer._corners[i] = map.layerPointToLatLng(layer._objD[k]); - i += 1; - } - - layer._reset(); - }, - - _updateCollectionFromPoints: function(cornerPointDelta, overlay) { + /** + * cpd === cornerPointDelta + */ + _updateCollectionFromPoints: function(cpd, overlay) { var layersToMove = this._calcCollectionFromPoints( - cornerPointDelta, + cpd, overlay ); layersToMove.forEach(function(layer) { - this._updateCornersFromPoints(layer); + layer._updateCornersFromPoints(layer._cpd); layer.fire("update"); }, this); } @@ -1156,7 +1137,6 @@ L.DistortableImage.Edit = L.Handler.extend({ initialize: function(overlay) { this._overlay = overlay; - // TODO: consider renaming to ._cornersPoints for consistency with current code this._overlay._dragStartPoints = { 0: new L.point(0, 0), 1: new L.point(0, 0), 2: new L.point(0, 0), 3: new L.point(0, 0) }; this._toggledImage = false; diff --git a/src/DistortableCollection.js b/src/DistortableCollection.js index ac5a56e7d..1d76ac229 100644 --- a/src/DistortableCollection.js +++ b/src/DistortableCollection.js @@ -37,9 +37,7 @@ L.DistortableCollection = L.FeatureGroup.extend({ var overlay = event.target, i; - if (!this.isSelected(overlay)) { - return; - } + if (!this.isSelected(overlay)) { return; } this.eachLayer(function(layer) { for (i = 0; i < 4; i++) { @@ -51,8 +49,6 @@ L.DistortableCollection = L.FeatureGroup.extend({ ); } }); - - overlay._cornerPointDelta = {}; }, _dragMultiple: function(event) { @@ -70,9 +66,9 @@ L.DistortableCollection = L.FeatureGroup.extend({ overlay._dragPoints[i] = map.latLngToLayerPoint(overlay.getCorners()[i]); } - overlay._cornerPointDelta = overlay._calcCornerPointDelta(); + var cornerPointDelta = overlay._calcCornerPointDelta(); - this._updateCollectionFromPoints(overlay._cornerPointDelta, overlay); + this._updateCollectionFromPoints(cornerPointDelta, overlay); }, _removeSelections: function() { @@ -90,7 +86,7 @@ L.DistortableCollection = L.FeatureGroup.extend({ */ _calcCollectionFromPoints: function(cpd, overlay) { var layersToMove = [], - transformation = new L.Transformation(1, -cpd.x, 1, -cpd.y); + p = new L.Transformation(1, -cpd.x, 1, -cpd.y); this.eachLayer(function(layer) { if ( @@ -98,20 +94,13 @@ L.DistortableCollection = L.FeatureGroup.extend({ layer.editing._mode !== "lock" && this.isSelected(layer) ) { - layer._objD = {}; - layer._objD.newVal = transformation.transform( - layer._dragStartPoints[0] - ); - layer._objD.newVal1 = transformation.transform( - layer._dragStartPoints[1] - ); - layer._objD.newVal2 = transformation.transform( - layer._dragStartPoints[2] - ); - layer._objD.newVal3 = transformation.transform( - layer._dragStartPoints[3] - ); + layer._cpd = {}; + + layer._cpd.val0 = p.transform(layer._dragStartPoints[0]); + layer._cpd.val1 = p.transform(layer._dragStartPoints[1]); + layer._cpd.val2 = p.transform(layer._dragStartPoints[2]); + layer._cpd.val3 = p.transform(layer._dragStartPoints[3]); layersToMove.push(layer); } @@ -120,25 +109,17 @@ L.DistortableCollection = L.FeatureGroup.extend({ return layersToMove; }, - _updateCornersFromPoints: function(layer) { - var map = this._map; - var i = 0; - for (var k in layer._objD) { - layer._corners[i] = map.layerPointToLatLng(layer._objD[k]); - i += 1; - } - - layer._reset(); - }, - - _updateCollectionFromPoints: function(cornerPointDelta, overlay) { + /** + * cpd === cornerPointDelta + */ + _updateCollectionFromPoints: function(cpd, overlay) { var layersToMove = this._calcCollectionFromPoints( - cornerPointDelta, + cpd, overlay ); layersToMove.forEach(function(layer) { - this._updateCornersFromPoints(layer); + layer._updateCornersFromPoints(layer._cpd); layer.fire("update"); }, this); } diff --git a/src/DistortableImageOverlay.js b/src/DistortableImageOverlay.js index d27d9c40c..77ca40f1c 100644 --- a/src/DistortableImageOverlay.js +++ b/src/DistortableImageOverlay.js @@ -146,16 +146,16 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ this._reset(); }, - // _updateCornersFromPoints: function (pointsObj) { - // var map = this._map; - // var i = 0; - // for (var k in pointsObj) { - // this._corners[i] = map.layerPointToLatLng(pointsObj[k]); - // i += 1; - // } - - // this._reset(); - // }, + _updateCornersFromPoints: function (pointsObj) { + var map = this._map; + var i = 0; + for (var k in pointsObj) { + this._corners[i] = map.layerPointToLatLng(pointsObj[k]); + i += 1; + } + + this._reset(); + }, /* Copied from Leaflet v0.7 https://github.com/Leaflet/Leaflet/blob/66282f14bcb180ec87d9818d9f3c9f75afd01b30/src/dom/DomUtil.js#L189-L199 */ /* since L.DomUtil.getTranslateString() is deprecated in Leaflet v1.0 */ diff --git a/src/edit/DistortableImage.Edit.js b/src/edit/DistortableImage.Edit.js index 7e15b0075..180c0c7ab 100644 --- a/src/edit/DistortableImage.Edit.js +++ b/src/edit/DistortableImage.Edit.js @@ -23,7 +23,6 @@ L.DistortableImage.Edit = L.Handler.extend({ initialize: function(overlay) { this._overlay = overlay; - // TODO: consider renaming to ._cornersPoints for consistency with current code this._overlay._dragStartPoints = { 0: new L.point(0, 0), 1: new L.point(0, 0), 2: new L.point(0, 0), 3: new L.point(0, 0) }; this._toggledImage = false; From 9516d81411a3c7d2935a322ac715f53f7a7dd049 Mon Sep 17 00:00:00 2001 From: sashadev-sky Date: Fri, 22 Mar 2019 19:25:14 -0400 Subject: [PATCH 35/63] Change box shadow to yellow --- dist/leaflet.distortableimage.css | 4 ++++ examples/select.html | 5 ----- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/dist/leaflet.distortableimage.css b/dist/leaflet.distortableimage.css index f15c24434..0aa721b23 100644 --- a/dist/leaflet.distortableimage.css +++ b/dist/leaflet.distortableimage.css @@ -36,3 +36,7 @@ .leaflet-toolbar-tip { box-sizing: border-box; } + +img.leaflet-image-layer.selected { + box-shadow: 0px 0px 0px 12px #ffea00; +} diff --git a/examples/select.html b/examples/select.html index 3e1dbfeee..df313e14d 100644 --- a/examples/select.html +++ b/examples/select.html @@ -19,11 +19,6 @@ - From d4e7110381feaaa36c4a512d24a149cad0211f7b Mon Sep 17 00:00:00 2001 From: sashadev-sky Date: Fri, 22 Mar 2019 20:09:54 -0400 Subject: [PATCH 36/63] Integrate boxzoom multi-selection --- dist/leaflet.distortableimage.js | 31 ++++++++++++++++++++++++++----- src/DistortableCollection.js | 17 +++++++++++++++++ src/edit/BoxSelectHandle.js | 14 +++++++++----- 3 files changed, 52 insertions(+), 10 deletions(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index a63752c74..3608e342a 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -834,6 +834,7 @@ L.DistortableCollection = L.FeatureGroup.extend({ this._map = map; L.DomEvent.on(map, "click", this._removeSelections, this); + L.DomEvent.on(map, "boxzoomend", this._check, this); this.eachLayer(function(layer) { L.DomEvent.on(layer, "drag", this._dragMultiple, this); @@ -856,6 +857,22 @@ L.DistortableCollection = L.FeatureGroup.extend({ }, this); }, + + _check: function(e) { + var boxBounds = e.boxZoomBounds, + i = 0; + + this.eachLayer(function(layer) { + for (i = 0; i < 4; i++) { + if (boxBounds.contains(layer.getCorners()[i]) && layer.editing._mode !== "lock") { + console.log("hit image", layer); + L.DomUtil.addClass(layer._image, "selected"); + break; + } + } + }); + }, + _getSelectedImages: function() { return this.getLayers(); }, @@ -1612,11 +1629,11 @@ L.Map.BoxSelectHandle = L.Map.BoxZoom.extend({ if (this._startLayerPoint.equals(layerPoint)) { return; } - var bounds = new L.LatLngBounds( + this._boxBounds = new L.LatLngBounds( map.layerPointToLatLng(this._startLayerPoint), map.layerPointToLatLng(layerPoint)); - window.bounds = bounds; + window.bounds = this._boxBounds; // window.div = this._div; window.box = this._box; window.pane = this._pane; @@ -1624,10 +1641,10 @@ L.Map.BoxSelectHandle = L.Map.BoxZoom.extend({ window.container = this._container; map.fire('boxzoomend', { - // boxBounds: bounds - }); - + boxZoomBounds: this._boxBounds + }, this); + // window._boxBounds = this._boxBounds; let contents = $(this._pane).children(); let images = contents.filter('img'); @@ -1640,6 +1657,10 @@ L.Map.BoxSelectHandle = L.Map.BoxZoom.extend({ return images; }, + _check: function(e){ + window.zoome = e; + }, + _finish: function () { // if (!this._box) { return false; } // this._pane.removeChild(this._box);[] diff --git a/src/DistortableCollection.js b/src/DistortableCollection.js index 1d76ac229..6b24017b4 100644 --- a/src/DistortableCollection.js +++ b/src/DistortableCollection.js @@ -7,6 +7,7 @@ L.DistortableCollection = L.FeatureGroup.extend({ this._map = map; L.DomEvent.on(map, "click", this._removeSelections, this); + L.DomEvent.on(map, "boxzoomend", this._check, this); this.eachLayer(function(layer) { L.DomEvent.on(layer, "drag", this._dragMultiple, this); @@ -29,6 +30,22 @@ L.DistortableCollection = L.FeatureGroup.extend({ }, this); }, + + _check: function(e) { + var boxBounds = e.boxZoomBounds, + i = 0; + + this.eachLayer(function(layer) { + for (i = 0; i < 4; i++) { + if (boxBounds.contains(layer.getCorners()[i]) && layer.editing._mode !== "lock") { + console.log("hit image", layer); + L.DomUtil.addClass(layer._image, "selected"); + break; + } + } + }); + }, + _getSelectedImages: function() { return this.getLayers(); }, diff --git a/src/edit/BoxSelectHandle.js b/src/edit/BoxSelectHandle.js index 685065c6d..c251bf2b6 100644 --- a/src/edit/BoxSelectHandle.js +++ b/src/edit/BoxSelectHandle.js @@ -63,11 +63,11 @@ L.Map.BoxSelectHandle = L.Map.BoxZoom.extend({ if (this._startLayerPoint.equals(layerPoint)) { return; } - var bounds = new L.LatLngBounds( + this._boxBounds = new L.LatLngBounds( map.layerPointToLatLng(this._startLayerPoint), map.layerPointToLatLng(layerPoint)); - window.bounds = bounds; + window.bounds = this._boxBounds; // window.div = this._div; window.box = this._box; window.pane = this._pane; @@ -75,10 +75,10 @@ L.Map.BoxSelectHandle = L.Map.BoxZoom.extend({ window.container = this._container; map.fire('boxzoomend', { - // boxBounds: bounds - }); - + boxZoomBounds: this._boxBounds + }, this); + // window._boxBounds = this._boxBounds; let contents = $(this._pane).children(); let images = contents.filter('img'); @@ -91,6 +91,10 @@ L.Map.BoxSelectHandle = L.Map.BoxZoom.extend({ return images; }, + _check: function(e){ + window.zoome = e; + }, + _finish: function () { // if (!this._box) { return false; } // this._pane.removeChild(this._box);[] From 069bb9d8f59476c70fcca26b86ebf525b9414cc5 Mon Sep 17 00:00:00 2001 From: sashadev-sky Date: Fri, 22 Mar 2019 22:26:35 -0400 Subject: [PATCH 37/63] Integrate esc key binding --- dist/leaflet.distortableimage.js | 84 ++++++++++++++----------------- src/DistortableCollection.js | 28 +++++++++-- src/edit/BoxSelectHandle.js | 49 ++++-------------- src/edit/DistortableImage.Edit.js | 7 +-- 4 files changed, 76 insertions(+), 92 deletions(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index 3608e342a..c65017296 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -828,14 +828,23 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ L.DistortableCollection = L.FeatureGroup.extend({ include: L.Mixin.Events, + options: { + keymap: { + 27: '_removeSelections' // esc + } + }, + onAdd: function(map) { L.FeatureGroup.prototype.onAdd.call(this, map); this._map = map; + window.thisis = this; - L.DomEvent.on(map, "click", this._removeSelections, this); - L.DomEvent.on(map, "boxzoomend", this._check, this); + L.DomEvent.on(document, "keydown", this._onKeyDown, this); + L.DomEvent.on(map, "click", this._removeSelections, this); + L.DomEvent.on(map, "boxzoomend", this._addSelections, this); + this.eachLayer(function(layer) { L.DomEvent.on(layer, "drag", this._dragMultiple, this); L.DomEvent.on(layer, "dragstart", this._dragStartMultiple, this); @@ -849,7 +858,10 @@ L.DistortableCollection = L.FeatureGroup.extend({ onRemove: function() { var map = this._map; + L.DomEvent.on(document, "keydown", this._onKeyDown, this); + L.DomEvent.off(map, "click", this._removeSelections, this); + L.DomEvent.off(map, "boxzoomend", this._addSelections, this); this.eachLayer(function(layer) { L.DomEvent.off(layer, "drag", this._dragMultiple, this); @@ -857,12 +869,14 @@ L.DistortableCollection = L.FeatureGroup.extend({ }, this); }, - - _check: function(e) { + _addSelections: function(e) { var boxBounds = e.boxZoomBounds, i = 0; this.eachLayer(function(layer) { + if (layer.editing.toolbar) { + layer.editing._hideToolbar(); + } for (i = 0; i < 4; i++) { if (boxBounds.contains(layer.getCorners()[i]) && layer.editing._mode !== "lock") { console.log("hit image", layer); @@ -873,6 +887,12 @@ L.DistortableCollection = L.FeatureGroup.extend({ }); }, + _onKeyDown: function (e) { + if (e.keyCode === 27) { + this._removeSelections(); + } + }, + _getSelectedImages: function() { return this.getLayers(); }, @@ -1136,8 +1156,8 @@ L.DistortableImage.Edit = L.Handler.extend({ opacity: 0.7, outline: '1px solid red', keymap: { - 8: "_removeOverlay", // backspace windows / delete mac - 46: "_removeOverlay", // delete windows / delete + fn mac + 8: '_removeOverlay', // backspace windows / delete mac + 46: '_removeOverlay', // delete windows / delete + fn mac 20: '_toggleRotate', // CAPS 68: '_toggleRotateDistort', // d 69: '_toggleIsolate', // e @@ -1463,7 +1483,8 @@ L.DistortableImage.Edit = L.Handler.extend({ this.disable(); } } - }, + }, + // compare this to using overlay zIndex _toggleOrder: function () { if (this._toggledImage) { @@ -1598,7 +1619,7 @@ L.Map.BoxSelectHandle = L.Map.BoxZoom.extend({ L.DomEvent .on(document, 'mousemove', this._onMouseMove, this) .on(document, 'mouseup', this._onMouseUp, this) - .on(document, 'keydown', this._onKeyDown, this) + // .on(document, 'keydown', this._onKeyDown, this) .preventDefault(e); this._map.fire('boxzoomstart'); @@ -1623,7 +1644,7 @@ L.Map.BoxSelectHandle = L.Map.BoxZoom.extend({ _onMouseUp: function (e) { if (!$(this._pane).children('.leaflet-zoom-box').length) { return false; } - // window.e = e; + var map = this._map, layerPoint = map.mouseEventToLayerPoint(e); @@ -1636,29 +1657,20 @@ L.Map.BoxSelectHandle = L.Map.BoxZoom.extend({ window.bounds = this._boxBounds; // window.div = this._div; window.box = this._box; - window.pane = this._pane; - window.map = map; - window.container = this._container; + // window.pane = this._pane; + // window.map = map; + // window.container = this._container; map.fire('boxzoomend', { boxZoomBounds: this._boxBounds }, this); - // window._boxBounds = this._boxBounds; - - let contents = $(this._pane).children(); - let images = contents.filter('img'); + // let contents = $(this._pane).children(); + // let images = contents.filter('img'); this._finish(); - this._attach(images); - - console.log(images); - return images; - }, - - _check: function(e){ - window.zoome = e; + // return images; }, _finish: function () { @@ -1672,29 +1684,9 @@ L.Map.BoxSelectHandle = L.Map.BoxZoom.extend({ L.DomEvent .off(document, 'mousemove', this._onMouseMove) - .off(document, 'mouseup', this._onMouseUp) - .off(document, 'keydown', this._onKeyDown); + .off(document, 'mouseup', this._onMouseUp); + // .off(document, 'keydown', this._onKeyDown); }, - - _attach: function(images) { - if ($('#holding')) { - this._imagesDiv = $('#holding'); - $(images).appendTo(this._imagesDiv); - window.imagesDiv = this._imagesDiv; - } - }, - - // escape keybinding for getting rid of the selection box (alternative to mouse up). keep for now to see if it will become useful - // in deselecting images - _onKeyDown: function (e) { - if (e.keyCode === 27) { - if ($(this._pane).children('.leaflet-zoom-box').length) { - $(this._box).remove(); - } - // this._finish(); - } - }, - }); L.Map.addInitHook('addHandler', 'boxSelector', L.Map.BoxSelectHandle); \ No newline at end of file diff --git a/src/DistortableCollection.js b/src/DistortableCollection.js index 6b24017b4..d7d02d7a7 100644 --- a/src/DistortableCollection.js +++ b/src/DistortableCollection.js @@ -1,14 +1,23 @@ L.DistortableCollection = L.FeatureGroup.extend({ include: L.Mixin.Events, + options: { + keymap: { + 27: '_removeSelections' // esc + } + }, + onAdd: function(map) { L.FeatureGroup.prototype.onAdd.call(this, map); this._map = map; + window.thisis = this; - L.DomEvent.on(map, "click", this._removeSelections, this); - L.DomEvent.on(map, "boxzoomend", this._check, this); + L.DomEvent.on(document, "keydown", this._onKeyDown, this); + L.DomEvent.on(map, "click", this._removeSelections, this); + L.DomEvent.on(map, "boxzoomend", this._addSelections, this); + this.eachLayer(function(layer) { L.DomEvent.on(layer, "drag", this._dragMultiple, this); L.DomEvent.on(layer, "dragstart", this._dragStartMultiple, this); @@ -22,7 +31,10 @@ L.DistortableCollection = L.FeatureGroup.extend({ onRemove: function() { var map = this._map; + L.DomEvent.on(document, "keydown", this._onKeyDown, this); + L.DomEvent.off(map, "click", this._removeSelections, this); + L.DomEvent.off(map, "boxzoomend", this._addSelections, this); this.eachLayer(function(layer) { L.DomEvent.off(layer, "drag", this._dragMultiple, this); @@ -30,12 +42,14 @@ L.DistortableCollection = L.FeatureGroup.extend({ }, this); }, - - _check: function(e) { + _addSelections: function(e) { var boxBounds = e.boxZoomBounds, i = 0; this.eachLayer(function(layer) { + if (layer.editing.toolbar) { + layer.editing._hideToolbar(); + } for (i = 0; i < 4; i++) { if (boxBounds.contains(layer.getCorners()[i]) && layer.editing._mode !== "lock") { console.log("hit image", layer); @@ -46,6 +60,12 @@ L.DistortableCollection = L.FeatureGroup.extend({ }); }, + _onKeyDown: function (e) { + if (e.keyCode === 27) { + this._removeSelections(); + } + }, + _getSelectedImages: function() { return this.getLayers(); }, diff --git a/src/edit/BoxSelectHandle.js b/src/edit/BoxSelectHandle.js index c251bf2b6..e61d3ab22 100644 --- a/src/edit/BoxSelectHandle.js +++ b/src/edit/BoxSelectHandle.js @@ -32,7 +32,7 @@ L.Map.BoxSelectHandle = L.Map.BoxZoom.extend({ L.DomEvent .on(document, 'mousemove', this._onMouseMove, this) .on(document, 'mouseup', this._onMouseUp, this) - .on(document, 'keydown', this._onKeyDown, this) + // .on(document, 'keydown', this._onKeyDown, this) .preventDefault(e); this._map.fire('boxzoomstart'); @@ -57,7 +57,7 @@ L.Map.BoxSelectHandle = L.Map.BoxZoom.extend({ _onMouseUp: function (e) { if (!$(this._pane).children('.leaflet-zoom-box').length) { return false; } - // window.e = e; + var map = this._map, layerPoint = map.mouseEventToLayerPoint(e); @@ -70,29 +70,20 @@ L.Map.BoxSelectHandle = L.Map.BoxZoom.extend({ window.bounds = this._boxBounds; // window.div = this._div; window.box = this._box; - window.pane = this._pane; - window.map = map; - window.container = this._container; + // window.pane = this._pane; + // window.map = map; + // window.container = this._container; map.fire('boxzoomend', { boxZoomBounds: this._boxBounds }, this); - // window._boxBounds = this._boxBounds; - - let contents = $(this._pane).children(); - let images = contents.filter('img'); + // let contents = $(this._pane).children(); + // let images = contents.filter('img'); this._finish(); - this._attach(images); - - console.log(images); - return images; - }, - - _check: function(e){ - window.zoome = e; + // return images; }, _finish: function () { @@ -106,29 +97,9 @@ L.Map.BoxSelectHandle = L.Map.BoxZoom.extend({ L.DomEvent .off(document, 'mousemove', this._onMouseMove) - .off(document, 'mouseup', this._onMouseUp) - .off(document, 'keydown', this._onKeyDown); + .off(document, 'mouseup', this._onMouseUp); + // .off(document, 'keydown', this._onKeyDown); }, - - _attach: function(images) { - if ($('#holding')) { - this._imagesDiv = $('#holding'); - $(images).appendTo(this._imagesDiv); - window.imagesDiv = this._imagesDiv; - } - }, - - // escape keybinding for getting rid of the selection box (alternative to mouse up). keep for now to see if it will become useful - // in deselecting images - _onKeyDown: function (e) { - if (e.keyCode === 27) { - if ($(this._pane).children('.leaflet-zoom-box').length) { - $(this._box).remove(); - } - // this._finish(); - } - }, - }); L.Map.addInitHook('addHandler', 'boxSelector', L.Map.BoxSelectHandle); \ No newline at end of file diff --git a/src/edit/DistortableImage.Edit.js b/src/edit/DistortableImage.Edit.js index 180c0c7ab..376123eee 100644 --- a/src/edit/DistortableImage.Edit.js +++ b/src/edit/DistortableImage.Edit.js @@ -5,8 +5,8 @@ L.DistortableImage.Edit = L.Handler.extend({ opacity: 0.7, outline: '1px solid red', keymap: { - 8: "_removeOverlay", // backspace windows / delete mac - 46: "_removeOverlay", // delete windows / delete + fn mac + 8: '_removeOverlay', // backspace windows / delete mac + 46: '_removeOverlay', // delete windows / delete + fn mac 20: '_toggleRotate', // CAPS 68: '_toggleRotateDistort', // d 69: '_toggleIsolate', // e @@ -332,7 +332,8 @@ L.DistortableImage.Edit = L.Handler.extend({ this.disable(); } } - }, + }, + // compare this to using overlay zIndex _toggleOrder: function () { if (this._toggledImage) { From 10065e0b78894194421ae93ca688201291cab655 Mon Sep 17 00:00:00 2001 From: sashadev-sky Date: Sat, 23 Mar 2019 05:53:56 -0400 Subject: [PATCH 38/63] undo last commit --- dist/leaflet.distortableimage.js | 73 +++++++++---------------------- src/DistortableCollection.js | 45 +++++++------------ src/edit/BoxSelectHandle.js | 24 +--------- src/edit/DistortableImage.Edit.js | 4 +- 4 files changed, 42 insertions(+), 104 deletions(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index c65017296..85009bc37 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -828,17 +828,10 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ L.DistortableCollection = L.FeatureGroup.extend({ include: L.Mixin.Events, - options: { - keymap: { - 27: '_removeSelections' // esc - } - }, - onAdd: function(map) { L.FeatureGroup.prototype.onAdd.call(this, map); this._map = map; - window.thisis = this; L.DomEvent.on(document, "keydown", this._onKeyDown, this); @@ -846,15 +839,11 @@ L.DistortableCollection = L.FeatureGroup.extend({ L.DomEvent.on(map, "boxzoomend", this._addSelections, this); this.eachLayer(function(layer) { - L.DomEvent.on(layer, "drag", this._dragMultiple, this); L.DomEvent.on(layer, "dragstart", this._dragStartMultiple, this); + L.DomEvent.on(layer, "drag", this._dragMultiple, this); }, this); }, - isSelected: function(overlay) { - return L.DomUtil.hasClass(overlay.getElement(), "selected"); - }, - onRemove: function() { var map = this._map; @@ -864,23 +853,27 @@ L.DistortableCollection = L.FeatureGroup.extend({ L.DomEvent.off(map, "boxzoomend", this._addSelections, this); this.eachLayer(function(layer) { - L.DomEvent.off(layer, "drag", this._dragMultiple, this); L.DomEvent.off(layer, "dragstart", this._dragStartMultiple, this); + L.DomEvent.off(layer, "drag", this._dragMultiple, this); }, this); }, + + isSelected: function (overlay) { + return L.DomUtil.hasClass(overlay.getElement(), "selected"); + }, + + _addSelections: function(e) { - var boxBounds = e.boxZoomBounds, - i = 0; + var box = e.boxZoomBounds, + i = 0; this.eachLayer(function(layer) { - if (layer.editing.toolbar) { - layer.editing._hideToolbar(); - } + var edit = layer.editing; + if (edit.toolbar) { edit._hideToolbar(); } for (i = 0; i < 4; i++) { - if (boxBounds.contains(layer.getCorners()[i]) && layer.editing._mode !== "lock") { - console.log("hit image", layer); - L.DomUtil.addClass(layer._image, "selected"); + if (box.contains(layer.getCorners()[i]) && edit._mode !== "lock") { + L.DomUtil.addClass(layer.getElement(), "selected"); break; } } @@ -888,15 +881,11 @@ L.DistortableCollection = L.FeatureGroup.extend({ }, _onKeyDown: function (e) { - if (e.keyCode === 27) { + if (e.key === 'Escape') { this._removeSelections(); } }, - _getSelectedImages: function() { - return this.getLayers(); - }, - _dragStartMultiple: function(event) { var overlay = event.target, i; @@ -920,9 +909,7 @@ L.DistortableCollection = L.FeatureGroup.extend({ map = this._map, i; - if (!this.isSelected(overlay)) { - return; - } + if (!this.isSelected(overlay)) { return; } overlay._dragPoints = {}; @@ -1159,6 +1146,7 @@ L.DistortableImage.Edit = L.Handler.extend({ 8: '_removeOverlay', // backspace windows / delete mac 46: '_removeOverlay', // delete windows / delete + fn mac 20: '_toggleRotate', // CAPS + 27: '_removeSelections', // esc 68: '_toggleRotateDistort', // d 69: '_toggleIsolate', // e 73: '_toggleIsolate', // i @@ -1347,7 +1335,8 @@ L.DistortableImage.Edit = L.Handler.extend({ handlerName = keymap[event.which]; if (handlerName !== undefined && this._overlay.options.suppressToolbar !== true) { - this[handlerName].call(this); + if (handlerName === '_removeSelections') { return; } + else { this[handlerName].call(this); } } }, @@ -1619,7 +1608,6 @@ L.Map.BoxSelectHandle = L.Map.BoxZoom.extend({ L.DomEvent .on(document, 'mousemove', this._onMouseMove, this) .on(document, 'mouseup', this._onMouseUp, this) - // .on(document, 'keydown', this._onKeyDown, this) .preventDefault(e); this._map.fire('boxzoomstart'); @@ -1643,8 +1631,6 @@ L.Map.BoxSelectHandle = L.Map.BoxZoom.extend({ }, _onMouseUp: function (e) { - if (!$(this._pane).children('.leaflet-zoom-box').length) { return false; } - var map = this._map, layerPoint = map.mouseEventToLayerPoint(e); @@ -1654,29 +1640,13 @@ L.Map.BoxSelectHandle = L.Map.BoxZoom.extend({ map.layerPointToLatLng(this._startLayerPoint), map.layerPointToLatLng(layerPoint)); - window.bounds = this._boxBounds; - // window.div = this._div; - window.box = this._box; - // window.pane = this._pane; - // window.map = map; - // window.container = this._container; - - map.fire('boxzoomend', { - boxZoomBounds: this._boxBounds - }, this); - - // let contents = $(this._pane).children(); - // let images = contents.filter('img'); + map.fire('boxzoomend', { boxZoomBounds: this._boxBounds }); this._finish(); - - // return images; }, _finish: function () { - // if (!this._box) { return false; } - // this._pane.removeChild(this._box);[] - $(this._box).remove(); + L.DomUtil.remove(this._box); this._container.style.cursor = ''; L.DomUtil.enableTextSelection(); @@ -1685,7 +1655,6 @@ L.Map.BoxSelectHandle = L.Map.BoxZoom.extend({ L.DomEvent .off(document, 'mousemove', this._onMouseMove) .off(document, 'mouseup', this._onMouseUp); - // .off(document, 'keydown', this._onKeyDown); }, }); diff --git a/src/DistortableCollection.js b/src/DistortableCollection.js index d7d02d7a7..22a4d85d0 100644 --- a/src/DistortableCollection.js +++ b/src/DistortableCollection.js @@ -1,17 +1,10 @@ L.DistortableCollection = L.FeatureGroup.extend({ include: L.Mixin.Events, - options: { - keymap: { - 27: '_removeSelections' // esc - } - }, - onAdd: function(map) { L.FeatureGroup.prototype.onAdd.call(this, map); this._map = map; - window.thisis = this; L.DomEvent.on(document, "keydown", this._onKeyDown, this); @@ -19,15 +12,11 @@ L.DistortableCollection = L.FeatureGroup.extend({ L.DomEvent.on(map, "boxzoomend", this._addSelections, this); this.eachLayer(function(layer) { - L.DomEvent.on(layer, "drag", this._dragMultiple, this); L.DomEvent.on(layer, "dragstart", this._dragStartMultiple, this); + L.DomEvent.on(layer, "drag", this._dragMultiple, this); }, this); }, - isSelected: function(overlay) { - return L.DomUtil.hasClass(overlay.getElement(), "selected"); - }, - onRemove: function() { var map = this._map; @@ -37,23 +26,27 @@ L.DistortableCollection = L.FeatureGroup.extend({ L.DomEvent.off(map, "boxzoomend", this._addSelections, this); this.eachLayer(function(layer) { - L.DomEvent.off(layer, "drag", this._dragMultiple, this); L.DomEvent.off(layer, "dragstart", this._dragStartMultiple, this); + L.DomEvent.off(layer, "drag", this._dragMultiple, this); }, this); }, + + isSelected: function (overlay) { + return L.DomUtil.hasClass(overlay.getElement(), "selected"); + }, + + _addSelections: function(e) { - var boxBounds = e.boxZoomBounds, - i = 0; + var box = e.boxZoomBounds, + i = 0; this.eachLayer(function(layer) { - if (layer.editing.toolbar) { - layer.editing._hideToolbar(); - } + var edit = layer.editing; + if (edit.toolbar) { edit._hideToolbar(); } for (i = 0; i < 4; i++) { - if (boxBounds.contains(layer.getCorners()[i]) && layer.editing._mode !== "lock") { - console.log("hit image", layer); - L.DomUtil.addClass(layer._image, "selected"); + if (box.contains(layer.getCorners()[i]) && edit._mode !== "lock") { + L.DomUtil.addClass(layer.getElement(), "selected"); break; } } @@ -61,15 +54,11 @@ L.DistortableCollection = L.FeatureGroup.extend({ }, _onKeyDown: function (e) { - if (e.keyCode === 27) { + if (e.key === 'Escape') { this._removeSelections(); } }, - _getSelectedImages: function() { - return this.getLayers(); - }, - _dragStartMultiple: function(event) { var overlay = event.target, i; @@ -93,9 +82,7 @@ L.DistortableCollection = L.FeatureGroup.extend({ map = this._map, i; - if (!this.isSelected(overlay)) { - return; - } + if (!this.isSelected(overlay)) { return; } overlay._dragPoints = {}; diff --git a/src/edit/BoxSelectHandle.js b/src/edit/BoxSelectHandle.js index e61d3ab22..5f867963c 100644 --- a/src/edit/BoxSelectHandle.js +++ b/src/edit/BoxSelectHandle.js @@ -32,7 +32,6 @@ L.Map.BoxSelectHandle = L.Map.BoxZoom.extend({ L.DomEvent .on(document, 'mousemove', this._onMouseMove, this) .on(document, 'mouseup', this._onMouseUp, this) - // .on(document, 'keydown', this._onKeyDown, this) .preventDefault(e); this._map.fire('boxzoomstart'); @@ -56,8 +55,6 @@ L.Map.BoxSelectHandle = L.Map.BoxZoom.extend({ }, _onMouseUp: function (e) { - if (!$(this._pane).children('.leaflet-zoom-box').length) { return false; } - var map = this._map, layerPoint = map.mouseEventToLayerPoint(e); @@ -67,29 +64,13 @@ L.Map.BoxSelectHandle = L.Map.BoxZoom.extend({ map.layerPointToLatLng(this._startLayerPoint), map.layerPointToLatLng(layerPoint)); - window.bounds = this._boxBounds; - // window.div = this._div; - window.box = this._box; - // window.pane = this._pane; - // window.map = map; - // window.container = this._container; - - map.fire('boxzoomend', { - boxZoomBounds: this._boxBounds - }, this); - - // let contents = $(this._pane).children(); - // let images = contents.filter('img'); + map.fire('boxzoomend', { boxZoomBounds: this._boxBounds }); this._finish(); - - // return images; }, _finish: function () { - // if (!this._box) { return false; } - // this._pane.removeChild(this._box);[] - $(this._box).remove(); + L.DomUtil.remove(this._box); this._container.style.cursor = ''; L.DomUtil.enableTextSelection(); @@ -98,7 +79,6 @@ L.Map.BoxSelectHandle = L.Map.BoxZoom.extend({ L.DomEvent .off(document, 'mousemove', this._onMouseMove) .off(document, 'mouseup', this._onMouseUp); - // .off(document, 'keydown', this._onKeyDown); }, }); diff --git a/src/edit/DistortableImage.Edit.js b/src/edit/DistortableImage.Edit.js index 376123eee..113062b2d 100644 --- a/src/edit/DistortableImage.Edit.js +++ b/src/edit/DistortableImage.Edit.js @@ -8,6 +8,7 @@ L.DistortableImage.Edit = L.Handler.extend({ 8: '_removeOverlay', // backspace windows / delete mac 46: '_removeOverlay', // delete windows / delete + fn mac 20: '_toggleRotate', // CAPS + 27: '_removeSelections', // esc 68: '_toggleRotateDistort', // d 69: '_toggleIsolate', // e 73: '_toggleIsolate', // i @@ -196,7 +197,8 @@ L.DistortableImage.Edit = L.Handler.extend({ handlerName = keymap[event.which]; if (handlerName !== undefined && this._overlay.options.suppressToolbar !== true) { - this[handlerName].call(this); + if (handlerName === '_removeSelections') { return; } + else { this[handlerName].call(this); } } }, From 7e5c975ce93e7db6db24253c27accc4b430e0abf Mon Sep 17 00:00:00 2001 From: sashadev-sky Date: Sat, 23 Mar 2019 06:38:33 -0400 Subject: [PATCH 39/63] Begin updating README --- README.md | 80 ++++++++++++++++++++++++++++++++------------ examples/select.html | 4 +-- 2 files changed, 59 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index ed46fd61e..63c1e2f28 100644 --- a/README.md +++ b/README.md @@ -7,14 +7,14 @@ A Leaflet extension to distort images -- "rubbersheeting" -- for the [MapKnitter Advantages include: -* it can handle over 100 images smoothly, even on a smartphone. -* images can be right-clicked and downloaded individually in their original state +* It can handle over 100 images smoothly, even on a smartphone. +* Images can be right-clicked and downloaded individually in their original state * CSS3 transforms are GPU-accelerated in most (all?) browsers, for a very smooth UI -* no need to server-side generate raster GeoTiffs, tilesets, etc in order to view distorted imagery layers -* images use DOM event handling for real-time distortion -* [full resolution download option](https://github.com/publiclab/Leaflet.DistortableImage/pull/100) for large images, using WebGL acceleration +* No need to server-side generate raster GeoTiffs, tilesets, etc. in order to view distorted imagery layers +* Images use DOM event handling for real-time distortion +* [Full resolution download option](https://github.com/publiclab/Leaflet.DistortableImage/pull/100) for large images, using WebGL acceleration -[Download as zip](https://github.com/publiclab/Leaflet.DistortableImage/releases) or clone to get a copy of the repo. +[Download as zip](https://github.com/publiclab/Leaflet.DistortableImage/releases) or clone the repo to get a local copy. This plugin has basic functionality, and is in production as part of MapKnitter, but there are [plenty of outstanding issues to resolve](https://github.com/publiclab/Leaflet.DistortableImage/issues). Please consider helping out! @@ -34,7 +34,11 @@ And watch this GIF demo: To test the code, open `index.html` in your browser and click and drag the markers on the edges of the image. The image will show perspectival distortions. -## Usage +To test the multi-image interface, open `select.html`. Currently it supports multiple image selection and translations; image distortions still use the single-image interface. + +## Basic Usage + +The most simple implementation to get started: ```js // basic Leaflet map setup @@ -56,11 +60,11 @@ img = new L.DistortableImageOverlay( new L.latLng(51.50,-0.10), new L.latLng(51.50,-0.14) ], - fullResolutionSrc: 'large.jpg' // optionally pass in a higher resolution image to use in full-res exporting } ).addTo(map); -L.DomEvent.on(img._image, 'load', img.editing.enable, img.editing); // enable editing +// enable editing +L.DomEvent.on(img._image, 'load', img.editing.enable, img.editing); ``` @@ -74,19 +78,32 @@ We've added a GPU-accelerated means to generate a full resolution version of the ``` -## Usage + +When instantiating a Distortable Image, pass in a `fullResolutionSrc` option set to the url of the higher resolution image. This image will be used in full-res exporting. ```js -// basic Leaflet map setup -map = new L.map('map').setView([51.505, -0.09], 13); -L.tileLayer('https://{s}.tiles.mapbox.com/v3/anishshah101.ipm9j6em/{z}/{x}/{y}.png', { - maxZoom: 18, - attribution: 'Map data © OpenStreetMap contributors, ' + - 'CC-BY-SA, ' + - 'Imagery © Mapbox', - id: 'examples.map-i86knfo3' -}).addTo(map); +// create an image +img = new L.DistortableImageOverlay( + 'example.png', { + corners: [ + new L.latLng(51.52,-0.10), + new L.latLng(51.52,-0.14), + new L.latLng(51.50,-0.10), + new L.latLng(51.50,-0.14) + ], + fullResolutionSrc: 'large.jpg' + } +).addTo(map); + +L.DomEvent.on(img._image, 'load', img.editing.enable, img.editing); + +``` + +## Multiple Image Functionality + + +```js // create an image img = new L.DistortableImageOverlay( 'example.png', { @@ -96,16 +113,35 @@ img = new L.DistortableImageOverlay( new L.latLng(51.50,-0.10), new L.latLng(51.50,-0.14) ], - fullResolutionSrc: 'large.jpg' // optionally pass in a higher resolution image to use in full-res exporting + fullResolutionSrc: 'large.jpg' +).addTo(map); + +// create a second image +img2 = new L.DistortableImageOverlay( + 'example.png', { + corners: [ + new L.latLng(51.52,-0.10), + new L.latLng(51.52,-0.14), + new L.latLng(51.50,-0.10), + new L.latLng(51.50,-0.14) + ], + fullResolutionSrc: 'large.jpg' } ).addTo(map); -L.DomEvent.on(img._image, 'load', img.editing.enable, img.editing); // enable editing +L.DomEvent.on(img._image, 'load', img.editing.enable, img.editing); +L.DomEvent.on(img2._image, 'load', img2.editing.enable, img2.editing); + + +var imagesFeatureGroup = new L.DistortableCollection([img, img2]).addTo(map); ``` + + + ## Image-ordering -For multiple images, we've added a `ToggleOrder` action, that switches overlapping images back and forth into view by employing the [`bringToFront()`](https://leafletjs.com/reference-1.4.0.html#popup-bringtofront) and [`bringToBack()`](https://leafletjs.com/reference-1.4.0.html#popup-bringtoback). +For multiple images, we've added a `ToggleOrder` action, that switches overlapping images back and forth into view by employing [`bringToFront()`](https://leafletjs.com/reference-1.4.0.html#popup-bringtofront) and [`bringToBack()`](https://leafletjs.com/reference-1.4.0.html#popup-bringtoback) from the Leaflet API. ```js ToggleOrder = EditOverlayAction.extend({ diff --git a/examples/select.html b/examples/select.html index df313e14d..e137a141b 100644 --- a/examples/select.html +++ b/examples/select.html @@ -106,12 +106,10 @@ L.DomEvent.on(img3._image, 'load', img3.editing.enable, img3.editing); L.DomEvent.on(img4._image, 'load', img4.editing.enable, img4.editing); - var imagesFeatureGroup = new L.DistortableCollection([img, img2, img3, img4]).addTo(map); + new L.DistortableCollection([img, img2, img3, img4]).addTo(map); window.img = img; window.img2 = img2; - - // L.DomEvent.on(layer2._image, 'load', layer2.editing.enable, layer2.editing); }, this); })(); From 11b41115e633155d2d1f41f3ef653ee7b75ba6b8 Mon Sep 17 00:00:00 2001 From: sashadev-sky Date: Sat, 23 Mar 2019 07:20:33 -0400 Subject: [PATCH 40/63] Add sample code to readme --- README.md | 48 +++++++++++++++----------------------------- examples/select.html | 2 +- 2 files changed, 17 insertions(+), 33 deletions(-) diff --git a/README.md b/README.md index 63c1e2f28..dfc5d8b7c 100644 --- a/README.md +++ b/README.md @@ -34,8 +34,6 @@ And watch this GIF demo: To test the code, open `index.html` in your browser and click and drag the markers on the edges of the image. The image will show perspectival distortions. -To test the multi-image interface, open `select.html`. Currently it supports multiple image selection and translations; image distortions still use the single-image interface. - ## Basic Usage The most simple implementation to get started: @@ -99,49 +97,35 @@ L.DomEvent.on(img._image, 'load', img.editing.enable, img.editing); ``` -## Multiple Image Functionality +## Multiple Images +To test the multi-image interface, open `select.html`. Currently it supports multiple image selection and translations; image distortions still use the single-image interface. + - Multiple images can be selected using: -```js -// create an image -img = new L.DistortableImageOverlay( - 'example.png', { - corners: [ - new L.latLng(51.52,-0.10), - new L.latLng(51.52,-0.14), - new L.latLng(51.50,-0.10), - new L.latLng(51.50,-0.14) - ], - fullResolutionSrc: 'large.jpg' -).addTo(map); + - a) cmd + `click`: to select one at a time -// create a second image -img2 = new L.DistortableImageOverlay( - 'example.png', { - corners: [ - new L.latLng(51.52,-0.10), - new L.latLng(51.52,-0.14), - new L.latLng(51.50,-0.10), - new L.latLng(51.50,-0.14) - ], - fullResolutionSrc: 'large.jpg' - } -).addTo(map); + - b) shift + `drag`: create and expand a selection box over the area you want selected. -L.DomEvent.on(img._image, 'load', img.editing.enable, img.editing); -L.DomEvent.on(img2._image, 'load', img2.editing.enable, img2.editing); + - *For selection accuracy - drag over the image selection markers from bottom right -> upper left +Our `DistortableCollection` class allows working with multiple images simultaneously. Say we instantiated 3 images, saved them to the variables `img`, `img2`, and `img3`, and enabled editing on all of them. To access the UI and functionalities available in the multiple image interface, pass them to the collection class: -var imagesFeatureGroup = new L.DistortableCollection([img, img2]).addTo(map); -``` +```js +// OPTION 1: Pass in images immediately +new L.DistortableCollection([img, img2]).addTo(map); + +// OPTION 2: Instantiate an empty collection and pass in images later +var imageFeatureGroup = new L.DistortableCollection().addTo(map); +imageFeatureGroup.addLayer(img); imageFeatureGroup.addLayer(img2); +``` ## Image-ordering -For multiple images, we've added a `ToggleOrder` action, that switches overlapping images back and forth into view by employing [`bringToFront()`](https://leafletjs.com/reference-1.4.0.html#popup-bringtofront) and [`bringToBack()`](https://leafletjs.com/reference-1.4.0.html#popup-bringtoback) from the Leaflet API. +For multiple images, we've also added a `ToggleOrder` action, that switches overlapping images back and forth into view by employing [`bringToFront()`](https://leafletjs.com/reference-1.4.0.html#popup-bringtofront) and [`bringToBack()`](https://leafletjs.com/reference-1.4.0.html#popup-bringtoback) from the Leaflet API. ```js ToggleOrder = EditOverlayAction.extend({ diff --git a/examples/select.html b/examples/select.html index e137a141b..943dfc853 100644 --- a/examples/select.html +++ b/examples/select.html @@ -58,7 +58,7 @@ edgeMinWidth: 521, edgeMinHeight: 348, }).addTo(map); - // images.push(img) + // L.DomEvent.on(img._image, 'click', select, img); // create a second image From 6ea5ccdf3ae8d890163272cdd1c9a1e7ab3a6d40 Mon Sep 17 00:00:00 2001 From: sashadev-sky Date: Sat, 23 Mar 2019 07:36:10 -0400 Subject: [PATCH 41/63] Finish README --- README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index dfc5d8b7c..f1ab5b0fa 100644 --- a/README.md +++ b/README.md @@ -111,15 +111,16 @@ To test the multi-image interface, open `select.html`. Currently it supports mul Our `DistortableCollection` class allows working with multiple images simultaneously. Say we instantiated 3 images, saved them to the variables `img`, `img2`, and `img3`, and enabled editing on all of them. To access the UI and functionalities available in the multiple image interface, pass them to the collection class: - ```js // OPTION 1: Pass in images immediately -new L.DistortableCollection([img, img2]).addTo(map); +new L.DistortableCollection([img, img2, img3]).addTo(map); // OPTION 2: Instantiate an empty collection and pass in images later var imageFeatureGroup = new L.DistortableCollection().addTo(map); -imageFeatureGroup.addLayer(img); imageFeatureGroup.addLayer(img2); +imageFeatureGroup.addLayer(img); +imageFeatureGroup.addLayer(img2); +imageFeatureGroup.addLayer(img3); ``` From cf843a075aadd6e4281218a71a9576e52713abbf Mon Sep 17 00:00:00 2001 From: sashadev-sky Date: Sat, 23 Mar 2019 21:02:30 -0400 Subject: [PATCH 42/63] Add tests for locking / selection as part of documentation --- dist/leaflet.distortableimage.js | 1 + src/DistortableCollection.js | 1 + test/karma.conf.js | 6 ++ test/src/DistortableCollectionSpec.js | 122 ++++++++++++++++++++++++++ 4 files changed, 130 insertions(+) create mode 100644 test/src/DistortableCollectionSpec.js diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index 85009bc37..d46b5c440 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -928,6 +928,7 @@ L.DistortableCollection = L.FeatureGroup.extend({ if (layer.editing.toolbar) { layer.editing._hideToolbar(); } + console.log(layer.editing.toolbar); }); }, diff --git a/src/DistortableCollection.js b/src/DistortableCollection.js index 22a4d85d0..37e7b5e7d 100644 --- a/src/DistortableCollection.js +++ b/src/DistortableCollection.js @@ -101,6 +101,7 @@ L.DistortableCollection = L.FeatureGroup.extend({ if (layer.editing.toolbar) { layer.editing._hideToolbar(); } + console.log(layer.editing.toolbar); }); }, diff --git a/test/karma.conf.js b/test/karma.conf.js index 8be970a95..11401b0b6 100644 --- a/test/karma.conf.js +++ b/test/karma.conf.js @@ -33,17 +33,23 @@ module.exports = function(config) { "node_modules/chai/chai.js", "node_modules/sinon/pkg/sinon.js", "src/util/*.js", +<<<<<<< HEAD "src/edit/getEXIFdata.js", +======= + "src/edit/BoxSelectHandle.js", +>>>>>>> Add tests for locking / selection as part of documentation "src/edit/EditHandle.js", "src/edit/LockHandle.js", "src/edit/DistortHandle.js", "src/edit/RotateAndScaleHandle.js", "src/edit/RotateHandle.js", "src/edit/ScaleHandle.js", + "src/DistortableCollection.js", "src/DistortableImageOverlay.js", "src/edit/DistortableImage.EditToolbar.js", "src/edit/DistortableImage.Edit.js", "test/SpecHelper.js", + "test/src/*Spec.js", "test/src/**/*Spec.js" ], diff --git a/test/src/DistortableCollectionSpec.js b/test/src/DistortableCollectionSpec.js new file mode 100644 index 000000000..c084d51cf --- /dev/null +++ b/test/src/DistortableCollectionSpec.js @@ -0,0 +1,122 @@ +function simulateClick(el) { + if (document.createEvent) { + var e = document.createEvent('MouseEvents'); + e.initMouseEvent('mousedown', true, true, window, + 0, 0, 0, 0, 0, true, false, false, true, 0, null); + return el.dispatchEvent(e); + // } else if (el.fireEvent) { + // return el.fireEvent('mousedown'); + } +}; + +describe("L.DistortableCollection", function () { + var map, + overlay, + overlay2, + imageFeatureGroup; + + beforeEach(function (done) { + map = new L.Map(L.DomUtil.create('div', '', document.body)).setView([41.7896, -87.5996], 15); + + overlay = new L.DistortableImageOverlay('/examples/example.png', { + corners: [ + new L.LatLng(41.7934, -87.6052), + new L.LatLng(41.7934, -87.5852), + new L.LatLng(41.7834, -87.5852), + new L.LatLng(41.7834, -87.6052) + ] + }).addTo(map); + + overlay2 = new L.DistortableImageOverlay('/examples/example.png', { + corners: [ + new L.LatLng(41.7934, -87.6050), + new L.LatLng(41.7934, -87.5850), + new L.LatLng(41.7834, -87.5850), + new L.LatLng(41.7834, -87.6050) + ] + }).addTo(map); + + /* Forces the image to load before any tests are run. */ + // L.DomEvent.on(overlay._image, 'load', function () { + // L.DomEvent.on(overlay2._image, 'load'); + // done(); + // }); + + L.DomEvent.on(overlay._image, 'load', function () { + overlay.editing.enable(); + overlay2.editing.enable(); + imageFeatureGroup = new L.DistortableCollection([overlay, overlay2]).addTo(map); + done(); + }); + + afterEach(function () { + L.DomUtil.remove(overlay); + L.DomUtil.remove(overlay2); + }); + + + // overlay.editing.enable(); + // overlay2.editing.enable(); + + // imageFeatureGroup = new L.DistortableCollection([overlay]).addTo(map); + }); + it.skip("Should keep selected images in sync with eachother during translation", function () { + L.DomUtil.addClass(overlay.getElement(), "selected"); + L.DomUtil.addClass(overlay2.getElement(), "selected"); + + dragging = overlay.editing.dragging; + dragging = overlay2.editing.dragging; + + overlay._reset(); + overlay2._reset(); + + L.DomEvent.on(overlay, "dragstart", this._dragStartMultiple, this); + L.DomEvent.on(overlay, "drag", this._dragMultiple, this); + + dragging._onDown({ touches: [{ clientX: 0, clientY: 0 }], target: overlay._image }); + dragging._onMove({ touches: [{ clientX: 20, clientY: 30 }], target: overlay._image }); + dragging._onUp(); + + map.setView([41.7896, -87.6996]); + + + }); + + it("Should deselect all images on map click", function() { + L.DomUtil.addClass(overlay.getElement(), "selected"); + L.DomUtil.addClass(overlay2.getElement(), "selected"); + + map.fire('click'); + + var classStr = L.DomUtil.getClass(overlay.getElement()); + var classStr2 = L.DomUtil.getClass(overlay2.getElement()); + + expect(classStr).to.not.include("selected"); + expect(classStr2).to.not.include("selected"); + }); + + it("Should allow selection of an image on command + click", function() { + + L.DomUtil.removeClass(overlay.getElement(), "selected"); + + simulateClick(overlay.getElement()); + + var classStr = L.DomUtil.getClass(overlay.getElement()); + + expect(classStr).to.include("selected"); + }); + + it("But it should now allow selection of a locked image", function() { + + L.DomUtil.removeClass(overlay.getElement(), "selected"); + overlay.editing._mode = "lock"; + + simulateClick(overlay.getElement()); + + var classStr = L.DomUtil.getClass(overlay.getElement()); + + expect(classStr).to.not.include("selected"); + }); + + +}); From 72b9779daca28908a5609ed831007e6adccaee38 Mon Sep 17 00:00:00 2001 From: sashadev-sky Date: Sat, 23 Mar 2019 21:36:50 -0400 Subject: [PATCH 43/63] Finalize PR --- dist/leaflet.distortableimage.js | 12 ++++--- examples/select.html | 4 +-- src/edit/DistortableImage.Edit.js | 11 ++++-- test/src/DistortableCollectionSpec.js | 42 +++-------------------- test/src/edit/RotateAndScaleHandleSpec.js | 4 +++ 5 files changed, 27 insertions(+), 46 deletions(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index d46b5c440..81916e29a 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -928,7 +928,6 @@ L.DistortableCollection = L.FeatureGroup.extend({ if (layer.editing.toolbar) { layer.editing._hideToolbar(); } - console.log(layer.editing.toolbar); }); }, @@ -1163,7 +1162,6 @@ L.DistortableImage.Edit = L.Handler.extend({ initialize: function(overlay) { this._overlay = overlay; - this._overlay._dragStartPoints = { 0: new L.point(0, 0), 1: new L.point(0, 0), 2: new L.point(0, 0), 3: new L.point(0, 0) }; this._toggledImage = false; /* Interaction modes. */ @@ -1219,6 +1217,13 @@ L.DistortableImage.Edit = L.Handler.extend({ this._enableDragging(); } + this._overlay._dragStartPoints = { + 0: new L.point(0, 0), + 1: new L.point(0, 0), + 2: new L.point(0, 0), + 3: new L.point(0, 0) + }; + L.DomEvent.on(overlay._image, 'click', this._showToolbar, this); L.DomEvent.on(overlay._image, 'mousedown', this._toggleSelections, this); @@ -1239,8 +1244,7 @@ L.DistortableImage.Edit = L.Handler.extend({ L.DomEvent.off(overlay._image, 'mousedown', this._toggleSelections, this); - // First, check if dragging exists; - // it may be off due to locking + // First, check if dragging exists - it may be off due to locking if (this.dragging) { this.dragging.disable(); } delete this.dragging; diff --git a/examples/select.html b/examples/select.html index 943dfc853..0519d867b 100644 --- a/examples/select.html +++ b/examples/select.html @@ -108,8 +108,8 @@ new L.DistortableCollection([img, img2, img3, img4]).addTo(map); - window.img = img; - window.img2 = img2; + // window.img = img; + // window.img2 = img2; }, this); })(); diff --git a/src/edit/DistortableImage.Edit.js b/src/edit/DistortableImage.Edit.js index 113062b2d..60d19a742 100644 --- a/src/edit/DistortableImage.Edit.js +++ b/src/edit/DistortableImage.Edit.js @@ -24,7 +24,6 @@ L.DistortableImage.Edit = L.Handler.extend({ initialize: function(overlay) { this._overlay = overlay; - this._overlay._dragStartPoints = { 0: new L.point(0, 0), 1: new L.point(0, 0), 2: new L.point(0, 0), 3: new L.point(0, 0) }; this._toggledImage = false; /* Interaction modes. */ @@ -80,6 +79,13 @@ L.DistortableImage.Edit = L.Handler.extend({ this._enableDragging(); } + this._overlay._dragStartPoints = { + 0: new L.point(0, 0), + 1: new L.point(0, 0), + 2: new L.point(0, 0), + 3: new L.point(0, 0) + }; + L.DomEvent.on(overlay._image, 'click', this._showToolbar, this); L.DomEvent.on(overlay._image, 'mousedown', this._toggleSelections, this); @@ -100,8 +106,7 @@ L.DistortableImage.Edit = L.Handler.extend({ L.DomEvent.off(overlay._image, 'mousedown', this._toggleSelections, this); - // First, check if dragging exists; - // it may be off due to locking + // First, check if dragging exists - it may be off due to locking if (this.dragging) { this.dragging.disable(); } delete this.dragging; diff --git a/test/src/DistortableCollectionSpec.js b/test/src/DistortableCollectionSpec.js index c084d51cf..21d6236c7 100644 --- a/test/src/DistortableCollectionSpec.js +++ b/test/src/DistortableCollectionSpec.js @@ -1,11 +1,9 @@ -function simulateClick(el) { +function simulateCommandClick(el) { if (document.createEvent) { var e = document.createEvent('MouseEvents'); e.initMouseEvent('mousedown', true, true, window, 0, 0, 0, 0, 0, true, false, false, true, 0, null); return el.dispatchEvent(e); - // } else if (el.fireEvent) { - // return el.fireEvent('mousedown'); } }; @@ -36,12 +34,7 @@ describe("L.DistortableCollection", function () { ] }).addTo(map); - /* Forces the image to load before any tests are run. */ - // L.DomEvent.on(overlay._image, 'load', function () { - // L.DomEvent.on(overlay2._image, 'load'); - // done(); - // }); - + /* Forces the images and feature group to load before any tests are run. */ L.DomEvent.on(overlay._image, 'load', function () { overlay.editing.enable(); overlay2.editing.enable(); @@ -54,31 +47,9 @@ describe("L.DistortableCollection", function () { L.DomUtil.remove(overlay2); }); - - // overlay.editing.enable(); - // overlay2.editing.enable(); - - // imageFeatureGroup = new L.DistortableCollection([overlay]).addTo(map); }); - it.skip("Should keep selected images in sync with eachother during translation", function () { - L.DomUtil.addClass(overlay.getElement(), "selected"); - L.DomUtil.addClass(overlay2.getElement(), "selected"); - - dragging = overlay.editing.dragging; - dragging = overlay2.editing.dragging; - - overlay._reset(); - overlay2._reset(); - - L.DomEvent.on(overlay, "dragstart", this._dragStartMultiple, this); - L.DomEvent.on(overlay, "drag", this._dragMultiple, this); - - dragging._onDown({ touches: [{ clientX: 0, clientY: 0 }], target: overlay._image }); - dragging._onMove({ touches: [{ clientX: 20, clientY: 30 }], target: overlay._image }); - dragging._onUp(); - - map.setView([41.7896, -87.6996]); + it.skip("Should keep selected images in sync with eachother during translation", function () { }); @@ -96,10 +67,9 @@ describe("L.DistortableCollection", function () { }); it("Should allow selection of an image on command + click", function() { - L.DomUtil.removeClass(overlay.getElement(), "selected"); - simulateClick(overlay.getElement()); + simulateCommandClick(overlay.getElement()); var classStr = L.DomUtil.getClass(overlay.getElement()); @@ -107,16 +77,14 @@ describe("L.DistortableCollection", function () { }); it("But it should now allow selection of a locked image", function() { - L.DomUtil.removeClass(overlay.getElement(), "selected"); overlay.editing._mode = "lock"; - simulateClick(overlay.getElement()); + simulateCommandClick(overlay.getElement()); var classStr = L.DomUtil.getClass(overlay.getElement()); expect(classStr).to.not.include("selected"); }); - }); diff --git a/test/src/edit/RotateAndScaleHandleSpec.js b/test/src/edit/RotateAndScaleHandleSpec.js index 5d9db62b6..b1d6d6414 100644 --- a/test/src/edit/RotateAndScaleHandleSpec.js +++ b/test/src/edit/RotateAndScaleHandleSpec.js @@ -20,6 +20,10 @@ describe("L.RotateAndScaleHandle", function() { }); }); + it.skip("Should not distort the image during scaling", function () { + + }); + describe("_calculateRotation", function() { it("Should return 0 when given the same latlng twice.", function() { var latlng = distortable._corners[0], From 0638e79bc13797892f5f1f8a233862c8f4264c2d Mon Sep 17 00:00:00 2001 From: sashadev-sky Date: Sat, 23 Mar 2019 21:52:29 -0400 Subject: [PATCH 44/63] Resolve conflict --- dist/leaflet.distortableimage.js | 1 + 1 file changed, 1 insertion(+) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index 81916e29a..f14a3b7d9 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -928,6 +928,7 @@ L.DistortableCollection = L.FeatureGroup.extend({ if (layer.editing.toolbar) { layer.editing._hideToolbar(); } + console.log(layer.editing.toolbar); }); }, From fedfc3c0d6198dd31e52cbe27879a68194f89ee4 Mon Sep 17 00:00:00 2001 From: sashadev-sky Date: Sat, 23 Mar 2019 22:00:38 -0400 Subject: [PATCH 45/63] Resolve conflicts --- test/karma.conf.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/test/karma.conf.js b/test/karma.conf.js index 11401b0b6..b52a4316d 100644 --- a/test/karma.conf.js +++ b/test/karma.conf.js @@ -33,11 +33,8 @@ module.exports = function(config) { "node_modules/chai/chai.js", "node_modules/sinon/pkg/sinon.js", "src/util/*.js", -<<<<<<< HEAD "src/edit/getEXIFdata.js", -======= "src/edit/BoxSelectHandle.js", ->>>>>>> Add tests for locking / selection as part of documentation "src/edit/EditHandle.js", "src/edit/LockHandle.js", "src/edit/DistortHandle.js", From 6dbf87a4cc42519dee99763545c598a7b59dbc84 Mon Sep 17 00:00:00 2001 From: sashadev-sky Date: Sat, 23 Mar 2019 23:20:14 -0400 Subject: [PATCH 46/63] handlers.off() --- dist/leaflet.distortableimage.js | 4 +--- src/DistortableCollection.js | 4 +--- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index f14a3b7d9..4d8440ea5 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -847,7 +847,7 @@ L.DistortableCollection = L.FeatureGroup.extend({ onRemove: function() { var map = this._map; - L.DomEvent.on(document, "keydown", this._onKeyDown, this); + L.DomEvent.off(document, "keydown", this._onKeyDown, this); L.DomEvent.off(map, "click", this._removeSelections, this); L.DomEvent.off(map, "boxzoomend", this._addSelections, this); @@ -863,7 +863,6 @@ L.DistortableCollection = L.FeatureGroup.extend({ return L.DomUtil.hasClass(overlay.getElement(), "selected"); }, - _addSelections: function(e) { var box = e.boxZoomBounds, i = 0; @@ -928,7 +927,6 @@ L.DistortableCollection = L.FeatureGroup.extend({ if (layer.editing.toolbar) { layer.editing._hideToolbar(); } - console.log(layer.editing.toolbar); }); }, diff --git a/src/DistortableCollection.js b/src/DistortableCollection.js index 37e7b5e7d..c7f141a8d 100644 --- a/src/DistortableCollection.js +++ b/src/DistortableCollection.js @@ -20,7 +20,7 @@ L.DistortableCollection = L.FeatureGroup.extend({ onRemove: function() { var map = this._map; - L.DomEvent.on(document, "keydown", this._onKeyDown, this); + L.DomEvent.off(document, "keydown", this._onKeyDown, this); L.DomEvent.off(map, "click", this._removeSelections, this); L.DomEvent.off(map, "boxzoomend", this._addSelections, this); @@ -36,7 +36,6 @@ L.DistortableCollection = L.FeatureGroup.extend({ return L.DomUtil.hasClass(overlay.getElement(), "selected"); }, - _addSelections: function(e) { var box = e.boxZoomBounds, i = 0; @@ -101,7 +100,6 @@ L.DistortableCollection = L.FeatureGroup.extend({ if (layer.editing.toolbar) { layer.editing._hideToolbar(); } - console.log(layer.editing.toolbar); }); }, From 67e83b9e61ea8feb7c74d966d357e588a94fc33e Mon Sep 17 00:00:00 2001 From: sashadev-sky Date: Sun, 24 Mar 2019 06:07:04 -0400 Subject: [PATCH 47/63] Temp disable box zoom --- README.md | 13 ++++--------- dist/leaflet.distortableimage.js | 18 +++++++++++++++--- src/DistortableCollection.js | 7 ++++++- src/edit/BoxSelectHandle.js | 11 +++++++++-- 4 files changed, 34 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index f1ab5b0fa..eb5a31c2a 100644 --- a/README.md +++ b/README.md @@ -101,15 +101,10 @@ L.DomEvent.on(img._image, 'load', img.editing.enable, img.editing); To test the multi-image interface, open `select.html`. Currently it supports multiple image selection and translations; image distortions still use the single-image interface. - - Multiple images can be selected using: - - - a) cmd + `click`: to select one at a time - - - b) shift + `drag`: create and expand a selection box over the area you want selected. - - - *For selection accuracy - drag over the image selection markers from bottom right -> upper left - -Our `DistortableCollection` class allows working with multiple images simultaneously. Say we instantiated 3 images, saved them to the variables `img`, `img2`, and `img3`, and enabled editing on all of them. To access the UI and functionalities available in the multiple image interface, pass them to the collection class: + - Multiple images can be selected using cmd + `click` to toggle individual image selection. + - Click on the map or hit the esc key to quickly deselect all images. + +Our `DistortableCollection` lass allows working with multiple images simultaneously. Say we instantiated 3 images, saved them to the variables `img`, `img2`, and `img3`, and enabled editing on all of them. To access the UI and functionalities available in the multiple image interface, pass them to the collection class: ```js // OPTION 1: Pass in images immediately diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index 4d8440ea5..db929a6a3 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -836,7 +836,12 @@ L.DistortableCollection = L.FeatureGroup.extend({ L.DomEvent.on(document, "keydown", this._onKeyDown, this); L.DomEvent.on(map, "click", this._removeSelections, this); - L.DomEvent.on(map, "boxzoomend", this._addSelections, this); + + /** + * the box zoom override works, but there is a bug involving click event propogation. + * keeping uncommented for now so that it isn't used as a multi-select mechanism + */ + // L.DomEvent.on(map, "boxzoomend", this._addSelections, this); this.eachLayer(function(layer) { L.DomEvent.on(layer, "dragstart", this._dragStartMultiple, this); @@ -1580,6 +1585,9 @@ L.DistortableImageOverlay.addInitHook(function() { }); L.Map.mergeOptions({ boxSelector: true, boxZoom: false }); +// used for multiple image select. Temporarily disabled until click +// propogation issue is fixed + L.Map.BoxSelectHandle = L.Map.BoxZoom.extend({ initialize: function (map) { @@ -1644,13 +1652,17 @@ L.Map.BoxSelectHandle = L.Map.BoxZoom.extend({ map.layerPointToLatLng(this._startLayerPoint), map.layerPointToLatLng(layerPoint)); + this._finish(); + map.fire('boxzoomend', { boxZoomBounds: this._boxBounds }); - this._finish(); + // this._finish(); }, _finish: function () { - L.DomUtil.remove(this._box); + $(this._map.boxSelector._box).remove(); + // L.DomUtil.remove(this._box); + // L.DomUtil.remove(this._map.boxSelector); this._container.style.cursor = ''; L.DomUtil.enableTextSelection(); diff --git a/src/DistortableCollection.js b/src/DistortableCollection.js index c7f141a8d..1f7030552 100644 --- a/src/DistortableCollection.js +++ b/src/DistortableCollection.js @@ -9,7 +9,12 @@ L.DistortableCollection = L.FeatureGroup.extend({ L.DomEvent.on(document, "keydown", this._onKeyDown, this); L.DomEvent.on(map, "click", this._removeSelections, this); - L.DomEvent.on(map, "boxzoomend", this._addSelections, this); + + /** + * the box zoom override works, but there is a bug involving click event propogation. + * keeping uncommented for now so that it isn't used as a multi-select mechanism + */ + // L.DomEvent.on(map, "boxzoomend", this._addSelections, this); this.eachLayer(function(layer) { L.DomEvent.on(layer, "dragstart", this._dragStartMultiple, this); diff --git a/src/edit/BoxSelectHandle.js b/src/edit/BoxSelectHandle.js index 5f867963c..a52d7ab5e 100644 --- a/src/edit/BoxSelectHandle.js +++ b/src/edit/BoxSelectHandle.js @@ -1,5 +1,8 @@ L.Map.mergeOptions({ boxSelector: true, boxZoom: false }); +// used for multiple image select. Temporarily disabled until click +// propogation issue is fixed + L.Map.BoxSelectHandle = L.Map.BoxZoom.extend({ initialize: function (map) { @@ -64,13 +67,17 @@ L.Map.BoxSelectHandle = L.Map.BoxZoom.extend({ map.layerPointToLatLng(this._startLayerPoint), map.layerPointToLatLng(layerPoint)); + this._finish(); + map.fire('boxzoomend', { boxZoomBounds: this._boxBounds }); - this._finish(); + // this._finish(); }, _finish: function () { - L.DomUtil.remove(this._box); + $(this._map.boxSelector._box).remove(); + // L.DomUtil.remove(this._box); + // L.DomUtil.remove(this._map.boxSelector); this._container.style.cursor = ''; L.DomUtil.enableTextSelection(); From ca3ba1629ca54b4f41129c2c5a3dc0da646db8eb Mon Sep 17 00:00:00 2001 From: sashadev-sky Date: Sun, 24 Mar 2019 06:13:18 -0400 Subject: [PATCH 48/63] Fix typo --- dist/leaflet.distortableimage.js | 2 +- src/edit/BoxSelectHandle.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index db929a6a3..5651d8cb2 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -1586,7 +1586,7 @@ L.DistortableImageOverlay.addInitHook(function() { L.Map.mergeOptions({ boxSelector: true, boxZoom: false }); // used for multiple image select. Temporarily disabled until click -// propogation issue is fixed +// propagation issue is fixed L.Map.BoxSelectHandle = L.Map.BoxZoom.extend({ diff --git a/src/edit/BoxSelectHandle.js b/src/edit/BoxSelectHandle.js index a52d7ab5e..0769e50eb 100644 --- a/src/edit/BoxSelectHandle.js +++ b/src/edit/BoxSelectHandle.js @@ -1,7 +1,7 @@ L.Map.mergeOptions({ boxSelector: true, boxZoom: false }); // used for multiple image select. Temporarily disabled until click -// propogation issue is fixed +// propagation issue is fixed L.Map.BoxSelectHandle = L.Map.BoxZoom.extend({ From fe817a3c0ebcc02aa2a0048b722af48cf5f1efb3 Mon Sep 17 00:00:00 2001 From: sashadev-sky Date: Thu, 28 Mar 2019 20:46:42 -0400 Subject: [PATCH 49/63] Bump version 0.3.0 -> 0.4.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4596e6224..8a2328ad9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "leaflet-distortableimage", - "version": "0.3.0", + "version": "0.4.0", "description": "Leaflet plugin enabling image overlays to be distorted, stretched, and warped (built for Public Lab's MapKnitter: http://publiclab.org).", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" From 4782ecd51b72812e87b84b6f1b35b36f8abb2405 Mon Sep 17 00:00:00 2001 From: sashadev-sky Date: Fri, 29 Mar 2019 06:04:50 -0400 Subject: [PATCH 50/63] markers --- dist/leaflet.distortableimage.js | 55 +++++++++++++++++++++++++++---- src/DistortableCollection.js | 1 + src/DistortableImageOverlay.js | 2 +- src/edit/DistortableImage.Edit.js | 44 ++++++++++++++++++++++--- 4 files changed, 89 insertions(+), 13 deletions(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index 5651d8cb2..51dd8778e 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -35,7 +35,13 @@ L.DomUtil = L.extend(L.DomUtil, { toggleClass: function(el, className) { var c = className; return this.hasClass(el, c) ? this.removeClass(el, c) : this.addClass(el, c); - } + }, + + // getOpacity: function(el, className) { + // if ('opacity' in el.style) { + // el.style.opacity = value; + // } + // } }); @@ -550,7 +556,7 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ alt: '', height: 200, crossOrigin: true, - edgeMinWidth: 500 + edgeMinWidth: 500, }, initialize: function(url, options) { @@ -932,6 +938,7 @@ L.DistortableCollection = L.FeatureGroup.extend({ if (layer.editing.toolbar) { layer.editing._hideToolbar(); } + layer.editing._hideMarkers(); }); }, @@ -1218,6 +1225,11 @@ L.DistortableImage.Edit = L.Handler.extend({ } else { this._mode = 'distort'; map.addLayer(this._distortHandles); + this._distortHandles.eachLayer(function (layer) { + layer.setOpacity(0); + // L.DomUtil.setOpacity(layer.getElement(), 0); + // console.log("layer" + layer.getElement().style.opacity); + }); this._enableDragging(); } @@ -1230,7 +1242,7 @@ L.DistortableImage.Edit = L.Handler.extend({ L.DomEvent.on(overlay._image, 'click', this._showToolbar, this); - L.DomEvent.on(overlay._image, 'mousedown', this._toggleSelections, this); + L.DomEvent.on(overlay._image, 'mousedown', this._toggleSelection, this); /* Enable hotkeys. */ L.DomEvent.on(window, 'keydown', this._onKeyDown, this); @@ -1246,7 +1258,7 @@ L.DistortableImage.Edit = L.Handler.extend({ L.DomEvent.off(overlay._image, 'click', this._showToolbar, this); - L.DomEvent.off(overlay._image, 'mousedown', this._toggleSelections, this); + L.DomEvent.off(overlay._image, 'mousedown', this._toggleSelection, this); // First, check if dragging exists - it may be off due to locking if (this.dragging) { this.dragging.disable(); } @@ -1314,6 +1326,7 @@ L.DistortableImage.Edit = L.Handler.extend({ this.dragging.on('dragstart', function () { overlay.fire('dragstart'); this._hideToolbar(); + this._hideMarkers(); }, this); /* @@ -1438,6 +1451,23 @@ L.DistortableImage.Edit = L.Handler.extend({ this.toolbar = false; } }, + + _hideMarkers: function() { + this._distortHandles.eachLayer(function (layer) { + if (layer.options.opacity === 1) { + layer.setOpacity(0); + // L.DomUtil.setOpacity(layer.getElement(), 0); + } + }); + }, + + // _hideAllMarkers: function() { + // img4._map.eachLayer(function (layer) { + // if (layer === thisis._overlay) { + // console.log("found one"); + // } + // }); + // }, // TODO: toolbar for multiple image selection _showToolbar: function(event) { @@ -1446,7 +1476,7 @@ L.DistortableImage.Edit = L.Handler.extend({ map = overlay._map; /* Ensure that there is only ever one toolbar attached to each image. */ - this._hideToolbar(); + // this._hideToolbar(); var point; if (event.containerPoint) { point = event.containerPoint; } else { point = target._leaflet_pos; } @@ -1456,11 +1486,22 @@ L.DistortableImage.Edit = L.Handler.extend({ this.toolbar = new L.DistortableImage.EditToolbar(raised_point).addTo(map, overlay); overlay.fire('toolbar:created'); } - + map.eachLayer(function(layer) { + if (layer !== this._overlay) { + this._hideMarkers(); + } + }, this ); + this._distortHandles.eachLayer(function(layer) { + if (layer.options.opacity === 0) { + layer.setOpacity(1); + } else { + layer.setOpacity(0); + } + }); L.DomEvent.stopPropagation(event); }, - _toggleSelections: function(event) { + _toggleSelection: function(event) { var target = event.target; if (this._mode === 'lock') { return; } diff --git a/src/DistortableCollection.js b/src/DistortableCollection.js index 1f7030552..21d55db5e 100644 --- a/src/DistortableCollection.js +++ b/src/DistortableCollection.js @@ -105,6 +105,7 @@ L.DistortableCollection = L.FeatureGroup.extend({ if (layer.editing.toolbar) { layer.editing._hideToolbar(); } + layer.editing._hideMarkers(); }); }, diff --git a/src/DistortableImageOverlay.js b/src/DistortableImageOverlay.js index 77ca40f1c..b8e8999aa 100644 --- a/src/DistortableImageOverlay.js +++ b/src/DistortableImageOverlay.js @@ -5,7 +5,7 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ alt: '', height: 200, crossOrigin: true, - edgeMinWidth: 500 + edgeMinWidth: 500, }, initialize: function(url, options) { diff --git a/src/edit/DistortableImage.Edit.js b/src/edit/DistortableImage.Edit.js index 60d19a742..9cbdb4944 100644 --- a/src/edit/DistortableImage.Edit.js +++ b/src/edit/DistortableImage.Edit.js @@ -76,6 +76,11 @@ L.DistortableImage.Edit = L.Handler.extend({ } else { this._mode = 'distort'; map.addLayer(this._distortHandles); + this._distortHandles.eachLayer(function (layer) { + layer.setOpacity(0); + // L.DomUtil.setOpacity(layer.getElement(), 0); + // console.log("layer" + layer.getElement().style.opacity); + }); this._enableDragging(); } @@ -88,7 +93,7 @@ L.DistortableImage.Edit = L.Handler.extend({ L.DomEvent.on(overlay._image, 'click', this._showToolbar, this); - L.DomEvent.on(overlay._image, 'mousedown', this._toggleSelections, this); + L.DomEvent.on(overlay._image, 'mousedown', this._toggleSelection, this); /* Enable hotkeys. */ L.DomEvent.on(window, 'keydown', this._onKeyDown, this); @@ -104,7 +109,7 @@ L.DistortableImage.Edit = L.Handler.extend({ L.DomEvent.off(overlay._image, 'click', this._showToolbar, this); - L.DomEvent.off(overlay._image, 'mousedown', this._toggleSelections, this); + L.DomEvent.off(overlay._image, 'mousedown', this._toggleSelection, this); // First, check if dragging exists - it may be off due to locking if (this.dragging) { this.dragging.disable(); } @@ -172,6 +177,7 @@ L.DistortableImage.Edit = L.Handler.extend({ this.dragging.on('dragstart', function () { overlay.fire('dragstart'); this._hideToolbar(); + this._hideMarkers(); }, this); /* @@ -296,6 +302,23 @@ L.DistortableImage.Edit = L.Handler.extend({ this.toolbar = false; } }, + + _hideMarkers: function() { + this._distortHandles.eachLayer(function (layer) { + if (layer.options.opacity === 1) { + layer.setOpacity(0); + // L.DomUtil.setOpacity(layer.getElement(), 0); + } + }); + }, + + // _hideAllMarkers: function() { + // img4._map.eachLayer(function (layer) { + // if (layer === thisis._overlay) { + // console.log("found one"); + // } + // }); + // }, // TODO: toolbar for multiple image selection _showToolbar: function(event) { @@ -304,7 +327,7 @@ L.DistortableImage.Edit = L.Handler.extend({ map = overlay._map; /* Ensure that there is only ever one toolbar attached to each image. */ - this._hideToolbar(); + // this._hideToolbar(); var point; if (event.containerPoint) { point = event.containerPoint; } else { point = target._leaflet_pos; } @@ -314,11 +337,22 @@ L.DistortableImage.Edit = L.Handler.extend({ this.toolbar = new L.DistortableImage.EditToolbar(raised_point).addTo(map, overlay); overlay.fire('toolbar:created'); } - + map.eachLayer(function(layer) { + if (layer !== this._overlay) { + this._hideMarkers(); + } + }, this ); + this._distortHandles.eachLayer(function(layer) { + if (layer.options.opacity === 0) { + layer.setOpacity(1); + } else { + layer.setOpacity(0); + } + }); L.DomEvent.stopPropagation(event); }, - _toggleSelections: function(event) { + _toggleSelection: function(event) { var target = event.target; if (this._mode === 'lock') { return; } From 98a8a5d28d5406015e446324b1806659c0b6c82e Mon Sep 17 00:00:00 2001 From: sashadev-sky Date: Fri, 29 Mar 2019 06:46:13 -0400 Subject: [PATCH 51/63] Manage multiple multiple markers --- dist/leaflet.distortableimage.js | 37 +++++++++++++------------------ src/DistortableCollection.js | 8 +++++++ src/edit/DistortableImage.Edit.js | 29 +++++++----------------- 3 files changed, 32 insertions(+), 42 deletions(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index 51dd8778e..0d1c876ed 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -850,6 +850,7 @@ L.DistortableCollection = L.FeatureGroup.extend({ // L.DomEvent.on(map, "boxzoomend", this._addSelections, this); this.eachLayer(function(layer) { + L.DomEvent.on(layer._image, 'mousedown', this._hideMultipleMarkers, this); L.DomEvent.on(layer, "dragstart", this._dragStartMultiple, this); L.DomEvent.on(layer, "drag", this._dragMultiple, this); }, this); @@ -864,6 +865,7 @@ L.DistortableCollection = L.FeatureGroup.extend({ L.DomEvent.off(map, "boxzoomend", this._addSelections, this); this.eachLayer(function(layer) { + L.DomEvent.off(layer._image, 'mousedown', this._hideMultipleMarkers, this); L.DomEvent.off(layer, "dragstart", this._dragStartMultiple, this); L.DomEvent.off(layer, "drag", this._dragMultiple, this); }, this); @@ -874,6 +876,12 @@ L.DistortableCollection = L.FeatureGroup.extend({ return L.DomUtil.hasClass(overlay.getElement(), "selected"); }, + _hideMultipleMarkers: function() { + this.eachLayer(function (layer) { + layer.editing._hideMarkers(); + }); + }, + _addSelections: function(e) { var box = e.boxZoomBounds, i = 0; @@ -1242,7 +1250,7 @@ L.DistortableImage.Edit = L.Handler.extend({ L.DomEvent.on(overlay._image, 'click', this._showToolbar, this); - L.DomEvent.on(overlay._image, 'mousedown', this._toggleSelection, this); + // L.DomEvent.on(overlay._image, 'mousedown', this._toggleSelection, this); /* Enable hotkeys. */ L.DomEvent.on(window, 'keydown', this._onKeyDown, this); @@ -1456,18 +1464,9 @@ L.DistortableImage.Edit = L.Handler.extend({ this._distortHandles.eachLayer(function (layer) { if (layer.options.opacity === 1) { layer.setOpacity(0); - // L.DomUtil.setOpacity(layer.getElement(), 0); } }); }, - - // _hideAllMarkers: function() { - // img4._map.eachLayer(function (layer) { - // if (layer === thisis._overlay) { - // console.log("found one"); - // } - // }); - // }, // TODO: toolbar for multiple image selection _showToolbar: function(event) { @@ -1476,7 +1475,7 @@ L.DistortableImage.Edit = L.Handler.extend({ map = overlay._map; /* Ensure that there is only ever one toolbar attached to each image. */ - // this._hideToolbar(); + this._hideToolbar(); var point; if (event.containerPoint) { point = event.containerPoint; } else { point = target._leaflet_pos; } @@ -1486,11 +1485,9 @@ L.DistortableImage.Edit = L.Handler.extend({ this.toolbar = new L.DistortableImage.EditToolbar(raised_point).addTo(map, overlay); overlay.fire('toolbar:created'); } - map.eachLayer(function(layer) { - if (layer !== this._overlay) { - this._hideMarkers(); - } - }, this ); + + this._toggleSelectBorder(event); + this._distortHandles.eachLayer(function(layer) { if (layer.options.opacity === 0) { layer.setOpacity(1); @@ -1501,13 +1498,11 @@ L.DistortableImage.Edit = L.Handler.extend({ L.DomEvent.stopPropagation(event); }, - _toggleSelection: function(event) { - var target = event.target; - + _toggleSelectBorder: function(event) { if (this._mode === 'lock') { return; } - + if (event.metaKey || event.ctrlKey) { - L.DomUtil.toggleClass(target, 'selected'); + L.DomUtil.toggleClass(event.target, 'selected'); } }, diff --git a/src/DistortableCollection.js b/src/DistortableCollection.js index 21d55db5e..4b26776b2 100644 --- a/src/DistortableCollection.js +++ b/src/DistortableCollection.js @@ -17,6 +17,7 @@ L.DistortableCollection = L.FeatureGroup.extend({ // L.DomEvent.on(map, "boxzoomend", this._addSelections, this); this.eachLayer(function(layer) { + L.DomEvent.on(layer._image, 'mousedown', this._hideMultipleMarkers, this); L.DomEvent.on(layer, "dragstart", this._dragStartMultiple, this); L.DomEvent.on(layer, "drag", this._dragMultiple, this); }, this); @@ -31,6 +32,7 @@ L.DistortableCollection = L.FeatureGroup.extend({ L.DomEvent.off(map, "boxzoomend", this._addSelections, this); this.eachLayer(function(layer) { + L.DomEvent.off(layer._image, 'mousedown', this._hideMultipleMarkers, this); L.DomEvent.off(layer, "dragstart", this._dragStartMultiple, this); L.DomEvent.off(layer, "drag", this._dragMultiple, this); }, this); @@ -41,6 +43,12 @@ L.DistortableCollection = L.FeatureGroup.extend({ return L.DomUtil.hasClass(overlay.getElement(), "selected"); }, + _hideMultipleMarkers: function() { + this.eachLayer(function (layer) { + layer.editing._hideMarkers(); + }); + }, + _addSelections: function(e) { var box = e.boxZoomBounds, i = 0; diff --git a/src/edit/DistortableImage.Edit.js b/src/edit/DistortableImage.Edit.js index 9cbdb4944..62761259b 100644 --- a/src/edit/DistortableImage.Edit.js +++ b/src/edit/DistortableImage.Edit.js @@ -93,7 +93,7 @@ L.DistortableImage.Edit = L.Handler.extend({ L.DomEvent.on(overlay._image, 'click', this._showToolbar, this); - L.DomEvent.on(overlay._image, 'mousedown', this._toggleSelection, this); + // L.DomEvent.on(overlay._image, 'mousedown', this._toggleSelection, this); /* Enable hotkeys. */ L.DomEvent.on(window, 'keydown', this._onKeyDown, this); @@ -307,18 +307,9 @@ L.DistortableImage.Edit = L.Handler.extend({ this._distortHandles.eachLayer(function (layer) { if (layer.options.opacity === 1) { layer.setOpacity(0); - // L.DomUtil.setOpacity(layer.getElement(), 0); } }); }, - - // _hideAllMarkers: function() { - // img4._map.eachLayer(function (layer) { - // if (layer === thisis._overlay) { - // console.log("found one"); - // } - // }); - // }, // TODO: toolbar for multiple image selection _showToolbar: function(event) { @@ -327,7 +318,7 @@ L.DistortableImage.Edit = L.Handler.extend({ map = overlay._map; /* Ensure that there is only ever one toolbar attached to each image. */ - // this._hideToolbar(); + this._hideToolbar(); var point; if (event.containerPoint) { point = event.containerPoint; } else { point = target._leaflet_pos; } @@ -337,11 +328,9 @@ L.DistortableImage.Edit = L.Handler.extend({ this.toolbar = new L.DistortableImage.EditToolbar(raised_point).addTo(map, overlay); overlay.fire('toolbar:created'); } - map.eachLayer(function(layer) { - if (layer !== this._overlay) { - this._hideMarkers(); - } - }, this ); + + this._toggleSelectBorder(event); + this._distortHandles.eachLayer(function(layer) { if (layer.options.opacity === 0) { layer.setOpacity(1); @@ -352,13 +341,11 @@ L.DistortableImage.Edit = L.Handler.extend({ L.DomEvent.stopPropagation(event); }, - _toggleSelection: function(event) { - var target = event.target; - + _toggleSelectBorder: function(event) { if (this._mode === 'lock') { return; } - + if (event.metaKey || event.ctrlKey) { - L.DomUtil.toggleClass(target, 'selected'); + L.DomUtil.toggleClass(event.target, 'selected'); } }, From 6cf0d9202253fec2d4dbcb7bbe6a43ceaca90ba1 Mon Sep 17 00:00:00 2001 From: sashadev-sky Date: Fri, 29 Mar 2019 08:22:09 -0400 Subject: [PATCH 52/63] Clean up code --- dist/leaflet.distortableimage.js | 53 ++++++++++++++++++++----------- examples/select.html | 4 +-- src/DistortableCollection.js | 4 ++- src/edit/DistortableImage.Edit.js | 44 +++++++++++++++---------- src/edit/EditHandle.js | 5 ++- 5 files changed, 69 insertions(+), 41 deletions(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index 0d1c876ed..7310f80f3 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -260,7 +260,10 @@ L.EditHandle = L.Marker.extend({ }, _onHandleDragStart: function() { - this._handled.fire('editstart'); + window.thissa = this; + if (this._handled.options.opacity !== 0) { + this._handled.fire('editstart'); + } }, _onHandleDragEnd: function() { @@ -878,7 +881,9 @@ L.DistortableCollection = L.FeatureGroup.extend({ _hideMultipleMarkers: function() { this.eachLayer(function (layer) { - layer.editing._hideMarkers(); + layer.editing._hideMarkers(); + // layer.editing.dragging.disable(); + // layer.options.draggable = false; }); }, @@ -1235,8 +1240,8 @@ L.DistortableImage.Edit = L.Handler.extend({ map.addLayer(this._distortHandles); this._distortHandles.eachLayer(function (layer) { layer.setOpacity(0); - // L.DomUtil.setOpacity(layer.getElement(), 0); - // console.log("layer" + layer.getElement().style.opacity); + // layer.dragging.disable(); + layer.options.draggable = false; }); this._enableDragging(); } @@ -1250,13 +1255,10 @@ L.DistortableImage.Edit = L.Handler.extend({ L.DomEvent.on(overlay._image, 'click', this._showToolbar, this); - // L.DomEvent.on(overlay._image, 'mousedown', this._toggleSelection, this); - /* Enable hotkeys. */ L.DomEvent.on(window, 'keydown', this._onKeyDown, this); overlay.fire('select'); - }, /* Run on image deselection. */ @@ -1266,8 +1268,6 @@ L.DistortableImage.Edit = L.Handler.extend({ L.DomEvent.off(overlay._image, 'click', this._showToolbar, this); - L.DomEvent.off(overlay._image, 'mousedown', this._toggleSelection, this); - // First, check if dragging exists - it may be off due to locking if (this.dragging) { this.dragging.disable(); } delete this.dragging; @@ -1330,7 +1330,7 @@ L.DistortableImage.Edit = L.Handler.extend({ this.dragging = new L.Draggable(overlay._image); this.dragging.enable(); - /* Hide toolbars while dragging; click will re-show it */ + /* Hide toolbars and markers while dragging; click will re-show it */ this.dragging.on('dragstart', function () { overlay.fire('dragstart'); this._hideToolbar(); @@ -1465,6 +1465,12 @@ L.DistortableImage.Edit = L.Handler.extend({ if (layer.options.opacity === 1) { layer.setOpacity(0); } + window.latt = layer; + if (layer.options.draggable) { + // layer.dragging._draggable.disable(); + // // layer.dragging._draggable.disable(); + layer.options.draggable = false; + } }); }, @@ -1476,25 +1482,23 @@ L.DistortableImage.Edit = L.Handler.extend({ /* Ensure that there is only ever one toolbar attached to each image. */ this._hideToolbar(); + var point; if (event.containerPoint) { point = event.containerPoint; } else { point = target._leaflet_pos; } + var raised_point = map.containerPointToLatLng(new L.Point(point.x,point.y-20)); raised_point.lng = overlay.getCenter().lng; + if (this._overlay.options.suppressToolbar !== true) { - this.toolbar = new L.DistortableImage.EditToolbar(raised_point).addTo(map, overlay); - overlay.fire('toolbar:created'); + this.toolbar = new L.DistortableImage.EditToolbar(raised_point).addTo(map, overlay); + overlay.fire('toolbar:created'); } this._toggleSelectBorder(event); - this._distortHandles.eachLayer(function(layer) { - if (layer.options.opacity === 0) { - layer.setOpacity(1); - } else { - layer.setOpacity(0); - } - }); + this._toggleEditMarkers(); + L.DomEvent.stopPropagation(event); }, @@ -1506,6 +1510,17 @@ L.DistortableImage.Edit = L.Handler.extend({ } }, + _toggleEditMarkers: function () { + window.thisthis = this; + this._distortHandles.eachLayer(function (layer) { + if (layer.options.opacity === 0) { + layer.setOpacity(1); + // layer.dragging.enable(); + layer.options.draggable = true; + } + }); + }, + _removeOverlay: function () { var overlay = this._overlay; if (this._mode !== "lock") { diff --git a/examples/select.html b/examples/select.html index 0519d867b..6840fb379 100644 --- a/examples/select.html +++ b/examples/select.html @@ -107,9 +107,7 @@ L.DomEvent.on(img4._image, 'load', img4.editing.enable, img4.editing); new L.DistortableCollection([img, img2, img3, img4]).addTo(map); - - // window.img = img; - // window.img2 = img2; + }, this); })(); diff --git a/src/DistortableCollection.js b/src/DistortableCollection.js index 4b26776b2..b0a2ba4f7 100644 --- a/src/DistortableCollection.js +++ b/src/DistortableCollection.js @@ -45,7 +45,9 @@ L.DistortableCollection = L.FeatureGroup.extend({ _hideMultipleMarkers: function() { this.eachLayer(function (layer) { - layer.editing._hideMarkers(); + layer.editing._hideMarkers(); + // layer.editing.dragging.disable(); + // layer.options.draggable = false; }); }, diff --git a/src/edit/DistortableImage.Edit.js b/src/edit/DistortableImage.Edit.js index 62761259b..6d4ba3f32 100644 --- a/src/edit/DistortableImage.Edit.js +++ b/src/edit/DistortableImage.Edit.js @@ -78,8 +78,8 @@ L.DistortableImage.Edit = L.Handler.extend({ map.addLayer(this._distortHandles); this._distortHandles.eachLayer(function (layer) { layer.setOpacity(0); - // L.DomUtil.setOpacity(layer.getElement(), 0); - // console.log("layer" + layer.getElement().style.opacity); + // layer.dragging.disable(); + layer.options.draggable = false; }); this._enableDragging(); } @@ -93,13 +93,10 @@ L.DistortableImage.Edit = L.Handler.extend({ L.DomEvent.on(overlay._image, 'click', this._showToolbar, this); - // L.DomEvent.on(overlay._image, 'mousedown', this._toggleSelection, this); - /* Enable hotkeys. */ L.DomEvent.on(window, 'keydown', this._onKeyDown, this); overlay.fire('select'); - }, /* Run on image deselection. */ @@ -109,8 +106,6 @@ L.DistortableImage.Edit = L.Handler.extend({ L.DomEvent.off(overlay._image, 'click', this._showToolbar, this); - L.DomEvent.off(overlay._image, 'mousedown', this._toggleSelection, this); - // First, check if dragging exists - it may be off due to locking if (this.dragging) { this.dragging.disable(); } delete this.dragging; @@ -173,7 +168,7 @@ L.DistortableImage.Edit = L.Handler.extend({ this.dragging = new L.Draggable(overlay._image); this.dragging.enable(); - /* Hide toolbars while dragging; click will re-show it */ + /* Hide toolbars and markers while dragging; click will re-show it */ this.dragging.on('dragstart', function () { overlay.fire('dragstart'); this._hideToolbar(); @@ -308,6 +303,12 @@ L.DistortableImage.Edit = L.Handler.extend({ if (layer.options.opacity === 1) { layer.setOpacity(0); } + window.latt = layer; + if (layer.options.draggable) { + // layer.dragging._draggable.disable(); + // // layer.dragging._draggable.disable(); + layer.options.draggable = false; + } }); }, @@ -319,25 +320,23 @@ L.DistortableImage.Edit = L.Handler.extend({ /* Ensure that there is only ever one toolbar attached to each image. */ this._hideToolbar(); + var point; if (event.containerPoint) { point = event.containerPoint; } else { point = target._leaflet_pos; } + var raised_point = map.containerPointToLatLng(new L.Point(point.x,point.y-20)); raised_point.lng = overlay.getCenter().lng; + if (this._overlay.options.suppressToolbar !== true) { - this.toolbar = new L.DistortableImage.EditToolbar(raised_point).addTo(map, overlay); - overlay.fire('toolbar:created'); + this.toolbar = new L.DistortableImage.EditToolbar(raised_point).addTo(map, overlay); + overlay.fire('toolbar:created'); } this._toggleSelectBorder(event); - this._distortHandles.eachLayer(function(layer) { - if (layer.options.opacity === 0) { - layer.setOpacity(1); - } else { - layer.setOpacity(0); - } - }); + this._toggleEditMarkers(); + L.DomEvent.stopPropagation(event); }, @@ -349,6 +348,17 @@ L.DistortableImage.Edit = L.Handler.extend({ } }, + _toggleEditMarkers: function () { + window.thisthis = this; + this._distortHandles.eachLayer(function (layer) { + if (layer.options.opacity === 0) { + layer.setOpacity(1); + // layer.dragging.enable(); + layer.options.draggable = true; + } + }); + }, + _removeOverlay: function () { var overlay = this._overlay; if (this._mode !== "lock") { diff --git a/src/edit/EditHandle.js b/src/edit/EditHandle.js index 0f9bd1bf3..7e8ef65f6 100644 --- a/src/edit/EditHandle.js +++ b/src/edit/EditHandle.js @@ -34,7 +34,10 @@ L.EditHandle = L.Marker.extend({ }, _onHandleDragStart: function() { - this._handled.fire('editstart'); + window.thissa = this; + if (this._handled.options.opacity !== 0) { + this._handled.fire('editstart'); + } }, _onHandleDragEnd: function() { From 9bea9d4195daaf61c3cdc85ea6a6e5d381147531 Mon Sep 17 00:00:00 2001 From: sashadev-sky Date: Fri, 29 Mar 2019 16:19:26 -0400 Subject: [PATCH 53/63] Complete marker handling logic --- dist/leaflet.distortableimage.js | 34 ++++++++++++++++++++----------- src/DistortableCollection.js | 13 ++++++++++-- src/edit/DistortableImage.Edit.js | 13 +++++++++--- 3 files changed, 43 insertions(+), 17 deletions(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index 7310f80f3..e9b9c2ece 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -35,13 +35,7 @@ L.DomUtil = L.extend(L.DomUtil, { toggleClass: function(el, className) { var c = className; return this.hasClass(el, c) ? this.removeClass(el, c) : this.addClass(el, c); - }, - - // getOpacity: function(el, className) { - // if ('opacity' in el.style) { - // el.style.opacity = value; - // } - // } + } }); @@ -879,12 +873,21 @@ L.DistortableCollection = L.FeatureGroup.extend({ return L.DomUtil.hasClass(overlay.getElement(), "selected"); }, - _hideMultipleMarkers: function() { + _hideMultipleMarkers: function(e) { + var i = 0; this.eachLayer(function (layer) { - layer.editing._hideMarkers(); + if (layer._image !== e.target) { + console.log(i); + layer.editing._hideMarkers(); + window.asd = layer.editing; + i++; + } else { + layer.editing._showMarkers(); + } // layer.editing.dragging.disable(); // layer.options.draggable = false; }); + }, _addSelections: function(e) { @@ -1240,7 +1243,7 @@ L.DistortableImage.Edit = L.Handler.extend({ map.addLayer(this._distortHandles); this._distortHandles.eachLayer(function (layer) { layer.setOpacity(0); - // layer.dragging.disable(); + layer.dragging.disable(); layer.options.draggable = false; }); this._enableDragging(); @@ -1460,11 +1463,18 @@ L.DistortableImage.Edit = L.Handler.extend({ } }, + _showMarkers: function() { + this._distortHandles.eachLayer(function (layer) { + layer.setOpacity(1); + layer.dragging.enable(); + layer.options.draggable = true; + }); + }, + _hideMarkers: function() { this._distortHandles.eachLayer(function (layer) { - if (layer.options.opacity === 1) { layer.setOpacity(0); - } + window.latt = layer; if (layer.options.draggable) { // layer.dragging._draggable.disable(); diff --git a/src/DistortableCollection.js b/src/DistortableCollection.js index b0a2ba4f7..f20ae414c 100644 --- a/src/DistortableCollection.js +++ b/src/DistortableCollection.js @@ -43,12 +43,21 @@ L.DistortableCollection = L.FeatureGroup.extend({ return L.DomUtil.hasClass(overlay.getElement(), "selected"); }, - _hideMultipleMarkers: function() { + _hideMultipleMarkers: function(e) { + var i = 0; this.eachLayer(function (layer) { - layer.editing._hideMarkers(); + if (layer._image !== e.target) { + console.log(i); + layer.editing._hideMarkers(); + window.asd = layer.editing; + i++; + } else { + layer.editing._showMarkers(); + } // layer.editing.dragging.disable(); // layer.options.draggable = false; }); + }, _addSelections: function(e) { diff --git a/src/edit/DistortableImage.Edit.js b/src/edit/DistortableImage.Edit.js index 6d4ba3f32..f6ddc9479 100644 --- a/src/edit/DistortableImage.Edit.js +++ b/src/edit/DistortableImage.Edit.js @@ -78,7 +78,7 @@ L.DistortableImage.Edit = L.Handler.extend({ map.addLayer(this._distortHandles); this._distortHandles.eachLayer(function (layer) { layer.setOpacity(0); - // layer.dragging.disable(); + layer.dragging.disable(); layer.options.draggable = false; }); this._enableDragging(); @@ -298,11 +298,18 @@ L.DistortableImage.Edit = L.Handler.extend({ } }, + _showMarkers: function() { + this._distortHandles.eachLayer(function (layer) { + layer.setOpacity(1); + layer.dragging.enable(); + layer.options.draggable = true; + }); + }, + _hideMarkers: function() { this._distortHandles.eachLayer(function (layer) { - if (layer.options.opacity === 1) { layer.setOpacity(0); - } + window.latt = layer; if (layer.options.draggable) { // layer.dragging._draggable.disable(); From 0326b62151bfd1f1db0fb133380d1e57be316184 Mon Sep 17 00:00:00 2001 From: sashadev-sky Date: Fri, 29 Mar 2019 16:30:28 -0400 Subject: [PATCH 54/63] Handle edge cases --- dist/leaflet.distortableimage.js | 17 +++++------------ src/edit/DistortableImage.Edit.js | 17 +++++------------ 2 files changed, 10 insertions(+), 24 deletions(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index e9b9c2ece..21b5acc6a 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -1464,6 +1464,7 @@ L.DistortableImage.Edit = L.Handler.extend({ }, _showMarkers: function() { + if (this._mode === 'lock') { return; } this._distortHandles.eachLayer(function (layer) { layer.setOpacity(1); layer.dragging.enable(); @@ -1474,6 +1475,9 @@ L.DistortableImage.Edit = L.Handler.extend({ _hideMarkers: function() { this._distortHandles.eachLayer(function (layer) { layer.setOpacity(0); + if (layer.dragging) { + layer.dragging.disable(); + } window.latt = layer; if (layer.options.draggable) { @@ -1507,7 +1511,7 @@ L.DistortableImage.Edit = L.Handler.extend({ this._toggleSelectBorder(event); - this._toggleEditMarkers(); + this._showMarkers(); L.DomEvent.stopPropagation(event); }, @@ -1520,17 +1524,6 @@ L.DistortableImage.Edit = L.Handler.extend({ } }, - _toggleEditMarkers: function () { - window.thisthis = this; - this._distortHandles.eachLayer(function (layer) { - if (layer.options.opacity === 0) { - layer.setOpacity(1); - // layer.dragging.enable(); - layer.options.draggable = true; - } - }); - }, - _removeOverlay: function () { var overlay = this._overlay; if (this._mode !== "lock") { diff --git a/src/edit/DistortableImage.Edit.js b/src/edit/DistortableImage.Edit.js index f6ddc9479..e581a297e 100644 --- a/src/edit/DistortableImage.Edit.js +++ b/src/edit/DistortableImage.Edit.js @@ -299,6 +299,7 @@ L.DistortableImage.Edit = L.Handler.extend({ }, _showMarkers: function() { + if (this._mode === 'lock') { return; } this._distortHandles.eachLayer(function (layer) { layer.setOpacity(1); layer.dragging.enable(); @@ -309,6 +310,9 @@ L.DistortableImage.Edit = L.Handler.extend({ _hideMarkers: function() { this._distortHandles.eachLayer(function (layer) { layer.setOpacity(0); + if (layer.dragging) { + layer.dragging.disable(); + } window.latt = layer; if (layer.options.draggable) { @@ -342,7 +346,7 @@ L.DistortableImage.Edit = L.Handler.extend({ this._toggleSelectBorder(event); - this._toggleEditMarkers(); + this._showMarkers(); L.DomEvent.stopPropagation(event); }, @@ -355,17 +359,6 @@ L.DistortableImage.Edit = L.Handler.extend({ } }, - _toggleEditMarkers: function () { - window.thisthis = this; - this._distortHandles.eachLayer(function (layer) { - if (layer.options.opacity === 0) { - layer.setOpacity(1); - // layer.dragging.enable(); - layer.options.draggable = true; - } - }); - }, - _removeOverlay: function () { var overlay = this._overlay; if (this._mode !== "lock") { From cfb7a311e05bb1ceb81e2e8853de80d07bbaa4de Mon Sep 17 00:00:00 2001 From: sashadev-sky Date: Fri, 29 Mar 2019 17:18:52 -0400 Subject: [PATCH 55/63] Sync toolbar with markers --- dist/leaflet.distortableimage.js | 68 +++++++++++-------------------- examples/select.html | 4 +- src/DistortableCollection.js | 24 ++++------- src/edit/DistortableImage.Edit.js | 39 +++++++----------- src/edit/EditHandle.js | 5 +-- 5 files changed, 47 insertions(+), 93 deletions(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index 21b5acc6a..3b9721a22 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -254,10 +254,7 @@ L.EditHandle = L.Marker.extend({ }, _onHandleDragStart: function() { - window.thissa = this; - if (this._handled.options.opacity !== 0) { - this._handled.fire('editstart'); - } + this._handled.fire('editstart'); }, _onHandleDragEnd: function() { @@ -837,7 +834,6 @@ L.DistortableCollection = L.FeatureGroup.extend({ this._map = map; L.DomEvent.on(document, "keydown", this._onKeyDown, this); - L.DomEvent.on(map, "click", this._removeSelections, this); /** @@ -847,7 +843,7 @@ L.DistortableCollection = L.FeatureGroup.extend({ // L.DomEvent.on(map, "boxzoomend", this._addSelections, this); this.eachLayer(function(layer) { - L.DomEvent.on(layer._image, 'mousedown', this._hideMultipleMarkers, this); + L.DomEvent.on(layer._image, 'mousedown', this._deselectOthers, this); L.DomEvent.on(layer, "dragstart", this._dragStartMultiple, this); L.DomEvent.on(layer, "drag", this._dragMultiple, this); }, this); @@ -857,37 +853,30 @@ L.DistortableCollection = L.FeatureGroup.extend({ var map = this._map; L.DomEvent.off(document, "keydown", this._onKeyDown, this); - L.DomEvent.off(map, "click", this._removeSelections, this); - L.DomEvent.off(map, "boxzoomend", this._addSelections, this); + // L.DomEvent.off(map, "boxzoomend", this._addSelections, this); this.eachLayer(function(layer) { - L.DomEvent.off(layer._image, 'mousedown', this._hideMultipleMarkers, this); + L.DomEvent.off(layer._image, 'mousedown', this._deselectOthers, this); L.DomEvent.off(layer, "dragstart", this._dragStartMultiple, this); L.DomEvent.off(layer, "drag", this._dragMultiple, this); }, this); }, - isSelected: function (overlay) { return L.DomUtil.hasClass(overlay.getElement(), "selected"); }, - _hideMultipleMarkers: function(e) { - var i = 0; + _deselectOthers: function(e) { this.eachLayer(function (layer) { + var edit = layer.editing; if (layer._image !== e.target) { - console.log(i); - layer.editing._hideMarkers(); - window.asd = layer.editing; - i++; + edit._hideMarkers(); + edit._hideToolbar(); } else { - layer.editing._showMarkers(); + edit._showMarkers(); } - // layer.editing.dragging.disable(); - // layer.options.draggable = false; }); - }, _addSelections: function(e) { @@ -1256,7 +1245,7 @@ L.DistortableImage.Edit = L.Handler.extend({ 3: new L.point(0, 0) }; - L.DomEvent.on(overlay._image, 'click', this._showToolbar, this); + L.DomEvent.on(overlay._image, 'click', this._select, this); /* Enable hotkeys. */ L.DomEvent.on(window, 'keydown', this._onKeyDown, this); @@ -1269,14 +1258,13 @@ L.DistortableImage.Edit = L.Handler.extend({ var overlay = this._overlay, map = overlay._map; - L.DomEvent.off(overlay._image, 'click', this._showToolbar, this); + L.DomEvent.off(overlay._image, 'click', this._select, this); // First, check if dragging exists - it may be off due to locking if (this.dragging) { this.dragging.disable(); } delete this.dragging; if (this.toolbar) { this._hideToolbar(); } - if (this.editing) { this.editing.disable(); } map.removeLayer(this._handles[this._mode]); @@ -1337,7 +1325,6 @@ L.DistortableImage.Edit = L.Handler.extend({ this.dragging.on('dragstart', function () { overlay.fire('dragstart'); this._hideToolbar(); - this._hideMarkers(); }, this); /* @@ -1389,9 +1376,7 @@ L.DistortableImage.Edit = L.Handler.extend({ var map = this._overlay._map; map.removeLayer(this._handles[this._mode]); - this._mode = 'scale'; - map.addLayer(this._handles[this._mode]); }, @@ -1399,9 +1384,7 @@ L.DistortableImage.Edit = L.Handler.extend({ var map = this._overlay._map; map.removeLayer(this._handles[this._mode]); - this._mode = 'rotateStandalone'; - map.addLayer(this._handles[this._mode]); }, @@ -1455,6 +1438,13 @@ L.DistortableImage.Edit = L.Handler.extend({ map.addLayer(this._handles[this._mode]); }, + _select: function (event) { + this._showToolbar(event); + this._toggleMultipleSelect(event); + + L.DomEvent.stopPropagation(event); + }, + _hideToolbar: function() { var map = this._overlay._map; if (this.toolbar) { @@ -1474,17 +1464,11 @@ L.DistortableImage.Edit = L.Handler.extend({ _hideMarkers: function() { this._distortHandles.eachLayer(function (layer) { - layer.setOpacity(0); - if (layer.dragging) { - layer.dragging.disable(); - } - - window.latt = layer; + layer.setOpacity(0); + if (layer.dragging) { layer.dragging.disable(); } if (layer.options.draggable) { - // layer.dragging._draggable.disable(); - // // layer.dragging._draggable.disable(); - layer.options.draggable = false; - } + layer.options.draggable = false; + } }); }, @@ -1508,15 +1492,9 @@ L.DistortableImage.Edit = L.Handler.extend({ this.toolbar = new L.DistortableImage.EditToolbar(raised_point).addTo(map, overlay); overlay.fire('toolbar:created'); } - - this._toggleSelectBorder(event); - - this._showMarkers(); - - L.DomEvent.stopPropagation(event); }, - _toggleSelectBorder: function(event) { + _toggleMultipleSelect: function(event) { if (this._mode === 'lock') { return; } if (event.metaKey || event.ctrlKey) { diff --git a/examples/select.html b/examples/select.html index 6840fb379..425e21725 100644 --- a/examples/select.html +++ b/examples/select.html @@ -58,8 +58,6 @@ edgeMinWidth: 521, edgeMinHeight: 348, }).addTo(map); - - // L.DomEvent.on(img._image, 'click', select, img); // create a second image img2 = new L.DistortableImageOverlay( @@ -107,7 +105,7 @@ L.DomEvent.on(img4._image, 'load', img4.editing.enable, img4.editing); new L.DistortableCollection([img, img2, img3, img4]).addTo(map); - + }, this); })(); diff --git a/src/DistortableCollection.js b/src/DistortableCollection.js index f20ae414c..8b6a773f0 100644 --- a/src/DistortableCollection.js +++ b/src/DistortableCollection.js @@ -7,7 +7,6 @@ L.DistortableCollection = L.FeatureGroup.extend({ this._map = map; L.DomEvent.on(document, "keydown", this._onKeyDown, this); - L.DomEvent.on(map, "click", this._removeSelections, this); /** @@ -17,7 +16,7 @@ L.DistortableCollection = L.FeatureGroup.extend({ // L.DomEvent.on(map, "boxzoomend", this._addSelections, this); this.eachLayer(function(layer) { - L.DomEvent.on(layer._image, 'mousedown', this._hideMultipleMarkers, this); + L.DomEvent.on(layer._image, 'mousedown', this._deselectOthers, this); L.DomEvent.on(layer, "dragstart", this._dragStartMultiple, this); L.DomEvent.on(layer, "drag", this._dragMultiple, this); }, this); @@ -27,37 +26,30 @@ L.DistortableCollection = L.FeatureGroup.extend({ var map = this._map; L.DomEvent.off(document, "keydown", this._onKeyDown, this); - L.DomEvent.off(map, "click", this._removeSelections, this); - L.DomEvent.off(map, "boxzoomend", this._addSelections, this); + // L.DomEvent.off(map, "boxzoomend", this._addSelections, this); this.eachLayer(function(layer) { - L.DomEvent.off(layer._image, 'mousedown', this._hideMultipleMarkers, this); + L.DomEvent.off(layer._image, 'mousedown', this._deselectOthers, this); L.DomEvent.off(layer, "dragstart", this._dragStartMultiple, this); L.DomEvent.off(layer, "drag", this._dragMultiple, this); }, this); }, - isSelected: function (overlay) { return L.DomUtil.hasClass(overlay.getElement(), "selected"); }, - _hideMultipleMarkers: function(e) { - var i = 0; + _deselectOthers: function(e) { this.eachLayer(function (layer) { + var edit = layer.editing; if (layer._image !== e.target) { - console.log(i); - layer.editing._hideMarkers(); - window.asd = layer.editing; - i++; + edit._hideMarkers(); + edit._hideToolbar(); } else { - layer.editing._showMarkers(); + edit._showMarkers(); } - // layer.editing.dragging.disable(); - // layer.options.draggable = false; }); - }, _addSelections: function(e) { diff --git a/src/edit/DistortableImage.Edit.js b/src/edit/DistortableImage.Edit.js index e581a297e..9e933a52e 100644 --- a/src/edit/DistortableImage.Edit.js +++ b/src/edit/DistortableImage.Edit.js @@ -91,7 +91,7 @@ L.DistortableImage.Edit = L.Handler.extend({ 3: new L.point(0, 0) }; - L.DomEvent.on(overlay._image, 'click', this._showToolbar, this); + L.DomEvent.on(overlay._image, 'click', this._select, this); /* Enable hotkeys. */ L.DomEvent.on(window, 'keydown', this._onKeyDown, this); @@ -104,14 +104,13 @@ L.DistortableImage.Edit = L.Handler.extend({ var overlay = this._overlay, map = overlay._map; - L.DomEvent.off(overlay._image, 'click', this._showToolbar, this); + L.DomEvent.off(overlay._image, 'click', this._select, this); // First, check if dragging exists - it may be off due to locking if (this.dragging) { this.dragging.disable(); } delete this.dragging; if (this.toolbar) { this._hideToolbar(); } - if (this.editing) { this.editing.disable(); } map.removeLayer(this._handles[this._mode]); @@ -172,7 +171,6 @@ L.DistortableImage.Edit = L.Handler.extend({ this.dragging.on('dragstart', function () { overlay.fire('dragstart'); this._hideToolbar(); - this._hideMarkers(); }, this); /* @@ -224,9 +222,7 @@ L.DistortableImage.Edit = L.Handler.extend({ var map = this._overlay._map; map.removeLayer(this._handles[this._mode]); - this._mode = 'scale'; - map.addLayer(this._handles[this._mode]); }, @@ -234,9 +230,7 @@ L.DistortableImage.Edit = L.Handler.extend({ var map = this._overlay._map; map.removeLayer(this._handles[this._mode]); - this._mode = 'rotateStandalone'; - map.addLayer(this._handles[this._mode]); }, @@ -290,6 +284,13 @@ L.DistortableImage.Edit = L.Handler.extend({ map.addLayer(this._handles[this._mode]); }, + _select: function (event) { + this._showToolbar(event); + this._toggleMultipleSelect(event); + + L.DomEvent.stopPropagation(event); + }, + _hideToolbar: function() { var map = this._overlay._map; if (this.toolbar) { @@ -309,17 +310,11 @@ L.DistortableImage.Edit = L.Handler.extend({ _hideMarkers: function() { this._distortHandles.eachLayer(function (layer) { - layer.setOpacity(0); - if (layer.dragging) { - layer.dragging.disable(); - } - - window.latt = layer; + layer.setOpacity(0); + if (layer.dragging) { layer.dragging.disable(); } if (layer.options.draggable) { - // layer.dragging._draggable.disable(); - // // layer.dragging._draggable.disable(); - layer.options.draggable = false; - } + layer.options.draggable = false; + } }); }, @@ -343,15 +338,9 @@ L.DistortableImage.Edit = L.Handler.extend({ this.toolbar = new L.DistortableImage.EditToolbar(raised_point).addTo(map, overlay); overlay.fire('toolbar:created'); } - - this._toggleSelectBorder(event); - - this._showMarkers(); - - L.DomEvent.stopPropagation(event); }, - _toggleSelectBorder: function(event) { + _toggleMultipleSelect: function(event) { if (this._mode === 'lock') { return; } if (event.metaKey || event.ctrlKey) { diff --git a/src/edit/EditHandle.js b/src/edit/EditHandle.js index 7e8ef65f6..0f9bd1bf3 100644 --- a/src/edit/EditHandle.js +++ b/src/edit/EditHandle.js @@ -34,10 +34,7 @@ L.EditHandle = L.Marker.extend({ }, _onHandleDragStart: function() { - window.thissa = this; - if (this._handled.options.opacity !== 0) { - this._handled.fire('editstart'); - } + this._handled.fire('editstart'); }, _onHandleDragEnd: function() { From 0a653056066ecb14d16f8b419f18930a1a021774 Mon Sep 17 00:00:00 2001 From: sashadev-sky Date: Fri, 29 Mar 2019 17:26:55 -0400 Subject: [PATCH 56/63] Refactor --- dist/leaflet.distortableimage.js | 10 ++++++---- src/edit/DistortableImage.Edit.js | 10 ++++++---- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index 3b9721a22..0cb695610 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -1464,12 +1464,14 @@ L.DistortableImage.Edit = L.Handler.extend({ _hideMarkers: function() { this._distortHandles.eachLayer(function (layer) { + var drag = layer.dragging, + opts = layer.options; + layer.setOpacity(0); - if (layer.dragging) { layer.dragging.disable(); } - if (layer.options.draggable) { - layer.options.draggable = false; - } + if (drag) { drag.disable(); } + if (opts.draggable) { opts.draggable = false; } }); + }, // TODO: toolbar for multiple image selection diff --git a/src/edit/DistortableImage.Edit.js b/src/edit/DistortableImage.Edit.js index 9e933a52e..09dd03b95 100644 --- a/src/edit/DistortableImage.Edit.js +++ b/src/edit/DistortableImage.Edit.js @@ -310,12 +310,14 @@ L.DistortableImage.Edit = L.Handler.extend({ _hideMarkers: function() { this._distortHandles.eachLayer(function (layer) { + var drag = layer.dragging, + opts = layer.options; + layer.setOpacity(0); - if (layer.dragging) { layer.dragging.disable(); } - if (layer.options.draggable) { - layer.options.draggable = false; - } + if (drag) { drag.disable(); } + if (opts.draggable) { opts.draggable = false; } }); + }, // TODO: toolbar for multiple image selection From b61d3bdd23c878944600e9ea0cc799d32791f9d7 Mon Sep 17 00:00:00 2001 From: sashadev-sky Date: Fri, 29 Mar 2019 18:00:53 -0400 Subject: [PATCH 57/63] Update test --- test/src/DistortableCollectionSpec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/src/DistortableCollectionSpec.js b/test/src/DistortableCollectionSpec.js index 21d6236c7..f32bee0f2 100644 --- a/test/src/DistortableCollectionSpec.js +++ b/test/src/DistortableCollectionSpec.js @@ -1,7 +1,7 @@ function simulateCommandClick(el) { if (document.createEvent) { var e = document.createEvent('MouseEvents'); - e.initMouseEvent('mousedown', true, true, window, + e.initMouseEvent('click', true, true, window, 0, 0, 0, 0, 0, true, false, false, true, 0, null); return el.dispatchEvent(e); } From 4a8284db1ef833d8232955cb0eaa5e24bf472cfd Mon Sep 17 00:00:00 2001 From: sashadev-sky Date: Fri, 29 Mar 2019 19:14:51 -0400 Subject: [PATCH 58/63] add showMarkers to DistortableImage.Edit --- dist/leaflet.distortableimage.js | 12 +++++------- src/DistortableCollection.js | 7 ++++--- src/edit/DistortableImage.Edit.js | 1 + src/edit/RotateAndScaleHandle.js | 4 ---- 4 files changed, 10 insertions(+), 14 deletions(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index 0cb695610..81d94e428 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -358,10 +358,6 @@ L.RotateAndScaleHandle = L.EditHandle.extend({ checks whether the "edgeMinWidth" property is set and tracks the minimum edge length; this enables preventing scaling to zero, but we might also add an overall scale limit */ - - // window.scale = scale; - // window.handled = this._handled; - if (this._handled.options.hasOwnProperty('edgeMinWidth')){ var edgeMinWidth = this._handled.options.edgeMinWidth, w = L.latLng(overlay._corners[0]).distanceTo(overlay._corners[1]), @@ -939,11 +935,12 @@ L.DistortableCollection = L.FeatureGroup.extend({ _removeSelections: function() { this.eachLayer(function(layer) { + var edit = layer.editing; L.DomUtil.removeClass(layer.getElement(), "selected"); - if (layer.editing.toolbar) { - layer.editing._hideToolbar(); + if (edit.toolbar) { + edit._hideToolbar(); } - layer.editing._hideMarkers(); + edit._hideMarkers(); }); }, @@ -1441,6 +1438,7 @@ L.DistortableImage.Edit = L.Handler.extend({ _select: function (event) { this._showToolbar(event); this._toggleMultipleSelect(event); + this._showMarkers(); L.DomEvent.stopPropagation(event); }, diff --git a/src/DistortableCollection.js b/src/DistortableCollection.js index 8b6a773f0..782c3a898 100644 --- a/src/DistortableCollection.js +++ b/src/DistortableCollection.js @@ -112,11 +112,12 @@ L.DistortableCollection = L.FeatureGroup.extend({ _removeSelections: function() { this.eachLayer(function(layer) { + var edit = layer.editing; L.DomUtil.removeClass(layer.getElement(), "selected"); - if (layer.editing.toolbar) { - layer.editing._hideToolbar(); + if (edit.toolbar) { + edit._hideToolbar(); } - layer.editing._hideMarkers(); + edit._hideMarkers(); }); }, diff --git a/src/edit/DistortableImage.Edit.js b/src/edit/DistortableImage.Edit.js index 09dd03b95..a871cdb3e 100644 --- a/src/edit/DistortableImage.Edit.js +++ b/src/edit/DistortableImage.Edit.js @@ -287,6 +287,7 @@ L.DistortableImage.Edit = L.Handler.extend({ _select: function (event) { this._showToolbar(event); this._toggleMultipleSelect(event); + this._showMarkers(); L.DomEvent.stopPropagation(event); }, diff --git a/src/edit/RotateAndScaleHandle.js b/src/edit/RotateAndScaleHandle.js index 3279e1b8e..bad357599 100644 --- a/src/edit/RotateAndScaleHandle.js +++ b/src/edit/RotateAndScaleHandle.js @@ -24,10 +24,6 @@ L.RotateAndScaleHandle = L.EditHandle.extend({ checks whether the "edgeMinWidth" property is set and tracks the minimum edge length; this enables preventing scaling to zero, but we might also add an overall scale limit */ - - // window.scale = scale; - // window.handled = this._handled; - if (this._handled.options.hasOwnProperty('edgeMinWidth')){ var edgeMinWidth = this._handled.options.edgeMinWidth, w = L.latLng(overlay._corners[0]).distanceTo(overlay._corners[1]), From b12906041dcca982eb87ff1ffdf770d4403ea413 Mon Sep 17 00:00:00 2001 From: sashadev-sky Date: Fri, 29 Mar 2019 19:53:27 -0400 Subject: [PATCH 59/63] add map click deselect for single image --- dist/leaflet.distortableimage.js | 10 ++++++++++ package-lock.json | 2 +- src/edit/DistortableImage.Edit.js | 10 ++++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index 81d94e428..b548c74ce 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -1242,6 +1242,8 @@ L.DistortableImage.Edit = L.Handler.extend({ 3: new L.point(0, 0) }; + L.DomEvent.on(map, "click", this._removeSelection, this); + L.DomEvent.on(overlay._image, 'click', this._select, this); /* Enable hotkeys. */ @@ -1256,6 +1258,7 @@ L.DistortableImage.Edit = L.Handler.extend({ map = overlay._map; L.DomEvent.off(overlay._image, 'click', this._select, this); + L.DomEvent.off(map, "click", this._removeSelection, this); // First, check if dragging exists - it may be off due to locking if (this.dragging) { this.dragging.disable(); } @@ -1443,6 +1446,13 @@ L.DistortableImage.Edit = L.Handler.extend({ L.DomEvent.stopPropagation(event); }, + _removeSelection: function (event) { + this._hideToolbar(event); + this._hideMarkers(); + + L.DomEvent.stopPropagation(event); + }, + _hideToolbar: function() { var map = this._overlay._map; if (this.toolbar) { diff --git a/package-lock.json b/package-lock.json index 1ce105734..10207af46 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "leaflet-distortableimage", - "version": "0.3.0", + "version": "0.4.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/src/edit/DistortableImage.Edit.js b/src/edit/DistortableImage.Edit.js index a871cdb3e..7c9ad5010 100644 --- a/src/edit/DistortableImage.Edit.js +++ b/src/edit/DistortableImage.Edit.js @@ -91,6 +91,8 @@ L.DistortableImage.Edit = L.Handler.extend({ 3: new L.point(0, 0) }; + L.DomEvent.on(map, "click", this._removeSelection, this); + L.DomEvent.on(overlay._image, 'click', this._select, this); /* Enable hotkeys. */ @@ -105,6 +107,7 @@ L.DistortableImage.Edit = L.Handler.extend({ map = overlay._map; L.DomEvent.off(overlay._image, 'click', this._select, this); + L.DomEvent.off(map, "click", this._removeSelection, this); // First, check if dragging exists - it may be off due to locking if (this.dragging) { this.dragging.disable(); } @@ -292,6 +295,13 @@ L.DistortableImage.Edit = L.Handler.extend({ L.DomEvent.stopPropagation(event); }, + _removeSelection: function (event) { + this._hideToolbar(event); + this._hideMarkers(); + + L.DomEvent.stopPropagation(event); + }, + _hideToolbar: function() { var map = this._overlay._map; if (this.toolbar) { From 690c16238f3b5da89d596cb27eec8ae3de8b6af6 Mon Sep 17 00:00:00 2001 From: sashadev-sky Date: Fri, 29 Mar 2019 20:05:50 -0400 Subject: [PATCH 60/63] Add deselect with esc for single image --- dist/leaflet.distortableimage.js | 14 +++++--------- src/edit/DistortableImage.Edit.js | 14 +++++--------- 2 files changed, 10 insertions(+), 18 deletions(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index b548c74ce..b08eeca94 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -1159,7 +1159,7 @@ L.DistortableImage.Edit = L.Handler.extend({ 8: '_removeOverlay', // backspace windows / delete mac 46: '_removeOverlay', // delete windows / delete + fn mac 20: '_toggleRotate', // CAPS - 27: '_removeSelections', // esc + 27: '_deselect', // esc 68: '_toggleRotateDistort', // d 69: '_toggleIsolate', // e 73: '_toggleIsolate', // i @@ -1242,8 +1242,7 @@ L.DistortableImage.Edit = L.Handler.extend({ 3: new L.point(0, 0) }; - L.DomEvent.on(map, "click", this._removeSelection, this); - + L.DomEvent.on(map, "click", this._deselect, this); L.DomEvent.on(overlay._image, 'click', this._select, this); /* Enable hotkeys. */ @@ -1257,8 +1256,8 @@ L.DistortableImage.Edit = L.Handler.extend({ var overlay = this._overlay, map = overlay._map; + L.DomEvent.off(map, "click", this._deselect, this); L.DomEvent.off(overlay._image, 'click', this._select, this); - L.DomEvent.off(map, "click", this._removeSelection, this); // First, check if dragging exists - it may be off due to locking if (this.dragging) { this.dragging.disable(); } @@ -1355,8 +1354,7 @@ L.DistortableImage.Edit = L.Handler.extend({ handlerName = keymap[event.which]; if (handlerName !== undefined && this._overlay.options.suppressToolbar !== true) { - if (handlerName === '_removeSelections') { return; } - else { this[handlerName].call(this); } + this[handlerName].call(this); } }, @@ -1446,11 +1444,9 @@ L.DistortableImage.Edit = L.Handler.extend({ L.DomEvent.stopPropagation(event); }, - _removeSelection: function (event) { + _deselect: function (event) { this._hideToolbar(event); this._hideMarkers(); - - L.DomEvent.stopPropagation(event); }, _hideToolbar: function() { diff --git a/src/edit/DistortableImage.Edit.js b/src/edit/DistortableImage.Edit.js index 7c9ad5010..c1b68fbd5 100644 --- a/src/edit/DistortableImage.Edit.js +++ b/src/edit/DistortableImage.Edit.js @@ -8,7 +8,7 @@ L.DistortableImage.Edit = L.Handler.extend({ 8: '_removeOverlay', // backspace windows / delete mac 46: '_removeOverlay', // delete windows / delete + fn mac 20: '_toggleRotate', // CAPS - 27: '_removeSelections', // esc + 27: '_deselect', // esc 68: '_toggleRotateDistort', // d 69: '_toggleIsolate', // e 73: '_toggleIsolate', // i @@ -91,8 +91,7 @@ L.DistortableImage.Edit = L.Handler.extend({ 3: new L.point(0, 0) }; - L.DomEvent.on(map, "click", this._removeSelection, this); - + L.DomEvent.on(map, "click", this._deselect, this); L.DomEvent.on(overlay._image, 'click', this._select, this); /* Enable hotkeys. */ @@ -106,8 +105,8 @@ L.DistortableImage.Edit = L.Handler.extend({ var overlay = this._overlay, map = overlay._map; + L.DomEvent.off(map, "click", this._deselect, this); L.DomEvent.off(overlay._image, 'click', this._select, this); - L.DomEvent.off(map, "click", this._removeSelection, this); // First, check if dragging exists - it may be off due to locking if (this.dragging) { this.dragging.disable(); } @@ -204,8 +203,7 @@ L.DistortableImage.Edit = L.Handler.extend({ handlerName = keymap[event.which]; if (handlerName !== undefined && this._overlay.options.suppressToolbar !== true) { - if (handlerName === '_removeSelections') { return; } - else { this[handlerName].call(this); } + this[handlerName].call(this); } }, @@ -295,11 +293,9 @@ L.DistortableImage.Edit = L.Handler.extend({ L.DomEvent.stopPropagation(event); }, - _removeSelection: function (event) { + _deselect: function (event) { this._hideToolbar(event); this._hideMarkers(); - - L.DomEvent.stopPropagation(event); }, _hideToolbar: function() { From 9d54d8f21c09c933d9344fba7bb9693cc7c8313b Mon Sep 17 00:00:00 2001 From: sashadev-sky Date: Fri, 29 Mar 2019 20:25:00 -0400 Subject: [PATCH 61/63] Remove yellow border highlight for single image --- dist/leaflet.distortableimage.js | 29 ++++++++++++++++++--------- src/DistortableCollection.js | 15 +++++++++++--- src/edit/DistortableImage.Edit.js | 14 ++++++------- test/src/DistortableCollectionSpec.js | 8 ++++---- 4 files changed, 42 insertions(+), 24 deletions(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index b08eeca94..528933105 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -863,16 +863,25 @@ L.DistortableCollection = L.FeatureGroup.extend({ return L.DomUtil.hasClass(overlay.getElement(), "selected"); }, - _deselectOthers: function(e) { + _toggleMultiSelect: function (event, edit) { + if (edit._mode === 'lock') { return; } + + if (event.metaKey || event.ctrlKey) { + L.DomUtil.toggleClass(event.target, 'selected'); + } + }, + + _deselectOthers: function(event) { this.eachLayer(function (layer) { var edit = layer.editing; - if (layer._image !== e.target) { + if (layer._image !== event.target) { edit._hideMarkers(); edit._hideToolbar(); } else { edit._showMarkers(); + this._toggleMultiSelect(event, edit); } - }); + }, this); }, _addSelections: function(e) { @@ -1438,7 +1447,7 @@ L.DistortableImage.Edit = L.Handler.extend({ _select: function (event) { this._showToolbar(event); - this._toggleMultipleSelect(event); + // this._toggleMultipleSelect(event); this._showMarkers(); L.DomEvent.stopPropagation(event); @@ -1500,13 +1509,13 @@ L.DistortableImage.Edit = L.Handler.extend({ } }, - _toggleMultipleSelect: function(event) { - if (this._mode === 'lock') { return; } + // _toggleMultipleSelect: function(event) { + // if (this._mode === 'lock') { return; } - if (event.metaKey || event.ctrlKey) { - L.DomUtil.toggleClass(event.target, 'selected'); - } - }, + // if (event.metaKey || event.ctrlKey) { + // L.DomUtil.toggleClass(event.target, 'selected'); + // } + // }, _removeOverlay: function () { var overlay = this._overlay; diff --git a/src/DistortableCollection.js b/src/DistortableCollection.js index 782c3a898..4fe6ff020 100644 --- a/src/DistortableCollection.js +++ b/src/DistortableCollection.js @@ -40,16 +40,25 @@ L.DistortableCollection = L.FeatureGroup.extend({ return L.DomUtil.hasClass(overlay.getElement(), "selected"); }, - _deselectOthers: function(e) { + _toggleMultiSelect: function (event, edit) { + if (edit._mode === 'lock') { return; } + + if (event.metaKey || event.ctrlKey) { + L.DomUtil.toggleClass(event.target, 'selected'); + } + }, + + _deselectOthers: function(event) { this.eachLayer(function (layer) { var edit = layer.editing; - if (layer._image !== e.target) { + if (layer._image !== event.target) { edit._hideMarkers(); edit._hideToolbar(); } else { edit._showMarkers(); + this._toggleMultiSelect(event, edit); } - }); + }, this); }, _addSelections: function(e) { diff --git a/src/edit/DistortableImage.Edit.js b/src/edit/DistortableImage.Edit.js index c1b68fbd5..c3a7b15ab 100644 --- a/src/edit/DistortableImage.Edit.js +++ b/src/edit/DistortableImage.Edit.js @@ -287,7 +287,7 @@ L.DistortableImage.Edit = L.Handler.extend({ _select: function (event) { this._showToolbar(event); - this._toggleMultipleSelect(event); + // this._toggleMultipleSelect(event); this._showMarkers(); L.DomEvent.stopPropagation(event); @@ -349,13 +349,13 @@ L.DistortableImage.Edit = L.Handler.extend({ } }, - _toggleMultipleSelect: function(event) { - if (this._mode === 'lock') { return; } + // _toggleMultipleSelect: function(event) { + // if (this._mode === 'lock') { return; } - if (event.metaKey || event.ctrlKey) { - L.DomUtil.toggleClass(event.target, 'selected'); - } - }, + // if (event.metaKey || event.ctrlKey) { + // L.DomUtil.toggleClass(event.target, 'selected'); + // } + // }, _removeOverlay: function () { var overlay = this._overlay; diff --git a/test/src/DistortableCollectionSpec.js b/test/src/DistortableCollectionSpec.js index f32bee0f2..9f9e830ba 100644 --- a/test/src/DistortableCollectionSpec.js +++ b/test/src/DistortableCollectionSpec.js @@ -1,7 +1,7 @@ -function simulateCommandClick(el) { +function simulateCommandMousedown(el) { if (document.createEvent) { var e = document.createEvent('MouseEvents'); - e.initMouseEvent('click', true, true, window, + e.initMouseEvent('mousedown', true, true, window, 0, 0, 0, 0, 0, true, false, false, true, 0, null); return el.dispatchEvent(e); } @@ -69,7 +69,7 @@ describe("L.DistortableCollection", function () { it("Should allow selection of an image on command + click", function() { L.DomUtil.removeClass(overlay.getElement(), "selected"); - simulateCommandClick(overlay.getElement()); + simulateCommandMousedown(overlay.getElement()); var classStr = L.DomUtil.getClass(overlay.getElement()); @@ -80,7 +80,7 @@ describe("L.DistortableCollection", function () { L.DomUtil.removeClass(overlay.getElement(), "selected"); overlay.editing._mode = "lock"; - simulateCommandClick(overlay.getElement()); + simulateCommandMousedown(overlay.getElement()); var classStr = L.DomUtil.getClass(overlay.getElement()); From 83a1e1b0102f6f9a9b54876eee4f846bc1901617 Mon Sep 17 00:00:00 2001 From: sashadev-sky Date: Fri, 29 Mar 2019 20:27:50 -0400 Subject: [PATCH 62/63] Fix typos --- README.md | 2 +- test/src/DistortableCollectionSpec.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index eb5a31c2a..f6ae9278e 100644 --- a/README.md +++ b/README.md @@ -104,7 +104,7 @@ To test the multi-image interface, open `select.html`. Currently it supports mul - Multiple images can be selected using cmd + `click` to toggle individual image selection. - Click on the map or hit the esc key to quickly deselect all images. -Our `DistortableCollection` lass allows working with multiple images simultaneously. Say we instantiated 3 images, saved them to the variables `img`, `img2`, and `img3`, and enabled editing on all of them. To access the UI and functionalities available in the multiple image interface, pass them to the collection class: +Our `DistortableCollection` class allows working with multiple images simultaneously. Say we instantiated 3 images, saved them to the variables `img`, `img2`, and `img3`, and enabled editing on all of them. To access the UI and functionalities available in the multiple image interface, pass them to the collection class: ```js // OPTION 1: Pass in images immediately diff --git a/test/src/DistortableCollectionSpec.js b/test/src/DistortableCollectionSpec.js index 9f9e830ba..960994ffa 100644 --- a/test/src/DistortableCollectionSpec.js +++ b/test/src/DistortableCollectionSpec.js @@ -76,7 +76,7 @@ describe("L.DistortableCollection", function () { expect(classStr).to.include("selected"); }); - it("But it should now allow selection of a locked image", function() { + it("But it should not allow selection of a locked image", function() { L.DomUtil.removeClass(overlay.getElement(), "selected"); overlay.editing._mode = "lock"; From effd49b87d8e65c33f4e404ac4c6b8d8e8f7e7f9 Mon Sep 17 00:00:00 2001 From: sashadev-sky Date: Fri, 29 Mar 2019 21:30:01 -0400 Subject: [PATCH 63/63] Refactoring --- dist/leaflet.distortableimage.js | 28 +++++----------- src/DistortableCollection.js | 19 +++++------ src/edit/DistortableImage.Edit.js | 9 ----- test/src/DistortableCollectionSpec.js | 48 +++++++++++++++------------ 4 files changed, 44 insertions(+), 60 deletions(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index 528933105..6990985ad 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -830,7 +830,7 @@ L.DistortableCollection = L.FeatureGroup.extend({ this._map = map; L.DomEvent.on(document, "keydown", this._onKeyDown, this); - L.DomEvent.on(map, "click", this._removeSelections, this); + L.DomEvent.on(map, "click", this._deselectAll, this); /** * the box zoom override works, but there is a bug involving click event propogation. @@ -849,7 +849,7 @@ L.DistortableCollection = L.FeatureGroup.extend({ var map = this._map; L.DomEvent.off(document, "keydown", this._onKeyDown, this); - L.DomEvent.off(map, "click", this._removeSelections, this); + L.DomEvent.off(map, "click", this._deselectAll, this); // L.DomEvent.off(map, "boxzoomend", this._addSelections, this); this.eachLayer(function(layer) { @@ -902,7 +902,7 @@ L.DistortableCollection = L.FeatureGroup.extend({ _onKeyDown: function (e) { if (e.key === 'Escape') { - this._removeSelections(); + this._deselectAll(); } }, @@ -936,19 +936,18 @@ L.DistortableCollection = L.FeatureGroup.extend({ for (i = 0; i < 4; i++) { overlay._dragPoints[i] = map.latLngToLayerPoint(overlay.getCorners()[i]); } + + var cpd = overlay._calcCornerPointDelta(); - var cornerPointDelta = overlay._calcCornerPointDelta(); - - this._updateCollectionFromPoints(cornerPointDelta, overlay); + this._updateCollectionFromPoints(cpd, overlay); }, - _removeSelections: function() { + _deselectAll: function() { this.eachLayer(function(layer) { var edit = layer.editing; + L.DomUtil.removeClass(layer.getElement(), "selected"); - if (edit.toolbar) { - edit._hideToolbar(); - } + if (edit.toolbar) { edit._hideToolbar(); } edit._hideMarkers(); }); }, @@ -1447,7 +1446,6 @@ L.DistortableImage.Edit = L.Handler.extend({ _select: function (event) { this._showToolbar(event); - // this._toggleMultipleSelect(event); this._showMarkers(); L.DomEvent.stopPropagation(event); @@ -1509,14 +1507,6 @@ L.DistortableImage.Edit = L.Handler.extend({ } }, - // _toggleMultipleSelect: function(event) { - // if (this._mode === 'lock') { return; } - - // if (event.metaKey || event.ctrlKey) { - // L.DomUtil.toggleClass(event.target, 'selected'); - // } - // }, - _removeOverlay: function () { var overlay = this._overlay; if (this._mode !== "lock") { diff --git a/src/DistortableCollection.js b/src/DistortableCollection.js index 4fe6ff020..977d91816 100644 --- a/src/DistortableCollection.js +++ b/src/DistortableCollection.js @@ -7,7 +7,7 @@ L.DistortableCollection = L.FeatureGroup.extend({ this._map = map; L.DomEvent.on(document, "keydown", this._onKeyDown, this); - L.DomEvent.on(map, "click", this._removeSelections, this); + L.DomEvent.on(map, "click", this._deselectAll, this); /** * the box zoom override works, but there is a bug involving click event propogation. @@ -26,7 +26,7 @@ L.DistortableCollection = L.FeatureGroup.extend({ var map = this._map; L.DomEvent.off(document, "keydown", this._onKeyDown, this); - L.DomEvent.off(map, "click", this._removeSelections, this); + L.DomEvent.off(map, "click", this._deselectAll, this); // L.DomEvent.off(map, "boxzoomend", this._addSelections, this); this.eachLayer(function(layer) { @@ -79,7 +79,7 @@ L.DistortableCollection = L.FeatureGroup.extend({ _onKeyDown: function (e) { if (e.key === 'Escape') { - this._removeSelections(); + this._deselectAll(); } }, @@ -113,19 +113,18 @@ L.DistortableCollection = L.FeatureGroup.extend({ for (i = 0; i < 4; i++) { overlay._dragPoints[i] = map.latLngToLayerPoint(overlay.getCorners()[i]); } + + var cpd = overlay._calcCornerPointDelta(); - var cornerPointDelta = overlay._calcCornerPointDelta(); - - this._updateCollectionFromPoints(cornerPointDelta, overlay); + this._updateCollectionFromPoints(cpd, overlay); }, - _removeSelections: function() { + _deselectAll: function() { this.eachLayer(function(layer) { var edit = layer.editing; + L.DomUtil.removeClass(layer.getElement(), "selected"); - if (edit.toolbar) { - edit._hideToolbar(); - } + if (edit.toolbar) { edit._hideToolbar(); } edit._hideMarkers(); }); }, diff --git a/src/edit/DistortableImage.Edit.js b/src/edit/DistortableImage.Edit.js index c3a7b15ab..2f1ddac2c 100644 --- a/src/edit/DistortableImage.Edit.js +++ b/src/edit/DistortableImage.Edit.js @@ -287,7 +287,6 @@ L.DistortableImage.Edit = L.Handler.extend({ _select: function (event) { this._showToolbar(event); - // this._toggleMultipleSelect(event); this._showMarkers(); L.DomEvent.stopPropagation(event); @@ -349,14 +348,6 @@ L.DistortableImage.Edit = L.Handler.extend({ } }, - // _toggleMultipleSelect: function(event) { - // if (this._mode === 'lock') { return; } - - // if (event.metaKey || event.ctrlKey) { - // L.DomUtil.toggleClass(event.target, 'selected'); - // } - // }, - _removeOverlay: function () { var overlay = this._overlay; if (this._mode !== "lock") { diff --git a/test/src/DistortableCollectionSpec.js b/test/src/DistortableCollectionSpec.js index 960994ffa..c509afbbc 100644 --- a/test/src/DistortableCollectionSpec.js +++ b/test/src/DistortableCollectionSpec.js @@ -53,38 +53,42 @@ describe("L.DistortableCollection", function () { }); - it("Should deselect all images on map click", function() { - L.DomUtil.addClass(overlay.getElement(), "selected"); - L.DomUtil.addClass(overlay2.getElement(), "selected"); + describe("_deselectAll", function () { + it("Should deselect all images on map click", function() { + L.DomUtil.addClass(overlay.getElement(), "selected"); + L.DomUtil.addClass(overlay2.getElement(), "selected"); - map.fire('click'); + map.fire('click'); - var classStr = L.DomUtil.getClass(overlay.getElement()); - var classStr2 = L.DomUtil.getClass(overlay2.getElement()); + var classStr = L.DomUtil.getClass(overlay.getElement()); + var classStr2 = L.DomUtil.getClass(overlay2.getElement()); - expect(classStr).to.not.include("selected"); - expect(classStr2).to.not.include("selected"); + expect(classStr).to.not.include("selected"); + expect(classStr2).to.not.include("selected"); + }); }); - it("Should allow selection of an image on command + click", function() { - L.DomUtil.removeClass(overlay.getElement(), "selected"); - - simulateCommandMousedown(overlay.getElement()); - - var classStr = L.DomUtil.getClass(overlay.getElement()); + describe("_toggleMultiSelect", function () { + it("Should allow selection of multiple images on command + click", function() { + simulateCommandMousedown(overlay.getElement()); + simulateCommandMousedown(overlay2.getElement()); - expect(classStr).to.include("selected"); - }); + var classStr = L.DomUtil.getClass(overlay.getElement()); + var classStr2 = L.DomUtil.getClass(overlay2.getElement()); - it("But it should not allow selection of a locked image", function() { - L.DomUtil.removeClass(overlay.getElement(), "selected"); - overlay.editing._mode = "lock"; + expect(classStr).to.include("selected"); + expect(classStr2).to.include("selected"); + }); - simulateCommandMousedown(overlay.getElement()); + it("But it should not allow selection of a locked image", function() { + L.DomUtil.removeClass(overlay.getElement(), "selected"); + overlay.editing._mode = "lock"; - var classStr = L.DomUtil.getClass(overlay.getElement()); + simulateCommandMousedown(overlay.getElement()); + var classStr = L.DomUtil.getClass(overlay.getElement()); - expect(classStr).to.not.include("selected"); + expect(classStr).to.not.include("selected"); + }); }); });