EditToolbar.Delete.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. L.EditToolbar.Delete = L.Handler.extend({
  2. statics: {
  3. TYPE: 'remove' // not delete as delete is reserved in js
  4. },
  5. includes: L.Mixin.Events,
  6. initialize: function (map, options) {
  7. L.Handler.prototype.initialize.call(this, map);
  8. L.Util.setOptions(this, options);
  9. // Store the selectable layer group for ease of access
  10. this._deletableLayers = this.options.featureGroup;
  11. if (!(this._deletableLayers instanceof L.FeatureGroup)) {
  12. throw new Error('options.featureGroup must be a L.FeatureGroup');
  13. }
  14. // Save the type so super can fire, need to do this as cannot do this.TYPE :(
  15. this.type = L.EditToolbar.Delete.TYPE;
  16. },
  17. enable: function () {
  18. if (this._enabled) {
  19. this.disable();
  20. return; }
  21. L.Handler.prototype.enable.call(this);
  22. this._deletableLayers
  23. .on('layeradd', this._enableLayerDelete, this)
  24. .on('layerremove', this._disableLayerDelete, this);
  25. this.fire('enabled', { handler: this.type});
  26. },
  27. disable: function () {
  28. if (!this._enabled) { return; }
  29. L.Handler.prototype.disable.call(this);
  30. this._deletableLayers
  31. .off('layeradd', this._enableLayerDelete, this)
  32. .off('layerremove', this._disableLayerDelete, this);
  33. this.fire('disabled', { handler: this.type});
  34. },
  35. addHooks: function () {
  36. if (this._map) {
  37. this._deletableLayers.eachLayer(this._enableLayerDelete, this);
  38. this._deletedLayers = new L.layerGroup();
  39. this._tooltip = new L.DrawTooltip(this._map);
  40. this._tooltip.updateContent({ text: L.drawLocal.edit.toolbar.remove.tooltip });
  41. this._map.on('mousemove', this._onMouseMove, this);
  42. }
  43. },
  44. removeHooks: function () {
  45. if (this._map) {
  46. this._deletableLayers.eachLayer(this._disableLayerDelete, this);
  47. this._deletedLayers = null;
  48. this._tooltip.dispose();
  49. this._tooltip = null;
  50. this._map.off('mousemove', this._onMouseMove, this);
  51. }
  52. },
  53. revertLayers: function () {
  54. // Iterate of the deleted layers and add them back into the featureGroup
  55. this._deletedLayers.eachLayer(function (layer) {
  56. this._deletableLayers.addLayer(layer);
  57. }, this);
  58. },
  59. save: function () {
  60. this._map.fire('draw:deleted', { layers: this._deletedLayers });
  61. },
  62. _enableLayerDelete: function (e) {
  63. var layer = e.layer || e.target || e;
  64. layer.on('click', this._removeLayer, this);
  65. },
  66. _disableLayerDelete: function (e) {
  67. var layer = e.layer || e.target || e;
  68. layer.off('click', this._removeLayer, this);
  69. // Remove from the deleted layers so we can't accidently revert if the user presses cancel
  70. this._deletedLayers.removeLayer(layer);
  71. },
  72. _removeLayer: function (e) {
  73. var layer = e.layer || e.target || e;
  74. this._deletableLayers.removeLayer(layer);
  75. this._deletedLayers.addLayer(layer);
  76. },
  77. _onMouseMove: function (e) {
  78. this._tooltip.updatePosition(e.latlng);
  79. }
  80. });