modules/ui/tools/add_feature.js (130 lines of code) (raw):
import _debounce from 'lodash-es/debounce';
import {
event as d3_event,
select as d3_select,
} from 'd3-selection';
import { t } from '../../util/locale';
import { svgIcon } from '../../svg/icon';
import { tooltip } from '../../util/tooltip';
import { uiTooltipHtml } from '../tooltipHtml';
import { uiPresetBrowser } from '../preset_browser';
import { modeAddArea, modeAddLine, modeAddPoint } from '../../modes';
export function uiToolAddFeature(context) {
var tool = {
id: 'add_feature',
label: t('toolbar.add_feature'),
itemClass: 'disclosing',
iconName: 'iD-presets-grid',
iconClass: 'icon-30'
};
var allowedGeometry = ['point', 'vertex', 'line', 'area'];
var presetBrowser = uiPresetBrowser(context, allowedGeometry, browserDidSelectPreset, browserDidClose)
.scrollContainer(d3_select('#bar'));
var button = d3_select(null);
var key = t('modes.add_feature.key');
var keys = [key, '`', '²', '@']; // #5663, #6864 - common QWERTY, AZERTY
tool.render = function(selection) {
var buttonEnter = selection
.selectAll('.bar-button')
.data([0])
.enter()
.append('button')
.attr('class', 'bar-button')
.attr('tabindex', -1)
.on('mousedown', function() {
d3_event.preventDefault();
d3_event.stopPropagation();
})
.on('mouseup', function() {
d3_event.preventDefault();
d3_event.stopPropagation();
})
.on('click', function() {
if (button.classed('disabled')) return;
if (!presetBrowser.isShown()) {
button.classed('active', true);
presetBrowser.show();
} else {
presetBrowser.hide();
}
})
.call(tooltip()
.placement('bottom')
.html(true)
.title(function() {
return uiTooltipHtml(t('modes.add_feature.description'), key);
})
.scrollContainer(d3_select('#bar'))
)
.call(svgIcon('#' + tool.iconName, tool.iconClass));
buttonEnter
.append('span')
.call(svgIcon('#iD-icon-down', 'disclosure-icon'));
button = selection.select('.bar-button');
selection.call(presetBrowser);
updateEnabledState();
};
tool.allowed = function() {
var addableCount = context.presets().getAddable().length;
return addableCount === 0 || addableCount > 10;
};
tool.install = function() {
context.keybinding().on(keys, function() {
button.classed('active', true);
presetBrowser.show();
d3_event.preventDefault();
d3_event.stopPropagation();
});
var debouncedUpdate = _debounce(updateEnabledState, 500, { leading: true, trailing: true });
context.map()
.on('move.add-feature-tool', debouncedUpdate)
.on('drawn.add-feature-tool', debouncedUpdate);
};
tool.uninstall = function() {
presetBrowser.hide();
context.keybinding().off(keys);
context.features()
.on('change.add-feature-tool', null);
context.map()
.on('move.add-feature-tool', null)
.on('drawn.add-feature-tool', null);
};
function browserDidSelectPreset(preset, geometry) {
var markerClass = 'add-preset add-' + geometry +
' add-preset-' + preset.name().replace(/\s+/g, '_') + '-' + geometry;
var modeInfo = {
button: markerClass,
preset: preset,
geometry: geometry,
title: preset.name().split(' – ')[0]
};
var mode;
switch (geometry) {
case 'point':
case 'vertex':
mode = modeAddPoint(context, modeInfo);
break;
case 'line':
mode = modeAddLine(context, modeInfo);
break;
case 'area':
mode = modeAddArea(context, modeInfo);
break;
default:
return;
}
context.presets().setMostRecent(preset);
context.enter(mode);
}
function browserDidClose() {
button.classed('active', false);
}
function updateEnabledState() {
var isEnabled = context.editable();
button.classed('disabled', !isEnabled);
if (!isEnabled) {
presetBrowser.hide();
}
}
return tool;
}