maplair
Version:
JavaScript library for mobile-friendly interactive maps
50 lines (49 loc) • 1.89 kB
JavaScript
import { getWheelDelta, off, on, stop } from "../../dom/DomEvent.js";
import { Handler } from "../../core/Handler.js";
//#region src/map/handler/ScrollWheelZoomHandler.js
var ScrollWheelZoomHandler = class ScrollWheelZoomHandler extends Handler {
constructor(...args) {
super(...args);
this.callInitHooks(ScrollWheelZoomHandler);
}
addHooks() {
on(this._map._container, "wheel", this._onWheelScroll, this);
this._delta = 0;
}
removeHooks() {
off(this._map._container, "wheel", this._onWheelScroll, this);
clearTimeout(this._timer);
}
_onWheelScroll(e) {
const delta = getWheelDelta(e);
const debounce = this._map.options.wheelDebounceTime;
this._delta += delta;
this._lastMousePos = this._map.pointerEventToContainerPoint(e);
if (!this._startTime) this._startTime = Date.now();
const left = Math.max(debounce - (Date.now() - this._startTime), 0);
clearTimeout(this._timer);
this._timer = setTimeout(this._performZoom.bind(this), left);
stop(e);
}
_performZoom() {
const map = this._map, zoom = map.getZoom(), snap = this._map.options.zoomSnap ?? 0;
map._stop();
const d2 = this._delta / (this._map.options.wheelPxPerZoomLevel * 4), d3 = 4 * Math.log(2 / (1 + Math.exp(-Math.abs(d2)))) / Math.LN2, d4 = snap ? Math.ceil(d3 / snap) * snap : d3, delta = map._limitZoom(zoom + (this._delta > 0 ? d4 : -d4)) - zoom;
this._delta = 0;
this._startTime = null;
if (!delta) return;
if (map.options.scrollWheelZoom === "center") map.setZoom(zoom + delta);
else map.setZoomAround(this._lastMousePos, zoom + delta);
}
static register(MaplairMap) {
MaplairMap.mergeOptions({
scrollWheelZoom: true,
wheelDebounceTime: 40,
wheelPxPerZoomLevel: 60
});
MaplairMap.addInitHook("addHandler", "scrollWheelZoom", ScrollWheelZoomHandler);
}
};
//#endregion
export { ScrollWheelZoomHandler };
//# sourceMappingURL=ScrollWheelZoomHandler.js.map