Fire the 'changelayer:visibility' event from layer's display method

Move the changelayer event firing logic for in / out of resolution range
from the Map class to the Layer class. Tests have been also been created
to specifically test that the display method works correctly and fires
events only when needed.
This commit is contained in:
Matt Priour
2012-10-09 11:10:55 -05:00
parent 74103ec3e0
commit f17a3c70e4
4 changed files with 60 additions and 4 deletions

View File

@@ -758,6 +758,11 @@ OpenLayers.Layer = OpenLayers.Class({
display: function(display) {
if (display != (this.div.style.display != "none")) {
this.div.style.display = (display && this.calculateInRange()) ? "block" : "none";
if(this.map){
this.map.events.triggerEvent("changelayer", {
layer: this, property: "visibility"
});
}
}
},

View File

@@ -1976,9 +1976,7 @@ OpenLayers.Map = OpenLayers.Class({
if (!inRange) {
layer.display(false);
}
this.events.triggerEvent("changelayer", {
layer: layer, property: "visibility"
});
}
if (inRange && layer.visibility) {
layer.moveTo(bounds, zoomChanged, options.dragging);

View File

@@ -858,6 +858,41 @@
"setOpacity() does not trigger changelayer if the opacity value is the same");
}
function test_display(t) {
t.plan(8);
var map, layer, log;
map = new OpenLayers.Map("map");
layer = new OpenLayers.Layer("", {
alwaysInRange: true,
visibility: true
});
map.addLayer(layer);
log = [];
map.events.register('changelayer', t, function(event) {
log.push({
layer: event.layer,
property: event.property
});
});
layer.display(false);
t.eq(layer.div.style.display, "none", "display() set layer's display style to correct value");
t.eq(layer.getVisibility(), true, "display() does not affect layer's visibility state");
t.eq(log.length, 1, "display() triggers changelayer once");
t.ok(log[0].layer == layer, "changelayer listener called with expected layer");
t.eq(log[0].property, "visibility", "changelayer listener called with expected property");
layer.visibility = false;
layer.display(true);
t.eq(layer.div.style.display, "block", "display() set layer's display style to correct value");
t.eq(layer.getVisibility(), false, "display() does not affect layer's visibility state");
// This call must not trig the event because the opacity value is the same.
log = [];
layer.display(true);
t.eq(log.length, 0, "display() does not trigger changelayer if the display value is the same");
}
/******
*

View File

@@ -977,13 +977,21 @@
}
function test_Map_moveTo(t) {
t.plan(2);
t.plan(8);
map = new OpenLayers.Map('map');
var baseLayer = new OpenLayers.Layer.WMS("Test Layer",
"http://octo.metacarta.com/cgi-bin/mapserv?",
{map: "/mapdata/vmap_wms.map", layers: "basic"},
{maxResolution: 'auto', maxExtent: new OpenLayers.Bounds(-10,-10,10,10)});
var testLayer = new OpenLayers.Layer("",{maxResolution: 0.1, minResolution: 0.03, isBaseLayer: false, visibility: true});
var log = [];
map.events.register('changelayer', t, function(event) {
log.push({
layer: event.layer,
property: event.property
});
});
baseLayer.events.on({
move: function() {
t.ok(true, "move listener called");
@@ -993,10 +1001,20 @@
}
});
map.addLayer(baseLayer);
map.addLayer(testLayer);
log = [];
var ll = new OpenLayers.LonLat(-100,-150);
map.moveTo(ll, 2);
t.ok(map.getCenter().equals(new OpenLayers.LonLat(0,0)), "safely sets out-of-bounds lonlat");
t.eq(testLayer.div.style.display, "none", "moveTo out of resolution range set layer's display style to correct value");
t.eq(log.length, 1, "Map.moveTo out of resolution range triggers changelayer once");
t.ok(log[0].layer == testLayer, "changelayer listener called with expected layer");
t.eq(log[0].property, "visibility", "changelayer listener called with expected property");
map.moveTo(new OpenLayers.LonLat(0,0), 0);
t.eq(testLayer.div.style.display, "block", "moveTo in to resolution range set layer's display style to correct value");
map.destroy();
}