From 2700c76392190e61aa03fae3cb326375b2ba4e2c Mon Sep 17 00:00:00 2001 From: Jan Ackermann Date: Wed, 17 Jan 2024 13:26:22 +0100 Subject: [PATCH 1/8] Add image reset button to reset zoom, rotation and position --- packages/web-app-preview/src/App.vue | 51 +++++++++++++------ .../src/components/MediaControls.vue | 22 +++++++- .../src/components/Sources/MediaImage.vue | 42 +++++++++++++-- 3 files changed, 95 insertions(+), 20 deletions(-) diff --git a/packages/web-app-preview/src/App.vue b/packages/web-app-preview/src/App.vue index a01ae1f9e4b..ae36210205c 100644 --- a/packages/web-app-preview/src/App.vue +++ b/packages/web-app-preview/src/App.vue @@ -48,6 +48,9 @@ :file="activeMediaFileCached" :current-image-rotation="currentImageRotation" :current-image-zoom="currentImageZoom" + :current-image-position-x="currentImagePositionX" + :current-image-position-y="currentImagePositionY" + @pan-change="onPanChanged" /> ([]) const folderLoaded = ref(false) + const isFileContentError = ref(false) + const isAutoPlayEnabled = ref(true) + const toPreloadImageIds = ref([]) + const currentImageZoom = ref(1) + const currentImageRotation = ref(0) + const currentImagePositionX = ref(0) + const currentImagePositionY = ref(0) + const preloadImageCount = ref(10) const sortBy = computed(() => { if (!unref(contextRouteQuery)) { @@ -183,6 +195,18 @@ export default defineComponent({ } } + const onPanChanged = ({ x, y }: { x: number; y: number }) => { + currentImagePositionX.value = x + currentImagePositionY.value = y + } + + const resetImage = () => { + currentImageZoom.value = 1 + currentImageRotation.value = 0 + currentImagePositionX.value = 0 + currentImagePositionY.value = 0 + } + const filteredFiles = computed(() => { if (!unref(activeFiles)) { return [] @@ -280,23 +304,19 @@ export default defineComponent({ toggleFullscreenMode, updateLocalHistory, fileId, - space - } - }, - data() { - return { - isFileContentError: false, - isAutoPlayEnabled: true, - - toPreloadImageIds: [], - - currentImageZoom: 1, - currentImageRotation: 0, - - preloadImageCount: 10 + space, + resetImage, + isFileContentError, + isAutoPlayEnabled, + toPreloadImageIds, + currentImageZoom, + currentImageRotation, + currentImagePositionX, + currentImagePositionY, + onPanChanged, + preloadImageCount } }, - computed: { pageTitle() { return this.$gettext('Preview for %{currentMediumName}', { @@ -544,6 +564,7 @@ export default defineComponent({ margin: 10px auto; } } + @media (max-width: $oc-breakpoint-medium-default) { .preview-sidebar-open { display: none; diff --git a/packages/web-app-preview/src/components/MediaControls.vue b/packages/web-app-preview/src/components/MediaControls.vue index a235ee27a8e..440ac12a032 100644 --- a/packages/web-app-preview/src/components/MediaControls.vue +++ b/packages/web-app-preview/src/components/MediaControls.vue @@ -102,6 +102,18 @@ +
+ + + +
@@ -143,7 +155,14 @@ export default defineComponent({ default: 0 } }, - emits: ['setRotation', 'setZoom', 'toggleFullScreen', 'toggleNext', 'togglePrevious'], + emits: [ + 'setRotation', + 'setZoom', + 'toggleFullScreen', + 'toggleNext', + 'togglePrevious', + 'resetImage' + ], setup(props, { emit }) { const { $gettext } = useGettext() @@ -189,6 +208,7 @@ export default defineComponent({ exitFullScreenDescription: $gettext('Exit full screen mode'), imageShrinkDescription: $gettext('Shrink the image'), imageZoomDescription: $gettext('Enlarge the image'), + imageResetDescription: $gettext('Reset image zoom, rotation and position'), imageOriginalSizeDescription: $gettext('Show the image at its normal size'), imageRotateLeftDescription: $gettext('Rotate the image 90 degrees to the left'), imageRotateRightDescription: $gettext('Rotate the image 90 degrees to the right'), diff --git a/packages/web-app-preview/src/components/Sources/MediaImage.vue b/packages/web-app-preview/src/components/Sources/MediaImage.vue index 854e8de2d1e..e6420bd3974 100644 --- a/packages/web-app-preview/src/components/Sources/MediaImage.vue +++ b/packages/web-app-preview/src/components/Sources/MediaImage.vue @@ -11,8 +11,9 @@