From 1a3b3e649e21a6cee2b8026f62ecfb5391f13840 Mon Sep 17 00:00:00 2001
From: Ming Rui Zhang <mingrui.zhang@savoirfairelinux.com>
Date: Mon, 10 May 2021 15:16:07 -0400
Subject: [PATCH] avatarimage: fix opacity animation when switching to another
 screen

Gitlab: #404

Change-Id: I38983d2616fb618f7960112a2408a52bb3c9ad35
---
 src/commoncomponents/AvatarImage.qml | 49 ++++++++++++++++------------
 1 file changed, 29 insertions(+), 20 deletions(-)

diff --git a/src/commoncomponents/AvatarImage.qml b/src/commoncomponents/AvatarImage.qml
index 96acf5ebc..b4f6f2214 100644
--- a/src/commoncomponents/AvatarImage.qml
+++ b/src/commoncomponents/AvatarImage.qml
@@ -106,8 +106,18 @@ Item {
 
         enableAnimation = false
         rootImage.source = ""
-        rootImage.source = tempImageSource
+
         enableAnimation = tempEnableAnimation
+        rootImage.source = tempImageSource
+    }
+
+    function rootImageOverlayReadyCallback() {
+        if (rootImageOverlay.status === Image.Ready &&
+                (rootImageOverlay.state === "avatarImgFadeIn")) {
+            rootImageOverlay.statusChanged.disconnect(rootImageOverlayReadyCallback)
+
+            rootImageOverlay.state = ''
+        }
     }
 
     Image {
@@ -127,8 +137,7 @@ Item {
         onStatusChanged: {
             if (status === Image.Ready) {
                 if (enableAnimation) {
-                    rootImageOverlay.state = ""
-                    rootImageOverlay.state = "rootImageLoading"
+                    rootImageOverlay.state = "avatarImgFadeIn"
                 } else {
                     rootImageOverlay.source = rootImage.source
                     root.imageIsReady()
@@ -156,30 +165,30 @@ Item {
 
             fillMode: Image.PreserveAspectFit
 
-            opacity: enableAnimation ? 1 : 0
-
-            onOpacityChanged: {
-                if (opacity === 0)
-                    source = rootImage.source
-            }
-
-            onStatusChanged: {
-                if (status === Image.Ready && opacity === 0) {
-                    opacity = 1
-                    root.imageIsReady()
-                }
-            }
-
             states: State {
-                name: "rootImageLoading"
-                PropertyChanges { target: rootImageOverlay; opacity: 0}
+                name: "avatarImgFadeIn"
+                PropertyChanges {
+                    target: rootImageOverlay
+                    opacity: 0
+                }
             }
 
             transitions: Transition {
                 NumberAnimation {
                     properties: "opacity"
                     easing.type: Easing.InOutQuad
-                    duration: transitionDuration
+                    duration: enableAnimation ? 400 : 0
+                }
+
+                onRunningChanged: {
+                    if ((rootImageOverlay.state === "avatarImgFadeIn") && (!running)) {
+                        if (rootImageOverlay.source === rootImage.source) {
+                            rootImageOverlay.state = ''
+                            return
+                        }
+                        rootImageOverlay.statusChanged.connect(rootImageOverlayReadyCallback)
+                        rootImageOverlay.source = rootImage.source
+                    }
                 }
             }
         }
-- 
GitLab