Listen for geometry events and fire feature events
This commit is contained in:
+61
-2
@@ -1,7 +1,13 @@
|
|||||||
goog.provide('ol.Feature');
|
goog.provide('ol.Feature');
|
||||||
|
goog.provide('ol.FeatureEvent');
|
||||||
|
goog.provide('ol.FeatureEventType');
|
||||||
|
|
||||||
|
goog.require('goog.events');
|
||||||
|
goog.require('goog.events.Event');
|
||||||
|
goog.require('goog.events.EventType');
|
||||||
goog.require('ol.Object');
|
goog.require('ol.Object');
|
||||||
goog.require('ol.geom.Geometry');
|
goog.require('ol.geom.Geometry');
|
||||||
|
goog.require('ol.geom.GeometryEvent');
|
||||||
goog.require('ol.layer.VectorLayerRenderIntent');
|
goog.require('ol.layer.VectorLayerRenderIntent');
|
||||||
|
|
||||||
|
|
||||||
@@ -99,16 +105,44 @@ ol.Feature.prototype.getSymbolizers = function() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Listener for geometry change events.
|
||||||
|
* @param {ol.geom.GeometryEvent} evt Geometry event.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
ol.Feature.prototype.handleGeometryChange_ = function(evt) {
|
||||||
|
this.dispatchEvent(new ol.FeatureEvent(
|
||||||
|
ol.FeatureEventType.CHANGE, this, evt.oldExtent));
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @inheritDoc
|
* @inheritDoc
|
||||||
* @param {string} key Key.
|
* @param {string} key Key.
|
||||||
* @param {*} value Value.
|
* @param {*} value Value.
|
||||||
*/
|
*/
|
||||||
ol.Feature.prototype.set = function(key, value) {
|
ol.Feature.prototype.set = function(key, value) {
|
||||||
if (!goog.isDef(this.geometryName_) && (value instanceof ol.geom.Geometry)) {
|
var geometry = this.getGeometry();
|
||||||
this.geometryName_ = key;
|
var oldExtent = null;
|
||||||
|
if (goog.isDefAndNotNull(geometry)) {
|
||||||
|
oldExtent = geometry.getBounds();
|
||||||
|
if (key === this.geometryName_) {
|
||||||
|
goog.events.unlisten(geometry, goog.events.EventType.CHANGE,
|
||||||
|
this.handleGeometryChange_, false, this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (value instanceof ol.geom.Geometry) {
|
||||||
|
if (!goog.isDef(this.geometryName_)) {
|
||||||
|
this.geometryName_ = key;
|
||||||
|
}
|
||||||
|
if (key === this.geometryName_) {
|
||||||
|
goog.events.listen(value, goog.events.EventType.CHANGE,
|
||||||
|
this.handleGeometryChange_, false, this);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
goog.base(this, 'set', key, value);
|
goog.base(this, 'set', key, value);
|
||||||
|
this.dispatchEvent(new ol.FeatureEvent(
|
||||||
|
ol.FeatureEventType.CHANGE, this, oldExtent));
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -150,3 +184,28 @@ ol.Feature.prototype.setSymbolizers = function(symbolizers) {
|
|||||||
* @type {string}
|
* @type {string}
|
||||||
*/
|
*/
|
||||||
ol.Feature.DEFAULT_GEOMETRY = 'geometry';
|
ol.Feature.DEFAULT_GEOMETRY = 'geometry';
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @enum {string}
|
||||||
|
*/
|
||||||
|
ol.FeatureEventType = {
|
||||||
|
CHANGE: 'featurechange'
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor for feature events.
|
||||||
|
* @constructor
|
||||||
|
* @extends {goog.events.Event}
|
||||||
|
* @param {string} type Event type.
|
||||||
|
* @param {ol.Feature} target The target feature.
|
||||||
|
* @param {ol.Extent} oldExtent The previous geometry extent.
|
||||||
|
*/
|
||||||
|
ol.FeatureEvent = function(type, target, oldExtent) {
|
||||||
|
goog.base(this, type, target);
|
||||||
|
|
||||||
|
this.oldExtent = oldExtent;
|
||||||
|
};
|
||||||
|
goog.inherits(ol.FeatureEvent, goog.events.Event);
|
||||||
|
|||||||
@@ -155,6 +155,28 @@ describe('ol.Feature', function() {
|
|||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('triggers a featurechange event', function(done) {
|
||||||
|
var feature = new ol.Feature();
|
||||||
|
goog.events.listen(feature, 'featurechange', function(evt) {
|
||||||
|
expect(evt.target).to.be(feature);
|
||||||
|
expect(evt.oldExtent).to.be(null);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
feature.set('foo', 'bar');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('triggers a featurechange event with oldExtent', function(done) {
|
||||||
|
var feature = new ol.Feature({
|
||||||
|
geom: new ol.geom.Point([15, 30])
|
||||||
|
});
|
||||||
|
goog.events.listen(feature, 'featurechange', function(evt) {
|
||||||
|
expect(evt.target).to.be(feature);
|
||||||
|
expect(evt.oldExtent).to.eql([15, 30, 15, 30]);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
feature.setGeometry(new ol.geom.Point([1, 2]));
|
||||||
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('#setGeometry()', function() {
|
describe('#setGeometry()', function() {
|
||||||
@@ -197,11 +219,34 @@ describe('ol.Feature', function() {
|
|||||||
expect(feature.getGeometry()).to.be(point);
|
expect(feature.getGeometry()).to.be(point);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('triggers a featurechange event', function(done) {
|
||||||
|
var feature = new ol.Feature();
|
||||||
|
goog.events.listen(feature, 'featurechange', function(evt) {
|
||||||
|
expect(evt.target).to.be(feature);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
feature.setGeometry('foo', point);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('triggers a featurechange event with old extent', function(done) {
|
||||||
|
var first = new ol.geom.Point([10, 20]);
|
||||||
|
var feature = new ol.Feature({geom: first});
|
||||||
|
var second = new ol.geom.Point([20, 30]);
|
||||||
|
goog.events.listen(feature, 'featurechange', function(evt) {
|
||||||
|
expect(evt.target).to.be(feature);
|
||||||
|
expect(evt.target.getGeometry()).to.be(second);
|
||||||
|
expect(evt.oldExtent).to.eql(first.getBounds());
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
feature.setGeometry(second);
|
||||||
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
goog.require('goog.events');
|
||||||
goog.require('goog.object');
|
goog.require('goog.object');
|
||||||
goog.require('ol.Feature');
|
goog.require('ol.Feature');
|
||||||
goog.require('ol.geom.Point');
|
goog.require('ol.geom.Point');
|
||||||
|
|||||||
Reference in New Issue
Block a user