UNPKG

maplair

Version:

JavaScript library for mobile-friendly interactive maps

50 lines (49 loc) • 1.89 kB
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