Skip to content

Commit d072121

Browse files
committed
Make rough dynamic selection
1 parent 22e8c7e commit d072121

File tree

2 files changed

+65
-38
lines changed

2 files changed

+65
-38
lines changed

src/plots/cartesian/select.js

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,8 @@ module.exports = function prepSelect(e, startX, startY, dragOptions, mode) {
4545
yAxisIds = dragOptions.yaxes.map(getAxId),
4646
allAxes = dragOptions.xaxes.concat(dragOptions.yaxes),
4747
filterPoly, testPoly, mergedPolygons, currentPolygon,
48-
subtract = e.altKey;
48+
subtract = e.altKey,
49+
i, cd, trace, searchInfo, eventData;
4950

5051

5152
// take over selection polygons from prev mode, if any
@@ -63,6 +64,20 @@ module.exports = function prepSelect(e, startX, startY, dragOptions, mode) {
6364
if(mode === 'lasso') {
6465
filterPoly = filteredPolygon([[x0, y0]], constants.BENDPX);
6566
}
67+
68+
// FIXME: find a better way to clear selection outlines for splom
69+
if(!e.shiftKey && !e.altKey) {
70+
for(i = 0; i < gd.calcdata.length; i++) {
71+
cd = gd.calcdata[i];
72+
trace = cd[0].trace;
73+
74+
if(trace.type === 'splom') {
75+
zoomLayer.selectAll('.select-outline').remove();
76+
break;
77+
}
78+
}
79+
}
80+
6681
var outlines = zoomLayer.selectAll('path.select-outline-' + plotinfo.id).data([1, 2]);
6782

6883
outlines.enter()
@@ -86,7 +101,6 @@ module.exports = function prepSelect(e, startX, startY, dragOptions, mode) {
86101
var searchTraces = [];
87102
var throttleID = fullLayout._uid + constants.SELECTID;
88103
var selection = [];
89-
var i, cd, trace, searchInfo, eventData;
90104

91105
for(i = 0; i < gd.calcdata.length; i++) {
92106
cd = gd.calcdata[i];
@@ -355,6 +369,9 @@ function updateSelectedState(gd, searchTraces, eventData) {
355369
searchTraces[i].cd[0].t.scene.clearSelect();
356370
}
357371
}
372+
373+
// FIXME: make sure there is no better way to clear selection for sploms
374+
gd._fullLayout._zoomlayer.selectAll('.select-outline').remove();
358375
}
359376

360377
for(i = 0; i < searchTraces.length; i++) {

src/traces/splom/index.js

Lines changed: 46 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -110,8 +110,7 @@ function sceneUpdate(gd, stash) {
110110
var scene = stash._scene;
111111

112112
var reset = {
113-
dirty: true,
114-
opts: null
113+
dirty: true
115114
};
116115

117116
var first = {
@@ -137,21 +136,6 @@ function sceneUpdate(gd, stash) {
137136
scene.dirty = false;
138137
};
139138

140-
// make sure canvas is clear
141-
scene.clear = function clear() {
142-
// TODO
143-
};
144-
145-
// remove selection
146-
scene.clearSelect = function clearSelect() {
147-
if(!scene.selectBatch) return;
148-
scene.selectBatch = null;
149-
scene.unselectBatch = null;
150-
scene.matrix.update(scene.matrixOptions);
151-
scene.clear();
152-
scene.draw();
153-
};
154-
155139
// remove scene resources
156140
scene.destroy = function destroy() {
157141
if(scene.matrix) scene.matrix.destroy();
@@ -189,22 +173,25 @@ function plotOne(gd, cd0) {
189173
var matrixData = scene.matrixOptions.data;
190174
var regl = fullLayout._glcanvas.data()[0].regl;
191175
var dragmode = fullLayout.dragmode;
176+
var xa, ya;
192177

193178
if(matrixData.length === 0) return;
194179

180+
195181
var k = 0, i;
196182
var activeLength = trace._activeLength;
197183
var visibleLength = matrixData.length;
184+
var dataLength = matrixData[0].length;
198185
var viewOpts = {
199186
ranges: new Array(visibleLength),
200187
domains: new Array(visibleLength)
201188
};
202189

203-
for(var i = 0; i < activeLength; i++) {
190+
for(i = 0; i < activeLength; i++) {
204191
if(!trace.dimensions[i].visible) continue;
205192

206-
var xa = AxisIDs.getFromId(gd, trace.xaxes[i]);
207-
var ya = AxisIDs.getFromId(gd, trace.yaxes[i]);
193+
xa = AxisIDs.getFromId(gd, trace.xaxes[i]);
194+
ya = AxisIDs.getFromId(gd, trace.yaxes[i]);
208195
viewOpts.ranges[k] = [xa.range[0], ya.range[0], xa.range[1], ya.range[1]];
209196
viewOpts.domains[k] = [xa.domain[0], ya.domain[0], xa.domain[1], ya.domain[1]];
210197
k++;
@@ -236,21 +223,32 @@ function plotOne(gd, cd0) {
236223
selDict[selPts[i]] = true;
237224
}
238225
var unselPts = [];
239-
for(i = 0; i < matrixData[0].length; i++) {
226+
for(i = 0; i < dataLength; i++) {
240227
if(!selDict[i]) unselPts.push(i);
241228
}
242229
scene.unselectBatch = unselPts;
243230
}
244231

245232
// precalculate px coords since we are not going to pan during select
246-
// var xpx = new Array(stash.count);
247-
// var ypx = new Array(stash.count);
248-
// for(i = 0; i < stash.count; i++) {
249-
// xpx[i] = xaxis.c2p(x[i]);
250-
// ypx[i] = yaxis.c2p(y[i]);
251-
// }
252-
// stash.xpx = xpx;
253-
// stash.ypx = ypx;
233+
var xpx = new Array(visibleLength);
234+
var ypx = new Array(visibleLength);
235+
var data;
236+
for(k = 0; k < visibleLength; k++) {
237+
xa = AxisIDs.getFromId(gd, trace.xaxes[k]);
238+
ya = AxisIDs.getFromId(gd, trace.yaxes[k]);
239+
240+
xpx[k] = new Array(dataLength);
241+
ypx[k] = new Array(dataLength);
242+
243+
data = matrixData[k];
244+
245+
for(i = 0; i < dataLength; i++) {
246+
xpx[k][i] = xa.c2p(data[i]);
247+
ypx[k][i] = ya.c2p(data[i]);
248+
}
249+
}
250+
stash.xpx = xpx;
251+
stash.ypx = ypx;
254252

255253

256254
if(scene.selectBatch) {
@@ -325,24 +323,35 @@ function selectPoints(searchInfo, polygon) {
325323
var selection = [];
326324
var trace = cd[0].trace;
327325
var stash = cd[0].t;
328-
var x = stash.x;
329-
var y = stash.y;
330326
var scene = stash._scene;
327+
var xa = searchInfo.xaxis;
328+
var ya = searchInfo.yaxis;
329+
var matrixData = scene.matrixOptions.data;
331330

332331
if(!scene) return selection;
333332

334333
var hasOnlyLines = (!subTypes.hasMarkers(trace) && !subTypes.hasText(trace));
335334
if(trace.visible !== true || hasOnlyLines) return selection;
336335

336+
var xi, yi, i;
337+
for(i = 0; i < trace.dimensions.length; i++) {
338+
if(trace.xaxes[i] === xa._id) xi = i;
339+
if(trace.yaxes[i] === ya._id) yi = i;
340+
}
341+
342+
var xpx = stash.xpx[xi];
343+
var ypx = stash.ypx[yi];
344+
var x = matrixData[xi];
345+
var y = matrixData[yi];
346+
337347
// degenerate polygon does not enable selection
338348
// filter out points by visible scatter ones
339349
var els = null;
340350
var unels = null;
341-
var i;
342351
if(polygon !== false && !polygon.degenerate) {
343352
els = [], unels = [];
344-
for(i = 0; i < stash.count; i++) {
345-
if(polygon.contains([stash.xpx[i], stash.ypx[i]])) {
353+
for(i = 0; i < x.length; i++) {
354+
if(polygon.contains([xpx[i], ypx[i]])) {
346355
els.push(i);
347356
selection.push({
348357
pointNumber: i,
@@ -371,20 +380,21 @@ function selectPoints(searchInfo, polygon) {
371380
scene.unselectBatch = [];
372381
}
373382
// we should turn scatter2d into unselected once we have any points selected
374-
scene.matrix.update(scene.unselectedOptions);
383+
scene.matrix.update(scene.unselectedOptions, scene.selectedOptions);
375384
}
376385

377386
scene.selectBatch = els;
378387
scene.unselectBatch = unels;
379388

389+
scene.matrix.regl.clear({ color: true });
390+
380391
return selection;
381392
}
382393

383394
function style(gd, cd) {
384395
if(cd) {
385396
var stash = cd[0].t;
386397
var scene = stash._scene;
387-
scene.clear();
388398
scene.draw();
389399
}
390400
}

0 commit comments

Comments
 (0)