Skip to content

Commit 17e738c

Browse files
authored
Merge pull request #6387 from plotly/fix6382-scattermapbox-restyle
Fix `scattermapbox` update bug
2 parents 3516391 + ebbeb8a commit 17e738c

File tree

1 file changed

+87
-38
lines changed

1 file changed

+87
-38
lines changed

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

+87-38
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,12 @@ var ORDER = {
88
nonCluster: ['fill', 'line', 'circle', 'symbol'],
99
};
1010

11-
function ScatterMapbox(subplot, uid, clusterEnabled) {
11+
function ScatterMapbox(subplot, uid, clusterEnabled, isHidden) {
1212
this.type = 'scattermapbox';
1313
this.subplot = subplot;
1414
this.uid = uid;
1515
this.clusterEnabled = clusterEnabled;
16+
this.isHidden = isHidden;
1617

1718
this.sourceIds = {
1819
fill: 'source-' + uid + '-fill',
@@ -85,51 +86,96 @@ proto.update = function update(calcTrace) {
8586
var map = subplot.map;
8687
var optsAll = convert(subplot.gd, calcTrace);
8788
var below = subplot.belowLookup['trace-' + this.uid];
88-
var i, k, opts;
8989
var hasCluster = !!(trace.cluster && trace.cluster.enabled);
9090
var hadCluster = !!this.clusterEnabled;
91-
92-
if(below !== this.below) {
93-
var order = ORDER.nonCluster;
94-
95-
for(i = order.length - 1; i >= 0; i--) {
96-
k = order[i];
97-
map.removeLayer(this.layerIds[k]);
91+
var lThis = this;
92+
93+
function addCluster(noSource) {
94+
if(!noSource) lThis.addSource('circle', optsAll.circle, trace.cluster);
95+
var order = ORDER.cluster;
96+
for(var i = 0; i < order.length; i++) {
97+
var k = order[i];
98+
var opts = optsAll[k];
99+
lThis.addLayer(k, opts, below);
98100
}
99-
for(i = 0; i < order.length; i++) {
100-
k = order[i];
101-
opts = optsAll[k];
102-
this.addLayer(k, opts, below);
103-
}
104-
this.below = below;
105-
} else if(hasCluster && !hadCluster) {
106-
for(i = ORDER.nonCluster.length - 1; i >= 0; i--) {
107-
k = ORDER.nonCluster[i];
108-
map.removeLayer(this.layerIds[k]);
109-
map.removeSource(this.sourceIds[k]);
101+
}
102+
103+
function removeCluster(noSource) {
104+
var order = ORDER.cluster;
105+
for(var i = order.length - 1; i >= 0; i--) {
106+
var k = order[i];
107+
map.removeLayer(lThis.layerIds[k]);
110108
}
111-
this.addSource('circle', optsAll.circle, trace.cluster);
112-
for(i = 0; i < ORDER.cluster.length; i++) {
113-
k = ORDER.cluster[i];
114-
opts = optsAll[k];
115-
this.addLayer(k, opts, below);
109+
if(!noSource) map.removeSource(lThis.sourceIds.circle);
110+
}
111+
112+
function addNonCluster(noSource) {
113+
var order = ORDER.nonCluster;
114+
for(var i = 0; i < order.length; i++) {
115+
var k = order[i];
116+
var opts = optsAll[k];
117+
if(!noSource) lThis.addSource(k, opts);
118+
lThis.addLayer(k, opts, below);
116119
}
117-
this.clusterEnabled = hasCluster;
118-
} else if(!hasCluster && hadCluster) {
119-
for(i = 0; i < ORDER.cluster.length; i++) {
120-
k = ORDER.cluster[i];
121-
map.removeLayer(this.layerIds[k]);
120+
}
121+
122+
function removeNonCluster(noSource) {
123+
var order = ORDER.nonCluster;
124+
for(var i = order.length - 1; i >= 0; i--) {
125+
var k = order[i];
126+
map.removeLayer(lThis.layerIds[k]);
127+
if(!noSource) map.removeSource(lThis.sourceIds[k]);
122128
}
123-
map.removeSource(this.sourceIds.circle);
124-
for(i = 0; i < ORDER.nonCluster.length; i++) {
125-
k = ORDER.nonCluster[i];
126-
opts = optsAll[k];
127-
this.addSource(k, opts, trace.cluster);
128-
this.addLayer(k, opts, below);
129+
}
130+
131+
function remove(noSource) {
132+
if(hadCluster) removeCluster(noSource); else removeNonCluster(noSource);
133+
}
134+
135+
function add(noSource) {
136+
if(hasCluster) addCluster(noSource); else addNonCluster(noSource);
137+
}
138+
139+
function repaint() {
140+
var order = hasCluster ? ORDER.cluster : ORDER.nonCluster;
141+
for(var i = 0; i < order.length; i++) {
142+
var k = order[i];
143+
var opts = optsAll[k];
144+
if(!opts) continue;
145+
146+
subplot.setOptions(lThis.layerIds[k], 'setLayoutProperty', opts.layout);
147+
148+
if(opts.layout.visibility === 'visible') {
149+
if(k !== 'cluster') {
150+
lThis.setSourceData(k, opts);
151+
}
152+
subplot.setOptions(lThis.layerIds[k], 'setPaintProperty', opts.paint);
153+
}
129154
}
130-
this.clusterEnabled = hasCluster;
131155
}
132156

157+
var wasHidden = this.isHidden;
158+
var isHidden = trace.visible !== true;
159+
160+
if(isHidden) {
161+
if(!wasHidden) remove();
162+
} else if(wasHidden) {
163+
if(!isHidden) add();
164+
} else if(hadCluster !== hasCluster) {
165+
remove();
166+
add();
167+
} else if(this.below !== below) {
168+
remove(true);
169+
add(true);
170+
repaint();
171+
} else {
172+
repaint();
173+
}
174+
175+
this.clusterEnabled = hasCluster;
176+
this.isHidden = isHidden;
177+
this.below = below;
178+
133179
// link ref for quick update during selections
134180
calcTrace[0].trace._glTrace = this;
135181
};
@@ -147,10 +193,13 @@ proto.dispose = function dispose() {
147193
module.exports = function createScatterMapbox(subplot, calcTrace) {
148194
var trace = calcTrace[0].trace;
149195
var hasCluster = trace.cluster && trace.cluster.enabled;
196+
var isHidden = trace.visible !== true;
197+
150198
var scatterMapbox = new ScatterMapbox(
151199
subplot,
152200
trace.uid,
153-
hasCluster
201+
hasCluster,
202+
isHidden
154203
);
155204

156205
var optsAll = convert(subplot.gd, calcTrace);

0 commit comments

Comments
 (0)