mapcomplete/Logic/ElementStorage.ts

67 lines
2.1 KiB
TypeScript
Raw Normal View History

2020-06-24 00:35:19 +02:00
/**
2021-01-02 21:03:40 +01:00
* Keeps track of a dictionary 'elementID' -> UIEventSource<tags>
2020-06-24 00:35:19 +02:00
*/
import {UIEventSource} from "./UIEventSource";
2020-06-24 00:35:19 +02:00
export class ElementStorage {
private _elements = new Map<string, UIEventSource<any>>();
2020-06-24 00:35:19 +02:00
constructor() {
}
addElementById(id: string, eventSource: UIEventSource<any>) {
this._elements.set(id, eventSource);
2020-06-24 00:35:19 +02:00
}
/**
* Creates a UIEventSource for the tags of the given feature.
* If an UIEventsource has been created previously, the same UIEventSource will be returned
*
* Note: it will cleverly merge the tags, if needed
*/
addOrGetElement(feature: any): UIEventSource<any> {
const elementId = feature.properties.id;
if (this._elements.has(elementId)) {
const es = this._elements.get(elementId);
if (es.data == feature.properties) {
// Reference comparison gives the same object! we can just return the event source
return es;
}
2020-06-24 00:35:19 +02:00
const keptKeys = es.data;
// The element already exists
// We add all the new keys to the old keys
let somethingChanged = false;
for (const k in feature.properties) {
const v = feature.properties[k];
2020-06-24 00:35:19 +02:00
if (keptKeys[k] !== v) {
keptKeys[k] = v;
somethingChanged = true;
2020-06-24 00:35:19 +02:00
}
}
if (somethingChanged) {
es.ping();
}
2020-06-24 00:35:19 +02:00
return es;
} else {
const eventSource = new UIEventSource<any>(feature.properties, "tags of " + feature.properties.id);
this._elements.set(feature.properties.id, eventSource);
return eventSource;
2020-06-24 00:35:19 +02:00
}
}
2020-12-05 03:22:17 +01:00
getEventSourceById(elementId): UIEventSource<any> {
if (this._elements.has(elementId)) {
return this._elements.get(elementId);
2020-06-24 00:35:19 +02:00
}
2020-12-05 03:22:17 +01:00
console.error("Can not find eventsource with id ", elementId);
return undefined;
}
has(id) {
return this._elements.has(id);
2020-12-05 03:22:17 +01:00
}
2020-06-24 00:35:19 +02:00
}