commit 06289c3790bd0fdddb4566e69c5fc135c1fe2a93
parent 6a81888228bd48450985e171274c8fec5e32f7b3
Author: Sergej Orlov <wladimirych@gmail.com>
Date: Mon, 28 Nov 2016 22:15:05 +0300
[layers hotkeys] enable hotkeys explicitly
Diffstat:
2 files changed, 79 insertions(+), 53 deletions(-)
diff --git a/src/App.js b/src/App.js
@@ -7,7 +7,7 @@ import 'lib/leaflet.control.printPages/control'
import 'lib/leaflet.control.caption/caption'
import config from './config'
import 'lib/leaflet.control.coordinates/coordinates';
-import 'lib/leaflet.control.layers.hotkeys/control.Layers-hotkeys';
+import enableLayersControlHotKeys from 'lib/leaflet.control.layers.hotkeys/control.Layers-hotkeys';
import 'lib/leaflet.hashState/Leaflet.Map';
import 'lib/leaflet.hashState/Leaflet.Control.Layers';
import fixAnimationBug from 'lib/leaflet.fixAnimationBug/leaflet.fixAnimationBug'
@@ -64,9 +64,11 @@ function setUp() {
let baseLayers = layers.getBaseMaps();
- const layersControl = L.control.layers(baseLayers, layers.getOverlays(), {collapsed: false}).addTo(map);
map.addLayer(baseLayers['OpenStreetMap']);
- layersControl.enableHashState('l');
+ const layersControl = L.control.layers(baseLayers, layers.getOverlays(), {collapsed: false})
+ .addTo(map)
+ .enableHashState('l');
+ enableLayersControlHotKeys (layersControl);
new L.Control.PrintPages({position: 'bottomleft'}).addTo(map);
diff --git a/src/lib/leaflet.control.layers.hotkeys/control.Layers-hotkeys.js b/src/lib/leaflet.control.layers.hotkeys/control.Layers-hotkeys.js
@@ -1,66 +1,90 @@
-import L from 'leaflet'
+import L from 'leaflet';
import './style.css';
-const originalOnAdd = L.Control.Layers.prototype.onAdd;
-const originalOnRemove = L.Control.Layers.prototype.onRemove;
-const originalAddLayer = L.Control.Layers.prototype._addLayer;
+function extendLayerName(name, layer) {
+ if (layer.options) {
+ const code = layer.options.code;
+ if (code && code.length === 1) {
+ name += `<span class="layers-control-hotkey">${code}</span>`;
+ }
+ }
+ return name;
+}
-L.Control.Layers.include({
- _addLayer: function(layer, name, overlay) {
- if (layer.options) {
- const code = layer.options.code;
- if (code && code.length === 1) {
- name += `<span class="layers-control-hotkey">${code}</span>`;
- }
- }
- return originalAddLayer.call(this, layer, name, overlay);
- },
+function enableHotKeys(control) {
+ const originalOnAdd = control.onAdd;
+ const originalOnRemove = control.onRemove;
+ const originalAddLayer = control._addLayer;
- onAdd: function(map) {
- var result = originalOnAdd.call(this, map);
- L.DomEvent.on(document, 'keyup', this._onHotkeyUp, this);
- L.DomEvent.on(document, 'keydown', this.onKeyDown, this);
- return result;
- },
+ if (control._hotKeysEnabled) {
+ return control;
+ }
- onRemove: function(map) {
- L.DomEvent.off(document, 'keyup', this._onHotkeyUp, this);
- L.DomEvent.off(document, 'keydown', this.onKeyDown, this);
- originalOnRemove.call(this, map);
+ L.Util.extend(control, {
+ _hotKeysEnabled: true,
- },
+ _addLayer: function(layer, name, overlay) {
+ name = extendLayerName(name, layer);
+ return originalAddLayer.call(this, layer, name, overlay);
+ },
- onKeyDown: function(e) {
- if (e.altKey || e.ctrlKey || e.shiftKey) {
- return;
- }
- this._keyDown = e.keyCode;
- },
+ onAdd: function(map) {
+ var result = originalOnAdd.call(this, map);
+ this._addHotketEvents();
+ return result;
+ },
- _onHotkeyUp: function(e) {
- const pressedKey = this._keyDown;
- this._keyDown = null;
- const targetTag = e.target.tagName.toLowerCase();
- if (('input' === targetTag && e.target.type === 'text')|| 'textarea' === targetTag || pressedKey !== e.keyCode) {
- return;
- }
- const key = String.fromCharCode(e.keyCode);
- for (let layer of this._layers) {
- let layerId = L.stamp(layer.layer);
- if (layer.layer.options && layer.layer.options.code && layer.layer.options.code.toUpperCase() === key) {
- const inputs = this._form.getElementsByTagName('input');
- for (let input of inputs) {
- if (input.layerId === layerId) {
- input.click();
- break;
+ onRemove: function(map) {
+ L.DomEvent.off(document, 'keyup', this._onHotkeyUp, this);
+ L.DomEvent.off(document, 'keydown', this.onKeyDown, this);
+ originalOnRemove.call(this, map);
+
+ },
+
+ _addHotKetEvents: function() {
+ L.DomEvent.on(document, 'keyup', this._onHotkeyUp, this);
+ L.DomEvent.on(document, 'keydown', this.onKeyDown, this);
+ },
+
+ onKeyDown: function(e) {
+ if (e.altKey || e.ctrlKey || e.shiftKey) {
+ return;
+ }
+ this._keyDown = e.keyCode;
+ },
+
+ _onHotkeyUp: function(e) {
+ const pressedKey = this._keyDown;
+ this._keyDown = null;
+ const targetTag = e.target.tagName.toLowerCase();
+ if (('input' === targetTag && e.target.type === 'text') || 'textarea' === targetTag ||
+ pressedKey !== e.keyCode) {
+ return;
+ }
+ const key = String.fromCharCode(e.keyCode);
+ for (let layer of this._layers) {
+ let layerId = L.stamp(layer.layer);
+ if (layer.layer.options && layer.layer.options.code && layer.layer.options.code.toUpperCase() === key) {
+ const inputs = this._form.getElementsByTagName('input');
+ for (let input of inputs) {
+ if (input.layerId === layerId) {
+ input.click();
+ break;
+ }
}
+ break;
}
- break;
}
}
}
-
+ );
+ for (let layer of control._layers) {
+ layer.name = extendLayerName(layer.name, layer.layer);
}
-);
+ control._addHotKetEvents();
+ control._update();
+ return control;
+}
+export default enableHotKeys;