Skip to content

Commit 1859256

Browse files
committed
add Lib.coerceSelectionMarkerOpacity
- to centralize [un]selected.marker.opacity default logic - use it across in all trace types that support selections
1 parent 2fcdb7c commit 1859256

File tree

10 files changed

+96
-33
lines changed

10 files changed

+96
-33
lines changed

Diff for: src/lib/coerce.js

+30
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ var getColorscale = require('../components/colorscale/get_scale');
1717
var colorscaleNames = Object.keys(require('../components/colorscale/scales'));
1818
var nestedProperty = require('./nested_property');
1919
var counterRegex = require('./regex').counter;
20+
var DESELECTDIM = require('../constants/interactions').DESELECTDIM;
2021

2122
exports.valObjectMeta = {
2223
data_array: {
@@ -376,6 +377,35 @@ exports.coerceHoverinfo = function(traceIn, traceOut, layoutOut) {
376377
return exports.coerce(traceIn, traceOut, attrs, 'hoverinfo', dflt);
377378
};
378379

380+
/** Coerce shortcut for [un]selected.marker.opacity,
381+
* which has special default logic, to ensure that it corresponds to the
382+
* default selection behavior while allowing to be overtaken by any other
383+
* [un]selected attribute.
384+
*
385+
* @param {object} traceOut : fullData item
386+
* @param {function} coerce : lib.coerce wrapper with implied first three arguments
387+
*/
388+
exports.coerceSelectionMarkerOpacity = function(traceOut, coerce) {
389+
if(!traceOut.marker) return;
390+
391+
var mo = traceOut.marker.opacity;
392+
var smoDflt;
393+
var usmoDflt;
394+
395+
// Don't give [un]selected.marker.opacity a default value if
396+
// marker.opacity is an array: handle this during style step.
397+
//
398+
// Only give [un]selected.marker.opacity a default value if you don't
399+
// set any other [un]selected attributes.
400+
if(!Array.isArray(mo) && !traceOut.selected && !traceOut.unselected) {
401+
smoDflt = mo;
402+
usmoDflt = DESELECTDIM * mo;
403+
}
404+
405+
coerce('selected.marker.opacity', smoDflt);
406+
coerce('unselected.marker.opacity', usmoDflt);
407+
};
408+
379409
exports.validate = function(value, opts) {
380410
var valObjectDef = exports.valObjectMeta[opts.valType];
381411

Diff for: src/lib/index.js

+1
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ lib.coerce = coerceModule.coerce;
3434
lib.coerce2 = coerceModule.coerce2;
3535
lib.coerceFont = coerceModule.coerceFont;
3636
lib.coerceHoverinfo = coerceModule.coerceHoverinfo;
37+
lib.coerceSelectionMarkerOpacity = coerceModule.coerceSelectionMarkerOpacity;
3738
lib.validate = coerceModule.validate;
3839

3940
var datesModule = require('./dates');

Diff for: src/traces/bar/defaults.js

+2
Original file line numberDiff line numberDiff line change
@@ -58,4 +58,6 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout
5858
// override defaultColor for error bars with defaultLine
5959
errorBarsSupplyDefaults(traceIn, traceOut, Color.defaultLine, {axis: 'y'});
6060
errorBarsSupplyDefaults(traceIn, traceOut, Color.defaultLine, {axis: 'x', inherit: 'y'});
61+
62+
Lib.coerceSelectionMarkerOpacity(traceOut, coerce);
6163
};

Diff for: src/traces/bar/style_defaults.js

+1-8
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
var Color = require('../../components/color');
1313
var hasColorscale = require('../../components/colorscale/has_colorscale');
1414
var colorscaleDefaults = require('../../components/colorscale/defaults');
15-
var DESELECTDIM = require('../../constants/interactions').DESELECTDIM;
1615

1716
module.exports = function handleStyleDefaults(traceIn, traceOut, coerce, defaultColor, layout) {
1817
coerce('marker.color', defaultColor);
@@ -32,13 +31,7 @@ module.exports = function handleStyleDefaults(traceIn, traceOut, coerce, default
3231
}
3332

3433
coerce('marker.line.width');
35-
36-
var mo = coerce('marker.opacity');
37-
var moEffective = Array.isArray(mo) ? 1 : mo;
38-
39-
coerce('selected.marker.opacity', moEffective);
40-
coerce('unselected.marker.opacity', DESELECTDIM * moEffective);
41-
34+
coerce('marker.opacity');
4235
coerce('selected.marker.color');
4336
coerce('unselected.marker.color');
4437
};

Diff for: src/traces/box/defaults.js

+3-4
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
var Lib = require('../../lib');
1212
var Registry = require('../../registry');
1313
var Color = require('../../components/color');
14-
var DESELECTDIM = require('../../constants/interactions').DESELECTDIM;
1514

1615
var attributes = require('./attributes');
1716

@@ -72,7 +71,7 @@ function handlePointsDefaults(traceIn, traceOut, coerce, opts) {
7271
coerce('pointpos', points === 'all' ? -1.5 : 0);
7372

7473
coerce('marker.symbol');
75-
var mo = coerce('marker.opacity');
74+
coerce('marker.opacity');
7675
coerce('marker.size');
7776
coerce('marker.color', traceOut.line.color);
7877
coerce('marker.line.color');
@@ -83,8 +82,6 @@ function handlePointsDefaults(traceIn, traceOut, coerce, opts) {
8382
coerce('marker.line.outlierwidth');
8483
}
8584

86-
coerce('selected.marker.opacity', mo);
87-
coerce('unselected.marker.opacity', DESELECTDIM * mo);
8885
coerce('selected.marker.color');
8986
coerce('unselected.marker.color');
9087
coerce('selected.marker.size');
@@ -96,6 +93,8 @@ function handlePointsDefaults(traceIn, traceOut, coerce, opts) {
9693
}
9794

9895
coerce('hoveron');
96+
97+
Lib.coerceSelectionMarkerOpacity(traceOut, coerce);
9998
}
10099

101100
module.exports = {

Diff for: src/traces/choropleth/defaults.js

+3-7
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
var Lib = require('../../lib');
1313
var colorscaleDefaults = require('../../components/colorscale/defaults');
1414
var attributes = require('./attributes');
15-
var DESELECTDIM = require('../../constants/interactions').DESELECTDIM;
1615

1716
module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout) {
1817
function coerce(attr, dflt) {
@@ -43,14 +42,11 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout
4342

4443
coerce('marker.line.color');
4544
coerce('marker.line.width');
46-
47-
var mo = coerce('marker.opacity');
48-
var moEffective = Array.isArray(mo) ? 1 : mo;
49-
50-
coerce('selected.marker.opacity', moEffective);
51-
coerce('unselected.marker.opacity', DESELECTDIM * moEffective);
45+
coerce('marker.opacity');
5246

5347
colorscaleDefaults(
5448
traceIn, traceOut, layout, coerce, {prefix: '', cLetter: 'z'}
5549
);
50+
51+
Lib.coerceSelectionMarkerOpacity(traceOut, coerce);
5652
};

Diff for: src/traces/scatter/defaults.js

+2
Original file line numberDiff line numberDiff line change
@@ -76,4 +76,6 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout
7676
errorBarsSupplyDefaults(traceIn, traceOut, defaultColor, {axis: 'x', inherit: 'y'});
7777

7878
coerce('cliponaxis');
79+
80+
Lib.coerceSelectionMarkerOpacity(traceOut, coerce);
7981
};

Diff for: src/traces/scatter/marker_defaults.js

+1-7
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
var Color = require('../../components/color');
1313
var hasColorscale = require('../../components/colorscale/has_colorscale');
1414
var colorscaleDefaults = require('../../components/colorscale/defaults');
15-
var DESELECTDIM = require('../../constants/interactions').DESELECTDIM;
1615

1716
var subTypes = require('./subtypes');
1817

@@ -33,7 +32,7 @@ module.exports = function markerDefaults(traceIn, traceOut, defaultColor, layout
3332
if(lineColor) defaultColor = lineColor;
3433

3534
coerce('marker.symbol');
36-
var mo = coerce('marker.opacity', isBubble ? 0.7 : 1);
35+
coerce('marker.opacity', isBubble ? 0.7 : 1);
3736
coerce('marker.size');
3837

3938
coerce('marker.color', defaultColor);
@@ -42,13 +41,8 @@ module.exports = function markerDefaults(traceIn, traceOut, defaultColor, layout
4241
}
4342

4443
if(!opts.noSelect) {
45-
var moEffective = Array.isArray(mo) ? 1 : mo;
46-
coerce('selected.marker.opacity', moEffective);
47-
coerce('unselected.marker.opacity', DESELECTDIM * moEffective);
48-
4944
coerce('selected.marker.color');
5045
coerce('unselected.marker.color');
51-
5246
coerce('selected.marker.size');
5347
coerce('unselected.marker.size');
5448
}

Diff for: src/traces/scattermapbox/defaults.js

+2-7
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ var handleMarkerDefaults = require('../scatter/marker_defaults');
1616
var handleLineDefaults = require('../scatter/line_defaults');
1717
var handleTextDefaults = require('../scatter/text_defaults');
1818
var handleFillColorDefaults = require('../scatter/fillcolor_defaults');
19-
var DESELECTDIM = require('../../constants/interactions').DESELECTDIM;
2019
var attributes = require('./attributes');
2120

2221
module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout) {
@@ -52,12 +51,6 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout
5251
if(Array.isArray(marker.size)) marker.size = marker.size[0];
5352
if(Array.isArray(marker.color)) marker.color = marker.color[0];
5453
}
55-
56-
// only marker.opacity for now
57-
var mo = traceOut.marker.opacity;
58-
var moEffective = Array.isArray(mo) ? 1 : mo;
59-
coerce('selected.marker.opacity', moEffective);
60-
coerce('unselected.marker.opacity', DESELECTDIM * moEffective);
6154
}
6255

6356
if(subTypes.hasText(traceOut)) {
@@ -68,6 +61,8 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout
6861
if(traceOut.fill !== 'none') {
6962
handleFillColorDefaults(traceIn, traceOut, defaultColor, coerce);
7063
}
64+
65+
Lib.coerceSelectionMarkerOpacity(traceOut, coerce);
7166
};
7267

7368
function handleLonLatDefaults(traceIn, traceOut, coerce) {

Diff for: test/jasmine/tests/scatter_test.js

+51
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,52 @@ describe('Test scatter', function() {
128128
expect(traceOut.xcalendar).toBe('coptic');
129129
expect(traceOut.ycalendar).toBe('ethiopian');
130130
});
131+
132+
describe('selected / unselected attribute containers', function() {
133+
function _supply(patch) { traceIn = Lib.extendFlat({
134+
mode: 'markers',
135+
x: [1, 2, 3],
136+
y: [2, 1, 2]
137+
}, patch);
138+
traceOut = {visible: true};
139+
supplyDefaults(traceIn, traceOut, defaultColor, layout);
140+
}
141+
142+
it('should fill in [un]selected.marker.opacity default when no other [un]selected is set', function() {
143+
_supply({});
144+
expect(traceOut.selected.marker.opacity).toBe(1);
145+
expect(traceOut.unselected.marker.opacity).toBe(0.2);
146+
147+
_supply({ marker: {opacity: 0.6} });
148+
expect(traceOut.selected.marker.opacity).toBe(0.6);
149+
expect(traceOut.unselected.marker.opacity).toBe(0.12);
150+
});
151+
152+
it('should not fill in [un]selected.marker.opacity default when some other [un]selected is set', function() {
153+
_supply({
154+
selected: {marker: {size: 20}}
155+
});
156+
expect(traceOut.selected.marker.opacity).toBeUndefined();
157+
expect(traceOut.selected.marker.size).toBe(20);
158+
expect(traceOut.unselected).toBeUndefined();
159+
160+
_supply({
161+
unselected: {marker: {color: 'red'}}
162+
});
163+
expect(traceOut.selected).toBeUndefined();
164+
expect(traceOut.unselected.marker.opacity).toBeUndefined();
165+
expect(traceOut.unselected.marker.color).toBe('red');
166+
167+
_supply({
168+
mode: 'markers+text',
169+
selected: {textfont: {color: 'blue'}}
170+
});
171+
expect(traceOut.selected.marker).toBeUndefined();
172+
expect(traceOut.selected.textfont.color).toBe('blue');
173+
expect(traceOut.unselected).toBeUndefined();
174+
});
175+
});
176+
131177
});
132178

133179
describe('isBubble', function() {
@@ -738,6 +784,11 @@ describe('scatter hoverPoints', function() {
738784
});
739785
});
740786

787+
describe('Test Scatter.style', function() {
788+
789+
790+
});
791+
741792
describe('Test scatter *clipnaxis*:', function() {
742793
afterEach(destroyGraphDiv);
743794

0 commit comments

Comments
 (0)