From adf99d592ab8bef51f5d6a7de71f0b9004201f28 Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Thu, 3 Oct 2013 14:21:15 -0600 Subject: [PATCH] Listen for geometry events and fire feature events --- src/ol/feature.js | 63 ++++++++++++++++++++++++++++++++++-- test/spec/ol/feature.test.js | 45 ++++++++++++++++++++++++++ 2 files changed, 106 insertions(+), 2 deletions(-) diff --git a/src/ol/feature.js b/src/ol/feature.js index 97e7300aca..424a04ddf6 100644 --- a/src/ol/feature.js +++ b/src/ol/feature.js @@ -1,7 +1,13 @@ 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.geom.Geometry'); +goog.require('ol.geom.GeometryEvent'); 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 * @param {string} key Key. * @param {*} value Value. */ ol.Feature.prototype.set = function(key, value) { - if (!goog.isDef(this.geometryName_) && (value instanceof ol.geom.Geometry)) { - this.geometryName_ = key; + var geometry = this.getGeometry(); + 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); + this.dispatchEvent(new ol.FeatureEvent( + ol.FeatureEventType.CHANGE, this, oldExtent)); }; @@ -150,3 +184,28 @@ ol.Feature.prototype.setSymbolizers = function(symbolizers) { * @type {string} */ 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); diff --git a/test/spec/ol/feature.test.js b/test/spec/ol/feature.test.js index 65626c53a5..1f31c8cc78 100644 --- a/test/spec/ol/feature.test.js +++ b/test/spec/ol/feature.test.js @@ -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() { @@ -197,11 +219,34 @@ describe('ol.Feature', function() { 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('ol.Feature'); goog.require('ol.geom.Point');