UNPKG

maplair

Version:

JavaScript library for mobile-friendly interactive maps

77 lines (76 loc) • 3.1 kB
import { Point } from "../../geometry/Point.js"; import { getPosition, setPosition } from "../../dom/DomUtil.js"; import { Handler } from "../../core/Handler.js"; import { Draggable } from "../../dom/Draggable.js"; import { Bounds } from "../../geometry/Bounds.js"; //#region src/layer/marker/Marker.Drag.js var MarkerDrag = class MarkerDrag extends Handler { constructor(marker) { super(marker._map); this._marker = marker; this.callInitHooks(MarkerDrag); } addHooks() { const icon = this._marker._icon; if (!this._draggable) this._draggable = new Draggable(icon, icon, true); this._draggable.on({ dragstart: this._onDragStart, predrag: this._onPreDrag, drag: this._onDrag, dragend: this._onDragEnd }, this).enable(); icon.classList.add("maplair-marker-draggable"); } removeHooks() { this._draggable.off({ dragstart: this._onDragStart, predrag: this._onPreDrag, drag: this._onDrag, dragend: this._onDragEnd }, this).disable(); this._marker._icon?.classList.remove("maplair-marker-draggable"); } moved() { return this._draggable?._moved; } _adjustPan(e) { const marker = this._marker, map = marker._map, speed = this._marker.options.autoPanSpeed, padding = this._marker.options.autoPanPadding, iconPos = getPosition(marker._icon), bounds = map.getPixelBounds(), origin = map.getPixelOrigin(); const panBounds = new Bounds(bounds.min._subtract(origin).add(padding), bounds.max._subtract(origin).subtract(padding)); if (!panBounds.contains(iconPos)) { const movement = new Point((Math.max(panBounds.max.x, iconPos.x) - panBounds.max.x) / (bounds.max.x - panBounds.max.x) - (Math.min(panBounds.min.x, iconPos.x) - panBounds.min.x) / (bounds.min.x - panBounds.min.x), (Math.max(panBounds.max.y, iconPos.y) - panBounds.max.y) / (bounds.max.y - panBounds.max.y) - (Math.min(panBounds.min.y, iconPos.y) - panBounds.min.y) / (bounds.min.y - panBounds.min.y)).multiplyBy(speed); map.panBy(movement, { animate: false }); this._draggable._newPos._add(movement); this._draggable._startPos._add(movement); setPosition(marker._icon, this._draggable._newPos); this._onDrag(e); this._panRequest = requestAnimationFrame(this._adjustPan.bind(this, e)); } } _onDragStart() { this._oldLatLng = this._marker.getLatLng(); this._marker.closePopup?.(); this._marker.fire("movestart").fire("dragstart"); } _onPreDrag(e) { if (this._marker.options.autoPan) { cancelAnimationFrame(this._panRequest); this._panRequest = requestAnimationFrame(this._adjustPan.bind(this, e)); } } _onDrag(e) { const marker = this._marker, shadow = marker._shadow, iconPos = getPosition(marker._icon), latlng = marker._map.layerPointToLatLng(iconPos); if (shadow) setPosition(shadow, iconPos); marker._latlng = latlng; e.latlng = latlng; e.oldLatLng = this._oldLatLng; marker.fire("move", e).fire("drag", e); } _onDragEnd(e) { cancelAnimationFrame(this._panRequest); delete this._oldLatLng; this._marker.fire("moveend").fire("dragend", e); } }; //#endregion export { MarkerDrag }; //# sourceMappingURL=Marker.Drag.js.map