From 7f180331718ba8bcc31b6daf6e763e196b209a7f Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Sat, 7 Feb 2015 16:42:36 -0700 Subject: [PATCH] Make layer renderers observable and re-render on change --- src/ol/renderer/layerrenderer.js | 5 +++-- src/ol/renderer/maprenderer.js | 26 ++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/ol/renderer/layerrenderer.js b/src/ol/renderer/layerrenderer.js index 08b7f4e03b..796384ce5e 100644 --- a/src/ol/renderer/layerrenderer.js +++ b/src/ol/renderer/layerrenderer.js @@ -6,6 +6,7 @@ goog.require('goog.events'); goog.require('goog.events.EventType'); goog.require('goog.functions'); goog.require('ol.ImageState'); +goog.require('ol.Observable'); goog.require('ol.TileRange'); goog.require('ol.TileState'); goog.require('ol.layer.Layer'); @@ -19,7 +20,7 @@ goog.require('ol.vec.Mat4'); /** * @constructor - * @extends {goog.Disposable} + * @extends {ol.Observable} * @param {ol.renderer.Map} mapRenderer Map renderer. * @param {ol.layer.Layer} layer Layer. * @suppress {checkStructDictInheritance} @@ -43,7 +44,7 @@ ol.renderer.Layer = function(mapRenderer, layer) { }; -goog.inherits(ol.renderer.Layer, goog.Disposable); +goog.inherits(ol.renderer.Layer, ol.Observable); /** diff --git a/src/ol/renderer/maprenderer.js b/src/ol/renderer/maprenderer.js index 5fa707a00b..c1c7748e67 100644 --- a/src/ol/renderer/maprenderer.js +++ b/src/ol/renderer/maprenderer.js @@ -4,6 +4,8 @@ goog.provide('ol.renderer.Map'); goog.require('goog.Disposable'); goog.require('goog.asserts'); goog.require('goog.dispose'); +goog.require('goog.events'); +goog.require('goog.events.EventType'); goog.require('goog.functions'); goog.require('goog.object'); goog.require('goog.vec.Mat4'); @@ -56,6 +58,12 @@ ol.renderer.Map = function(container, map) { */ this.layerRenderers_ = {}; + /** + * @private + * @type {Object.} + */ + this.layerRendererListeners_ = {}; + }; goog.inherits(ol.renderer.Map, goog.Disposable); @@ -254,6 +262,10 @@ ol.renderer.Map.prototype.getLayerRenderer = function(layer) { } else { var layerRenderer = this.createLayerRenderer(layer); this.layerRenderers_[layerKey] = layerRenderer; + this.layerRendererListeners_[layerKey] = goog.events.listen(layerRenderer, + goog.events.EventType.CHANGE, this.handleLayerRendererChange_, + false, this); + return layerRenderer; } }; @@ -293,6 +305,15 @@ ol.renderer.Map.prototype.getMap = function() { ol.renderer.Map.prototype.getType = goog.abstractMethod; +/** + * Handle changes in a layer renderer. + * @private + */ +ol.renderer.Map.prototype.handleLayerRendererChange_ = function() { + this.map_.render(); +}; + + /** * @param {string} layerKey Layer key. * @return {ol.renderer.Layer} Layer renderer. @@ -302,6 +323,11 @@ ol.renderer.Map.prototype.removeLayerRendererByKey_ = function(layerKey) { goog.asserts.assert(layerKey in this.layerRenderers_); var layerRenderer = this.layerRenderers_[layerKey]; delete this.layerRenderers_[layerKey]; + + goog.asserts.assert(layerKey in this.layerRendererListeners_); + goog.events.unlistenByKey(this.layerRendererListeners_[layerKey]); + delete this.layerRendererListeners_[layerKey]; + return layerRenderer; };