Ticket #3041 (new feature)

Opened 2 years ago

Last modified 2 years ago

event after selection with box

Reported by: travin Owned by:
Priority: minor Milestone: 2.13 Release
Component: general Version: 2.10
Keywords: Cc:
State:

Description

I'm using following feature:

new OpenLayers.Control.SelectFeature(wfsLayer, {
   box: true
});

When I select features with a box, I can wait for the 'featureselected' event, but in my case I need an event triggered when all feateres in the box have been selected. So I added the following event to OpenLayers.Layer.Vector: 'allfeaturesselectedwithbox'. I pass the following object to the event:

{
    features: //all selected features of the layer
}

I needed two code changes for this: 1: I added the event to EVENT_TYPES 2: in changed the method selectBox

selectBox: function(position) {
        if (position instanceof OpenLayers.Bounds) {
            var minXY = this.map.getLonLatFromPixel(
                new OpenLayers.Pixel(position.left, position.bottom)
            );
            var maxXY = this.map.getLonLatFromPixel(
                new OpenLayers.Pixel(position.right, position.top)
            );
            var bounds = new OpenLayers.Bounds(
                minXY.lon, minXY.lat, maxXY.lon, maxXY.lat
            );
            
            // if multiple is false, first deselect currently selected features
            if (!this.multipleSelect()) {
                this.unselectAll();
            }
            
            // because we're using a box, we consider we want multiple selection
            var prevMultiple = this.multiple;
            this.multiple = true;
            var layers = this.layers || [this.layer];
            var layer;
            for(var l=0; l<layers.length; ++l) {
                layer = layers[l];
                for(var i=0, len = layer.features.length; i<len; ++i) {
                    var feature = layer.features[i];
                    // check if the feature is displayed
                    if (!feature.getVisibility()) {
                        continue;
                    }

                    if (this.geometryTypes == null || OpenLayers.Util.indexOf(
                            this.geometryTypes, feature.geometry.CLASS_NAME) > -1) {
                        if (bounds.toGeometry().intersects(feature.geometry)) {
                            if (OpenLayers.Util.indexOf(layer.selectedFeatures, feature) == -1) {
                                this.select(feature);
                            }
                        }
                    }
                }

                // MY FIX
               layer.events.triggerEvent("allfeaturesselectedwithbox", {
                    features: layer.selectedFeatures
                });
                // END MY FIX
            }
            this.multiple = prevMultiple;
        }
    }

It's an easy feature, but I thought it could be useful for other developers.

Change History

Changed 2 years ago by jorix

  • cc xavier.mamano@… added

This is done, see #2907

Changed 2 years ago by jorix

Oops! see #2781 The work is done, the patch is not yet implemented.

Changed 2 years ago by jorix

  • cc xavier.mamano@… removed
Note: See TracTickets for help on using tickets.