Non puoi selezionare più di 25 argomenti
Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.
154 righe
4.9 KiB
154 righe
4.9 KiB
/* |
|
* Simple navigation control that allows back and forward navigation through map's view history |
|
*/ |
|
|
|
(function() { |
|
L.Control.NavBar = L.Control.extend({ |
|
options: { |
|
position: 'topleft', |
|
//center:, |
|
//zoom :, |
|
//bbox:, //Alternative to center/zoom for home button, takes precedence if included |
|
forwardTitle: 'Go forward in map view history', |
|
backTitle: 'Go back in map view history', |
|
homeTitle: 'Go to home map view' |
|
}, |
|
|
|
onAdd: function(map) { |
|
|
|
// Set options |
|
if (!this.options.center) { |
|
this.options.center = map.getCenter(); |
|
} |
|
if (!this.options.zoom) { |
|
this.options.zoom = map.getZoom(); |
|
} |
|
options = this.options; |
|
|
|
// Create toolbar |
|
var controlName = 'leaflet-control-navbar', |
|
container = L.DomUtil.create('div', controlName + ' leaflet-bar'); |
|
|
|
// Add toolbar buttons |
|
this._homeButton = this._createButton(options.homeTitle, controlName + '-home', container, this._goHome); |
|
this._fwdButton = this._createButton(options.forwardTitle, controlName + '-fwd', container, this._goFwd); |
|
this._backButton = this._createButton(options.backTitle, controlName + '-back', container, this._goBack); |
|
|
|
// Initialize view history and index |
|
this._viewHistory = [{center: this.options.center, zoom: this.options.zoom}]; |
|
this._curIndx = 0; |
|
this._updateDisabled(); |
|
map.once('moveend', function() {this._map.on('moveend', this._updateHistory, this);}, this); |
|
// Set intial view to home |
|
map.setView(options.center, options.zoom); |
|
|
|
return container; |
|
}, |
|
|
|
onRemove: function(map) { |
|
map.off('moveend', this._updateHistory, this); |
|
}, |
|
|
|
_goHome: function() { |
|
if (this.options.bbox){ |
|
try { |
|
this._map.fitBounds(this.options.bbox); |
|
} catch(err){ |
|
this._map.setView(this.options.center, this.options.zoom); //Use default if invalid bbox input. |
|
} |
|
} |
|
this._map.setView(this.options.center, this.options.zoom); |
|
}, |
|
|
|
_goBack: function() { |
|
if (this._curIndx !== 0) { |
|
this._map.off('moveend', this._updateHistory, this); |
|
this._map.once('moveend', function() {this._map.on('moveend', this._updateHistory, this);}, this); |
|
this._curIndx--; |
|
this._updateDisabled(); |
|
var view = this._viewHistory[this._curIndx]; |
|
this._map.setView(view.center, view.zoom); |
|
} |
|
}, |
|
|
|
_goFwd: function() { |
|
if (this._curIndx != this._viewHistory.length - 1) { |
|
this._map.off('moveend', this._updateHistory, this); |
|
this._map.once('moveend', function() {this._map.on('moveend', this._updateHistory, this);}, this); |
|
this._curIndx++; |
|
this._updateDisabled(); |
|
var view = this._viewHistory[this._curIndx]; |
|
this._map.setView(view.center, view.zoom); |
|
} |
|
}, |
|
|
|
_createButton: function(title, className, container, fn) { |
|
// Modified from Leaflet zoom control |
|
|
|
var link = L.DomUtil.create('a', className, container); |
|
link.href = '#'; |
|
link.title = title; |
|
|
|
L.DomEvent |
|
.on(link, 'mousedown dblclick', L.DomEvent.stopPropagation) |
|
.on(link, 'click', L.DomEvent.stop) |
|
.on(link, 'click', fn, this) |
|
.on(link, 'click', this._refocusOnMap, this); |
|
|
|
return link; |
|
}, |
|
|
|
_updateHistory: function() { |
|
var newView = {center: this._map.getCenter(), zoom: this._map.getZoom()}; |
|
var insertIndx = this._curIndx + 1; |
|
this._viewHistory.splice(insertIndx, this._viewHistory.length - insertIndx, newView); |
|
this._curIndx++; |
|
// Update disabled state of toolbar buttons |
|
this._updateDisabled(); |
|
}, |
|
|
|
_setFwdEnabled: function(enabled) { |
|
var leafletDisabled = 'leaflet-disabled'; |
|
var fwdDisabled = 'leaflet-control-navbar-fwd-disabled'; |
|
if (enabled === true) { |
|
L.DomUtil.removeClass(this._fwdButton, fwdDisabled); |
|
L.DomUtil.removeClass(this._fwdButton, leafletDisabled); |
|
}else { |
|
L.DomUtil.addClass(this._fwdButton, fwdDisabled); |
|
L.DomUtil.addClass(this._fwdButton, leafletDisabled); |
|
} |
|
}, |
|
|
|
_setBackEnabled: function(enabled) { |
|
var leafletDisabled = 'leaflet-disabled'; |
|
var backDisabled = 'leaflet-control-navbar-back-disabled'; |
|
if (enabled === true) { |
|
L.DomUtil.removeClass(this._backButton, backDisabled); |
|
L.DomUtil.removeClass(this._backButton, leafletDisabled); |
|
}else { |
|
L.DomUtil.addClass(this._backButton, backDisabled); |
|
L.DomUtil.addClass(this._backButton, leafletDisabled); |
|
} |
|
}, |
|
|
|
_updateDisabled: function() { |
|
if (this._curIndx == (this._viewHistory.length - 1)) { |
|
this._setFwdEnabled(false); |
|
}else { |
|
this._setFwdEnabled(true); |
|
} |
|
|
|
if (this._curIndx <= 0) { |
|
this._setBackEnabled(false); |
|
}else { |
|
this._setBackEnabled(true); |
|
} |
|
} |
|
|
|
}); |
|
|
|
L.control.navbar = function(options) { |
|
return new L.Control.NavBar(options); |
|
}; |
|
|
|
})();
|
|
|