maplair
Version:
JavaScript library for mobile-friendly interactive maps
77 lines (76 loc) • 3.1 kB
JavaScript
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