From ee962f4ba3a19c98b0ec756bfb485769e3a00d47 Mon Sep 17 00:00:00 2001 From: pietervdvn Date: Wed, 5 Jan 2022 18:08:42 +0100 Subject: [PATCH] Small performance issues, improvement of #579 --- Logic/UIEventSource.ts | 5 ++++- UI/ShowDataLayer/ShowDataLayer.ts | 21 +++++++++++++-------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/Logic/UIEventSource.ts b/Logic/UIEventSource.ts index 3aebda8532..28f2152575 100644 --- a/Logic/UIEventSource.ts +++ b/Logic/UIEventSource.ts @@ -281,10 +281,12 @@ export class UIEventSource { * @param f: The transforming function * @param extraSources: also trigger the update if one of these sources change * @param g: a 'backfunction to let the sync run in two directions. (data of the new UIEVEntSource, currentData) => newData + * @param allowUnregister: if set, the update will be halted if no listeners are registered */ public map(f: ((t: T) => J), extraSources: UIEventSource[] = [], - g: ((j: J, t: T) => T) = undefined): UIEventSource { + g: ((j: J, t: T) => T) = undefined, + allowUnregister = false): UIEventSource { const self = this; const stack = new Error().stack.split("\n"); @@ -297,6 +299,7 @@ export class UIEventSource { const update = function () { newSource.setData(f(self.data)); + return allowUnregister && newSource._callbacks.length === 0 } this.addCallback(update); diff --git a/UI/ShowDataLayer/ShowDataLayer.ts b/UI/ShowDataLayer/ShowDataLayer.ts index f306cadf23..d1af720010 100644 --- a/UI/ShowDataLayer/ShowDataLayer.ts +++ b/UI/ShowDataLayer/ShowDataLayer.ts @@ -145,7 +145,8 @@ export default class ShowDataLayer { pointToLayer: (feature, latLng) => self.pointToLayer(feature, latLng), onEachFeature: (feature, leafletLayer) => self.postProcessFeature(feature, leafletLayer) }); - + + const selfLayer = this.geoLayer; const allFeats = this._features.features.data; for (const feat of allFeats) { if (feat === undefined) { @@ -153,12 +154,11 @@ export default class ShowDataLayer { } try { if (feat.geometry.type === "LineString") { - const self = this; const coords = L.GeoJSON.coordsToLatLngs(feat.geometry.coordinates) const tagsSource = this.allElements?.addOrGetElement(feat) ?? new UIEventSource(feat.properties); let offsettedLine; tagsSource - .map(tags => this._layerToShow.lineRendering[feat.lineRenderingIndex].GenerateLeafletStyle(tags)) + .map(tags => this._layerToShow.lineRendering[feat.lineRenderingIndex].GenerateLeafletStyle(tags), [], undefined, true) .withEqualityStabilized((a, b) => { if (a === b) { return true @@ -176,6 +176,9 @@ export default class ShowDataLayer { offsettedLine = L.polyline(coords, lineStyle); this.postProcessFeature(feat, offsettedLine) offsettedLine.addTo(this.geoLayer) + + // If 'self.geoLayer' is not the same as the layer the feature is added to, we can safely remove this callback + return self.geoLayer !== selfLayer }) } else { this.geoLayer.addData(feat); @@ -186,11 +189,13 @@ export default class ShowDataLayer { } if (options.zoomToFeatures ?? false) { - try { - const bounds = this.geoLayer.getBounds() - mp.fitBounds(bounds, {animate: false}) - } catch (e) { - console.debug("Invalid bounds", e) + if(this.geoLayer.getLayers().length > 0){ + try { + const bounds = this.geoLayer.getBounds() + mp.fitBounds(bounds, {animate: false}) + } catch (e) { + console.debug("Invalid bounds", e) + } } }