Skip to content

Commit d8a1654

Browse files
authoredMay 18, 2021
Merge pull request #5660 from plotly/layout-modebar
Enable & disable predefined modebar buttons via layout and template
2 parents 97254b3 + 3293097 commit d8a1654

File tree

10 files changed

+457
-58
lines changed

10 files changed

+457
-58
lines changed
 

‎src/components/modebar/attributes.js

+63
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
'use strict';
2+
3+
var constants = require('./constants');
4+
5+
module.exports = {
6+
editType: 'modebar',
7+
8+
orientation: {
9+
valType: 'enumerated',
10+
values: ['v', 'h'],
11+
dflt: 'h',
12+
editType: 'modebar',
13+
description: 'Sets the orientation of the modebar.'
14+
},
15+
bgcolor: {
16+
valType: 'color',
17+
editType: 'modebar',
18+
description: 'Sets the background color of the modebar.'
19+
},
20+
color: {
21+
valType: 'color',
22+
editType: 'modebar',
23+
description: 'Sets the color of the icons in the modebar.'
24+
},
25+
activecolor: {
26+
valType: 'color',
27+
editType: 'modebar',
28+
description: 'Sets the color of the active or hovered on icons in the modebar.'
29+
},
30+
uirevision: {
31+
valType: 'any',
32+
editType: 'none',
33+
description: [
34+
'Controls persistence of user-driven changes related to the modebar,',
35+
'including `hovermode`, `dragmode`, and `showspikes` at both the',
36+
'root level and inside subplots. Defaults to `layout.uirevision`.'
37+
].join(' ')
38+
},
39+
add: {
40+
valType: 'string',
41+
arrayOk: true,
42+
dflt: '',
43+
editType: 'modebar',
44+
description: [
45+
'Determines which predefined modebar buttons to add.',
46+
'Please note that these buttons will only be shown if they are',
47+
'compatible with all trace types used in a graph.',
48+
'Similar to `config.modeBarButtonsToAdd` option.',
49+
'This may include *' + constants.backButtons.join('*, *') + '*.'
50+
].join(' ')
51+
},
52+
remove: {
53+
valType: 'string',
54+
arrayOk: true,
55+
dflt: '',
56+
editType: 'modebar',
57+
description: [
58+
'Determines which predefined modebar buttons to remove.',
59+
'Similar to `config.modeBarButtonsToRemove` option.',
60+
'This may include *' + constants.foreButtons.join('*, *') + '*.'
61+
].join(' ')
62+
}
63+
};

‎src/components/modebar/buttons.js

+24
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ modeBarButtons.editInChartStudio = {
9292

9393
modeBarButtons.zoom2d = {
9494
name: 'zoom2d',
95+
_cat: 'zoom',
9596
title: function(gd) { return _(gd, 'Zoom'); },
9697
attr: 'dragmode',
9798
val: 'zoom',
@@ -101,6 +102,7 @@ modeBarButtons.zoom2d = {
101102

102103
modeBarButtons.pan2d = {
103104
name: 'pan2d',
105+
_cat: 'pan',
104106
title: function(gd) { return _(gd, 'Pan'); },
105107
attr: 'dragmode',
106108
val: 'pan',
@@ -110,6 +112,7 @@ modeBarButtons.pan2d = {
110112

111113
modeBarButtons.select2d = {
112114
name: 'select2d',
115+
_cat: 'select',
113116
title: function(gd) { return _(gd, 'Box Select'); },
114117
attr: 'dragmode',
115118
val: 'select',
@@ -119,6 +122,7 @@ modeBarButtons.select2d = {
119122

120123
modeBarButtons.lasso2d = {
121124
name: 'lasso2d',
125+
_cat: 'lasso',
122126
title: function(gd) { return _(gd, 'Lasso Select'); },
123127
attr: 'dragmode',
124128
val: 'lasso',
@@ -180,6 +184,7 @@ modeBarButtons.eraseshape = {
180184

181185
modeBarButtons.zoomIn2d = {
182186
name: 'zoomIn2d',
187+
_cat: 'zoomin',
183188
title: function(gd) { return _(gd, 'Zoom in'); },
184189
attr: 'zoom',
185190
val: 'in',
@@ -189,6 +194,7 @@ modeBarButtons.zoomIn2d = {
189194

190195
modeBarButtons.zoomOut2d = {
191196
name: 'zoomOut2d',
197+
_cat: 'zoomout',
192198
title: function(gd) { return _(gd, 'Zoom out'); },
193199
attr: 'zoom',
194200
val: 'out',
@@ -198,6 +204,7 @@ modeBarButtons.zoomOut2d = {
198204

199205
modeBarButtons.autoScale2d = {
200206
name: 'autoScale2d',
207+
_cat: 'autoscale',
201208
title: function(gd) { return _(gd, 'Autoscale'); },
202209
attr: 'zoom',
203210
val: 'auto',
@@ -207,6 +214,7 @@ modeBarButtons.autoScale2d = {
207214

208215
modeBarButtons.resetScale2d = {
209216
name: 'resetScale2d',
217+
_cat: 'resetscale',
210218
title: function(gd) { return _(gd, 'Reset axes'); },
211219
attr: 'zoom',
212220
val: 'reset',
@@ -216,6 +224,7 @@ modeBarButtons.resetScale2d = {
216224

217225
modeBarButtons.hoverClosestCartesian = {
218226
name: 'hoverClosestCartesian',
227+
_cat: 'hoverclosest',
219228
title: function(gd) { return _(gd, 'Show closest data on hover'); },
220229
attr: 'hovermode',
221230
val: 'closest',
@@ -226,6 +235,7 @@ modeBarButtons.hoverClosestCartesian = {
226235

227236
modeBarButtons.hoverCompareCartesian = {
228237
name: 'hoverCompareCartesian',
238+
_cat: 'hoverCompare',
229239
title: function(gd) { return _(gd, 'Compare data on hover'); },
230240
attr: 'hovermode',
231241
val: function(gd) {
@@ -309,6 +319,7 @@ function handleCartesian(gd, ev) {
309319

310320
modeBarButtons.zoom3d = {
311321
name: 'zoom3d',
322+
_cat: 'zoom',
312323
title: function(gd) { return _(gd, 'Zoom'); },
313324
attr: 'scene.dragmode',
314325
val: 'zoom',
@@ -318,6 +329,7 @@ modeBarButtons.zoom3d = {
318329

319330
modeBarButtons.pan3d = {
320331
name: 'pan3d',
332+
_cat: 'pan',
321333
title: function(gd) { return _(gd, 'Pan'); },
322334
attr: 'scene.dragmode',
323335
val: 'pan',
@@ -365,6 +377,7 @@ function handleDrag3d(gd, ev) {
365377

366378
modeBarButtons.resetCameraDefault3d = {
367379
name: 'resetCameraDefault3d',
380+
_cat: 'resetCameraDefault',
368381
title: function(gd) { return _(gd, 'Reset camera to default'); },
369382
attr: 'resetDefault',
370383
icon: Icons.home,
@@ -373,6 +386,7 @@ modeBarButtons.resetCameraDefault3d = {
373386

374387
modeBarButtons.resetCameraLastSave3d = {
375388
name: 'resetCameraLastSave3d',
389+
_cat: 'resetCameraLastSave',
376390
title: function(gd) { return _(gd, 'Reset camera to last save'); },
377391
attr: 'resetLastSave',
378392
icon: Icons.movie,
@@ -422,6 +436,7 @@ function handleCamera3d(gd, ev) {
422436

423437
modeBarButtons.hoverClosest3d = {
424438
name: 'hoverClosest3d',
439+
_cat: 'hoverclosest',
425440
title: function(gd) { return _(gd, 'Toggle show closest data on hover'); },
426441
attr: 'hovermode',
427442
val: null,
@@ -476,6 +491,7 @@ function handleHover3d(gd, ev) {
476491

477492
modeBarButtons.zoomInGeo = {
478493
name: 'zoomInGeo',
494+
_cat: 'zoomin',
479495
title: function(gd) { return _(gd, 'Zoom in'); },
480496
attr: 'zoom',
481497
val: 'in',
@@ -485,6 +501,7 @@ modeBarButtons.zoomInGeo = {
485501

486502
modeBarButtons.zoomOutGeo = {
487503
name: 'zoomOutGeo',
504+
_cat: 'zoomout',
488505
title: function(gd) { return _(gd, 'Zoom out'); },
489506
attr: 'zoom',
490507
val: 'out',
@@ -494,6 +511,7 @@ modeBarButtons.zoomOutGeo = {
494511

495512
modeBarButtons.resetGeo = {
496513
name: 'resetGeo',
514+
_cat: 'reset',
497515
title: function(gd) { return _(gd, 'Reset'); },
498516
attr: 'reset',
499517
val: null,
@@ -503,6 +521,7 @@ modeBarButtons.resetGeo = {
503521

504522
modeBarButtons.hoverClosestGeo = {
505523
name: 'hoverClosestGeo',
524+
_cat: 'hoverclosest',
506525
title: function(gd) { return _(gd, 'Toggle show closest data on hover'); },
507526
attr: 'hovermode',
508527
val: null,
@@ -538,6 +557,7 @@ function handleGeo(gd, ev) {
538557

539558
modeBarButtons.hoverClosestGl2d = {
540559
name: 'hoverClosestGl2d',
560+
_cat: 'hoverclosest',
541561
title: function(gd) { return _(gd, 'Toggle show closest data on hover'); },
542562
attr: 'hovermode',
543563
val: null,
@@ -549,6 +569,7 @@ modeBarButtons.hoverClosestGl2d = {
549569

550570
modeBarButtons.hoverClosestPie = {
551571
name: 'hoverClosestPie',
572+
_cat: 'hoverclosest',
552573
title: function(gd) { return _(gd, 'Toggle show closest data on hover'); },
553574
attr: 'hovermode',
554575
val: 'closest',
@@ -661,6 +682,7 @@ function setSpikelineVisibility(gd) {
661682

662683
modeBarButtons.resetViewMapbox = {
663684
name: 'resetViewMapbox',
685+
_cat: 'resetView',
664686
title: function(gd) { return _(gd, 'Reset view'); },
665687
attr: 'reset',
666688
icon: Icons.home,
@@ -671,6 +693,7 @@ modeBarButtons.resetViewMapbox = {
671693

672694
modeBarButtons.zoomInMapbox = {
673695
name: 'zoomInMapbox',
696+
_cat: 'zoomin',
674697
title: function(gd) { return _(gd, 'Zoom in'); },
675698
attr: 'zoom',
676699
val: 'in',
@@ -680,6 +703,7 @@ modeBarButtons.zoomInMapbox = {
680703

681704
modeBarButtons.zoomOutMapbox = {
682705
name: 'zoomOutMapbox',
706+
_cat: 'zoomout',
683707
title: function(gd) { return _(gd, 'Zoom out'); },
684708
attr: 'zoom',
685709
val: 'out',

‎src/components/modebar/constants.js

+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
'use strict';
2+
3+
var modeBarButtons = require('./buttons');
4+
var buttonList = Object.keys(modeBarButtons);
5+
6+
var DRAW_MODES = [
7+
'drawline',
8+
'drawopenpath',
9+
'drawclosedpath',
10+
'drawcircle',
11+
'drawrect',
12+
'eraseshape'
13+
];
14+
15+
var backButtons = [
16+
'v1hovermode',
17+
'hoverclosest',
18+
'hovercompare',
19+
'togglehover',
20+
'togglespikelines'
21+
].concat(DRAW_MODES);
22+
23+
var foreButtons = [];
24+
var addToForeButtons = function(b) {
25+
if(backButtons.indexOf(b._cat || b.name) !== -1) return;
26+
// for convenience add lowercase shotname e.g. zoomin as well fullname zoomInGeo
27+
var name = b.name;
28+
var _cat = (b._cat || b.name).toLowerCase();
29+
if(foreButtons.indexOf(name) === -1) foreButtons.push(name);
30+
if(foreButtons.indexOf(_cat) === -1) foreButtons.push(_cat);
31+
};
32+
buttonList.forEach(function(k) {
33+
addToForeButtons(modeBarButtons[k]);
34+
});
35+
foreButtons.sort();
36+
37+
module.exports = {
38+
DRAW_MODES: DRAW_MODES,
39+
backButtons: backButtons,
40+
foreButtons: foreButtons
41+
};

‎src/components/modebar/defaults.js

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
'use strict';
2+
3+
var Lib = require('../../lib');
4+
var Color = require('../color');
5+
var Template = require('../../plot_api/plot_template');
6+
var attributes = require('./attributes');
7+
8+
module.exports = function supplyLayoutDefaults(layoutIn, layoutOut) {
9+
var containerIn = layoutIn.modebar || {};
10+
var containerOut = Template.newContainer(layoutOut, 'modebar');
11+
12+
function coerce(attr, dflt) {
13+
return Lib.coerce(containerIn, containerOut, attributes, attr, dflt);
14+
}
15+
16+
coerce('orientation');
17+
coerce('bgcolor', Color.addOpacity(layoutOut.paper_bgcolor, 0.5));
18+
var defaultColor = Color.contrast(Color.rgb(layoutOut.modebar.bgcolor));
19+
coerce('color', Color.addOpacity(defaultColor, 0.3));
20+
coerce('activecolor', Color.addOpacity(defaultColor, 0.7));
21+
coerce('uirevision', layoutOut.uirevision);
22+
coerce('add');
23+
coerce('remove');
24+
};

‎src/components/modebar/index.js

+9-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,11 @@
11
'use strict';
22

3-
exports.manage = require('./manage');
3+
module.exports = {
4+
moduleType: 'component',
5+
name: 'modebar',
6+
7+
layoutAttributes: require('./attributes'),
8+
supplyLayoutDefaults: require('./defaults'),
9+
10+
manage: require('./manage')
11+
};

0 commit comments

Comments
 (0)
Please sign in to comment.