diff --git a/packages/frontend/src/components/MkImageGallery.item.vue b/packages/frontend/src/components/MkImageGallery.item.vue
index bc64123b9a..7a1fbfbf91 100644
--- a/packages/frontend/src/components/MkImageGallery.item.vue
+++ b/packages/frontend/src/components/MkImageGallery.item.vue
@@ -7,12 +7,13 @@ SPDX-License-Identifier: AGPL-3.0-only
- {{ image.filename }}
+ {{ image.comment ?? image.filename }}
@@ -62,6 +63,7 @@ import { i18n } from '@/i18n.js';
import { makeDoubleTapDetector } from '@/utility/double-tap.js';
import { calculateSourceTransform } from '@/components/MkImageGallery.utils.js';
import { deviceKind } from '@/utility/device-kind.js';
+import { isTouchUsing } from '@/utility/touch.js';
export type Image = {
id: string;
@@ -70,6 +72,7 @@ export type Image = {
width: number;
height: number;
filename?: string;
+ comment?: string;
sourceElement?: HTMLElement;
};
@@ -180,6 +183,20 @@ function resetToNeutral() {
transform.value.y = 0;
}
+function closeThis() {
+ emit('close');
+
+ infoShowing.value = false;
+
+ const sourceTransform = getScaleAndTranslationForSourceElement();
+
+ enableTransition.value = true;
+ rootEl.value.offsetHeight; // reflow
+ transform.value.x = sourceTransform.x;
+ transform.value.y = sourceTransform.y;
+ transform.value.scale = sourceTransform.scale;
+}
+
function onWheel(event: WheelEvent) {
event.preventDefault();
@@ -214,6 +231,7 @@ function onZoomGestureEnd() {
// ズーム中、ドラッグされたら画像を移動する
let isDragging = false;
+let isClick = false;
let lastX = 0;
let lastY = 0;
let currentPointerId: number | null = null;
@@ -231,6 +249,7 @@ function onPointerdown(ev: PointerEvent) {
rootEl.value.setPointerCapture(ev.pointerId);
isDragging = true;
+ isClick = true;
lastX = ev.clientX;
lastY = ev.clientY;
pointerVec = { x: 0, y: 0 };
@@ -262,6 +281,7 @@ function onPointermove(ev: PointerEvent) {
currentPointerId = null;
isVerticalSwiping = false;
isHorizontalSwiping = false;
+ isClick = false;
const a = Array.from(pointerEventCache.values())[0];
const b = Array.from(pointerEventCache.values())[1];
const distance = Math.hypot(a.clientX - b.clientX, a.clientY - b.clientY);
@@ -279,6 +299,10 @@ function onPointermove(ev: PointerEvent) {
const deltaX = ev.clientX - lastX;
const deltaY = ev.clientY - lastY;
+ if (Math.abs(ev.clientX - currentPointerStartOffset.x) > 5 || Math.abs(ev.clientY - currentPointerStartOffset.y) > 5) {
+ isClick = false;
+ }
+
if (isZooming.value) {
transform.value.x += deltaX;
transform.value.y += deltaY;
@@ -322,17 +346,7 @@ function onPointerup(ev: PointerEvent) {
const shouldCloseByUpwardSwipe = verticalSwipeDelta < -200 || (verticalSwipeDelta < 0 && pointerVec.y < -3); // 上の方で離された、または上に向かって強めに弾かれた
const shouldCloseByDownwardSwipe = verticalSwipeDelta > 200 || (verticalSwipeDelta > 0 && pointerVec.y > 3); // 下の方で離された、または下に向かって強めに弾かれた
if (shouldCloseByUpwardSwipe || shouldCloseByDownwardSwipe) {
- emit('close');
-
- infoShowing.value = false;
-
- const sourceTransform = getScaleAndTranslationForSourceElement();
-
- enableTransition.value = true;
- rootEl.value.offsetHeight; // reflow
- transform.value.x = sourceTransform.x;
- transform.value.y = sourceTransform.y;
- transform.value.scale = sourceTransform.scale;
+ closeThis();
return;
}
@@ -418,6 +432,19 @@ watch(thumbnailImageLoaded, () => {
transform.value.scale = 1;
}
}, { once: true });
+
+function onCLick() {
+ if (!isClick) return;
+
+ if (!isTouchUsing) {
+ if (isZooming.value) {
+ isZooming.value = false;
+ resetToNeutral();
+ } else {
+ closeThis();
+ }
+ }
+}