66* LICENSE file in the root directory of this source tree.
77*/
88
9-
109'use strict' ;
1110
1211var d3 = require ( 'd3' ) ;
@@ -19,6 +18,7 @@ var dragElement = require('../dragelement');
1918var Drawing = require ( '../drawing' ) ;
2019var Color = require ( '../color' ) ;
2120var svgTextUtils = require ( '../../lib/svg_text_utils' ) ;
21+ var handleClick = require ( './handle_click' ) ;
2222
2323var constants = require ( './constants' ) ;
2424var interactConstants = require ( '../../constants/interactions' ) ;
@@ -29,7 +29,6 @@ var style = require('./style');
2929var helpers = require ( './helpers' ) ;
3030var anchorUtils = require ( './anchor_utils' ) ;
3131
32- var SHOWISOLATETIP = true ;
3332var DBLCLICKDELAY = interactConstants . DBLCLICKDELAY ;
3433
3534module . exports = function draw ( gd ) {
@@ -428,8 +427,9 @@ function drawTexts(g, gd) {
428427
429428 return Plotly . restyle ( gd , update , traceIndex ) ;
430429 } ) ;
430+ } else {
431+ text . call ( textLayout ) ;
431432 }
432- else text . call ( textLayout ) ;
433433}
434434
435435function setupTraceToggle ( g , gd ) {
@@ -478,214 +478,6 @@ function setupTraceToggle(g, gd) {
478478 } ) ;
479479}
480480
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-
689481function computeTextDimensions ( g , gd ) {
690482 var legendItem = g . data ( ) [ 0 ] [ 0 ] ;
691483
0 commit comments