modules/ui/tools/rapid_features.js (86 lines of code) (raw):
import _debounce from 'lodash-es/debounce';
import { dispatch as d3_dispatch } from 'd3-dispatch';
import { t } from '../../core/localizer';
import { uiTooltip } from '../tooltip';
import { uiCmd } from '../cmd';
import { uiRapidFeatureToggleDialog } from '../rapid_feature_toggle_dialog';
import { uiRapidPowerUserFeaturesDialog } from '../rapid_poweruser_features_dialog';
export function uiToolRapidFeatures(context) {
const toggleKeyDispatcher = d3_dispatch('ai_feature_toggle');
const rapidFeaturesToggleKey = '⇧' + t('map_data.layers.ai-features.key');
const datasetDialog = uiRapidFeatureToggleDialog(context, uiCmd(rapidFeaturesToggleKey), toggleKeyDispatcher);
const powerUserDialog = uiRapidPowerUserFeaturesDialog(context);
const showPowerUser = context.rapidContext().showPowerUser;
let tool = {
id: 'rapid_features',
label: t('toolbar.rapid_features')
};
context.keybinding()
.on(uiCmd(rapidFeaturesToggleKey), (d3_event) => {
d3_event.preventDefault();
d3_event.stopPropagation();
toggleFeatures();
});
function layerEnabled() {
return context.layers().layer('ai-features').enabled();
}
function toggleFeatures() {
let layer = context.layers().layer('ai-features');
layer.enabled(!layer.enabled());
toggleKeyDispatcher.call('ai_feature_toggle');
}
function showFeatureToggleDialog() {
context.container().call(datasetDialog);
}
function showPowerUserFeaturesDialog() {
context.container().call(powerUserDialog);
}
tool.render = (selection) => {
const debouncedUpdate = _debounce(update, 100, { leading: true, trailing: true });
let wrap = selection
.append('div')
.attr('class', showPowerUser ? 'joined' : null)
.style('display', 'flex');
context.map()
.on('move.rapid_features', debouncedUpdate)
.on('drawn.rapid_features', debouncedUpdate);
context
.on('enter.rapid_features', update);
update();
function update() {
let rapidButton = wrap.selectAll('.rapid-features')
.data([0]);
// enter
let rapidButtonEnter = rapidButton.enter()
.append('button')
.attr('class', 'bar-button rapid-features')
.attr('tabindex', -1)
.on('click', showFeatureToggleDialog)
.call(uiTooltip()
.placement('bottom')
.title(t('shortcuts.browsing.display_options.rapid_features_data'))
.keys(rapidFeaturesToggleKey)
);
rapidButtonEnter
.append('svg')
.attr('class', 'logo-rapid')
.append('use')
.attr('xlink:href', '#iD-logo-rapid');
// update
rapidButton.merge(rapidButtonEnter)
.classed('layer-off', !layerEnabled());
let powerUserButton = wrap.selectAll('.rapid-poweruser-features')
.data(showPowerUser ? [0] : []);
powerUserButton.enter()
.append('button')
.attr('class', 'bar-button rapid-poweruser-features')
.attr('tabindex', -1)
.on('click', showPowerUserFeaturesDialog)
.call(uiTooltip()
.placement('bottom')
.title(t('rapid_poweruser_features.heading.label'))
)
.append('div')
.attr('class', 'beta');
}
};
return tool;
}