From 97b56add702faf101d2b7ccfb5c2b1b42938754d Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Thu, 3 Oct 2013 08:52:11 -0600 Subject: [PATCH 1/2] Unique event type value for this target The goog.events.EventType.CHANGE type is already dispatched because layers are ol.Object instances. To allow people to register for vector layer specific events without also having listeners get called with more general ol.Object change events, we need to give the types unique values. --- src/ol/layer/vectorlayer.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/ol/layer/vectorlayer.js b/src/ol/layer/vectorlayer.js index 2201146827..8ab3d1bbcb 100644 --- a/src/ol/layer/vectorlayer.js +++ b/src/ol/layer/vectorlayer.js @@ -3,7 +3,6 @@ goog.provide('ol.layer.VectorLayerEventType'); goog.require('goog.array'); goog.require('goog.asserts'); -goog.require('goog.events.EventType'); goog.require('goog.object'); goog.require('ol.Feature'); goog.require('ol.extent'); @@ -133,7 +132,7 @@ ol.layer.FeatureCache.prototype.remove = function(feature) { */ ol.layer.VectorLayerEventType = { ADD: 'add', - CHANGE: goog.events.EventType.CHANGE, + CHANGE: 'featurechange', REMOVE: 'remove', INTENTCHANGE: 'intentchange' }; From 64dd5cfc1fc453353a4d59749b395d69c8a2a823 Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Thu, 3 Oct 2013 11:25:30 -0600 Subject: [PATCH 2/2] Extend goog.events.Event for custom vector layer events Vector events include features and extents. In the case of feature change events, the extents array will include old and new extents for features with modified geometries.w --- src/ol/layer/vectorlayer.js | 85 ++++++++++--------- .../canvas/canvasvectorlayerrenderer.js | 28 +++--- 2 files changed, 63 insertions(+), 50 deletions(-) diff --git a/src/ol/layer/vectorlayer.js b/src/ol/layer/vectorlayer.js index 8ab3d1bbcb..80e4457172 100644 --- a/src/ol/layer/vectorlayer.js +++ b/src/ol/layer/vectorlayer.js @@ -1,8 +1,9 @@ goog.provide('ol.layer.Vector'); -goog.provide('ol.layer.VectorLayerEventType'); +goog.provide('ol.layer.VectorEventType'); goog.require('goog.array'); goog.require('goog.asserts'); +goog.require('goog.events.Event'); goog.require('goog.object'); goog.require('ol.Feature'); goog.require('ol.extent'); @@ -127,25 +128,6 @@ ol.layer.FeatureCache.prototype.remove = function(feature) { }; -/** - * @enum {string} - */ -ol.layer.VectorLayerEventType = { - ADD: 'add', - CHANGE: 'featurechange', - REMOVE: 'remove', - INTENTCHANGE: 'intentchange' -}; - - -/** - * @typedef {{extent: (ol.Extent|undefined), - * features: (Array.|undefined), - * type: ol.layer.VectorLayerEventType}} - */ -ol.layer.VectorLayerEventObject; - - /** * @constructor @@ -200,11 +182,8 @@ ol.layer.Vector.prototype.addFeatures = function(features) { ol.extent.extend(extent, geometry.getBounds()); } } - this.dispatchEvent(/** @type {ol.layer.VectorLayerEventObject} */ ({ - extent: extent, - features: features, - type: ol.layer.VectorLayerEventType.ADD - })); + this.dispatchEvent(new ol.layer.VectorEvent(ol.layer.VectorEventType.ADD, + features, [extent])); }; @@ -213,9 +192,8 @@ ol.layer.Vector.prototype.addFeatures = function(features) { */ ol.layer.Vector.prototype.clear = function() { this.featureCache_.clear(); - this.dispatchEvent(/** @type {ol.layer.VectorLayerEventObject} */ ({ - type: ol.layer.VectorLayerEventType.CHANGE - })); + this.dispatchEvent( + new ol.layer.VectorEvent(ol.layer.VectorEventType.CHANGE, [], [])); }; @@ -409,11 +387,8 @@ ol.layer.Vector.prototype.removeFeatures = function(features) { ol.extent.extend(extent, geometry.getBounds()); } } - this.dispatchEvent(/** @type {ol.layer.VectorLayerEventObject} */ ({ - extent: extent, - features: features, - type: ol.layer.VectorLayerEventType.REMOVE - })); + this.dispatchEvent(new ol.layer.VectorEvent(ol.layer.VectorEventType.REMOVE, + features, [extent])); }; @@ -437,11 +412,8 @@ ol.layer.Vector.prototype.setRenderIntent = ol.extent.extend(extent, geometry.getBounds()); } } - this.dispatchEvent(/** @type {ol.layer.VectorLayerEventObject} */ ({ - extent: extent, - features: features, - type: ol.layer.VectorLayerEventType.INTENTCHANGE - })); + this.dispatchEvent(new ol.layer.VectorEvent( + ol.layer.VectorEventType.INTENTCHANGE, features, [extent])); }; @@ -462,3 +434,40 @@ ol.layer.Vector.uidTransformFeatureInfo = function(features) { function(feature) { return goog.getUid(feature); }); return uids.join(', '); }; + + + +/** + * @constructor + * @extends {goog.events.Event} + * @param {string} type Event type. + * @param {Array.} features Features associated with the event. + * @param {Array.} extents Any extents associated with the event. + */ +ol.layer.VectorEvent = function(type, features, extents) { + + goog.base(this, type); + + /** + * @type {Array.} + */ + this.features = features; + + /** + * @type {Array.} + */ + this.extents = extents; + +}; +goog.inherits(ol.layer.VectorEvent, goog.events.Event); + + +/** + * @enum {string} + */ +ol.layer.VectorEventType = { + ADD: 'featureadd', + CHANGE: 'featurechange', + REMOVE: 'featureremove', + INTENTCHANGE: 'intentchange' +}; diff --git a/src/ol/renderer/canvas/canvasvectorlayerrenderer.js b/src/ol/renderer/canvas/canvasvectorlayerrenderer.js index f8e63aa1ee..8c3a1bb5e0 100644 --- a/src/ol/renderer/canvas/canvasvectorlayerrenderer.js +++ b/src/ol/renderer/canvas/canvasvectorlayerrenderer.js @@ -13,7 +13,7 @@ goog.require('ol.ViewHint'); goog.require('ol.extent'); goog.require('ol.geom.GeometryType'); goog.require('ol.layer.Vector'); -goog.require('ol.layer.VectorLayerEventType'); +goog.require('ol.layer.VectorEventType'); goog.require('ol.layer.VectorLayerRenderIntent'); goog.require('ol.renderer.canvas.Layer'); goog.require('ol.renderer.canvas.Vector'); @@ -88,10 +88,10 @@ ol.renderer.canvas.VectorLayer = function(mapRenderer, layer) { this.tileCache_ = new ol.TileCache( ol.renderer.canvas.VectorLayer.TILECACHE_SIZE); goog.events.listen(layer, [ - ol.layer.VectorLayerEventType.ADD, - ol.layer.VectorLayerEventType.CHANGE, - ol.layer.VectorLayerEventType.REMOVE, - ol.layer.VectorLayerEventType.INTENTCHANGE + ol.layer.VectorEventType.ADD, + ol.layer.VectorEventType.CHANGE, + ol.layer.VectorEventType.REMOVE, + ol.layer.VectorEventType.INTENTCHANGE ], this.handleLayerChange_, false, this); @@ -163,14 +163,18 @@ goog.inherits(ol.renderer.canvas.VectorLayer, ol.renderer.canvas.Layer); /** * Get rid cached tiles. If the optional extent is provided, only tiles that * intersect that extent will be removed. - * @param {ol.Extent=} opt_extent extent Expire tiles within this extent only. + * @param {Array.} extents extent Expire tiles within the provided + * extents. If the array is empty, all tiles will be expired. * @private */ -ol.renderer.canvas.VectorLayer.prototype.expireTiles_ = function(opt_extent) { +ol.renderer.canvas.VectorLayer.prototype.expireTiles_ = function(extents) { var tileCache = this.tileCache_; - if (goog.isDef(opt_extent)) { - var tileRange = this.tileGrid_.getTileRangeForExtentAndZ(opt_extent, 0); - tileCache.pruneTileRange(tileRange); + var length = extents.length; + if (length > 0) { + for (var i = 0; i < length; ++i) { + tileCache.pruneTileRange( + this.tileGrid_.getTileRangeForExtentAndZ(extents[i], 0)); + } } else { tileCache.clear(); } @@ -307,11 +311,11 @@ ol.renderer.canvas.VectorLayer.prototype.getFeaturesForPixel = /** - * @param {ol.layer.VectorLayerEventObject} event Layer change event. + * @param {ol.layer.VectorEvent} event Vector layer event. * @private */ ol.renderer.canvas.VectorLayer.prototype.handleLayerChange_ = function(event) { - this.expireTiles_(event.extent); + this.expireTiles_(event.extents); this.requestMapRenderFrame_(); };