OpenLayers OpenLayers

Ticket #878: 878.patch

File 878.patch, 8.1 kB (added by crschmidt, 10 months ago)
  • tests/test_Layer.html

    old new  
    118118 
    119119    function test_05_Layer_visibility(t) { 
    120120 
    121         t.plan(5) 
     121        t.plan(7); 
    122122 
    123123        var layer = new OpenLayers.Layer('Test Layer'); 
    124124     
     
    140140        layermoved = false;  
    141141        layer.moveTo = function() { layermoved = true; } 
    142142         
     143        layer.events.register('visibilitychanged', t, function() { 
     144            this.ok(true, "Visibility changed calls layer event."); 
     145        });     
     146         
    143147        layer.setVisibility(false); 
    144148        t.eq(layermoved, false, "Layer didn't move when calling setvis false"); 
    145149         
    146150        layer.setVisibility(true); 
    147151        t.eq(layermoved, true, "Layer moved when calling setvis true."); 
     152 
     153         
    148154     
    149155    } 
    150156 
  • tests/Control/test_LayerSwitcher.html

    old new  
    6565 
    6666    function test_04_Control_LayerSwitcher_redraw (t) { 
    6767 
    68         t.plan( 8 ); 
     68        t.plan( 12 ); 
    6969 
    7070        map = new OpenLayers.Map('map'); 
    7171        var layer = new OpenLayers.Layer.WMS("WMS",  
     
    9292        t.eq(markersInput.name, markers.name, "wms correctly named"); 
    9393        t.eq(markersInput.value, markers.name, "wms correctly valued"); 
    9494 
     95        t.eq(false, control.checkRedraw(), "check redraw is false"); 
     96         
     97        control = new OpenLayers.Control.LayerSwitcher(); 
     98        control.redraw = function() {  
     99            t.ok(true, "redraw called when setting vis"); 
     100        } 
     101        map.addControl(control);  
     102        markers.setVisibility(false);  
     103        t.eq(control.checkRedraw(), true, "check redraw is true after changing layer and not letting redraw happen."); 
     104 
    95105    } 
    96106    function test_05_Control_LayerSwitcher_ascendingw (t) { 
    97107 
  • lib/OpenLayers/Control/LayerSwitcher.js

    old new  
    1919     */ 
    2020    activeColor: "darkblue", 
    2121     
     22    /**   
     23     * Property: layerStates  
     24     * {Array} name/visibility pairs for layers in the map. 
     25     * Used in checkRedraw. 
     26     */ 
     27    layerStates: null, 
     28     
    2229 
    2330  // DOM Elements 
    2431   
     
    8693     */ 
    8794    initialize: function(options) { 
    8895        OpenLayers.Control.prototype.initialize.apply(this, arguments); 
     96        this.layerStates = []; 
    8997    }, 
    9098 
    9199    /** 
     
    171179    }, 
    172180 
    173181 
     182    /** 
     183     * Method: checkRedraw 
     184     * Checks if the layer state has changed since the last redraw() call. 
     185     * If not, then we don't bother to redraw the layers. 
     186     */ 
     187    checkRedraw: function() { 
     188        var redraw = false; 
     189        if (this.map.layers.length != this.layerStates.length || 
     190            !this.layerStates.length) { 
     191            redraw = true; 
     192        } else { 
     193            for (var i=0; i < this.layerStates.length; i++) { 
     194                var layerState = this.layerStates[i]; 
     195                var layer = this.map.layers[i]; 
     196                if (layerState[0] != layer.name ||  
     197                    layerState[1] != layer.visibility) { 
     198                    redraw = true; 
     199                }     
     200            } 
     201        }     
     202        return redraw; 
     203    }, 
     204     
    174205    /**  
    175206     * Method: redraw 
    176207     * Goes through and takes the current state of the Map and rebuilds the 
     
    181212     * {DOMElement} A reference to the DIV DOMElement containing the control 
    182213     */   
    183214    redraw: function() { 
     215        if (!this.checkRedraw()) { return this.div; }  
    184216 
    185217        //clear out previous layers  
    186218        this.clearLayersArray("base"); 
     
    189221        var containsOverlays = false; 
    190222        var containsBaseLayers = false; 
    191223         
     224        // Save state -- for checking layer if the map state changed. 
     225        // We save this before redrawing, because in the process of redrawing 
     226        // we will trigger more visibility changes, and we want to not redraw 
     227        // and enter an infinite loop. 
     228        this.layerStates = new Array(this.map.layers.length); 
     229        for (var i = 0; i < this.map.layers.length; i++) { 
     230            var layer = this.map.layers[i]; 
     231            this.layerStates[i] = [layer.name, layer.visibility]; 
     232        }     
     233 
    192234        var layers = this.map.layers.slice(); 
    193235        if (!this.ascending) { layers.reverse(); } 
    194236        for( var i = 0; i < layers.length; i++) { 
     
    263305        this.dataLbl.style.display = (containsOverlays) ? "" : "none";         
    264306         
    265307        // if no baselayers, dont display the baselayer label 
    266         this.baseLbl.style.display = (containsBaseLayers) ? "" : "none";         
     308        this.baseLbl.style.display = (containsBaseLayers) ? "" : "none"; 
    267309 
    268310        return this.div; 
    269311    }, 
     
    286328        if (!this.inputElem.disabled) { 
    287329            if (this.inputElem.type == "radio") { 
    288330                this.inputElem.checked = true; 
    289                 this.layer.map.setBaseLayer(this.layer, true); 
    290                 this.layer.map.events.triggerEvent("changebaselayer"); 
     331                this.layer.map.setBaseLayer(this.layer); 
    291332            } else { 
    292333                this.inputElem.checked = !this.inputElem.checked; 
    293334                this.layerSwitcher.updateMap(); 
     
    329370        // set the correct visibilities for the overlays 
    330371        for(var i=0; i < this.dataLayers.length; i++) { 
    331372            var layerEntry = this.dataLayers[i];    
    332             layerEntry.layer.setVisibility(layerEntry.inputElem.checked, true); 
     373            layerEntry.layer.setVisibility(layerEntry.inputElem.checked); 
    333374        } 
    334375 
    335376    }, 
  • lib/OpenLayers/Layer.js

    old new  
    3232     * Constant: EVENT_TYPES 
    3333     * {Array(String)} Supported application event types 
    3434     */ 
    35     EVENT_TYPES: [ "loadstart", "loadend", "loadcancel"], 
     35    EVENT_TYPES: [ "loadstart", "loadend", "loadcancel", "visibilitychanged"], 
    3636         
    3737    /** 
    3838     * APIProperty: events`` 
     
    497497     *  
    498498     * Parameters: 
    499499     * visible - {Boolean} Whether or not to display the layer (if in range) 
    500      * noEvent - {Boolean} 
    501500     */ 
    502     setVisibility: function(visibility, noEvent) { 
     501    setVisibility: function(visibility) { 
    503502        if (visibility != this.visibility) { 
    504503            this.visibility = visibility; 
    505504            this.display(visibility); 
    506505            this.redraw(); 
    507             if ((this.map != null) &&  
    508                 ((noEvent == null) || (noEvent == false))) { 
     506            if (this.map != null) { 
    509507                this.map.events.triggerEvent("changelayer"); 
    510508            } 
     509            this.events.triggerEvent("visibilitychanged"); 
    511510        } 
    512511    }, 
    513512 
  • lib/OpenLayers/Map.js

    old new  
    662662     * newBaseLayer - {<OpenLayers.Layer>} 
    663663     * noEvent - {Boolean} 
    664664     */ 
    665     setBaseLayer: function(newBaseLayer, noEvent) { 
     665    setBaseLayer: function(newBaseLayer) { 
    666666        var oldExtent = null; 
    667667        if(this.baseLayer) { 
    668668            oldExtent = this.baseLayer.getExtent(); 
     
    675675 
    676676                // make the old base layer invisible  
    677677                if (this.baseLayer != null) { 
    678                     this.baseLayer.setVisibility(false, noEvent); 
     678                    this.baseLayer.setVisibility(false); 
    679679                } 
    680680 
    681681                // set new baselayer and make it visible 
     
    701701                    } 
    702702                } 
    703703 
    704                 if ((noEvent == null) || (noEvent == false)) { 
    705                     this.events.triggerEvent("changebaselayer"); 
    706                 } 
     704                this.events.triggerEvent("changebaselayer"); 
    707705            }         
    708706        } 
    709707    },