[OpenLayers-Users] DeleteFeature.js --> on click and ctrl+click
Alexandre Dube
adube at mapgears.com
Mon Nov 24 15:05:16 EST 2008
Daniel told me something I wanted to add : the correct and more standard
behavior should looks like this :
- on single click : "unselect" all features, then only select the
clicked feature
- on ctrl+click : select/unselect multiple features at the same time.
See changes below, if interested.
Alexandre
...
} else { // single feature selection
// unselect all features
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) {
...
Alexandre Dube wrote:
> 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
More information about the Users
mailing list