Ticket #1628: 1628-r7864.B0.patch
| File 1628-r7864.B0.patch, 9.0 kB (added by ahocevar, 4 months ago) |
|---|
-
tests/Handler/Feature.html
old new 30 30 } 31 31 32 32 function test_Handler_Feature_activate(t) { 33 t.plan( 4);33 t.plan(3); 34 34 var map = new OpenLayers.Map('map'); 35 35 var control = new OpenLayers.Control(); 36 36 map.addControl(control); … … 47 47 activated = handler.activate(); 48 48 t.ok(activated, 49 49 "activate returns true if the handler was not already active"); 50 t.eq(handler.layerIndex, zIndex,51 "layerIndex property properly set");52 50 t.eq(parseInt(layer.div.style.zIndex), 53 51 map.Z_INDEX_BASE['Popup'] - 1, 54 52 "layer z-index properly adjusted"); … … 227 225 map.addControl(control); 228 226 var layer = new OpenLayers.Layer(); 229 227 map.addLayer(layer); 228 var layerIndex = parseInt(layer.div.style.zIndex); 229 230 230 var handler = new OpenLayers.Handler.Feature(control, layer); 231 231 handler.active = false; 232 232 var deactivated = handler.deactivate(); … … 234 234 "deactivate returns false if the handler was not already active"); 235 235 236 236 handler.active = true; 237 handler.layerIndex = Math.floor(Math.random() * 10);238 237 239 238 deactivated = handler.deactivate(); 240 239 t.ok(deactivated, 241 240 "deactivate returns true if the handler was active already"); 242 241 t.eq(parseInt(layer.div.style.zIndex), 243 handler.layerIndex,242 layerIndex, 244 243 "deactivate sets the layer z-index back"); 245 244 } 246 245 -
tests/manual/vector-layer-zindex.html
old new 1 <html xmlns="http://www.w3.org/1999/xhtml"> 2 <head> 3 <title>Vector Layer ZIndex Test</title> 4 <style type="text/css"> 5 body { 6 font-size: 0.8em; 7 } 8 p { 9 padding-top: 1em; 10 } 11 #map { 12 margin: 1em; 13 width: 512px; 14 height: 512px; 15 } 16 </style> 17 18 <script src="../../lib/OpenLayers.js"></script> 19 <script type="text/javascript"> 20 var map, layerA, layerB, layerV, selectControl; 21 22 function init() { 23 map = new OpenLayers.Map('map'); 24 var wmsLayer = new OpenLayers.Layer.WMS( 25 "OpenLayers WMS", 26 "http://labs.metacarta.com/wms/vmap0", 27 {layers: 'basic'} 28 ); 29 30 layerV = new OpenLayers.Layer.Vector('v'); 31 var feature = new OpenLayers.Feature.Vector( 32 new OpenLayers.Geometry.Polygon([ 33 new OpenLayers.Geometry.LinearRing([ 34 new OpenLayers.Geometry.Point(-110, 60), 35 new OpenLayers.Geometry.Point(-110, 30), 36 new OpenLayers.Geometry.Point(-80, 30), 37 new OpenLayers.Geometry.Point(-110, 60) 38 ]) 39 ]) 40 ); 41 layerV.addFeatures([feature]); 42 selectControl = new OpenLayers.Control.SelectFeature(layerV); 43 44 layerA = new OpenLayers.Layer('a', {'isBaseLayer': false}); 45 layerB = new OpenLayers.Layer.WMS( 46 'b', 'http://www2.dmsolutions.ca/cgi-bin/mswms_gmap', { 47 'layers': [ 48 'bathymetry', 'land_fn', 'park', 'drain_fn', 'drainage', 49 'prov_bound', 'fedlimit', 'rail', 'road', 'popplace' 50 ], 51 'transparent': 'true', 52 'format': 'image/png' 53 }, { 54 'reproject': false 55 }); 56 57 map.addLayers([wmsLayer, layerV, layerA, layerB]); 58 map.addControl(selectControl); 59 map.addControl(new OpenLayers.Control.MousePosition()); 60 selectControl.activate(); 61 62 map.setCenter(new OpenLayers.LonLat(-90, 20), 2); 63 } 64 65 function removeLayerA() { 66 if (OpenLayers.Util.indexOf(map.layers, layerA) > -1) { 67 map.removeLayer(layerA); 68 } 69 } 70 71 function toggleSelectControl() { 72 if (selectControl.active) { 73 selectControl.deactivate(); 74 alert("SelectFeature control deactivated.\nVector layer should be covered by other layers now."); 75 } else { 76 selectControl.activate(); 77 alert("SelectFeature control activated.\nVector layer should be on top now."); 78 } 79 } 80 </script> 81 </head> 82 <body onload="init()"> 83 <h1 id="title">Vector Layer ZIndex Test</h1> 84 <div id="map"></div> 85 <p> 86 87 The map includes one base layer (vmap0) and three overlays, namely a vector 88 layer, a fake layer with no images, and a dmsolutions layer. The overlays are 89 added to the map in this order: the vector layer, the fake layer, and the 90 dmsolutions layer. The map also includes a select feature control, which 91 when activated bumped the vector layer z-index to some high value. This 92 makes feature selection work, even though other overlays were added after 93 the vector layer. 94 95 </p> 96 <p> 97 98 If the fake layer is removed from the map (first link below), the vector layer's 99 z-index must not be reset, so the vector layer must not go under the 100 dmsolutions layer and feature selection must continue to function as 101 expected. 102 103 </p> 104 <p> 105 106 If the SelectFeature control is deactivated or activated (second link below), the 107 vector layer should change it's position in the layer stack: on top if activated, 108 covered by other layers if deactivated. 109 110 </p> 111 112 <p> 113 <a href="javascript:removeLayerA()">Remove the fake layer</a> 114 <br/><a href="javascript:toggleSelectControl()">Toggle the SelectFeature control's active status</a> 115 </p> 116 </body> 117 </html> -
lib/OpenLayers/Handler/Feature.js
old new 101 101 stopUp: true, 102 102 103 103 /** 104 * Property: layerIndex105 * {Int}106 */107 layerIndex: null,108 109 /**110 104 * Constructor: OpenLayers.Handler.Feature 111 105 * 112 106 * Parameters: … … 300 294 activate: function() { 301 295 var activated = false; 302 296 if(OpenLayers.Handler.prototype.activate.apply(this, arguments)) { 303 this.layerIndex = this.layer.div.style.zIndex; 304 this.layer.div.style.zIndex = this.map.Z_INDEX_BASE['Popup'] - 1; 297 this.moveLayerToTop(); 298 this.map.events.on({ 299 "removelayer": this.moveLayerToTop, 300 "changelayer": this.moveLayerBack, 301 scope: this 302 }); 305 303 activated = true; 306 304 } 307 305 return activated; 308 306 }, 309 307 310 308 /** 311 * Method: activate312 * Turn of the handler. Returns false if the handler was already active.309 * Method: deactivate 310 * Turn off the handler. Returns false if the handler was already active. 313 311 * 314 312 * Returns: 315 313 * {Boolean} … … 317 315 deactivate: function() { 318 316 var deactivated = false; 319 317 if(OpenLayers.Handler.prototype.deactivate.apply(this, arguments)) { 320 if (this.layer && this.layer.div) { 321 this.layer.div.style.zIndex = this.layerIndex; 322 } 318 this.moveLayerBack(); 323 319 this.feature = null; 324 320 this.lastFeature = null; 325 321 this.down = null; 326 322 this.up = null; 323 this.map.events.un({ 324 "removelayer": this.moveLayerToTop, 325 "changelayer": this.moveLayerBack, 326 scope: this 327 }); 327 328 deactivated = true; 328 329 } 329 330 return deactivated; 330 331 }, 332 333 /** 334 * Method: moveLayerToTop 335 * Moves the layer for this handler to the top, so mouse events can reach 336 * it. 337 */ 338 moveLayerToTop: function() { 339 this.layer.setZIndex(this.map.Z_INDEX_BASE['Popup'] - 1); 340 }, 341 342 /** 343 * Method: moveLayerBack 344 * Moves the layer back to the position determined by the map's layers 345 * array. 346 * @param {Object} evt 347 */ 348 moveLayerBack: function(evt) { 349 if (!evt || evt.property == "order") { 350 var index = OpenLayers.Util.indexOf(this.map.layers, this.layer); 351 this.map.setLayerZIndex(this.layer, index); 352 } 353 }, 331 354 332 355 CLASS_NAME: "OpenLayers.Handler.Feature" 333 356 });
