mirror of
https://github.com/bilawalsidhu/gods-eye-view.git
synced 2026-11-12 06:12:18 +00:00
Keep city stations, vehicle tracks and trail history across globe switches
This commit is contained in:
1 parent
c4a97a653c
commit
24190a3e35
11 files changed
+288
-79
No files matched your search
@@ -23,7 +23,10 @@ export function createBikeshareLayer({ services, source, rendererFactory }) {
|
||||
let renderer = null;
|
||||
let initialized = false;
|
||||
const lifecycle = {
|
||||
init(viewer, options = {}) {
|
||||
init(viewer, options) {
|
||||
return this.attachRenderer(viewer, options);
|
||||
},
|
||||
attachRenderer(viewer, options = {}) {
|
||||
if (initialized)
|
||||
throw new Error('Bikeshare layer is already initialized');
|
||||
renderer ??= rendererFactory({
|
||||
@@ -36,12 +39,44 @@ export function createBikeshareLayer({ services, source, rendererFactory }) {
|
||||
Object.assign(parts, renderer);
|
||||
initialized = true;
|
||||
try {
|
||||
return renderer.lifecycle.methods.init(viewer, options);
|
||||
state._restoringViewport = Boolean(options.waitForCameraRestore);
|
||||
renderer.lifecycle.methods.init(viewer, options);
|
||||
if (state._enabled) {
|
||||
const selected = state._selectedKey;
|
||||
for (const city of state._activeCityIds) {
|
||||
const stations = state._stationInfoCache.get(city);
|
||||
if (!stations) continue;
|
||||
parts.rendering.ensureCityPoints(city, stations);
|
||||
const status = state._statusCache.get(city)?.statusMap;
|
||||
if (status) parts.rendering.applyStatusToPoints(city, status);
|
||||
}
|
||||
if (selected) parts.selection._selectStation(selected);
|
||||
renderer.lifecycle.methods.show(viewer);
|
||||
}
|
||||
} catch (error) {
|
||||
initialized = false;
|
||||
throw error;
|
||||
}
|
||||
},
|
||||
resumeViewport() {
|
||||
if (!state._restoringViewport) return;
|
||||
state._restoringViewport = false;
|
||||
if (state._enabled) parts.viewport?.onCameraChanged();
|
||||
},
|
||||
detachRenderer() {
|
||||
if (!renderer) return;
|
||||
state._restoringViewport = true;
|
||||
clearTimeout(state._cameraDebounceTimer);
|
||||
const selected = state._selectedKey;
|
||||
renderer.lifecycle.methods.detach();
|
||||
state._selectedKey = selected;
|
||||
state._cityRuntime.clear();
|
||||
state._stationRenderMap.clear();
|
||||
state._viewer = state._engine = null;
|
||||
renderer = null;
|
||||
initialized = false;
|
||||
for (const key of ['rendering', 'selection', 'viewport', 'lifecycle']) delete parts[key];
|
||||
},
|
||||
enable(...args) {
|
||||
return renderer?.lifecycle.methods.enable(...args);
|
||||
},
|
||||
|
||||
Reference in new issue
Block a user