From cb1c3a834aedea34e98fe20df112304316287004 Mon Sep 17 00:00:00 2001 From: Slawomir Messner Date: Tue, 18 Sep 2012 08:14:54 +0200 Subject: [PATCH] [New] raise feature function to move features in layer. --- lib/OpenLayers/Layer/Vector.js | 23 +++++++++++++- tests/Layer/Vector.html | 56 +++++++++++++++++++++++++++++++++- 2 files changed, 77 insertions(+), 2 deletions(-) diff --git a/lib/OpenLayers/Layer/Vector.js b/lib/OpenLayers/Layer/Vector.js index 4300e59b16..ddd2f6f4a0 100644 --- a/lib/OpenLayers/Layer/Vector.js +++ b/lib/OpenLayers/Layer/Vector.js @@ -699,7 +699,28 @@ OpenLayers.Layer.Vector = OpenLayers.Class(OpenLayers.Layer, { this.events.triggerEvent("featuresremoved", {features: features}); } }, - + + /** + * APIMethod: raiseFeature + * Changes the index of the given feature by delta and redraws the layer. If delta is positive, the feature is moved up the layer's feature stack; if delta is negative, the feature is moved down. + * If delta + current is negative it is set to 0 and feature will be at the bottom; if it is bigger then the features count than it is set to the last index and the feature will be at the top. + */ + raiseFeature:function(feature, delta) { + var base = this.features.indexOf(feature); + var idx = base + delta; + if (idx < 0) { + idx = 0; + } else if (idx > this.features.length) { + idx = this.features.length; + } + if (base != idx) { + this.features.splice(base, 1); + this.features.splice(idx, 0, feature); + this.eraseFeatures(this.features); + this.redraw(); + } + }, + /** * APIMethod: removeAllFeatures * Remove all features from the layer. diff --git a/tests/Layer/Vector.html b/tests/Layer/Vector.html index aa3e2f8a7e..2cfc9c07bd 100644 --- a/tests/Layer/Vector.html +++ b/tests/Layer/Vector.html @@ -461,7 +461,44 @@ layer.features = []; } - + function test_drawfeature_ng(t) { + t.plan(3); + var layer = new OpenLayers.Layer.Vector(); + layer.drawn = true; + var log = []; + + // Bogus layer renderer needs some methods + // for functional tests. + var renderer = { + initialize: function() {}, + drawFeature: function(feature, style) { + log.push(style); + }, + root: document.createElement("div"), + destroy: function() { }, + eraseFeatures: function() {}, + setExtent: function() {}, + setSize: function() {} + }; + var OrigRendererNG = OpenLayers.Renderer.NG; + OpenLayers.Renderer.NG = OpenLayers.Class(renderer); + + layer.renderer = new OpenLayers.Renderer.NG(); + layer.drawFeature(new OpenLayers.Feature.Vector()); + t.eq(log[0]._createSymbolizer, undefined, "no _createSymbolizer function for static styles"); + + var styleMap = new OpenLayers.StyleMap(new OpenLayers.Style({foo: "${bar}"}, + {context: {"bar": function(feature){ return "baz" }}} + )); + layer.styleMap = styleMap; + layer.drawFeature(new OpenLayers.Feature.Vector()); + t.eq(log[1]._createSymbolizer().foo, "baz", "_createSymbolizer function added to style and returns correct result"); + OpenLayers.Renderer.NG = OrigRendererNG; + + layer.renderer = renderer; + layer.drawFeature(new OpenLayers.Feature.Vector()); + t.eq(log[2]._createSymbolizer, undefined, "no _createSymbolizer function for non-NG renderer"); + } function test_deleted_state(t) { t.plan(9); @@ -869,6 +906,23 @@ "featuresadded event received expected number of features"); } + function test_raiseFeature(t) { + t.plan(4); + var map = new OpenLayers.Map('map'); + layer = new OpenLayers.Layer.Vector(""); + map.addLayer(layer); + var feature1 = new OpenLayers.Feature.Vector(new OpenLayers.Geometry(1.0, 1.0)); + var feature2 = new OpenLayers.Feature.Vector(new OpenLayers.Geometry(2.0, 2.0)); + layer.addFeatures([feature1,feature2]); + layer.raiseFeature(feature1, 1); + t.eq(layer.features.indexOf(feature1), 1, "first feature raised one up"); + layer.raiseFeature(feature1, -1); + t.eq(layer.features.indexOf(feature1), 0, "first feature raised one down"); + layer.raiseFeature(feature1, -1); + t.eq(layer.features.indexOf(feature1), 0, "feature stays at index 0 because there is no lower position than index 0."); + layer.raiseFeature(feature1, 2); + t.eq(layer.features.indexOf(feature1), 1, "first feature raised 2 up, but has index 1 because there are only two features in layer."); + }