Skip to content

Commit 4f0a05d

Browse files
committed
Adapt cartesian's selectOnClick to support histogram [1852]
- Account for difference in hoverData having no pointNumber but binNumber and pointNumbers in case of histogram. - Created a messy entireSelectionToBeCleared function
1 parent 722805e commit 4f0a05d

File tree

2 files changed

+47
-19
lines changed

2 files changed

+47
-19
lines changed

src/plots/cartesian/select.js

Lines changed: 45 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -336,7 +336,7 @@ function selectOnClick(gd, numClicks, evt, xAxes, yAxes, outlines) {
336336
var searchTraces;
337337
var searchInfo;
338338
var trace;
339-
var multiPtsSelected;
339+
var clearEntireSelection;
340340
var clickedPts;
341341
var clickedPt;
342342
var shouldSelect;
@@ -350,7 +350,7 @@ function selectOnClick(gd, numClicks, evt, xAxes, yAxes, outlines) {
350350
allSelectionItems = [];
351351

352352
searchTraces = determineSearchTraces(gd, xAxes, yAxes);
353-
multiPtsSelected = areMultiplePointsSelected(searchTraces);
353+
clearEntireSelection = entireSelectionToBeCleared(searchTraces, hoverData);
354354

355355
for(i = 0; i < searchTraces.length; i++) {
356356
searchInfo = searchTraces[i];
@@ -370,8 +370,8 @@ function selectOnClick(gd, numClicks, evt, xAxes, yAxes, outlines) {
370370
for(j = 0; j < clickedPts.length; j++) {
371371
clickedPt = clickedPts[j];
372372
var ptSelected = isPointSelected(trace, clickedPt);
373-
shouldSelect = !ptSelected || (ptSelected && multiPtsSelected && !retainSelection);
374-
traceSelection = searchInfo._module.toggleSelected(searchInfo, shouldSelect, [clickedPt]);
373+
shouldSelect = !ptSelected || (ptSelected && !clearEntireSelection && !retainSelection);
374+
traceSelection = searchInfo._module.toggleSelected(searchInfo, shouldSelect, [clickedPt.pointNumber]);
375375
}
376376
} else {
377377
// If current trace has no pts clicked, we at least call toggleSelected
@@ -384,6 +384,7 @@ function selectOnClick(gd, numClicks, evt, xAxes, yAxes, outlines) {
384384
allSelectionItems = allSelectionItems.concat(fillSelectionItem(traceSelection, searchInfo));
385385
}
386386

387+
// TODO Use the clearEntireSelection flag now
387388
// Hack to achieve regl traces to set selectBatch to null in case no point is selected anymore
388389
// TODO check in advance if a click clear the entire selection, because in this
389390
// case just call toggleSelected(searchInfo, false) on all traces and be done. The `shouldSelect` above might
@@ -408,7 +409,16 @@ function selectOnClick(gd, numClicks, evt, xAxes, yAxes, outlines) {
408409
for(var i = 0; i < hoverData.length; i++) {
409410
var hoverDatum = hoverData[i];
410411
if(hoverDatum.fullData._expandedIndex === searchInfo.cd[0].trace._expandedIndex) {
411-
clickedPts.push(hoverDatum.pointNumber);
412+
if(hoverDatum.pointNumber !== undefined) {
413+
clickedPts.push({
414+
pointNumber: hoverDatum.pointNumber
415+
});
416+
} else if(hoverDatum.binNumber !== undefined) {
417+
clickedPts.push({
418+
pointNumber: hoverDatum.binNumber,
419+
pointNumbers: hoverDatum.pointNumbers
420+
});
421+
}
412422
}
413423
}
414424

@@ -476,23 +486,40 @@ function shouldRetainSelection(evt) {
476486
return evt.shiftKey;
477487
}
478488

479-
function isPointSelected(trace, pointNumber) {
480-
if(!trace.selectedpoints && !Array.isArray(trace.selectedpoints)) return false;
481-
return trace.selectedpoints.indexOf(pointNumber) > -1;
482-
}
483-
484-
function areMultiplePointsSelected(searchTraces) {
485-
var ptsSelected = 0;
489+
// TODO Clean up
490+
function entireSelectionToBeCleared(searchTraces, hoverData) {
491+
var somePointsSelected = false;
486492
for(var i = 0; i < searchTraces.length; i++) {
487-
var trace = searchTraces[i].cd[0].trace;
488-
if(Array.isArray(trace.selectedpoints)) {
489-
ptsSelected += trace.selectedpoints.length;
490-
}
493+
var searchInfo = searchTraces[i];
494+
var trace = searchInfo.cd[0].trace;
495+
if(trace.selectedpoints && trace.selectedpoints.length > 0) {
496+
somePointsSelected = true;
497+
var selectedPtsCopy = trace.selectedpoints.slice();
498+
499+
for(var j = 0; j < hoverData.length; j++) {
500+
var hoverDatum = hoverData[j];
501+
if(hoverDatum.fullData._expandedIndex === trace._expandedIndex) {
502+
selectedPtsCopy = difference(selectedPtsCopy, hoverDatum.pointNumbers || [hoverDatum.pointNumber]);
503+
}
504+
}
491505

492-
if(ptsSelected > 1) return true;
506+
if(selectedPtsCopy.length > 0) {
507+
return false;
508+
}
509+
}
493510
}
511+
return somePointsSelected ? true : false;
512+
}
494513

495-
return ptsSelected > 1;
514+
function isPointSelected(trace, point) {
515+
if(!trace.selectedpoints && !Array.isArray(trace.selectedpoints)) return false;
516+
if(point.pointNumbers) {
517+
for(var i = 0; i < point.pointNumbers.length; i++) {
518+
if(trace.selectedpoints.indexOf(point.pointNumbers[i]) < 0) return false;
519+
}
520+
return true;
521+
}
522+
return trace.selectedpoints.indexOf(point.pointNumber) > -1;
496523
}
497524

498525
/**

src/traces/histogram/index.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,8 @@ Histogram.style = require('../bar/style').style;
3737
Histogram.styleOnSelect = require('../bar/style').styleOnSelect;
3838
Histogram.colorbar = require('../scatter/marker_colorbar');
3939
Histogram.hoverPoints = require('./hover');
40-
Histogram.selectPoints = require('../bar/select');
40+
Histogram.getPointsIn = require('../bar/select').getPointsIn;
41+
Histogram.toggleSelected = require('../bar/select').toggleSelected;
4142
Histogram.eventData = require('./event_data');
4243

4344
Histogram.moduleType = 'trace';

0 commit comments

Comments
 (0)