iD.ui.MapData = function(context) { var key = 'F', features = context.features().keys(), fills = ['wireframe', 'partial', 'full'], fillDefault = context.storage('area-fill') || 'partial', fillSelected = fillDefault; function map_data(selection) { function showsFeature(d) { return context.features().enabled(d); } function autoHiddenFeature(d) { return context.features().autoHidden(d); } function clickFeature(d) { context.features().toggle(d); update(); } function showsFill(d) { return fillSelected === d; } function setFill(d) { _.each(fills, function(opt) { context.surface().classed('fill-' + opt, Boolean(opt === d)); }); fillSelected = d; if (d !== 'wireframe') { fillDefault = d; context.storage('area-fill', d); } update(); } function clickGpx() { context.background().toggleGpxLayer(); update(); } function clickMapillaryImages() { context.background().toggleMapillaryImageLayer(); update(); } function clickMapillarySigns() { context.background().toggleMapillarySignLayer(); update(); } function drawMapillaryItems(selection) { var mapillary = iD.services.mapillary, supportsMapillaryImages = !!mapillary, supportsMapillarySigns = !!mapillary && mapillary().signsSupported(); var mapillaryList = selection .selectAll('.mapillary-list') .data([0]); // Enter mapillaryList .enter() .append('ul') .attr('class', 'layer-list mapillary-list'); var mapillaryImageLayerItem = mapillaryList .selectAll('.item-mapillary-images') .data(supportsMapillaryImages ? [0] : []); var enterImages = mapillaryImageLayerItem.enter() .append('li') .attr('class', 'item-mapillary-images'); var labelImages = enterImages.append('label') .call(bootstrap.tooltip() .title(t('mapillary_images.tooltip')) .placement('top')); labelImages.append('input') .attr('type', 'checkbox') .on('change', clickMapillaryImages); labelImages.append('span') .text(t('mapillary_images.title')); var mapillarySignLayerItem = mapillaryList .selectAll('.item-mapillary-signs') .data(supportsMapillarySigns ? [0] : []); var enterSigns = mapillarySignLayerItem.enter() .append('li') .attr('class', 'item-mapillary-signs'); var labelSigns = enterSigns.append('label') .call(bootstrap.tooltip() .title(t('mapillary_signs.tooltip')) .placement('top')); labelSigns.append('input') .attr('type', 'checkbox') .on('change', clickMapillarySigns); labelSigns.append('span') .text(t('mapillary_signs.title')); // Update var showsMapillaryImages = supportsMapillaryImages && context.background().showsMapillaryImageLayer(), showsMapillarySigns = supportsMapillarySigns && context.background().showsMapillarySignLayer(); mapillaryImageLayerItem .classed('active', showsMapillaryImages) .selectAll('input') .property('checked', showsMapillaryImages); mapillarySignLayerItem .classed('active', showsMapillarySigns) .selectAll('input') .property('checked', showsMapillarySigns); // Exit mapillaryImageLayerItem.exit() .remove(); mapillarySignLayerItem.exit() .remove(); } function drawGpxItem(selection) { var gpxLayerItem = selection .selectAll('.layer-gpx') .data([0]); // Enter var enter = gpxLayerItem.enter() .append('ul') .attr('class', 'layer-list layer-gpx') .append('li') .classed('layer-toggle-gpx', true); enter.append('button') .attr('class', 'layer-extent') .call(bootstrap.tooltip() .title(t('gpx.zoom')) .placement('left')) .on('click', function() { d3.event.preventDefault(); d3.event.stopPropagation(); context.background().gpxLayer().fitZoom(); }) .call(iD.svg.Icon('#icon-search')); enter.append('button') .attr('class', 'layer-browse') .call(bootstrap.tooltip() .title(t('gpx.browse')) .placement('left')) .on('click', function() { d3.select(document.createElement('input')) .attr('type', 'file') .on('change', function() { context.background().gpxLayer().files(d3.event.target.files); }) .node().click(); }) .call(iD.svg.Icon('#icon-geolocate')); var labelGpx = enter.append('label') .call(bootstrap.tooltip() .title(t('gpx.drag_drop')) .placement('top')); labelGpx.append('input') .attr('type', 'checkbox') .on('change', clickGpx); labelGpx.append('span') .text(t('gpx.local_layer')); // Update var hasGpx = context.background().hasGpxLayer(), showsGpx = context.background().showsGpxLayer(); gpxLayerItem .classed('active', showsGpx) .selectAll('input') .property('disabled', !hasGpx) .property('checked', showsGpx); // Exit gpxLayerItem.exit() .remove(); } function drawList(selection, data, type, name, change, active) { var items = selection.selectAll('li') .data(data); // Enter var enter = items.enter() .append('li') .attr('class', 'layer') .call(bootstrap.tooltip() .html(true) .title(function(d) { var tip = t(name + '.' + d + '.tooltip'), key = (d === 'wireframe' ? 'W' : null); if (name === 'feature' && autoHiddenFeature(d)) { tip += '