Hi list, I asked on Friday about keyMask and got it working but unfortunately it couldn't help in the end. I wanted my control to have those behaviors : - on single click : "unselect" all features, then only select the clicked feature, or only "unselect" the clicked feature if that was to one selected. - on ctrl+click : select/unselect multiple features at the same time.
I couldn't figure how to make that work with keyMask. It seemed that I would not be able to make both ways working ( click with an without ctrl key ) at the same time. So, instead I look at control.handler.evt.ctrlKey directly. See the code below if you're interested in comments about it. Alexandre /** * Class: DeleteFeature */ OpenLayers.Control.DeleteFeature = OpenLayers.Class(OpenLayers.Control, { features: null, initialize: function(layer, options) { OpenLayers.Control.prototype.initialize.apply(this, [options]); this.features = []; this.layer = layer; this.handler = new OpenLayers.Handler.Feature( this, layer, { click: this.clickFeature }//, //{ keyMask:OpenLayers.Handler.MOD_CTRL } ); }, clickFeature: function(feature) { if(this.handler.evt.ctrlKey) { // multiple features selection // if feature doesn't have a fid, destroy it if(feature.fid == undefined) { removeRoadInfoPopup(oLastHoverFeature); // HARDCODED adube oLastHoverFeature = null; // HARDCODED adube this.layer.destroyFeatures([feature]); } else if (feature.state != OpenLayers.State.DELETE){ this.features.push(feature); feature.state = OpenLayers.State.DELETE; this.layer.events.triggerEvent("afterfeaturemodified", {feature: feature}); feature.renderIntent = "select"; this.layer.drawFeature(feature); } else { this.features = OpenLayers.Util.removeItem(this.features, feature); feature.state = null; feature.renderIntent = "default"; this.layer.drawFeature(feature); } } else { // single feature selection // unselect all features but current if already selected if (this.features.length == 1 && this.features[0].fid == feature.fid){ // do nothing, this feature will be removed below } else { for(i=0; i<this.features.length; i++){ this.features[i].state = null; this.features[i].renderIntent = "default"; this.layer.drawFeature(this.features[i]); } this.features = []; } if(feature.fid == undefined) { removeRoadInfoPopup(oLastHoverFeature); // HARDCODED adube oLastHoverFeature = null; // HARDCODED adube this.layer.destroyFeatures([feature]); } else if (feature.state != OpenLayers.State.DELETE){ this.features.push(feature); feature.state = OpenLayers.State.DELETE; this.layer.events.triggerEvent("afterfeaturemodified", {feature: feature}); feature.renderIntent = "select"; this.layer.drawFeature(feature); } else { this.features = OpenLayers.Util.removeItem(this.features, feature); feature.state = null; feature.renderIntent = "default"; this.layer.drawFeature(feature); } } }, setMap: function(map) { this.handler.setMap(map); OpenLayers.Control.prototype.setMap.apply(this, arguments); }, CLASS_NAME: "OpenLayers.Control.DeleteFeature" }); -- Alexandre Dubé Mapgears www.mapgears.com _______________________________________________ Users mailing list Users@openlayers.org http://openlayers.org/mailman/listinfo/users