From 19582853f5da4ee97129cb05552cb49ffb4a2571 Mon Sep 17 00:00:00 2001 From: pietervdvn Date: Sun, 14 Mar 2021 20:14:51 +0100 Subject: [PATCH] Add location locking functionality --- Customizations/JSON/LayerConfig.ts | 2 ++ Customizations/JSON/LayoutConfig.ts | 3 ++- Customizations/JSON/LayoutConfigJson.ts | 7 +++++++ Customizations/JSON/TagRenderingConfig.ts | 4 +++- InitUiElements.ts | 23 ++++++++++++++++++++--- 5 files changed, 34 insertions(+), 5 deletions(-) diff --git a/Customizations/JSON/LayerConfig.ts b/Customizations/JSON/LayerConfig.ts index e0d6a24..ba37527 100644 --- a/Customizations/JSON/LayerConfig.ts +++ b/Customizations/JSON/LayerConfig.ts @@ -48,6 +48,8 @@ export default class LayerConfig { }[]; tagRenderings: TagRenderingConfig []; + + private readonly configuration_warnings : string[] = [] constructor(json: LayerConfigJson, context?: string) { diff --git a/Customizations/JSON/LayoutConfig.ts b/Customizations/JSON/LayoutConfig.ts index d1424bc..6678ad6 100644 --- a/Customizations/JSON/LayoutConfig.ts +++ b/Customizations/JSON/LayoutConfig.ts @@ -31,6 +31,7 @@ export default class LayoutConfig { }; public readonly hideFromOverview: boolean; + public readonly lockLocation: boolean | [[number,number],[number, number]]; public readonly enableUserBadge: boolean; public readonly enableShareScreen: boolean; public readonly enableMoreQuests: boolean; @@ -149,7 +150,7 @@ export default class LayoutConfig { } this.hideFromOverview = json.hideFromOverview ?? false; - + this.lockLocation = json.lockLocation ?? false; this.enableUserBadge = json.enableUserBadge ?? true; this.enableShareScreen = json.enableShareScreen ?? true; this.enableMoreQuests = json.enableMoreQuests ?? true; diff --git a/Customizations/JSON/LayoutConfigJson.ts b/Customizations/JSON/LayoutConfigJson.ts index 7816ff6..87e250b 100644 --- a/Customizations/JSON/LayoutConfigJson.ts +++ b/Customizations/JSON/LayoutConfigJson.ts @@ -158,6 +158,13 @@ export interface LayoutConfigJson { */ hideFromOverview?: boolean; + /** + * If set to true, the basemap will not scroll outside of the area visible on initial zoom. + * If set to [[lat0, lon0], [lat1, lon1]], the map will not scroll outside of those bounds. + * Off by default, which will enable panning to the entire world + */ + lockLocation?: boolean | [[number, number], [number, number]]; + enableUserBadge?: boolean; enableShareScreen?: boolean; enableMoreQuests?: boolean; diff --git a/Customizations/JSON/TagRenderingConfig.ts b/Customizations/JSON/TagRenderingConfig.ts index 0c54c34..7ffdf03 100644 --- a/Customizations/JSON/TagRenderingConfig.ts +++ b/Customizations/JSON/TagRenderingConfig.ts @@ -15,6 +15,8 @@ export default class TagRenderingConfig { readonly render?: Translation; readonly question?: Translation; readonly condition?: TagsFilter; + + readonly configuration_warnings : string[] = [] readonly freeform?: { readonly key: string, @@ -152,7 +154,7 @@ export default class TagRenderingConfig { for (const expectedKey of keys) { if(usedKeys.indexOf(expectedKey) < 0){ const msg = `${context}.mappings[${i}]: This mapping only defines values for ${usedKeys.join(', ')}, but it should also give a value for ${expectedKey}` - console.warn(msg) + this.configuration_warnings.push(msg) } } } diff --git a/InitUiElements.ts b/InitUiElements.ts index 4df43b7..d83ca60 100644 --- a/InitUiElements.ts +++ b/InitUiElements.ts @@ -258,8 +258,8 @@ export class InitUiElements { } }) isOpened.setData(Hash.hash.data === undefined) - - + + } private static InitLayerSelection() { @@ -276,7 +276,7 @@ export class InitUiElements { const copyrightNotice = new ScrollableFullScreen( () => Translations.t.general.attribution.attributionTitle.Clone(), - () => new Combine([ + () => new Combine([ Translations.t.general.attribution.attributionContent, "
", new Attribution(undefined, undefined, State.state.layoutToUse, undefined) @@ -335,6 +335,7 @@ export class InitUiElements { const attr = new Attribution(State.state.locationControl, State.state.osmConnection.userDetails, State.state.layoutToUse, State.state.leafletMap); + const bm = new Basemap("leafletDiv", State.state.locationControl, State.state.backgroundLayer, @@ -342,6 +343,22 @@ export class InitUiElements { attr ); State.state.leafletMap.setData(bm.map); + const layout = State.state.layoutToUse.data + if (layout.lockLocation) { + const tile = Utils.embedded_tile(layout.startLat, layout.startLon, layout.startZoom - 1) + const bounds = Utils.tile_bounds(tile.z, tile.x, tile.y) + // We use the bounds to get a sense of distance for this zoom level + const latDiff = bounds[0][0] - bounds[1][0] + const lonDiff = bounds[0][1] - bounds[1][1] + console.warn("Locking the bounds to ", bounds) + bm.map.setMaxBounds( + [[ layout.startLat - latDiff, layout.startLon - lonDiff ], + [ layout.startLat + latDiff, layout.startLon + lonDiff ], + ] + ); + bm.map.setMinZoom(layout.startZoom) + } + } private static InitLayers() {