aboutsummaryrefslogtreecommitdiff
path: root/viewer/src/components/LdPicture.vue
diff options
context:
space:
mode:
authorOzoneGrif2020-04-28 03:28:20 +0200
committerGitHub2020-04-28 03:28:20 +0200
commit20fda5a867d9afb0a90eda78834c487df40abd05 (patch)
treee9350f02a188fd35bcbe19a835e28a5116344f60 /viewer/src/components/LdPicture.vue
parentadd23cc6e83a677f8e747348a2429050efe8c515 (diff)
parentb4b698ccbdec98dd902b6290f12207bf5547b140 (diff)
downloadldgallery-20fda5a867d9afb0a90eda78834c487df40abd05.tar.gz
Merge pull request #195 from pacien/scroll-zoom
viewer/LdPicture: implement mousewheel and pinch zoom
Diffstat (limited to 'viewer/src/components/LdPicture.vue')
-rw-r--r--viewer/src/components/LdPicture.vue56
1 files changed, 27 insertions, 29 deletions
diff --git a/viewer/src/components/LdPicture.vue b/viewer/src/components/LdPicture.vue
index 3170c81..de46bcb 100644
--- a/viewer/src/components/LdPicture.vue
+++ b/viewer/src/components/LdPicture.vue
@@ -18,17 +18,21 @@
18--> 18-->
19 19
20<template> 20<template>
21 <!-- FIXME: v-dragscroll interferes with pinch-to-zoom -->
21 <div 22 <div
23 ref="containerElement"
22 v-dragscroll 24 v-dragscroll
23 class="scrollbar" 25 class="scrollbar ld-picture-container"
24 :class="{'fit-to-screen': !$uiStore.fullscreen, 'original-size': $uiStore.fullscreen}"
25 @click.capture="e => dragScrollClickFix.onClickCapture(e)" 26 @click.capture="e => dragScrollClickFix.onClickCapture(e)"
26 @click="$uiStore.toggleFullscreen()" 27 @dblclick="$uiStore.toggleFullscreen()"
28 @dragstart.prevent
27 @dragscrollstart="dragScrollClickFix.onDragScrollStart()" 29 @dragscrollstart="dragScrollClickFix.onDragScrollStart()"
28 @dragscrollend="dragScrollClickFix.onDragScrollEnd()" 30 @dragscrollend="dragScrollClickFix.onDragScrollEnd()"
29 > 31 >
30 <v-lazy-image 32 <v-lazy-image
33 ref="imageElement"
31 :src="pictureSrc(picture.properties.resource)" 34 :src="pictureSrc(picture.properties.resource)"
35 class="ld-picture-element"
32 :class="{'slow-loading': Boolean(slowLoadingStyle)}" 36 :class="{'slow-loading': Boolean(slowLoadingStyle)}"
33 :style="slowLoadingStyle" 37 :style="slowLoadingStyle"
34 @load="clearSlowLoading" 38 @load="clearSlowLoading"
@@ -38,12 +42,15 @@
38</template> 42</template>
39 43
40<script lang="ts"> 44<script lang="ts">
41import { Component, Vue, Prop } from "vue-property-decorator"; 45import { Component, Vue, Prop, Ref } from "vue-property-decorator";
46import LdZoom from "@/services/ldzoom";
42import DragScrollClickFix from "@/services/dragscrollclickfix"; 47import DragScrollClickFix from "@/services/dragscrollclickfix";
43 48
44@Component 49@Component
45export default class LdPicture extends Vue { 50export default class LdPicture extends Vue {
46 @Prop({ required: true }) readonly picture!: Gallery.Picture; 51 @Prop({ required: true }) readonly picture!: Gallery.Picture;
52 @Ref() readonly containerElement!: HTMLDivElement;
53 @Ref() readonly imageElement!: Vue;
47 54
48 readonly SLOW_LOADING_TIMEOUT_MS: number = 1500; 55 readonly SLOW_LOADING_TIMEOUT_MS: number = 1500;
49 readonly dragScrollClickFix = new DragScrollClickFix(); 56 readonly dragScrollClickFix = new DragScrollClickFix();
@@ -54,6 +61,7 @@ export default class LdPicture extends Vue {
54 61
55 mounted() { 62 mounted() {
56 this.timer = setTimeout(this.generateSlowLoadingStyle, this.SLOW_LOADING_TIMEOUT_MS); 63 this.timer = setTimeout(this.generateSlowLoadingStyle, this.SLOW_LOADING_TIMEOUT_MS);
64 new LdZoom(this.containerElement, this.imageElement.$el as HTMLImageElement, this.picture.properties, 10, 1 / 5).install();
57 } 65 }
58 66
59 destroyed() { 67 destroyed() {
@@ -85,13 +93,17 @@ export default class LdPicture extends Vue {
85<style lang="scss"> 93<style lang="scss">
86@import "~@/assets/scss/theme.scss"; 94@import "~@/assets/scss/theme.scss";
87 95
88.ld-picture-loader { 96.ld-picture-container {
89 position: relative; 97 height: 100%;
90 & .loading-background {
91 background: none !important;
92 }
93} 98}
94img.slow-loading { 99
100.ld-picture-element {
101 max-width: unset;
102 max-height: unset;
103 cursor: grab;
104}
105
106.slow-loading {
95 background-repeat: no-repeat; 107 background-repeat: no-repeat;
96 background-position: center; 108 background-position: center;
97 background-size: contain; 109 background-size: contain;
@@ -99,25 +111,11 @@ img.slow-loading {
99 background-blend-mode: soft-light; 111 background-blend-mode: soft-light;
100 opacity: 1 !important; 112 opacity: 1 !important;
101} 113}
102.fit-to-screen { 114
103 display: flex; 115.ld-picture-loader {
104 justify-content: space-around; 116 position: relative;
105 height: 100%; 117 & .loading-background {
106 & > img { 118 background: none !important;
107 object-fit: contain;
108 cursor: zoom-in;
109 }
110}
111.original-size {
112 display: block;
113 text-align: center;
114 cursor: grab;
115 height: 100%;
116 & > img {
117 max-width: unset;
118 max-height: unset;
119 object-fit: none;
120 cursor: zoom-out;
121 } 119 }
122} 120}
123</style> 121</style>