From f186be73143e0f360c27f8e4462f49c435e5c2a4 Mon Sep 17 00:00:00 2001 From: James Graham Date: Wed, 15 Feb 2023 18:22:51 +0000 Subject: [PATCH] Disable link loading animation when offscreen Stop the link preview loading indicator animation running when the delegate isn't visible. CCBUG: 465715 --- src/qml/Component/Timeline/LinkPreviewDelegate.qml | 11 +++++++++-- src/qml/Component/Timeline/MessageDelegate.qml | 1 + src/qml/Component/Timeline/TimelineContainer.qml | 5 +++++ 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/qml/Component/Timeline/LinkPreviewDelegate.qml b/src/qml/Component/Timeline/LinkPreviewDelegate.qml index d41ee42e6..64cb84078 100644 --- a/src/qml/Component/Timeline/LinkPreviewDelegate.qml +++ b/src/qml/Component/Timeline/LinkPreviewDelegate.qml @@ -44,6 +44,11 @@ Loader { */ property var defaultHeight : Kirigami.Units.gridUnit * 3 + Kirigami.Units.smallSpacing * 2 + /** + * @brief Whether the loading indicator should animate if visible. + */ + property bool indicatorEnabled: false + active: !currentRoom.usesEncryption && model.display && links && links.length > 0 visible: Config.showLinkPreview && active sourceComponent: linkPreviewer.loaded ? linkPreviewComponent : loadingComponent @@ -129,7 +134,7 @@ Loader { Component { id: loadingComponent RowLayout { - property bool hovered: false + id: componentRoot property bool truncated: false Rectangle { @@ -137,7 +142,9 @@ Loader { width: Kirigami.Units.smallSpacing color: Kirigami.Theme.highlightColor } - QQC2.BusyIndicator { } + QQC2.BusyIndicator { + running: root.indicatorEnabled + } Kirigami.Heading { Layout.fillWidth: true Layout.minimumHeight: root.defaultHeight diff --git a/src/qml/Component/Timeline/MessageDelegate.qml b/src/qml/Component/Timeline/MessageDelegate.qml index 44db5ec30..bd6e22dd0 100644 --- a/src/qml/Component/Timeline/MessageDelegate.qml +++ b/src/qml/Component/Timeline/MessageDelegate.qml @@ -31,6 +31,7 @@ TimelineContainer { } LinkPreviewDelegate { Layout.fillWidth: true + indicatorEnabled: messageDelegate.isVisibleInTimeline() } } } diff --git a/src/qml/Component/Timeline/TimelineContainer.qml b/src/qml/Component/Timeline/TimelineContainer.qml index 7400612f4..62f2b85f0 100644 --- a/src/qml/Component/Timeline/TimelineContainer.qml +++ b/src/qml/Component/Timeline/TimelineContainer.qml @@ -320,4 +320,9 @@ ColumnLayout { visible: eventType !== MessageEventModel.State && eventType !== MessageEventModel.Notice && reaction != undefined && reaction.length > 0 } + + function isVisibleInTimeline() { + let yoff = Math.round(y - ListView.view.contentY); + return (yoff + height > 0 && yoff < ListView.view.height) + } }