MapComplete/Logic/Actors/SelectedFeatureHandler.ts

77 lines
2.5 KiB
TypeScript
Raw Normal View History

import {UIEventSource} from "../UIEventSource";
2021-07-28 00:09:17 +02:00
import {OsmObject} from "../Osm/OsmObject";
import Loc from "../../Models/Loc";
import {ElementStorage} from "../ElementStorage";
/**
* Makes sure the hash shows the selected element and vice-versa.
*/
export default class SelectedFeatureHandler {
private static readonly _no_trigger_on = ["welcome", "copyright", "layers", "new"]
hash: UIEventSource<string>;
private readonly state: {
selectedElement: UIEventSource<any>
}
constructor(
hash: UIEventSource<string>,
state: {
selectedElement: UIEventSource<any>,
allElements: ElementStorage;
}
) {
this.hash = hash;
2021-07-28 00:09:17 +02:00
this.state = state
// Getting a blank hash clears the selected element
hash.addCallback(h => {
if (h === undefined || h === "") {
state.selectedElement.setData(undefined);
}else{
const feature = state.allElements.ContainingFeatures.get(h)
if(feature !== undefined){
state.selectedElement.setData(feature)
}
2021-07-28 00:09:17 +02:00
}
})
state.selectedElement.addCallback(feature => {
2021-07-28 00:09:17 +02:00
if (feature === undefined) {
console.trace("Resetting hash")
2021-07-28 00:09:17 +02:00
if (SelectedFeatureHandler._no_trigger_on.indexOf(hash.data) < 0) {
hash.setData("")
}
}
2021-07-28 00:09:17 +02:00
const h = feature?.properties?.id;
2021-07-28 00:09:17 +02:00
if (h !== undefined) {
hash.setData(h)
}
})
}
2021-07-28 00:09:17 +02:00
// If a feature is selected via the hash, zoom there
2021-07-28 00:09:17 +02:00
public zoomToSelectedFeature(location: UIEventSource<Loc>) {
const hash = this.hash.data;
2021-07-28 00:09:17 +02:00
if (hash === undefined || SelectedFeatureHandler._no_trigger_on.indexOf(hash) >= 0) {
return; // No valid feature selected
}
// We should have a valid osm-ID and zoom to it... But we wrap it in try-catch to be sure
2021-07-28 00:09:17 +02:00
try {
OsmObject.DownloadObject(hash).addCallbackAndRunD(element => {
const centerpoint = element.centerpoint();
console.log("Zooming to location for select point: ", centerpoint)
location.data.lat = centerpoint[0]
location.data.lon = centerpoint[1]
location.ping();
})
} catch (e) {
console.error("Could not download OSM-object with id", hash, " - probably a weird hash")
}
}
2021-07-28 00:09:17 +02:00
}