Ticket #878: 878.2.patch
| File 878.2.patch, 8.0 kB (added by euzuro, 11 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 -
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(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 22 30 23 31 // DOM Elements 24 32 … … 86 94 */ 87 95 initialize: function(options) { 88 96 OpenLayers.Control.prototype.initialize.apply(this, arguments); 97 this.layerStates = []; 89 98 }, 90 99 91 100 /** … … 171 180 }, 172 181 173 182 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 174 209 /** 175 210 * Method: redraw 176 211 * Goes through and takes the current state of the Map and rebuilds the … … 181 216 * {DOMElement} A reference to the DIV DOMElement containing the control 182 217 */ 183 218 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 } 184 224 185 225 //clear out previous layers 186 226 this.clearLayersArray("base"); … … 189 229 var containsOverlays = false; 190 230 var containsBaseLayers = false; 191 231 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 192 245 var layers = this.map.layers.slice(); 193 246 if (!this.ascending) { layers.reverse(); } 194 247 for( var i = 0; i < layers.length; i++) { … … 286 339 if (!this.inputElem.disabled) { 287 340 if (this.inputElem.type == "radio") { 288 341 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); 291 343 } else { 292 344 this.inputElem.checked = !this.inputElem.checked; 293 345 this.layerSwitcher.updateMap(); … … 329 381 // set the correct visibilities for the overlays 330 382 for(var i=0; i < this.dataLayers.length; i++) { 331 383 var layerEntry = this.dataLayers[i]; 332 layerEntry.layer.setVisibility(layerEntry.inputElem.checked , true);384 layerEntry.layer.setVisibility(layerEntry.inputElem.checked); 333 385 } 334 386 335 387 }, -
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 660 660 * 661 661 * Parameters: 662 662 * newBaseLayer - {<OpenLayers.Layer>} 663 * noEvent - {Boolean}664 663 */ 665 setBaseLayer: function(newBaseLayer , noEvent) {664 setBaseLayer: function(newBaseLayer) { 666 665 var oldExtent = null; 667 666 if(this.baseLayer) { 668 667 oldExtent = this.baseLayer.getExtent(); … … 675 674 676 675 // make the old base layer invisible 677 676 if (this.baseLayer != null) { 678 this.baseLayer.setVisibility(false , noEvent);677 this.baseLayer.setVisibility(false); 679 678 } 680 679 681 680 // set new baselayer and make it visible … … 701 700 } 702 701 } 703 702 704 if ((noEvent == null) || (noEvent == false)) { 705 this.events.triggerEvent("changebaselayer"); 706 } 703 this.events.triggerEvent("changebaselayer"); 707 704 } 708 705 } 709 706 },
