leaflet-polydraw
Version:
Advanced Leaflet plugin for freehand polygon drawing, with smart merging and powerful editing tools. Compatible with both Leaflet v1.x and v2.x.
244 lines • 9.27 kB
TypeScript
import * as L from 'leaflet';
import { TurfHelper } from '../turf-helper';
import { PolygonInformationService } from '../polygon-information.service';
import type { Feature, Polygon, MultiPolygon } from 'geojson';
import type { PolydrawConfig, PolydrawPolygon, HistoryAction } from '../types/polydraw-interfaces';
import { ModeManager } from './mode-manager';
import { EventManager } from './event-manager';
import type { LayerManager } from './layer-manager';
export interface InteractionResult {
success: boolean;
featureGroups?: L.FeatureGroup[];
error?: string;
}
export interface PolygonInteractionManagerDependencies {
turfHelper: TurfHelper;
polygonInformation: PolygonInformationService;
map: L.Map;
config: PolydrawConfig;
modeManager: ModeManager;
eventManager: EventManager;
saveHistoryState?: (action: HistoryAction) => void;
layerManager?: LayerManager;
}
/**
* PolygonInteractionManager handles all interactions with existing polygons.
* This includes dragging polygons, dragging markers, edge interactions, and popup menus.
*/
export declare class PolygonInteractionManager {
private markerFeatureGroupMap;
private polygonFeatureGroupMap;
private markerModifierHandlers;
private markerTouchListeners;
private markerEdgeDeletionListeners;
private _activeMarker;
private isDraggingMarker;
private turfHelper;
private polygonInformation;
private map;
private config;
private modeManager;
private eventManager;
private saveHistoryState?;
private layerManager?;
private currentDragPolygon;
private currentDragIsClone;
private currentModifierDragMode;
private isModifierKeyHeld;
private currentCloneGhost;
private dragCancelHandlersAttached;
private _boundDragTouchMove;
private _boundDragTouchEnd;
private _boundDragMoveListener;
private _boundDragEndListener;
private dragUsesPointerEvents;
private polygonTouchStartListeners;
private polygonNativeStartListeners;
private _openMenuPopup;
private transformModeActive;
private transformControllers;
private transformAuxiliaryDisplayValues;
private deleteMarkerSuppressUntil;
private readonly onModeChange;
/**
* Strongly typed helper to emit polygon updated events without casts.
* Also saves history state before emitting (except for drag operations which save on dragstart).
*/
private emitPolygonUpdated;
private getHistoryActionForOperation;
/**
* True when the polygon in the feature group already has holes, or is a MultiPolygon
* with more than one outer ring (donut mode only supports simple single-ring polygons).
*/
private donutTargetHasHoles;
/**
* Commit handler for donut mode. Decides inward vs outward via containment, assembles a
* polygon-with-hole, and emits the updated event. On partial overlap / degenerate scale
* the polygon is restored unchanged.
*/
private handleDonutCommit;
private getFeatureGroups;
private removeFeatureGroup;
constructor(dependencies: PolygonInteractionManagerDependencies, featureGroupAccess: {
getFeatureGroups: () => L.FeatureGroup[];
addFeatureGroup: (fg: L.FeatureGroup) => void;
removeFeatureGroup: (fg: L.FeatureGroup) => void;
});
dispose(): void;
private getTimestamp;
private shouldSuppressDeleteMarkerClick;
suppressDeleteMarkerClicks(durationMs: number): void;
/**
* Add markers to a polygon feature group
*/
addMarkers(latlngs: L.LatLngLiteral[], featureGroup: L.FeatureGroup, options?: {
optimizationLevel?: number;
originalOptimizationLevel?: number;
}): void;
/**
* Add hole markers to a polygon feature group, with configurable special markers.
*/
addHoleMarkers(latlngs: L.LatLngLiteral[], featureGroup: L.FeatureGroup): void;
/**
* Add edge click listeners to a polygon
*/
addEdgeClickListeners(polygon: L.Polygon, featureGroup: L.FeatureGroup): void;
/**
* Check whether polygon dragging is allowed for the current mode.
*/
private isPolygonDragModeActive;
private isPolygonDragActive;
/**
* Check if a polygon belongs to the active layer.
* Returns true if no layer manager exists (backward compat) or if in active editable layer.
*/
private isPolygonInActiveLayer;
/**
* Check if a feature group belongs to the active layer.
* Returns true if no layer manager exists (backward compat).
*/
private isFeatureGroupInActiveLayer;
private beginPolygonDrag;
private attachPolygonNativeStartListeners;
/**
* Enable polygon dragging functionality
*/
enablePolygonDragging(polygon: PolydrawPolygon, latlngs: Feature<Polygon | MultiPolygon>): void;
/**
* Update marker draggable state based on current mode
*/
updateMarkerDraggableState(): void;
/**
* Update all markers for edge deletion visual feedback
*/
updateAllMarkersForEdgeDeletion(showFeedback: boolean): void;
/**
* Update individual marker for edge deletion visual feedback
*/
updateMarkerForEdgeDeletion(marker: L.Marker, showFeedback: boolean): void;
/**
* Set modifier key held state
*/
setModifierKeyHeld(isHeld: boolean): void;
/**
* Clean up all resources associated with a marker
* This method ensures proper cleanup of event listeners and WeakMap entries
*/
cleanupMarker(marker: L.Marker): void;
/**
* Clean up all resources associated with a feature group
* This method ensures proper cleanup of all markers and associated resources
*/
cleanupFeatureGroup(featureGroup: L.FeatureGroup): void;
private destroyTransformController;
private onEdgeClick;
private highlightEdgeOnHover;
private deriveImportantMarkerIndices;
private normalizeMarkerIndex;
private latLngEquals;
private isLatLngLiteral;
private getOrderedMarkers;
private countLatLngNodes;
private rebuildLatLngStructure;
private getOptimizationMetadataFromFeatureGroup;
private getFeatureMetadataState;
private getOptimizationMetadataFromPolygonLayer;
private getDistanceMeters;
private findClosestVertexIndex;
private getToleranceForOptimizationLevel;
private elbowClicked;
private markerDrag;
private markerDragEnd;
private onPolygonMouseMove;
private onPolygonMouseUp;
private onPolygonDragCancel;
private onPolygonDragKeyDown;
private onDragTouchMove;
private onDragTouchEnd;
private readonly onDragDocumentMove;
private readonly onDragDocumentEnd;
private attachDragDocumentListeners;
private detachDragDocumentListeners;
private attachDragTouchListeners;
private detachDragTouchListeners;
private detachPolygonTouchStart;
private detachPolygonNativeStartListeners;
private attachDragCancelHandlers;
private detachDragCancelHandlers;
private cancelActivePolygonDrag;
private offsetPolygonCoordinates;
private updateMarkersAndHoleLinesDuringDrag;
private updatePolygonAfterDrag;
private updatePolygonAfterCloneDrag;
private showCloneGhost;
private clearCloneGhost;
private createPolygonFeatureFromLatLngs;
private getDragSubtractModifierKey;
private detectDragSubtractModifierKey;
private setSubtractVisualMode;
private updateMarkerColorsForSubtractMode;
private handleModifierToggleDuringDrag;
private isModifierDragActive;
private performModifierSubtract;
private getEdgeDeletionModifierKey;
private isEdgeDeletionModifierKeyPressed;
private registerPolygonLayerMappings;
private findFeatureGroupForPolygon;
private onMarkerHoverForEdgeDeletion;
private onMarkerHoverForEdgeDeletionEvent;
private onMarkerLeaveForEdgeDeletionEvent;
private getMarkerIndex;
private ensureMarkerSeparation;
private findAlternativeMarkerPosition;
private createDivIcon;
private getLatLngInfoString;
private setMarkerVisibility;
private setTransformAuxiliaryVisibility;
private isPolydrawAuxiliaryPolyline;
private getBuiltInMenuButtonConfigs;
private getBuiltInMenuButtons;
private getVisualOptimizationToggleButton;
private getPolygonMenuActionButtons;
private shouldShowPolygonMenuActionButton;
private getPolygonMenuActionClassNames;
private closeOpenMenuPopup;
private attachMenuPopupCloseHandler;
private emitBuiltInPolygonMenuAction;
private attachBuiltInMenuActionHandler;
private attachTransformHandler;
private attachOptimizationToggleHandler;
private attachCustomPolygonMenuActionHandler;
private attachMenuButtonHandler;
private startPolygonTransform;
private handleTransformControllerResult;
private getPolygonLayer;
private attachMenuButtonHandlers;
private enableMenuButtonPointerEvents;
private generateMenuMarkerPopup;
private getMenuActionContext;
private toggleOptimizationVisibility;
private getPolygonGeoJSONFromFeatureGroup;
private getTotalPolygonPerimeter;
private generateInfoMarkerPopup;
}
//# sourceMappingURL=polygon-interaction-manager.d.ts.map