OpenLayers OpenLayers

Changeset 4229

Show
Ignore:
Timestamp:
09/12/07 00:00:31 (11 months ago)
Author:
euzuro
Message:

making the layerswitcher a little smarter. Instead of fancy 'noEvent' parameters, we just keep track of the state at each redraw. When asked to redraw, we then check first to see if anything has changed before going ahead with the redraw. Also in this patch, we add a 'visibilitychanged' event to the layer's events object -- upon request by users. (Closes #878)

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/openlayers/lib/OpenLayers/Control/LayerSwitcher.js

    r4185 r4229  
    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 
     
    8795    initialize: function(options) { 
    8896        OpenLayers.Control.prototype.initialize.apply(this, arguments); 
     97        this.layerStates = []; 
    8998    }, 
    9099 
     
    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 
     
    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  
     
    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(); } 
     
    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; 
     
    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 
  • trunk/openlayers/lib/OpenLayers/Layer.js

    r4184 r4229  
    3333     * {Array(String)} Supported application event types 
    3434     */ 
    35     EVENT_TYPES: [ "loadstart", "loadend", "loadcancel"], 
     35    EVENT_TYPES: [ "loadstart", "loadend", "loadcancel", "visibilitychanged"], 
    3636         
    3737    /** 
     
    498498     * Parameters: 
    499499     * visible - {Boolean} Whether or not to display the layer (if in range) 
    500      * noEvent - {Boolean} 
    501      */ 
    502     setVisibility: function(visibility, noEvent) { 
     500     */ 
     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    }, 
  • trunk/openlayers/lib/OpenLayers/Map.js

    r4186 r4229  
    661661     * Parameters: 
    662662     * newBaseLayer - {<OpenLayers.Layer>} 
    663      * noEvent - {Boolean} 
    664      */ 
    665     setBaseLayer: function(newBaseLayer, noEvent) { 
     663     */ 
     664    setBaseLayer: function(newBaseLayer) { 
    666665        var oldExtent = null; 
    667666        if(this.baseLayer) { 
     
    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 
     
    702701                } 
    703702 
    704                 if ((noEvent == null) || (noEvent == false)) { 
    705                     this.events.triggerEvent("changebaselayer"); 
    706                 } 
     703                this.events.triggerEvent("changebaselayer"); 
    707704            }         
    708705        } 
  • trunk/openlayers/tests/Control/test_LayerSwitcher.html

    r4059 r4229  
    6666    function test_04_Control_LayerSwitcher_redraw (t) { 
    6767 
    68         t.plan( 8 ); 
     68        t.plan( 12 ); 
    6969 
    7070        map = new OpenLayers.Map('map'); 
     
    9292        t.eq(markersInput.name, markers.name, "wms correctly named"); 
    9393        t.eq(markersInput.value, markers.name, "wms correctly valued"); 
     94 
     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."); 
    94104 
    95105    } 
  • trunk/openlayers/tests/test_Layer.html

    r4059 r4229  
    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'); 
     
    140140        layermoved = false;  
    141141        layer.moveTo = function() { layermoved = true; } 
     142         
     143        layer.events.register('visibilitychanged', t, function() { 
     144            this.ok(true, "Visibility changed calls layer event."); 
     145        });     
    142146         
    143147        layer.setVisibility(false);