mirror of
https://github.com/FoggedLens/iD.git
synced 2026-02-13 17:23:02 +00:00
168 lines
5.6 KiB
JavaScript
168 lines
5.6 KiB
JavaScript
import _debounce from 'lodash-es/debounce';
|
|
|
|
import { t } from '../../core/localizer';
|
|
|
|
|
|
export function uiPanelBackground(context) {
|
|
var background = context.background();
|
|
var _currSourceName = null;
|
|
var _metadata = {};
|
|
var _metadataKeys = [
|
|
'zoom', 'vintage', 'source', 'description', 'resolution', 'accuracy'
|
|
];
|
|
|
|
var debouncedRedraw = _debounce(redraw, 250);
|
|
|
|
function redraw(selection) {
|
|
var source = background.baseLayerSource();
|
|
if (!source) return;
|
|
|
|
var isDG = (source.id.match(/^DigitalGlobe/i) !== null);
|
|
|
|
var sourceLabel = source.label();
|
|
if (_currSourceName !== sourceLabel) {
|
|
_currSourceName = sourceLabel;
|
|
_metadata = {};
|
|
}
|
|
|
|
selection.text('');
|
|
|
|
var list = selection
|
|
.append('ul')
|
|
.attr('class', 'background-info');
|
|
|
|
list
|
|
.append('li')
|
|
.call(_currSourceName);
|
|
|
|
_metadataKeys.forEach(function(k) {
|
|
// DigitalGlobe vintage is available in raster layers for now.
|
|
if (isDG && k === 'vintage') return;
|
|
|
|
list
|
|
.append('li')
|
|
.attr('class', 'background-info-list-' + k)
|
|
.classed('hide', !_metadata[k])
|
|
.call(t.append('info_panels.background.' + k, { suffix: ':' }))
|
|
.append('span')
|
|
.attr('class', 'background-info-span-' + k)
|
|
.text(_metadata[k]);
|
|
});
|
|
|
|
debouncedGetMetadata(selection);
|
|
|
|
var toggleTiles = context.getDebug('tile') ? 'hide_tiles' : 'show_tiles';
|
|
|
|
selection
|
|
.append('a')
|
|
.call(t.append('info_panels.background.' + toggleTiles))
|
|
.attr('href', '#')
|
|
.attr('class', 'button button-toggle-tiles')
|
|
.on('click', function(d3_event) {
|
|
d3_event.preventDefault();
|
|
context.setDebug('tile', !context.getDebug('tile'));
|
|
selection.call(redraw);
|
|
});
|
|
|
|
if (isDG) {
|
|
var key = source.id + '-vintage';
|
|
var sourceVintage = context.background().findSource(key);
|
|
var showsVintage = context.background().showsLayer(sourceVintage);
|
|
var toggleVintage = showsVintage ? 'hide_vintage' : 'show_vintage';
|
|
selection
|
|
.append('a')
|
|
.call(t.append('info_panels.background.' + toggleVintage))
|
|
.attr('href', '#')
|
|
.attr('class', 'button button-toggle-vintage')
|
|
.on('click', function(d3_event) {
|
|
d3_event.preventDefault();
|
|
context.background().toggleOverlayLayer(sourceVintage);
|
|
selection.call(redraw);
|
|
});
|
|
}
|
|
|
|
// disable if necessary
|
|
['DigitalGlobe-Premium', 'DigitalGlobe-Standard'].forEach(function(layerId) {
|
|
if (source.id !== layerId) {
|
|
var key = layerId + '-vintage';
|
|
var sourceVintage = context.background().findSource(key);
|
|
if (context.background().showsLayer(sourceVintage)) {
|
|
context.background().toggleOverlayLayer(sourceVintage);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
|
|
var debouncedGetMetadata = _debounce(getMetadata, 250);
|
|
|
|
function getMetadata(selection) {
|
|
var tile = context.container().select('.layer-background img.tile-center'); // tile near viewport center
|
|
if (tile.empty()) return;
|
|
|
|
var sourceName = _currSourceName;
|
|
var d = tile.datum();
|
|
var zoom = (d && d.length >= 3 && d[2]) || Math.floor(context.map().zoom());
|
|
var center = context.map().center();
|
|
|
|
// update zoom
|
|
_metadata.zoom = String(zoom);
|
|
selection.selectAll('.background-info-list-zoom')
|
|
.classed('hide', false)
|
|
.selectAll('.background-info-span-zoom')
|
|
.text(_metadata.zoom);
|
|
|
|
if (!d || !d.length >= 3) return;
|
|
|
|
background.baseLayerSource().getMetadata(center, d, function(err, result) {
|
|
if (err || _currSourceName !== sourceName) return;
|
|
|
|
// update vintage
|
|
var vintage = result.vintage;
|
|
_metadata.vintage = (vintage && vintage.range) || t('info_panels.background.unknown');
|
|
selection.selectAll('.background-info-list-vintage')
|
|
.classed('hide', false)
|
|
.selectAll('.background-info-span-vintage')
|
|
.text(_metadata.vintage);
|
|
|
|
// update other _metadata
|
|
_metadataKeys.forEach(function(k) {
|
|
if (k === 'zoom' || k === 'vintage') return; // done already
|
|
var val = result[k];
|
|
_metadata[k] = val;
|
|
selection.selectAll('.background-info-list-' + k)
|
|
.classed('hide', !val)
|
|
.selectAll('.background-info-span-' + k)
|
|
.text(val);
|
|
});
|
|
});
|
|
}
|
|
|
|
|
|
var panel = function(selection) {
|
|
selection.call(redraw);
|
|
|
|
context.map()
|
|
.on('drawn.info-background', function() {
|
|
selection.call(debouncedRedraw);
|
|
})
|
|
.on('move.info-background', function() {
|
|
selection.call(debouncedGetMetadata);
|
|
});
|
|
|
|
};
|
|
|
|
panel.off = function() {
|
|
context.map()
|
|
.on('drawn.info-background', null)
|
|
.on('move.info-background', null);
|
|
};
|
|
|
|
panel.id = 'background';
|
|
panel.label = t.append('info_panels.background.title');
|
|
panel.key = t('info_panels.background.key');
|
|
|
|
|
|
return panel;
|
|
}
|