@@ -82,10 +82,13 @@ function getButtonGroups(gd, buttonsToRemove, buttonsToAdd) {
8282 var hasTernary = fullLayout . _has ( 'ternary' ) ;
8383 var hasMapbox = fullLayout . _has ( 'mapbox' ) ;
8484 var hasPolar = fullLayout . _has ( 'polar' ) ;
85+ var allAxesFixed = areAllAxesFixed ( fullLayout ) ;
8586
8687 var groups = [ ] ;
8788
8889 function addGroup ( newGroup ) {
90+ if ( ! newGroup . length ) return ;
91+
8992 var out = [ ] ;
9093
9194 for ( var i = 0 ; i < newGroup . length ; i ++ ) {
@@ -100,55 +103,71 @@ function getButtonGroups(gd, buttonsToRemove, buttonsToAdd) {
100103 // buttons common to all plot types
101104 addGroup ( [ 'toImage' , 'sendDataToCloud' ] ) ;
102105
103- // graphs with more than one plot types get 'union buttons'
104- // which reset the view or toggle hover labels across all subplots.
105- if ( ( hasCartesian || hasGL2D || hasPie || hasTernary ) + hasGeo + hasGL3D > 1 ) {
106- addGroup ( [ 'resetViews' , 'toggleHover' ] ) ;
107- return appendButtonsToGroups ( groups , buttonsToAdd ) ;
108- }
106+ var zoomGroup = [ ] ;
107+ var hoverGroup = [ ] ;
108+ var resetGroup = [ ] ;
109+ var dragModeGroup = [ ] ;
109110
110- if ( hasGL3D ) {
111- addGroup ( [ 'zoom3d' , 'pan3d' , 'orbitRotation' , 'tableRotation' ] ) ;
112- addGroup ( [ 'resetCameraDefault3d' , 'resetCameraLastSave3d' ] ) ;
113- addGroup ( [ 'hoverClosest3d' ] ) ;
111+ if ( ( hasCartesian || hasGL2D || hasPie || hasTernary ) + hasGeo + hasGL3D + hasMapbox + hasPolar > 1 ) {
112+ // graphs with more than one plot types get 'union buttons'
113+ // which reset the view or toggle hover labels across all subplots.
114+ hoverGroup = [ 'toggleHover' ] ;
115+ resetGroup = [ 'resetViews' ] ;
116+ }
117+ else if ( hasGeo ) {
118+ zoomGroup = [ 'zoomInGeo' , 'zoomOutGeo' ] ;
119+ hoverGroup = [ 'hoverClosestGeo' ] ;
120+ resetGroup = [ 'resetGeo' ] ;
121+ }
122+ else if ( hasGL3D ) {
123+ hoverGroup = [ 'hoverClosest3d' ] ;
124+ resetGroup = [ 'resetCameraDefault3d' , 'resetCameraLastSave3d' ] ;
125+ }
126+ else if ( hasMapbox ) {
127+ hoverGroup = [ 'toggleHover' ] ;
128+ resetGroup = [ 'resetViewMapbox' ] ;
129+ }
130+ else if ( hasGL2D ) {
131+ hoverGroup = [ 'hoverClosestGl2d' ] ;
132+ }
133+ else if ( hasPie ) {
134+ hoverGroup = [ 'hoverClosestPie' ] ;
135+ }
136+ else { // hasPolar, hasTernary
137+ // always show at least one hover icon.
138+ hoverGroup = [ 'toggleHover' ] ;
139+ }
140+ // if we have cartesian, allow switching between closest and compare
141+ // regardless of what other types are on the plot, since they'll all
142+ // just treat any truthy hovermode as 'closest'
143+ if ( hasCartesian ) {
144+ hoverGroup = [ 'toggleSpikelines' , 'hoverClosestCartesian' , 'hoverCompareCartesian' ] ;
114145 }
115146
116- var allAxesFixed = areAllAxesFixed ( fullLayout ) ,
117- dragModeGroup = [ ] ;
147+ if ( ( hasCartesian || hasGL2D ) && ! allAxesFixed ) {
148+ zoomGroup = [ 'zoomIn2d' , 'zoomOut2d' , 'autoScale2d' ] ;
149+ if ( resetGroup [ 0 ] !== 'resetViews' ) resetGroup = [ 'resetScale2d' ] ;
150+ }
118151
119- if ( ( ( hasCartesian || hasGL2D ) && ! allAxesFixed ) || hasTernary ) {
152+ if ( hasGL3D ) {
153+ dragModeGroup = [ 'zoom3d' , 'pan3d' , 'orbitRotation' , 'tableRotation' ] ;
154+ }
155+ else if ( ( ( hasCartesian || hasGL2D ) && ! allAxesFixed ) || hasTernary ) {
120156 dragModeGroup = [ 'zoom2d' , 'pan2d' ] ;
121157 }
122- if ( hasMapbox || hasGeo ) {
158+ else if ( hasMapbox || hasGeo ) {
123159 dragModeGroup = [ 'pan2d' ] ;
124160 }
125- if ( hasPolar ) {
161+ else if ( hasPolar ) {
126162 dragModeGroup = [ 'zoom2d' ] ;
127163 }
128164 if ( isSelectable ( fullData ) ) {
129- dragModeGroup . push ( 'select2d' ) ;
130- dragModeGroup . push ( 'lasso2d' ) ;
131- }
132- if ( dragModeGroup . length ) addGroup ( dragModeGroup ) ;
133-
134- if ( ( hasCartesian || hasGL2D ) && ! allAxesFixed && ! hasTernary ) {
135- addGroup ( [ 'zoomIn2d' , 'zoomOut2d' , 'autoScale2d' , 'resetScale2d' ] ) ;
165+ dragModeGroup . push ( 'select2d' , 'lasso2d' ) ;
136166 }
137167
138- if ( hasCartesian && hasPie ) {
139- addGroup ( [ 'toggleHover' ] ) ;
140- } else if ( hasGL2D ) {
141- addGroup ( [ 'hoverClosestGl2d' ] ) ;
142- } else if ( hasCartesian ) {
143- addGroup ( [ 'toggleSpikelines' , 'hoverClosestCartesian' , 'hoverCompareCartesian' ] ) ;
144- } else if ( hasPie ) {
145- addGroup ( [ 'hoverClosestPie' ] ) ;
146- } else if ( hasMapbox ) {
147- addGroup ( [ 'resetViewMapbox' , 'toggleHover' ] ) ;
148- } else if ( hasGeo ) {
149- addGroup ( [ 'zoomInGeo' , 'zoomOutGeo' , 'resetGeo' ] ) ;
150- addGroup ( [ 'hoverClosestGeo' ] ) ;
151- }
168+ addGroup ( dragModeGroup ) ;
169+ addGroup ( zoomGroup . concat ( resetGroup ) ) ;
170+ addGroup ( hoverGroup ) ;
152171
153172 return appendButtonsToGroups ( groups , buttonsToAdd ) ;
154173}
0 commit comments