MapComplete/src/UI/Image/ImagePreview.svelte

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

75 lines
2 KiB
Svelte
Raw Normal View History

<script lang="ts">
2023-12-19 22:08:00 +01:00
/**
* The image preview allows to drag and zoom in to the image
*/
import panzoom from "panzoom"
import type { ProvidedImage } from "../../Logic/ImageProviders/ImageProvider"
import { UIEventSource } from "../../Logic/UIEventSource"
import Zoomcontrol from "../Zoomcontrol"
import { getContext, onDestroy } from "svelte"
import type { PanoramaView } from "./photoSphereViewerWrapper"
import { PhotoSphereViewerWrapper } from "./photoSphereViewerWrapper"
import type { Feature, Point } from "geojson"
import { Store } from "../../Logic/UIEventSource"
export let nearbyFeatures: Feature[] | Store<Feature[]> = []
export let image: Partial<ProvidedImage>
2023-12-19 22:08:00 +01:00
let panzoomInstance = undefined
let panzoomEl: HTMLElement
let viewerEl: HTMLElement
export let isLoaded: UIEventSource<boolean> = undefined
onDestroy(Zoomcontrol.createLock())
async function initPhotosphere() {
let f: Feature<Point, PanoramaView> = await image.provider.getPanoramaInfo(image)
const viewer = new PhotoSphereViewerWrapper(viewerEl, f)
if (Array.isArray(nearbyFeatures)) {
viewer.setNearbyFeatures(nearbyFeatures)
} else {
nearbyFeatures.addCallbackAndRunD(feats => {
viewer.setNearbyFeatures(feats)
})
}
isLoaded.set(true)
}
2023-12-19 22:08:00 +01:00
$: {
if (image.isSpherical) {
initPhotosphere()
} else if (panzoomEl) {
2023-12-19 22:08:00 +01:00
panzoomInstance = panzoom(panzoomEl, {
bounds: true,
boundsPadding: 0.49,
2024-01-16 04:21:46 +01:00
minZoom: 0.1,
2023-12-19 22:08:00 +01:00
maxZoom: 25,
initialZoom: 1.0
2023-12-19 22:08:00 +01:00
})
} else {
panzoomInstance?.dispose()
}
2023-12-19 22:08:00 +01:00
}
</script>
<head>
<link rel="stylesheet" href="./node_modules/pannellum/build/pannellum.css">
</head>
{#if image.isSpherical}
<div bind:this={viewerEl} class="w-full h-full" />
{:else}
<img
bind:this={panzoomEl}
class="panzoom-image h-fit max-w-fit"
on:load={() => {
2023-12-30 15:24:30 +01:00
isLoaded?.setData(true)
}}
src={image.url_hd ?? image.url}
/>
{/if}