modules/ui/lasso.js (45 lines of code) (raw):

import { select as d3_select } from 'd3-selection'; import { geoExtent } from '../geo'; import { uiToggle } from './toggle'; export function uiLasso(context) { var group, polygon; lasso.coordinates = []; function lasso(selection) { context.container() .classed('lasso', true); group = selection .append('g') .attr('class', 'lasso hide'); polygon = group .append('path') .attr('class', 'lasso-path'); group .call(uiToggle(true)); } function draw() { if (polygon) { polygon.data([lasso.coordinates]) .attr('d', function(d) { return 'M' + d.join(' L') + ' Z'; }); } } lasso.extent = function () { return lasso.coordinates.reduce(function(extent, point) { return extent.extend(geoExtent(point)); }, geoExtent()); }; lasso.p = function(_) { if (!arguments.length) return lasso; lasso.coordinates.push(_); draw(); return lasso; }; lasso.close = function() { if (group) { group.call(uiToggle(false, function() { d3_select(this).remove(); })); } context.container().classed('lasso', false); }; return lasso; }