118 lines
4.6 KiB
JavaScript
118 lines
4.6 KiB
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
|