Add workaround for delegate stuck transition bug

Sometimes and randomly, a HListView/HGridView delegate's
add/populate transition will stop before completion.

This especially happens on startup when loading a large room list,
one room might get stuck and left tiny or invisible, despite its
normal space still being taken.
This commit is contained in:
miruka 2020-09-22 19:12:13 -04:00
parent 35fa1fa16b
commit 8acc7299e9
10 changed files with 53 additions and 0 deletions

View File

@ -0,0 +1,35 @@
// SPDX-License-Identifier: LGPL-3.0-or-later
import QtQuick 2.12
Timer {
// Sometimes and randomly, a HListView/HGridView delegate's add/populate
// Transition will stop too early, leaving a stuck invisible or tiny item.
// This is a workaround for this Qt bug happening despite the neccessary
// Transition precautions from the docs being applied.
property Item delegate: parent
readonly property HNumberAnimation opacityFixer: HNumberAnimation {
target: delegate
property: "opacity"
from: delegate.opacity
to: 1
}
readonly property HNumberAnimation scaleFixer: HNumberAnimation {
target: delegate
property: "scale"
from: delegate.scale
to: 1
}
interval: theme.animationDuration * 2
running: true
onTriggered: {
// if (delegate.opacity < 1 || delegate.scale < 1) print(delegate)
if (delegate.opacity < 1) opacityFixer.start()
if (delegate.scale < 1) scaleFixer.start()
}
}

View File

@ -243,4 +243,6 @@ HTile {
sequences: window.settings.keys.togglePresenceOffline sequences: window.settings.keys.togglePresenceOffline
onActivated: account.togglePresence("offline") onActivated: account.togglePresence("offline")
} }
DelegateTransitionFixer {}
} }

View File

@ -207,6 +207,8 @@ HTile {
if (loadEventsFutureId) py.cancelCoro(loadEventsFutureId) if (loadEventsFutureId) py.cancelCoro(loadEventsFutureId)
} }
DelegateTransitionFixer {}
Timer { Timer {
interval: 1000 interval: 1000
triggeredOnStart: true triggeredOnStart: true

View File

@ -173,4 +173,6 @@ HTile {
} }
onLeftClicked: checkBox.clicked() onLeftClicked: checkBox.clicked()
DelegateTransitionFixer {}
} }

View File

@ -92,4 +92,6 @@ HTile {
} }
Behavior on contentOpacity { HNumberAnimation {} } Behavior on contentOpacity { HNumberAnimation {} }
DelegateTransitionFixer {}
} }

View File

@ -49,4 +49,6 @@ HTile {
Behavior on color { HColorAnimation {} } Behavior on color { HColorAnimation {} }
} }
} }
DelegateTransitionFixer {}
} }

View File

@ -33,6 +33,8 @@ HColumnLayout {
Behavior on height { HNumberAnimation {} } Behavior on height { HNumberAnimation {} }
DelegateTransitionFixer {}
HRowLayout { HRowLayout {
HIcon { HIcon {
svgName: "uploading" svgName: "uploading"

View File

@ -171,4 +171,6 @@ HTile {
value: (roomPane.minimumSize - avatar.width) / 2 value: (roomPane.minimumSize - avatar.width) / 2
when: avatar && roomPane.width < avatar.width + theme.spacing * 2 when: avatar && roomPane.width < avatar.width + theme.spacing * 2
} }
DelegateTransitionFixer {}
} }

View File

@ -64,4 +64,6 @@ HTile {
) )
item.trustSet.connect(deviceTile.trustSet) item.trustSet.connect(deviceTile.trustSet)
} }
DelegateTransitionFixer {}
} }

View File

@ -84,6 +84,8 @@ HColumnLayout {
ListView.onRemove: eventList.uncheck(model.id) ListView.onRemove: eventList.uncheck(model.id)
DelegateTransitionFixer {}
Item { Item {
Layout.fillWidth: true Layout.fillWidth: true
visible: model.event_type !== "RoomCreateEvent" visible: model.event_type !== "RoomCreateEvent"