@@ -21,29 +21,6 @@ var anchorUtils = require('../legend/anchor_utils');
21
21
22
22
var constants = require ( './constants' ) ;
23
23
24
- function computeBindings ( gd , menuOpts ) {
25
- var bindings = [ ] , newBindings ;
26
- var buttons = menuOpts . buttons ;
27
- for ( var i = 0 ; i < buttons . length ; i ++ ) {
28
- newBindings = Plots . computeAPICommandBindings ( gd , buttons [ i ] . method , buttons [ i ] . args ) ;
29
-
30
- if ( i > 0 && ! Plots . bindingsAreConsistent ( bindings , newBindings ) ) {
31
- bindings = null ;
32
- break ;
33
- }
34
-
35
- for ( var j = 0 ; j < newBindings . length ; j ++ ) {
36
- var b = newBindings [ j ] ;
37
-
38
- if ( bindings . indexOf ( b ) === - 1 ) {
39
- bindings . push ( b ) ;
40
- }
41
- }
42
- }
43
-
44
- return bindings ;
45
- }
46
-
47
24
module . exports = function draw ( gd ) {
48
25
var fullLayout = gd . _fullLayout ,
49
26
menuData = makeMenuData ( fullLayout ) ;
@@ -137,7 +114,12 @@ module.exports = function draw(gd) {
137
114
headerGroups . each ( function ( menuOpts ) {
138
115
var gHeader = d3 . select ( this ) ;
139
116
140
- computeBindings ( gd , menuOpts ) ;
117
+ if ( ! menuOpts . _commandObserver ) {
118
+ var _gButton = menuOpts . type === 'dropdown' ? gButton : null ;
119
+ menuOpts . _commandObserver = Plots . createCommandObserver ( gd , menuOpts . buttons , function ( data ) {
120
+ setActive ( gd , menuOpts , menuOpts . buttons [ data . index ] , gHeader , _gButton , data . index , true ) ;
121
+ } ) ;
122
+ }
141
123
142
124
if ( menuOpts . type === 'dropdown' ) {
143
125
drawHeader ( gd , gHeader , gButton , menuOpts ) ;
@@ -317,17 +299,7 @@ function drawButtons(gd, gHeader, gButton, menuOpts) {
317
299
. call ( setItemPosition , menuOpts , posOpts ) ;
318
300
319
301
button . on ( 'click' , function ( ) {
320
- // update 'active' attribute in menuOpts
321
- menuOpts . _input . active = menuOpts . active = buttonIndex ;
322
-
323
- // fold up buttons and redraw header
324
- gButton . attr ( constants . menuIndexAttrName , '-1' ) ;
325
-
326
- if ( menuOpts . type === 'dropdown' ) {
327
- drawHeader ( gd , gHeader , gButton , menuOpts ) ;
328
- }
329
-
330
- drawButtons ( gd , gHeader , gButton , menuOpts ) ;
302
+ setActive ( gd , menuOpts , buttonOpts , gHeader , gButton , buttonIndex ) ;
331
303
332
304
// call button method
333
305
var args = buttonOpts . args ;
@@ -350,6 +322,22 @@ function drawButtons(gd, gHeader, gButton, menuOpts) {
350
322
Lib . setTranslate ( gButton , menuOpts . lx , menuOpts . ly ) ;
351
323
}
352
324
325
+ function setActive ( gd , menuOpts , buttonOpts , gHeader , gButton , buttonIndex , isSilentUpdate ) {
326
+ // update 'active' attribute in menuOpts
327
+ menuOpts . _input . active = menuOpts . active = buttonIndex ;
328
+
329
+ if ( menuOpts . type === 'dropdown' ) {
330
+ // fold up buttons and redraw header
331
+ gButton . attr ( constants . menuIndexAttrName , '-1' ) ;
332
+
333
+ drawHeader ( gd , gHeader , gButton , menuOpts ) ;
334
+ }
335
+
336
+ if ( ! isSilentUpdate || menuOpts . type === 'buttons' ) {
337
+ drawButtons ( gd , gHeader , gButton , menuOpts ) ;
338
+ }
339
+ }
340
+
353
341
function drawItem ( item , menuOpts , itemOpts ) {
354
342
item . call ( drawItemRect , menuOpts )
355
343
. call ( drawItemText , menuOpts , itemOpts ) ;
0 commit comments