[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