Skip to content

Commit e7815e9

Browse files
committed
Transition scattermapbox trace type to new selection interface [1852]
1 parent f9494b5 commit e7815e9

File tree

3 files changed

+67
-36
lines changed

3 files changed

+67
-36
lines changed

src/plots/mapbox/mapbox.js

+17-10
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ var Fx = require('../../components/fx');
1515
var Lib = require('../../lib');
1616
var dragElement = require('../../components/dragelement');
1717
var prepSelect = require('../cartesian/select').prepSelect;
18+
var selectOnClick = require('../cartesian/select').selectOnClick;
1819
var constants = require('./constants');
1920
var layoutAttributes = require('./layout_attributes');
2021
var createMapboxLayer = require('./layers');
@@ -176,15 +177,6 @@ proto.createMap = function(calcData, fullLayout, resolve, reject) {
176177
Fx.hover(gd, evt, self.id);
177178
});
178179

179-
map.on('click', function(evt) {
180-
// TODO: this does not support right-click. If we want to support it, we
181-
// would likely need to change mapbox to use dragElement instead of straight
182-
// mapbox event binding. Or perhaps better, make a simple wrapper with the
183-
// right mousedown, mousemove, and mouseup handlers just for a left/right click
184-
// pie would use this too.
185-
Fx.click(gd, evt.originalEvent);
186-
});
187-
188180
function unhover() {
189181
Fx.loneUnhover(fullLayout._toppaper);
190182
}
@@ -221,11 +213,17 @@ proto.createMap = function(calcData, fullLayout, resolve, reject) {
221213
gd.emit('plotly_relayout', evtData);
222214
}
223215

224-
// define clear select on map creation, to keep one ref per map,
216+
// define event handlers on map creation, to keep one ref per map,
225217
// so that map.on / map.off in updateFx works as expected
226218
self.clearSelect = function() {
227219
gd._fullLayout._zoomlayer.selectAll('.select-outline').remove();
228220
};
221+
222+
self.onClickInPan = function(evt) {
223+
// TODO Add condition evaluating clickmode attr when it has been introduced
224+
selectOnClick(gd, 1, evt.originalEvent, [self.xaxis], [self.yaxis], undefined, self.id);
225+
Fx.click(gd, evt.originalEvent);
226+
};
229227
};
230228

231229
proto.updateMap = function(calcData, fullLayout, resolve, reject) {
@@ -404,10 +402,19 @@ proto.updateFx = function(fullLayout) {
404402
};
405403

406404
dragElement.init(dragOptions);
405+
406+
map.off('click', self.onClickInPan);
407407
} else {
408408
map.dragPan.enable();
409409
map.off('zoomstart', self.clearSelect);
410410
self.div.onmousedown = null;
411+
412+
// TODO: this does not support right-click. If we want to support it, we
413+
// would likely need to change mapbox to use dragElement instead of straight
414+
// mapbox event binding. Or perhaps better, make a simple wrapper with the
415+
// right mousedown, mousemove, and mouseup handlers just for a left/right click
416+
// pie would use this too.
417+
map.on('click', self.onClickInPan);
411418
}
412419
};
413420

src/traces/scattermapbox/index.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ ScatterMapbox.calc = require('../scattergeo/calc');
1818
ScatterMapbox.plot = require('./plot');
1919
ScatterMapbox.hoverPoints = require('./hover');
2020
ScatterMapbox.eventData = require('./event_data');
21-
ScatterMapbox.selectPoints = require('./select');
21+
ScatterMapbox.getPointsIn = require('./select').getPointsIn;
22+
ScatterMapbox.toggleSelected = require('./select').toggleSelected;
2223

2324
ScatterMapbox.style = function(_, cd) {
2425
if(cd) {

src/traces/scattermapbox/select.js

+48-25
Original file line numberDiff line numberDiff line change
@@ -11,43 +11,66 @@
1111
var Lib = require('../../lib');
1212
var subtypes = require('../scatter/subtypes');
1313
var BADNUM = require('../../constants/numerical').BADNUM;
14+
var arrayRange = require('array-range');
1415

15-
module.exports = function selectPoints(searchInfo, polygon) {
16+
exports.getPointsIn = function(searchInfo, polygon) {
17+
var pointsIn = [];
1618
var cd = searchInfo.cd;
1719
var xa = searchInfo.xaxis;
1820
var ya = searchInfo.yaxis;
19-
var selection = [];
2021
var trace = cd[0].trace;
2122
var i;
2223

2324
if(!subtypes.hasMarkers(trace)) return [];
2425

25-
if(polygon === false) {
26-
for(i = 0; i < cd.length; i++) {
27-
cd[i].selected = 0;
28-
}
29-
} else {
30-
for(i = 0; i < cd.length; i++) {
31-
var di = cd[i];
32-
var lonlat = di.lonlat;
33-
34-
if(lonlat[0] !== BADNUM) {
35-
var lonlat2 = [Lib.wrap180(lonlat[0]), lonlat[1]];
36-
var xy = [xa.c2p(lonlat2), ya.c2p(lonlat2)];
37-
38-
if(polygon.contains(xy)) {
39-
selection.push({
40-
pointNumber: i,
41-
lon: lonlat[0],
42-
lat: lonlat[1]
43-
});
44-
di.selected = 1;
45-
} else {
46-
di.selected = 0;
47-
}
26+
for(i = 0; i < cd.length; i++) {
27+
var di = cd[i];
28+
var lonlat = di.lonlat;
29+
30+
if(lonlat[0] !== BADNUM) {
31+
var lonlat2 = [Lib.wrap180(lonlat[0]), lonlat[1]];
32+
var xy = [xa.c2p(lonlat2), ya.c2p(lonlat2)];
33+
34+
if(polygon.contains(xy)) {
35+
pointsIn.push(i);
4836
}
4937
}
5038
}
5139

40+
return pointsIn;
41+
};
42+
43+
exports.toggleSelected = function(searchInfo, selected, pointIds) {
44+
var selection = [];
45+
var cd = searchInfo.cd;
46+
var modifyAll = !Array.isArray(pointIds);
47+
var di;
48+
var pointId;
49+
var lonlat;
50+
var i;
51+
52+
if(modifyAll) {
53+
pointIds = arrayRange(cd.length);
54+
}
55+
56+
// Mutate state
57+
for(i = 0; i < pointIds.length; i++) {
58+
pointId = pointIds[i];
59+
cd[pointId].selected = selected ? 1 : 0;
60+
}
61+
62+
// Compute selection array from internal state
63+
for(i = 0; i < cd.length; i++) {
64+
di = cd[i];
65+
if(di.selected === 1) {
66+
lonlat = di.lonlat;
67+
selection.push({
68+
pointNumber: i,
69+
lon: lonlat[0],
70+
lat: lonlat[1]
71+
});
72+
}
73+
}
74+
5275
return selection;
5376
};

0 commit comments

Comments
 (0)