From 2b7c6cc844d45f6767a25de3f7a2e5dd3dd9e0ad Mon Sep 17 00:00:00 2001 From: euzuro Date: Thu, 5 Oct 2006 19:32:07 +0000 Subject: [PATCH] refactor range checking into map and store a state variable in layer so that we dont fire changelayer every time user zooms git-svn-id: http://svn.openlayers.org/trunk/openlayers@1606 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf --- lib/OpenLayers/Control/LayerSwitcher.js | 4 ++-- lib/OpenLayers/Layer.js | 15 ++++++++++----- lib/OpenLayers/Map.js | 9 ++++++++- 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/lib/OpenLayers/Control/LayerSwitcher.js b/lib/OpenLayers/Control/LayerSwitcher.js index d5acfa9add..43337559e1 100644 --- a/lib/OpenLayers/Control/LayerSwitcher.js +++ b/lib/OpenLayers/Control/LayerSwitcher.js @@ -130,7 +130,7 @@ OpenLayers.Control.LayerSwitcher.prototype = inputElem.layer = layer; inputElem.control = this; - if (!baseLayer && !layer.inRange()) { + if (!baseLayer && !layer.inRange) { inputElem.disabled = true; } OpenLayers.Event.observe(inputElem, "mouseup", @@ -138,7 +138,7 @@ OpenLayers.Control.LayerSwitcher.prototype = // create span var labelSpan = document.createElement("span"); - if (!baseLayer && !layer.inRange()) { + if (!baseLayer && !layer.inRange) { labelSpan.style.color = "grey"; } labelSpan.innerHTML = layer.name; diff --git a/lib/OpenLayers/Layer.js b/lib/OpenLayers/Layer.js index bcbd74328c..6683fb6249 100644 --- a/lib/OpenLayers/Layer.js +++ b/lib/OpenLayers/Layer.js @@ -47,6 +47,14 @@ OpenLayers.Layer.prototype = { */ visibility: true, + /** Whether or not the map's current resolution is within this layer's + * min/max range -- this is set in map's setCenter() whenever zoom + * changes + * + * @type Boolean + */ + inRange: false, + // OPTIONS /** @type Array */ @@ -186,10 +194,7 @@ OpenLayers.Layer.prototype = { * @param {Boolean} dragging */ moveTo:function(bounds, zoomChanged, dragging) { - if (zoomChanged) { - this.display(this.visibility && this.inRange()); - this.map.events.triggerEvent("changelayer"); - } + this.display(this.visibility && this.inRange); }, /** Set the map property for the layer. This is done through an accessor @@ -266,7 +271,7 @@ OpenLayers.Layer.prototype = { * current resolution * @type Boolean */ - inRange: function() { + calculateInRange: function() { var inRange = false; if (this.map) { var resolution = this.map.getResolution(); diff --git a/lib/OpenLayers/Map.js b/lib/OpenLayers/Map.js index 6579c5190c..8b0c31775b 100644 --- a/lib/OpenLayers/Map.js +++ b/lib/OpenLayers/Map.js @@ -691,7 +691,14 @@ OpenLayers.Map.prototype = { var bounds = this.getExtent(); for (var i = 0; i < this.layers.length; i++) { var layer = this.layers[i]; - if (zoomChanged || (layer.display && layer.inRange())) { + + var inRange = layer.calculateInRange(); + if (layer.inRange != inRange) { + layer.inRange = inRange; + this.events.triggerEvent("changelayer"); + } + + if (zoomChanged || (layer.display && layer.inRange)) { layer.moveTo(bounds, zoomChanged, dragging); } }