Move label cache listener management to the renderer

This commit is contained in:
ahocevar
2019-06-03 15:10:35 +02:00
parent 68b7831daf
commit 8c21c9196d
2 changed files with 25 additions and 38 deletions

View File

@@ -328,7 +328,7 @@ class PluggableMap extends BaseObject {
* @type {import("./renderer/Map.js").default} * @type {import("./renderer/Map.js").default}
* @private * @private
*/ */
this.renderer_ = this.createRenderer(); this.renderer_ = null;
/** /**
* @type {function(Event): void|undefined} * @type {function(Event): void|undefined}
@@ -516,35 +516,6 @@ class PluggableMap extends BaseObject {
overlay.setMap(this); overlay.setMap(this);
} }
/**
* Attach a label cache and listen to font changes. Called by the renderer.
* @param {import("./events/Target.js").default} labelCache Label cache.
*/
attachLabelCache(labelCache) {
this.unlistenLabelCache_();
this.labelCache_ = labelCache;
this.listenLabelCache_();
}
/**
* Listen to font changes.
* @private
*/
listenLabelCache_() {
this.labelCacheListenerKey_ = listen(this.labelCache_, EventType.CLEAR, this.redrawText.bind(this));
}
/**
* No longer listen to font changes.
* @private
*/
unlistenLabelCache_() {
if (this.labelCacheListenerKey_) {
unlistenByKey(this.labelCacheListenerKey_);
delete this.labelCacheListenerKey_;
}
}
/** /**
* *
* @inheritDoc * @inheritDoc
@@ -558,10 +529,6 @@ class PluggableMap extends BaseObject {
removeEventListener(EventType.RESIZE, this.handleResize_, false); removeEventListener(EventType.RESIZE, this.handleResize_, false);
this.handleResize_ = undefined; this.handleResize_ = undefined;
} }
if (this.animationDelayKey_) {
cancelAnimationFrame(this.animationDelayKey_);
this.animationDelayKey_ = undefined;
}
this.setTarget(null); this.setTarget(null);
super.disposeInternal(); super.disposeInternal();
} }
@@ -1056,14 +1023,24 @@ class PluggableMap extends BaseObject {
} }
if (!targetElement) { if (!targetElement) {
if (this.renderer_) {
this.renderer_.dispose();
this.renderer_ = null;
}
if (this.animationDelayKey_) {
cancelAnimationFrame(this.animationDelayKey_);
this.animationDelayKey_ = undefined;
}
removeNode(this.viewport_); removeNode(this.viewport_);
if (this.handleResize_ !== undefined) { if (this.handleResize_ !== undefined) {
removeEventListener(EventType.RESIZE, this.handleResize_, false); removeEventListener(EventType.RESIZE, this.handleResize_, false);
this.handleResize_ = undefined; this.handleResize_ = undefined;
} }
this.unlistenLabelCache_();
} else { } else {
targetElement.appendChild(this.viewport_); targetElement.appendChild(this.viewport_);
if (!this.renderer_) {
this.renderer_ = this.createRenderer();
}
const keyboardEventTarget = !this.keyboardEventTarget_ ? const keyboardEventTarget = !this.keyboardEventTarget_ ?
targetElement : this.keyboardEventTarget_; targetElement : this.keyboardEventTarget_;
@@ -1076,7 +1053,6 @@ class PluggableMap extends BaseObject {
this.handleResize_ = this.updateSize.bind(this); this.handleResize_ = this.updateSize.bind(this);
window.addEventListener(EventType.RESIZE, this.handleResize_, false); window.addEventListener(EventType.RESIZE, this.handleResize_, false);
} }
this.listenLabelCache_();
} }
this.updateSize(); this.updateSize();
@@ -1183,7 +1159,7 @@ class PluggableMap extends BaseObject {
* @api * @api
*/ */
render() { render() {
if (this.animationDelayKey_ === undefined) { if (this.renderer_ && this.animationDelayKey_ === undefined) {
this.animationDelayKey_ = requestAnimationFrame(this.animationDelay_); this.animationDelayKey_ = requestAnimationFrame(this.animationDelay_);
} }
} }

View File

@@ -9,6 +9,8 @@ import MapRenderer from './Map.js';
import SourceState from '../source/State.js'; import SourceState from '../source/State.js';
import {replaceChildren} from '../dom.js'; import {replaceChildren} from '../dom.js';
import {labelCache} from '../render/canvas.js'; import {labelCache} from '../render/canvas.js';
import EventType from '../events/EventType.js';
import {listen, unlistenByKey} from '../events.js';
/** /**
@@ -23,7 +25,11 @@ class CompositeMapRenderer extends MapRenderer {
*/ */
constructor(map) { constructor(map) {
super(map); super(map);
map.attachLabelCache(labelCache);
/**
* @type {import("./events.js").EventsKey}
*/
this.labelCacheKey_ = listen(labelCache, EventType.CLEAR, map.redrawText.bind(map));
/** /**
* @private * @private
@@ -66,6 +72,11 @@ class CompositeMapRenderer extends MapRenderer {
} }
} }
disposeInternal() {
unlistenByKey(this.labelCacheKey_);
super.disposeInternal();
}
/** /**
* @inheritDoc * @inheritDoc
*/ */