@@ -179,106 +179,69 @@ exports.plot = function(gd, traces, transitionOpts, makeOnCompleteCallback) {
179
179
} ;
180
180
181
181
function plotOne ( gd , plotinfo , cdSubplot , transitionOpts , makeOnCompleteCallback ) {
182
- var fullLayout = gd . _fullLayout ,
183
- modules = fullLayout . _modules ;
184
-
185
- // remove old traces, then redraw everything
186
- //
187
- // TODO: scatterlayer is manually excluded from this since it knows how
188
- // to update instead of fully removing and redrawing every time. The
189
- // remaining plot traces should also be able to do this. Once implemented,
190
- // we won't need this - which should sometimes be a big speedup.
191
- if ( plotinfo . plot ) {
192
- plotinfo . plot . selectAll ( 'g:not(.scatterlayer):not(.ohlclayer)' ) . selectAll ( 'g.trace' ) . remove ( ) ;
182
+ var fullLayout = gd . _fullLayout ;
183
+ var modules = fullLayout . _modules ;
184
+ // list of plot methods to call (this list includes plot methods of 'gone' modules)
185
+ var plotMethodsToCall = plotinfo . plotMethods || [ ] ;
186
+ // list of plot methods of visible module on this subplot
187
+ var plotMethods = [ ] ;
188
+ var i , plotMethod ;
189
+
190
+ for ( i = 0 ; i < modules . length ; i ++ ) {
191
+ var _module = modules [ i ] ;
192
+
193
+ if ( _module . basePlotModule . name === 'cartesian' ) {
194
+ plotMethod = _module . plot ;
195
+ Lib . pushUnique ( plotMethodsToCall , plotMethod ) ;
196
+ Lib . pushUnique ( plotMethods , plotMethod ) ;
197
+ }
193
198
}
194
199
195
- // plot all traces for each module at once
196
- for ( var j = 0 ; j < modules . length ; j ++ ) {
197
- var _module = modules [ j ] ;
198
-
199
- // skip over non-cartesian trace modules
200
- if ( ! _module . plot || _module . basePlotModule . name !== 'cartesian' ) continue ;
200
+ for ( i = 0 ; i < plotMethodsToCall . length ; i ++ ) {
201
+ plotMethod = plotMethodsToCall [ i ] ;
201
202
202
203
// plot all traces of this type on this subplot at once
203
- var cdModuleAndOthers = getModuleCalcData ( cdSubplot , _module ) ;
204
+ var cdModuleAndOthers = getModuleCalcData ( cdSubplot , plotMethod ) ;
204
205
var cdModule = cdModuleAndOthers [ 0 ] ;
205
206
// don't need to search the found traces again - in fact we need to NOT
206
207
// so that if two modules share the same plotter we don't double-plot
207
208
cdSubplot = cdModuleAndOthers [ 1 ] ;
208
209
209
- _module . plot ( gd , plotinfo , cdModule , transitionOpts , makeOnCompleteCallback ) ;
210
+ plotMethod ( gd , plotinfo , cdModule , transitionOpts , makeOnCompleteCallback ) ;
210
211
}
212
+
213
+ // save list of plot methods on subplot for later,
214
+ // so that they can be called to clear traces of 'gone' modules
215
+ plotinfo . plotMethods = plotMethods ;
211
216
}
212
217
213
218
exports . clean = function ( newFullData , newFullLayout , oldFullData , oldFullLayout ) {
214
- var oldModules = oldFullLayout . _modules || [ ] ;
215
- var newModules = newFullLayout . _modules || [ ] ;
216
219
var oldPlots = oldFullLayout . _plots || { } ;
217
-
218
- var hadScatter , hasScatter ;
219
- var hadOHLC , hasOHLC ;
220
- var hadGl , hasGl ;
221
- var i , k , subplotInfo , moduleName ;
220
+ var newPlots = newFullLayout . _plots || { } ;
221
+ var oldSubplotList = oldFullLayout . _subplots || { } ;
222
+ var plotinfo ;
223
+ var i , k ;
222
224
223
225
// when going from a large splom graph to something else,
224
226
// we need to clear <g subplot> so that the new cartesian subplot
225
227
// can have the correct layer ordering
226
228
if ( oldFullLayout . _hasOnlyLargeSploms && ! newFullLayout . _hasOnlyLargeSploms ) {
227
229
for ( k in oldPlots ) {
228
- subplotInfo = oldPlots [ k ] ;
229
- if ( subplotInfo . plotgroup ) subplotInfo . plotgroup . remove ( ) ;
230
+ plotinfo = oldPlots [ k ] ;
231
+ if ( plotinfo . plotgroup ) plotinfo . plotgroup . remove ( ) ;
230
232
}
231
233
}
232
234
233
- for ( i = 0 ; i < oldModules . length ; i ++ ) {
234
- moduleName = oldModules [ i ] . name ;
235
- if ( moduleName === 'scatter' ) hadScatter = true ;
236
- else if ( moduleName === 'scattergl' ) hadGl = true ;
237
- else if ( moduleName === 'ohlc' ) hadOHLC = true ;
238
- }
239
-
240
- for ( i = 0 ; i < newModules . length ; i ++ ) {
241
- moduleName = newModules [ i ] . name ;
242
- if ( moduleName === 'scatter' ) hasScatter = true ;
243
- else if ( moduleName === 'scattergl' ) hasGl = true ;
244
- else if ( moduleName === 'ohlc' ) hasOHLC = true ;
245
- }
246
-
247
- var layersToEmpty = [ ] ;
248
- if ( hadScatter && ! hasScatter ) layersToEmpty . push ( 'g.scatterlayer' ) ;
249
- if ( hadOHLC && ! hasOHLC ) layersToEmpty . push ( 'g.ohlclayer' ) ;
250
-
251
- if ( layersToEmpty . length ) {
252
- for ( var layeri = 0 ; layeri < layersToEmpty . length ; layeri ++ ) {
253
- for ( k in oldPlots ) {
254
- subplotInfo = oldPlots [ k ] ;
255
- if ( subplotInfo . plot ) {
256
- subplotInfo . plot . select ( layersToEmpty [ layeri ] )
257
- . selectAll ( 'g.trace' )
258
- . remove ( ) ;
259
- }
260
- }
261
-
262
- oldFullLayout . _infolayer . selectAll ( 'g.rangeslider-container' )
263
- . select ( layersToEmpty [ layeri ] )
264
- . selectAll ( 'g.trace' )
265
- . remove ( ) ;
266
- }
267
- }
235
+ var hadGl = ( oldFullLayout . _has && oldFullLayout . _has ( 'gl' ) ) ;
236
+ var hasGl = ( newFullLayout . _has && newFullLayout . _has ( 'gl' ) ) ;
268
237
269
238
if ( hadGl && ! hasGl ) {
270
239
for ( k in oldPlots ) {
271
- subplotInfo = oldPlots [ k ] ;
272
-
273
- if ( subplotInfo . _scene ) {
274
- subplotInfo . _scene . destroy ( ) ;
275
- }
240
+ plotinfo = oldPlots [ k ] ;
241
+ if ( plotinfo . _scene ) plotinfo . _scene . destroy ( ) ;
276
242
}
277
243
}
278
244
279
- var oldSubplotList = oldFullLayout . _subplots || { } ;
280
- var newSubplotList = newFullLayout . _subplots || { xaxis : [ ] , yaxis : [ ] } ;
281
-
282
245
// delete any titles we don't need anymore
283
246
// check if axis list has changed, and if so clear old titles
284
247
if ( oldSubplotList . xaxis && oldSubplotList . yaxis ) {
0 commit comments