Skip to content

Commit 2a65d22

Browse files
dagstuansavely-krasovsky
authored andcommitted
fix(web): Improve zoom behavior in photo-viewer. (immich-app#18803)
* Fix an issue where clicking the zoom-button after having zoomed in would not zoom completely out, but leave the image in the zoomed-in state. The new behavior properly zoomes the image completely out after clicking the zoom-button. * Revert to the default setting for `wheelZoomRatio` as the previous setting of 0.2 was borderline unusable on a trackpad. This could probably be moved to a user setting if needed. * Add a keyboard shortcut 'z' to toggle image zoom.
1 parent 4965a00 commit 2a65d22

File tree

3 files changed

+9
-13
lines changed

3 files changed

+9
-13
lines changed

web/src/lib/actions/zoom-image.ts

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,20 @@
1-
import { photoZoomState, zoomed } from '$lib/stores/zoom-image.store';
1+
import { photoZoomState } from '$lib/stores/zoom-image.store';
22
import { useZoomImageWheel } from '@zoom-image/svelte';
33
import { get } from 'svelte/store';
44

5-
export { zoomed } from '$lib/stores/zoom-image.store';
6-
75
export const zoomImageAction = (node: HTMLElement) => {
86
const { createZoomImage, zoomImageState, setZoomImageState } = useZoomImageWheel();
97

108
createZoomImage(node, {
119
maxZoom: 10,
12-
wheelZoomRatio: 0.2,
1310
});
1411

1512
const state = get(photoZoomState);
1613
if (state) {
1714
setZoomImageState(state);
1815
}
1916

20-
const unsubscribes = [
21-
zoomed.subscribe((state) => setZoomImageState({ currentZoom: state ? 2 : 1 })),
22-
zoomImageState.subscribe((state) => photoZoomState.set(state)),
23-
];
17+
const unsubscribes = [photoZoomState.subscribe(setZoomImageState), zoomImageState.subscribe(photoZoomState.set)];
2418
return {
2519
destroy() {
2620
for (const unsubscribe of unsubscribes) {

web/src/lib/components/asset-viewer/photo-viewer.svelte

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
<script lang="ts">
22
import { shortcuts } from '$lib/actions/shortcut';
3-
import { zoomImageAction, zoomed } from '$lib/actions/zoom-image';
3+
import { zoomImageAction } from '$lib/actions/zoom-image';
44
import FaceEditor from '$lib/components/asset-viewer/face-editor/face-editor.svelte';
55
import BrokenAsset from '$lib/components/assets/broken-asset.svelte';
6+
import { castManager } from '$lib/managers/cast-manager.svelte';
67
import { photoViewerImgElement, type TimelineAsset } from '$lib/stores/assets-store.svelte';
78
import { isFaceEditMode } from '$lib/stores/face-edit.svelte';
89
import { boundingBoxesArray } from '$lib/stores/people.store';
@@ -23,7 +24,6 @@
2324
import { fade } from 'svelte/transition';
2425
import LoadingSpinner from '../shared-components/loading-spinner.svelte';
2526
import { NotificationType, notificationController } from '../shared-components/notification/notification';
26-
import { castManager } from '$lib/managers/cast-manager.svelte';
2727
2828
interface Props {
2929
asset: AssetResponseDto;
@@ -65,7 +65,6 @@
6565
currentPositionX: 0,
6666
currentPositionY: 0,
6767
});
68-
$zoomed = false;
6968
7069
onDestroy(() => {
7170
$boundingBoxesArray = [];
@@ -108,7 +107,10 @@
108107
};
109108
110109
zoomToggle = () => {
111-
$zoomed = $zoomed ? false : true;
110+
photoZoomState.set({
111+
...$photoZoomState,
112+
currentZoom: $photoZoomState.currentZoom > 1 ? 1 : 2,
113+
});
112114
};
113115
114116
$effect(() => {
@@ -206,6 +208,7 @@
206208
use:shortcuts={[
207209
{ shortcut: { key: 'c', ctrl: true }, onShortcut: onCopyShortcut, preventDefault: false },
208210
{ shortcut: { key: 'c', meta: true }, onShortcut: onCopyShortcut, preventDefault: false },
211+
{ shortcut: { key: 'z' }, onShortcut: zoomToggle, preventDefault: false },
209212
]}
210213
/>
211214
{#if imageError}

web/src/lib/stores/zoom-image.store.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,3 @@ import type { ZoomImageWheelState } from '@zoom-image/core';
22
import { writable } from 'svelte/store';
33

44
export const photoZoomState = writable<ZoomImageWheelState>();
5-
export const zoomed = writable<boolean>();

0 commit comments

Comments
 (0)