Refactoring: add current view button

This commit is contained in:
Pieter Vander Vennet 2023-05-05 01:25:37 +02:00
parent dec4296204
commit 2149fc1a1d
3 changed files with 266 additions and 256 deletions

View file

@ -1,27 +1,23 @@
import LayoutConfig from "./ThemeConfig/LayoutConfig" import LayoutConfig from "./ThemeConfig/LayoutConfig"
import { SpecialVisualizationState } from "../UI/SpecialVisualization" import {SpecialVisualizationState} from "../UI/SpecialVisualization"
import { Changes } from "../Logic/Osm/Changes" import {Changes} from "../Logic/Osm/Changes"
import { ImmutableStore, Store, UIEventSource } from "../Logic/UIEventSource" import {ImmutableStore, Store, UIEventSource} from "../Logic/UIEventSource"
import { import {FeatureSource, IndexedFeatureSource, WritableFeatureSource,} from "../Logic/FeatureSource/FeatureSource"
FeatureSource, import {OsmConnection} from "../Logic/Osm/OsmConnection"
IndexedFeatureSource, import {ExportableMap, MapProperties} from "./MapProperties"
WritableFeatureSource,
} from "../Logic/FeatureSource/FeatureSource"
import { OsmConnection } from "../Logic/Osm/OsmConnection"
import { ExportableMap, MapProperties } from "./MapProperties"
import LayerState from "../Logic/State/LayerState" import LayerState from "../Logic/State/LayerState"
import { Feature, Point } from "geojson" import {Feature, Point, Polygon} from "geojson"
import FullNodeDatabaseSource from "../Logic/FeatureSource/TiledFeatureSource/FullNodeDatabaseSource" import FullNodeDatabaseSource from "../Logic/FeatureSource/TiledFeatureSource/FullNodeDatabaseSource"
import { Map as MlMap } from "maplibre-gl" import {Map as MlMap} from "maplibre-gl"
import InitialMapPositioning from "../Logic/Actors/InitialMapPositioning" import InitialMapPositioning from "../Logic/Actors/InitialMapPositioning"
import { MapLibreAdaptor } from "../UI/Map/MapLibreAdaptor" import {MapLibreAdaptor} from "../UI/Map/MapLibreAdaptor"
import { GeoLocationState } from "../Logic/State/GeoLocationState" import {GeoLocationState} from "../Logic/State/GeoLocationState"
import FeatureSwitchState from "../Logic/State/FeatureSwitchState" import FeatureSwitchState from "../Logic/State/FeatureSwitchState"
import { QueryParameters } from "../Logic/Web/QueryParameters" import {QueryParameters} from "../Logic/Web/QueryParameters"
import UserRelatedState from "../Logic/State/UserRelatedState" import UserRelatedState from "../Logic/State/UserRelatedState"
import LayerConfig from "./ThemeConfig/LayerConfig" import LayerConfig from "./ThemeConfig/LayerConfig"
import GeoLocationHandler from "../Logic/Actors/GeoLocationHandler" import GeoLocationHandler from "../Logic/Actors/GeoLocationHandler"
import { AvailableRasterLayers, RasterLayerPolygon, RasterLayerUtils } from "./RasterLayers" import {AvailableRasterLayers, RasterLayerPolygon, RasterLayerUtils} from "./RasterLayers"
import LayoutSource from "../Logic/FeatureSource/Sources/LayoutSource" import LayoutSource from "../Logic/FeatureSource/Sources/LayoutSource"
import StaticFeatureSource from "../Logic/FeatureSource/Sources/StaticFeatureSource" import StaticFeatureSource from "../Logic/FeatureSource/Sources/StaticFeatureSource"
import FeaturePropertiesStore from "../Logic/FeatureSource/Actors/FeaturePropertiesStore" import FeaturePropertiesStore from "../Logic/FeatureSource/Actors/FeaturePropertiesStore"
@ -32,20 +28,20 @@ import TitleHandler from "../Logic/Actors/TitleHandler"
import ChangeToElementsActor from "../Logic/Actors/ChangeToElementsActor" import ChangeToElementsActor from "../Logic/Actors/ChangeToElementsActor"
import PendingChangesUploader from "../Logic/Actors/PendingChangesUploader" import PendingChangesUploader from "../Logic/Actors/PendingChangesUploader"
import SelectedElementTagsUpdater from "../Logic/Actors/SelectedElementTagsUpdater" import SelectedElementTagsUpdater from "../Logic/Actors/SelectedElementTagsUpdater"
import { BBox } from "../Logic/BBox" import {BBox} from "../Logic/BBox"
import Constants from "./Constants" import Constants from "./Constants"
import Hotkeys from "../UI/Base/Hotkeys" import Hotkeys from "../UI/Base/Hotkeys"
import Translations from "../UI/i18n/Translations" import Translations from "../UI/i18n/Translations"
import { GeoIndexedStoreForLayer } from "../Logic/FeatureSource/Actors/GeoIndexedStore" import {GeoIndexedStoreForLayer} from "../Logic/FeatureSource/Actors/GeoIndexedStore"
import { LastClickFeatureSource } from "../Logic/FeatureSource/Sources/LastClickFeatureSource" import {LastClickFeatureSource} from "../Logic/FeatureSource/Sources/LastClickFeatureSource"
import { MenuState } from "./MenuState" import {MenuState} from "./MenuState"
import MetaTagging from "../Logic/MetaTagging" import MetaTagging from "../Logic/MetaTagging"
import ChangeGeometryApplicator from "../Logic/FeatureSource/Sources/ChangeGeometryApplicator" import ChangeGeometryApplicator from "../Logic/FeatureSource/Sources/ChangeGeometryApplicator"
import { NewGeometryFromChangesFeatureSource } from "../Logic/FeatureSource/Sources/NewGeometryFromChangesFeatureSource" import {NewGeometryFromChangesFeatureSource} from "../Logic/FeatureSource/Sources/NewGeometryFromChangesFeatureSource"
import OsmObjectDownloader from "../Logic/Osm/OsmObjectDownloader" import OsmObjectDownloader from "../Logic/Osm/OsmObjectDownloader"
import ShowOverlayRasterLayer from "../UI/Map/ShowOverlayRasterLayer" import ShowOverlayRasterLayer from "../UI/Map/ShowOverlayRasterLayer"
import { Utils } from "../Utils" import {Utils} from "../Utils"
import { EliCategory } from "./RasterLayerProperties" import {EliCategory} from "./RasterLayerProperties"
import BackgroundLayerResetter from "../Logic/Actors/BackgroundLayerResetter" import BackgroundLayerResetter from "../Logic/Actors/BackgroundLayerResetter"
import SaveFeatureSourceToLocalStorage from "../Logic/FeatureSource/Actors/SaveFeatureSourceToLocalStorage" import SaveFeatureSourceToLocalStorage from "../Logic/FeatureSource/Actors/SaveFeatureSourceToLocalStorage"
import Hash from "../Logic/Web/Hash" import Hash from "../Logic/Web/Hash"
@ -80,6 +76,7 @@ export default class ThemeViewState implements SpecialVisualizationState {
readonly historicalUserLocations: WritableFeatureSource<Feature<Point>> readonly historicalUserLocations: WritableFeatureSource<Feature<Point>>
readonly indexedFeatures: IndexedFeatureSource & LayoutSource readonly indexedFeatures: IndexedFeatureSource & LayoutSource
readonly currentView: FeatureSource<Feature<Polygon>>
readonly featuresInView: FeatureSource readonly featuresInView: FeatureSource
readonly newFeatures: WritableFeatureSource readonly newFeatures: WritableFeatureSource
readonly layerState: LayerState readonly layerState: LayerState
@ -169,6 +166,12 @@ export default class ThemeViewState implements SpecialVisualizationState {
(id) => self.layerState.filteredLayers.get(id).isDisplayed (id) => self.layerState.filteredLayers.get(id).isDisplayed
) )
this.indexedFeatures = layoutSource this.indexedFeatures = layoutSource
const empty = []
this.currentView = new StaticFeatureSource(
this.mapProperties.bounds.map((bbox) =>
bbox === undefined ? empty : <Feature[]>[bbox.asGeoJson({ id: "current_view" })]
)
)
this.featuresInView = new BBoxFeatureSource(layoutSource, this.mapProperties.bounds) this.featuresInView = new BBoxFeatureSource(layoutSource, this.mapProperties.bounds)
this.dataIsLoading = layoutSource.isLoading this.dataIsLoading = layoutSource.isLoading
@ -447,11 +450,7 @@ export default class ThemeViewState implements SpecialVisualizationState {
bbox === undefined ? empty : <Feature[]>[bbox.asGeoJson({ id: "range" })] bbox === undefined ? empty : <Feature[]>[bbox.asGeoJson({ id: "range" })]
) )
), ),
current_view: new StaticFeatureSource( current_view: this.currentView
this.mapProperties.bounds.map((bbox) =>
bbox === undefined ? empty : <Feature[]>[bbox.asGeoJson({ id: "current_view" })]
)
),
} }
if (this.layout?.lockLocation) { if (this.layout?.lockLocation) {
const bbox = new BBox(this.layout.lockLocation) const bbox = new BBox(this.layout.lockLocation)

View file

@ -1,22 +1,22 @@
<script lang="ts"> <script lang="ts">
import { UIEventSource } from "../Logic/UIEventSource"; import {UIEventSource} from "../Logic/UIEventSource";
import { Map as MlMap } from "maplibre-gl"; import {Map as MlMap} from "maplibre-gl";
import MaplibreMap from "./Map/MaplibreMap.svelte"; import MaplibreMap from "./Map/MaplibreMap.svelte";
import FeatureSwitchState from "../Logic/State/FeatureSwitchState"; import FeatureSwitchState from "../Logic/State/FeatureSwitchState";
import MapControlButton from "./Base/MapControlButton.svelte"; import MapControlButton from "./Base/MapControlButton.svelte";
import ToSvelte from "./Base/ToSvelte.svelte"; import ToSvelte from "./Base/ToSvelte.svelte";
import If from "./Base/If.svelte"; import If from "./Base/If.svelte";
import { GeolocationControl } from "./BigComponents/GeolocationControl"; import {GeolocationControl} from "./BigComponents/GeolocationControl";
import type { Feature } from "geojson"; import type {Feature} from "geojson";
import SelectedElementView from "./BigComponents/SelectedElementView.svelte"; import SelectedElementView from "./BigComponents/SelectedElementView.svelte";
import LayerConfig from "../Models/ThemeConfig/LayerConfig"; import LayerConfig from "../Models/ThemeConfig/LayerConfig";
import Filterview from "./BigComponents/Filterview.svelte"; import Filterview from "./BigComponents/Filterview.svelte";
import RasterLayerPicker from "./Map/RasterLayerPicker.svelte"; import RasterLayerPicker from "./Map/RasterLayerPicker.svelte";
import ThemeViewState from "../Models/ThemeViewState"; import ThemeViewState from "../Models/ThemeViewState";
import type { MapProperties } from "../Models/MapProperties"; import type {MapProperties} from "../Models/MapProperties";
import Geosearch from "./BigComponents/Geosearch.svelte"; import Geosearch from "./BigComponents/Geosearch.svelte";
import Translations from "./i18n/Translations"; import Translations from "./i18n/Translations";
import { CogIcon, EyeIcon, MenuIcon } from "@rgossiaux/svelte-heroicons/solid"; import {CogIcon, EyeIcon, MenuIcon} from "@rgossiaux/svelte-heroicons/solid";
import Tr from "./Base/Tr.svelte"; import Tr from "./Base/Tr.svelte";
import CommunityIndexView from "./BigComponents/CommunityIndexView.svelte"; import CommunityIndexView from "./BigComponents/CommunityIndexView.svelte";
import FloatOver from "./Base/FloatOver.svelte"; import FloatOver from "./Base/FloatOver.svelte";
@ -27,14 +27,15 @@
import LoginToggle from "./Base/LoginToggle.svelte"; import LoginToggle from "./Base/LoginToggle.svelte";
import LoginButton from "./Base/LoginButton.svelte"; import LoginButton from "./Base/LoginButton.svelte";
import CopyrightPanel from "./BigComponents/CopyrightPanel"; import CopyrightPanel from "./BigComponents/CopyrightPanel";
import { DownloadPanel } from "./BigComponents/DownloadPanel"; import {DownloadPanel} from "./BigComponents/DownloadPanel";
import ModalRight from "./Base/ModalRight.svelte"; import ModalRight from "./Base/ModalRight.svelte";
import { Utils } from "../Utils"; import {Utils} from "../Utils";
import Hotkeys from "./Base/Hotkeys"; import Hotkeys from "./Base/Hotkeys";
import { VariableUiElement } from "./Base/VariableUIElement"; import {VariableUiElement} from "./Base/VariableUIElement";
import SvelteUIElement from "./Base/SvelteUIElement"; import SvelteUIElement from "./Base/SvelteUIElement";
import OverlayToggle from "./BigComponents/OverlayToggle.svelte"; import OverlayToggle from "./BigComponents/OverlayToggle.svelte";
import LevelSelector from "./BigComponents/LevelSelector.svelte"; import LevelSelector from "./BigComponents/LevelSelector.svelte";
import Svg from "../Svg";
export let state: ThemeViewState; export let state: ThemeViewState;
let layout = state.layout; let layout = state.layout;
@ -53,7 +54,7 @@
} }
const tags = state.featureProperties.getStore(selectedElement.properties.id); const tags = state.featureProperties.getStore(selectedElement.properties.id);
return new SvelteUIElement(SelectedElementView, { state, layer, selectedElement, tags }); return new SvelteUIElement(SelectedElementView, {state, layer, selectedElement, tags});
}, [selectedLayer]); }, [selectedLayer]);
@ -61,6 +62,7 @@
let featureSwitches: FeatureSwitchState = state.featureSwitches; let featureSwitches: FeatureSwitchState = state.featureSwitches;
let availableLayers = state.availableLayers; let availableLayers = state.availableLayers;
let userdetails = state.osmConnection.userDetails; let userdetails = state.osmConnection.userDetails;
let currentViewLayer = layout.layers.find(l => l.id === "current_view")
</script> </script>
@ -88,6 +90,13 @@
<MapControlButton on:click={() =>state.guistate.menuIsOpened.setData(true)}> <MapControlButton on:click={() =>state.guistate.menuIsOpened.setData(true)}>
<MenuIcon class="w-8 h-8 cursor-pointer"></MenuIcon> <MenuIcon class="w-8 h-8 cursor-pointer"></MenuIcon>
</MapControlButton> </MapControlButton>
{#if currentViewLayer?.tagRenderings}
<MapControlButton
on:click={() => {selectedLayer.setData(currentViewLayer); selectedElement.setData(state.currentView.features?.data?.[0])}}>
<ToSvelte
construct={() =>(currentViewLayer.defaultIcon() ?? Svg.checkbox_empty_svg()).SetClass("w-8 h-8 cursor-pointer")}/>
</MapControlButton>
{/if}
<If condition={state.featureSwitchIsTesting}> <If condition={state.featureSwitchIsTesting}>
<span class="alert"> <span class="alert">
Testmode Testmode
@ -108,10 +117,10 @@
</div> </div>
</If> </If>
<MapControlButton on:click={() => mapproperties.zoom.update(z => z+1)}> <MapControlButton on:click={() => mapproperties.zoom.update(z => z+1)}>
<img src="./assets/svg/plus.svg" class="w-8 h-8"/> <img class="w-8 h-8" src="./assets/svg/plus.svg"/>
</MapControlButton> </MapControlButton>
<MapControlButton on:click={() => mapproperties.zoom.update(z => z-1)}> <MapControlButton on:click={() => mapproperties.zoom.update(z => z-1)}>
<img src="./assets/svg/min.svg" class="w-8 h-8"/> <img class="w-8 h-8" src="./assets/svg/min.svg"/>
</MapControlButton> </MapControlButton>
<If condition={featureSwitches.featureSwitchGeolocation}> <If condition={featureSwitches.featureSwitchGeolocation}>
<MapControlButton> <MapControlButton>
@ -137,15 +146,15 @@
<!-- Theme page --> <!-- Theme page -->
<FloatOver on:close={() => state.guistate.themeIsOpened.setData(false)}> <FloatOver on:close={() => state.guistate.themeIsOpened.setData(false)}>
<TabbedGroup tab={state.guistate.themeViewTabIndex}> <TabbedGroup tab={state.guistate.themeViewTabIndex}>
<Tr slot="title0" t={layout.title} /> <Tr slot="title0" t={layout.title}/>
<div slot="content0"> <div slot="content0">
<Tr t={layout.description}></Tr> <Tr t={layout.description}></Tr>
<Tr t={Translations.t.general.welcomeExplanation.general} /> <Tr t={Translations.t.general.welcomeExplanation.general}/>
{#if layout.layers.some((l) => l.presets?.length > 0)} {#if layout.layers.some((l) => l.presets?.length > 0)}
<If condition={state.featureSwitches.featureSwitchAddNew}> <If condition={state.featureSwitches.featureSwitchAddNew}>
<Tr t={Translations.t.general.welcomeExplanation.addNew} /> <Tr t={Translations.t.general.welcomeExplanation.addNew}/>
</If> </If>
{/if} {/if}
@ -156,7 +165,7 @@
<div class="m-x-8"> <div class="m-x-8">
<button class="subtle-background rounded w-full p-4" <button class="subtle-background rounded w-full p-4"
on:click={() => state.guistate.themeIsOpened.setData(false)}> on:click={() => state.guistate.themeIsOpened.setData(false)}>
<Tr t={Translations.t.general.openTheMap} /> <Tr t={Translations.t.general.openTheMap}/>
</button> </button>
</div> </div>
@ -165,13 +174,14 @@
<div class="flex" slot="title1"> <div class="flex" slot="title1">
<If condition={state.featureSwitches.featureSwitchFilter}> <If condition={state.featureSwitches.featureSwitchFilter}>
<img class="w-4 h-4" src="./assets/svg/filter.svg"> <img class="w-4 h-4" src="./assets/svg/filter.svg">
<Tr t={Translations.t.general.menu.filter} /> <Tr t={Translations.t.general.menu.filter}/>
</If> </If>
</div> </div>
<div class="flex flex-col" slot="content1"> <div class="flex flex-col" slot="content1">
{#each layout.layers as layer} {#each layout.layers as layer}
<Filterview zoomlevel={state.mapProperties.zoom} filteredLayer={state.layerState.filteredLayers.get(layer.id)} <Filterview zoomlevel={state.mapProperties.zoom}
filteredLayer={state.layerState.filteredLayers.get(layer.id)}
highlightedLayer={state.guistate.highlightedLayerInFilters}></Filterview> highlightedLayer={state.guistate.highlightedLayerInFilters}></Filterview>
{/each} {/each}
{#each layout.tileLayerSources as tilesource} {#each layout.tileLayerSources as tilesource}
@ -188,16 +198,16 @@
</div> </div>
<div class="flex" slot="title2"> <div class="flex" slot="title2">
<If condition={state.featureSwitches.featureSwitchEnableExport}> <If condition={state.featureSwitches.featureSwitchEnableExport}>
<img class="w-4 h-4" src="./assets/svg/download.svg" /> <img class="w-4 h-4" src="./assets/svg/download.svg"/>
<Tr t={Translations.t.general.download.title} /> <Tr t={Translations.t.general.download.title}/>
</If> </If>
</div> </div>
<div slot="content2"> <div slot="content2">
<ToSvelte construct={() => new DownloadPanel(state)} /> <ToSvelte construct={() => new DownloadPanel(state)}/>
</div> </div>
<div slot="title3"> <div slot="title3">
<Tr t={Translations.t.general.attribution.title} /> <Tr t={Translations.t.general.attribution.title}/>
</div> </div>
<ToSvelte construct={() => new CopyrightPanel(state)} slot="content3"></ToSvelte> <ToSvelte construct={() => new CopyrightPanel(state)} slot="content3"></ToSvelte>
@ -213,37 +223,37 @@
<FloatOver on:close={() => state.guistate.menuIsOpened.setData(false)}> <FloatOver on:close={() => state.guistate.menuIsOpened.setData(false)}>
<TabbedGroup tab={state.guistate.menuViewTabIndex}> <TabbedGroup tab={state.guistate.menuViewTabIndex}>
<div class="flex" slot="title0"> <div class="flex" slot="title0">
<Tr t={Translations.t.general.menu.aboutMapComplete} /> <Tr t={Translations.t.general.menu.aboutMapComplete}/>
</div> </div>
<div class="flex flex-col" slot="content0"> <div class="flex flex-col" slot="content0">
<Tr t={Translations.t.general.aboutMapComplete.intro} /> <Tr t={Translations.t.general.aboutMapComplete.intro}/>
<a class="flex" href={Utils.HomepageLink()}> <a class="flex" href={Utils.HomepageLink()}>
<img class="w-6 h-6" src="./assets/svg/add.svg"> <img class="w-6 h-6" src="./assets/svg/add.svg">
<Tr t={Translations.t.general.backToIndex} /> <Tr t={Translations.t.general.backToIndex}/>
</a> </a>
<a class="flex" href="https://github.com/pietervdvn/MapComplete/issues" target="_blank"> <a class="flex" href="https://github.com/pietervdvn/MapComplete/issues" target="_blank">
<img class="w-6 h-6" src="./assets/svg/bug.svg"> <img class="w-6 h-6" src="./assets/svg/bug.svg">
<Tr t={Translations.t.general.attribution.openIssueTracker} /> <Tr t={Translations.t.general.attribution.openIssueTracker}/>
</a> </a>
<a class="flex" href="https://en.osm.town/@MapComplete" target="_blank"> <a class="flex" href="https://en.osm.town/@MapComplete" target="_blank">
<img class="w-6 h-6" src="./assets/svg/mastodon.svg"> <img class="w-6 h-6" src="./assets/svg/mastodon.svg">
<Tr t={Translations.t.general.attribution.followOnMastodon} /> <Tr t={Translations.t.general.attribution.followOnMastodon}/>
</a> </a>
<a class="flex" href="https://liberapay.com/pietervdvn/" target="_blank"> <a class="flex" href="https://liberapay.com/pietervdvn/" target="_blank">
<img class="w-6 h-6" src="./assets/svg/liberapay.svg"> <img class="w-6 h-6" src="./assets/svg/liberapay.svg">
<Tr t={Translations.t.general.attribution.donate} /> <Tr t={Translations.t.general.attribution.donate}/>
</a> </a>
<a class="flex" href={Utils.OsmChaLinkFor(7)} target="_blank"> <a class="flex" href={Utils.OsmChaLinkFor(7)} target="_blank">
<img class="w-6 h-6" src="./assets/svg/statistics.svg"> <img class="w-6 h-6" src="./assets/svg/statistics.svg">
<Tr t={Translations.t.general.attribution.openOsmcha.Subs({theme: "MapComplete"})} /> <Tr t={Translations.t.general.attribution.openOsmcha.Subs({theme: "MapComplete"})}/>
</a> </a>
{Constants.vNumber} {Constants.vNumber}
<ToSvelte construct={Hotkeys.generateDocumentationDynamic}></ToSvelte> <ToSvelte construct={Hotkeys.generateDocumentationDynamic}></ToSvelte>
@ -252,8 +262,8 @@
<If condition={state.osmConnection.isLoggedIn} slot="title1"> <If condition={state.osmConnection.isLoggedIn} slot="title1">
<div class="flex"> <div class="flex">
<CogIcon class="w-6 h-6" /> <CogIcon class="w-6 h-6"/>
<Tr t={UserRelatedState.usersettingsConfig.title.GetRenderValue({})} /> <Tr t={UserRelatedState.usersettingsConfig.title.GetRenderValue({})}/>
</div> </div>
</If> </If>
@ -261,7 +271,7 @@
<!-- All shown components are set by 'usersettings.json', which happily uses some special visualisations created specifically for it --> <!-- All shown components are set by 'usersettings.json', which happily uses some special visualisations created specifically for it -->
<LoginToggle {state}> <LoginToggle {state}>
<div slot="not-logged-in"> <div slot="not-logged-in">
<Tr class="alert" t={Translations.t.userinfo.notLoggedIn} /> <Tr class="alert" t={Translations.t.userinfo.notLoggedIn}/>
<LoginButton osmConnection={state.osmConnection}></LoginButton> <LoginButton osmConnection={state.osmConnection}></LoginButton>
</div> </div>
<SelectedElementView <SelectedElementView
@ -282,7 +292,7 @@
<CommunityIndexView location={state.mapProperties.location} slot="content2"></CommunityIndexView> <CommunityIndexView location={state.mapProperties.location} slot="content2"></CommunityIndexView>
<div class="flex" slot="title3"> <div class="flex" slot="title3">
<EyeIcon class="w-6" /> <EyeIcon class="w-6"/>
<Tr t={Translations.t.privacy.title}></Tr> <Tr t={Translations.t.privacy.title}></Tr>
</div> </div>
<ToSvelte construct={() => new PrivacyPolicy()} slot="content3"></ToSvelte> <ToSvelte construct={() => new PrivacyPolicy()} slot="content3"></ToSvelte>

View file

@ -1,10 +1,11 @@
{ {
"id": "current_view", "id": "current_view",
"description": "A meta-layer which contains one single feature, namely the BBOX of the current map view. This can be used to trigger special actions. If a popup is defined for this layer, this popup will be accessible via an extra button on screen.\n\nThe icon on the button is the default icon of the layer, but can be customized by detecting 'button=yes'.", "description": "A meta-layer which contains one single feature, namely the bounding box of the current map view. This can be used to trigger special actions. If a popup is defined for this layer, this popup will be accessible via an extra button on screen.\n\nThe icon on the button is the default icon of the layer, but can be customized by detecting 'button=yes'.",
"source": "special", "source": "special",
"shownByDefault": false, "shownByDefault": false,
"title": "Current View", "title": "Current View",
"tagRenderings": [], "tagRenderings": [],
"popupInFloatover": true,
"mapRendering": [ "mapRendering": [
{ {
"color": "#cccc0088" "color": "#cccc0088"