Hi all.<div><br></div><div>Sorry to intrude, but I had to join this list so that I could post this. I don&#39;t really know how else to post a bug at this point...</div><div><br></div><div>I&#39;ve been setting up a mapping app with a mappanel inside a container that is added as an item in a card layout that is added as an item in a border layout.</div>
<div><br></div><div>In this configuration, I&#39;ve got the state being saved using the ext cookie provider. This works fine with the map center and zoom properties, but it doesn&#39;t work with layer visibility (specifically, I needed my base layer choice to be remembered).</div>
<div><br></div><div>After many hours of hunting and chasing variables, figuring that I just didn&#39;t configure things correctly, I dug into the geoext code. In mappanel.js, the renderMap function doesn&#39;t get called in the afterRender event as I expected. If the map panel is contained in some other container (as mine is), it doesn&#39;t get rendered until that outer container is done with its layout. I suppose this is so that the map&#39;s dimensions can fit in appropriately and whatnot.</div>
<div>But, if the map is not yet renderred, then the layers are not yet bound to the map, and any attempt to restore their state using the map panel state restoration functions will fail.</div><div><br></div><div>This problem still exists in the copy of geoext 1.1 rc1 that I just downloaded.</div>
<div><br></div><div>My hack to fix it for myself was to overwrite these three items in the creation of my map panel object:</div><div><br></div><div><div>stateEvents: [&quot;aftermapmove&quot;,</div><div>                &quot;changebaselayer&quot;, // want to listen to this event, too</div>
<div>              &quot;afterlayervisibilitychange&quot;,</div><div>              &quot;afterlayeropacitychange&quot;],</div><div><br></div><div>renderMap: function() {</div><div>    var map = this.map;</div><div>    map.render(this.body.dom);</div>
<div><br></div><div>    this.layers.bind(map);</div><div><br></div><div>    if(map.layers.length &gt; 0) {</div><div>        if(this.center || this.zoom != null) {</div><div>            // both do not have to be defined</div>
<div>            map.setCenter(this.center, this.zoom);</div><div>        } else if(this.extent) {</div><div>            map.zoomToExtent(this.extent);</div><div>        } else {</div><div>            map.zoomToMaxExtent();</div>
<div>        }</div><div>    }</div><div><br></div><div>    // apply the state again, now that the map REALLY is rendered</div><div>    this.applyState(this.state);</div><div>},</div><div><br></div><div>applyState: function(state) {</div>
<div><br></div><div>    // if we get strings for state.x, state.y or state.zoom</div><div>    // OpenLayers will take care of converting them to the</div><div>    // appropriate types so we don&#39;t bother with that</div>
<div>    this.center = new OpenLayers.LonLat(state.x, state.y);</div><div>    this.zoom = state.zoom;</div><div><br></div><div>    // set layer visibility and opacity</div><div>    var i, l, layer, layerId, visibility, opacity;</div>
<div>    var layers = this.map.layers;</div><div>    for(i=0, l=layers.length; i&lt;l; i++) {</div><div>        layer = layers[i];</div><div>        layerId = this.prettyStateKeys ? <a href="http://layer.name">layer.name</a> : <a href="http://layer.id">layer.id</a>;</div>
<div>        visibility = state[&quot;visibility_&quot; + layerId];</div><div>        if(visibility !== undefined) {</div><div>            // convert to boolean</div><div>            visibility = (/^true$/i).test(visibility);</div>
<div>            if(layer.isBaseLayer) {</div><div>                if(visibility) {</div><div>                    this.map.setBaseLayer(layer);</div><div>                }</div><div>            } else {</div><div>                layer.setVisibility(visibility);</div>
<div>            }</div><div>        }</div><div>        opacity = state[&quot;opacity_&quot; + layerId];</div><div>        if(opacity !== undefined) {</div><div>            layer.setOpacity(opacity);</div><div>        }</div>
<div>    }</div><div><br></div><div>    // store the state in the mappanel object so I can call it the second time</div><div>    // for my stupid hack</div><div>    this[&quot;state&quot;] = state;</div><div>},</div><div>
<br></div><div>I don&#39;t know enough about extending objects in js to do better than that. Also, note that the code I&#39;m reusing is from geoext 1.0.</div><div><br></div><div>If this has already been addressed and fixed, I apologize.</div>
<div><br></div>-- <br><span style="font-size:13px;font-weight:bold;line-height:19px;font-family:sans-serif">γνῶθι σεαυτόν</span><br>
</div>