Steve Lhomme pushed to branch master at VideoLAN / VLC
Commits: 9dcc03a3 by Fatih Uzunoglu at 2026-05-08T17:16:23+00:00 qml: use incubator with mode `AsynchronousIfNested` instead of `createObject()` in delegates As noted in the docs, `AsynchronousIfNested` is explained to be [1]: > The creation will occur asynchronously if part of a nested > asynchronous creation, or synchronously if not. For that reason, we should not be using `createObject()` in view delegates since if the delegate is being instantiated asynchronously, such custom object should also be instantiated asynchronously. [1] https://doc.qt.io/qt-6/qqmlincubator.html#details - - - - - 2 changed files: - modules/gui/qt/widgets/qml/MediaCover.qml - modules/gui/qt/widgets/qml/TableViewDelegateExt.qml Changes: ===================================== modules/gui/qt/widgets/qml/MediaCover.qml ===================================== @@ -202,10 +202,30 @@ Item { property Widgets.PlayCover _playCoverItem + property var _playCoverItemIncubator + onPlayCoverShowPlayChanged: { // NOTE: We are lazy loading the component when this gets visible and it stays loaded. // We could consider unloading it when visible goes to false. - if (playCoverShowPlay && !_playCoverItem) - _playCoverItem = playCoverComponent.createObject(root) + if (playCoverShowPlay && !_playCoverItem && !_playCoverItemIncubator) { + // https://doc.qt.io/qt-6/qqmlincubator.html#details + const incubator = playCoverComponent.incubateObject(root, {}, 1 /* QQmlIncubator::AsynchronousIfNested */) + _playCoverItemIncubator = incubator + + // https://doc.qt.io/qt-6/qml-qtqml-component.html#incubateObject-method + if (incubator.status !== Component.Ready) { + incubator.onStatusChanged = function(status) { + if (status === Component.Ready) { + root._playCoverItem = incubator.object + // Incubator should be garbage collected, we don't need it anymore: + root._playCoverItemIncubator = null + } + } + } else { + root._playCoverItem = incubator.object + // Incubator should be garbage collected, we don't need it anymore: + root._playCoverItemIncubator = null + } + } } } ===================================== modules/gui/qt/widgets/qml/TableViewDelegateExt.qml ===================================== @@ -251,15 +251,26 @@ T.Control { Component.onCompleted: { const del = modelData.model.colDelegate || delegate.defaultDelegate - item = del.createObject(loader, { + // https://doc.qt.io/qt-6/qqmlincubator.html#details + const incubator = del.incubateObject(loader, { cellModel: cellModel, width: Qt.binding(() => loader.width), height: Qt.binding(() => loader.height), - } + }, 1 /* QQmlIncubator::AsynchronousIfNested */ ) - if (item.artworkTextureProvider) { - delegate.artworkTextureProvider = Qt.binding(() => item.artworkTextureProvider) + + // https://doc.qt.io/qt-6/qml-qtqml-component.html#incubateObject-method + if (incubator.status !== Component.Ready) { + incubator.onStatusChanged = function(status) { + if (status === Component.Ready) { + loader.item = incubator.object + } + } + } else { + loader.item = incubator.object } + + delegate.artworkTextureProvider = Qt.binding(() => loader?.item?.artworkTextureProvider ?? null) } Component.onDestruction: { item?.destroy() View it on GitLab: https://code.videolan.org/videolan/vlc/-/commit/9dcc03a34a3b3d43f525da6525db083d08128560 -- View it on GitLab: https://code.videolan.org/videolan/vlc/-/commit/9dcc03a34a3b3d43f525da6525db083d08128560 You're receiving this email because of your account on code.videolan.org.
_______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
