plotly.js
Version:
The open source javascript graphing library that powers plotly
125 lines (101 loc) • 3.6 kB
JavaScript
'use strict';
var dragHelpers = require('../../dragelement/helpers');
var selectMode = dragHelpers.selectMode;
var handleOutline = require('../../shapes/handle_outline');
var clearOutline = handleOutline.clearOutline;
var helpers = require('../../shapes/draw_newshape/helpers');
var readPaths = helpers.readPaths;
var writePaths = helpers.writePaths;
var fixDatesForPaths = helpers.fixDatesForPaths;
module.exports = function newSelections(outlines, dragOptions) {
if(!outlines.length) return;
var e = outlines[0][0]; // pick first
if(!e) return;
var d = e.getAttribute('d');
var gd = dragOptions.gd;
var newStyle = gd._fullLayout.newselection;
var plotinfo = dragOptions.plotinfo;
var xaxis = plotinfo.xaxis;
var yaxis = plotinfo.yaxis;
var isActiveSelection = dragOptions.isActiveSelection;
var dragmode = dragOptions.dragmode;
var selections = (gd.layout || {}).selections || [];
if(!selectMode(dragmode) && isActiveSelection !== undefined) {
var id = gd._fullLayout._activeSelectionIndex;
if(id < selections.length) {
switch(gd._fullLayout.selections[id].type) {
case 'rect':
dragmode = 'select';
break;
case 'path':
dragmode = 'lasso';
break;
}
}
}
var polygons = readPaths(d, gd, plotinfo, isActiveSelection);
var newSelection = {
xref: xaxis._id,
yref: yaxis._id,
opacity: newStyle.opacity,
line: {
color: newStyle.line.color,
width: newStyle.line.width,
dash: newStyle.line.dash
}
};
var cell;
// rect can be in one cell
// only define cell if there is single cell
if(polygons.length === 1) cell = polygons[0];
if(
cell &&
cell.length === 5 && // ensure we only have 4 corners for a rect
dragmode === 'select'
) {
newSelection.type = 'rect';
newSelection.x0 = cell[0][1];
newSelection.y0 = cell[0][2];
newSelection.x1 = cell[2][1];
newSelection.y1 = cell[2][2];
} else {
newSelection.type = 'path';
if(xaxis && yaxis) fixDatesForPaths(polygons, xaxis, yaxis);
newSelection.path = writePaths(polygons);
cell = null;
}
clearOutline(gd);
var editHelpers = dragOptions.editHelpers;
var modifyItem = (editHelpers || {}).modifyItem;
var allSelections = [];
for(var q = 0; q < selections.length; q++) {
var beforeEdit = gd._fullLayout.selections[q];
if(!beforeEdit) {
allSelections[q] = beforeEdit;
continue;
}
allSelections[q] = beforeEdit._input;
if(
isActiveSelection !== undefined &&
q === gd._fullLayout._activeSelectionIndex
) {
var afterEdit = newSelection;
switch(beforeEdit.type) {
case 'rect':
modifyItem('x0', afterEdit.x0);
modifyItem('x1', afterEdit.x1);
modifyItem('y0', afterEdit.y0);
modifyItem('y1', afterEdit.y1);
break;
case 'path':
modifyItem('path', afterEdit.path);
break;
}
}
}
if(isActiveSelection === undefined) {
allSelections.push(newSelection); // add new selection
return allSelections;
}
return editHelpers ? editHelpers.getUpdateObj() : {};
};