Ticket #878: 878.patch
| File 878.patch, 8.1 kB (added by crschmidt, 10 months ago) |
|---|
-
tests/test_Layer.html
old new 118 118 119 119 function test_05_Layer_visibility(t) { 120 120 121 t.plan( 5)121 t.plan(7); 122 122 123 123 var layer = new OpenLayers.Layer('Test Layer'); 124 124 … … 140 140 layermoved = false; 141 141 layer.moveTo = function() { layermoved = true; } 142 142 143 layer.events.register('visibilitychanged', t, function() { 144 this.ok(true, "Visibility changed calls layer event."); 145 }); 146 143 147 layer.setVisibility(false); 144 148 t.eq(layermoved, false, "Layer didn't move when calling setvis false"); 145 149 146 150 layer.setVisibility(true); 147 151 t.eq(layermoved, true, "Layer moved when calling setvis true."); 152 153 148 154 149 155 } 150 156 -
tests/Control/test_LayerSwitcher.html
old new 65 65 66 66 function test_04_Control_LayerSwitcher_redraw (t) { 67 67 68 t.plan( 8);68 t.plan( 12 ); 69 69 70 70 map = new OpenLayers.Map('map'); 71 71 var layer = new OpenLayers.Layer.WMS("WMS", … … 92 92 t.eq(markersInput.name, markers.name, "wms correctly named"); 93 93 t.eq(markersInput.value, markers.name, "wms correctly valued"); 94 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."); 104 95 105 } 96 106 function test_05_Control_LayerSwitcher_ascendingw (t) { 97 107 -
lib/OpenLayers/Control/LayerSwitcher.js
old new 19 19 */ 20 20 activeColor: "darkblue", 21 21 22 /** 23 * Property: layerStates 24 * {Array} name/visibility pairs for layers in the map. 25 * Used in checkRedraw. 26 */ 27 layerStates: null, 28 22 29 23 30 // DOM Elements 24 31 … … 86 93 */ 87 94 initialize: function(options) { 88 95 OpenLayers.Control.prototype.initialize.apply(this, arguments); 96 this.layerStates = []; 89 97 }, 90 98 91 99 /** … … 171 179 }, 172 180 173 181 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 174 205 /** 175 206 * Method: redraw 176 207 * Goes through and takes the current state of the Map and rebuilds the … … 181 212 * {DOMElement} A reference to the DIV DOMElement containing the control 182 213 */ 183 214 redraw: function() { 215 if (!this.checkRedraw()) { return this.div; } 184 216 185 217 //clear out previous layers 186 218 this.clearLayersArray("base"); … … 189 221 var containsOverlays = false; 190 222 var containsBaseLayers = false; 191 223 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 192 234 var layers = this.map.layers.slice(); 193 235 if (!this.ascending) { layers.reverse(); } 194 236 for( var i = 0; i < layers.length; i++) { … … 263 305 this.dataLbl.style.display = (containsOverlays) ? "" : "none"; 264 306 265 307 // if no baselayers, dont display the baselayer label 266 this.baseLbl.style.display = (containsBaseLayers) ? "" : "none"; 308 this.baseLbl.style.display = (containsBaseLayers) ? "" : "none"; 267 309 268 310 return this.div; 269 311 }, … … 286 328 if (!this.inputElem.disabled) { 287 329 if (this.inputElem.type == "radio") { 288 330 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); 291 332 } else { 292 333 this.inputElem.checked = !this.inputElem.checked; 293 334 this.layerSwitcher.updateMap(); … … 329 370 // set the correct visibilities for the overlays 330 371 for(var i=0; i < this.dataLayers.length; i++) { 331 372 var layerEntry = this.dataLayers[i]; 332 layerEntry.layer.setVisibility(layerEntry.inputElem.checked , true);373 layerEntry.layer.setVisibility(layerEntry.inputElem.checked); 333 374 } 334 375 335 376 }, -
lib/OpenLayers/Layer.js
old new 32 32 * Constant: EVENT_TYPES 33 33 * {Array(String)} Supported application event types 34 34 */ 35 EVENT_TYPES: [ "loadstart", "loadend", "loadcancel" ],35 EVENT_TYPES: [ "loadstart", "loadend", "loadcancel", "visibilitychanged"], 36 36 37 37 /** 38 38 * APIProperty: events`` … … 497 497 * 498 498 * Parameters: 499 499 * visible - {Boolean} Whether or not to display the layer (if in range) 500 * noEvent - {Boolean}501 500 */ 502 setVisibility: function(visibility , noEvent) {501 setVisibility: function(visibility) { 503 502 if (visibility != this.visibility) { 504 503 this.visibility = visibility; 505 504 this.display(visibility); 506 505 this.redraw(); 507 if ((this.map != null) && 508 ((noEvent == null) || (noEvent == false))) { 506 if (this.map != null) { 509 507 this.map.events.triggerEvent("changelayer"); 510 508 } 509 this.events.triggerEvent("visibilitychanged"); 511 510 } 512 511 }, 513 512 -
lib/OpenLayers/Map.js
old new 662 662 * newBaseLayer - {<OpenLayers.Layer>} 663 663 * noEvent - {Boolean} 664 664 */ 665 setBaseLayer: function(newBaseLayer , noEvent) {665 setBaseLayer: function(newBaseLayer) { 666 666 var oldExtent = null; 667 667 if(this.baseLayer) { 668 668 oldExtent = this.baseLayer.getExtent(); … … 675 675 676 676 // make the old base layer invisible 677 677 if (this.baseLayer != null) { 678 this.baseLayer.setVisibility(false , noEvent);678 this.baseLayer.setVisibility(false); 679 679 } 680 680 681 681 // set new baselayer and make it visible … … 701 701 } 702 702 } 703 703 704 if ((noEvent == null) || (noEvent == false)) { 705 this.events.triggerEvent("changebaselayer"); 706 } 704 this.events.triggerEvent("changebaselayer"); 707 705 } 708 706 } 709 707 },
