modules/ui/zoom.js (112 lines of code) (raw):

import { select as d3_select } from 'd3-selection'; import { t, localizer } from '../core/localizer'; import { svgIcon } from '../svg/icon'; import { uiCmd } from './cmd'; import { uiTooltip } from './tooltip'; import { utilKeybinding } from '../util/keybinding'; export function uiZoom(context) { var zooms = [{ id: 'zoom-in', icon: 'iD-icon-plus', title: t.html('zoom.in'), action: zoomIn, disabled: function() { return !context.map().canZoomIn(); }, disabledTitle: t.html('zoom.disabled.in'), key: '+' }, { id: 'zoom-out', icon: 'iD-icon-minus', title: t.html('zoom.out'), action: zoomOut, disabled: function() { return !context.map().canZoomOut(); }, disabledTitle: t.html('zoom.disabled.out'), key: '-' }]; function zoomIn(d3_event) { if (d3_event.shiftKey) return; d3_event.preventDefault(); context.map().zoomIn(); } function zoomOut(d3_event) { if (d3_event.shiftKey) return; d3_event.preventDefault(); context.map().zoomOut(); } function zoomInFurther(d3_event) { if (d3_event.shiftKey) return; d3_event.preventDefault(); context.map().zoomInFurther(); } function zoomOutFurther(d3_event) { if (d3_event.shiftKey) return; d3_event.preventDefault(); context.map().zoomOutFurther(); } return function(selection) { var tooltipBehavior = uiTooltip() .placement((localizer.textDirection() === 'rtl') ? 'right' : 'left') .title(function(d) { if (d.disabled()) { return d.disabledTitle; } return d.title; }) .keys(function(d) { return [d.key]; }); var lastPointerUpType; var buttons = selection.selectAll('button') .data(zooms) .enter() .append('button') .attr('class', function(d) { return d.id; }) .on('pointerup.editor', function(d3_event) { lastPointerUpType = d3_event.pointerType; }) .on('click.editor', function(d3_event, d) { if (!d.disabled()) { d.action(d3_event); } else if (lastPointerUpType === 'touch' || lastPointerUpType === 'pen') { context.ui().flash .duration(2000) .iconName('#' + d.icon) .iconClass('disabled') .label(d.disabledTitle)(); } lastPointerUpType = null; }) .call(tooltipBehavior); buttons.each(function(d) { d3_select(this) .call(svgIcon('#' + d.icon, 'light')); }); utilKeybinding.plusKeys.forEach(function(key) { context.keybinding().on([key], zoomIn); context.keybinding().on([uiCmd('⌥' + key)], zoomInFurther); }); utilKeybinding.minusKeys.forEach(function(key) { context.keybinding().on([key], zoomOut); context.keybinding().on([uiCmd('⌥' + key)], zoomOutFurther); }); function updateButtonStates() { buttons .classed('disabled', function(d) { return d.disabled(); }) .each(function() { var selection = d3_select(this); if (!selection.select('.tooltip.in').empty()) { selection.call(tooltipBehavior.updateContent); } }); } updateButtonStates(); context.map().on('move.uiZoom', updateButtonStates); }; }