You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
151 lines
6.2 KiB
151 lines
6.2 KiB
L.Control.Slider = L.Control.extend({ |
|
update: function(value){ |
|
return value; |
|
}, |
|
|
|
options: { |
|
size: '250px', |
|
position: 'topright', |
|
min: 0, |
|
max: 250, |
|
step: 1, |
|
id: "slider", |
|
value: 50, |
|
collapsed: true, |
|
title: 'Leaflet Slider', |
|
logo: 'S', |
|
orientation: 'horizontal', |
|
increment: false, |
|
getValue: function(value) { |
|
return value; |
|
}, |
|
showValue: true, |
|
syncSlider: false |
|
}, |
|
initialize: function (f, options) { |
|
L.setOptions(this, options); |
|
if (typeof f == "function") { |
|
this.update = f; |
|
} else { |
|
this.update = function (value) { |
|
console.log(value); |
|
}; |
|
} |
|
if (typeof this.options.getValue != "function") { |
|
this.options.getValue = function (value) { |
|
return value; |
|
}; |
|
} |
|
if (this.options.orientation!='vertical') { |
|
this.options.orientation = 'horizontal'; |
|
} |
|
}, |
|
onAdd: function (map) { |
|
this._initLayout(); |
|
this.update(this.options.value+""); |
|
return this._container; |
|
}, |
|
_updateValue: function () { |
|
this.value = this.slider.value; |
|
if (this.options.showValue){ |
|
this._sliderValue.innerHTML = this.options.getValue(this.value); |
|
} |
|
this.update(this.value); |
|
}, |
|
_initLayout: function () { |
|
var className = 'leaflet-control-slider'; |
|
this._container = L.DomUtil.create('div', className + ' ' +className + '-' + this.options.orientation); |
|
this._sliderLink = L.DomUtil.create('a', className + '-toggle', this._container); |
|
this._sliderLink.setAttribute("title", this.options.title); |
|
this._sliderLink.innerHTML = this.options.logo; |
|
|
|
if (this.options.showValue){ |
|
this._sliderValue = L.DomUtil.create('p', className+'-value', this._container); |
|
this._sliderValue.innerHTML = this.options.getValue(this.options.value); |
|
} |
|
|
|
if(this.options.increment) { |
|
this._plus = L.DomUtil.create('a', className + '-plus', this._container); |
|
this._plus.innerHTML = "+"; |
|
L.DomEvent.on(this._plus, 'click', this._increment, this); |
|
L.DomUtil.addClass(this._container, 'leaflet-control-slider-incdec'); |
|
} |
|
|
|
this._sliderContainer = L.DomUtil.create('div', 'leaflet-slider-container', this._container); |
|
this.slider = L.DomUtil.create('input', 'leaflet-slider', this._sliderContainer); |
|
if (this.options.orientation == 'vertical') {this.slider.setAttribute("orient", "vertical");} |
|
this.slider.setAttribute("title", this.options.title); |
|
this.slider.setAttribute("id", this.options.id); |
|
this.slider.setAttribute("type", "range"); |
|
this.slider.setAttribute("min", this.options.min); |
|
this.slider.setAttribute("max", this.options.max); |
|
this.slider.setAttribute("step", this.options.step); |
|
this.slider.setAttribute("value", this.options.value); |
|
if (this.options.syncSlider) { |
|
L.DomEvent.on(this.slider, "input", function (e) { |
|
this._updateValue(); |
|
}, this); |
|
} else { |
|
L.DomEvent.on(this.slider, "change", function (e) { |
|
this._updateValue(); |
|
}, this); |
|
} |
|
|
|
if(this.options.increment) { |
|
this._minus = L.DomUtil.create('a', className + '-minus', this._container); |
|
this._minus.innerHTML = "-"; |
|
L.DomEvent.on(this._minus, 'click', this._decrement, this); |
|
} |
|
|
|
if (this.options.showValue){ |
|
if (window.matchMedia("screen and (-webkit-min-device-pixel-ratio:0)").matches && this.options.orientation =='vertical') {this.slider.style.width = (this.options.size.replace('px','') -36) +'px'; this._sliderContainer.style.height = (this.options.size.replace('px','') -36) +'px';} |
|
else if (this.options.orientation =='vertical') {this._sliderContainer.style.height = (this.options.size.replace('px','') -36) +'px';} |
|
else {this._sliderContainer.style.width = (this.options.size.replace('px','') -56) +'px';} |
|
} else { |
|
if (window.matchMedia("screen and (-webkit-min-device-pixel-ratio:0)").matches && this.options.orientation =='vertical') {this.slider.style.width = (this.options.size.replace('px','') -10) +'px'; this._sliderContainer.style.height = (this.options.size.replace('px','') -10) +'px';} |
|
else if (this.options.orientation =='vertical') {this._sliderContainer.style.height = (this.options.size.replace('px','') -10) +'px';} |
|
else {this._sliderContainer.style.width = (this.options.size.replace('px','') -25) +'px';} |
|
} |
|
|
|
L.DomEvent.disableClickPropagation(this._container); |
|
|
|
if (this.options.collapsed) { |
|
if (!L.Browser.android) { |
|
L.DomEvent |
|
.on(this._container, 'mouseenter', this._expand, this) |
|
.on(this._container, 'mouseleave', this._collapse, this); |
|
} |
|
|
|
if (L.Browser.touch) { |
|
L.DomEvent |
|
.on(this._sliderLink, 'click', L.DomEvent.stop) |
|
.on(this._sliderLink, 'click', this._expand, this); |
|
} else { |
|
L.DomEvent.on(this._sliderLink, 'focus', this._expand, this); |
|
} |
|
} else { |
|
this._expand(); |
|
} |
|
}, |
|
_expand: function () { |
|
L.DomUtil.addClass(this._container, 'leaflet-control-slider-expanded'); |
|
}, |
|
_collapse: function () { |
|
L.DomUtil.removeClass(this._container, 'leaflet-control-slider-expanded'); |
|
}, |
|
_increment: function () { |
|
console.log(this.slider.value-this.slider.step + " " + this.slider.value+this.slider.step); |
|
this.slider.value = this.slider.value*1+this.slider.step*1; |
|
this._updateValue(); |
|
}, |
|
_decrement: function () { |
|
console.log(this.slider.value-this.slider.step + " " + this.slider.value+this.slider.step); |
|
this.slider.value = this.slider.value*1-this.slider.step*1; |
|
this._updateValue(); |
|
} |
|
|
|
|
|
}); |
|
L.control.slider = function (f, options) { |
|
return new L.Control.Slider(f, options); |
|
};
|
|
|