diff --git a/web/package-lock.json b/web/package-lock.json index c445a58b97..b6454c2caa 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -16,6 +16,8 @@ "@mdi/js": "^7.4.47", "@photo-sphere-viewer/core": "^5.11.5", "@photo-sphere-viewer/equirectangular-video-adapter": "^5.11.5", + "@photo-sphere-viewer/resolution-plugin": "^5.11.5", + "@photo-sphere-viewer/settings-plugin": "^5.11.5", "@photo-sphere-viewer/video-plugin": "^5.11.5", "@zoom-image/svelte": "^0.3.0", "dom-to-image": "^2.6.0", @@ -1669,6 +1671,25 @@ "@photo-sphere-viewer/video-plugin": "5.11.5" } }, + "node_modules/@photo-sphere-viewer/resolution-plugin": { + "version": "5.11.5", + "resolved": "https://registry.npmjs.org/@photo-sphere-viewer/resolution-plugin/-/resolution-plugin-5.11.5.tgz", + "integrity": "sha512-Dbvp5bBtozD3IWt1Q0wORVaZBcB1bV9xUeoOS9A7F7b3EkQ2pkC5/jot/1AyM4wtU5wJ63NWHskQ1d7m6WWazQ==", + "license": "MIT", + "peerDependencies": { + "@photo-sphere-viewer/core": "5.11.5", + "@photo-sphere-viewer/settings-plugin": "5.11.5" + } + }, + "node_modules/@photo-sphere-viewer/settings-plugin": { + "version": "5.11.5", + "resolved": "https://registry.npmjs.org/@photo-sphere-viewer/settings-plugin/-/settings-plugin-5.11.5.tgz", + "integrity": "sha512-ZgYaWjiBMhsoRH5ddW3h+v4J4LPmofsT7BBRq5UCssWw2Fsrvv7mFFRi4UbZ1qzeKmvNUOr8BaFQgX1ZLvUWfQ==", + "license": "MIT", + "peerDependencies": { + "@photo-sphere-viewer/core": "5.11.5" + } + }, "node_modules/@photo-sphere-viewer/video-plugin": { "version": "5.11.5", "resolved": "https://registry.npmjs.org/@photo-sphere-viewer/video-plugin/-/video-plugin-5.11.5.tgz", diff --git a/web/package.json b/web/package.json index de60c94887..9c9bfc680c 100644 --- a/web/package.json +++ b/web/package.json @@ -72,6 +72,8 @@ "@mdi/js": "^7.4.47", "@photo-sphere-viewer/core": "^5.11.5", "@photo-sphere-viewer/equirectangular-video-adapter": "^5.11.5", + "@photo-sphere-viewer/resolution-plugin": "^5.11.5", + "@photo-sphere-viewer/settings-plugin": "^5.11.5", "@photo-sphere-viewer/video-plugin": "^5.11.5", "@zoom-image/svelte": "^0.3.0", "dom-to-image": "^2.6.0", diff --git a/web/src/lib/components/asset-viewer/image-panorama-viewer.svelte b/web/src/lib/components/asset-viewer/image-panorama-viewer.svelte index 6da8cc33d3..7b9fd85b4a 100644 --- a/web/src/lib/components/asset-viewer/image-panorama-viewer.svelte +++ b/web/src/lib/components/asset-viewer/image-panorama-viewer.svelte @@ -24,7 +24,7 @@ {:then [data, { default: PhotoSphereViewer }]} {:catch} {$t('errors.failed_to_load_asset')} diff --git a/web/src/lib/components/asset-viewer/photo-sphere-viewer-adapter.svelte b/web/src/lib/components/asset-viewer/photo-sphere-viewer-adapter.svelte index 0c8f76a01e..517e630dc9 100644 --- a/web/src/lib/components/asset-viewer/photo-sphere-viewer-adapter.svelte +++ b/web/src/lib/components/asset-viewer/photo-sphere-viewer-adapter.svelte @@ -7,18 +7,21 @@ type AdapterConstructor, type PluginConstructor, } from '@photo-sphere-viewer/core'; + import { SettingsPlugin } from '@photo-sphere-viewer/settings-plugin'; + import { ResolutionPlugin } from '@photo-sphere-viewer/resolution-plugin'; import '@photo-sphere-viewer/core/index.css'; + import '@photo-sphere-viewer/settings-plugin/index.css'; import { onDestroy, onMount } from 'svelte'; interface Props { panorama: string | { source: string }; - originalImageUrl?: string; + originalPanorama?: string | { source: string }; adapter?: AdapterConstructor | [AdapterConstructor, unknown]; plugins?: (PluginConstructor | [PluginConstructor, unknown])[]; navbar?: boolean; } - let { panorama, originalImageUrl, adapter = EquirectangularAdapter, plugins = [], navbar = false }: Props = $props(); + let { panorama, originalPanorama, adapter = EquirectangularAdapter, plugins = [], navbar = false }: Props = $props(); let container: HTMLDivElement | undefined = $state(); let viewer: Viewer; @@ -30,9 +33,33 @@ viewer = new Viewer({ adapter, - plugins, + plugins: [ + SettingsPlugin, + [ + ResolutionPlugin, + { + defaultResolution: $alwaysLoadOriginalFile && originalPanorama ? 'original' : 'default', + resolutions: [ + { + id: 'default', + label: 'Default', + panorama, + }, + ...(originalPanorama + ? [ + { + id: 'original', + label: 'Original', + panorama: originalPanorama, + }, + ] + : []), + ], + }, + ], + ...plugins, + ], container, - panorama, touchmoveTwoFingers: false, mousewheelCtrlKey: false, navbar, @@ -40,15 +67,14 @@ maxFov: 120, fisheye: false, }); + const resolutionPlugin = viewer.getPlugin(ResolutionPlugin) as ResolutionPlugin; - if (originalImageUrl && !$alwaysLoadOriginalFile) { + if (originalPanorama && !$alwaysLoadOriginalFile) { const zoomHandler = ({ zoomLevel }: events.ZoomUpdatedEvent) => { // zoomLevel range: [0, 100] if (Math.round(zoomLevel) >= 75) { // Replace the preview with the original - viewer.setPanorama(originalImageUrl, { showLoader: false, speed: 150 }).catch(() => { - viewer.setPanorama(panorama, { showLoader: false, speed: 0 }).catch(() => {}); - }); + void resolutionPlugin.setResolution('original'); viewer.removeEventListener(events.ZoomUpdatedEvent.type, zoomHandler); } }; diff --git a/web/src/lib/components/asset-viewer/video-panorama-viewer.svelte b/web/src/lib/components/asset-viewer/video-panorama-viewer.svelte index 73315d661e..a205ffce3c 100644 --- a/web/src/lib/components/asset-viewer/video-panorama-viewer.svelte +++ b/web/src/lib/components/asset-viewer/video-panorama-viewer.svelte @@ -1,5 +1,5 @@