ol-ext
Version:
A set of cool extensions for OpenLayers (ol) in node modules structure
118 lines (107 loc) • 4.83 kB
JavaScript
/* Copyright (c) 2015 Jean-Marc VIGLINO,
released under the CeCILL-B license (French BSD license)
(http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt).
*/
import ol_ext_element from '../util/element.js'
import ol_control_LayerSwitcher from '../control/LayerSwitcher.js'
/** LayerShop a layer switcher with special controls to handle operation on layers.
* @fires select
* @fires drawlist
* @fires toggle
* @fires reorder-start
* @fires reorder-end
* @fires layer:visible
* @fires layer:opacity
*
* @constructor
* @extends {ol_control_LayerSwitcher}
* @param {Object=} options
* @param {boolean} options.selection enable layer selection when click on the title
* @param {function} options.displayInLayerSwitcher function that takes a layer and return a boolean if the layer is displayed in the switcher, default test the displayInLayerSwitcher layer attribute
* @param {boolean} options.show_progress show a progress bar on tile layers, default false
* @param {boolean} options.mouseover show the panel on mouseover, default false
* @param {boolean} options.reordering allow layer reordering, default true
* @param {boolean} options.trash add a trash button to delete the layer, default false
* @param {function} options.oninfo callback on click on info button, if none no info button is shown DEPRECATED: use on(info) instead
* @param {boolean} options.extent add an extent button to zoom to the extent of the layer
* @param {function} options.onextent callback when click on extent, default fits view to extent
* @param {number} options.drawDelay delay in ms to redraw the layer (usefull to prevent flickering when manipulating the layers)
* @param {boolean} options.collapsed collapse the layerswitcher at beginning, default true
* @param {ol.layer.Group} options.layerGroup a layer group to display in the switcher, default display all layers of the map
* @param {boolean} options.noScroll prevent handle scrolling, default false
*
* Layers attributes that control the switcher
* - allwaysOnTop {boolean} true to force layer stay on top of the others while reordering, default false
* - displayInLayerSwitcher {boolean} display the layer in switcher, default true
* - noSwitcherDelete {boolean} to prevent layer deletion (w. trash option = true), default false
*/
var ol_control_LayerShop = class olcontrolLayerShop extends ol_control_LayerSwitcher {
constructor(options) {
options = options || {};
options.selection = true;
options.noScroll = true;
super(options);
this.element.classList.add('ol-layer-shop');
// Control title (selected layer)
var title = this.element.insertBefore(ol_ext_element.create('DIV', { className: 'ol-title-bar' }), this.getPanel());
this.on('select', function (e) {
title.innerText = e.layer ? e.layer.get('title') : '';
this.element.setAttribute('data-layerClass', this.getLayerClass(e.layer));
}.bind(this));
// Top/bottom bar
this._topbar = this.element.insertBefore(ol_ext_element.create('DIV', {
className: 'ol-bar ol-top-bar'
}), this.getPanel());
this._bottombar = ol_ext_element.create('DIV', {
className: 'ol-bar ol-bottom-bar',
parent: this.element
});
this._controls = [];
}
/** Set the map instance the control is associated with.
* @param {_ol_Map_} map The map instance.
*/
setMap(map) {
if (this.getMap()) {
// Remove map controls
this._controls.forEach(function (c) {
this.getMap().removeControl(c);
}.bind(this));
}
super.setMap(map);
if (map) {
// Select first layer
this.selectLayer();
// Remove a layer
this._listener.removeLayer = map.getLayers().on('remove', function (e) {
// Select first layer
if (e.element === this.getSelection()) {
this.selectLayer();
}
}.bind(this));
// Add controls
this._controls.forEach(function (c) {
this.getMap().addControl(c);
}.bind(this));
}
}
/** Get the bar element (to add new element in it)
* @param {string} [position='top'] bar position bottom or top, default top
* @returns {Element}
*/
getBarElement(position) {
return position === 'bottom' ? this._bottombar : this._topbar;
}
/** Add a control to the panel
* @param {ol_control_Control} control
* @param {string} [position='top'] bar position bottom or top, default top
*/
addControl(control, position) {
this._controls.push(control);
control.setTarget(position === 'bottom' ? this._bottombar : this._topbar);
if (this.getMap()) {
this.getMap().addControl(control);
}
}
}
export default ol_control_LayerShop