From 2d48a8f15970d7af8092e9450057a05b4d3f9333 Mon Sep 17 00:00:00 2001 From: Zero~Informatique Date: Fri, 31 Jan 2020 13:22:52 +0100 Subject: viewer: when loading a picture, displays a preview based on the thumbnail on slow connections This works on Chrome, but FireFox presents some issues: - the picture background is sometimes white instead of transparent, hidding the background - image-orientation doesn't work for background pictures or for negative values --- viewer/src/assets/scss/global.scss | 14 ++++++----- viewer/src/components/LdPicture.vue | 49 +++++++++++++++++++++++++++++++++++-- 2 files changed, 55 insertions(+), 8 deletions(-) (limited to 'viewer/src') diff --git a/viewer/src/assets/scss/global.scss b/viewer/src/assets/scss/global.scss index b418911..5de5946 100644 --- a/viewer/src/assets/scss/global.scss +++ b/viewer/src/assets/scss/global.scss @@ -96,10 +96,12 @@ img { // === Effect to apply on lazy-image loading -.v-lazy-image { - opacity: 0; - transition: opacity 0.4s; -} -.v-lazy-image-loaded { - opacity: 1; +img { + &.v-lazy-image { + opacity: 0; + transition: opacity 0.4s; + } + &.v-lazy-image-loaded { + opacity: 1; + } } diff --git a/viewer/src/components/LdPicture.vue b/viewer/src/components/LdPicture.vue index b6a719f..5425a00 100644 --- a/viewer/src/components/LdPicture.vue +++ b/viewer/src/components/LdPicture.vue @@ -25,7 +25,13 @@ @click="onClick" @dragscrollstart="dragging=true" > - + + @@ -36,12 +42,35 @@ import { Component, Vue, Prop } from "vue-property-decorator"; export default class LdPicture extends Vue { @Prop({ required: true }) readonly picture!: Gallery.Picture; + readonly SLOW_LOADING_TIMEOUT_MS: number = 1500; + dragging: boolean = false; + slowLoadingStyle: string | null = null; + timer: NodeJS.Timeout | null = null; + + mounted() { + if (this.picture.thumbnail) this.timer = setTimeout(this.generateSlowLoadingStyle, this.SLOW_LOADING_TIMEOUT_MS); + } + + destroyed() { + this.clearTimer(); + } + + clearTimer() { + if (this.timer) clearTimeout(this.timer); + this.timer = null; + this.slowLoadingStyle = null; + } - get pictureSrc() { + pictureSrc() { return `${process.env.VUE_APP_DATA_URL}${this.picture.properties.resource}`; } + generateSlowLoadingStyle() { + this.clearTimer(); + this.slowLoadingStyle = `background-image: url('${process.env.VUE_APP_DATA_URL}${this.picture.thumbnail}');`; + } + onClick() { if (!this.dragging) this.$uiStore.toggleFullscreen(); this.dragging = false; @@ -50,6 +79,22 @@ export default class LdPicture extends Vue {