147 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			147 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/**
 | 
						|
 * MapList is a list of maps with one active index.
 | 
						|
 * It contains some utility functions to change the map.
 | 
						|
 *
 | 
						|
 * @export
 | 
						|
 * @class MapList
 | 
						|
 */
 | 
						|
export class MapList {
 | 
						|
    constructor(active = null, maps = {}) {
 | 
						|
        this._maps = maps
 | 
						|
        this._active = active
 | 
						|
 | 
						|
        if (Object.keys(maps).length > 0) this.select(active)
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Selects a map from the map list.
 | 
						|
     *
 | 
						|
     * @public
 | 
						|
     * @param {string} active - Name of the map to select.
 | 
						|
     * @returns {Map} - Returns the active map. Returns null if no map was added to the MapList.
 | 
						|
     * @memberof MapList
 | 
						|
     */
 | 
						|
    select(active) {
 | 
						|
        let map = null
 | 
						|
 | 
						|
        if (active !== this.active) {
 | 
						|
            let keys = Object.keys(this.maps)
 | 
						|
            if (keys.length > 0) {
 | 
						|
                if (this.maps[active] == null) {
 | 
						|
                    let altActive = keys[0]
 | 
						|
                    console.warn(
 | 
						|
                        `The MapList does not contain the provided active key '${active}'. Used '${altActive}' as fallback.`
 | 
						|
                    )
 | 
						|
 | 
						|
                    active = altActive
 | 
						|
                }
 | 
						|
 | 
						|
                if (this.active !== active) {
 | 
						|
                    this._active = active
 | 
						|
                    map = this.maps[active]
 | 
						|
                }
 | 
						|
            } else {
 | 
						|
                console.error(`Could not provide a fallback map! The map object is empty.`)
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        return map
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Clones the entire maplist.
 | 
						|
     *
 | 
						|
     * @public
 | 
						|
     * @returns {MapList} - Returns a cloned instance of this map list.
 | 
						|
     * @memberof MapList
 | 
						|
     */
 | 
						|
    clone() {
 | 
						|
        let maps = {}
 | 
						|
 | 
						|
        for (let name of Object.keys(this.maps)) {
 | 
						|
            maps[name] = this.maps[name].clone()
 | 
						|
        }
 | 
						|
 | 
						|
        return new MapList(this.active, maps)
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Adds a new map to the map list.
 | 
						|
     *
 | 
						|
     * @public
 | 
						|
     * @param {string} key - Key to identify the map.
 | 
						|
     * @param {GeoMap} map - The GeoMap to add.
 | 
						|
     * @memberof MapList
 | 
						|
     */
 | 
						|
    add(key, map) {
 | 
						|
        if (this.maps[key] != null) consol.warn('Key already in mapList. The existing key was overwritten.')
 | 
						|
        if (this.active == null) this._active = key
 | 
						|
        map.name = key
 | 
						|
        this.maps[key] = map
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Returns the the active map.
 | 
						|
     * If none is set, it returns null.
 | 
						|
     *
 | 
						|
     *@public
 | 
						|
     * @readonly
 | 
						|
     * @member {GeoMap}
 | 
						|
     * @memberof MapList
 | 
						|
     */
 | 
						|
    get map() {
 | 
						|
        return this.maps && this.maps[this.active] ? this.maps[this.active] : null
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Returns the list of addedd cards.
 | 
						|
     *
 | 
						|
     * @member {object}
 | 
						|
     * @readonly
 | 
						|
     * @memberof MapList
 | 
						|
     */
 | 
						|
    get maps() {
 | 
						|
        return this._maps
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     *  Returns the active key.
 | 
						|
     *
 | 
						|
     * @member {string}
 | 
						|
     * @readonly
 | 
						|
     * @memberof MapList
 | 
						|
     */
 | 
						|
    get active() {
 | 
						|
        return this._active
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Selects the next map in the map array.
 | 
						|
     *
 | 
						|
     * @public
 | 
						|
     * @returns {GeoMap} - Returns the next map in the list.
 | 
						|
     * @memberof MapList
 | 
						|
     */
 | 
						|
    next() {
 | 
						|
        let keys = Object.keys(this.maps)
 | 
						|
        let idx = keys.indexOf(this.active)
 | 
						|
 | 
						|
        let next = idx + 1 < keys.length ? keys[idx + 1] : keys[0]
 | 
						|
        return next
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Removes all maps from the maplist.
 | 
						|
     * And cleans up all maps.
 | 
						|
     *
 | 
						|
     * @public
 | 
						|
     * @memberof MapList
 | 
						|
     */
 | 
						|
    cleanup() {
 | 
						|
        for (let key in this.maps) {
 | 
						|
            let map = this.maps[key]
 | 
						|
            map.remove()
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |