diff --git a/i18n/en.json b/i18n/en.json index 5903d7850e..29e261aee9 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -1984,6 +1984,7 @@ "show_progress_bar": "Show Progress Bar", "show_search_options": "Show search options", "show_shared_links": "Show shared links", + "show_slideshow_metadata_overlay": "Show image info overlay", "show_slideshow_transition": "Show slideshow transition", "show_supporter_badge": "Supporter badge", "show_supporter_badge_description": "Show a supporter badge", @@ -1999,6 +2000,9 @@ "skip_to_folders": "Skip to folders", "skip_to_tags": "Skip to tags", "slideshow": "Slideshow", + "slideshow_metadata_overlay_mode": "Overlay content", + "slideshow_metadata_overlay_mode_description_only": "Description only", + "slideshow_metadata_overlay_mode_full": "Full", "slideshow_settings": "Slideshow settings", "sort_albums_by": "Sort albums by...", "sort_created": "Date created", diff --git a/web/src/lib/components/asset-viewer/asset-viewer.svelte b/web/src/lib/components/asset-viewer/asset-viewer.svelte index b657f34ece..4c5cb5870d 100644 --- a/web/src/lib/components/asset-viewer/asset-viewer.svelte +++ b/web/src/lib/components/asset-viewer/asset-viewer.svelte @@ -48,6 +48,7 @@ import OcrButton from './ocr-button.svelte'; import PhotoViewer from './photo-viewer.svelte'; import SlideshowBar from './slideshow-bar.svelte'; + import SlideshowMetadataOverlay from './slideshow-metadata-overlay.svelte'; import VideoViewer from './video-wrapper-viewer.svelte'; type HasAsset = boolean; @@ -560,6 +561,10 @@ {/if} + + {#if $slideshowState !== SlideshowState.None} + + {/if} {/key} {/if} diff --git a/web/src/lib/components/asset-viewer/slideshow-metadata-overlay.svelte b/web/src/lib/components/asset-viewer/slideshow-metadata-overlay.svelte new file mode 100644 index 0000000000..a1fc8e8a28 --- /dev/null +++ b/web/src/lib/components/asset-viewer/slideshow-metadata-overlay.svelte @@ -0,0 +1,145 @@ + + +{#if shouldShow()} +
+ +
+
+ {#if $slideshowMetadataOverlayMode === SlideshowMetadataOverlayMode.DescriptionOnly} + {#if description} +

+ {description} +

+ {/if} + {:else} + + {#if description} +

+ {description} +

+ {/if} +
+ {#if dateString} +

{dateString}

+ {/if} + {#if locationString} +

{locationString}

+ {/if} +
+ {/if} +
+
+
+{/if} diff --git a/web/src/lib/modals/SlideshowSettingsModal.svelte b/web/src/lib/modals/SlideshowSettingsModal.svelte index a5852b8593..b061173241 100644 --- a/web/src/lib/modals/SlideshowSettingsModal.svelte +++ b/web/src/lib/modals/SlideshowSettingsModal.svelte @@ -14,7 +14,12 @@ } from '@mdi/js'; import { t } from 'svelte-i18n'; import SettingDropdown from '../components/shared-components/settings/setting-dropdown.svelte'; - import { SlideshowLook, SlideshowNavigation, slideshowStore } from '../stores/slideshow.store'; + import { + SlideshowLook, + SlideshowMetadataOverlayMode, + SlideshowNavigation, + slideshowStore, + } from '../stores/slideshow.store'; const { slideshowDelay, @@ -23,6 +28,8 @@ slideshowLook, slideshowTransition, slideshowAutoplay, + slideshowShowMetadataOverlay, + slideshowMetadataOverlayMode, } = slideshowStore; interface Props { @@ -38,6 +45,8 @@ let tempSlideshowLook = $state($slideshowLook); let tempSlideshowTransition = $state($slideshowTransition); let tempSlideshowAutoplay = $state($slideshowAutoplay); + let tempSlideshowShowMetadataOverlay = $state($slideshowShowMetadataOverlay); + let tempSlideshowMetadataOverlayMode = $state($slideshowMetadataOverlayMode); const navigationOptions: Record = { [SlideshowNavigation.Shuffle]: { icon: mdiShuffle, title: $t('shuffle') }, @@ -51,7 +60,16 @@ [SlideshowLook.BlurredBackground]: { icon: mdiPanorama, title: $t('blurred_background') }, }; - const handleToggle = ( + const metadataOverlayModeOptions: Record = { + [SlideshowMetadataOverlayMode.DescriptionOnly]: { + title: $t('slideshow_metadata_overlay_mode_description_only'), + }, + [SlideshowMetadataOverlayMode.Full]: { + title: $t('slideshow_metadata_overlay_mode_full'), + }, + }; + + const handleToggle = ( record: RenderedOption, options: Record, ): undefined | Type => { @@ -69,6 +87,8 @@ $slideshowLook = tempSlideshowLook; $slideshowTransition = tempSlideshowTransition; $slideshowAutoplay = tempSlideshowAutoplay; + $slideshowShowMetadataOverlay = tempSlideshowShowMetadataOverlay; + $slideshowMetadataOverlayMode = tempSlideshowMetadataOverlayMode; onClose(); }; @@ -95,6 +115,20 @@ + +
+ { + if (tempSlideshowShowMetadataOverlay) { + tempSlideshowMetadataOverlayMode = + handleToggle(option, metadataOverlayModeOptions) || tempSlideshowMetadataOverlayMode; + } + }} + /> +
= { [SlideshowLook.Contain]: 'object-contain', [SlideshowLook.Cover]: 'object-cover', @@ -40,6 +45,11 @@ function createSlideshowStore() { const slideshowDelay = persisted('slideshow-delay', 5, {}); const slideshowTransition = persisted('slideshow-transition', true); const slideshowAutoplay = persisted('slideshow-autoplay', true, {}); + const slideshowShowMetadataOverlay = persisted('slideshow-show-metadata-overlay', false); + const slideshowMetadataOverlayMode = persisted( + 'slideshow-metadata-overlay-mode', + SlideshowMetadataOverlayMode.Full, + ); return { restartProgress: { @@ -71,6 +81,8 @@ function createSlideshowStore() { showProgressBar, slideshowTransition, slideshowAutoplay, + slideshowShowMetadataOverlay, + slideshowMetadataOverlayMode, }; }