From 3d6f502bcc4bae477eb3f8d51aa7b90a6c9e9f46 Mon Sep 17 00:00:00 2001 From: Nicolas Werner Date: Fri, 25 Oct 2019 13:20:05 +0200 Subject: Incubate delegates asynchronously --- src/timeline2/DelegateChooser.cpp | 35 +++++++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 8 deletions(-) (limited to 'src/timeline2/DelegateChooser.cpp') diff --git a/src/timeline2/DelegateChooser.cpp b/src/timeline2/DelegateChooser.cpp index b86fc6cc..e558da61 100644 --- a/src/timeline2/DelegateChooser.cpp +++ b/src/timeline2/DelegateChooser.cpp @@ -95,17 +95,11 @@ DelegateChooser::recalcChild() auto choiceValue = choice->roleValue(); if (!roleValue_.isValid() || !choiceValue.isValid() || choiceValue == roleValue_) { if (child) { - // delete child; + child->setParentItem(nullptr); child = nullptr; } - child = dynamic_cast( - choice->delegate()->create(QQmlEngine::contextForObject(this))); - child->setParentItem(this); - connect(this->child, &QQuickItem::heightChanged, this, [this]() { - this->setHeight(this->child->height()); - }); - this->setHeight(this->child->height()); + choice->delegate()->create(incubator, QQmlEngine::contextForObject(this)); return; } } @@ -118,3 +112,28 @@ DelegateChooser::componentComplete() recalcChild(); } +void +DelegateChooser::DelegateIncubator::statusChanged(QQmlIncubator::Status status) +{ + if (status == QQmlIncubator::Ready) { + chooser.child = dynamic_cast(object()); + if (chooser.child == nullptr) { + nhlog::ui()->error("Delegate has to be derived of Item!"); + delete chooser.child; + return; + } + + chooser.child->setParentItem(&chooser); + connect(chooser.child, &QQuickItem::heightChanged, &chooser, [this]() { + chooser.setHeight(chooser.child->height()); + }); + chooser.setHeight(chooser.child->height()); + QQmlEngine::setObjectOwnership(chooser.child, + QQmlEngine::ObjectOwnership::JavaScriptOwnership); + + } else if (status == QQmlIncubator::Error) { + for (const auto &e : errors()) + nhlog::ui()->error("Error instantiating delegate: {}", + e.toString().toStdString()); + } +} -- cgit 1.5.1