OpenLayers OpenLayers

Ticket #878: 878.2.patch

File 878.2.patch, 8.0 kB (added by euzuro, 11 months ago)

coding standards, and making the layerStates items objects rather than arrays for readability

  • 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         
  • 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(Object)} Basically a copy of the "state" of the map's layers  
     25     *     the last time the control was drawn. We have this in order to avoid 
     26     *     unnecessarily redrawing the control. 
     27     */ 
     28    layerStates: null, 
     29     
    2230 
    2331  // DOM Elements 
    2432   
     
    8694     */ 
    8795    initialize: function(options) { 
    8896        OpenLayers.Control.prototype.initialize.apply(this, arguments); 
     97        this.layerStates = []; 
    8998    }, 
    9099 
    91100    /** 
     
    171180    }, 
    172181 
    173182 
     183    /** 
     184     * Method: checkRedraw 
     185     * Checks if the layer state has changed since the last redraw() call. 
     186     *  
     187     * Returns: 
     188     * {Boolean} The layer state changed since the last redraw() call.  
     189     */ 
     190    checkRedraw: function() { 
     191        var redraw = false; 
     192        if ( !this.layerStates.length || 
     193             (this.map.layers.length != this.layerStates.length) ) { 
     194            redraw = true; 
     195        } else { 
     196            for (var i=0; i < this.layerStates.length; i++) { 
     197                var layerState = this.layerStates[i]; 
     198                var layer = this.map.layers[i]; 
     199                if ( (layerState.name != layer.name) ||  
     200                     (layerState.visibility != layer.visibility) ) { 
     201                    redraw = true; 
     202                    break; 
     203                }     
     204            } 
     205        }     
     206        return redraw; 
     207    }, 
     208     
    174209    /**  
    175210     * Method: redraw 
    176211     * Goes through and takes the current state of the Map and rebuilds the 
     
    181216     * {DOMElement} A reference to the DIV DOMElement containing the control 
    182217     */   
    183218    redraw: function() { 
     219        //if the state hasn't changed since last redraw, no need  
     220        // to do anything. Just return the existing div. 
     221        if (!this.checkRedraw()) {  
     222            return this.div;  
     223        }  
    184224 
    185225        //clear out previous layers  
    186226        this.clearLayersArray("base"); 
     
    189229        var containsOverlays = false; 
    190230        var containsBaseLayers = false; 
    191231         
     232        // Save state -- for checking layer if the map state changed. 
     233        // We save this before redrawing, because in the process of redrawing 
     234        // we will trigger more visibility changes, and we want to not redraw 
     235        // and enter an infinite loop. 
     236        this.layerStates = new Array(this.map.layers.length); 
     237        for (var i = 0; i < this.map.layers.length; i++) { 
     238            var layer = this.map.layers[i]; 
     239            this.layerStates[i] = { 
     240                'name': layer.name,  
     241                'visibility': layer.visibility 
     242            }; 
     243        }     
     244 
    192245        var layers = this.map.layers.slice(); 
    193246        if (!this.ascending) { layers.reverse(); } 
    194247        for( var i = 0; i < layers.length; i++) { 
     
    286339        if (!this.inputElem.disabled) { 
    287340            if (this.inputElem.type == "radio") { 
    288341                this.inputElem.checked = true; 
    289                 this.layer.map.setBaseLayer(this.layer, true); 
    290                 this.layer.map.events.triggerEvent("changebaselayer"); 
     342                this.layer.map.setBaseLayer(this.layer); 
    291343            } else { 
    292344                this.inputElem.checked = !this.inputElem.checked; 
    293345                this.layerSwitcher.updateMap(); 
     
    329381        // set the correct visibilities for the overlays 
    330382        for(var i=0; i < this.dataLayers.length; i++) { 
    331383            var layerEntry = this.dataLayers[i];    
    332             layerEntry.layer.setVisibility(layerEntry.inputElem.checked, true); 
     384            layerEntry.layer.setVisibility(layerEntry.inputElem.checked); 
    333385        } 
    334386 
    335387    }, 
  • 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  
    660660     *  
    661661     * Parameters: 
    662662     * newBaseLayer - {<OpenLayers.Layer>} 
    663      * noEvent - {Boolean} 
    664663     */ 
    665     setBaseLayer: function(newBaseLayer, noEvent) { 
     664    setBaseLayer: function(newBaseLayer) { 
    666665        var oldExtent = null; 
    667666        if(this.baseLayer) { 
    668667            oldExtent = this.baseLayer.getExtent(); 
     
    675674 
    676675                // make the old base layer invisible  
    677676                if (this.baseLayer != null) { 
    678                     this.baseLayer.setVisibility(false, noEvent); 
     677                    this.baseLayer.setVisibility(false); 
    679678                } 
    680679 
    681680                // set new baselayer and make it visible 
     
    701700                    } 
    702701                } 
    703702 
    704                 if ((noEvent == null) || (noEvent == false)) { 
    705                     this.events.triggerEvent("changebaselayer"); 
    706                 } 
     703                this.events.triggerEvent("changebaselayer"); 
    707704            }         
    708705        } 
    709706    },