|
|
|
@ -13,9 +13,9 @@ import {
|
|
|
|
|
} from "./editors"; |
|
|
|
|
|
|
|
|
|
import { registerHotkey } from "../utils/hotkeys"; |
|
|
|
|
import { PolygonOptions, PolylineOptions } from "./constants"; |
|
|
|
|
import { PolygonOptions, PolylineOptions, SelectedOptions } from "./constants"; |
|
|
|
|
|
|
|
|
|
import { EventTypes, OverlayTypes } from "../types/enum"; |
|
|
|
|
import { Command, EventTypes, OverlayTypes } from "../types/enum"; |
|
|
|
|
|
|
|
|
|
let uuid = 0; |
|
|
|
|
const getUuid = () => ++uuid; |
|
|
|
@ -26,11 +26,16 @@ type AMapOverlayEditor =
|
|
|
|
|
| AMap.PolylineEditor |
|
|
|
|
| AMap.CircleEditor; |
|
|
|
|
|
|
|
|
|
type OverlayTemp = { |
|
|
|
|
type: OverlayTypes; |
|
|
|
|
target: AMap.MapOverlay; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
export class MapEditor extends Emitter { |
|
|
|
|
dom: HTMLDivElement; |
|
|
|
|
private _map: AMap.Map | undefined; |
|
|
|
|
private overlayEditors: BaseOverlayEditor<AMapOverlayEditor>[] = []; |
|
|
|
|
private overlayMap: Record<number, AMap.MapOverlay> = {}; |
|
|
|
|
private overlayMap: Record<string, OverlayTemp> = {}; |
|
|
|
|
private _currentOverlayEditor: |
|
|
|
|
| BaseOverlayEditor<AMapOverlayEditor> |
|
|
|
|
| undefined; |
|
|
|
@ -63,23 +68,40 @@ export class MapEditor extends Emitter {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
update(mapState: IMapState) { |
|
|
|
|
const { status, overlayType } = mapState; |
|
|
|
|
if (status === "createOverlay") { |
|
|
|
|
this.finishCreateOverlay(); |
|
|
|
|
this._currentOverlayEditor = this.overlayEditors.find( |
|
|
|
|
(editor) => editor.getType() === overlayType |
|
|
|
|
); |
|
|
|
|
this._currentOverlayEditor?.create(); |
|
|
|
|
const { command } = mapState; |
|
|
|
|
switch (command) { |
|
|
|
|
case Command.CreateOverlay: |
|
|
|
|
this._createOverlay(mapState); |
|
|
|
|
break; |
|
|
|
|
case Command.SelectOverlay: |
|
|
|
|
this._selectOverlays(mapState.selectedIds); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
_createOverlay(mapState: IMapState) { |
|
|
|
|
const { overlayType } = mapState; |
|
|
|
|
this.finishCreateOverlay(); |
|
|
|
|
this._currentOverlayEditor = this.overlayEditors.find( |
|
|
|
|
(editor) => editor.getType() === overlayType |
|
|
|
|
); |
|
|
|
|
this._currentOverlayEditor?.create(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
_selectOverlays(ids?: string[]) { |
|
|
|
|
if (!ids?.length) return; |
|
|
|
|
ids.forEach((id) => { |
|
|
|
|
const { target } = this.overlayMap[id]; |
|
|
|
|
target.setOptions(SelectedOptions); |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
finishCreateOverlay() { |
|
|
|
|
if (this._currentOverlayEditor == null) return; |
|
|
|
|
const target = this._currentOverlayEditor.finish(); |
|
|
|
|
if (target == null) return; |
|
|
|
|
const id = getUuid(); |
|
|
|
|
const type = this._currentOverlayEditor.getType(); |
|
|
|
|
this.overlayMap[id] = target; |
|
|
|
|
this.overlayMap[id] = { type, target }; |
|
|
|
|
const evt: any = { id, type }; |
|
|
|
|
if (type === OverlayTypes.Circle) { |
|
|
|
|
const circle = target as AMap.Circle; |
|
|
|
|