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_(); };