UNPKG

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
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