diff --git a/lib/OpenLayers/Layer/Google.js b/lib/OpenLayers/Layer/Google.js index 9dd8b01152..71bcdcc2a7 100644 --- a/lib/OpenLayers/Layer/Google.js +++ b/lib/OpenLayers/Layer/Google.js @@ -263,7 +263,10 @@ OpenLayers.Layer.Google = OpenLayers.Class( */ setVisibility: function(visible) { this.setGMapVisibility(visible); + // sharing a map container, opacity has to be set per layer + var opacity = this.opacity == null ? 1 : this.opacity; OpenLayers.Layer.EventPane.prototype.setVisibility.apply(this, arguments); + this.setOpacity(opacity); }, /** @@ -303,6 +306,33 @@ OpenLayers.Layer.Google = OpenLayers.Class( } }, + /** + * APIMethod: setOpacity + * Sets the opacity for the entire layer (all images) + * + * Parameter: + * opacity - {Float} + */ + setOpacity: function(opacity) { + if (opacity !== this.opacity) { + if (this.map != null) { + this.map.events.triggerEvent("changelayer", { + layer: this, + property: "opacity" + }); + } + this.opacity = opacity; + } + // Though this layer's opacity may not change, we're sharing a container + // and need to update the opacity for the entire container. + if (this.getVisibility()) { + var container = this.mapObject.getContainer(); + OpenLayers.Util.modifyDOMElement( + container, null, null, null, null, null, null, opacity + ); + } + }, + /** * APIMethod: destroy * Clean up this layer. diff --git a/tests/Layer/Google.html b/tests/Layer/Google.html index 9961e2b631..e2fb1fdbaa 100644 --- a/tests/Layer/Google.html +++ b/tests/Layer/Google.html @@ -234,7 +234,57 @@ t.debug_print("Google tests can't be run from " + window.location.host); } - } + } + + function test_setOpacity(t) { + + t.plan(6); + + var map = new OpenLayers.Map("map"); + var gmap = new OpenLayers.Layer.Google( + "Google Streets", // the default + {numZoomLevels: 20} + ); + var ghyb = new OpenLayers.Layer.Google( + "Google Hybrid", + {type: G_HYBRID_MAP, numZoomLevels: 20} + ); + var gsat = new OpenLayers.Layer.Google( + "Google Satellite", + {type: G_SATELLITE_MAP, numZoomLevels: 22} + ); + map.addLayers([gmap, ghyb, gsat]); + map.zoomToMaxExtent(); + + var container = map.baseLayer.mapObject.getContainer(); + var opacityCheck = function(opacity) { + var style = container.style; + var current = style.opacity === "" ? 1 : parseFloat(style.opacity); + if (style.filter && !style.opacity) { + current = Number(style.filter.replace(/alpha\(opacity=(.+?)\)/, "$1")); + } + return (current === opacity); + }; + + gmap.setOpacity(0.5); + t.ok(opacityCheck(0.5), "container opacity set for visible layer"); + + ghyb.setOpacity(0.75); + t.ok(opacityCheck(0.5), "container opacity not changed if layer not visible"); + map.setBaseLayer(ghyb); + t.ok(opacityCheck(0.75), "container opacity changed to 0.75 when layer becomes visible"); + + map.setBaseLayer(gsat); + t.ok(opacityCheck(1), "container opacity set to 1 by default"); + gsat.setOpacity(0.25); + t.ok(opacityCheck(0.25), "container opacity changed to 0.25 for visible layer"); + + map.setBaseLayer(gmap); + t.ok(opacityCheck(0.5), "container opacity set to layer opacity"); + + map.destroy(); + + } function test_Layer_Google_setGMapVisibility(t) { if(validkey) {