diff --git a/Gruntfile.js b/Gruntfile.js index 5290d5ab9..aff64f8fa 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -88,8 +88,10 @@ 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' ], dest: 'dist/leaflet.distortableimage.js', } diff --git a/README.md b/README.md index ed46fd61e..f6ae9278e 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,9 @@ 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 +## Basic Usage + +The most simple implementation to get started: ```js // basic Leaflet map setup @@ -56,11 +58,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 +76,10 @@ We've added a GPU-accelerated means to generate a full resolution version of the ``` -## Usage -```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); +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 // create an image img = new L.DistortableImageOverlay( 'example.png', { @@ -96,16 +89,39 @@ 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); -L.DomEvent.on(img._image, 'load', img.editing.enable, img.editing); // enable editing +L.DomEvent.on(img._image, 'load', img.editing.enable, img.editing); ``` + +## 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 cmd + `click` to toggle individual image selection. + - Click on the map or hit the esc key to quickly deselect all images. + +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, 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(img3); + +``` + ## 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 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/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/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index 0040ad9f2..6990985ad 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({ @@ -213,6 +219,7 @@ L.EXIF = function getEXIFdata(img) { }; L.EditHandle = L.Marker.extend({ + initialize: function(overlay, corner, options) { var markerOptions, latlng = overlay._corners[corner]; @@ -299,6 +306,7 @@ L.LockHandle = L.EditHandle.extend({ updateHandle: function() { this.setLatLng(this._handled._corners[this._corner]); + L.DomUtil.removeClass(this._handled.getElement(), 'selected'); } }); @@ -342,8 +350,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; @@ -356,11 +365,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() { @@ -413,14 +421,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'); @@ -536,7 +545,8 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ options: { alt: '', height: 200, - crossOrigin: true + crossOrigin: true, + edgeMinWidth: 500, }, initialize: function(url, options) { @@ -666,6 +676,27 @@ 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 */ @@ -750,6 +781,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 @@ -781,14 +817,188 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ } }); + + + + +L.DistortableCollection = L.FeatureGroup.extend({ + include: L.Mixin.Events, + + onAdd: function(map) { + L.FeatureGroup.prototype.onAdd.call(this, map); + + this._map = map; + + L.DomEvent.on(document, "keydown", this._onKeyDown, this); + L.DomEvent.on(map, "click", this._deselectAll, 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._image, 'mousedown', this._deselectOthers, this); + L.DomEvent.on(layer, "dragstart", this._dragStartMultiple, this); + L.DomEvent.on(layer, "drag", this._dragMultiple, this); + }, this); + }, + + onRemove: function() { + var map = this._map; + + L.DomEvent.off(document, "keydown", this._onKeyDown, this); + L.DomEvent.off(map, "click", this._deselectAll, this); + // L.DomEvent.off(map, "boxzoomend", this._addSelections, this); + + this.eachLayer(function(layer) { + 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"); + }, + + _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 !== event.target) { + edit._hideMarkers(); + edit._hideToolbar(); + } else { + edit._showMarkers(); + this._toggleMultiSelect(event, edit); + } + }, this); + }, + + _addSelections: function(e) { + var box = e.boxZoomBounds, + i = 0; + + this.eachLayer(function(layer) { + var edit = layer.editing; + if (edit.toolbar) { edit._hideToolbar(); } + for (i = 0; i < 4; i++) { + if (box.contains(layer.getCorners()[i]) && edit._mode !== "lock") { + L.DomUtil.addClass(layer.getElement(), "selected"); + break; + } + } + }); + }, + + _onKeyDown: function (e) { + if (e.key === 'Escape') { + this._deselectAll(); + } + }, + + _dragStartMultiple: function(event) { + var overlay = event.target, + i; + + 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] + ); + } + }); + }, + + _dragMultiple: function(event) { + var overlay = event.target, + map = this._map, + i; + + if (!this.isSelected(overlay)) { return; } + + overlay._dragPoints = {}; + + for (i = 0; i < 4; i++) { + overlay._dragPoints[i] = map.latLngToLayerPoint(overlay.getCorners()[i]); + } + + var cpd = overlay._calcCornerPointDelta(); + + this._updateCollectionFromPoints(cpd, overlay); + }, + + _deselectAll: function() { + this.eachLayer(function(layer) { + var edit = layer.editing; + + L.DomUtil.removeClass(layer.getElement(), "selected"); + if (edit.toolbar) { edit._hideToolbar(); } + edit._hideMarkers(); + }); + }, + + /** + * 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(cpd, overlay) { + var layersToMove = [], + p = new L.Transformation(1, -cpd.x, 1, -cpd.y); + + this.eachLayer(function(layer) { + if ( + layer !== overlay && + layer.editing._mode !== "lock" && + this.isSelected(layer) + ) { + + 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); + } + }, this); + + return layersToMove; + }, + + /** + * cpd === cornerPointDelta + */ + _updateCollectionFromPoints: function(cpd, overlay) { + var layersToMove = this._calcCollectionFromPoints( + cpd, + overlay + ); + + layersToMove.forEach(function(layer) { + layer._updateCornersFromPoints(layer._cpd); + layer.fire("update"); + }, this); + } +}); 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 +1043,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 +1125,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 +1151,10 @@ L.DistortableImage.EditToolbar = LeafletToolbar.Popup.extend({ ToggleEditable, ToggleRotateDistort, ToggleExport, + EnableEXIF, ToggleOrder ] } ->>>>>>> 7d1dc5bdd8e16a65b9204667f6066757f5245d1d }); L.DistortableImage = L.DistortableImage || {}; @@ -1045,19 +1164,20 @@ 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 + 27: '_deselect', // esc 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 } }, @@ -1115,17 +1235,28 @@ L.DistortableImage.Edit = L.Handler.extend({ } else { this._mode = 'distort'; map.addLayer(this._distortHandles); + this._distortHandles.eachLayer(function (layer) { + layer.setOpacity(0); + layer.dragging.disable(); + layer.options.draggable = false; + }); this._enableDragging(); } - //overlay.on('click', this._showToolbar, this); - L.DomEvent.on(overlay._image, 'click', this._showToolbar, this); + 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(map, "click", this._deselect, this); + L.DomEvent.on(overlay._image, 'click', this._select, this); /* Enable hotkeys. */ L.DomEvent.on(window, 'keydown', this._onKeyDown, this); overlay.fire('select'); - }, /* Run on image deselection. */ @@ -1133,15 +1264,16 @@ L.DistortableImage.Edit = L.Handler.extend({ var overlay = this._overlay, map = overlay._map; - // L.DomEvent.off(window, 'keydown', this._onKeyDown, this); - - L.DomEvent.off(overlay._image, 'click', this._showToolbar, this); + L.DomEvent.off(map, "click", this._deselect, this); + L.DomEvent.off(overlay._image, 'click', this._select, 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; + if (this.toolbar) { this._hideToolbar(); } + if (this.editing) { this.editing.disable(); } + map.removeLayer(this._handles[this._mode]); /* Disable hotkeys. */ @@ -1152,8 +1284,7 @@ L.DistortableImage.Edit = L.Handler.extend({ confirmDelete: function () { return window.confirm("Are you sure you want to delete?"); - }, - + }, _rotateBy: function(angle) { var overlay = this._overlay, @@ -1197,8 +1328,11 @@ 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 */ - this.dragging.on('dragstart', this._hideToolbar, this); + /* Hide toolbars and markers while dragging; click will re-show it */ + this.dragging.on('dragstart', function () { + overlay.fire('dragstart'); + this._hideToolbar(); + }, this); /* * Adjust default behavior of L.Draggable. @@ -1217,6 +1351,7 @@ L.DistortableImage.Edit = L.Handler.extend({ } overlay._reset(); overlay.fire('update'); + overlay.fire('drag'); this.fire('drag'); }; @@ -1227,7 +1362,7 @@ L.DistortableImage.Edit = L.Handler.extend({ handlerName = keymap[event.which]; if (handlerName !== undefined && this._overlay.options.suppressToolbar !== true) { - this[handlerName].call(this); + this[handlerName].call(this); } }, @@ -1247,9 +1382,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]); }, @@ -1257,9 +1390,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]); }, @@ -1313,6 +1444,18 @@ L.DistortableImage.Edit = L.Handler.extend({ map.addLayer(this._handles[this._mode]); }, + _select: function (event) { + this._showToolbar(event); + this._showMarkers(); + + L.DomEvent.stopPropagation(event); + }, + + _deselect: function (event) { + this._hideToolbar(event); + this._hideMarkers(); + }, + _hideToolbar: function() { var map = this._overlay._map; if (this.toolbar) { @@ -1321,38 +1464,63 @@ L.DistortableImage.Edit = L.Handler.extend({ } }, + _showMarkers: function() { + if (this._mode === 'lock') { return; } + this._distortHandles.eachLayer(function (layer) { + layer.setOpacity(1); + layer.dragging.enable(); + layer.options.draggable = true; + }); + }, + + _hideMarkers: function() { + this._distortHandles.eachLayer(function (layer) { + var drag = layer.dragging, + opts = layer.options; + + layer.setOpacity(0); + if (drag) { drag.disable(); } + if (opts.draggable) { opts.draggable = 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. */ 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'); } - - L.DomEvent.stopPropagation(event); - }, + }, _removeOverlay: function () { var overlay = this._overlay; if (this._mode !== "lock") { var choice = this.confirmDelete(); if (choice) { + this._hideToolbar(); overlay._map.removeLayer(overlay); overlay.fire('delete'); this.disable(); } } - }, - + }, + + // compare this to using overlay zIndex _toggleOrder: function () { if (this._toggledImage) { this._overlay.bringToFront(); @@ -1452,3 +1620,95 @@ L.DistortableImageOverlay.addInitHook(function() { if (this.editing) { this.editing.disable(); } }); }); +L.Map.mergeOptions({ boxSelector: true, boxZoom: false }); + +// used for multiple image select. Temporarily disabled until click +// propagation issue is fixed + +L.Map.BoxSelectHandle = L.Map.BoxZoom.extend({ + + initialize: function (map) { + this._map = map; + this._container = map._container; + this._pane = map._panes.overlayPane; + }, + + addHooks: function () { + L.DomEvent.on(this._container, 'mousedown', this._onMouseDown, this); + }, + + removeHooks: function () { + L.DomEvent.off(this._container, 'mousedown', this._onMouseDown, this); + }, + + _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._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) + .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) { + var map = this._map, + layerPoint = map.mouseEventToLayerPoint(e); + + if (this._startLayerPoint.equals(layerPoint)) { return; } + + this._boxBounds = new L.LatLngBounds( + map.layerPointToLatLng(this._startLayerPoint), + map.layerPointToLatLng(layerPoint)); + + this._finish(); + + map.fire('boxzoomend', { boxZoomBounds: this._boxBounds }); + + // this._finish(); + }, + + _finish: function () { + $(this._map.boxSelector._box).remove(); + // L.DomUtil.remove(this._box); + // L.DomUtil.remove(this._map.boxSelector); + this._container.style.cursor = ''; + + L.DomUtil.enableTextSelection(); + L.DomUtil.enableImageDrag(); + + L.DomEvent + .off(document, 'mousemove', this._onMouseMove) + .off(document, 'mouseup', this._onMouseUp); + }, +}); + +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..f60d538bc --- /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\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 0c1fa6929..425e21725 100644 --- a/examples/select.html +++ b/examples/select.html @@ -44,70 +44,71 @@ 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) { - /* 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() - } - - // 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' - } - ).addTo(map); - images.push(img) - L.DomEvent.on(img._image, 'click', select, img); - - // create a second image - img = 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) - ] - } - ).addTo(map); - images.push(img) - - L.DomEvent.on(img._image, 'load', img.editing.enable, img.editing); - L.DomEvent.on(img._image, 'click', select, img); - - // 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); - } - } - }); - + 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', + // HARDCODED: we should find the img w/h dynamically so that it fits the image each time. + edgeMinWidth: 521, + edgeMinHeight: 348, + }).addTo(map); + + // 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) + ], + // HARDCODED: we should find the img w/h dynamically so that it fits the image each time. (initImageDimensions?) + edgeMinWidth: 521, + 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) + ], + // 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) + ], + // 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); + + new L.DistortableCollection([img, img2, img3, img4]).addTo(map); + + }, this); })(); + 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/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" diff --git a/src/DistortableCollection.js b/src/DistortableCollection.js new file mode 100644 index 000000000..977d91816 --- /dev/null +++ b/src/DistortableCollection.js @@ -0,0 +1,175 @@ +L.DistortableCollection = L.FeatureGroup.extend({ + include: L.Mixin.Events, + + onAdd: function(map) { + L.FeatureGroup.prototype.onAdd.call(this, map); + + this._map = map; + + L.DomEvent.on(document, "keydown", this._onKeyDown, this); + L.DomEvent.on(map, "click", this._deselectAll, 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._image, 'mousedown', this._deselectOthers, this); + L.DomEvent.on(layer, "dragstart", this._dragStartMultiple, this); + L.DomEvent.on(layer, "drag", this._dragMultiple, this); + }, this); + }, + + onRemove: function() { + var map = this._map; + + L.DomEvent.off(document, "keydown", this._onKeyDown, this); + L.DomEvent.off(map, "click", this._deselectAll, this); + // L.DomEvent.off(map, "boxzoomend", this._addSelections, this); + + this.eachLayer(function(layer) { + 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"); + }, + + _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 !== event.target) { + edit._hideMarkers(); + edit._hideToolbar(); + } else { + edit._showMarkers(); + this._toggleMultiSelect(event, edit); + } + }, this); + }, + + _addSelections: function(e) { + var box = e.boxZoomBounds, + i = 0; + + this.eachLayer(function(layer) { + var edit = layer.editing; + if (edit.toolbar) { edit._hideToolbar(); } + for (i = 0; i < 4; i++) { + if (box.contains(layer.getCorners()[i]) && edit._mode !== "lock") { + L.DomUtil.addClass(layer.getElement(), "selected"); + break; + } + } + }); + }, + + _onKeyDown: function (e) { + if (e.key === 'Escape') { + this._deselectAll(); + } + }, + + _dragStartMultiple: function(event) { + var overlay = event.target, + i; + + 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] + ); + } + }); + }, + + _dragMultiple: function(event) { + var overlay = event.target, + map = this._map, + i; + + if (!this.isSelected(overlay)) { return; } + + overlay._dragPoints = {}; + + for (i = 0; i < 4; i++) { + overlay._dragPoints[i] = map.latLngToLayerPoint(overlay.getCorners()[i]); + } + + var cpd = overlay._calcCornerPointDelta(); + + this._updateCollectionFromPoints(cpd, overlay); + }, + + _deselectAll: function() { + this.eachLayer(function(layer) { + var edit = layer.editing; + + L.DomUtil.removeClass(layer.getElement(), "selected"); + if (edit.toolbar) { edit._hideToolbar(); } + edit._hideMarkers(); + }); + }, + + /** + * 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(cpd, overlay) { + var layersToMove = [], + p = new L.Transformation(1, -cpd.x, 1, -cpd.y); + + this.eachLayer(function(layer) { + if ( + layer !== overlay && + layer.editing._mode !== "lock" && + this.isSelected(layer) + ) { + + 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); + } + }, this); + + return layersToMove; + }, + + /** + * cpd === cornerPointDelta + */ + _updateCollectionFromPoints: function(cpd, overlay) { + var layersToMove = this._calcCollectionFromPoints( + cpd, + overlay + ); + + layersToMove.forEach(function(layer) { + layer._updateCornersFromPoints(layer._cpd); + layer.fire("update"); + }, this); + } +}); \ No newline at end of file diff --git a/src/DistortableImageOverlay.js b/src/DistortableImageOverlay.js index 515cc23bb..b8e8999aa 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, + edgeMinWidth: 500, }, initialize: function(url, options) { @@ -134,6 +135,27 @@ 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 */ @@ -218,6 +240,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 @@ -248,3 +275,7 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ ); } }); + + + + diff --git a/src/edit/BoxSelectHandle.js b/src/edit/BoxSelectHandle.js new file mode 100644 index 000000000..0769e50eb --- /dev/null +++ b/src/edit/BoxSelectHandle.js @@ -0,0 +1,92 @@ +L.Map.mergeOptions({ boxSelector: true, boxZoom: false }); + +// used for multiple image select. Temporarily disabled until click +// propagation issue is fixed + +L.Map.BoxSelectHandle = L.Map.BoxZoom.extend({ + + initialize: function (map) { + this._map = map; + this._container = map._container; + this._pane = map._panes.overlayPane; + }, + + addHooks: function () { + L.DomEvent.on(this._container, 'mousedown', this._onMouseDown, this); + }, + + removeHooks: function () { + L.DomEvent.off(this._container, 'mousedown', this._onMouseDown, this); + }, + + _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._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) + .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) { + var map = this._map, + layerPoint = map.mouseEventToLayerPoint(e); + + if (this._startLayerPoint.equals(layerPoint)) { return; } + + this._boxBounds = new L.LatLngBounds( + map.layerPointToLatLng(this._startLayerPoint), + map.layerPointToLatLng(layerPoint)); + + this._finish(); + + map.fire('boxzoomend', { boxZoomBounds: this._boxBounds }); + + // this._finish(); + }, + + _finish: function () { + $(this._map.boxSelector._box).remove(); + // L.DomUtil.remove(this._box); + // L.DomUtil.remove(this._map.boxSelector); + this._container.style.cursor = ''; + + L.DomUtil.enableTextSelection(); + L.DomUtil.enableImageDrag(); + + L.DomEvent + .off(document, 'mousemove', this._onMouseMove) + .off(document, 'mouseup', this._onMouseUp); + }, +}); + +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..2f1ddac2c 100644 --- a/src/edit/DistortableImage.Edit.js +++ b/src/edit/DistortableImage.Edit.js @@ -5,19 +5,20 @@ 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 + 27: '_deselect', // esc 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 } }, @@ -75,17 +76,28 @@ L.DistortableImage.Edit = L.Handler.extend({ } else { this._mode = 'distort'; map.addLayer(this._distortHandles); + this._distortHandles.eachLayer(function (layer) { + layer.setOpacity(0); + layer.dragging.disable(); + layer.options.draggable = false; + }); this._enableDragging(); } - //overlay.on('click', this._showToolbar, this); - L.DomEvent.on(overlay._image, 'click', this._showToolbar, this); + 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(map, "click", this._deselect, this); + L.DomEvent.on(overlay._image, 'click', this._select, this); /* Enable hotkeys. */ L.DomEvent.on(window, 'keydown', this._onKeyDown, this); overlay.fire('select'); - }, /* Run on image deselection. */ @@ -93,15 +105,16 @@ L.DistortableImage.Edit = L.Handler.extend({ var overlay = this._overlay, map = overlay._map; - // L.DomEvent.off(window, 'keydown', this._onKeyDown, this); + L.DomEvent.off(map, "click", this._deselect, this); + L.DomEvent.off(overlay._image, 'click', this._select, this); - L.DomEvent.off(overlay._image, 'click', this._showToolbar, 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; + if (this.toolbar) { this._hideToolbar(); } + if (this.editing) { this.editing.disable(); } + map.removeLayer(this._handles[this._mode]); /* Disable hotkeys. */ @@ -112,8 +125,7 @@ L.DistortableImage.Edit = L.Handler.extend({ confirmDelete: function () { return window.confirm("Are you sure you want to delete?"); - }, - + }, _rotateBy: function(angle) { var overlay = this._overlay, @@ -157,8 +169,11 @@ 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 */ - this.dragging.on('dragstart', this._hideToolbar, this); + /* Hide toolbars and markers while dragging; click will re-show it */ + this.dragging.on('dragstart', function () { + overlay.fire('dragstart'); + this._hideToolbar(); + }, this); /* * Adjust default behavior of L.Draggable. @@ -177,6 +192,7 @@ L.DistortableImage.Edit = L.Handler.extend({ } overlay._reset(); overlay.fire('update'); + overlay.fire('drag'); this.fire('drag'); }; @@ -187,7 +203,7 @@ L.DistortableImage.Edit = L.Handler.extend({ handlerName = keymap[event.which]; if (handlerName !== undefined && this._overlay.options.suppressToolbar !== true) { - this[handlerName].call(this); + this[handlerName].call(this); } }, @@ -207,9 +223,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]); }, @@ -217,9 +231,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]); }, @@ -273,6 +285,18 @@ L.DistortableImage.Edit = L.Handler.extend({ map.addLayer(this._handles[this._mode]); }, + _select: function (event) { + this._showToolbar(event); + this._showMarkers(); + + L.DomEvent.stopPropagation(event); + }, + + _deselect: function (event) { + this._hideToolbar(event); + this._hideMarkers(); + }, + _hideToolbar: function() { var map = this._overlay._map; if (this.toolbar) { @@ -281,38 +305,63 @@ L.DistortableImage.Edit = L.Handler.extend({ } }, + _showMarkers: function() { + if (this._mode === 'lock') { return; } + this._distortHandles.eachLayer(function (layer) { + layer.setOpacity(1); + layer.dragging.enable(); + layer.options.draggable = true; + }); + }, + + _hideMarkers: function() { + this._distortHandles.eachLayer(function (layer) { + var drag = layer.dragging, + opts = layer.options; + + layer.setOpacity(0); + if (drag) { drag.disable(); } + if (opts.draggable) { opts.draggable = 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. */ 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'); } - - L.DomEvent.stopPropagation(event); - }, + }, _removeOverlay: function () { var overlay = this._overlay; if (this._mode !== "lock") { var choice = this.confirmDelete(); if (choice) { + this._hideToolbar(); overlay._map.removeLayer(overlay); overlay.fire('delete'); this.disable(); } } - }, - + }, + + // compare this to using overlay zIndex _toggleOrder: function () { if (this._toggledImage) { this._overlay.bringToFront(); @@ -411,4 +460,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/EditHandle.js b/src/edit/EditHandle.js index 4d7dc03e5..0f9bd1bf3 100644 --- a/src/edit/EditHandle.js +++ b/src/edit/EditHandle.js @@ -1,4 +1,5 @@ L.EditHandle = L.Marker.extend({ + initialize: function(overlay, corner, options) { var markerOptions, latlng = overlay._corners[corner]; diff --git a/src/edit/LockHandle.js b/src/edit/LockHandle.js index 66383d22c..352e07c0f 100644 --- a/src/edit/LockHandle.js +++ b/src/edit/LockHandle.js @@ -14,6 +14,7 @@ L.LockHandle = L.EditHandle.extend({ updateHandle: function() { 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..bad357599 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; @@ -30,11 +31,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'); 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); } + }); diff --git a/test/karma.conf.js b/test/karma.conf.js index 8be970a95..b52a4316d 100644 --- a/test/karma.conf.js +++ b/test/karma.conf.js @@ -34,16 +34,19 @@ module.exports = function(config) { "node_modules/sinon/pkg/sinon.js", "src/util/*.js", "src/edit/getEXIFdata.js", + "src/edit/BoxSelectHandle.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/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..c509afbbc --- /dev/null +++ b/test/src/DistortableCollectionSpec.js @@ -0,0 +1,94 @@ +function simulateCommandMousedown(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); + } +}; + +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 images and feature group to load before any tests are run. */ + 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); + }); + + }); + + it.skip("Should keep selected images in sync with eachother during translation", function () { + + }); + + 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'); + + 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"); + }); + }); + + describe("_toggleMultiSelect", function () { + it("Should allow selection of multiple images on command + click", function() { + simulateCommandMousedown(overlay.getElement()); + simulateCommandMousedown(overlay2.getElement()); + + var classStr = L.DomUtil.getClass(overlay.getElement()); + var classStr2 = L.DomUtil.getClass(overlay2.getElement()); + + expect(classStr).to.include("selected"); + expect(classStr2).to.include("selected"); + }); + + it("But it should not allow selection of a locked image", function() { + L.DomUtil.removeClass(overlay.getElement(), "selected"); + overlay.editing._mode = "lock"; + + simulateCommandMousedown(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],