@web-map-service/map2d-app
Version:
基于openlayer的2D地图应用
79 lines (70 loc) • 1.86 kB
text/typescript
import { App, Plugin } from '../types'
import { Element } from '../elements/types'
import { getElementBySElement } from '../elements'
import { Element as SElement, createSelectInteractive } from '@web-map-service/map2d'
function makeTool(app: App) {
const { interactiveManager, emitter } = app.map
const sSelect = createSelectInteractive(interactiveManager)
let elements: Element[] = []
function selectElement(sElements: SElement[]) {
const list = Array.isArray(sElements) ? sElements : []
elements = []
for (const sElement of list) {
const element = getElementBySElement(app, sElement)
if (!element) continue
elements.push(element)
}
app.emitter.emit('element:select', elements)
}
const tool = {
enabled: false,
enable() {
if (tool.enabled) return
tool.enabled = true
sSelect.enable()
emitter.on('element:select', selectElement)
},
add(element: Element){
sSelect.add(element.getSElement())
},
remove(element: Element) {
sSelect.remove(element.getSElement())
},
getSelected() {
return elements
},
clean() {
sSelect.clean()
},
close() {
if (!tool.enabled) return
tool.enabled = false
sSelect.clean()
emitter.remove('element:select', selectElement)
sSelect.close()
}
}
return tool
}
export function createPlugin() {
let app: App
const plugin: Plugin = {
type: 'select',
install(_app: App) {
app = _app
app.tools.select = makeTool(app)
return app
}
}
return plugin
}
declare module './tool' {
interface Tools {
select: ReturnType<typeof makeTool>
}
}
declare module '../types' {
interface AppEmitterEvent {
'element:select': any
}
}