@@ -4,7 +4,7 @@ SPDX-License-Identifier: AGPL-3.0-only
44-->
55
66<template >
7- <div :class =" [hide ? $style.hidden : $style.visible, (image.isSensitive && prefer.s.highlightSensitiveMedia) && $style.sensitive]" @click =" reveal" @contextmenu.stop =" onContextmenu" >
7+ <div :class =" [isActuallyHidden ? $style.hidden : $style.visible, (image.isSensitive && prefer.s.highlightSensitiveMedia) && $style.sensitive]" @click =" reveal" @contextmenu.stop =" onContextmenu" @mousedown = " onPointerDown " @touchstart = " onPointerDown " @mouseup = " onPointerUp " @mouseleave = " onPointerUp " @touchend = " onPointerUp " @touchcancel = " onPointerUp " >
88 <component
99 :is =" disableImageLink ? 'div' : 'a'"
1010 v-bind =" disableImageLink ? {
@@ -20,20 +20,20 @@ SPDX-License-Identifier: AGPL-3.0-only
2020 <MkImgWithBlurhash
2121 v-if =" prefer .s .enableHighQualityImagePlaceholders "
2222 :hash =" image .blurhash "
23- :src =" (prefer .s .dataSaver .media && hide ) ? null : url "
24- :forceBlurhash =" hide "
25- :cover =" hide || cover "
23+ :src =" (prefer .s .dataSaver .media && isActuallyHidden ) ? null : url "
24+ :forceBlurhash =" isActuallyHidden "
25+ :cover =" cover "
2626 :alt =" image .comment || image .name "
2727 :title =" image .comment || image .name "
2828 :width =" image .properties .width "
2929 :height =" image .properties .height "
30- :style =" hide ? ' filter: brightness(0.7);' : null "
30+ :style =" isActuallyHidden ? ' filter: brightness(0.7);' : null "
3131 :class =" $style .image "
3232 />
3333 <div
34- v-else-if =" prefer.s.dataSaver.media || hide "
34+ v-else-if =" prefer.s.dataSaver.media || isActuallyHidden "
3535 :title =" image.comment || image.name"
36- :style =" hide ? 'background: #888;' : null"
36+ :style =" isActuallyHidden ? 'background: #888;' : null"
3737 :class =" $style.image"
3838 ></div >
3939 <img
@@ -44,7 +44,7 @@ SPDX-License-Identifier: AGPL-3.0-only
4444 :class =" $style.image"
4545 />
4646 </component >
47- <template v-if =" hide " >
47+ <template v-if =" isActuallyHidden " >
4848 <div :class =" $style.hiddenText" >
4949 <div :class =" $style.hiddenTextWrapper" >
5050 <b v-if =" image.isSensitive" style =" display : block ;" ><i class =" ti ti-eye-exclamation" ></i > {{ i18n.ts.sensitive }}{{ prefer.s.dataSaver.media ? ` (${i18n.ts.image}${image.size ? ' ' + bytes(image.size) : ''})` : '' }}</b >
@@ -93,6 +93,9 @@ const props = withDefaults(defineProps<{
9393
9494const hide = ref (true );
9595
96+ const isRevealingByTap = ref (false );
97+ const isActuallyHidden = computed (() => hide .value && ! isRevealingByTap .value );
98+
9699const url = computed (() => (props .raw || prefer .s .loadRawImages )
97100 ? props .image .url
98101 : prefer .s .disableShowingAnimatedImages
@@ -107,6 +110,9 @@ async function reveal(ev: PointerEvent) {
107110
108111 if (hide .value ) {
109112 ev .stopPropagation ();
113+ if (prefer .s .revealSensitiveMediaByTapHold ) {
114+ return ;
115+ }
110116 if (! (await canRevealFile (props .image ))) {
111117 return ;
112118 }
@@ -115,6 +121,17 @@ async function reveal(ev: PointerEvent) {
115121 }
116122}
117123
124+ function onPointerDown() {
125+ if (! prefer .s .revealSensitiveMediaByTapHold ) return ;
126+ if (! hide .value ) return ;
127+ isRevealingByTap .value = true ;
128+ }
129+
130+ function onPointerUp() {
131+ if (! prefer .s .revealSensitiveMediaByTapHold ) return ;
132+ isRevealingByTap .value = false ;
133+ }
134+
118135// Plugin:register_note_view_interruptor を使って書き換えられる可能性があるためwatchする
119136watch (() => props .image , (newImage ) => {
120137 hide .value = shouldHideFileByDefault (newImage );
0 commit comments