import * as maptalks from '../../libs/maptalks'
import * as controls from '../../ext/control'
class EasyControl {
/**
* 控件组合类
* @constructor
* @param {Array<Object>} controlOptions 控件配置项
* @param {Object} options 配置项
*/
constructor(controlOptions, options = {}) {
this.origin_controls = ['Zoom', 'Scale', 'Panel', 'Toolbar', 'Overview', 'Attribution', 'LayerSwitcher']
this.custom_controls = ['PositionControl', 'FullscreenControl']
this.controls = {}
const items = []
controlOptions && controlOptions.forEach(e => {
if (this.origin_controls.includes(e.type)) {
this.controls[e.id] = new maptalks.control[e.type](e.option)
} else if (this.custom_controls.includes(e.type)) {
this.controls[e.id] = new controls[e.type](e.option)
}
items.push({
item: e.label,
click: () => {
this.controls[e.id].isVisible() ? this.controls[e.id].hide() : this.controls[e.id].show()
}
})
})
this.options = {
position: options.position === undefined ? 'top-left' : options.position,
items: [{
item: options.menuName === undefined ? '控件管理' : options.menuName,
children: items
}]
}
this.toolbar = new maptalks.control.Toolbar(this.options)
}
/**
* 添加到地图
* @param {EasyMap} easyMap 地图对象
* @returns {EasyControl}
*/
addTo(easyMap) {
for (let value of Object.values(this.controls)) {
value.addTo(easyMap.map)
}
this.toolbar.addTo(easyMap.map)
return this
}
/**
* 事件绑定
* @param {String} id 控件id
* @param {String} eventsOn 要注册的事件类型
* @param {*} handler 要调用的处理函数
* @param {*} context 处理程序的上下文
* @returns {any} 返回handler用于事件移除
*/
on(id, eventsOn, handler, context = null) {
this.controls[id].on(eventsOn, handler, context)
return handler
}
/**
* 事件绑定,别名
* @param {String} id 控件id
* @param {String} eventsOn 要注册的事件类型
* @param {*} handler 要调用的处理函数
* @param {*} context 处理程序的上下文
* @returns {*} 返回handler用于事件移除
*/
addMapEventListener(id, eventsOn, handler, context = null) {
this.controls[id].on(eventsOn, handler, context)
return handler
}
/**
* 单次事件绑定,调用一次后移除
* @param {String} id 控件id
* @param {String} eventTypes 要注册的事件类型
* @param {*} handler 要调用的处理函数
* @param {*} context 处理程序的上下文
*/
once(id, eventTypes, handler, context = null) {
this.controls[id].once(eventTypes, handler, context)
}
/**
* 单次事件绑定,调用一次后移除,别名
* @param {String} id 控件id
* @param {String} eventTypes 要注册的事件类型
* @param {*} handler 要调用的处理函数
* @param {*} context 处理程序的上下文
*/
addMapEventListenerOnce(id, eventTypes, handler, context = null) {
this.controls[id].once(eventTypes, handler, context)
}
/**
* 事件移除
* @param {String} id 控件id
* @param {String} eventsOff 要移除的事件类型
* @param {*} handler 要调用的处理函数
* @param {*} context 处理程序的上下文
*/
un(id, eventsOff, handler, context = null) {
this.controls[id].off(eventsOff, handler, context)
}
/**
* 事件移除,别名
* @param {String} id 控件id
* @param {String} eventsOff 要移除的事件类型
* @param {*} handler 要调用的处理函数
* @param {*} context 处理程序的上下文
*/
removeMapEventListener(id, eventsOff, handler, context = null) {
this.controls[id].removeEventListener(eventsOff, handler, context)
}
/**
* 显示控件
* @param {String|Array<String>} ids 控件id,不传表示全部
*/
show(ids = null) {
if (ids === null) {
for (const control of Object.values(this.controls)) {
control.show()
}
} else {
if (!Array.isArray(ids)) {
ids = [ids]
}
ids.forEach(e => {
this.controls[e].show()
})
}
}
/**
* 隐藏控件
* @param {String|Array<String>} ids 控件id,不传表示全部
*/
hide(ids = null) {
if (ids === null) {
for (const control of Object.values(this.controls)) {
control.hide()
}
} else {
if (!Array.isArray(ids)) {
ids = [ids]
}
ids.forEach(e => {
this.controls[e].hide()
})
}
}
/**
*地图全屏
*
* @param {*} map
* @memberof EasyControl
*/
requestFullScreen(map){
map.map.requestFullScreen()
}
/**
*地图取消全屏
*
* @param {*} map
* @memberof EasyControl
*/
cancelFullScreen(map){
map.map.cancelFullScreen()
}
}
export default EasyControl