From c2d47cf46fb97ec7e106838f8c9906776583f0ac Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Fri, 6 Mar 2009 17:20:34 +0000 Subject: [PATCH] Making it so features with DELETE state get drawn with the 'delete' rendering intent. The default symbolizer used for the delete intent has display property set to 'none'. This means features with DELETE state will be erased (if already drawn) the next time layer.drawFeature is called. If you want to have features with DELETE state drawn in a partially opaque gray (for example), create a custom style map or change the default delete symbolizer. r=crschmidt (closes #1953) git-svn-id: http://svn.openlayers.org/trunk/openlayers@8956 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf --- lib/OpenLayers/Feature/Vector.js | 3 ++ lib/OpenLayers/Layer/Vector.js | 9 +++--- lib/OpenLayers/StyleMap.js | 8 +++-- tests/Layer/Vector.html | 52 ++++++++++++++++++++++++++++++++ 4 files changed, 66 insertions(+), 6 deletions(-) diff --git a/lib/OpenLayers/Feature/Vector.js b/lib/OpenLayers/Feature/Vector.js index d148d5eded..bd704d4cf9 100644 --- a/lib/OpenLayers/Feature/Vector.js +++ b/lib/OpenLayers/Feature/Vector.js @@ -397,5 +397,8 @@ OpenLayers.Feature.Vector.style = { hoverPointUnit: "%", pointerEvents: "visiblePainted", cursor: "inherit" + }, + 'delete': { + display: "none" } }; diff --git a/lib/OpenLayers/Layer/Vector.js b/lib/OpenLayers/Layer/Vector.js index 8fb3b37b9e..bcc965665c 100644 --- a/lib/OpenLayers/Layer/Vector.js +++ b/lib/OpenLayers/Layer/Vector.js @@ -118,7 +118,7 @@ OpenLayers.Layer.Vector = OpenLayers.Class(OpenLayers.Layer, { * {Boolean} Whether the layer is a vector layer. */ isVector: true, - + /** * APIProperty: features * {Array()} @@ -643,10 +643,11 @@ OpenLayers.Layer.Vector = OpenLayers.Class(OpenLayers.Layer, { if (!this.drawn) { return } - if (typeof style != "object") { - var renderIntent = typeof style == "string" ? - style : feature.renderIntent; + if(!style && feature.state === OpenLayers.State.DELETE) { + style = "delete"; + } + var renderIntent = style || feature.renderIntent; style = feature.style || this.style; if (!style) { style = this.styleMap.createSymbolizer(feature, renderIntent); diff --git a/lib/OpenLayers/StyleMap.js b/lib/OpenLayers/StyleMap.js index 75b880567d..757dc4c657 100644 --- a/lib/OpenLayers/StyleMap.js +++ b/lib/OpenLayers/StyleMap.js @@ -15,7 +15,7 @@ OpenLayers.StyleMap = OpenLayers.Class({ /** * Property: styles * Hash of {}, keyed by names of well known - * rendering intents (e.g. "default", "temporary", "select"). + * rendering intents (e.g. "default", "temporary", "select", "delete"). */ styles: null, @@ -46,7 +46,9 @@ OpenLayers.StyleMap = OpenLayers.Class({ "select": new OpenLayers.Style( OpenLayers.Feature.Vector.style["select"]), "temporary": new OpenLayers.Style( - OpenLayers.Feature.Vector.style["temporary"]) + OpenLayers.Feature.Vector.style["temporary"]), + "delete": new OpenLayers.Style( + OpenLayers.Feature.Vector.style["delete"]) }; // take whatever the user passed as style parameter and convert it @@ -56,6 +58,7 @@ OpenLayers.StyleMap = OpenLayers.Class({ this.styles["default"] = style; this.styles["select"] = style; this.styles["temporary"] = style; + this.styles["delete"] = style; } else if(typeof style == "object") { for(var key in style) { if(style[key] instanceof OpenLayers.Style) { @@ -69,6 +72,7 @@ OpenLayers.StyleMap = OpenLayers.Class({ this.styles["default"] = new OpenLayers.Style(style); this.styles["select"] = new OpenLayers.Style(style); this.styles["temporary"] = new OpenLayers.Style(style); + this.styles["delete"] = new OpenLayers.Style(style); break; } } diff --git a/tests/Layer/Vector.html b/tests/Layer/Vector.html index 0d61e7c66b..a32c3d5daa 100644 --- a/tests/Layer/Vector.html +++ b/tests/Layer/Vector.html @@ -243,6 +243,58 @@ layer.features = []; } + function test_deleted_state(t) { + t.plan(9); + + var map = new OpenLayers.Map("map"); + var layer = new OpenLayers.Layer.Vector(null, { + drawn: true + }); + map.addLayer(layer); + var feature = new OpenLayers.Feature.Vector( + new OpenLayers.Geometry.Point(10, 10) + ); + var log; + layer.renderer = { + drawFeature: function(f, s) { + log = { + feature: f, + style: s + }; + } + }; + + // draw feature with no state + layer.drawFeature(feature); + t.ok(log.feature === feature, "[no state] drawFeature called with correct feature"); + t.ok(log.style.display !== "none", "[no state] drawFeature called with style display not none"); + + // draw feature with delete style + feature.state = OpenLayers.State.DELETE; + layer.drawFeature(feature); + t.ok(log.feature === feature, "[delete] drawFeature called with correct feature"); + t.eq(log.style.display, "none", "[delete] drawFeature called with style display none"); + + // undelete the feature and redraw + delete feature.state; + delete feature.renderIntent; + layer.drawFeature(feature); + t.ok(log.feature === feature, "[undelete] drawFeature called with correct feature"); + t.ok(log.style.display !== "none", "[undelete] drawFeature called with style display not none"); + + // change deleted style + layer.styleMap.styles["delete"] = new OpenLayers.Style({fillOpacity: 0.1}); + + // draw feature with delete style + feature.state = OpenLayers.State.DELETE; + layer.drawFeature(feature); + t.ok(log.feature === feature, "[draw deleted] drawFeature called with correct feature"); + t.ok(log.style.display !== "none", "[draw deleted] drawFeature called with style display not none"); + t.eq(log.style.fillOpacity, 0.1,"[draw deleted] drawFeature called with correct fill opacity"); + + + } + function test_Layer_Vector_eraseFeatures(t) { t.plan(2); var layer = new OpenLayers.Layer.Vector("Test Layer");