6
6
* LICENSE file in the root directory of this source tree.
7
7
*/
8
8
9
-
10
9
'use strict' ;
11
10
12
11
var d3 = require ( 'd3' ) ;
@@ -19,6 +18,7 @@ var dragElement = require('../dragelement');
19
18
var Drawing = require ( '../drawing' ) ;
20
19
var Color = require ( '../color' ) ;
21
20
var svgTextUtils = require ( '../../lib/svg_text_utils' ) ;
21
+ var handleClick = require ( './handle_click' ) ;
22
22
23
23
var constants = require ( './constants' ) ;
24
24
var interactConstants = require ( '../../constants/interactions' ) ;
@@ -29,7 +29,6 @@ var style = require('./style');
29
29
var helpers = require ( './helpers' ) ;
30
30
var anchorUtils = require ( './anchor_utils' ) ;
31
31
32
- var SHOWISOLATETIP = true ;
33
32
var DBLCLICKDELAY = interactConstants . DBLCLICKDELAY ;
34
33
35
34
module . exports = function draw ( gd ) {
@@ -428,8 +427,9 @@ function drawTexts(g, gd) {
428
427
429
428
return Plotly . restyle ( gd , update , traceIndex ) ;
430
429
} ) ;
430
+ } else {
431
+ text . call ( textLayout ) ;
431
432
}
432
- else text . call ( textLayout ) ;
433
433
}
434
434
435
435
function setupTraceToggle ( g , gd ) {
@@ -478,214 +478,6 @@ function setupTraceToggle(g, gd) {
478
478
} ) ;
479
479
}
480
480
481
- function handleClick ( g , gd , numClicks ) {
482
- if ( gd . _dragged || gd . _editing ) return ;
483
-
484
- var hiddenSlices = gd . _fullLayout . hiddenlabels ?
485
- gd . _fullLayout . hiddenlabels . slice ( ) :
486
- [ ] ;
487
-
488
- var legendItem = g . data ( ) [ 0 ] [ 0 ] ;
489
- var fullData = gd . _fullData ;
490
- var fullTrace = legendItem . trace ;
491
- var legendgroup = fullTrace . legendgroup ;
492
-
493
- var i , j , kcont , key , keys , val ;
494
- var attrUpdate = { } ;
495
- var attrIndices = [ ] ;
496
- var carrs = [ ] ;
497
- var carrIdx = [ ] ;
498
-
499
- function insertUpdate ( traceIndex , key , value ) {
500
- var attrIndex = attrIndices . indexOf ( traceIndex ) ;
501
- var valueArray = attrUpdate [ key ] ;
502
- if ( ! valueArray ) {
503
- valueArray = attrUpdate [ key ] = [ ] ;
504
- }
505
-
506
- if ( attrIndices . indexOf ( traceIndex ) === - 1 ) {
507
- attrIndices . push ( traceIndex ) ;
508
- attrIndex = attrIndices . length - 1 ;
509
- }
510
-
511
- valueArray [ attrIndex ] = value ;
512
-
513
- return attrIndex ;
514
- }
515
-
516
- function setVisibility ( fullTrace , visibility ) {
517
- var fullInput = fullTrace . _fullInput ;
518
- if ( Registry . hasTransform ( fullInput , 'groupby' ) ) {
519
- var kcont = carrs [ fullInput . index ] ;
520
- if ( ! kcont ) {
521
- var groupbyIndices = Registry . getTransformIndices ( fullInput , 'groupby' ) ;
522
- var lastGroupbyIndex = groupbyIndices [ groupbyIndices . length - 1 ] ;
523
- kcont = Lib . keyedContainer ( fullInput , 'transforms[' + lastGroupbyIndex + '].styles' , 'target' , 'value.visible' ) ;
524
- carrs [ fullInput . index ] = kcont ;
525
- }
526
-
527
- var curState = kcont . get ( fullTrace . _group ) ;
528
-
529
- // If not specified, assume visible. This happens if there are other style
530
- // properties set for a group but not the visibility. There are many similar
531
- // ways to do this (e.g. why not just `curState = fullTrace.visible`??? The
532
- // answer is: because it breaks other things like groupby trace names in
533
- // subtle ways.)
534
- if ( curState === undefined ) {
535
- curState = true ;
536
- }
537
-
538
- if ( curState !== false ) {
539
- // true -> legendonly. All others toggle to true:
540
- kcont . set ( fullTrace . _group , visibility ) ;
541
- }
542
- carrIdx [ fullInput . index ] = insertUpdate ( fullInput . index , 'visible' , fullInput . visible === false ? false : true ) ;
543
- } else {
544
- // false -> false (not possible since will not be visible in legend)
545
- // true -> legendonly
546
- // legendonly -> true
547
- var nextVisibility = fullInput . visible === false ? false : visibility ;
548
-
549
- insertUpdate ( fullInput . index , 'visible' , nextVisibility ) ;
550
- }
551
- }
552
-
553
- if ( numClicks === 1 && SHOWISOLATETIP && gd . data && gd . _context . showTips ) {
554
- Lib . notifier ( 'Double click on legend to isolate individual trace' , 'long' ) ;
555
- SHOWISOLATETIP = false ;
556
- } else {
557
- SHOWISOLATETIP = false ;
558
- }
559
-
560
- if ( Registry . traceIs ( fullTrace , 'pie' ) ) {
561
- var thisLabel = legendItem . label ,
562
- thisLabelIndex = hiddenSlices . indexOf ( thisLabel ) ;
563
-
564
- if ( numClicks === 1 ) {
565
- if ( thisLabelIndex === - 1 ) hiddenSlices . push ( thisLabel ) ;
566
- else hiddenSlices . splice ( thisLabelIndex , 1 ) ;
567
- } else if ( numClicks === 2 ) {
568
- hiddenSlices = [ ] ;
569
- gd . calcdata [ 0 ] . forEach ( function ( d ) {
570
- if ( thisLabel !== d . label ) {
571
- hiddenSlices . push ( d . label ) ;
572
- }
573
- } ) ;
574
- if ( gd . _fullLayout . hiddenlabels && gd . _fullLayout . hiddenlabels . length === hiddenSlices . length && thisLabelIndex === - 1 ) {
575
- hiddenSlices = [ ] ;
576
- }
577
- }
578
-
579
- Plotly . relayout ( gd , 'hiddenlabels' , hiddenSlices ) ;
580
- } else {
581
- var hasLegendgroup = legendgroup && legendgroup . length ;
582
- var traceIndicesInGroup = [ ] ;
583
- var tracei ;
584
- if ( hasLegendgroup ) {
585
- for ( i = 0 ; i < fullData . length ; i ++ ) {
586
- tracei = fullData [ i ] ;
587
- if ( ! tracei . visible ) continue ;
588
- if ( tracei . legendgroup === legendgroup ) {
589
- traceIndicesInGroup . push ( i ) ;
590
- }
591
- }
592
- }
593
-
594
- if ( numClicks === 1 ) {
595
- var nextVisibility ;
596
-
597
- switch ( fullTrace . visible ) {
598
- case true :
599
- nextVisibility = 'legendonly' ;
600
- break ;
601
- case false :
602
- nextVisibility = false ;
603
- break ;
604
- case 'legendonly' :
605
- nextVisibility = true ;
606
- break ;
607
- }
608
-
609
- if ( hasLegendgroup ) {
610
- for ( i = 0 ; i < fullData . length ; i ++ ) {
611
- if ( fullData [ i ] . visible !== false && fullData [ i ] . legendgroup === legendgroup ) {
612
- setVisibility ( fullData [ i ] , nextVisibility ) ;
613
- }
614
- }
615
- } else {
616
- setVisibility ( fullTrace , nextVisibility ) ;
617
- }
618
- } else if ( numClicks === 2 ) {
619
- // Compute the clicked index. expandedIndex does what we want for expanded traces
620
- // but also culls hidden traces. That means we have some work to do.
621
- var isClicked , isInGroup , otherState ;
622
- var isIsolated = true ;
623
- for ( i = 0 ; i < fullData . length ; i ++ ) {
624
- isClicked = fullData [ i ] === fullTrace ;
625
- if ( isClicked ) continue ;
626
-
627
- isInGroup = ( hasLegendgroup && fullData [ i ] . legendgroup === legendgroup ) ;
628
-
629
- if ( ! isInGroup && fullData [ i ] . visible === true && ! Registry . traceIs ( fullData [ i ] , 'notLegendIsolatable' ) ) {
630
- isIsolated = false ;
631
- break ;
632
- }
633
- }
634
-
635
- for ( i = 0 ; i < fullData . length ; i ++ ) {
636
- // False is sticky; we don't change it.
637
- if ( fullData [ i ] . visible === false ) continue ;
638
-
639
- if ( Registry . traceIs ( fullData [ i ] , 'notLegendIsolatable' ) ) {
640
- continue ;
641
- }
642
-
643
- switch ( fullTrace . visible ) {
644
- case 'legendonly' :
645
- setVisibility ( fullData [ i ] , true ) ;
646
- break ;
647
- case true :
648
- otherState = isIsolated ? true : 'legendonly' ;
649
- isClicked = fullData [ i ] === fullTrace ;
650
- isInGroup = isClicked || ( hasLegendgroup && fullData [ i ] . legendgroup === legendgroup ) ;
651
- setVisibility ( fullData [ i ] , isInGroup ? true : otherState ) ;
652
- break ;
653
- }
654
- }
655
- }
656
-
657
- for ( i = 0 ; i < carrs . length ; i ++ ) {
658
- kcont = carrs [ i ] ;
659
- if ( ! kcont ) continue ;
660
- var update = kcont . constructUpdate ( ) ;
661
-
662
- var updateKeys = Object . keys ( update ) ;
663
- for ( j = 0 ; j < updateKeys . length ; j ++ ) {
664
- key = updateKeys [ j ] ;
665
- val = attrUpdate [ key ] = attrUpdate [ key ] || [ ] ;
666
- val [ carrIdx [ i ] ] = update [ key ] ;
667
- }
668
- }
669
-
670
- // The length of the value arrays should be equal and any unspecified
671
- // values should be explicitly undefined for them to get properly culled
672
- // as updates and not accidentally reset to the default value. This fills
673
- // out sparse arrays with the required number of undefined values:
674
- keys = Object . keys ( attrUpdate ) ;
675
- for ( i = 0 ; i < keys . length ; i ++ ) {
676
- key = keys [ i ] ;
677
- for ( j = 0 ; j < attrIndices . length ; j ++ ) {
678
- // Use hasOwnPropety to protect against falsey values:
679
- if ( ! attrUpdate [ key ] . hasOwnProperty ( j ) ) {
680
- attrUpdate [ key ] [ j ] = undefined ;
681
- }
682
- }
683
- }
684
-
685
- Plotly . restyle ( gd , attrUpdate , attrIndices ) ;
686
- }
687
- }
688
-
689
481
function computeTextDimensions ( g , gd ) {
690
482
var legendItem = g . data ( ) [ 0 ] [ 0 ] ;
691
483
0 commit comments