diff --git a/Logic/FeatureSource/FeaturePipeline.ts b/Logic/FeatureSource/FeaturePipeline.ts index c6329d1f3d..7a144bb811 100644 --- a/Logic/FeatureSource/FeaturePipeline.ts +++ b/Logic/FeatureSource/FeaturePipeline.ts @@ -23,7 +23,6 @@ import TileFreshnessCalculator from "./TileFreshnessCalculator"; import FullNodeDatabaseSource from "./TiledFeatureSource/FullNodeDatabaseSource"; import MapState from "../State/MapState"; import {ElementStorage} from "../ElementStorage"; -import MetaTagging from "../MetaTagging"; /** @@ -373,7 +372,7 @@ export default class FeaturePipeline { private freshnessForVisibleLayers(z: number, x: number, y: number): Date { let oldestDate = undefined; for (const flayer of this.state.filteredLayers.data) { - if (!flayer.isDisplayed.data) { + if (!flayer.isDisplayed.data && !flayer.layerDef.forceLoad) { continue } if (this.state.locationControl.data.zoom < flayer.layerDef.minzoom) { @@ -399,6 +398,9 @@ export default class FeaturePipeline { return oldestDate } + /* + * Gives an UIEventSource containing the tileIndexes of the tiles that should be loaded from OSM + * */ private getNeededTilesFromOsm(isSufficientlyZoomed: UIEventSource): UIEventSource { const self = this return this.state.currentBounds.map(bbox => { diff --git a/Logic/FeatureSource/TiledFeatureSource/DynamicTileSource.ts b/Logic/FeatureSource/TiledFeatureSource/DynamicTileSource.ts index 1b583a1759..b974687307 100644 --- a/Logic/FeatureSource/TiledFeatureSource/DynamicTileSource.ts +++ b/Logic/FeatureSource/TiledFeatureSource/DynamicTileSource.ts @@ -27,7 +27,7 @@ export default class DynamicTileSource implements TileHierarchy() const neededTiles = state.locationControl.map( location => { - if (!layer.isDisplayed.data) { + if (!layer.isDisplayed.data && !layer.layerDef.forceLoad) { // No need to download! - the layer is disabled return undefined; } diff --git a/Models/ThemeConfig/Conversion/PrepareTheme.ts b/Models/ThemeConfig/Conversion/PrepareTheme.ts index 04047c5fd7..3caf387afa 100644 --- a/Models/ThemeConfig/Conversion/PrepareTheme.ts +++ b/Models/ThemeConfig/Conversion/PrepareTheme.ts @@ -10,7 +10,6 @@ import LayerConfig from "../LayerConfig"; import {TagRenderingConfigJson} from "../Json/TagRenderingConfigJson"; import {SubstitutedTranslation} from "../../../UI/SubstitutedTranslation"; import DependencyCalculator from "../DependencyCalculator"; -import {ValidateThemeAndLayers} from "./Validation"; class SubstituteLayer extends Conversion<(string | LayerConfigJson), LayerConfigJson[]> { private readonly _state: DesugaringContext; @@ -306,6 +305,13 @@ class AddDependencyLayersToTheme extends DesugaringStep { dependencies.push(...layerDeps) } + for (const dependency of dependencies) { + if(loadedLayerIds.has(dependency.neededLayer)){ + // We mark the needed layer as 'mustLoad' + alreadyLoaded.find(l => l.id === dependency.neededLayer).forceLoad = true + } + } + // During the generate script, builtin layers are verified but not loaded - so we have to add them manually here // Their existance is checked elsewhere, so this is fine unmetDependencies = dependencies.filter(dep => !loadedLayerIds.has(dep.neededLayer)) @@ -330,8 +336,12 @@ class AddDependencyLayersToTheme extends DesugaringStep { } } while (unmetDependencies.length > 0) - - return dependenciesToAdd; + + return dependenciesToAdd.map(dep => { + dep = Utils.Clone(dep); + dep.forceLoad = true + return dep + }); } convert(theme: LayoutConfigJson, context: string): { result: LayoutConfigJson; errors: string[]; warnings: string[] } { diff --git a/Models/ThemeConfig/Json/LayerConfigJson.ts b/Models/ThemeConfig/Json/LayerConfigJson.ts index 812944520e..d7decef53c 100644 --- a/Models/ThemeConfig/Json/LayerConfigJson.ts +++ b/Models/ThemeConfig/Json/LayerConfigJson.ts @@ -111,6 +111,13 @@ export interface LayerConfigJson { */ isShown?: TagRenderingConfigJson; + /** + * Advanced option - might be set by the theme compiler + * + * If true, this data will _always_ be loaded, even if the theme is disabled + */ + forceLoad?: false | boolean + /** * The minimum needed zoomlevel required before loading of the data start diff --git a/Models/ThemeConfig/LayerConfig.ts b/Models/ThemeConfig/LayerConfig.ts index 42c6617f2b..229726524e 100644 --- a/Models/ThemeConfig/LayerConfig.ts +++ b/Models/ThemeConfig/LayerConfig.ts @@ -60,6 +60,7 @@ export default class LayerConfig extends WithContextLoader { public readonly tagRenderings: TagRenderingConfig[]; public readonly filters: FilterConfig[]; public readonly filterIsSameAs: string; + public readonly forceLoad: boolean; constructor( json: LayerConfigJson, @@ -166,6 +167,7 @@ export default class LayerConfig extends WithContextLoader { this.minzoom = json.minzoom ?? 0; this.minzoomVisible = json.minzoomVisible ?? this.minzoom; this.shownByDefault = json.shownByDefault ?? true; + this.forceLoad = json.forceLoad ?? false; if (json.presets !== undefined && json.presets?.map === undefined) { throw "Presets should be a list of items (at " + context + ")" } diff --git a/assets/themes/uk_addresses/license_info.json b/assets/themes/uk_addresses/license_info.json index 301d866d2a..046bf73a3d 100644 --- a/assets/themes/uk_addresses/license_info.json +++ b/assets/themes/uk_addresses/license_info.json @@ -56,4 +56,4 @@ ], "sources": [] } -] +] \ No newline at end of file