Source: ext/control/EasyControl.js

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