diff --git a/lib/map.js b/lib/map.js index bcab1a8..ea40998 100644 --- a/lib/map.js +++ b/lib/map.js @@ -68,6 +68,48 @@ define(["map/clientlayer", "map/labelslayer", } }) + var CoordsPickerButton = L.Control.extend({ + options: { + position: "bottomright" + }, + + active: false, + button: undefined, + + initialize: function (f, options) { + L.Util.setOptions(this, options) + this.f = f + }, + + onAdd: function () { + var button = L.DomUtil.create("button", "coord-picker") + button.textContent = "" + + // Click propagation isn't disabled as this causes problems with the + // location picking mode; instead propagation is stopped in onClick(). + L.DomEvent.addListener(button, "click", this.onClick, this) + + this.button = button + + return button + }, + + update: function() { + this.button.classList.toggle("active", this.active) + }, + + set: function(v) { + this.active = v + this.update() + }, + + onClick: function (e) { + L.DomEvent.stopPropagation(e) + this.f(!this.active) + } + + }) + function mkMarker(dict, iconFunc, router) { return function (d) { var m = L.circleMarker([d.nodeinfo.location.latitude, d.nodeinfo.location.longitude], iconFunc(d)) @@ -152,6 +194,13 @@ define(["map/clientlayer", "map/labelslayer", }) } + var showCoordsPickerButton = new CoordsPickerButton(function (d) { + if (d) + enableCoords() + else + disableCoords() + }) + function saveView() { savedView = {center: map.getCenter(), zoom: map.getZoom()} @@ -171,6 +220,23 @@ define(["map/clientlayer", "map/labelslayer", locateUserButton.set(false) } + function enableCoords() { + map.getContainer().classList.add("pick-coordinates") + map.on("click", showCoordinates) + showCoordsPickerButton.set(true) + } + + function disableCoords() { + map.getContainer().classList.remove("pick-coordinates") + map.off("click", showCoordinates) + showCoordsPickerButton.set(false) + } + + function showCoordinates(e) { + window.prompt("Koordinaten (Lat, Lng)", e.latlng.lat.toFixed(6) + ", " + e.latlng.lng.toFixed(6)) + disableCoords() + } + function locationFound(e) { if (!userLocation) userLocation = new LocationMarker(e.latlng).addTo(map) @@ -228,6 +294,7 @@ define(["map/clientlayer", "map/labelslayer", map.on("dragend", saveView) addButton(locateUserButton) + addButton(showCoordsPickerButton) addButton(new AddLayerButton(function () { /*eslint no-alert:0*/ diff --git a/scss/_map.scss b/scss/_map.scss index f0b340c..bc3a919 100644 --- a/scss/_map.scss +++ b/scss/_map.scss @@ -2,6 +2,10 @@ paint-order: stroke; } +.pick-coordinates { + cursor: crosshair; +} + .map { width: 100%; height: 100%;