From d544053c679aa0ef493a9853e2db8a7ece01f4c5 Mon Sep 17 00:00:00 2001 From: Dag Stuan Date: Mon, 2 Jun 2025 16:45:39 +0200 Subject: [PATCH] feat(web): improve slideshow quality of life (#18778) * Add a new setting to toggle autoplay when showing the slideshow. * Fix an issue where the slideshow would restart automatically when navigating after it was paused. * Add a keyboard shortcut 's' to start the slideshow from the asset viewer. * Add a keyboard shortcut ' ' to toggle the slideshow play/paused. * Change the timeout for hiding the slideshow controls from 10 to 2.5 seconds. * Add English translation for the 'autoplay_slideshow' setting. Co-authored-by: Alex --- i18n/en.json | 1 + .../asset-viewer/asset-viewer.svelte | 2 ++ .../asset-viewer/photo-viewer.svelte | 4 ++++ .../asset-viewer/slideshow-bar.svelte | 24 ++++++++++++++----- .../progress-bar/progress-bar.svelte | 11 +++++---- .../lib/components/slideshow-settings.svelte | 12 +++++++++- web/src/lib/stores/slideshow.store.ts | 2 ++ 7 files changed, 45 insertions(+), 11 deletions(-) diff --git a/i18n/en.json b/i18n/en.json index 4ddffd4ff0e..3e37b2da655 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -477,6 +477,7 @@ "authorized_devices": "Authorized Devices", "automatic_endpoint_switching_subtitle": "Connect locally over designated Wi-Fi when available and use alternative connections elsewhere", "automatic_endpoint_switching_title": "Automatic URL switching", + "autoplay_slideshow": "Autoplay slideshow", "back": "Back", "back_close_deselect": "Back, close, or deselect", "background_location_permission": "Background location permission", diff --git a/web/src/lib/components/asset-viewer/asset-viewer.svelte b/web/src/lib/components/asset-viewer/asset-viewer.svelte index c4e51d56695..bc2afac059a 100644 --- a/web/src/lib/components/asset-viewer/asset-viewer.svelte +++ b/web/src/lib/components/asset-viewer/asset-viewer.svelte @@ -352,7 +352,9 @@ const handleUpdateSelectedEditType = (type: string) => { selectedEditType = type; }; + let isFullScreen = $derived(fullscreenElement !== null); + $effect(() => { if (asset) { previewStackedAsset = undefined; diff --git a/web/src/lib/components/asset-viewer/photo-viewer.svelte b/web/src/lib/components/asset-viewer/photo-viewer.svelte index 35fa63654a0..3dffc0e84c9 100644 --- a/web/src/lib/components/asset-viewer/photo-viewer.svelte +++ b/web/src/lib/components/asset-viewer/photo-viewer.svelte @@ -113,6 +113,8 @@ }); }; + const onPlaySlideshow = () => ($slideshowState = SlideshowState.PlaySlideshow); + $effect(() => { if (isFaceEditMode.value && $photoZoomState.currentZoom > 1) { zoomToggle(); @@ -206,6 +208,8 @@ {}, }: Props = $props(); - const { restartProgress, stopProgress, slideshowDelay, showProgressBar, slideshowNavigation } = slideshowStore; + const { restartProgress, stopProgress, slideshowDelay, showProgressBar, slideshowNavigation, slideshowAutoplay } = + slideshowStore; let progressBarStatus: ProgressBarStatus | undefined = $state(); let progressBar = $state>(); @@ -60,20 +61,20 @@ showControls = false; setCursorStyle('none'); } - }, 10_000); + }, 2500); }; onMount(() => { hideControlsAfterDelay(); unsubscribeRestart = restartProgress.subscribe((value) => { if (value) { - progressBar?.restart(value); + progressBar?.restart(); } }); unsubscribeStop = stopProgress.subscribe((value) => { if (value) { - progressBar?.restart(false); + progressBar?.restart(); stopControlsHideTimer(); } }); @@ -90,7 +91,7 @@ }); const handleDone = async () => { - await progressBar?.reset(); + await progressBar?.resetProgress(); if ($slideshowNavigation === SlideshowNavigation.AscendingOrder) { onPrevious(); @@ -113,6 +114,17 @@ { shortcut: { key: 'Escape' }, onShortcut: onClose }, { shortcut: { key: 'ArrowLeft' }, onShortcut: onPrevious }, { shortcut: { key: 'ArrowRight' }, onShortcut: onNext }, + { + shortcut: { key: ' ' }, + onShortcut: () => { + if (progressBarStatus === ProgressBarStatus.Paused) { + progressBar?.play(); + } else { + progressBar?.pause(); + } + }, + preventDefault: true, + }, ]} /> @@ -187,7 +199,7 @@ {/if}