@@ -336,7 +336,7 @@ function selectOnClick(gd, numClicks, evt, xAxes, yAxes, outlines) {
336
336
var searchTraces ;
337
337
var searchInfo ;
338
338
var trace ;
339
- var multiPtsSelected ;
339
+ var clearEntireSelection ;
340
340
var clickedPts ;
341
341
var clickedPt ;
342
342
var shouldSelect ;
@@ -350,7 +350,7 @@ function selectOnClick(gd, numClicks, evt, xAxes, yAxes, outlines) {
350
350
allSelectionItems = [ ] ;
351
351
352
352
searchTraces = determineSearchTraces ( gd , xAxes , yAxes ) ;
353
- multiPtsSelected = areMultiplePointsSelected ( searchTraces ) ;
353
+ clearEntireSelection = entireSelectionToBeCleared ( searchTraces , hoverData ) ;
354
354
355
355
for ( i = 0 ; i < searchTraces . length ; i ++ ) {
356
356
searchInfo = searchTraces [ i ] ;
@@ -370,8 +370,8 @@ function selectOnClick(gd, numClicks, evt, xAxes, yAxes, outlines) {
370
370
for ( j = 0 ; j < clickedPts . length ; j ++ ) {
371
371
clickedPt = clickedPts [ j ] ;
372
372
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 ] ) ;
375
375
}
376
376
} else {
377
377
// If current trace has no pts clicked, we at least call toggleSelected
@@ -384,6 +384,7 @@ function selectOnClick(gd, numClicks, evt, xAxes, yAxes, outlines) {
384
384
allSelectionItems = allSelectionItems . concat ( fillSelectionItem ( traceSelection , searchInfo ) ) ;
385
385
}
386
386
387
+ // TODO Use the clearEntireSelection flag now
387
388
// Hack to achieve regl traces to set selectBatch to null in case no point is selected anymore
388
389
// TODO check in advance if a click clear the entire selection, because in this
389
390
// 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) {
408
409
for ( var i = 0 ; i < hoverData . length ; i ++ ) {
409
410
var hoverDatum = hoverData [ i ] ;
410
411
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
+ }
412
422
}
413
423
}
414
424
@@ -476,23 +486,40 @@ function shouldRetainSelection(evt) {
476
486
return evt . shiftKey ;
477
487
}
478
488
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 ;
486
492
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
+ }
491
505
492
- if ( ptsSelected > 1 ) return true ;
506
+ if ( selectedPtsCopy . length > 0 ) {
507
+ return false ;
508
+ }
509
+ }
493
510
}
511
+ return somePointsSelected ? true : false ;
512
+ }
494
513
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 ;
496
523
}
497
524
498
525
/**
0 commit comments