@@ -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() {
147193module . 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