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:
@@ -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"
|
||||
});
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
|
||||
/******
|
||||
*
|
||||
|
||||
@@ -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,9 +1001,19 @@
|
||||
}
|
||||
});
|
||||
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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user