Skip to content

Commit f54a08a

Browse files
committed
persistent selections for 'scattermapbox'
- support only 'marker.opacity' until we bump mapbox-gl
1 parent 5cfadbd commit f54a08a

File tree

6 files changed

+63
-47
lines changed

6 files changed

+63
-47
lines changed

src/traces/scattermapbox/attributes.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,17 @@ module.exports = overrideAll({
107107
textfont: mapboxAttrs.layers.symbol.textfont,
108108
textposition: mapboxAttrs.layers.symbol.textposition,
109109

110+
selected: {
111+
marker: {
112+
opacity: scatterAttrs.selected.marker.opacity
113+
}
114+
},
115+
unselected: {
116+
marker: {
117+
opacity: scatterAttrs.unselected.marker.opacity
118+
}
119+
},
120+
110121
hoverinfo: extendFlat({}, plotAttrs.hoverinfo, {
111122
flags: ['lon', 'lat', 'text', 'name']
112123
})

src/traces/scattermapbox/convert.js

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -185,8 +185,15 @@ function makeCircleGeoJSON(calcTrace, hash) {
185185
sizeFn = makeBubbleSizeFn(trace);
186186
}
187187

188-
function combineOpacities(d, mo) {
189-
return trace.opacity * mo * (d.dim ? DESELECTDIM : 1);
188+
var combineOpacities;
189+
if(trace.selectedpoints) {
190+
combineOpacities = function(d, mo) {
191+
return trace.opacity * mo * (d.selected ? 1 : DESELECTDIM);
192+
};
193+
} else {
194+
combineOpacities = function(d, mo) {
195+
return trace.opacity * mo;
196+
};
190197
}
191198

192199
var opacityFn;
@@ -195,7 +202,7 @@ function makeCircleGeoJSON(calcTrace, hash) {
195202
var mo = isNumeric(d.mo) ? +Lib.constrain(d.mo, 0, 1) : 0;
196203
return combineOpacities(d, mo);
197204
};
198-
} else if(trace._hasDimmedPts) {
205+
} else if(trace.selectedpoints) {
199206
opacityFn = function(d) {
200207
return combineOpacities(d, marker.opacity);
201208
};
@@ -343,7 +350,7 @@ function calcCircleOpacity(trace, hash) {
343350
var marker = trace.marker;
344351
var out;
345352

346-
if(Array.isArray(marker.opacity) || trace._hasDimmedPts) {
353+
if(Array.isArray(marker.opacity) || trace.selectedpoints) {
347354
var vals = Object.keys(hash[OPACITY_PROP]);
348355
var stops = [];
349356

src/traces/scattermapbox/defaults.js

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,9 @@ 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-
19+
var DESELECTDIM = require('../../constants/interactions').DESELECTDIM;
2020
var attributes = require('./attributes');
2121

22-
2322
module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout) {
2423
function coerce(attr, dflt) {
2524
return Lib.coerce(traceIn, traceOut, attributes, attr, dflt);
@@ -41,7 +40,7 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout
4140
}
4241

4342
if(subTypes.hasMarkers(traceOut)) {
44-
handleMarkerDefaults(traceIn, traceOut, defaultColor, layout, coerce, {noLine: true});
43+
handleMarkerDefaults(traceIn, traceOut, defaultColor, layout, coerce, {noLine: true, noSelect: true});
4544

4645
// array marker.size and marker.color are only supported with circles
4746

@@ -53,10 +52,16 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout
5352
if(Array.isArray(marker.size)) marker.size = marker.size[0];
5453
if(Array.isArray(marker.color)) marker.color = marker.color[0];
5554
}
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);
5661
}
5762

5863
if(subTypes.hasText(traceOut)) {
59-
handleTextDefaults(traceIn, traceOut, layout, coerce);
64+
handleTextDefaults(traceIn, traceOut, layout, coerce, {noSelect: true});
6065
}
6166

6267
coerce('fill');

src/traces/scattermapbox/index.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,13 @@ ScatterMapbox.hoverPoints = require('./hover');
2020
ScatterMapbox.eventData = require('./event_data');
2121
ScatterMapbox.selectPoints = require('./select');
2222

23+
ScatterMapbox.style = function(_, cd) {
24+
if(cd) {
25+
var trace = cd[0].trace;
26+
trace._glTrace.update(cd);
27+
}
28+
};
29+
2330
ScatterMapbox.moduleType = 'trace';
2431
ScatterMapbox.name = 'scattermapbox';
2532
ScatterMapbox.basePlotModule = require('../../plots/mapbox');

src/traces/scattermapbox/select.js

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,11 @@ module.exports = function selectPoints(searchInfo, polygon) {
2020

2121
var di, lonlat, x, y, i;
2222

23-
// flag used in ./convert.js
24-
// to not insert data-driven 'circle-opacity' when we don't need to
25-
trace._hasDimmedPts = false;
26-
2723
if(!subtypes.hasMarkers(trace)) return [];
2824

2925
if(polygon === false) {
3026
for(i = 0; i < cd.length; i++) {
31-
cd[i].dim = 0;
27+
cd[i].selected = 0;
3228
}
3329
} else {
3430
for(i = 0; i < cd.length; i++) {
@@ -38,20 +34,17 @@ module.exports = function selectPoints(searchInfo, polygon) {
3834
y = ya.c2p(lonlat);
3935

4036
if(polygon.contains([x, y])) {
41-
trace._hasDimmedPts = true;
4237
selection.push({
4338
pointNumber: i,
4439
lon: lonlat[0],
4540
lat: lonlat[1]
4641
});
47-
di.dim = 0;
42+
di.selected = 1;
4843
} else {
49-
di.dim = 1;
44+
di.selected = 0;
5045
}
5146
}
5247
}
5348

54-
trace._glTrace.update(cd);
55-
5649
return selection;
5750
};

test/jasmine/tests/scattermapbox_test.js

Lines changed: 22 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -110,26 +110,14 @@ describe('scattermapbox defaults', function() {
110110
describe('scattermapbox convert', function() {
111111
'use strict';
112112

113-
function _convert(trace, selected) {
113+
function _convert(trace) {
114114
var gd = { data: [trace] };
115115
Plots.supplyDefaults(gd);
116116

117117
var fullTrace = gd._fullData[0];
118118
Plots.doCalcdata(gd, fullTrace);
119119

120120
var calcTrace = gd.calcdata[0];
121-
122-
if(selected) {
123-
var hasDimmedPts = false;
124-
125-
selected.forEach(function(v, i) {
126-
if(v) hasDimmedPts = true;
127-
calcTrace[i].dim = v;
128-
});
129-
130-
fullTrace._hasDimmedPts = hasDimmedPts;
131-
}
132-
133121
return convert(calcTrace);
134122
}
135123

@@ -226,36 +214,41 @@ describe('scattermapbox convert', function() {
226214
};
227215

228216
var specs = [{
229-
patch: {},
230-
selected: [0, 1, 1],
231-
expected: {stops: [[0, 1], [1, 0.2]], props: [0, 1, 1]}
217+
patch: {
218+
selectedpoints: [1, 2]
219+
},
220+
expected: {stops: [[0, 0.2], [1, 1]], props: [0, 1, 1]}
232221
}, {
233-
patch: {opacity: 0.5},
234-
selected: [0, 1, 1],
235-
expected: {stops: [[0, 0.5], [1, 0.1]], props: [0, 1, 1]}
222+
patch: {
223+
opacity: 0.5,
224+
selectedpoints: [1, 2]
225+
},
226+
expected: {stops: [[0, 0.1], [1, 0.5]], props: [0, 1, 1]}
236227
}, {
237228
patch: {
238-
marker: {opacity: 0.6}
229+
marker: {opacity: 0.6},
230+
selectedpoints: [1, 2]
239231
},
240-
selected: [1, 0, 1],
241-
expected: {stops: [[0, 0.12], [1, 0.6]], props: [0, 1, 0]}
232+
expected: {stops: [[0, 0.12], [1, 0.6]], props: [0, 1, 1]}
242233
}, {
243234
patch: {
244-
marker: {opacity: [0.5, 1, 0.6]}
235+
marker: {
236+
opacity: [0.5, 1, 0.6],
237+
},
238+
selectedpoints: [0, 2]
245239
},
246-
selected: [1, 0, 1],
247-
expected: {stops: [[0, 0.1], [1, 1], [2, 0.12]], props: [0, 1, 2]}
240+
expected: {stops: [[0, 0.5], [1, 0.2], [2, 0.6]], props: [0, 1, 2]}
248241
}, {
249242
patch: {
250-
marker: {opacity: [2, null, -0.6]}
243+
marker: {opacity: [2, null, -0.6]},
244+
selectedpoints: [0, 1, 2]
251245
},
252-
selected: [1, 1, 1],
253-
expected: {stops: [[0, 0.2], [1, 0]], props: [0, 1, 1]}
246+
expected: {stops: [[0, 1], [1, 0]], props: [0, 1, 1]}
254247
}];
255248

256249
specs.forEach(function(s, i) {
257250
var msg0 = '- case ' + i + ' ';
258-
var opts = _convert(Lib.extendDeep({}, _base, s.patch), s.selected);
251+
var opts = _convert(Lib.extendDeep({}, _base, s.patch));
259252

260253
expect(opts.circle.paint['circle-opacity'].stops)
261254
.toEqual(s.expected.stops, msg0 + 'stops');

0 commit comments

Comments
 (0)