Files
iD/modules/renderer/photos.js
2019-08-22 15:16:31 -03:00

90 lines
2.7 KiB
JavaScript

import { dispatch as d3_dispatch } from 'd3-dispatch';
import { utilRebind } from '../util/rebind';
import { utilQsString, utilStringQs } from '../util';
export function rendererPhotos(context) {
var dispatch = d3_dispatch('change');
var _layerIDs = ['streetside', 'mapillary', 'mapillary-map-features', 'mapillary-signs', 'openstreetcam'];
var _allPhotoTypes = ['flat', 'panoramic'];
var _shownPhotoTypes = _allPhotoTypes.slice(); // shallow copy
function photos() {}
function updateStorage() {
if (window.mocha) return;
var q = utilStringQs(window.location.hash.substring(1));
var enabled = context.layers().all().filter(function(d) {
return _layerIDs.indexOf(d.id) !== -1 && d.layer && d.layer.supported() && d.layer.enabled();
}).map(function(d) {
return d.id;
});
if (enabled.length) {
q.photo_overlay = enabled.join(',');
} else {
delete q.photo_overlay;
}
window.location.replace('#' + utilQsString(q, true));
}
photos.overlayLayerIDs = function() {
return _layerIDs;
};
photos.allPhotoTypes = function() {
return _allPhotoTypes;
};
function showsLayer(id) {
var layer = context.layers().layer(id);
return layer && layer.supported() && layer.enabled();
}
photos.shouldFilterByPhotoType = function() {
return showsLayer('mapillary') ||
(showsLayer('streetside') && showsLayer('openstreetcam'));
};
photos.showsPhotoType = function(val) {
if (!photos.shouldFilterByPhotoType()) return true;
return _shownPhotoTypes.indexOf(val) !== -1;
};
photos.showsFlat = function() {
return photos.showsPhotoType('flat');
};
photos.showsPanoramic = function() {
return photos.showsPhotoType('panoramic');
};
photos.togglePhotoType = function(val) {
var index = _shownPhotoTypes.indexOf(val);
if (index !== -1) {
_shownPhotoTypes.splice(index, 1);
} else {
_shownPhotoTypes.push(val);
}
dispatch.call('change', this);
return photos;
};
photos.init = function() {
var q = utilStringQs(window.location.hash.substring(1));
if (q.photo_overlay) {
var hashOverlayIDs = q.photo_overlay.replace(/;/g, ',').split(',');
hashOverlayIDs.forEach(function(id) {
var layer = context.layers().layer(id);
if (layer) layer.enabled(true);
});
}
context.layers().on('change.rendererPhotos', updateStorage);
};
return utilRebind(photos, dispatch, 'on');
}